Changeset 193286 in webkit


Ignore:
Timestamp:
Dec 3, 2015 11:06:45 AM (8 years ago)
Author:
weinig@apple.com
Message:

Promise callbacks should be called at microtask checkpoints
https://bugs.webkit.org/show_bug.cgi?id=147933

Reviewed by Chris Dumez.

Source/WebCore:

  • Re-names MicroTaskQueue and MicroTask to MicrotaskQueue and Microtask to match the spec language.
  • Re-implements MicrotaskQueue and Microtask support suspended Microtasks (via the new KeepInQueue result value a Microtask can have when running) and correct behavior when Microtasks are added to the queue during a Microtask checkpoint.
  • MicrotaskQueue now has a mainThreadQueue() static function, replacing the old singleton() function, which can be used for the Document (non-Worker) Microtasks. For Workers, the a MicrotaskQueue can be separately allocated for each WorkerGlobalScope (though this was not done in this change).
  • Adds a helper subclass of Microtask, ActiveDOMCallbackMicrotask, for Microtasks that are per-ScriptExecutationContext, and need to act as ActiveDOMCallbacks.
  • Re-implement Document (non-Worker) Promises on top of ActiveDOMCallbackMicrotask.
  • Re-implement MutationObserver delivery on top of Microtask.

Layout Test:

fast/dom/microtask-promise-mutation-observer-order.html

  • CMakeLists.txt:
  • WebCore.vcxproj/WebCore.vcxproj:
  • WebCore.xcodeproj/project.pbxproj:
  • dom/DOMAllInOne.cpp:

Add new files.

  • bindings/js/JSDOMWindowBase.cpp:

(WebCore::JSDOMWindowBase::queueTaskToEventLoop):
Switch to using ActiveDOMCallbackMicrotask/MicrotaskQueue rather than ScriptExecutionContext's Task mechanism
for JavaScriptCore tasks.

  • bindings/js/JSMainThreadExecState.cpp:

(WebCore::JSMainThreadExecState::didLeaveScriptContext):
Perform a microtask checkpoint rather than calling MutationObserver code explicitly now that mutation observers
use microtasks.

  • dom/ActiveDOMCallbackMicrotask.cpp: Added.

(WebCore::ActiveDOMCallbackMicrotask::ActiveDOMCallbackMicrotask):
(WebCore::ActiveDOMCallbackMicrotask::~ActiveDOMCallbackMicrotask):
(WebCore::ActiveDOMCallbackMicrotask::run):
(WebCore::ActiveDOMCallbackMicrotask::contextDestroyed):

  • dom/ActiveDOMCallbackMicrotask.h: Added.

Add a helper subclass of Microtask which behaves like a ActiveDOMCallback (e.g. supports suspension
and context destruction).

  • dom/MicroTask.cpp: Renamed to Microtasks.cpp.
  • dom/MicroTask.h: Renamed to Microtasks.h.
  • dom/Microtasks.cpp: Renamed from Source/WebCore/dom/MicroTask.cpp.

(WebCore::Microtask::removeSelfFromQueue):
(WebCore::MicrotaskQueue::mainThreadQueue):
(WebCore::MicrotaskQueue::append):
(WebCore::MicrotaskQueue::remove):
(WebCore::MicrotaskQueue::performMicrotaskCheckpoint):
(WebCore::MicroTaskQueue::singleton): Deleted.
(WebCore::MicroTaskQueue::queueMicroTask): Deleted.
(WebCore::MicroTaskQueue::runMicroTasks): Deleted.

  • dom/Microtasks.h: Renamed from Source/WebCore/dom/MicroTask.h.

(WebCore::Microtask::~Microtask):
(WebCore::MicrotaskQueue::MicrotaskQueue):
(WebCore::MicrotaskQueue::~MicrotaskQueue):
(WebCore::MicroTask::~MicroTask): Deleted.
(WebCore::MicroTaskQueue::~MicroTaskQueue): Deleted.
(WebCore::MicroTaskQueue::MicroTaskQueue): Deleted.
Re-implement MicrotaskQueue and Microtask to support Microtask suspension (via the KeepInQueue result
value) and correct behavior when Microtasks are queued during checkpoints.

  • dom/MutationObserver.cpp:

(WebCore::suspendedMutationObservers):
(WebCore::MutationObserverMicrotask::MutationObserverMicrotask):
(WebCore::MutationObserverMicrotask::~MutationObserverMicrotask):
(WebCore::MutationObserverMicrotask::run):
(WebCore::queueMutationObserverCompoundMicrotask):
(WebCore::MutationObserver::enqueueMutationRecord):
(WebCore::MutationObserver::setHasTransientRegistration):

  • dom/MutationObserver.h:

Re-implement MutationObserver delivery on top of Microtasks.

  • dom/ScriptRunner.cpp:

(WebCore::ScriptRunner::timerFired):
Remove unnecessary call to runMicroTasks().

  • html/parser/HTMLScriptRunner.cpp:

(WebCore::HTMLScriptRunner::executePendingScriptAndDispatchEvent):
(WebCore::HTMLScriptRunner::runScript):
Remove calls to MutationObserver::deliverAllMutations() now that the MicrotaskQueue will take care of it.

(WebCore::HTMLScriptRunner::executeScriptsWaitingForParsing):
Remove unnecessary call to runMicroTasks().

  • testing/Internals.cpp:

(WebCore::Internals::queueMicroTask):
Use ActiveDOMCallbackMicrotask rather than a custom test subclass.

  • testing/MicroTaskTest.cpp: Removed.
  • testing/MicroTaskTest.h: Removed.

Remove custom test subclass of Microtask, just use ActiveDOMCallbackMicrotask directly.

LayoutTests:

  • fast/dom/microtask-promise-mutation-observer-order-expected.txt: Added.
  • fast/dom/microtask-promise-mutation-observer-order.html: Added.
Location:
trunk
Files:
4 added
2 deleted
13 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r193134 r193286  
     12015-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
    1112015-12-03  Daniel Bates  <dabates@apple.com>
    212
  • trunk/Source/WebCore/CMakeLists.txt

    r192995 r193286  
    14141414    cssjit/SelectorCompiler.cpp
    14151415
     1416    dom/ActiveDOMCallbackMicrotask.cpp
    14161417    dom/ActiveDOMObject.cpp
    14171418    dom/AnimationEvent.cpp
     
    14861487    dom/MessagePort.cpp
    14871488    dom/MessagePortChannel.cpp
    1488     dom/MicroTask.cpp
     1489    dom/Microtasks.cpp
    14891490    dom/MouseEvent.cpp
    14901491    dom/MouseRelatedEvent.cpp
     
    33453346    testing/InternalSettings.cpp
    33463347    testing/Internals.cpp
    3347     testing/MicroTaskTest.cpp
    33483348    testing/MockPageOverlayClient.cpp
    33493349
  • trunk/Source/WebCore/ChangeLog

    r193101 r193286  
     12015-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
    11002015-12-03  Brady Eidson  <beidson@apple.com>
    2101
  • trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj

    r192995 r193286  
    1355513555      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild>
    1355613556    </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>
    1355713571    <ClCompile Include="..\dom\ActiveDOMObject.cpp">
    1355813572      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
     
    1449414508      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Production|x64'">true</ExcludedFromBuild>
    1449514509    </ClCompile>
    14496     <ClCompile Include="..\dom\MicroTask.cpp">
     14510    <ClCompile Include="..\dom\Microtasks.cpp">
    1449714511      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
    1449814512      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
     
    2203622050    <ClInclude Include="..\xml\parser\XMLDocumentParser.h" />
    2203722051    <ClInclude Include="..\xml\parser\XMLDocumentParserScope.h" />
     22052    <ClInclude Include="..\dom\ActiveDOMCallbackMicrotask.h" />
    2203822053    <ClInclude Include="..\dom\ActiveDOMObject.h" />
    2203922054    <ClInclude Include="..\dom\AnimationEvent.h" />
     
    2212722142    <ClInclude Include="..\dom\MessagePort.h" />
    2212822143    <ClInclude Include="..\dom\MessagePortChannel.h" />
    22129     <ClInclude Include="..\dom\MicroTask.h" />
     22144    <ClInclude Include="..\dom\Microtasks.h" />
    2213022145    <ClInclude Include="..\dom\MouseEvent.h" />
    2213122146    <ClInclude Include="..\dom\MouseRelatedEvent.h" />
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r192995 r193286  
    22792279                536D5A25193F40FC00CE4CAB /* SourceSizeList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 536D5A24193F40FC00CE4CAB /* SourceSizeList.cpp */; };
    22802280                536D5A27193F410B00CE4CAB /* SourceSizeList.h in Headers */ = {isa = PBXBuildFile; fileRef = 536D5A26193F410B00CE4CAB /* SourceSizeList.h */; settings = {ATTRIBUTES = (Private, ); }; };
    2281                 53B895AF19DC7ED9009CAA93 /* MicroTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 53B895AD19DC7C37009CAA93 /* MicroTask.h */; };
     2281                53B895AF19DC7ED9009CAA93 /* Microtasks.h in Headers */ = {isa = PBXBuildFile; fileRef = 53B895AD19DC7C37009CAA93 /* Microtasks.h */; settings = {ATTRIBUTES = (Private, ); }; };
    22822282                53C8298D13D8D92700DE2DEB /* RenderFlexibleBox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 53C8298B13D8D92700DE2DEB /* RenderFlexibleBox.cpp */; };
    22832283                53C8298E13D8D92700DE2DEB /* RenderFlexibleBox.h in Headers */ = {isa = PBXBuildFile; fileRef = 53C8298C13D8D92700DE2DEB /* RenderFlexibleBox.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    27542754                7CC69941191EC5F500AF2270 /* JSWebKitNamespace.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CC6993F191EC5F500AF2270 /* JSWebKitNamespace.h */; };
    27552755                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 */; };
    27562758                7CD494CC1A86EB1D000A87EC /* RenderAttachment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7CD494CA1A86EB1D000A87EC /* RenderAttachment.cpp */; };
    27572759                7CD494CD1A86EB1D000A87EC /* RenderAttachment.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CD494CB1A86EB1D000A87EC /* RenderAttachment.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    59365938                CAE9F90F146441F000C245B0 /* CSSAspectRatioValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CAE9F90D146441F000C245B0 /* CSSAspectRatioValue.cpp */; };
    59375939                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 */; };
    59415941                CCC2B51415F613060048CDD6 /* DeviceClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CCC2B51015F613060048CDD6 /* DeviceClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    59425942                CCC2B51515F613060048CDD6 /* DeviceController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CCC2B51115F613060048CDD6 /* DeviceController.cpp */; };
     
    97469746                536D5A24193F40FC00CE4CAB /* SourceSizeList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SourceSizeList.cpp; sourceTree = "<group>"; };
    97479747                536D5A26193F410B00CE4CAB /* SourceSizeList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SourceSizeList.h; sourceTree = "<group>"; };
    9748                 53B895AD19DC7C37009CAA93 /* MicroTask.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>"; };
    97499749                53C8298B13D8D92700DE2DEB /* RenderFlexibleBox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderFlexibleBox.cpp; sourceTree = "<group>"; };
    97509750                53C8298C13D8D92700DE2DEB /* RenderFlexibleBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderFlexibleBox.h; sourceTree = "<group>"; };
     
    1028910289                7CC6993F191EC5F500AF2270 /* JSWebKitNamespace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebKitNamespace.h; sourceTree = "<group>"; };
    1029010290                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>"; };
    1029110293                7CD494CA1A86EB1D000A87EC /* RenderAttachment.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderAttachment.cpp; sourceTree = "<group>"; };
    1029210294                7CD494CB1A86EB1D000A87EC /* RenderAttachment.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderAttachment.h; sourceTree = "<group>"; };
     
    1377713779                CAE9F90D146441F000C245B0 /* CSSAspectRatioValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSSAspectRatioValue.cpp; sourceTree = "<group>"; };
    1377813780                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>"; };
    1378213782                CCC2B51015F613060048CDD6 /* DeviceClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DeviceClient.h; sourceTree = "<group>"; };
    1378313783                CCC2B51115F613060048CDD6 /* DeviceController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DeviceController.cpp; sourceTree = "<group>"; };
     
    1647116471                                CD5393CB175DCCE600C07123 /* MemoryInfo.h */,
    1647216472                                CD5393CC175DCCE600C07123 /* MemoryInfo.idl */,
    16473                                 CB8CF01E1A95DE59000D510B /* MicroTaskTest.cpp */,
    16474                                 CB8CF01C1A95DE42000D510B /* MicroTaskTest.h */,
    1647516473                                CDC26B3C160A62B00026757B /* MockCDM.cpp */,
    1647616474                                CDC26B3D160A62B00026757B /* MockCDM.h */,
     
    2378423782                                E1C4DE6D0EA75C650023CCD6 /* ActiveDOMObject.cpp */,
    2378523783                                E1C4DE680EA75C1E0023CCD6 /* ActiveDOMObject.h */,
     23784                                7CD0BA021B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.cpp */,
     23785                                7CD0BA031B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.h */,
    2378623786                                319847FE1A1D816700A13318 /* AnimationEvent.cpp */,
    2378723787                                319847FF1A1D816700A13318 /* AnimationEvent.h */,
     
    2400024000                                E1ADECC60E76AD1F004A1A5E /* MessagePort.idl */,
    2400124001                                41BF700A0FE86F49005E8DEC /* MessagePortChannel.h */,
    24002                                 CB8CF0151A934B43000D510B /* MicroTask.cpp */,
    24003                                 53B895AD19DC7C37009CAA93 /* MicroTask.h */,
     24002                                CB8CF0151A934B43000D510B /* Microtasks.cpp */,
     24003                                53B895AD19DC7C37009CAA93 /* Microtasks.h */,
    2400424004                                85031B2F0A44EFC700F992E0 /* MouseEvent.cpp */,
    2400524005                                85031B300A44EFC700F992E0 /* MouseEvent.h */,
     
    2457224572                                A19AEA211AAA808600B52B25 /* JSMockContentFilterSettings.h in Headers */,
    2457324573                                EBF5121D1696496C0056BD25 /* JSTypeConversions.h in Headers */,
    24574                                 CB8CF01D1A95DE42000D510B /* MicroTaskTest.h in Headers */,
    2457524574                                CDC26B41160A8CCE0026757B /* MockCDM.h in Headers */,
    2457624575                                A1BF6B831AA96C7D00AF4A8A /* MockContentFilter.h in Headers */,
     
    2682026819                                37DDCDA51384501C0008B793 /* MHTMLArchive.h in Headers */,
    2682126820                                37DDCDA71384501C0008B793 /* MHTMLParser.h in Headers */,
    26822                                 53B895AF19DC7ED9009CAA93 /* MicroTask.h in Headers */,
     26821                                53B895AF19DC7ED9009CAA93 /* Microtasks.h in Headers */,
    2682326822                                37DDCD9513844FD50008B793 /* MIMEHeader.h in Headers */,
    2682426823                                BC772C4F0C4EB3040083285F /* MIMETypeRegistry.h in Headers */,
     
    2750127500                                97BC6A3B1505F081001B74AC /* SQLCallbackWrapper.h in Headers */,
    2750227501                                97BC6A3C1505F081001B74AC /* SQLError.h in Headers */,
     27502                                7CD0BA051B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.h in Headers */,
    2750327503                                97BC6A3F1505F081001B74AC /* SQLException.h in Headers */,
    2750427504                                1A22464A0CC98DDB00C05240 /* SQLiteDatabase.h in Headers */,
     
    2851128511                                A1E5B31F1AAD1DA4006EBEFB /* JSMockContentFilterSettingsCustom.cpp in Sources */,
    2851228512                                EBF5121C1696496C0056BD25 /* JSTypeConversions.cpp in Sources */,
    28513                                 CB8CF01F1A95DE59000D510B /* MicroTaskTest.cpp in Sources */,
    2851428513                                CDC26B40160A8CC60026757B /* MockCDM.cpp in Sources */,
    2851528514                                A1BF6B821AA96C7D00AF4A8A /* MockContentFilter.cpp in Sources */,
     
    2896928968                                2D29ECC5192ECC8300984B78 /* DisplayRefreshMonitorClient.cpp in Sources */,
    2897028969                                0F97A658155DA81E00FADD4C /* DisplayRefreshMonitorIOS.mm in Sources */,
     28970                                7CD0BA041B8F79C9005CEBBE /* ActiveDOMCallbackMicrotask.cpp in Sources */,
    2897128971                                49AF2D6C14435D210016A784 /* DisplayRefreshMonitorMac.cpp in Sources */,
    2897228972                                2D29ECC7192ECC8300984B78 /* DisplayRefreshMonitorManager.cpp in Sources */,
     
    3052030520                                E1ADECC00E76ACF1004A1A5E /* MessagePort.cpp in Sources */,
    3052130521                                A78E526F1346BD1700AD9C31 /* MeterShadowElement.cpp in Sources */,
    30522                                 CB8CF0181A9358D4000D510B /* MicroTask.cpp in Sources */,
     30522                                CB8CF0181A9358D4000D510B /* Microtasks.cpp in Sources */,
    3052330523                                37DDCD9413844FD50008B793 /* MIMEHeader.cpp in Sources */,
    3052430524                                BC772C4E0C4EB3040083285F /* MIMETypeRegistry.cpp in Sources */,
  • trunk/Source/WebCore/bindings/js/JSDOMWindowBase.cpp

    r192470 r193286  
    2525#include "JSDOMWindowBase.h"
    2626
     27#include "ActiveDOMCallbackMicrotask.h"
    2728#include "Chrome.h"
    2829#include "DOMWindow.h"
     
    3132#include "JSDOMGlobalObjectTask.h"
    3233#include "JSDOMWindowCustom.h"
     34#include "JSMainThreadExecState.h"
    3335#include "JSModuleLoader.h"
    3436#include "JSNode.h"
     
    4042#include "Settings.h"
    4143#include "WebCoreJSClientData.h"
     44#include <heap/StrongInlines.h>
    4245#include <runtime/JSInternalPromiseDeferred.h>
    4346#include <runtime/Microtask.h>
     
    241244}
    242245
    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));
     246class JSDOMWindowMicrotaskCallback : public RefCounted<JSDOMWindowMicrotaskCallback> {
     247public:
     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
     265private:
     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
     276void 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));
    247286}
    248287
  • trunk/Source/WebCore/bindings/js/JSMainThreadExecState.cpp

    r185608 r193286  
    2626#include "config.h"
    2727#include "JSMainThreadExecState.h"
     28
     29#include "Microtasks.h"
    2830#include "MutationObserver.h"
    2931
     
    4446#endif
    4547
    46     MutationObserver::deliverAllMutations();
     48    MicrotaskQueue::mainThreadQueue().performMicrotaskCheckpoint();
    4749}
    4850
  • trunk/Source/WebCore/dom/DOMAllInOne.cpp

    r191186 r193286  
    2626// This all-in-one cpp file cuts down on template bloat to allow us to build our Windows release build.
    2727
     28#include "ActiveDOMCallbackMicrotask.cpp"
    2829#include "ActiveDOMObject.cpp"
    2930#include "AnimationEvent.cpp"
     
    9899#include "MessagePort.cpp"
    99100#include "MessagePortChannel.cpp"
    100 #include "MicroTask.cpp"
     101#include "Microtasks.cpp"
    101102#include "MouseEvent.cpp"
    102103#include "MouseRelatedEvent.cpp"
  • trunk/Source/WebCore/dom/Microtasks.cpp

    r192969 r193286  
    2121
    2222#include "config.h"
    23 #include "MicroTask.h"
     23#include "Microtasks.h"
    2424
    25 #include "Document.h"
     25#include <wtf/MainThread.h>
     26#include <wtf/TemporaryChange.h>
    2627
    2728namespace WebCore {
    2829
    29 MicroTaskQueue& MicroTaskQueue::singleton()
     30void Microtask::removeSelfFromQueue(MicrotaskQueue& queue)
     31{
     32    queue.remove(*this);
     33}
     34
     35MicrotaskQueue::MicrotaskQueue()
     36    : m_timer(*this, &MicrotaskQueue::timerFired)
     37{
     38}
     39
     40MicrotaskQueue::~MicrotaskQueue()
     41{
     42}
     43
     44MicrotaskQueue& MicrotaskQueue::mainThreadQueue()
    3045{
    3146    ASSERT(isMainThread());
    32     static NeverDestroyed<MicroTaskQueue> queue;
     47    static NeverDestroyed<MicrotaskQueue> queue;
    3348    return queue;
    3449}
    3550
    36 void MicroTaskQueue::queueMicroTask(std::unique_ptr<MicroTask> task)
     51void MicrotaskQueue::append(std::unique_ptr<Microtask>&& task)
    3752{
    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);
    4059}
    4160
    42 void MicroTaskQueue::runMicroTasks()
     61void MicrotaskQueue::remove(const Microtask& task)
    4362{
    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
     77void MicrotaskQueue::timerFired()
     78{
     79    performMicrotaskCheckpoint();
     80}
     81
     82void 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();
    48104}
    49105
    50106} // namespace WebCore
    51 
  • trunk/Source/WebCore/dom/Microtasks.h

    r192969 r193286  
    2020 */
    2121
    22 #ifndef MicroTask_h
    23 #define MicroTask_h
     22#ifndef Microtasks_h
     23#define Microtasks_h
    2424
     25#include "Timer.h"
    2526#include <wtf/NeverDestroyed.h>
    2627#include <wtf/Vector.h>
    2728
    28 
    2929namespace WebCore {
    3030
    31 class MicroTask {
     31class MicrotaskQueue;
     32
     33class Microtask {
    3234public:
    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
     46protected:
     47    void removeSelfFromQueue(MicrotaskQueue&);
    3548};
    3649
    37 class MicroTaskQueue {
    38     friend NeverDestroyed<MicroTaskQueue>;
     50class MicrotaskQueue {
     51    friend NeverDestroyed<MicrotaskQueue>;
     52    friend class Microtask;
     53public:
     54    WEBCORE_EXPORT static MicrotaskQueue& mainThreadQueue();
    3955
    40 public:
    41     WEBCORE_EXPORT static MicroTaskQueue& singleton();
    42     ~MicroTaskQueue() { }
     56    WEBCORE_EXPORT MicrotaskQueue();
     57    WEBCORE_EXPORT ~MicrotaskQueue();
    4358
    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();
    4761
    4862private:
    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;
    5174};
    5275
    5376} // namespace WebCore
    5477
    55 #endif // MicroTask_h
     78#endif // Microtask_h
  • trunk/Source/WebCore/dom/MutationObserver.cpp

    r191792 r193286  
    3636#include "Document.h"
    3737#include "ExceptionCode.h"
     38#include "Microtasks.h"
    3839#include "MutationCallback.h"
    3940#include "MutationObserverRegistration.h"
     
    155156}
    156157
     158static bool mutationObserverCompoundMicrotaskQueuedFlag;
     159
     160class MutationObserverMicrotask : public Microtask {
     161public:
     162    MutationObserverMicrotask()
     163    {
     164    }
     165
     166    virtual ~MutationObserverMicrotask()
     167    {
     168    }
     169
     170private:   
     171    virtual Result run()
     172    {
     173        mutationObserverCompoundMicrotaskQueuedFlag = false;
     174
     175        MutationObserver::deliverAllMutations();
     176
     177        return Result::Done;
     178    }
     179};
     180
     181static 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
    157191void MutationObserver::enqueueMutationRecord(PassRefPtr<MutationRecord> mutation)
    158192{
     
    160194    m_records.append(mutation);
    161195    activeMutationObservers().add(this);
     196
     197    queueMutationObserverCompoundMicrotask();
    162198}
    163199
     
    166202    ASSERT(isMainThread());
    167203    activeMutationObservers().add(this);
     204
     205    queueMutationObserverCompoundMicrotask();
    168206}
    169207
  • trunk/Source/WebCore/dom/MutationObserver.h

    r184225 r193286  
    5454
    5555class MutationObserver : public RefCounted<MutationObserver> {
     56    friend class MutationObserverMicrotask;
    5657public:
    5758    enum MutationType {
     
    7475
    7576    static Ref<MutationObserver> create(PassRefPtr<MutationCallback>);
    76     static void deliverAllMutations();
    7777
    7878    ~MutationObserver();
     
    9595    void deliver();
    9696
     97    static void deliverAllMutations();
    9798    static bool validateOptions(MutationObserverOptions);
    9899
  • trunk/Source/WebCore/dom/ScriptRunner.cpp

    r191792 r193286  
    2929#include "CachedScript.h"
    3030#include "Element.h"
    31 #include "MicroTask.h"
    3231#include "PendingScript.h"
    3332#include "ScriptElement.h"
     
    121120        m_document.decrementLoadEventDelayCount();
    122121    }
    123     MicroTaskQueue::singleton().runMicroTasks();
    124122}
    125123
  • trunk/Source/WebCore/html/parser/HTMLScriptRunner.cpp

    r192354 r193286  
    3636#include "HTMLScriptRunnerHost.h"
    3737#include "IgnoreDestructiveWriteCountIncrementer.h"
    38 #include "MicroTask.h"
     38#include "Microtasks.h"
    3939#include "MutationObserver.h"
    4040#include "NestingLevelIncrementer.h"
     
    130130        stopWatchingForLoad(pendingScript);
    131131
    132     if (!isExecutingScript()) {
    133         MutationObserver::deliverAllMutations();
    134         MicroTaskQueue::singleton().runMicroTasks();
    135     }
     132    if (!isExecutingScript())
     133        MicrotaskQueue::mainThreadQueue().performMicrotaskCheckpoint();
    136134
    137135    // Clear the pending script before possible rentrancy from executeScript()
     
    234232            return false;
    235233    }
    236     if (!isExecutingScript())
    237         MicroTaskQueue::singleton().runMicroTasks();
    238234    return true;
    239235}
     
    298294        // unfortuantely no obvious way to tell if prepareScript is going to
    299295        // execute the script from out here.
    300         if (!isExecutingScript()) {
    301             MutationObserver::deliverAllMutations();
    302             MicroTaskQueue::singleton().runMicroTasks();
    303         }
     296        if (!isExecutingScript())
     297            MicrotaskQueue::mainThreadQueue().performMicrotaskCheckpoint();
    304298
    305299        InsertionPointRecord insertionPointRecord(m_host.inputStream());
  • trunk/Source/WebCore/testing/Internals.cpp

    r192966 r193286  
    2929
    3030#include "AXObjectCache.h"
     31#include "ActiveDOMCallbackMicrotask.h"
    3132#include "AnimationController.h"
    3233#include "ApplicationCacheStorage.h"
     
    8283#include "MemoryCache.h"
    8384#include "MemoryInfo.h"
    84 #include "MicroTask.h"
    85 #include "MicroTaskTest.h"
    8685#include "MockPageOverlayClient.h"
    8786#include "Page.h"
     
    30563055void Internals::queueMicroTask(int testNumber)
    30573056{
    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));
    30603066}
    30613067
Note: See TracChangeset for help on using the changeset viewer.