Title: [251934] trunk/Source/WebCore
Revision
251934
Author
cdu...@apple.com
Date
2019-11-01 12:34:33 -0700 (Fri, 01 Nov 2019)

Log Message

Port ServiceWorkerContainer to the HTML5 event loop
https://bugs.webkit.org/show_bug.cgi?id=203680

Reviewed by Ryosuke Niwa.

* dom/AbstractEventLoop.h:
* workers/service/ServiceWorkerContainer.cpp:
(WebCore::ServiceWorkerContainer::ServiceWorkerContainer):
(WebCore::ServiceWorkerContainer::ready):
(WebCore::ServiceWorkerContainer::getRegistration):
(WebCore::ServiceWorkerContainer::getRegistrations):
(WebCore::ServiceWorkerContainer::jobFailedWithException):
(WebCore::ServiceWorkerContainer::jobResolvedWithRegistration):
(WebCore::ServiceWorkerContainer::jobResolvedWithUnregistrationResult):
(WebCore::ServiceWorkerContainer::jobFailedLoadingScript):
(WebCore::ServiceWorkerContainer::enqueueTask):
* workers/service/ServiceWorkerContainer.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (251933 => 251934)


--- trunk/Source/WebCore/ChangeLog	2019-11-01 19:34:09 UTC (rev 251933)
+++ trunk/Source/WebCore/ChangeLog	2019-11-01 19:34:33 UTC (rev 251934)
@@ -1,3 +1,23 @@
+2019-11-01  Chris Dumez  <cdu...@apple.com>
+
+        Port ServiceWorkerContainer to the HTML5 event loop
+        https://bugs.webkit.org/show_bug.cgi?id=203680
+
+        Reviewed by Ryosuke Niwa.
+
+        * dom/AbstractEventLoop.h:
+        * workers/service/ServiceWorkerContainer.cpp:
+        (WebCore::ServiceWorkerContainer::ServiceWorkerContainer):
+        (WebCore::ServiceWorkerContainer::ready):
+        (WebCore::ServiceWorkerContainer::getRegistration):
+        (WebCore::ServiceWorkerContainer::getRegistrations):
+        (WebCore::ServiceWorkerContainer::jobFailedWithException):
+        (WebCore::ServiceWorkerContainer::jobResolvedWithRegistration):
+        (WebCore::ServiceWorkerContainer::jobResolvedWithUnregistrationResult):
+        (WebCore::ServiceWorkerContainer::jobFailedLoadingScript):
+        (WebCore::ServiceWorkerContainer::enqueueTask):
+        * workers/service/ServiceWorkerContainer.h:
+
 2019-11-01  Ryosuke Niwa  <rn...@webkit.org>
 
         Integrate media query evaluation into HTML5 event loop

Modified: trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp (251933 => 251934)


--- trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp	2019-11-01 19:34:09 UTC (rev 251933)
+++ trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp	2019-11-01 19:34:33 UTC (rev 251934)
@@ -65,6 +65,9 @@
 
 void DeferredPromise::whenSettled(Function<void()>&& callback)
 {
+    if (isSuspended())
+        return;
+
     DOMPromise::whenPromiseIsSettled(globalObject(), deferred(), WTFMove(callback));
 }
 

Modified: trunk/Source/WebCore/dom/AbstractEventLoop.h (251933 => 251934)


--- trunk/Source/WebCore/dom/AbstractEventLoop.h	2019-11-01 19:34:09 UTC (rev 251933)
+++ trunk/Source/WebCore/dom/AbstractEventLoop.h	2019-11-01 19:34:33 UTC (rev 251934)
@@ -33,6 +33,7 @@
 class ScriptExecutionContext;
 
 enum class TaskSource : uint8_t {
+    DOMManipulation,
     IdleTask,
     Networking,
     UserInteraction

Modified: trunk/Source/WebCore/workers/WorkerEventLoop.cpp (251933 => 251934)


--- trunk/Source/WebCore/workers/WorkerEventLoop.cpp	2019-11-01 19:34:09 UTC (rev 251933)
+++ trunk/Source/WebCore/workers/WorkerEventLoop.cpp	2019-11-01 19:34:33 UTC (rev 251934)
@@ -46,6 +46,7 @@
 WorkerEventLoop::WorkerEventLoop(ScriptExecutionContext& context)
     : ActiveDOMObject(&context)
 {
+    suspendIfNeeded();
 }
 
 void WorkerEventLoop::queueTask(TaskSource source, ScriptExecutionContext& context, TaskFunction&& function)

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp (251933 => 251934)


--- trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp	2019-11-01 19:34:09 UTC (rev 251933)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp	2019-11-01 19:34:33 UTC (rev 251934)
@@ -28,6 +28,7 @@
 
 #if ENABLE(SERVICE_WORKER)
 
+#include "AbstractEventLoop.h"
 #include "DOMPromiseProxy.h"
 #include "Document.h"
 #include "Event.h"
@@ -73,7 +74,6 @@
     : ActiveDOMObject(context)
     , m_navigator(navigator)
     , m_messageQueue(GenericEventQueue::create(*this))
-    , m_taskQueue(SuspendableTaskQueue::create(context))
 {
     suspendIfNeeded();
     
@@ -109,7 +109,7 @@
 
         auto& context = *scriptExecutionContext();
         ensureSWClientConnection().whenRegistrationReady(context.topOrigin().data(), context.url(), [this, protectedThis = makeRef(*this)](auto&& registrationData) mutable {
-            m_taskQueue->enqueueTask([this, registrationData = WTFMove(registrationData)]() mutable {
+            enqueueTask([this, registrationData = WTFMove(registrationData)]() mutable {
                 auto registration = ServiceWorkerRegistration::getOrCreate(*scriptExecutionContext(), *this, WTFMove(registrationData));
                 m_readyPromise->resolve(WTFMove(registration));
             });
@@ -271,7 +271,7 @@
     }
 
     ensureSWClientConnection().matchRegistration(SecurityOriginData { context.topOrigin().data() }, parsedURL, [this, protectedThis = makeRef(*this), promise = WTFMove(promise)](auto&& result) mutable {
-        m_taskQueue->enqueueTask([this, promise = WTFMove(promise), result = WTFMove(result)]() mutable {
+        enqueueTask([this, promise = WTFMove(promise), result = WTFMove(result)]() mutable {
             if (!result) {
                 promise->resolve();
                 return;
@@ -303,7 +303,7 @@
 
     auto& context = *scriptExecutionContext();
     ensureSWClientConnection().getRegistrations(SecurityOriginData { context.topOrigin().data() }, context.url(), [this, protectedThis = makeRef(*this), promise = WTFMove(promise)] (auto&& registrationDatas) mutable {
-        m_taskQueue->enqueueTask([this, promise = WTFMove(promise), registrationDatas = WTFMove(registrationDatas)]() mutable {
+        enqueueTask([this, promise = WTFMove(promise), registrationDatas = WTFMove(registrationDatas)]() mutable {
             auto registrations = WTF::map(WTFMove(registrationDatas), [&](auto&& registrationData) {
                 return ServiceWorkerRegistration::getOrCreate(*scriptExecutionContext(), *this, WTFMove(registrationData));
             });
@@ -335,7 +335,7 @@
     if (!promise)
         return;
 
-    m_taskQueue->enqueueTask([promise = WTFMove(promise), exception]() mutable {
+    enqueueTask([promise = WTFMove(promise), exception]() mutable {
         promise->reject(exception);
     });
 }
@@ -380,7 +380,7 @@
     if (!promise)
         return;
 
-    m_taskQueue->enqueueTask([this, protectedThis = makeRef(*this), promise = WTFMove(promise), jobIdentifier = job.identifier(), data = "" shouldNotifyWhenResolved, notifyIfExitEarly = WTFMove(notifyIfExitEarly)]() mutable {
+    enqueueTask([this, promise = WTFMove(promise), jobIdentifier = job.identifier(), data = "" shouldNotifyWhenResolved, notifyIfExitEarly = WTFMove(notifyIfExitEarly)]() mutable {
         notifyIfExitEarly.release();
 
         auto registration = ServiceWorkerRegistration::getOrCreate(*scriptExecutionContext(), *this, WTFMove(data));
@@ -389,7 +389,7 @@
 
         if (shouldNotifyWhenResolved == ShouldNotifyWhenResolved::Yes) {
             m_ongoingSettledRegistrations.add(++m_lastOngoingSettledRegistrationIdentifier, registration->data().key);
-            promise->whenSettled([this, protectedThis = WTFMove(protectedThis), identifier = m_lastOngoingSettledRegistrationIdentifier] {
+            promise->whenSettled([this, protectedThis = makeRef(*this), identifier = m_lastOngoingSettledRegistrationIdentifier] {
                 notifyRegistrationIsSettled(m_ongoingSettledRegistrations.take(identifier));
             });
         }
@@ -435,7 +435,7 @@
         return;
     }
 
-    m_taskQueue->enqueueTask([promise = job.takePromise(), unregistrationResult]() mutable {
+    enqueueTask([promise = job.takePromise(), unregistrationResult]() mutable {
         promise->resolve<IDLBoolean>(unregistrationResult);
     });
 }
@@ -482,7 +482,7 @@
     CONTAINER_RELEASE_LOG_ERROR_IF_ALLOWED("jobFinishedLoadingScript: Failed to fetch script for job %" PRIu64 ", error: %s", job.identifier().toUInt64(), error.localizedDescription().utf8().data());
 
     if (auto promise = job.takePromise()) {
-        m_taskQueue->enqueueTask([promise = WTFMove(promise), exception = WTFMove(exception)]() mutable {
+        enqueueTask([promise = WTFMove(promise), exception = WTFMove(exception)]() mutable {
             promise->reject(WTFMove(exception));
         });
     }
@@ -552,10 +552,9 @@
     ASSERT(m_creationThread.ptr() == &Thread::current());
 #endif
 
-    if (m_isStopped)
-        return;
-
-    dispatchEvent(Event::create(eventNames().controllerchangeEvent, Event::CanBubble::No, Event::IsCancelable::No));
+    enqueueTask([this] {
+        dispatchEvent(Event::create(eventNames().controllerchangeEvent, Event::CanBubble::No, Event::IsCancelable::No));
+    });
 }
 
 void ServiceWorkerContainer::stop()
@@ -619,6 +618,16 @@
     return EventTargetWithInlineData::addEventListener(eventType, WTFMove(eventListener), options);
 }
 
+void ServiceWorkerContainer::enqueueTask(Function<void()>&& task)
+{
+    auto* context = scriptExecutionContext();
+    if (!context)
+        return;
+    context->eventLoop().queueTask(TaskSource::DOMManipulation, *context, [protectedThis = makeRef(*this), pendingActivity = makePendingActivity(*this), task = WTFMove(task)] {
+        task();
+    });
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(SERVICE_WORKER)

Modified: trunk/Source/WebCore/workers/service/ServiceWorkerContainer.h (251933 => 251934)


--- trunk/Source/WebCore/workers/service/ServiceWorkerContainer.h	2019-11-01 19:34:09 UTC (rev 251933)
+++ trunk/Source/WebCore/workers/service/ServiceWorkerContainer.h	2019-11-01 19:34:33 UTC (rev 251934)
@@ -94,6 +94,7 @@
 
 private:
     bool addEventListener(const AtomString& eventType, Ref<EventListener>&&, const AddEventListenerOptions& = { }) final;
+    void enqueueTask(Function<void()>&&);
 
     void scheduleJob(std::unique_ptr<ServiceWorkerJob>&&);
 
@@ -144,7 +145,6 @@
     uint64_t m_lastOngoingSettledRegistrationIdentifier { 0 };
     HashMap<uint64_t, ServiceWorkerRegistrationKey> m_ongoingSettledRegistrations;
     UniqueRef<GenericEventQueue> m_messageQueue;
-    UniqueRef<SuspendableTaskQueue> m_taskQueue;
 };
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to