Changeset 193286 in webkit
- Timestamp:
- Dec 3, 2015 11:06:45 AM (8 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 2 deleted
- 13 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r193134 r193286 1 2015-12-02 Sam Weinig <sam@webkit.org> 2 3 Promise callbacks should be called at microtask checkpoints 4 https://bugs.webkit.org/show_bug.cgi?id=147933 5 6 Reviewed by Chris Dumez. 7 8 * fast/dom/microtask-promise-mutation-observer-order-expected.txt: Added. 9 * fast/dom/microtask-promise-mutation-observer-order.html: Added. 10 1 11 2015-12-03 Daniel Bates <dabates@apple.com> 2 12 -
trunk/Source/WebCore/CMakeLists.txt
r192995 r193286 1414 1414 cssjit/SelectorCompiler.cpp 1415 1415 1416 dom/ActiveDOMCallbackMicrotask.cpp 1416 1417 dom/ActiveDOMObject.cpp 1417 1418 dom/AnimationEvent.cpp … … 1486 1487 dom/MessagePort.cpp 1487 1488 dom/MessagePortChannel.cpp 1488 dom/Micro Task.cpp1489 dom/Microtasks.cpp 1489 1490 dom/MouseEvent.cpp 1490 1491 dom/MouseRelatedEvent.cpp … … 3345 3346 testing/InternalSettings.cpp 3346 3347 testing/Internals.cpp 3347 testing/MicroTaskTest.cpp3348 3348 testing/MockPageOverlayClient.cpp 3349 3349 -
trunk/Source/WebCore/ChangeLog
r193101 r193286 1 2015-12-02 Sam Weinig <sam@webkit.org> 2 3 Promise callbacks should be called at microtask checkpoints 4 https://bugs.webkit.org/show_bug.cgi?id=147933 5 6 Reviewed by Chris Dumez. 7 8 - Re-names MicroTaskQueue and MicroTask to MicrotaskQueue and Microtask to match the spec language. 9 - Re-implements MicrotaskQueue and Microtask support suspended Microtasks (via the new KeepInQueue 10 result value a Microtask can have when running) and correct behavior when Microtasks are added to 11 the queue during a Microtask checkpoint. 12 - MicrotaskQueue now has a mainThreadQueue() static function, replacing the old singleton() function, 13 which can be used for the Document (non-Worker) Microtasks. For Workers, the a MicrotaskQueue 14 can be separately allocated for each WorkerGlobalScope (though this was not done in this change). 15 - Adds a helper subclass of Microtask, ActiveDOMCallbackMicrotask, for Microtasks that are 16 per-ScriptExecutationContext, and need to act as ActiveDOMCallbacks. 17 - Re-implement Document (non-Worker) Promises on top of ActiveDOMCallbackMicrotask. 18 - Re-implement MutationObserver delivery on top of Microtask. 19 20 Layout Test: 21 fast/dom/microtask-promise-mutation-observer-order.html 22 23 * CMakeLists.txt: 24 * WebCore.vcxproj/WebCore.vcxproj: 25 * WebCore.xcodeproj/project.pbxproj: 26 * dom/DOMAllInOne.cpp: 27 Add new files. 28 29 * bindings/js/JSDOMWindowBase.cpp: 30 (WebCore::JSDOMWindowBase::queueTaskToEventLoop): 31 Switch to using ActiveDOMCallbackMicrotask/MicrotaskQueue rather than ScriptExecutionContext's Task mechanism 32 for JavaScriptCore tasks. 33 34 * bindings/js/JSMainThreadExecState.cpp: 35 (WebCore::JSMainThreadExecState::didLeaveScriptContext): 36 Perform a microtask checkpoint rather than calling MutationObserver code explicitly now that mutation observers 37 use microtasks. 38 39 * dom/ActiveDOMCallbackMicrotask.cpp: Added. 40 (WebCore::ActiveDOMCallbackMicrotask::ActiveDOMCallbackMicrotask): 41 (WebCore::ActiveDOMCallbackMicrotask::~ActiveDOMCallbackMicrotask): 42 (WebCore::ActiveDOMCallbackMicrotask::run): 43 (WebCore::ActiveDOMCallbackMicrotask::contextDestroyed): 44 * dom/ActiveDOMCallbackMicrotask.h: Added. 45 Add a helper subclass of Microtask which behaves like a ActiveDOMCallback (e.g. supports suspension 46 and context destruction). 47 48 * dom/MicroTask.cpp: Renamed to Microtasks.cpp. 49 * dom/MicroTask.h: Renamed to Microtasks.h. 50 * dom/Microtasks.cpp: Renamed from Source/WebCore/dom/MicroTask.cpp. 51 (WebCore::Microtask::removeSelfFromQueue): 52 (WebCore::MicrotaskQueue::mainThreadQueue): 53 (WebCore::MicrotaskQueue::append): 54 (WebCore::MicrotaskQueue::remove): 55 (WebCore::MicrotaskQueue::performMicrotaskCheckpoint): 56 (WebCore::MicroTaskQueue::singleton): Deleted. 57 (WebCore::MicroTaskQueue::queueMicroTask): Deleted. 58 (WebCore::MicroTaskQueue::runMicroTasks): Deleted. 59 * dom/Microtasks.h: Renamed from Source/WebCore/dom/MicroTask.h. 60 (WebCore::Microtask::~Microtask): 61 (WebCore::MicrotaskQueue::MicrotaskQueue): 62 (WebCore::MicrotaskQueue::~MicrotaskQueue): 63 (WebCore::MicroTask::~MicroTask): Deleted. 64 (WebCore::MicroTaskQueue::~MicroTaskQueue): Deleted. 65 (WebCore::MicroTaskQueue::MicroTaskQueue): Deleted. 66 Re-implement MicrotaskQueue and Microtask to support Microtask suspension (via the KeepInQueue result 67 value) and correct behavior when Microtasks are queued during checkpoints. 68 69 * dom/MutationObserver.cpp: 70 (WebCore::suspendedMutationObservers): 71 (WebCore::MutationObserverMicrotask::MutationObserverMicrotask): 72 (WebCore::MutationObserverMicrotask::~MutationObserverMicrotask): 73 (WebCore::MutationObserverMicrotask::run): 74 (WebCore::queueMutationObserverCompoundMicrotask): 75 (WebCore::MutationObserver::enqueueMutationRecord): 76 (WebCore::MutationObserver::setHasTransientRegistration): 77 * dom/MutationObserver.h: 78 Re-implement MutationObserver delivery on top of Microtasks. 79 80 * dom/ScriptRunner.cpp: 81 (WebCore::ScriptRunner::timerFired): 82 Remove unnecessary call to runMicroTasks(). 83 84 * html/parser/HTMLScriptRunner.cpp: 85 (WebCore::HTMLScriptRunner::executePendingScriptAndDispatchEvent): 86 (WebCore::HTMLScriptRunner::runScript): 87 Remove calls to MutationObserver::deliverAllMutations() now that the MicrotaskQueue will take care of it. 88 89 (WebCore::HTMLScriptRunner::executeScriptsWaitingForParsing): 90 Remove unnecessary call to runMicroTasks(). 91 92 * testing/Internals.cpp: 93 (WebCore::Internals::queueMicroTask): 94 Use ActiveDOMCallbackMicrotask rather than a custom test subclass. 95 96 * testing/MicroTaskTest.cpp: Removed. 97 * testing/MicroTaskTest.h: Removed. 98 Remove custom test subclass of Microtask, just use ActiveDOMCallbackMicrotask directly. 99 1 100 2015-12-03 Brady Eidson <beidson@apple.com> 2 101 -
trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj
r192995 r193286 13555 13555 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild> 13556 13556 </ClCompile> 13557 <ClCompile Include="..\dom\ActiveDOMCallbackMicrotask.cpp"> 13558 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> 13559 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> 13560 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|Win32'">true</ExcludedFromBuild> 13561 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_WinCairo|x64'">true</ExcludedFromBuild> 13562 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|Win32'">true</ExcludedFromBuild> 13563 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugSuffix|x64'">true</ExcludedFromBuild> 13564 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> 13565 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild> 13566 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|Win32'">true</ExcludedFromBuild> 13567 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release_WinCairo|x64'">true</ExcludedFromBuild> 13568 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|Win32'">true</ExcludedFromBuild> 13569 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild> 13570 </ClCompile> 13557 13571 <ClCompile Include="..\dom\ActiveDOMObject.cpp"> 13558 13572 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> … … 14494 14508 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild> 14495 14509 </ClCompile> 14496 <ClCompile Include="..\dom\Micro Task.cpp">14510 <ClCompile Include="..\dom\Microtasks.cpp"> 14497 14511 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> 14498 14512 <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild> … … 22036 22050 <ClInclude Include="..\xml\parser\XMLDocumentParser.h" /> 22037 22051 <ClInclude Include="..\xml\parser\XMLDocumentParserScope.h" /> 22052 <ClInclude Include="..\dom\ActiveDOMCallbackMicrotask.h" /> 22038 22053 <ClInclude Include="..\dom\ActiveDOMObject.h" /> 22039 22054 <ClInclude Include="..\dom\AnimationEvent.h" /> … … 22127 22142 <ClInclude Include="..\dom\MessagePort.h" /> 22128 22143 <ClInclude Include="..\dom\MessagePortChannel.h" /> 22129 <ClInclude Include="..\dom\Micro Task.h" />22144 <ClInclude Include="..\dom\Microtasks.h" /> 22130 22145 <ClInclude Include="..\dom\MouseEvent.h" /> 22131 22146 <ClInclude Include="..\dom\MouseRelatedEvent.h" /> -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r192995 r193286 2279 2279 536D5A25193F40FC00CE4CAB /* SourceSizeList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 536D5A24193F40FC00CE4CAB /* SourceSizeList.cpp */; }; 2280 2280 536D5A27193F410B00CE4CAB /* SourceSizeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 536D5A26193F410B00CE4CAB /* SourceSizeList.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2281 53B895AF19DC7ED9009CAA93 /* Micro Task.h in Headers */ = {isa = PBXBuildFile; fileRef = 53B895AD19DC7C37009CAA93 /* MicroTask.h */; };2281 53B895AF19DC7ED9009CAA93 /* Microtasks.h in Headers */ = {isa = PBXBuildFile; fileRef = 53B895AD19DC7C37009CAA93 /* Microtasks.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2282 2282 53C8298D13D8D92700DE2DEB /* RenderFlexibleBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 53C8298B13D8D92700DE2DEB /* RenderFlexibleBox.cpp */; }; 2283 2283 53C8298E13D8D92700DE2DEB /* RenderFlexibleBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 53C8298C13D8D92700DE2DEB /* RenderFlexibleBox.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 2754 2754 7CC69941191EC5F500AF2270 /* JSWebKitNamespace.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CC6993F191EC5F500AF2270 /* JSWebKitNamespace.h */; }; 2755 2755 7CC7E3D717208C0F003C5277 /* IDNScriptWhiteList.txt in Resources */ = {isa = PBXBuildFile; fileRef = 7CC7E3D617208C0F003C5277 /* IDNScriptWhiteList.txt */; }; 2756 7CD0BA041B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CD0BA021B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.cpp */; }; 2757 7CD0BA051B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CD0BA031B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.h */; }; 2756 2758 7CD494CC1A86EB1D000A87EC /* RenderAttachment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CD494CA1A86EB1D000A87EC /* RenderAttachment.cpp */; }; 2757 2759 7CD494CD1A86EB1D000A87EC /* RenderAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CD494CB1A86EB1D000A87EC /* RenderAttachment.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 5936 5938 CAE9F90F146441F000C245B0 /* CSSAspectRatioValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAE9F90D146441F000C245B0 /* CSSAspectRatioValue.cpp */; }; 5937 5939 CAE9F910146441F000C245B0 /* CSSAspectRatioValue.h in Headers */ = {isa = PBXBuildFile; fileRef = CAE9F90E146441F000C245B0 /* CSSAspectRatioValue.h */; }; 5938 CB8CF0181A9358D4000D510B /* MicroTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CB8CF0151A934B43000D510B /* MicroTask.cpp */; }; 5939 CB8CF01D1A95DE42000D510B /* MicroTaskTest.h in Headers */ = {isa = PBXBuildFile; fileRef = CB8CF01C1A95DE42000D510B /* MicroTaskTest.h */; }; 5940 CB8CF01F1A95DE59000D510B /* MicroTaskTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CB8CF01E1A95DE59000D510B /* MicroTaskTest.cpp */; }; 5940 CB8CF0181A9358D4000D510B /* Microtasks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CB8CF0151A934B43000D510B /* Microtasks.cpp */; }; 5941 5941 CCC2B51415F613060048CDD6 /* DeviceClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CCC2B51015F613060048CDD6 /* DeviceClient.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5942 5942 CCC2B51515F613060048CDD6 /* DeviceController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CCC2B51115F613060048CDD6 /* DeviceController.cpp */; }; … … 9746 9746 536D5A24193F40FC00CE4CAB /* SourceSizeList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SourceSizeList.cpp; sourceTree = "<group>"; }; 9747 9747 536D5A26193F410B00CE4CAB /* SourceSizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SourceSizeList.h; sourceTree = "<group>"; }; 9748 53B895AD19DC7C37009CAA93 /* Micro Task.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MicroTask.h; sourceTree = "<group>"; };9748 53B895AD19DC7C37009CAA93 /* Microtasks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Microtasks.h; sourceTree = "<group>"; }; 9749 9749 53C8298B13D8D92700DE2DEB /* RenderFlexibleBox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderFlexibleBox.cpp; sourceTree = "<group>"; }; 9750 9750 53C8298C13D8D92700DE2DEB /* RenderFlexibleBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderFlexibleBox.h; sourceTree = "<group>"; }; … … 10289 10289 7CC6993F191EC5F500AF2270 /* JSWebKitNamespace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebKitNamespace.h; sourceTree = "<group>"; }; 10290 10290 7CC7E3D617208C0F003C5277 /* IDNScriptWhiteList.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = IDNScriptWhiteList.txt; sourceTree = "<group>"; }; 10291 7CD0BA021B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ActiveDOMCallbackMicrotask.cpp; sourceTree = "<group>"; }; 10292 7CD0BA031B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ActiveDOMCallbackMicrotask.h; sourceTree = "<group>"; }; 10291 10293 7CD494CA1A86EB1D000A87EC /* RenderAttachment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderAttachment.cpp; sourceTree = "<group>"; }; 10292 10294 7CD494CB1A86EB1D000A87EC /* RenderAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderAttachment.h; sourceTree = "<group>"; }; … … 13777 13779 CAE9F90D146441F000C245B0 /* CSSAspectRatioValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSSAspectRatioValue.cpp; sourceTree = "<group>"; }; 13778 13780 CAE9F90E146441F000C245B0 /* CSSAspectRatioValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSAspectRatioValue.h; sourceTree = "<group>"; }; 13779 CB8CF0151A934B43000D510B /* MicroTask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MicroTask.cpp; sourceTree = "<group>"; }; 13780 CB8CF01C1A95DE42000D510B /* MicroTaskTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MicroTaskTest.h; sourceTree = "<group>"; }; 13781 CB8CF01E1A95DE59000D510B /* MicroTaskTest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MicroTaskTest.cpp; sourceTree = "<group>"; }; 13781 CB8CF0151A934B43000D510B /* Microtasks.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = Microtasks.cpp; sourceTree = "<group>"; }; 13782 13782 CCC2B51015F613060048CDD6 /* DeviceClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceClient.h; sourceTree = "<group>"; }; 13783 13783 CCC2B51115F613060048CDD6 /* DeviceController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DeviceController.cpp; sourceTree = "<group>"; }; … … 16471 16471 CD5393CB175DCCE600C07123 /* MemoryInfo.h */, 16472 16472 CD5393CC175DCCE600C07123 /* MemoryInfo.idl */, 16473 CB8CF01E1A95DE59000D510B /* MicroTaskTest.cpp */,16474 CB8CF01C1A95DE42000D510B /* MicroTaskTest.h */,16475 16473 CDC26B3C160A62B00026757B /* MockCDM.cpp */, 16476 16474 CDC26B3D160A62B00026757B /* MockCDM.h */, … … 23784 23782 E1C4DE6D0EA75C650023CCD6 /* ActiveDOMObject.cpp */, 23785 23783 E1C4DE680EA75C1E0023CCD6 /* ActiveDOMObject.h */, 23784 7CD0BA021B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.cpp */, 23785 7CD0BA031B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.h */, 23786 23786 319847FE1A1D816700A13318 /* AnimationEvent.cpp */, 23787 23787 319847FF1A1D816700A13318 /* AnimationEvent.h */, … … 24000 24000 E1ADECC60E76AD1F004A1A5E /* MessagePort.idl */, 24001 24001 41BF700A0FE86F49005E8DEC /* MessagePortChannel.h */, 24002 CB8CF0151A934B43000D510B /* Micro Task.cpp */,24003 53B895AD19DC7C37009CAA93 /* Micro Task.h */,24002 CB8CF0151A934B43000D510B /* Microtasks.cpp */, 24003 53B895AD19DC7C37009CAA93 /* Microtasks.h */, 24004 24004 85031B2F0A44EFC700F992E0 /* MouseEvent.cpp */, 24005 24005 85031B300A44EFC700F992E0 /* MouseEvent.h */, … … 24572 24572 A19AEA211AAA808600B52B25 /* JSMockContentFilterSettings.h in Headers */, 24573 24573 EBF5121D1696496C0056BD25 /* JSTypeConversions.h in Headers */, 24574 CB8CF01D1A95DE42000D510B /* MicroTaskTest.h in Headers */,24575 24574 CDC26B41160A8CCE0026757B /* MockCDM.h in Headers */, 24576 24575 A1BF6B831AA96C7D00AF4A8A /* MockContentFilter.h in Headers */, … … 26820 26819 37DDCDA51384501C0008B793 /* MHTMLArchive.h in Headers */, 26821 26820 37DDCDA71384501C0008B793 /* MHTMLParser.h in Headers */, 26822 53B895AF19DC7ED9009CAA93 /* Micro Task.h in Headers */,26821 53B895AF19DC7ED9009CAA93 /* Microtasks.h in Headers */, 26823 26822 37DDCD9513844FD50008B793 /* MIMEHeader.h in Headers */, 26824 26823 BC772C4F0C4EB3040083285F /* MIMETypeRegistry.h in Headers */, … … 27501 27500 97BC6A3B1505F081001B74AC /* SQLCallbackWrapper.h in Headers */, 27502 27501 97BC6A3C1505F081001B74AC /* SQLError.h in Headers */, 27502 7CD0BA051B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.h in Headers */, 27503 27503 97BC6A3F1505F081001B74AC /* SQLException.h in Headers */, 27504 27504 1A22464A0CC98DDB00C05240 /* SQLiteDatabase.h in Headers */, … … 28511 28511 A1E5B31F1AAD1DA4006EBEFB /* JSMockContentFilterSettingsCustom.cpp in Sources */, 28512 28512 EBF5121C1696496C0056BD25 /* JSTypeConversions.cpp in Sources */, 28513 CB8CF01F1A95DE59000D510B /* MicroTaskTest.cpp in Sources */,28514 28513 CDC26B40160A8CC60026757B /* MockCDM.cpp in Sources */, 28515 28514 A1BF6B821AA96C7D00AF4A8A /* MockContentFilter.cpp in Sources */, … … 28969 28968 2D29ECC5192ECC8300984B78 /* DisplayRefreshMonitorClient.cpp in Sources */, 28970 28969 0F97A658155DA81E00FADD4C /* DisplayRefreshMonitorIOS.mm in Sources */, 28970 7CD0BA041B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.cpp in Sources */, 28971 28971 49AF2D6C14435D210016A784 /* DisplayRefreshMonitorMac.cpp in Sources */, 28972 28972 2D29ECC7192ECC8300984B78 /* DisplayRefreshMonitorManager.cpp in Sources */, … … 30520 30520 E1ADECC00E76ACF1004A1A5E /* MessagePort.cpp in Sources */, 30521 30521 A78E526F1346BD1700AD9C31 /* MeterShadowElement.cpp in Sources */, 30522 CB8CF0181A9358D4000D510B /* Micro Task.cpp in Sources */,30522 CB8CF0181A9358D4000D510B /* Microtasks.cpp in Sources */, 30523 30523 37DDCD9413844FD50008B793 /* MIMEHeader.cpp in Sources */, 30524 30524 BC772C4E0C4EB3040083285F /* MIMETypeRegistry.cpp in Sources */, -
trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp
r192470 r193286 25 25 #include "JSDOMWindowBase.h" 26 26 27 #include "ActiveDOMCallbackMicrotask.h" 27 28 #include "Chrome.h" 28 29 #include "DOMWindow.h" … … 31 32 #include "JSDOMGlobalObjectTask.h" 32 33 #include "JSDOMWindowCustom.h" 34 #include "JSMainThreadExecState.h" 33 35 #include "JSModuleLoader.h" 34 36 #include "JSNode.h" … … 40 42 #include "Settings.h" 41 43 #include "WebCoreJSClientData.h" 44 #include <heap/StrongInlines.h> 42 45 #include <runtime/JSInternalPromiseDeferred.h> 43 46 #include <runtime/Microtask.h> … … 241 244 } 242 245 243 void JSDOMWindowBase::queueTaskToEventLoop(const JSGlobalObject* object, PassRefPtr<Microtask> task) 244 { 245 const JSDOMWindowBase* thisObject = static_cast<const JSDOMWindowBase*>(object); 246 thisObject->scriptExecutionContext()->postTask(JSGlobalObjectTask((JSDOMWindowBase*)thisObject, task)); 246 class JSDOMWindowMicrotaskCallback : public RefCounted<JSDOMWindowMicrotaskCallback> { 247 public: 248 static Ref<JSDOMWindowMicrotaskCallback> create(JSDOMWindowBase* globalObject, PassRefPtr<JSC::Microtask> task) 249 { 250 return adoptRef(*new JSDOMWindowMicrotaskCallback(globalObject, task)); 251 } 252 253 void call() 254 { 255 Ref<JSDOMWindowMicrotaskCallback> protect(*this); 256 JSLockHolder lock(m_globalObject->vm()); 257 258 ExecState* exec = m_globalObject->globalExec(); 259 260 JSMainThreadExecState::runTask(exec, *m_task.get()); 261 262 ASSERT(!exec->hadException()); 263 } 264 265 private: 266 JSDOMWindowMicrotaskCallback(JSDOMWindowBase* globalObject, PassRefPtr<JSC::Microtask> task) 267 : m_globalObject(globalObject->vm(), globalObject) 268 , m_task(task) 269 { 270 } 271 272 Strong<JSDOMWindowBase> m_globalObject; 273 RefPtr<JSC::Microtask> m_task; 274 }; 275 276 void JSDOMWindowBase::queueTaskToEventLoop(const JSGlobalObject* object, PassRefPtr<JSC::Microtask> task) 277 { 278 const JSDOMWindowBase* thisObject = static_cast<const JSDOMWindowBase*>(object); 279 280 RefPtr<JSDOMWindowMicrotaskCallback> callback = JSDOMWindowMicrotaskCallback::create((JSDOMWindowBase*)thisObject, task); 281 auto microtask = std::make_unique<ActiveDOMCallbackMicrotask>(MicrotaskQueue::mainThreadQueue(), *thisObject->scriptExecutionContext(), [callback]() mutable { 282 callback->call(); 283 }); 284 285 MicrotaskQueue::mainThreadQueue().append(WTF::move(microtask)); 247 286 } 248 287 -
trunk/Source/WebCore/bindings/js/JSMainThreadExecState.cpp
r185608 r193286 26 26 #include "config.h" 27 27 #include "JSMainThreadExecState.h" 28 29 #include "Microtasks.h" 28 30 #include "MutationObserver.h" 29 31 … … 44 46 #endif 45 47 46 M utationObserver::deliverAllMutations();48 MicrotaskQueue::mainThreadQueue().performMicrotaskCheckpoint(); 47 49 } 48 50 -
trunk/Source/WebCore/dom/DOMAllInOne.cpp
r191186 r193286 26 26 // This all-in-one cpp file cuts down on template bloat to allow us to build our Windows release build. 27 27 28 #include "ActiveDOMCallbackMicrotask.cpp" 28 29 #include "ActiveDOMObject.cpp" 29 30 #include "AnimationEvent.cpp" … … 98 99 #include "MessagePort.cpp" 99 100 #include "MessagePortChannel.cpp" 100 #include "Micro Task.cpp"101 #include "Microtasks.cpp" 101 102 #include "MouseEvent.cpp" 102 103 #include "MouseRelatedEvent.cpp" -
trunk/Source/WebCore/dom/Microtasks.cpp
r192969 r193286 21 21 22 22 #include "config.h" 23 #include "Micro Task.h"23 #include "Microtasks.h" 24 24 25 #include "Document.h" 25 #include <wtf/MainThread.h> 26 #include <wtf/TemporaryChange.h> 26 27 27 28 namespace WebCore { 28 29 29 MicroTaskQueue& MicroTaskQueue::singleton() 30 void Microtask::removeSelfFromQueue(MicrotaskQueue& queue) 31 { 32 queue.remove(*this); 33 } 34 35 MicrotaskQueue::MicrotaskQueue() 36 : m_timer(*this, &MicrotaskQueue::timerFired) 37 { 38 } 39 40 MicrotaskQueue::~MicrotaskQueue() 41 { 42 } 43 44 MicrotaskQueue& MicrotaskQueue::mainThreadQueue() 30 45 { 31 46 ASSERT(isMainThread()); 32 static NeverDestroyed<Micro TaskQueue> queue;47 static NeverDestroyed<MicrotaskQueue> queue; 33 48 return queue; 34 49 } 35 50 36 void Micro TaskQueue::queueMicroTask(std::unique_ptr<MicroTask>task)51 void MicrotaskQueue::append(std::unique_ptr<Microtask>&& task) 37 52 { 38 ASSERT(isMainThread()); 39 m_microTaskQueue.append(WTF::move(task)); 53 if (m_performingMicrotaskCheckpoint) 54 m_tasksAppendedDuringMicrotaskCheckpoint.append(WTF::move(task)); 55 else 56 m_microtaskQueue.append(WTF::move(task)); 57 58 m_timer.startOneShot(0); 40 59 } 41 60 42 void Micro TaskQueue::runMicroTasks()61 void MicrotaskQueue::remove(const Microtask& task) 43 62 { 44 ASSERT(isMainThread()); 45 for (auto& task : m_microTaskQueue) 46 task->run(); 47 m_microTaskQueue.clear(); 63 for (size_t i = 0; i < m_microtaskQueue.size(); ++i) { 64 if (m_microtaskQueue[i].get() == &task) { 65 m_microtaskQueue.remove(i); 66 return; 67 } 68 } 69 for (size_t i = 0; i < m_tasksAppendedDuringMicrotaskCheckpoint.size(); ++i) { 70 if (m_tasksAppendedDuringMicrotaskCheckpoint[i].get() == &task) { 71 m_tasksAppendedDuringMicrotaskCheckpoint.remove(i); 72 return; 73 } 74 } 75 } 76 77 void MicrotaskQueue::timerFired() 78 { 79 performMicrotaskCheckpoint(); 80 } 81 82 void MicrotaskQueue::performMicrotaskCheckpoint() 83 { 84 if (m_performingMicrotaskCheckpoint) 85 return; 86 87 TemporaryChange<bool> change(m_performingMicrotaskCheckpoint, true); 88 89 Vector<std::unique_ptr<Microtask>> queue = WTF::move(m_microtaskQueue); 90 for (auto& task : queue) { 91 auto result = task->run(); 92 switch (result) { 93 case Microtask::Result::Done: 94 break; 95 case Microtask::Result::KeepInQueue: 96 m_microtaskQueue.append(WTF::move(task)); 97 break; 98 } 99 } 100 101 for (auto& task : m_tasksAppendedDuringMicrotaskCheckpoint) 102 m_microtaskQueue.append(WTF::move(task)); 103 m_tasksAppendedDuringMicrotaskCheckpoint.clear(); 48 104 } 49 105 50 106 } // namespace WebCore 51 -
trunk/Source/WebCore/dom/Microtasks.h
r192969 r193286 20 20 */ 21 21 22 #ifndef Micro Task_h23 #define Micro Task_h22 #ifndef Microtasks_h 23 #define Microtasks_h 24 24 25 #include "Timer.h" 25 26 #include <wtf/NeverDestroyed.h> 26 27 #include <wtf/Vector.h> 27 28 28 29 29 namespace WebCore { 30 30 31 class MicroTask { 31 class MicrotaskQueue; 32 33 class Microtask { 32 34 public: 33 virtual void run() = 0; 34 virtual ~MicroTask() { } 35 virtual ~Microtask() 36 { 37 } 38 39 enum class Result { 40 Done, 41 KeepInQueue 42 }; 43 44 virtual Result run() = 0; 45 46 protected: 47 void removeSelfFromQueue(MicrotaskQueue&); 35 48 }; 36 49 37 class MicroTaskQueue { 38 friend NeverDestroyed<MicroTaskQueue>; 50 class MicrotaskQueue { 51 friend NeverDestroyed<MicrotaskQueue>; 52 friend class Microtask; 53 public: 54 WEBCORE_EXPORT static MicrotaskQueue& mainThreadQueue(); 39 55 40 public: 41 WEBCORE_EXPORT static MicroTaskQueue& singleton(); 42 ~MicroTaskQueue() { } 56 WEBCORE_EXPORT MicrotaskQueue(); 57 WEBCORE_EXPORT ~MicrotaskQueue(); 43 58 44 WEBCORE_EXPORT void queueMicroTask(std::unique_ptr<MicroTask>); 45 46 void runMicroTasks(); 59 WEBCORE_EXPORT void append(std::unique_ptr<Microtask>&&); 60 WEBCORE_EXPORT void performMicrotaskCheckpoint(); 47 61 48 62 private: 49 MicroTaskQueue() { } 50 Vector<std::unique_ptr<MicroTask>> m_microTaskQueue; 63 WEBCORE_EXPORT void remove(const Microtask&); 64 65 void timerFired(); 66 67 bool m_performingMicrotaskCheckpoint = false; 68 Vector<std::unique_ptr<Microtask>> m_microtaskQueue; 69 Vector<std::unique_ptr<Microtask>> m_tasksAppendedDuringMicrotaskCheckpoint; 70 71 // FIXME: Instead of a Timer, we should have a centralized Event Loop that calls performMicrotaskCheckpoint() 72 // on every iteration, implementing https://html.spec.whatwg.org/multipage/webappapis.html#processing-model-9 73 Timer m_timer; 51 74 }; 52 75 53 76 } // namespace WebCore 54 77 55 #endif // Micro Task_h78 #endif // Microtask_h -
trunk/Source/WebCore/dom/MutationObserver.cpp
r191792 r193286 36 36 #include "Document.h" 37 37 #include "ExceptionCode.h" 38 #include "Microtasks.h" 38 39 #include "MutationCallback.h" 39 40 #include "MutationObserverRegistration.h" … … 155 156 } 156 157 158 static bool mutationObserverCompoundMicrotaskQueuedFlag; 159 160 class MutationObserverMicrotask : public Microtask { 161 public: 162 MutationObserverMicrotask() 163 { 164 } 165 166 virtual ~MutationObserverMicrotask() 167 { 168 } 169 170 private: 171 virtual Result run() 172 { 173 mutationObserverCompoundMicrotaskQueuedFlag = false; 174 175 MutationObserver::deliverAllMutations(); 176 177 return Result::Done; 178 } 179 }; 180 181 static void queueMutationObserverCompoundMicrotask() 182 { 183 if (mutationObserverCompoundMicrotaskQueuedFlag) 184 return; 185 mutationObserverCompoundMicrotaskQueuedFlag = true; 186 187 auto microtask = std::make_unique<MutationObserverMicrotask>(); 188 MicrotaskQueue::mainThreadQueue().append(WTF::move(microtask)); 189 } 190 157 191 void MutationObserver::enqueueMutationRecord(PassRefPtr<MutationRecord> mutation) 158 192 { … … 160 194 m_records.append(mutation); 161 195 activeMutationObservers().add(this); 196 197 queueMutationObserverCompoundMicrotask(); 162 198 } 163 199 … … 166 202 ASSERT(isMainThread()); 167 203 activeMutationObservers().add(this); 204 205 queueMutationObserverCompoundMicrotask(); 168 206 } 169 207 -
trunk/Source/WebCore/dom/MutationObserver.h
r184225 r193286 54 54 55 55 class MutationObserver : public RefCounted<MutationObserver> { 56 friend class MutationObserverMicrotask; 56 57 public: 57 58 enum MutationType { … … 74 75 75 76 static Ref<MutationObserver> create(PassRefPtr<MutationCallback>); 76 static void deliverAllMutations();77 77 78 78 ~MutationObserver(); … … 95 95 void deliver(); 96 96 97 static void deliverAllMutations(); 97 98 static bool validateOptions(MutationObserverOptions); 98 99 -
trunk/Source/WebCore/dom/ScriptRunner.cpp
r191792 r193286 29 29 #include "CachedScript.h" 30 30 #include "Element.h" 31 #include "MicroTask.h"32 31 #include "PendingScript.h" 33 32 #include "ScriptElement.h" … … 121 120 m_document.decrementLoadEventDelayCount(); 122 121 } 123 MicroTaskQueue::singleton().runMicroTasks();124 122 } 125 123 -
trunk/Source/WebCore/html/parser/HTMLScriptRunner.cpp
r192354 r193286 36 36 #include "HTMLScriptRunnerHost.h" 37 37 #include "IgnoreDestructiveWriteCountIncrementer.h" 38 #include "Micro Task.h"38 #include "Microtasks.h" 39 39 #include "MutationObserver.h" 40 40 #include "NestingLevelIncrementer.h" … … 130 130 stopWatchingForLoad(pendingScript); 131 131 132 if (!isExecutingScript()) { 133 MutationObserver::deliverAllMutations(); 134 MicroTaskQueue::singleton().runMicroTasks(); 135 } 132 if (!isExecutingScript()) 133 MicrotaskQueue::mainThreadQueue().performMicrotaskCheckpoint(); 136 134 137 135 // Clear the pending script before possible rentrancy from executeScript() … … 234 232 return false; 235 233 } 236 if (!isExecutingScript())237 MicroTaskQueue::singleton().runMicroTasks();238 234 return true; 239 235 } … … 298 294 // unfortuantely no obvious way to tell if prepareScript is going to 299 295 // execute the script from out here. 300 if (!isExecutingScript()) { 301 MutationObserver::deliverAllMutations(); 302 MicroTaskQueue::singleton().runMicroTasks(); 303 } 296 if (!isExecutingScript()) 297 MicrotaskQueue::mainThreadQueue().performMicrotaskCheckpoint(); 304 298 305 299 InsertionPointRecord insertionPointRecord(m_host.inputStream()); -
trunk/Source/WebCore/testing/Internals.cpp
r192966 r193286 29 29 30 30 #include "AXObjectCache.h" 31 #include "ActiveDOMCallbackMicrotask.h" 31 32 #include "AnimationController.h" 32 33 #include "ApplicationCacheStorage.h" … … 82 83 #include "MemoryCache.h" 83 84 #include "MemoryInfo.h" 84 #include "MicroTask.h"85 #include "MicroTaskTest.h"86 85 #include "MockPageOverlayClient.h" 87 86 #include "Page.h" … … 3056 3055 void Internals::queueMicroTask(int testNumber) 3057 3056 { 3058 if (contextDocument()) 3059 MicroTaskQueue::singleton().queueMicroTask(std::make_unique<MicroTaskTest>(contextDocument()->createWeakPtr(), testNumber)); 3057 Document* document = contextDocument(); 3058 if (!document) 3059 return; 3060 3061 auto microtask = std::make_unique<ActiveDOMCallbackMicrotask>(MicrotaskQueue::mainThreadQueue(), *document, [document, testNumber]() { 3062 document->addConsoleMessage(MessageSource::JS, MessageLevel::Debug, makeString("MicroTask #", String::number(testNumber), " has run.")); 3063 }); 3064 3065 MicrotaskQueue::mainThreadQueue().append(WTF::move(microtask)); 3060 3066 } 3061 3067
Note: See TracChangeset
for help on using the changeset viewer.