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
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp
- trunk/Source/WebCore/dom/AbstractEventLoop.h
- trunk/Source/WebCore/workers/WorkerEventLoop.cpp
- trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp
- trunk/Source/WebCore/workers/service/ServiceWorkerContainer.h
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