Changeset 251934 in webkit


Ignore:
Timestamp:
Nov 1, 2019 12:34:33 PM (4 years ago)
Author:
Chris Dumez
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:
Location:
trunk/Source/WebCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r251930 r251934  
     12019-11-01  Chris Dumez  <cdumez@apple.com>
     2
     3        Port ServiceWorkerContainer to the HTML5 event loop
     4        https://bugs.webkit.org/show_bug.cgi?id=203680
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        * dom/AbstractEventLoop.h:
     9        * workers/service/ServiceWorkerContainer.cpp:
     10        (WebCore::ServiceWorkerContainer::ServiceWorkerContainer):
     11        (WebCore::ServiceWorkerContainer::ready):
     12        (WebCore::ServiceWorkerContainer::getRegistration):
     13        (WebCore::ServiceWorkerContainer::getRegistrations):
     14        (WebCore::ServiceWorkerContainer::jobFailedWithException):
     15        (WebCore::ServiceWorkerContainer::jobResolvedWithRegistration):
     16        (WebCore::ServiceWorkerContainer::jobResolvedWithUnregistrationResult):
     17        (WebCore::ServiceWorkerContainer::jobFailedLoadingScript):
     18        (WebCore::ServiceWorkerContainer::enqueueTask):
     19        * workers/service/ServiceWorkerContainer.h:
     20
    1212019-11-01  Ryosuke Niwa  <rniwa@webkit.org>
    222
  • trunk/Source/WebCore/bindings/js/JSDOMPromiseDeferred.cpp

    r251691 r251934  
    6666void DeferredPromise::whenSettled(Function<void()>&& callback)
    6767{
     68    if (isSuspended())
     69        return;
     70
    6871    DOMPromise::whenPromiseIsSettled(globalObject(), deferred(), WTFMove(callback));
    6972}
  • trunk/Source/WebCore/dom/AbstractEventLoop.h

    r251792 r251934  
    3434
    3535enum class TaskSource : uint8_t {
     36    DOMManipulation,
    3637    IdleTask,
    3738    Networking,
  • trunk/Source/WebCore/workers/WorkerEventLoop.cpp

    r251792 r251934  
    4747    : ActiveDOMObject(&context)
    4848{
     49    suspendIfNeeded();
    4950}
    5051
  • trunk/Source/WebCore/workers/service/ServiceWorkerContainer.cpp

    r251244 r251934  
    2929#if ENABLE(SERVICE_WORKER)
    3030
     31#include "AbstractEventLoop.h"
    3132#include "DOMPromiseProxy.h"
    3233#include "Document.h"
     
    7475    , m_navigator(navigator)
    7576    , m_messageQueue(GenericEventQueue::create(*this))
    76     , m_taskQueue(SuspendableTaskQueue::create(context))
    7777{
    7878    suspendIfNeeded();
     
    110110        auto& context = *scriptExecutionContext();
    111111        ensureSWClientConnection().whenRegistrationReady(context.topOrigin().data(), context.url(), [this, protectedThis = makeRef(*this)](auto&& registrationData) mutable {
    112             m_taskQueue->enqueueTask([this, registrationData = WTFMove(registrationData)]() mutable {
     112            enqueueTask([this, registrationData = WTFMove(registrationData)]() mutable {
    113113                auto registration = ServiceWorkerRegistration::getOrCreate(*scriptExecutionContext(), *this, WTFMove(registrationData));
    114114                m_readyPromise->resolve(WTFMove(registration));
     
    272272
    273273    ensureSWClientConnection().matchRegistration(SecurityOriginData { context.topOrigin().data() }, parsedURL, [this, protectedThis = makeRef(*this), promise = WTFMove(promise)](auto&& result) mutable {
    274         m_taskQueue->enqueueTask([this, promise = WTFMove(promise), result = WTFMove(result)]() mutable {
     274        enqueueTask([this, promise = WTFMove(promise), result = WTFMove(result)]() mutable {
    275275            if (!result) {
    276276                promise->resolve();
     
    304304    auto& context = *scriptExecutionContext();
    305305    ensureSWClientConnection().getRegistrations(SecurityOriginData { context.topOrigin().data() }, context.url(), [this, protectedThis = makeRef(*this), promise = WTFMove(promise)] (auto&& registrationDatas) mutable {
    306         m_taskQueue->enqueueTask([this, promise = WTFMove(promise), registrationDatas = WTFMove(registrationDatas)]() mutable {
     306        enqueueTask([this, promise = WTFMove(promise), registrationDatas = WTFMove(registrationDatas)]() mutable {
    307307            auto registrations = WTF::map(WTFMove(registrationDatas), [&](auto&& registrationData) {
    308308                return ServiceWorkerRegistration::getOrCreate(*scriptExecutionContext(), *this, WTFMove(registrationData));
     
    336336        return;
    337337
    338     m_taskQueue->enqueueTask([promise = WTFMove(promise), exception]() mutable {
     338    enqueueTask([promise = WTFMove(promise), exception]() mutable {
    339339        promise->reject(exception);
    340340    });
     
    381381        return;
    382382
    383     m_taskQueue->enqueueTask([this, protectedThis = makeRef(*this), promise = WTFMove(promise), jobIdentifier = job.identifier(), data = WTFMove(data), shouldNotifyWhenResolved, notifyIfExitEarly = WTFMove(notifyIfExitEarly)]() mutable {
     383    enqueueTask([this, promise = WTFMove(promise), jobIdentifier = job.identifier(), data = WTFMove(data), shouldNotifyWhenResolved, notifyIfExitEarly = WTFMove(notifyIfExitEarly)]() mutable {
    384384        notifyIfExitEarly.release();
    385385
     
    390390        if (shouldNotifyWhenResolved == ShouldNotifyWhenResolved::Yes) {
    391391            m_ongoingSettledRegistrations.add(++m_lastOngoingSettledRegistrationIdentifier, registration->data().key);
    392             promise->whenSettled([this, protectedThis = WTFMove(protectedThis), identifier = m_lastOngoingSettledRegistrationIdentifier] {
     392            promise->whenSettled([this, protectedThis = makeRef(*this), identifier = m_lastOngoingSettledRegistrationIdentifier] {
    393393                notifyRegistrationIsSettled(m_ongoingSettledRegistrations.take(identifier));
    394394            });
     
    436436    }
    437437
    438     m_taskQueue->enqueueTask([promise = job.takePromise(), unregistrationResult]() mutable {
     438    enqueueTask([promise = job.takePromise(), unregistrationResult]() mutable {
    439439        promise->resolve<IDLBoolean>(unregistrationResult);
    440440    });
     
    483483
    484484    if (auto promise = job.takePromise()) {
    485         m_taskQueue->enqueueTask([promise = WTFMove(promise), exception = WTFMove(exception)]() mutable {
     485        enqueueTask([promise = WTFMove(promise), exception = WTFMove(exception)]() mutable {
    486486            promise->reject(WTFMove(exception));
    487487        });
     
    553553#endif
    554554
    555     if (m_isStopped)
    556         return;
    557 
    558     dispatchEvent(Event::create(eventNames().controllerchangeEvent, Event::CanBubble::No, Event::IsCancelable::No));
     555    enqueueTask([this] {
     556        dispatchEvent(Event::create(eventNames().controllerchangeEvent, Event::CanBubble::No, Event::IsCancelable::No));
     557    });
    559558}
    560559
     
    620619}
    621620
     621void ServiceWorkerContainer::enqueueTask(Function<void()>&& task)
     622{
     623    auto* context = scriptExecutionContext();
     624    if (!context)
     625        return;
     626    context->eventLoop().queueTask(TaskSource::DOMManipulation, *context, [protectedThis = makeRef(*this), pendingActivity = makePendingActivity(*this), task = WTFMove(task)] {
     627        task();
     628    });
     629}
     630
    622631} // namespace WebCore
    623632
  • trunk/Source/WebCore/workers/service/ServiceWorkerContainer.h

    r251244 r251934  
    9595private:
    9696    bool addEventListener(const AtomString& eventType, Ref<EventListener>&&, const AddEventListenerOptions& = { }) final;
     97    void enqueueTask(Function<void()>&&);
    9798
    9899    void scheduleJob(std::unique_ptr<ServiceWorkerJob>&&);
     
    145146    HashMap<uint64_t, ServiceWorkerRegistrationKey> m_ongoingSettledRegistrations;
    146147    UniqueRef<GenericEventQueue> m_messageQueue;
    147     UniqueRef<SuspendableTaskQueue> m_taskQueue;
    148148};
    149149
Note: See TracChangeset for help on using the changeset viewer.