Changeset 268860 in webkit


Ignore:
Timestamp:
Oct 22, 2020 5:41:10 AM (21 months ago)
Author:
cathiechen
Message:

ResizeObserver is not properly garbage collected
https://bugs.webkit.org/show_bug.cgi?id=215158

Reviewed by Frédéric Wang.

Source/WebCore:

If ResizeObservers are referenced inside ResizeObserverCallbacks, they are not garbage collected properly. To fix this,
add IsWeakCallback to ResizeObserverCallback interface so that it uses JSC::Weak to store the callback. And add the callback
to visitor in JSResizeObserver::visitAdditionalChildren() to keep it alive. In order to test ResizeObserver leak, add test interface
numberOfResizeObservers() to Internals.idl.

Test: resize-observer/resize-observer-callback-leak.html

  • Sources.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • bindings/js/JSResizeObserverCustom.cpp: Copied from Source/WebCore/page/ResizeObserverCallback.idl.

(WebCore::JSResizeObserver::visitAdditionalChildren): Add callback to SlotVisitor.

  • dom/Document.h:

(WebCore::Document::numberOfResizeObservers const):

  • page/ResizeObserver.h:

(WebCore::ResizeObserver::callback):

  • page/ResizeObserver.idl: Add JSCustomMarkFunction to the interface.
  • page/ResizeObserverCallback.h:
  • page/ResizeObserverCallback.idl: Add IsWeakCallback to the interface.
  • testing/Internals.cpp: Add numberOfResizeObservers.

(WebCore::Internals::numberOfResizeObservers const):

  • testing/Internals.h:
  • testing/Internals.idl:

LayoutTests:

  • resize-observer/resize-observer-callback-leak-expected.txt: Added.
  • resize-observer/resize-observer-callback-leak.html: Added.
Location:
trunk
Files:
2 added
12 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r268856 r268860  
     12020-10-22  Cathie Chen  <cathiechen@igalia.com>
     2
     3        ResizeObserver is not properly garbage collected
     4        https://bugs.webkit.org/show_bug.cgi?id=215158
     5
     6        Reviewed by Frédéric Wang.
     7
     8        * resize-observer/resize-observer-callback-leak-expected.txt: Added.
     9        * resize-observer/resize-observer-callback-leak.html: Added.
     10
    1112020-10-22  Martin Robinson  <mrobinson@igalia.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r268859 r268860  
     12020-10-22  Cathie Chen  <cathiechen@igalia.com>
     2
     3        ResizeObserver is not properly garbage collected
     4        https://bugs.webkit.org/show_bug.cgi?id=215158
     5
     6        Reviewed by Frédéric Wang.
     7
     8        If ResizeObservers are referenced inside ResizeObserverCallbacks, they are not garbage collected properly. To fix this,
     9        add IsWeakCallback to ResizeObserverCallback interface so that it uses JSC::Weak to store the callback. And add the callback
     10        to visitor in JSResizeObserver::visitAdditionalChildren() to keep it alive. In order to test ResizeObserver leak, add test interface
     11        numberOfResizeObservers() to Internals.idl.
     12
     13        Test: resize-observer/resize-observer-callback-leak.html
     14
     15        * Sources.txt:
     16        * WebCore.xcodeproj/project.pbxproj:
     17        * bindings/js/JSResizeObserverCustom.cpp: Copied from Source/WebCore/page/ResizeObserverCallback.idl.
     18        (WebCore::JSResizeObserver::visitAdditionalChildren): Add callback to SlotVisitor.
     19        * dom/Document.h:
     20        (WebCore::Document::numberOfResizeObservers const):
     21        * page/ResizeObserver.h:
     22        (WebCore::ResizeObserver::callback):
     23        * page/ResizeObserver.idl: Add JSCustomMarkFunction to the interface.
     24        * page/ResizeObserverCallback.h:
     25        * page/ResizeObserverCallback.idl: Add IsWeakCallback to the interface.
     26        * testing/Internals.cpp: Add numberOfResizeObservers.
     27        (WebCore::Internals::numberOfResizeObservers const):
     28        * testing/Internals.h:
     29        * testing/Internals.idl:
     30
    1312020-10-22  Philippe Normand  <pnormand@igalia.com>
    232
  • trunk/Source/WebCore/Sources.txt

    r268775 r268860  
    571571bindings/js/JSRemoteDOMWindowBase.cpp
    572572bindings/js/JSRemoteDOMWindowCustom.cpp
     573bindings/js/JSResizeObserverCustom.cpp
    573574bindings/js/JSResizeObserverEntryCustom.cpp
    574575bindings/js/JSSVGPathSegCustom.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r268775 r268860  
    92129212                582DE3221C30C85400BE02A8 /* TextDecorationPainter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextDecorationPainter.cpp; sourceTree = "<group>"; };
    92139213                582DE3231C30C85400BE02A8 /* TextDecorationPainter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextDecorationPainter.h; sourceTree = "<group>"; };
     9214                5868C7C42539DA3300BF9DF3 /* JSResizeObserverCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSResizeObserverCustom.cpp; sourceTree = "<group>"; };
    92149215                5884FE5622813E2D0040AFF6 /* JSResizeObserverEntryCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSResizeObserverEntryCustom.cpp; sourceTree = "<group>"; };
    92159216                589556EC18D4A44000764B03 /* BorderEdge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BorderEdge.h; sourceTree = "<group>"; };
     
    2235922360                                833CF70F20DB3F5F00141BCC /* JSPerformanceObserverCustom.cpp */,
    2236022361                                A4A69B8BB91B49D0A804C31D /* JSPromiseRejectionEventCustom.cpp */,
     22362                                5868C7C42539DA3300BF9DF3 /* JSResizeObserverCustom.cpp */,
    2236122363                                5884FE5622813E2D0040AFF6 /* JSResizeObserverEntryCustom.cpp */,
    2236222364                                83F572941FA1066F003837BE /* JSServiceWorkerClientCustom.cpp */,
  • trunk/Source/WebCore/bindings/js/JSResizeObserverCustom.cpp

    r268859 r268860  
    11/*
    2  * Copyright (C) 2019 Igalia S.L.
     2 * Copyright (C) 2020 Igalia S.L.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2424 */
    2525
    26 // https://wicg.github.io/ResizeObserver/
     26#include "config.h"
     27#include "JSResizeObserver.h"
    2728
    28 [
    29     Conditional=RESIZE_OBSERVER,
    30     CallbackThisObject=ResizeObserver,
    31 ] callback ResizeObserverCallback = undefined (sequence<ResizeObserverEntry> entries, ResizeObserver observer);
     29#include <JavaScriptCore/JSCInlines.h>
     30
     31namespace WebCore {
     32
     33void JSResizeObserver::visitAdditionalChildren(JSC::SlotVisitor& visitor)
     34{
     35    ResizeObserverCallback* callback = wrapped().callbackConcurrently();
     36    if (callback)
     37        callback->visitJSFunction(visitor);
     38}
     39
     40}
  • trunk/Source/WebCore/dom/Document.h

    r268774 r268860  
    14131413    void addResizeObserver(ResizeObserver&);
    14141414    void removeResizeObserver(ResizeObserver&);
     1415    unsigned numberOfResizeObservers() const { return m_resizeObservers.size(); }
    14151416    bool hasResizeObservers();
    14161417    // Return the minDepth of the active observations.
  • trunk/Source/WebCore/page/ResizeObserver.h

    r259252 r268860  
    6565    void setHasSkippedObservations(bool skipped) { m_hasSkippedObservations = skipped; }
    6666
     67    ResizeObserverCallback* callbackConcurrently() { return m_callback.get(); }
     68
    6769private:
    6870    ResizeObserver(Document&, Ref<ResizeObserverCallback>&&);
  • trunk/Source/WebCore/page/ResizeObserver.idl

    r267813 r268860  
    3030    Conditional=RESIZE_OBSERVER,
    3131    EnabledBySetting=ResizeObserver,
    32     Exposed=Window
     32    Exposed=Window,
     33    JSCustomMarkFunction,
    3334] interface ResizeObserver {
    3435    [CallWith=Document] constructor(ResizeObserverCallback callback);
  • trunk/Source/WebCore/page/ResizeObserverCallback.h

    r265397 r268860  
    4040public:
    4141    using ActiveDOMCallback::ActiveDOMCallback;
     42
     43    virtual bool hasCallback() const = 0;
     44
    4245    virtual CallbackResult<void> handleEvent(ResizeObserver&, const Vector<Ref<ResizeObserverEntry>>&, ResizeObserver&) = 0;
    4346};
  • trunk/Source/WebCore/page/ResizeObserverCallback.idl

    r266311 r268860  
    2929    Conditional=RESIZE_OBSERVER,
    3030    CallbackThisObject=ResizeObserver,
     31    IsWeakCallback,
    3132] callback ResizeObserverCallback = undefined (sequence<ResizeObserverEntry> entries, ResizeObserver observer);
  • trunk/Source/WebCore/testing/Internals.cpp

    r268805 r268860  
    26352635#endif
    26362636
     2637#if ENABLE(RESIZE_OBSERVER)
     2638unsigned Internals::numberOfResizeObservers(const Document& document) const
     2639{
     2640    return document.numberOfResizeObservers();
     2641}
     2642#endif
     2643
    26372644uint64_t Internals::documentIdentifier(const Document& document) const
    26382645{
  • trunk/Source/WebCore/testing/Internals.h

    r268805 r268860  
    448448#endif
    449449
     450#if ENABLE(RESIZE_OBSERVER)
     451    unsigned numberOfResizeObservers(const Document&) const;
     452#endif
     453
    450454    uint64_t documentIdentifier(const Document&) const;
    451455    bool isDocumentAlive(uint64_t documentIdentifier) const;
  • trunk/Source/WebCore/testing/Internals.idl

    r268805 r268860  
    515515    unsigned long referencingNodeCount(Document document);
    516516    [Conditional=INTERSECTION_OBSERVER] unsigned long numberOfIntersectionObservers(Document document);
     517    [Conditional = RESIZE_OBSERVER] unsigned long numberOfResizeObservers(Document document);
    517518    WindowProxy? openDummyInspectorFrontend(DOMString url);
    518519    undefined closeDummyInspectorFrontend();
Note: See TracChangeset for help on using the changeset viewer.