Changeset 248155 in webkit
- Timestamp:
- Aug 2, 2019 9:43:56 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r248150 r248155 1 2019-08-02 Chris Dumez <cdumez@apple.com> 2 3 DOMWindow properties may get GC'd before their Window object 4 https://bugs.webkit.org/show_bug.cgi?id=200359 5 6 Reviewed by Ryosuke Niwa. 7 8 Add layout test coverage. 9 10 * fast/dom/dom-window-property-gc-after-frame-detach-expected.txt: Added. 11 * fast/dom/dom-window-property-gc-after-frame-detach.html: Added. 12 1 13 2019-08-02 Carlos Garcia Campos <cgarcia@igalia.com> 2 14 -
trunk/Source/WebCore/ChangeLog
r248152 r248155 1 2019-08-02 Chris Dumez <cdumez@apple.com> 2 3 DOMWindow properties may get GC'd before their Window object 4 https://bugs.webkit.org/show_bug.cgi?id=200359 5 6 Reviewed by Ryosuke Niwa. 7 8 DOMWindow properties may get GC'd before their Window object once their frame is detached. This 9 is unexpected behavior given that these properties persist on the Window after the frame is 10 detached. This patch thus updates their bindings so that they live as long as their window, not 11 their frame. 12 13 Note that this also fixes a thread-safety issue since DOMWindowProperty::frame() would get called 14 from GC threads, although its implementation looks like: 15 """ 16 return m_window ? m_window->frame() : nullptr; 17 """ 18 19 Because m_window is a WeakPtr<DOMWindow> and because windows get destroyed on the main thread, 20 we could in theory crash when dereferencing m_window->frame() from the GC thread. 21 22 Test: fast/dom/dom-window-property-gc-after-frame-detach.html 23 24 * bindings/js/JSDOMWindowCustom.cpp: 25 (WebCore::JSDOMWindow::visitAdditionalChildren): 26 * bindings/scripts/CodeGeneratorJS.pm: 27 (GenerateImplementation): 28 * bindings/scripts/IDLAttributes.json: 29 * css/StyleMedia.idl: 30 * loader/appcache/DOMApplicationCache.idl: 31 * page/BarProp.idl: 32 * page/DOMSelection.idl: 33 * page/History.idl: 34 * page/Location.idl: 35 * page/Navigator.idl: 36 * page/Screen.idl: 37 * page/VisualViewport.idl: 38 * plugins/DOMMimeTypeArray.idl: 39 * plugins/DOMPluginArray.idl: 40 * storage/Storage.idl: 41 1 42 2019-08-02 Konstantin Tokarev <annulen@yandex.ru> 2 43 -
trunk/Source/WebCore/bindings/js/JSDOMWindowCustom.cpp
r247434 r248155 72 72 if (Frame* frame = wrapped().frame()) 73 73 visitor.addOpaqueRoot(frame); 74 75 visitor.addOpaqueRoot(&wrapped()); 74 76 75 77 // Normally JSEventTargetCustom.cpp's JSEventTarget::visitAdditionalChildren() would call this. But -
trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
r248105 r248155 4681 4681 $rootString .= " if (UNLIKELY(reason))\n"; 4682 4682 $rootString .= " *reason = \"Reachable from Frame\";\n"; 4683 } elsif (GetGenerateIsReachable($interface) eq "ReachableFromDOMWindow") { 4684 $rootString = " auto* root = WTF::getPtr(js${interfaceName}->wrapped().window());\n"; 4685 $rootString .= " if (!root)\n"; 4686 $rootString .= " return false;\n"; 4687 $rootString .= " if (UNLIKELY(reason))\n"; 4688 $rootString .= " *reason = \"Reachable from Window\";\n"; 4683 4689 } elsif (GetGenerateIsReachable($interface) eq "ImplDocument") { 4684 4690 $rootString = " Document* root = WTF::getPtr(js${interfaceName}->wrapped().document());\n"; -
trunk/Source/WebCore/bindings/scripts/IDLAttributes.json
r246768 r248155 227 227 "GenerateIsReachable": { 228 228 "contextsAllowed": ["interface"], 229 "values": ["", "Impl", "ImplWebGLRenderingContext", "ImplDocument", "ImplElementRoot", "ImplFrame", "ImplOwnerNodeRoot", "ImplScriptExecutionContext" ]229 "values": ["", "Impl", "ImplWebGLRenderingContext", "ImplDocument", "ImplElementRoot", "ImplFrame", "ImplOwnerNodeRoot", "ImplScriptExecutionContext", "ReachableFromDOMWindow"] 230 230 }, 231 231 "Global": { -
trunk/Source/WebCore/css/StyleMedia.idl
r242676 r248155 27 27 [ 28 28 NoInterfaceObject, 29 GenerateIsReachable= ImplFrame,29 GenerateIsReachable=ReachableFromDOMWindow, 30 30 ImplementationLacksVTable, 31 31 ] interface StyleMedia { -
trunk/Source/WebCore/loader/appcache/DOMApplicationCache.idl
r207522 r248155 26 26 [ 27 27 DoNotCheckConstants, 28 GenerateIsReachable= ImplFrame,28 GenerateIsReachable=ReachableFromDOMWindow, 29 29 InterfaceName=ApplicationCache, 30 30 ] interface DOMApplicationCache : EventTarget { -
trunk/Source/WebCore/page/BarProp.idl
r242676 r248155 28 28 29 29 [ 30 GenerateIsReachable= ImplFrame,30 GenerateIsReachable=ReachableFromDOMWindow, 31 31 ImplementationLacksVTable, 32 32 ] interface BarProp { -
trunk/Source/WebCore/page/DOMSelection.idl
r242676 r248155 30 30 // https://www.w3.org/TR/selection-api/#idl-def-Selection 31 31 [ 32 GenerateIsReachable= ImplFrame,32 GenerateIsReachable=ReachableFromDOMWindow, 33 33 ImplementationLacksVTable, 34 34 InterfaceName=Selection, -
trunk/Source/WebCore/page/History.idl
r242676 r248155 25 25 26 26 [ 27 GenerateIsReachable= ImplFrame,27 GenerateIsReachable=ReachableFromDOMWindow, 28 28 JSCustomMarkFunction, 29 29 ImplementationLacksVTable, -
trunk/Source/WebCore/page/Location.idl
r242676 r248155 39 39 CustomPutOnPrototype, 40 40 CustomToStringName, 41 GenerateIsReachable= ImplFrame,41 GenerateIsReachable=ReachableFromDOMWindow, 42 42 IsImmutablePrototypeExoticObject, 43 43 ImplementationLacksVTable, -
trunk/Source/WebCore/page/Navigator.idl
r246070 r248155 19 19 20 20 [ 21 GenerateIsReachable= ImplFrame,21 GenerateIsReachable=ReachableFromDOMWindow, 22 22 JSCustomMarkFunction, 23 23 ] interface Navigator { -
trunk/Source/WebCore/page/Screen.idl
r242676 r248155 29 29 30 30 [ 31 GenerateIsReachable= ImplFrame,31 GenerateIsReachable=ReachableFromDOMWindow, 32 32 ImplementationLacksVTable, 33 33 ] interface Screen { -
trunk/Source/WebCore/page/VisualViewport.idl
r226802 r248155 27 27 [ 28 28 EnabledBySetting=VisualViewportAPI, 29 GenerateIsReachable= ImplFrame29 GenerateIsReachable=ReachableFromDOMWindow 30 30 ] 31 31 interface VisualViewport : EventTarget { -
trunk/Source/WebCore/plugins/DOMMimeTypeArray.idl
r242676 r248155 20 20 21 21 [ 22 GenerateIsReachable= ImplFrame,22 GenerateIsReachable=ReachableFromDOMWindow, 23 23 LegacyUnenumerableNamedProperties, 24 24 ImplementationLacksVTable, -
trunk/Source/WebCore/plugins/DOMPluginArray.idl
r242676 r248155 20 20 21 21 [ 22 GenerateIsReachable= ImplFrame,22 GenerateIsReachable=ReachableFromDOMWindow, 23 23 LegacyUnenumerableNamedProperties, 24 24 ImplementationLacksVTable, -
trunk/Source/WebCore/storage/Storage.idl
r220071 r248155 25 25 26 26 [ 27 GenerateIsReachable= ImplFrame,27 GenerateIsReachable=ReachableFromDOMWindow, 28 28 SkipVTableValidation, 29 29 ] interface Storage {
Note: See TracChangeset
for help on using the changeset viewer.