Changeset 252212 in webkit


Ignore:
Timestamp:
Nov 7, 2019 3:24:35 PM (4 years ago)
Author:
Chris Dumez
Message:

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

Reviewed by Ryosuke Niwa.

  • dom/ActiveDOMObject.h:
  • workers/Worker.cpp:

(WebCore::Worker::Worker):
(WebCore::Worker::terminate):
(WebCore::Worker::hasPendingActivity const):
(WebCore::Worker::notifyFinished):
(WebCore::Worker::dispatchEvent):
(WebCore::Worker::enqueueEvent): Deleted.

  • workers/Worker.h:
  • workers/WorkerMessagingProxy.cpp:

(WebCore::WorkerMessagingProxy::postMessageToWorkerObject):
(WebCore::WorkerMessagingProxy::postExceptionToWorkerObject):

Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r252209 r252212  
     12019-11-07  Chris Dumez  <cdumez@apple.com>
     2
     3        Port Worker to the HTML5 event loop
     4        https://bugs.webkit.org/show_bug.cgi?id=203919
     5
     6        Reviewed by Ryosuke Niwa.
     7
     8        * dom/ActiveDOMObject.h:
     9        * workers/Worker.cpp:
     10        (WebCore::Worker::Worker):
     11        (WebCore::Worker::terminate):
     12        (WebCore::Worker::hasPendingActivity const):
     13        (WebCore::Worker::notifyFinished):
     14        (WebCore::Worker::dispatchEvent):
     15        (WebCore::Worker::enqueueEvent): Deleted.
     16        * workers/Worker.h:
     17        * workers/WorkerMessagingProxy.cpp:
     18        (WebCore::WorkerMessagingProxy::postMessageToWorkerObject):
     19        (WebCore::WorkerMessagingProxy::postExceptionToWorkerObject):
     20
    1212019-11-07  Chris Dumez  <cdumez@apple.com>
    222
  • trunk/Source/WebCore/dom/ActiveDOMObject.h

    r251975 r252212  
    114114    bool isAllowedToRunScript() const;
    115115
    116 protected:
    117     explicit ActiveDOMObject(ScriptExecutionContext*);
    118     explicit ActiveDOMObject(Document*);
    119     explicit ActiveDOMObject(Document&);
    120     virtual ~ActiveDOMObject();
    121 
    122116    template<typename T>
    123117    static void queueTaskKeepingObjectAlive(T& object, TaskSource source, Function<void ()>&& task)
     
    136130        });
    137131    }
     132
     133protected:
     134    explicit ActiveDOMObject(ScriptExecutionContext*);
     135    explicit ActiveDOMObject(Document*);
     136    explicit ActiveDOMObject(Document&);
     137    virtual ~ActiveDOMObject();
    138138
    139139private:
  • trunk/Source/WebCore/workers/Worker.cpp

    r251425 r252212  
    7070    , m_contextProxy(WorkerGlobalScopeProxy::create(*this))
    7171    , m_runtimeFlags(runtimeFlags)
    72     , m_eventQueue(GenericEventQueue::create(*this))
    7372{
    7473    static bool addedListener;
     
    148147{
    149148    m_contextProxy.terminateWorkerGlobalScope();
    150     m_eventQueue->cancelAllEvents();
     149    m_wasTerminated = true;
    151150}
    152151
     
    179178bool Worker::hasPendingActivity() const
    180179{
    181     return m_contextProxy.hasPendingActivity() || ActiveDOMObject::hasPendingActivity() || m_eventQueue->hasPendingEvents();
     180    return m_contextProxy.hasPendingActivity() || ActiveDOMObject::hasPendingActivity();
    182181}
    183182
     
    207206
    208207    if (m_scriptLoader->failed()) {
    209         enqueueEvent(Event::create(eventNames().errorEvent, Event::CanBubble::No, Event::IsCancelable::Yes));
     208        queueTaskToDispatchEvent(*this, TaskSource::DOMManipulation, Event::create(eventNames().errorEvent, Event::CanBubble::No, Event::IsCancelable::Yes));
    210209        return;
    211210    }
     
    217216}
    218217
    219 void Worker::enqueueEvent(Ref<Event>&& event)
    220 {
    221     m_eventQueue->enqueueEvent(WTFMove(event));
    222 }
    223 
    224218void Worker::dispatchEvent(Event& event)
    225219{
    226     RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(!m_eventQueue->isSuspended());
     220    if (m_wasTerminated)
     221        return;
    227222
    228223    AbstractWorker::dispatchEvent(event);
  • trunk/Source/WebCore/workers/Worker.h

    r251425 r252212  
    3030#include "ContentSecurityPolicyResponseHeaders.h"
    3131#include "EventTarget.h"
    32 #include "GenericEventQueue.h"
    3332#include "MessagePort.h"
    3433#include "WorkerScriptLoaderClient.h"
     
    6968    ScriptExecutionContext* scriptExecutionContext() const final { return ActiveDOMObject::scriptExecutionContext(); }
    7069
    71     void enqueueEvent(Ref<Event>&&);
     70    void dispatchEvent(Event&) final;
    7271
    7372private:
    7473    explicit Worker(ScriptExecutionContext&, JSC::RuntimeFlags, const Options&);
    75 
    76     void dispatchEvent(Event&) final;
    7774
    7875    EventTargetInterface eventTargetInterface() const final { return WorkerEventTargetInterfaceType; }
     
    9996    bool m_isSuspendedForBackForwardCache { false };
    10097    JSC::RuntimeFlags m_runtimeFlags;
    101     UniqueRef<GenericEventQueue> m_eventQueue;
     98    Deque<RefPtr<Event>> m_pendingEvents;
     99    bool m_wasTerminated { false };
    102100};
    103101
  • trunk/Source/WebCore/workers/WorkerMessagingProxy.cpp

    r251416 r252212  
    105105
    106106        auto ports = MessagePort::entanglePorts(context, WTFMove(message.transferredPorts));
    107         workerObject->enqueueEvent(MessageEvent::create(WTFMove(ports), message.message.releaseNonNull()));
     107        ActiveDOMObject::queueTaskToDispatchEvent(*workerObject, TaskSource::PostedMessageQueue, MessageEvent::create(WTFMove(ports), message.message.releaseNonNull()));
    108108    });
    109109}
     
    178178        // We don't bother checking the askedToTerminate() flag here, because exceptions should *always* be reported even if the thread is terminated.
    179179        // This is intentionally different than the behavior in MessageWorkerTask, because terminated workers no longer deliver messages (section 4.6 of the WebWorker spec), but they do report exceptions.
    180         workerObject->enqueueEvent(ErrorEvent::create(errorMessage, sourceURL, lineNumber, columnNumber, { }));
     180        ActiveDOMObject::queueTaskToDispatchEvent(*workerObject, TaskSource::DOMManipulation, ErrorEvent::create(errorMessage, sourceURL, lineNumber, columnNumber, { }));
    181181    });
    182182}
Note: See TracChangeset for help on using the changeset viewer.