haikuwebkit/Source/WebCore/workers/WorkerEventLoop.h

55 lines
2.0 KiB
C
Raw Permalink Normal View History

Introduce WorkerEventLoop and use it in FetchBodyOwner::runNetworkTaskWhenPossible https://bugs.webkit.org/show_bug.cgi?id=203526 Reviewed by Chris Dumez. Added WorkerEventLoop to implement the worker event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worker-event-loop-2 Each ScriptExecutionContext now returns an AbstractEventLoop so the code that may run in either main thread or a worker thread can simply get the event loop object via ScriptExecutionContext. For now, WorkerEventLoop also implements the worklet event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worklet-event-loop WorkerEventLoop is an active DOM object since it's used by at most one ScriptExecutionContext unlike WindowEventLoop, which can be shared by multiple documents and needs a custom logic to suspend and resume a subset of tasks enqueued to the event loop. No new tests since there should be no behavioral change for now. * Modules/fetch/FetchBodyOwner.cpp: (WebCore::FetchBodyOwner::runNetworkTaskWhenPossible): Use WorkerEventLoop. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * dom/AbstractEventLoop.h: (WebCore::AbstractEventLoop::suspend): Removed since it's not needed for WorkerEventLoop. (WebCore::AbstractEventLoop::resume): Ditto. * dom/Document.cpp: (WebCore::Document::eventLoop): Returns AbstractEventLoop as it now overrides the abstract member function defined in AbstractEventLoop. * dom/Document.h: * dom/ScriptExecutionContext.h: * dom/WindowEventLoop.cpp: (WebCore::WindowEventLoop::suspend): (WebCore::WindowEventLoop::resume): * dom/WindowEventLoop.h: * workers/WorkerEventLoop.cpp: Added. (WebCore::WorkerEventLoop::create): Added. (WebCore::WorkerEventLoop::WorkerEventLoop): Added. (WebCore::WorkerEventLoop::queueTask): Added. (WebCore::WorkerEventLoop::hasPendingActivity const): Added. (WebCore::WorkerEventLoop::activeDOMObjectName const): Added. (WebCore::WorkerEventLoop::suspend): Added. (WebCore::WorkerEventLoop::resume): Added. Unlike WindowEventLoop, we only need to check whether m_tasks is empty or not since WorkerEventLoop is associated with at most one ScriptExecutionContext as noted above. (WebCore::WorkerEventLoop::stop): Added. Clear m_tasks to free memory as early as possible. (WebCore::WorkerEventLoop::scheduleToRunIfNeeded): Added. (WebCore::WorkerEventLoop::run): Added. * workers/WorkerEventLoop.h: Added. * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::eventLoop): Added. * workers/WorkerGlobalScope.h: * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::eventLoop): Added. It returns WorkerEventLoop for now since there is no implementation difference. * worklets/WorkletGlobalScope.h: Canonical link: https://commits.webkit.org/216991@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251792 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-10-30 19:37:55 +00:00
/*
* Copyright (C) 2019 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#include "ActiveDOMObject.h"
Rename AbstractEventLoop to EventLoop and move to its own cpp file https://bugs.webkit.org/show_bug.cgi?id=204335 Reviewed by Antti Koivisto. This patch renames AbstractEventLoop to EventLoop and move to its own cpp file since r252607 consolidated the event loop implementations in WindowEventLoop and WorkerEventLoop. * Modules/cache/DOMCache.cpp: * Modules/cache/DOMCacheStorage.cpp: * Modules/encryptedmedia/MediaKeySession.cpp: * Modules/encryptedmedia/MediaKeys.cpp: * Modules/encryptedmedia/legacy/WebKitMediaKeySession.cpp: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * animation/WebAnimation.cpp: * bindings/js/JSDOMPromiseDeferred.h: * css/FontFaceSet.cpp: * dom/ActiveDOMObject.cpp: * dom/Document.h: * dom/ScriptExecutionContext.h: * dom/WindowEventLoop.cpp: (WebCore::AbstractEventLoop::queueTask): Deleted. (WebCore::AbstractEventLoop::resumeGroup): Deleted. (WebCore::AbstractEventLoop::stopGroup): Deleted. (WebCore::AbstractEventLoop::scheduleToRunIfNeeded): Deleted. (WebCore::AbstractEventLoop::run): Deleted. (WebCore::AbstractEventLoop::clearAllTasks): Deleted. (WebCore::EventLoopFunctionDispatchTask::EventLoopFunctionDispatchTask): Deleted. (WebCore::EventLoopTaskGroup::queueTask): Deleted. * dom/WindowEventLoop.h: * fileapi/FileReader.cpp: * testing/Internals.cpp: * workers/WorkerEventLoop.h: * workers/service/ServiceWorkerContainer.cpp: Canonical link: https://commits.webkit.org/217640@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@252646 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-11-19 21:57:52 +00:00
#include "EventLoop.h"
Introduce WorkerEventLoop and use it in FetchBodyOwner::runNetworkTaskWhenPossible https://bugs.webkit.org/show_bug.cgi?id=203526 Reviewed by Chris Dumez. Added WorkerEventLoop to implement the worker event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worker-event-loop-2 Each ScriptExecutionContext now returns an AbstractEventLoop so the code that may run in either main thread or a worker thread can simply get the event loop object via ScriptExecutionContext. For now, WorkerEventLoop also implements the worklet event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worklet-event-loop WorkerEventLoop is an active DOM object since it's used by at most one ScriptExecutionContext unlike WindowEventLoop, which can be shared by multiple documents and needs a custom logic to suspend and resume a subset of tasks enqueued to the event loop. No new tests since there should be no behavioral change for now. * Modules/fetch/FetchBodyOwner.cpp: (WebCore::FetchBodyOwner::runNetworkTaskWhenPossible): Use WorkerEventLoop. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * dom/AbstractEventLoop.h: (WebCore::AbstractEventLoop::suspend): Removed since it's not needed for WorkerEventLoop. (WebCore::AbstractEventLoop::resume): Ditto. * dom/Document.cpp: (WebCore::Document::eventLoop): Returns AbstractEventLoop as it now overrides the abstract member function defined in AbstractEventLoop. * dom/Document.h: * dom/ScriptExecutionContext.h: * dom/WindowEventLoop.cpp: (WebCore::WindowEventLoop::suspend): (WebCore::WindowEventLoop::resume): * dom/WindowEventLoop.h: * workers/WorkerEventLoop.cpp: Added. (WebCore::WorkerEventLoop::create): Added. (WebCore::WorkerEventLoop::WorkerEventLoop): Added. (WebCore::WorkerEventLoop::queueTask): Added. (WebCore::WorkerEventLoop::hasPendingActivity const): Added. (WebCore::WorkerEventLoop::activeDOMObjectName const): Added. (WebCore::WorkerEventLoop::suspend): Added. (WebCore::WorkerEventLoop::resume): Added. Unlike WindowEventLoop, we only need to check whether m_tasks is empty or not since WorkerEventLoop is associated with at most one ScriptExecutionContext as noted above. (WebCore::WorkerEventLoop::stop): Added. Clear m_tasks to free memory as early as possible. (WebCore::WorkerEventLoop::scheduleToRunIfNeeded): Added. (WebCore::WorkerEventLoop::run): Added. * workers/WorkerEventLoop.h: Added. * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::eventLoop): Added. * workers/WorkerGlobalScope.h: * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::eventLoop): Added. It returns WorkerEventLoop for now since there is no implementation difference. * worklets/WorkletGlobalScope.h: Canonical link: https://commits.webkit.org/216991@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251792 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-10-30 19:37:55 +00:00
namespace WebCore {
Share more code between WorkerGlobalScope and WorkletGlobalScope https://bugs.webkit.org/show_bug.cgi?id=217995 Reviewed by Darin Adler. Share more code between WorkerGlobalScope and WorkletGlobalScope by moving shared logic to WorkerOrWorkletGlobalScope. No new tests, no Web-facing behavior change. * Modules/webaudio/AudioWorkletGlobalScope.cpp: (WebCore::AudioWorkletGlobalScope::prepareForDestruction): * Modules/webaudio/AudioWorkletGlobalScope.h: * Modules/webaudio/AudioWorkletThread.cpp: (WebCore::AudioWorkletThread::stop): * workers/WorkerEventLoop.cpp: (WebCore::WorkerEventLoop::create): (WebCore::WorkerEventLoop::WorkerEventLoop): * workers/WorkerEventLoop.h: * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::WorkerGlobalScope): (WebCore::WorkerGlobalScope::prepareForDestruction): (WebCore::WorkerGlobalScope::removeAllEventListeners): (WebCore::WorkerGlobalScope::suspend): (WebCore::WorkerGlobalScope::resume): (WebCore::WorkerGlobalScope::close): (WebCore::WorkerGlobalScope::wrapCryptoKey): (WebCore::WorkerGlobalScope::unwrapCryptoKey): (WebCore::WorkerGlobalScope::thread const): * workers/WorkerGlobalScope.h: * workers/WorkerOrWorkletGlobalScope.cpp: (WebCore::WorkerOrWorkletGlobalScope::WorkerOrWorkletGlobalScope): (WebCore::WorkerOrWorkletGlobalScope::prepareForDestruction): (WebCore::WorkerOrWorkletGlobalScope::disableEval): (WebCore::WorkerOrWorkletGlobalScope::disableWebAssembly): (WebCore::WorkerOrWorkletGlobalScope::isJSExecutionForbidden const): (WebCore::WorkerOrWorkletGlobalScope::eventLoop): (WebCore::WorkerOrWorkletGlobalScope::isContextThread const): (WebCore::WorkerOrWorkletGlobalScope::postTask): * workers/WorkerOrWorkletGlobalScope.h: (WebCore::WorkerOrWorkletGlobalScope::isClosing const): (WebCore::WorkerOrWorkletGlobalScope::workerOrWorkletThread const): (WebCore::WorkerOrWorkletGlobalScope::markAsClosing): * workers/WorkerThread.cpp: (WebCore::WorkerThread::stop): * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::WorkletGlobalScope): (WebCore::WorkletGlobalScope::prepareForDestruction): * worklets/WorkletGlobalScope.h: Canonical link: https://commits.webkit.org/230762@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@268822 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-10-21 21:15:48 +00:00
class WorkerOrWorkletGlobalScope;
Introduce WorkerEventLoop and use it in FetchBodyOwner::runNetworkTaskWhenPossible https://bugs.webkit.org/show_bug.cgi?id=203526 Reviewed by Chris Dumez. Added WorkerEventLoop to implement the worker event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worker-event-loop-2 Each ScriptExecutionContext now returns an AbstractEventLoop so the code that may run in either main thread or a worker thread can simply get the event loop object via ScriptExecutionContext. For now, WorkerEventLoop also implements the worklet event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worklet-event-loop WorkerEventLoop is an active DOM object since it's used by at most one ScriptExecutionContext unlike WindowEventLoop, which can be shared by multiple documents and needs a custom logic to suspend and resume a subset of tasks enqueued to the event loop. No new tests since there should be no behavioral change for now. * Modules/fetch/FetchBodyOwner.cpp: (WebCore::FetchBodyOwner::runNetworkTaskWhenPossible): Use WorkerEventLoop. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * dom/AbstractEventLoop.h: (WebCore::AbstractEventLoop::suspend): Removed since it's not needed for WorkerEventLoop. (WebCore::AbstractEventLoop::resume): Ditto. * dom/Document.cpp: (WebCore::Document::eventLoop): Returns AbstractEventLoop as it now overrides the abstract member function defined in AbstractEventLoop. * dom/Document.h: * dom/ScriptExecutionContext.h: * dom/WindowEventLoop.cpp: (WebCore::WindowEventLoop::suspend): (WebCore::WindowEventLoop::resume): * dom/WindowEventLoop.h: * workers/WorkerEventLoop.cpp: Added. (WebCore::WorkerEventLoop::create): Added. (WebCore::WorkerEventLoop::WorkerEventLoop): Added. (WebCore::WorkerEventLoop::queueTask): Added. (WebCore::WorkerEventLoop::hasPendingActivity const): Added. (WebCore::WorkerEventLoop::activeDOMObjectName const): Added. (WebCore::WorkerEventLoop::suspend): Added. (WebCore::WorkerEventLoop::resume): Added. Unlike WindowEventLoop, we only need to check whether m_tasks is empty or not since WorkerEventLoop is associated with at most one ScriptExecutionContext as noted above. (WebCore::WorkerEventLoop::stop): Added. Clear m_tasks to free memory as early as possible. (WebCore::WorkerEventLoop::scheduleToRunIfNeeded): Added. (WebCore::WorkerEventLoop::run): Added. * workers/WorkerEventLoop.h: Added. * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::eventLoop): Added. * workers/WorkerGlobalScope.h: * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::eventLoop): Added. It returns WorkerEventLoop for now since there is no implementation difference. * worklets/WorkletGlobalScope.h: Canonical link: https://commits.webkit.org/216991@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251792 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-10-30 19:37:55 +00:00
Rename AbstractEventLoop to EventLoop and move to its own cpp file https://bugs.webkit.org/show_bug.cgi?id=204335 Reviewed by Antti Koivisto. This patch renames AbstractEventLoop to EventLoop and move to its own cpp file since r252607 consolidated the event loop implementations in WindowEventLoop and WorkerEventLoop. * Modules/cache/DOMCache.cpp: * Modules/cache/DOMCacheStorage.cpp: * Modules/encryptedmedia/MediaKeySession.cpp: * Modules/encryptedmedia/MediaKeys.cpp: * Modules/encryptedmedia/legacy/WebKitMediaKeySession.cpp: * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * animation/WebAnimation.cpp: * bindings/js/JSDOMPromiseDeferred.h: * css/FontFaceSet.cpp: * dom/ActiveDOMObject.cpp: * dom/Document.h: * dom/ScriptExecutionContext.h: * dom/WindowEventLoop.cpp: (WebCore::AbstractEventLoop::queueTask): Deleted. (WebCore::AbstractEventLoop::resumeGroup): Deleted. (WebCore::AbstractEventLoop::stopGroup): Deleted. (WebCore::AbstractEventLoop::scheduleToRunIfNeeded): Deleted. (WebCore::AbstractEventLoop::run): Deleted. (WebCore::AbstractEventLoop::clearAllTasks): Deleted. (WebCore::EventLoopFunctionDispatchTask::EventLoopFunctionDispatchTask): Deleted. (WebCore::EventLoopTaskGroup::queueTask): Deleted. * dom/WindowEventLoop.h: * fileapi/FileReader.cpp: * testing/Internals.cpp: * workers/WorkerEventLoop.h: * workers/service/ServiceWorkerContainer.cpp: Canonical link: https://commits.webkit.org/217640@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@252646 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-11-19 21:57:52 +00:00
class WorkerEventLoop final : public EventLoop, private ContextDestructionObserver {
Introduce WorkerEventLoop and use it in FetchBodyOwner::runNetworkTaskWhenPossible https://bugs.webkit.org/show_bug.cgi?id=203526 Reviewed by Chris Dumez. Added WorkerEventLoop to implement the worker event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worker-event-loop-2 Each ScriptExecutionContext now returns an AbstractEventLoop so the code that may run in either main thread or a worker thread can simply get the event loop object via ScriptExecutionContext. For now, WorkerEventLoop also implements the worklet event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worklet-event-loop WorkerEventLoop is an active DOM object since it's used by at most one ScriptExecutionContext unlike WindowEventLoop, which can be shared by multiple documents and needs a custom logic to suspend and resume a subset of tasks enqueued to the event loop. No new tests since there should be no behavioral change for now. * Modules/fetch/FetchBodyOwner.cpp: (WebCore::FetchBodyOwner::runNetworkTaskWhenPossible): Use WorkerEventLoop. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * dom/AbstractEventLoop.h: (WebCore::AbstractEventLoop::suspend): Removed since it's not needed for WorkerEventLoop. (WebCore::AbstractEventLoop::resume): Ditto. * dom/Document.cpp: (WebCore::Document::eventLoop): Returns AbstractEventLoop as it now overrides the abstract member function defined in AbstractEventLoop. * dom/Document.h: * dom/ScriptExecutionContext.h: * dom/WindowEventLoop.cpp: (WebCore::WindowEventLoop::suspend): (WebCore::WindowEventLoop::resume): * dom/WindowEventLoop.h: * workers/WorkerEventLoop.cpp: Added. (WebCore::WorkerEventLoop::create): Added. (WebCore::WorkerEventLoop::WorkerEventLoop): Added. (WebCore::WorkerEventLoop::queueTask): Added. (WebCore::WorkerEventLoop::hasPendingActivity const): Added. (WebCore::WorkerEventLoop::activeDOMObjectName const): Added. (WebCore::WorkerEventLoop::suspend): Added. (WebCore::WorkerEventLoop::resume): Added. Unlike WindowEventLoop, we only need to check whether m_tasks is empty or not since WorkerEventLoop is associated with at most one ScriptExecutionContext as noted above. (WebCore::WorkerEventLoop::stop): Added. Clear m_tasks to free memory as early as possible. (WebCore::WorkerEventLoop::scheduleToRunIfNeeded): Added. (WebCore::WorkerEventLoop::run): Added. * workers/WorkerEventLoop.h: Added. * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::eventLoop): Added. * workers/WorkerGlobalScope.h: * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::eventLoop): Added. It returns WorkerEventLoop for now since there is no implementation difference. * worklets/WorkletGlobalScope.h: Canonical link: https://commits.webkit.org/216991@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251792 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-10-30 19:37:55 +00:00
public:
Share more code between WorkerGlobalScope and WorkletGlobalScope https://bugs.webkit.org/show_bug.cgi?id=217995 Reviewed by Darin Adler. Share more code between WorkerGlobalScope and WorkletGlobalScope by moving shared logic to WorkerOrWorkletGlobalScope. No new tests, no Web-facing behavior change. * Modules/webaudio/AudioWorkletGlobalScope.cpp: (WebCore::AudioWorkletGlobalScope::prepareForDestruction): * Modules/webaudio/AudioWorkletGlobalScope.h: * Modules/webaudio/AudioWorkletThread.cpp: (WebCore::AudioWorkletThread::stop): * workers/WorkerEventLoop.cpp: (WebCore::WorkerEventLoop::create): (WebCore::WorkerEventLoop::WorkerEventLoop): * workers/WorkerEventLoop.h: * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::WorkerGlobalScope): (WebCore::WorkerGlobalScope::prepareForDestruction): (WebCore::WorkerGlobalScope::removeAllEventListeners): (WebCore::WorkerGlobalScope::suspend): (WebCore::WorkerGlobalScope::resume): (WebCore::WorkerGlobalScope::close): (WebCore::WorkerGlobalScope::wrapCryptoKey): (WebCore::WorkerGlobalScope::unwrapCryptoKey): (WebCore::WorkerGlobalScope::thread const): * workers/WorkerGlobalScope.h: * workers/WorkerOrWorkletGlobalScope.cpp: (WebCore::WorkerOrWorkletGlobalScope::WorkerOrWorkletGlobalScope): (WebCore::WorkerOrWorkletGlobalScope::prepareForDestruction): (WebCore::WorkerOrWorkletGlobalScope::disableEval): (WebCore::WorkerOrWorkletGlobalScope::disableWebAssembly): (WebCore::WorkerOrWorkletGlobalScope::isJSExecutionForbidden const): (WebCore::WorkerOrWorkletGlobalScope::eventLoop): (WebCore::WorkerOrWorkletGlobalScope::isContextThread const): (WebCore::WorkerOrWorkletGlobalScope::postTask): * workers/WorkerOrWorkletGlobalScope.h: (WebCore::WorkerOrWorkletGlobalScope::isClosing const): (WebCore::WorkerOrWorkletGlobalScope::workerOrWorkletThread const): (WebCore::WorkerOrWorkletGlobalScope::markAsClosing): * workers/WorkerThread.cpp: (WebCore::WorkerThread::stop): * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::WorkletGlobalScope): (WebCore::WorkletGlobalScope::prepareForDestruction): * worklets/WorkletGlobalScope.h: Canonical link: https://commits.webkit.org/230762@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@268822 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-10-21 21:15:48 +00:00
static Ref<WorkerEventLoop> create(WorkerOrWorkletGlobalScope&);
Introduce WorkerEventLoop and use it in FetchBodyOwner::runNetworkTaskWhenPossible https://bugs.webkit.org/show_bug.cgi?id=203526 Reviewed by Chris Dumez. Added WorkerEventLoop to implement the worker event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worker-event-loop-2 Each ScriptExecutionContext now returns an AbstractEventLoop so the code that may run in either main thread or a worker thread can simply get the event loop object via ScriptExecutionContext. For now, WorkerEventLoop also implements the worklet event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worklet-event-loop WorkerEventLoop is an active DOM object since it's used by at most one ScriptExecutionContext unlike WindowEventLoop, which can be shared by multiple documents and needs a custom logic to suspend and resume a subset of tasks enqueued to the event loop. No new tests since there should be no behavioral change for now. * Modules/fetch/FetchBodyOwner.cpp: (WebCore::FetchBodyOwner::runNetworkTaskWhenPossible): Use WorkerEventLoop. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * dom/AbstractEventLoop.h: (WebCore::AbstractEventLoop::suspend): Removed since it's not needed for WorkerEventLoop. (WebCore::AbstractEventLoop::resume): Ditto. * dom/Document.cpp: (WebCore::Document::eventLoop): Returns AbstractEventLoop as it now overrides the abstract member function defined in AbstractEventLoop. * dom/Document.h: * dom/ScriptExecutionContext.h: * dom/WindowEventLoop.cpp: (WebCore::WindowEventLoop::suspend): (WebCore::WindowEventLoop::resume): * dom/WindowEventLoop.h: * workers/WorkerEventLoop.cpp: Added. (WebCore::WorkerEventLoop::create): Added. (WebCore::WorkerEventLoop::WorkerEventLoop): Added. (WebCore::WorkerEventLoop::queueTask): Added. (WebCore::WorkerEventLoop::hasPendingActivity const): Added. (WebCore::WorkerEventLoop::activeDOMObjectName const): Added. (WebCore::WorkerEventLoop::suspend): Added. (WebCore::WorkerEventLoop::resume): Added. Unlike WindowEventLoop, we only need to check whether m_tasks is empty or not since WorkerEventLoop is associated with at most one ScriptExecutionContext as noted above. (WebCore::WorkerEventLoop::stop): Added. Clear m_tasks to free memory as early as possible. (WebCore::WorkerEventLoop::scheduleToRunIfNeeded): Added. (WebCore::WorkerEventLoop::run): Added. * workers/WorkerEventLoop.h: Added. * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::eventLoop): Added. * workers/WorkerGlobalScope.h: * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::eventLoop): Added. It returns WorkerEventLoop for now since there is no implementation difference. * worklets/WorkletGlobalScope.h: Canonical link: https://commits.webkit.org/216991@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251792 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-10-30 19:37:55 +00:00
MicrotaskQueue should be accessed via EventLoop https://bugs.webkit.org/show_bug.cgi?id=204397 Reviewed by Antti Koivisto. This patch refactors the existing code so that a microtask is always queued via EventLoopTaskGroup. It preserves all other (broken) semantics and behavior like all origins sharing a single microtask queue. The singleton MicrotaskQueue for the main thread has been moved from MicrotaskQueue::mainThreadQueue to WindowEventLoop, and an instance of MicrotaskQueue for each worker has been moved from WorkerGlobalScope to WorkerEventLoop. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): * animation/WebAnimation.cpp: (WebCore::WebAnimation::updateFinishedState): * bindings/js/JSDOMGlobalObjectTask.cpp: (WebCore::JSGlobalObjectTask::JSGlobalObjectTask): * bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::queueMicrotaskToEventLoop): Renamed from queueTaskToEventLoop. * bindings/js/JSDOMWindowBase.h: * bindings/js/JSExecState.cpp: (WebCore::JSExecState::didLeaveScriptContext): * bindings/js/JSRemoteDOMWindowBase.cpp: * bindings/js/JSWorkerGlobalScopeBase.cpp: (WebCore::JSWorkerGlobalScopeBase::queueMicrotaskToEventLoop): Renamed from queueTaskToEventLoop. * bindings/js/JSWorkerGlobalScopeBase.h: * bindings/js/JSWorkletGlobalScopeBase.cpp: * bindings/js/JSWorkletGlobalScopeBase.h: * dom/CustomElementReactionQueue.cpp: (WebCore::BackupElementQueueMicrotask): Deleted. (WebCore::CustomElementReactionQueue::enqueueElementOnAppropriateElementQueue): (WebCore::CustomElementReactionQueue::ensureBackupQueue): * dom/CustomElementReactionQueue.h: * dom/Document.cpp: (WebCore::Document::finishedParsing): * dom/DocumentStorageAccess.cpp: (WebCore::DocumentStorageAccess::requestStorageAccess): * dom/EventLoop.cpp: (WebCore::EventLoop::queueMicrotask): Added. (WebCore::EventLoop::performMicrotaskCheckpoint): Added. (WebCore::EventLoopTaskGroup::queueMicrotaskCallback): Added. (WebCore::EventLoopTaskGroup::queueMicrotask): Added. (WebCore::EventLoopTaskGroup::performMicrotaskCheckpoint): Added. * dom/EventLoop.h: (WebCore::EventLoopTaskGroup::microtaskQueue): * dom/Microtasks.cpp: (WebCore::MicrotaskQueue::mainThreadQueue): Deleted. (WebCore::MicrotaskQueue::contextQueue): Deleted. * dom/Microtasks.h: * dom/MutationObserver.cpp: (WebCore::MutationObserverMicrotask): Deleted. (WebCore::MutationObserver::queueMutationObserverCompoundMicrotask): Made this a member function so that it can call notifyMutationObservers in its lambda. (WebCore::MutationObserver::enqueueMutationRecord): (WebCore::MutationObserver::enqueueSlotChangeEvent): (WebCore::MutationObserver::setHasTransientRegistration): * dom/MutationObserver.h: * dom/MutationObserverRegistration.cpp: (WebCore::MutationObserverRegistration::observedSubtreeNodeWillDetach): * dom/WindowEventLoop.cpp: (WebCore::WindowEventLoop::microtaskQueue): * dom/WindowEventLoop.h: * html/parser/HTMLDocumentParser.cpp: (WebCore::HTMLDocumentParser::runScriptsForPausedTreeBuilder): * html/parser/HTMLScriptRunner.cpp: (WebCore::HTMLScriptRunner::executePendingScriptAndDispatchEvent): (WebCore::HTMLScriptRunner::runScript): * inspector/agents/InspectorCanvasAgent.cpp: (WebCore::InspectorCanvasAgent::recordCanvasAction): * testing/Internals.cpp: (WebCore::Internals::queueMicroTask): * workers/WorkerEventLoop.cpp: (WebCore::WorkerEventLoop::~WorkerEventLoop): (WebCore::WorkerEventLoop::microtaskQueue): (WebCore::WorkerEventLoop::clearMicrotaskQueue): * workers/WorkerEventLoop.h: * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::WorkerGlobalScope): (WebCore::WorkerGlobalScope::prepareForTermination): * workers/WorkerGlobalScope.h: (WebCore::WorkerGlobalScope::microtaskQueue const): Deleted. Canonical link: https://commits.webkit.org/217704@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@252723 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-11-21 01:47:56 +00:00
virtual ~WorkerEventLoop();
// FIXME: This should be removed once MicrotaskQueue is integrated with EventLoopTaskGroup.
void clearMicrotaskQueue();
Introduce WorkerEventLoop and use it in FetchBodyOwner::runNetworkTaskWhenPossible https://bugs.webkit.org/show_bug.cgi?id=203526 Reviewed by Chris Dumez. Added WorkerEventLoop to implement the worker event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worker-event-loop-2 Each ScriptExecutionContext now returns an AbstractEventLoop so the code that may run in either main thread or a worker thread can simply get the event loop object via ScriptExecutionContext. For now, WorkerEventLoop also implements the worklet event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worklet-event-loop WorkerEventLoop is an active DOM object since it's used by at most one ScriptExecutionContext unlike WindowEventLoop, which can be shared by multiple documents and needs a custom logic to suspend and resume a subset of tasks enqueued to the event loop. No new tests since there should be no behavioral change for now. * Modules/fetch/FetchBodyOwner.cpp: (WebCore::FetchBodyOwner::runNetworkTaskWhenPossible): Use WorkerEventLoop. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * dom/AbstractEventLoop.h: (WebCore::AbstractEventLoop::suspend): Removed since it's not needed for WorkerEventLoop. (WebCore::AbstractEventLoop::resume): Ditto. * dom/Document.cpp: (WebCore::Document::eventLoop): Returns AbstractEventLoop as it now overrides the abstract member function defined in AbstractEventLoop. * dom/Document.h: * dom/ScriptExecutionContext.h: * dom/WindowEventLoop.cpp: (WebCore::WindowEventLoop::suspend): (WebCore::WindowEventLoop::resume): * dom/WindowEventLoop.h: * workers/WorkerEventLoop.cpp: Added. (WebCore::WorkerEventLoop::create): Added. (WebCore::WorkerEventLoop::WorkerEventLoop): Added. (WebCore::WorkerEventLoop::queueTask): Added. (WebCore::WorkerEventLoop::hasPendingActivity const): Added. (WebCore::WorkerEventLoop::activeDOMObjectName const): Added. (WebCore::WorkerEventLoop::suspend): Added. (WebCore::WorkerEventLoop::resume): Added. Unlike WindowEventLoop, we only need to check whether m_tasks is empty or not since WorkerEventLoop is associated with at most one ScriptExecutionContext as noted above. (WebCore::WorkerEventLoop::stop): Added. Clear m_tasks to free memory as early as possible. (WebCore::WorkerEventLoop::scheduleToRunIfNeeded): Added. (WebCore::WorkerEventLoop::run): Added. * workers/WorkerEventLoop.h: Added. * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::eventLoop): Added. * workers/WorkerGlobalScope.h: * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::eventLoop): Added. It returns WorkerEventLoop for now since there is no implementation difference. * worklets/WorkletGlobalScope.h: Canonical link: https://commits.webkit.org/216991@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251792 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-10-30 19:37:55 +00:00
private:
Share more code between WorkerGlobalScope and WorkletGlobalScope https://bugs.webkit.org/show_bug.cgi?id=217995 Reviewed by Darin Adler. Share more code between WorkerGlobalScope and WorkletGlobalScope by moving shared logic to WorkerOrWorkletGlobalScope. No new tests, no Web-facing behavior change. * Modules/webaudio/AudioWorkletGlobalScope.cpp: (WebCore::AudioWorkletGlobalScope::prepareForDestruction): * Modules/webaudio/AudioWorkletGlobalScope.h: * Modules/webaudio/AudioWorkletThread.cpp: (WebCore::AudioWorkletThread::stop): * workers/WorkerEventLoop.cpp: (WebCore::WorkerEventLoop::create): (WebCore::WorkerEventLoop::WorkerEventLoop): * workers/WorkerEventLoop.h: * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::WorkerGlobalScope): (WebCore::WorkerGlobalScope::prepareForDestruction): (WebCore::WorkerGlobalScope::removeAllEventListeners): (WebCore::WorkerGlobalScope::suspend): (WebCore::WorkerGlobalScope::resume): (WebCore::WorkerGlobalScope::close): (WebCore::WorkerGlobalScope::wrapCryptoKey): (WebCore::WorkerGlobalScope::unwrapCryptoKey): (WebCore::WorkerGlobalScope::thread const): * workers/WorkerGlobalScope.h: * workers/WorkerOrWorkletGlobalScope.cpp: (WebCore::WorkerOrWorkletGlobalScope::WorkerOrWorkletGlobalScope): (WebCore::WorkerOrWorkletGlobalScope::prepareForDestruction): (WebCore::WorkerOrWorkletGlobalScope::disableEval): (WebCore::WorkerOrWorkletGlobalScope::disableWebAssembly): (WebCore::WorkerOrWorkletGlobalScope::isJSExecutionForbidden const): (WebCore::WorkerOrWorkletGlobalScope::eventLoop): (WebCore::WorkerOrWorkletGlobalScope::isContextThread const): (WebCore::WorkerOrWorkletGlobalScope::postTask): * workers/WorkerOrWorkletGlobalScope.h: (WebCore::WorkerOrWorkletGlobalScope::isClosing const): (WebCore::WorkerOrWorkletGlobalScope::workerOrWorkletThread const): (WebCore::WorkerOrWorkletGlobalScope::markAsClosing): * workers/WorkerThread.cpp: (WebCore::WorkerThread::stop): * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::WorkletGlobalScope): (WebCore::WorkletGlobalScope::prepareForDestruction): * worklets/WorkletGlobalScope.h: Canonical link: https://commits.webkit.org/230762@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@268822 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-10-21 21:15:48 +00:00
explicit WorkerEventLoop(WorkerOrWorkletGlobalScope&);
Introduce WorkerEventLoop and use it in FetchBodyOwner::runNetworkTaskWhenPossible https://bugs.webkit.org/show_bug.cgi?id=203526 Reviewed by Chris Dumez. Added WorkerEventLoop to implement the worker event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worker-event-loop-2 Each ScriptExecutionContext now returns an AbstractEventLoop so the code that may run in either main thread or a worker thread can simply get the event loop object via ScriptExecutionContext. For now, WorkerEventLoop also implements the worklet event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worklet-event-loop WorkerEventLoop is an active DOM object since it's used by at most one ScriptExecutionContext unlike WindowEventLoop, which can be shared by multiple documents and needs a custom logic to suspend and resume a subset of tasks enqueued to the event loop. No new tests since there should be no behavioral change for now. * Modules/fetch/FetchBodyOwner.cpp: (WebCore::FetchBodyOwner::runNetworkTaskWhenPossible): Use WorkerEventLoop. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * dom/AbstractEventLoop.h: (WebCore::AbstractEventLoop::suspend): Removed since it's not needed for WorkerEventLoop. (WebCore::AbstractEventLoop::resume): Ditto. * dom/Document.cpp: (WebCore::Document::eventLoop): Returns AbstractEventLoop as it now overrides the abstract member function defined in AbstractEventLoop. * dom/Document.h: * dom/ScriptExecutionContext.h: * dom/WindowEventLoop.cpp: (WebCore::WindowEventLoop::suspend): (WebCore::WindowEventLoop::resume): * dom/WindowEventLoop.h: * workers/WorkerEventLoop.cpp: Added. (WebCore::WorkerEventLoop::create): Added. (WebCore::WorkerEventLoop::WorkerEventLoop): Added. (WebCore::WorkerEventLoop::queueTask): Added. (WebCore::WorkerEventLoop::hasPendingActivity const): Added. (WebCore::WorkerEventLoop::activeDOMObjectName const): Added. (WebCore::WorkerEventLoop::suspend): Added. (WebCore::WorkerEventLoop::resume): Added. Unlike WindowEventLoop, we only need to check whether m_tasks is empty or not since WorkerEventLoop is associated with at most one ScriptExecutionContext as noted above. (WebCore::WorkerEventLoop::stop): Added. Clear m_tasks to free memory as early as possible. (WebCore::WorkerEventLoop::scheduleToRunIfNeeded): Added. (WebCore::WorkerEventLoop::run): Added. * workers/WorkerEventLoop.h: Added. * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::eventLoop): Added. * workers/WorkerGlobalScope.h: * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::eventLoop): Added. It returns WorkerEventLoop for now since there is no implementation difference. * worklets/WorkletGlobalScope.h: Canonical link: https://commits.webkit.org/216991@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251792 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-10-30 19:37:55 +00:00
Share more code between WindowEventLoop and WorkerEventLoop by introducing EventLoopTaskGroup https://bugs.webkit.org/show_bug.cgi?id=204263 Reviewed by Antti Koivisto. This patch abstracts the logic in WindowEventLoop to deal with a set of tasks associated with a particular documents all suspending, resuming, or stopping at the same time using a new abstraction called EventLoopTaskGroup in order to group tasks for media code and elsewhere. Each task is now represented as an instance of a concrete subclass of EventLoopTask, which has a pure virtual execute() member function. Its primary purpose is to know EventLoopTaskGroup to which each task belongs. One of subclasss, EventLoopFunctionDispatchTask, is used to store a callback function and another subclass, ActiveDOMObjectEventDispatchTask, is used to dispatch an async event. ScriptExecutionContext's eventLoop() method now returns EventLoopTaskGroup. Because this group is specific to a given ScriptExecutionContext, we no longer have to pass the ScriptExecutionContext in each call to queueTask everywhere in our codebase. For now, I kept all the code in WindowEventLoop.cpp to make the patch reviewable. My plan is to create a new cpp file (e.g. AbstractEventLoop.cpp) and move most of code there instead as a follow up. No new tests since there should be no observable behavior change. * Modules/encryptedmedia/MediaKeys.cpp: (WebCore::MediaKeys::setServerCertificate): * Modules/entriesapi/FileSystemDirectoryEntry.cpp: (WebCore::FileSystemDirectoryEntry::getEntry): * Modules/entriesapi/FileSystemDirectoryReader.cpp: (WebCore::FileSystemDirectoryReader::readEntries): * Modules/entriesapi/FileSystemEntry.cpp: (WebCore::FileSystemEntry::getParent): * Modules/entriesapi/FileSystemFileEntry.cpp: (WebCore::FileSystemFileEntry::file): * Modules/mediarecorder/MediaRecorder.cpp: (WebCore::MediaRecorder::scheduleDeferredTask): * Modules/notifications/Notification.cpp: (WebCore::Notification::queueTask): * Modules/webdatabase/Database.cpp: (WebCore::Database::runTransaction): * Modules/webdatabase/DatabaseManager.cpp: (WebCore::DatabaseManager::openDatabase): * Modules/webdatabase/SQLTransaction.cpp: (WebCore::SQLTransaction::callErrorCallbackDueToInterruption): (WebCore::SQLTransaction::deliverTransactionErrorCallback): (WebCore::SQLTransaction::deliverSuccessCallback): * bindings/js/JSDOMPromiseDeferred.cpp: (WebCore::DeferredPromise::callFunction): (WebCore::DeferredPromise::whenSettled): * dom/AbstractEventLoop.h: (WebCore::EventLoopTask): Added. (WebCore::EventLoopTask::taskSource): Added. (WebCore::EventLoopTask::group const): Added. (WebCore::EventLoopTask::EventLoopTask): Added. (WebCore::EventLoopTaskGroup): Added. This class represents a group of tasks. For now, each group is a distinct ScriptExecutionContext. (WebCore::EventLoopTaskGroup::matchesTask const): Added. (WebCore::EventLoopTaskGroup::startRunning): Added. (WebCore::EventLoopTaskGroup::stopAndDiscardAllTasks): Added. (WebCore::EventLoopTaskGroup::suspend): Added. (WebCore::EventLoopTaskGroup::resume): Added. (WebCore::EventLoopTaskGroup::isStoppedPermanently): Added. (WebCore::EventLoopTaskGroup::isSuspended): Added. (WebCore::EventLoopTaskGroup::hasScheduledTasks const): Added. (WebCore::EventLoopTaskGroup::queueTask): Added. * dom/ActiveDOMObject.cpp: (WebCore::ActiveDOMObject::queueTaskInEventLoop): (WebCore::ActiveDOMObjectEventDispatchTask): Added; A subclass of EventLoopTask to dispatch an async event. (WebCore::ActiveDOMObjectEventDispatchTask::ActiveDOMObjectEventDispatchTask): Added. (WebCore::ActiveDOMObjectEventDispatchTask::~ActiveDOMObjectEventDispatchTask): Added. (WebCore::ActiveDOMObject::queueTaskToDispatchEventInternal): Added. * dom/ActiveDOMObject.h: * dom/Document.cpp: (WebCore::Document::suspendActiveDOMObjects): (WebCore::Document::resumeActiveDOMObjects): (WebCore::Document::stopActiveDOMObjects): (WebCore::Document::eventLoop): Creates EventLoopTaskGroup for this document. * dom/Document.h: * dom/IdleCallbackController.cpp: (WebCore::IdleCallbackController::queueTaskToStartIdlePeriod): (WebCore::IdleCallbackController::queueTaskToInvokeIdleCallbacks): * dom/ScriptExecutionContext.h: * dom/WindowEventLoop.cpp: (WebCore::AbstractEventLoop::queueTask): The implementation moved from WindowEventLoop to AbstractEventLoop. (WebCore::AbstractEventLoop::suspend): Removed. (WebCore::AbstractEventLoop::resumeGroup): Ditto. (WebCore::AbstractEventLoop::stopGroup): Ditto. (WebCore::WindowEventLoop::scheduleToRun): Renamed from WindowEventLoop::scheduleToRunIfNeeded. (WebCore::AbstractEventLoop::scheduleToRunIfNeeded): Extracted from WindowEventLoop::scheduleToRunIfNeeded. (WebCore::WindowEventLoop::isContextThread const): Added. (WebCore::AbstractEventLoop::run): The implementation moved from WindowEventLoop to AbstractEventLoop. (WebCore::AbstractEventLoop::clearAllTasks): Added. (WebCore::EventLoopFunctionDispatchTask): Added; A subclass of EventLoopTask to call a function. (WebCore::EventLoopFunctionDispatchTask::EventLoopFunctionDispatchTask): Added. (WebCore::EventLoopTaskGroup::queueTask): Added. * dom/WindowEventLoop.h: * fileapi/FileReader.cpp: (WebCore::FileReader::enqueueTask): * testing/Internals.cpp: (WebCore::Internals::queueTask): * workers/WorkerEventLoop.cpp: (WebCore::WorkerEventLoop::WorkerEventLoop): (WebCore::WorkerEventLoop::queueTask): Deleted. (WebCore::WorkerEventLoop::activeDOMObjectName const): Deleted. (WebCore::WorkerEventLoop::suspend): Deleted. (WebCore::WorkerEventLoop::resume): Deleted. (WebCore::WorkerEventLoop::stop): Deleted. (WebCore::WorkerEventLoop::scheduleToRun): Extracted from scheduleToRunIfNeeded. (WebCore::WorkerEventLoop::scheduleToRunIfNeeded): Deleted. (WebCore::WorkerEventLoop::run): Deleted. (WebCore::WorkerEventLoop::isContextThread const): Added. * workers/WorkerEventLoop.h: (WebCore::WorkerEventLoop): This class is no longer an active DOM object. WorkerGlobalScope and WorkerGlobalScope manually stop the task group associated with it. * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::eventLoop): Create the default task group for this script execution context. (WebCore::WorkerGlobalScope::prepareForTermination): Stop the default task group. * workers/WorkerGlobalScope.h: * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::prepareForDestruction): Similar to WorkerGlobalScope::prepareForTermination. (WebCore::WorkletGlobalScope::eventLoop): Similar to WorkerGlobalScope::eventLoop. * worklets/WorkletGlobalScope.h: Canonical link: https://commits.webkit.org/217605@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@252607 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-11-19 00:54:57 +00:00
void scheduleToRun() final;
bool isContextThread() const;
MicrotaskQueue should be accessed via EventLoop https://bugs.webkit.org/show_bug.cgi?id=204397 Reviewed by Antti Koivisto. This patch refactors the existing code so that a microtask is always queued via EventLoopTaskGroup. It preserves all other (broken) semantics and behavior like all origins sharing a single microtask queue. The singleton MicrotaskQueue for the main thread has been moved from MicrotaskQueue::mainThreadQueue to WindowEventLoop, and an instance of MicrotaskQueue for each worker has been moved from WorkerGlobalScope to WorkerEventLoop. * animation/DocumentTimeline.cpp: (WebCore::DocumentTimeline::internalUpdateAnimationsAndSendEvents): * animation/WebAnimation.cpp: (WebCore::WebAnimation::updateFinishedState): * bindings/js/JSDOMGlobalObjectTask.cpp: (WebCore::JSGlobalObjectTask::JSGlobalObjectTask): * bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::queueMicrotaskToEventLoop): Renamed from queueTaskToEventLoop. * bindings/js/JSDOMWindowBase.h: * bindings/js/JSExecState.cpp: (WebCore::JSExecState::didLeaveScriptContext): * bindings/js/JSRemoteDOMWindowBase.cpp: * bindings/js/JSWorkerGlobalScopeBase.cpp: (WebCore::JSWorkerGlobalScopeBase::queueMicrotaskToEventLoop): Renamed from queueTaskToEventLoop. * bindings/js/JSWorkerGlobalScopeBase.h: * bindings/js/JSWorkletGlobalScopeBase.cpp: * bindings/js/JSWorkletGlobalScopeBase.h: * dom/CustomElementReactionQueue.cpp: (WebCore::BackupElementQueueMicrotask): Deleted. (WebCore::CustomElementReactionQueue::enqueueElementOnAppropriateElementQueue): (WebCore::CustomElementReactionQueue::ensureBackupQueue): * dom/CustomElementReactionQueue.h: * dom/Document.cpp: (WebCore::Document::finishedParsing): * dom/DocumentStorageAccess.cpp: (WebCore::DocumentStorageAccess::requestStorageAccess): * dom/EventLoop.cpp: (WebCore::EventLoop::queueMicrotask): Added. (WebCore::EventLoop::performMicrotaskCheckpoint): Added. (WebCore::EventLoopTaskGroup::queueMicrotaskCallback): Added. (WebCore::EventLoopTaskGroup::queueMicrotask): Added. (WebCore::EventLoopTaskGroup::performMicrotaskCheckpoint): Added. * dom/EventLoop.h: (WebCore::EventLoopTaskGroup::microtaskQueue): * dom/Microtasks.cpp: (WebCore::MicrotaskQueue::mainThreadQueue): Deleted. (WebCore::MicrotaskQueue::contextQueue): Deleted. * dom/Microtasks.h: * dom/MutationObserver.cpp: (WebCore::MutationObserverMicrotask): Deleted. (WebCore::MutationObserver::queueMutationObserverCompoundMicrotask): Made this a member function so that it can call notifyMutationObservers in its lambda. (WebCore::MutationObserver::enqueueMutationRecord): (WebCore::MutationObserver::enqueueSlotChangeEvent): (WebCore::MutationObserver::setHasTransientRegistration): * dom/MutationObserver.h: * dom/MutationObserverRegistration.cpp: (WebCore::MutationObserverRegistration::observedSubtreeNodeWillDetach): * dom/WindowEventLoop.cpp: (WebCore::WindowEventLoop::microtaskQueue): * dom/WindowEventLoop.h: * html/parser/HTMLDocumentParser.cpp: (WebCore::HTMLDocumentParser::runScriptsForPausedTreeBuilder): * html/parser/HTMLScriptRunner.cpp: (WebCore::HTMLScriptRunner::executePendingScriptAndDispatchEvent): (WebCore::HTMLScriptRunner::runScript): * inspector/agents/InspectorCanvasAgent.cpp: (WebCore::InspectorCanvasAgent::recordCanvasAction): * testing/Internals.cpp: (WebCore::Internals::queueMicroTask): * workers/WorkerEventLoop.cpp: (WebCore::WorkerEventLoop::~WorkerEventLoop): (WebCore::WorkerEventLoop::microtaskQueue): (WebCore::WorkerEventLoop::clearMicrotaskQueue): * workers/WorkerEventLoop.h: * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::WorkerGlobalScope): (WebCore::WorkerGlobalScope::prepareForTermination): * workers/WorkerGlobalScope.h: (WebCore::WorkerGlobalScope::microtaskQueue const): Deleted. Canonical link: https://commits.webkit.org/217704@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@252723 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-11-21 01:47:56 +00:00
MicrotaskQueue& microtaskQueue() final;
std::unique_ptr<MicrotaskQueue> m_microtaskQueue;
Introduce WorkerEventLoop and use it in FetchBodyOwner::runNetworkTaskWhenPossible https://bugs.webkit.org/show_bug.cgi?id=203526 Reviewed by Chris Dumez. Added WorkerEventLoop to implement the worker event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worker-event-loop-2 Each ScriptExecutionContext now returns an AbstractEventLoop so the code that may run in either main thread or a worker thread can simply get the event loop object via ScriptExecutionContext. For now, WorkerEventLoop also implements the worklet event loop: https://html.spec.whatwg.org/multipage/webappapis.html#worklet-event-loop WorkerEventLoop is an active DOM object since it's used by at most one ScriptExecutionContext unlike WindowEventLoop, which can be shared by multiple documents and needs a custom logic to suspend and resume a subset of tasks enqueued to the event loop. No new tests since there should be no behavioral change for now. * Modules/fetch/FetchBodyOwner.cpp: (WebCore::FetchBodyOwner::runNetworkTaskWhenPossible): Use WorkerEventLoop. * Sources.txt: * WebCore.xcodeproj/project.pbxproj: * dom/AbstractEventLoop.h: (WebCore::AbstractEventLoop::suspend): Removed since it's not needed for WorkerEventLoop. (WebCore::AbstractEventLoop::resume): Ditto. * dom/Document.cpp: (WebCore::Document::eventLoop): Returns AbstractEventLoop as it now overrides the abstract member function defined in AbstractEventLoop. * dom/Document.h: * dom/ScriptExecutionContext.h: * dom/WindowEventLoop.cpp: (WebCore::WindowEventLoop::suspend): (WebCore::WindowEventLoop::resume): * dom/WindowEventLoop.h: * workers/WorkerEventLoop.cpp: Added. (WebCore::WorkerEventLoop::create): Added. (WebCore::WorkerEventLoop::WorkerEventLoop): Added. (WebCore::WorkerEventLoop::queueTask): Added. (WebCore::WorkerEventLoop::hasPendingActivity const): Added. (WebCore::WorkerEventLoop::activeDOMObjectName const): Added. (WebCore::WorkerEventLoop::suspend): Added. (WebCore::WorkerEventLoop::resume): Added. Unlike WindowEventLoop, we only need to check whether m_tasks is empty or not since WorkerEventLoop is associated with at most one ScriptExecutionContext as noted above. (WebCore::WorkerEventLoop::stop): Added. Clear m_tasks to free memory as early as possible. (WebCore::WorkerEventLoop::scheduleToRunIfNeeded): Added. (WebCore::WorkerEventLoop::run): Added. * workers/WorkerEventLoop.h: Added. * workers/WorkerGlobalScope.cpp: (WebCore::WorkerGlobalScope::eventLoop): Added. * workers/WorkerGlobalScope.h: * worklets/WorkletGlobalScope.cpp: (WebCore::WorkletGlobalScope::eventLoop): Added. It returns WorkerEventLoop for now since there is no implementation difference. * worklets/WorkletGlobalScope.h: Canonical link: https://commits.webkit.org/216991@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@251792 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2019-10-30 19:37:55 +00:00
};
} // namespace WebCore