Changeset 268860 in webkit
- Timestamp:
- Oct 22, 2020 5:41:10 AM (21 months ago)
- Location:
- trunk
- Files:
-
- 2 added
- 12 edited
- 1 copied
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/resize-observer/resize-observer-callback-leak-expected.txt (added)
-
LayoutTests/resize-observer/resize-observer-callback-leak.html (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Sources.txt (modified) (1 diff)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (2 diffs)
-
Source/WebCore/bindings/js/JSResizeObserverCustom.cpp (copied) (copied from trunk/Source/WebCore/page/ResizeObserverCallback.idl) (2 diffs)
-
Source/WebCore/dom/Document.h (modified) (1 diff)
-
Source/WebCore/page/ResizeObserver.h (modified) (1 diff)
-
Source/WebCore/page/ResizeObserver.idl (modified) (1 diff)
-
Source/WebCore/page/ResizeObserverCallback.h (modified) (1 diff)
-
Source/WebCore/page/ResizeObserverCallback.idl (modified) (1 diff)
-
Source/WebCore/testing/Internals.cpp (modified) (1 diff)
-
Source/WebCore/testing/Internals.h (modified) (1 diff)
-
Source/WebCore/testing/Internals.idl (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r268856 r268860 1 2020-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 1 11 2020-10-22 Martin Robinson <mrobinson@igalia.com> 2 12 -
trunk/Source/WebCore/ChangeLog
r268859 r268860 1 2020-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 1 31 2020-10-22 Philippe Normand <pnormand@igalia.com> 2 32 -
trunk/Source/WebCore/Sources.txt
r268775 r268860 571 571 bindings/js/JSRemoteDOMWindowBase.cpp 572 572 bindings/js/JSRemoteDOMWindowCustom.cpp 573 bindings/js/JSResizeObserverCustom.cpp 573 574 bindings/js/JSResizeObserverEntryCustom.cpp 574 575 bindings/js/JSSVGPathSegCustom.cpp -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r268775 r268860 9212 9212 582DE3221C30C85400BE02A8 /* TextDecorationPainter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextDecorationPainter.cpp; sourceTree = "<group>"; }; 9213 9213 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>"; }; 9214 9215 5884FE5622813E2D0040AFF6 /* JSResizeObserverEntryCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSResizeObserverEntryCustom.cpp; sourceTree = "<group>"; }; 9215 9216 589556EC18D4A44000764B03 /* BorderEdge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BorderEdge.h; sourceTree = "<group>"; }; … … 22359 22360 833CF70F20DB3F5F00141BCC /* JSPerformanceObserverCustom.cpp */, 22360 22361 A4A69B8BB91B49D0A804C31D /* JSPromiseRejectionEventCustom.cpp */, 22362 5868C7C42539DA3300BF9DF3 /* JSResizeObserverCustom.cpp */, 22361 22363 5884FE5622813E2D0040AFF6 /* JSResizeObserverEntryCustom.cpp */, 22362 22364 83F572941FA1066F003837BE /* JSServiceWorkerClientCustom.cpp */, -
trunk/Source/WebCore/bindings/js/JSResizeObserverCustom.cpp
r268859 r268860 1 1 /* 2 * Copyright (C) 20 19Igalia S.L.2 * Copyright (C) 2020 Igalia S.L. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 24 24 */ 25 25 26 // https://wicg.github.io/ResizeObserver/ 26 #include "config.h" 27 #include "JSResizeObserver.h" 27 28 28 [ 29 Conditional=RESIZE_OBSERVER, 30 CallbackThisObject=ResizeObserver, 31 ] callback ResizeObserverCallback = undefined (sequence<ResizeObserverEntry> entries, ResizeObserver observer); 29 #include <JavaScriptCore/JSCInlines.h> 30 31 namespace WebCore { 32 33 void 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 1413 1413 void addResizeObserver(ResizeObserver&); 1414 1414 void removeResizeObserver(ResizeObserver&); 1415 unsigned numberOfResizeObservers() const { return m_resizeObservers.size(); } 1415 1416 bool hasResizeObservers(); 1416 1417 // Return the minDepth of the active observations. -
trunk/Source/WebCore/page/ResizeObserver.h
r259252 r268860 65 65 void setHasSkippedObservations(bool skipped) { m_hasSkippedObservations = skipped; } 66 66 67 ResizeObserverCallback* callbackConcurrently() { return m_callback.get(); } 68 67 69 private: 68 70 ResizeObserver(Document&, Ref<ResizeObserverCallback>&&); -
trunk/Source/WebCore/page/ResizeObserver.idl
r267813 r268860 30 30 Conditional=RESIZE_OBSERVER, 31 31 EnabledBySetting=ResizeObserver, 32 Exposed=Window 32 Exposed=Window, 33 JSCustomMarkFunction, 33 34 ] interface ResizeObserver { 34 35 [CallWith=Document] constructor(ResizeObserverCallback callback); -
trunk/Source/WebCore/page/ResizeObserverCallback.h
r265397 r268860 40 40 public: 41 41 using ActiveDOMCallback::ActiveDOMCallback; 42 43 virtual bool hasCallback() const = 0; 44 42 45 virtual CallbackResult<void> handleEvent(ResizeObserver&, const Vector<Ref<ResizeObserverEntry>>&, ResizeObserver&) = 0; 43 46 }; -
trunk/Source/WebCore/page/ResizeObserverCallback.idl
r266311 r268860 29 29 Conditional=RESIZE_OBSERVER, 30 30 CallbackThisObject=ResizeObserver, 31 IsWeakCallback, 31 32 ] callback ResizeObserverCallback = undefined (sequence<ResizeObserverEntry> entries, ResizeObserver observer); -
trunk/Source/WebCore/testing/Internals.cpp
r268805 r268860 2635 2635 #endif 2636 2636 2637 #if ENABLE(RESIZE_OBSERVER) 2638 unsigned Internals::numberOfResizeObservers(const Document& document) const 2639 { 2640 return document.numberOfResizeObservers(); 2641 } 2642 #endif 2643 2637 2644 uint64_t Internals::documentIdentifier(const Document& document) const 2638 2645 { -
trunk/Source/WebCore/testing/Internals.h
r268805 r268860 448 448 #endif 449 449 450 #if ENABLE(RESIZE_OBSERVER) 451 unsigned numberOfResizeObservers(const Document&) const; 452 #endif 453 450 454 uint64_t documentIdentifier(const Document&) const; 451 455 bool isDocumentAlive(uint64_t documentIdentifier) const; -
trunk/Source/WebCore/testing/Internals.idl
r268805 r268860 515 515 unsigned long referencingNodeCount(Document document); 516 516 [Conditional=INTERSECTION_OBSERVER] unsigned long numberOfIntersectionObservers(Document document); 517 [Conditional = RESIZE_OBSERVER] unsigned long numberOfResizeObservers(Document document); 517 518 WindowProxy? openDummyInspectorFrontend(DOMString url); 518 519 undefined closeDummyInspectorFrontend();
Note: See TracChangeset
for help on using the changeset viewer.