Title: [278538] trunk/Source/WebCore
Revision
278538
Author
cdu...@apple.com
Date
2021-06-06 12:13:07 -0700 (Sun, 06 Jun 2021)

Log Message

Reduce use of legacy EventLoopEventQueue and EventLoopTaskQueue
https://bugs.webkit.org/show_bug.cgi?id=226692

Reviewed by Darin Adler.

Reduce use of legacy EventLoopEventQueue and EventLoopTaskQueue, and use the HTML event
loop directly instead. Those are very simple cases, they really don't need any of the
features the queue was providing (such as cancelling events).

To get rid of the remaining usage of EventLoopEventQueue / EventLoopTaskQueue, I believe
we'll need a way to cancel tasks scheduled in the HTML event loop.

* Modules/mediasession/MediaSessionCoordinator.cpp:
(WebCore::MediaSessionCoordinator::MediaSessionCoordinator):
(WebCore::MediaSessionCoordinator::coordinatorStateChanged):
* Modules/mediasession/MediaSessionCoordinator.h:
* Modules/mediasource/MediaSource.cpp:
(WebCore::MediaSource::MediaSource):
(WebCore::MediaSource::virtualHasPendingActivity const):
(WebCore::MediaSource::scheduleEvent):
* Modules/mediasource/MediaSource.h:
* Modules/mediasource/SourceBuffer.cpp:
(WebCore::SourceBuffer::SourceBuffer):
(WebCore::SourceBuffer::virtualHasPendingActivity const):
(WebCore::SourceBuffer::scheduleEvent):
* Modules/mediasource/SourceBuffer.h:
* Modules/mediasource/SourceBufferList.cpp:
(WebCore::SourceBufferList::SourceBufferList):
(WebCore::SourceBufferList::scheduleEvent):
* Modules/mediasource/SourceBufferList.h:
* Modules/remoteplayback/RemotePlayback.cpp:
(WebCore::RemotePlayback::RemotePlayback):
(WebCore::RemotePlayback::watchAvailability):
(WebCore::RemotePlayback::cancelWatchAvailability):
(WebCore::RemotePlayback::prompt):
(WebCore::RemotePlayback::setState):
(WebCore::RemotePlayback::disconnect):
(WebCore::RemotePlayback::availabilityChanged):
(WebCore::RemotePlayback::stop): Deleted.
* Modules/remoteplayback/RemotePlayback.h:
* animation/DocumentTimelinesController.cpp:
(WebCore::DocumentTimelinesController::DocumentTimelinesController):
(WebCore::DocumentTimelinesController::detachFromDocument):
(WebCore::DocumentTimelinesController::cacheCurrentTime):
(WebCore::DocumentTimelinesController::maybeClearCachedCurrentTime):
* animation/DocumentTimelinesController.h:
* dom/FullscreenManager.cpp:
(WebCore::FullscreenManager::FullscreenManager):
(WebCore::FullscreenManager::requestFullscreenForElement):
(WebCore::FullscreenManager::exitFullscreen):
(): Deleted.
* dom/FullscreenManager.h:
* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::HTMLMediaElement):
(WebCore::HTMLMediaElement::~HTMLMediaElement):
(WebCore::HTMLMediaElement::removedFromAncestor):
(WebCore::HTMLMediaElement::scheduleResolvePendingPlayPromises):
(WebCore::HTMLMediaElement::scheduleRejectPendingPlayPromises):
(WebCore::HTMLMediaElement::scheduleNotifyAboutPlaying):
(WebCore::HTMLMediaElement::setMediaKeys):
(WebCore::HTMLMediaElement::closeTaskQueues):
(WebCore::HTMLMediaElement::virtualHasPendingActivity const):
(WebCore::HTMLMediaElement::setIsPlayingToWirelessTarget):
(WebCore::HTMLMediaElement::enterFullscreen):
(WebCore::HTMLMediaElement::isVisibleInViewportChanged):
* html/HTMLMediaElement.h:
* html/shadow/MediaControlTextTrackContainerElement.cpp:
(WebCore::MediaControlTextTrackContainerElement::MediaControlTextTrackContainerElement):
(WebCore::MediaControlTextTrackContainerElement::updateSizes):
* html/shadow/MediaControlTextTrackContainerElement.h:
* html/track/TrackListBase.cpp:
(WebCore::TrackListBase::TrackListBase):
(WebCore::TrackListBase::scheduleChangeEvent):
(WebCore::TrackListBase::isChangeEventScheduled const):
(WebCore::TrackListBase::virtualHasPendingActivity const): Deleted.
* html/track/TrackListBase.h:
* platform/network/curl/CurlMultipartHandle.cpp:
(WebCore::CurlMultipartHandle::processContent):
(WebCore::CurlMultipartHandle::matchedLength):
* platform/network/curl/CurlMultipartHandle.h:
* testing/MockMediaSessionCoordinator.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (278537 => 278538)


--- trunk/Source/WebCore/ChangeLog	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/ChangeLog	2021-06-06 19:13:07 UTC (rev 278538)
@@ -1,3 +1,87 @@
+2021-06-06  Chris Dumez  <cdu...@apple.com>
+
+        Reduce use of legacy EventLoopEventQueue and EventLoopTaskQueue
+        https://bugs.webkit.org/show_bug.cgi?id=226692
+
+        Reviewed by Darin Adler.
+
+        Reduce use of legacy EventLoopEventQueue and EventLoopTaskQueue, and use the HTML event
+        loop directly instead. Those are very simple cases, they really don't need any of the
+        features the queue was providing (such as cancelling events).
+
+        To get rid of the remaining usage of EventLoopEventQueue / EventLoopTaskQueue, I believe
+        we'll need a way to cancel tasks scheduled in the HTML event loop.
+
+        * Modules/mediasession/MediaSessionCoordinator.cpp:
+        (WebCore::MediaSessionCoordinator::MediaSessionCoordinator):
+        (WebCore::MediaSessionCoordinator::coordinatorStateChanged):
+        * Modules/mediasession/MediaSessionCoordinator.h:
+        * Modules/mediasource/MediaSource.cpp:
+        (WebCore::MediaSource::MediaSource):
+        (WebCore::MediaSource::virtualHasPendingActivity const):
+        (WebCore::MediaSource::scheduleEvent):
+        * Modules/mediasource/MediaSource.h:
+        * Modules/mediasource/SourceBuffer.cpp:
+        (WebCore::SourceBuffer::SourceBuffer):
+        (WebCore::SourceBuffer::virtualHasPendingActivity const):
+        (WebCore::SourceBuffer::scheduleEvent):
+        * Modules/mediasource/SourceBuffer.h:
+        * Modules/mediasource/SourceBufferList.cpp:
+        (WebCore::SourceBufferList::SourceBufferList):
+        (WebCore::SourceBufferList::scheduleEvent):
+        * Modules/mediasource/SourceBufferList.h:
+        * Modules/remoteplayback/RemotePlayback.cpp:
+        (WebCore::RemotePlayback::RemotePlayback):
+        (WebCore::RemotePlayback::watchAvailability):
+        (WebCore::RemotePlayback::cancelWatchAvailability):
+        (WebCore::RemotePlayback::prompt):
+        (WebCore::RemotePlayback::setState):
+        (WebCore::RemotePlayback::disconnect):
+        (WebCore::RemotePlayback::availabilityChanged):
+        (WebCore::RemotePlayback::stop): Deleted.
+        * Modules/remoteplayback/RemotePlayback.h:
+        * animation/DocumentTimelinesController.cpp:
+        (WebCore::DocumentTimelinesController::DocumentTimelinesController):
+        (WebCore::DocumentTimelinesController::detachFromDocument):
+        (WebCore::DocumentTimelinesController::cacheCurrentTime):
+        (WebCore::DocumentTimelinesController::maybeClearCachedCurrentTime):
+        * animation/DocumentTimelinesController.h:
+        * dom/FullscreenManager.cpp:
+        (WebCore::FullscreenManager::FullscreenManager):
+        (WebCore::FullscreenManager::requestFullscreenForElement):
+        (WebCore::FullscreenManager::exitFullscreen):
+        (): Deleted.
+        * dom/FullscreenManager.h:
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::HTMLMediaElement):
+        (WebCore::HTMLMediaElement::~HTMLMediaElement):
+        (WebCore::HTMLMediaElement::removedFromAncestor):
+        (WebCore::HTMLMediaElement::scheduleResolvePendingPlayPromises):
+        (WebCore::HTMLMediaElement::scheduleRejectPendingPlayPromises):
+        (WebCore::HTMLMediaElement::scheduleNotifyAboutPlaying):
+        (WebCore::HTMLMediaElement::setMediaKeys):
+        (WebCore::HTMLMediaElement::closeTaskQueues):
+        (WebCore::HTMLMediaElement::virtualHasPendingActivity const):
+        (WebCore::HTMLMediaElement::setIsPlayingToWirelessTarget):
+        (WebCore::HTMLMediaElement::enterFullscreen):
+        (WebCore::HTMLMediaElement::isVisibleInViewportChanged):
+        * html/HTMLMediaElement.h:
+        * html/shadow/MediaControlTextTrackContainerElement.cpp:
+        (WebCore::MediaControlTextTrackContainerElement::MediaControlTextTrackContainerElement):
+        (WebCore::MediaControlTextTrackContainerElement::updateSizes):
+        * html/shadow/MediaControlTextTrackContainerElement.h:
+        * html/track/TrackListBase.cpp:
+        (WebCore::TrackListBase::TrackListBase):
+        (WebCore::TrackListBase::scheduleChangeEvent):
+        (WebCore::TrackListBase::isChangeEventScheduled const):
+        (WebCore::TrackListBase::virtualHasPendingActivity const): Deleted.
+        * html/track/TrackListBase.h:
+        * platform/network/curl/CurlMultipartHandle.cpp:
+        (WebCore::CurlMultipartHandle::processContent):
+        (WebCore::CurlMultipartHandle::matchedLength):
+        * platform/network/curl/CurlMultipartHandle.h:
+        * testing/MockMediaSessionCoordinator.h:
+
 2021-06-06  Alan Bujtas  <za...@apple.com>
 
         [LFC][TFC] Adopt a less quirky fixed column width space distribution

Modified: trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.cpp (278537 => 278538)


--- trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.cpp	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.cpp	2021-06-06 19:13:07 UTC (rev 278538)
@@ -59,7 +59,6 @@
     : ActiveDOMObject(context)
     , m_logger(makeRef(Document::sharedLogger()))
     , m_logIdentifier(nextCoordinatorLogIdentifier())
-    , m_asyncEventQueue(EventLoopEventQueue::create(*this))
 {
     ALWAYS_LOG(LOGIDENTIFIER);
 }
@@ -419,7 +418,7 @@
     m_state = state;
     ALWAYS_LOG(LOGIDENTIFIER, m_state);
     if (shouldFireEvents())
-        m_asyncEventQueue->enqueueEvent(Event::create(eventNames().coordinatorstatechangeEvent, Event::CanBubble::No, Event::IsCancelable::No));
+        queueTaskToDispatchEvent(*this, TaskSource::MediaElement, Event::create(eventNames().coordinatorstatechangeEvent, Event::CanBubble::No, Event::IsCancelable::No));
 }
 
 bool MediaSessionCoordinator::currentPositionApproximatelyEqualTo(double time) const

Modified: trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.h (278537 => 278538)


--- trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.h	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/Modules/mediasession/MediaSessionCoordinator.h	2021-06-06 19:13:07 UTC (rev 278538)
@@ -28,7 +28,6 @@
 #if ENABLE(MEDIA_SESSION_COORDINATOR)
 
 #include "ActiveDOMObject.h"
-#include "EventLoopEventQueue.h"
 #include "EventTarget.h"
 #include "MediaSession.h"
 #include "MediaSessionCoordinatorPrivate.h"
@@ -110,7 +109,6 @@
     RefPtr<MediaSessionCoordinatorPrivate> m_privateCoordinator;
     const Ref<const Logger> m_logger;
     const void* m_logIdentifier;
-    UniqueRef<EventLoopEventQueue> m_asyncEventQueue;
     MediaSessionCoordinatorState m_state { MediaSessionCoordinatorState::Closed };
     bool m_hasCoordinatorsStateChangeEventListener { false };
 };

Modified: trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp (278537 => 278538)


--- trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/Modules/mediasource/MediaSource.cpp	2021-06-06 19:13:07 UTC (rev 278538)
@@ -104,7 +104,6 @@
     : ActiveDOMObject(&context)
     , m_duration(MediaTime::invalidTime())
     , m_pendingSeekTime(MediaTime::invalidTime())
-    , m_asyncEventQueue(EventLoopEventQueue::create(*this))
 #if !RELEASE_LOG_DISABLED
     , m_logger(downcast<Document>(context).logger())
 #endif
@@ -998,7 +997,7 @@
 
 bool MediaSource::virtualHasPendingActivity() const
 {
-    return m_private || m_asyncEventQueue->hasPendingActivity() || m_associatedRegistryCount;
+    return m_private || m_associatedRegistryCount;
 }
 
 void MediaSource::stop()
@@ -1078,10 +1077,7 @@
 {
     DEBUG_LOG(LOGIDENTIFIER, "scheduling '", eventName, "'");
 
-    auto event = Event::create(eventName, Event::CanBubble::No, Event::IsCancelable::No);
-    event->setTarget(this);
-
-    m_asyncEventQueue->enqueueEvent(WTFMove(event));
+    queueTaskToDispatchEvent(*this, TaskSource::MediaElement, Event::create(eventName, Event::CanBubble::No, Event::IsCancelable::No));
 }
 
 ScriptExecutionContext* MediaSource::scriptExecutionContext() const

Modified: trunk/Source/WebCore/Modules/mediasource/MediaSource.h (278537 => 278538)


--- trunk/Source/WebCore/Modules/mediasource/MediaSource.h	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/Modules/mediasource/MediaSource.h	2021-06-06 19:13:07 UTC (rev 278538)
@@ -33,7 +33,6 @@
 #if ENABLE(MEDIA_SOURCE)
 
 #include "ActiveDOMObject.h"
-#include "EventLoopEventQueue.h"
 #include "EventTarget.h"
 #include "ExceptionOr.h"
 #include "HTMLMediaElement.h"
@@ -174,7 +173,6 @@
     MediaTime m_duration;
     MediaTime m_pendingSeekTime;
     ReadyState m_readyState { ReadyState::Closed };
-    UniqueRef<EventLoopEventQueue> m_asyncEventQueue;
 #if !RELEASE_LOG_DISABLED
     Ref<const Logger> m_logger;
     const void* m_logIdentifier { nullptr };

Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (278537 => 278538)


--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2021-06-06 19:13:07 UTC (rev 278538)
@@ -74,7 +74,6 @@
     : ActiveDOMObject(source->scriptExecutionContext())
     , m_private(WTFMove(sourceBufferPrivate))
     , m_source(source)
-    , m_asyncEventQueue(EventLoopEventQueue::create(*this))
     , m_appendBufferTimer(*this, &SourceBuffer::appendBufferTimerFired)
     , m_appendWindowStart(MediaTime::zeroTime())
     , m_appendWindowEnd(MediaTime::positiveInfiniteTime())
@@ -439,7 +438,7 @@
 
 bool SourceBuffer::virtualHasPendingActivity() const
 {
-    return m_source || m_asyncEventQueue->hasPendingActivity();
+    return m_source;
 }
 
 void SourceBuffer::stop()
@@ -460,10 +459,7 @@
 
 void SourceBuffer::scheduleEvent(const AtomString& eventName)
 {
-    auto event = Event::create(eventName, Event::CanBubble::No, Event::IsCancelable::No);
-    event->setTarget(this);
-
-    m_asyncEventQueue->enqueueEvent(WTFMove(event));
+    queueTaskToDispatchEvent(*this, TaskSource::MediaElement, Event::create(eventName, Event::CanBubble::No, Event::IsCancelable::No));
 }
 
 ExceptionOr<void> SourceBuffer::appendBufferInternal(const unsigned char* data, unsigned size)

Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.h (278537 => 278538)


--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.h	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.h	2021-06-06 19:13:07 UTC (rev 278538)
@@ -35,7 +35,6 @@
 
 #include "ActiveDOMObject.h"
 #include "AudioTrack.h"
-#include "EventLoopEventQueue.h"
 #include "EventTarget.h"
 #include "ExceptionOr.h"
 #include "SourceBufferPrivate.h"
@@ -208,7 +207,6 @@
 
     Ref<SourceBufferPrivate> m_private;
     MediaSource* m_source;
-    UniqueRef<EventLoopEventQueue> m_asyncEventQueue;
     AppendMode m_mode { AppendMode::Segments };
 
     Vector<unsigned char> m_pendingAppendData;

Modified: trunk/Source/WebCore/Modules/mediasource/SourceBufferList.cpp (278537 => 278538)


--- trunk/Source/WebCore/Modules/mediasource/SourceBufferList.cpp	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBufferList.cpp	2021-06-06 19:13:07 UTC (rev 278538)
@@ -44,7 +44,6 @@
 
 SourceBufferList::SourceBufferList(ScriptExecutionContext* context)
     : ActiveDOMObject(context)
-    , m_asyncEventQueue(EventLoopEventQueue::create(*this))
 {
     suspendIfNeeded();
 }
@@ -95,10 +94,7 @@
 
 void SourceBufferList::scheduleEvent(const AtomString& eventName)
 {
-    auto event = Event::create(eventName, Event::CanBubble::No, Event::IsCancelable::No);
-    event->setTarget(this);
-
-    m_asyncEventQueue->enqueueEvent(WTFMove(event));
+    queueTaskToDispatchEvent(*this, TaskSource::MediaElement, Event::create(eventName, Event::CanBubble::No, Event::IsCancelable::No));
 }
 
 const char* SourceBufferList::activeDOMObjectName() const

Modified: trunk/Source/WebCore/Modules/mediasource/SourceBufferList.h (278537 => 278538)


--- trunk/Source/WebCore/Modules/mediasource/SourceBufferList.h	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBufferList.h	2021-06-06 19:13:07 UTC (rev 278538)
@@ -33,7 +33,6 @@
 #if ENABLE(MEDIA_SOURCE)
 
 #include "ActiveDOMObject.h"
-#include "EventLoopEventQueue.h"
 #include "EventTarget.h"
 #include <wtf/RefCounted.h>
 #include <wtf/Vector.h>
@@ -80,8 +79,6 @@
 
     const char* activeDOMObjectName() const final;
 
-    UniqueRef<EventLoopEventQueue> m_asyncEventQueue;
-
     Vector<RefPtr<SourceBuffer>> m_list;
 };
 

Modified: trunk/Source/WebCore/Modules/remoteplayback/RemotePlayback.cpp (278537 => 278538)


--- trunk/Source/WebCore/Modules/remoteplayback/RemotePlayback.cpp	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/Modules/remoteplayback/RemotePlayback.cpp	2021-06-06 19:13:07 UTC (rev 278538)
@@ -50,8 +50,6 @@
 RemotePlayback::RemotePlayback(HTMLMediaElement& element)
     : WebCore::ActiveDOMObject(element.scriptExecutionContext())
     , m_mediaElement(makeWeakPtr(element))
-    , m_eventQueue(EventLoopEventQueue::create(*this))
-    , m_taskQueue(element.scriptExecutionContext())
 {
     suspendIfNeeded();
 }
@@ -69,7 +67,10 @@
     // 1. Let promise be a new promise->
     // 2. Return promise, and run the following steps below:
     
-    m_taskQueue.enqueueTask([this, callback = WTFMove(callback), promise = WTFMove(promise)] () mutable {
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, callback = WTFMove(callback), promise = WTFMove(promise)] () mutable {
+        if (isContextStopped())
+            return;
+
         // 3. If the disableRemotePlayback attribute is present for the media element, reject the promise with
         //    InvalidStateError and abort all the remaining steps.
         if (!m_mediaElement
@@ -97,7 +98,9 @@
         // 8. Fulfill promise with the callbackId and run the following steps in parallel:
         promise->whenSettled([this, protectedThis = makeRefPtr(this), callbackId] {
             // 8.1 Queue a task to invoke the callback with the current availability for the media element.
-            m_taskQueue.enqueueTask([this, callbackId, available = m_available] {
+            queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, callbackId, available = m_available] {
+                if (isContextStopped())
+                    return;
                 auto foundCallback = m_callbackMap.find(callbackId);
                 if (foundCallback == m_callbackMap.end())
                     return;
@@ -124,7 +127,9 @@
     // 1. Let promise be a new promise->
     // 2. Return promise, and run the following steps below:
 
-    m_taskQueue.enqueueTask([this, id = WTFMove(id), promise = WTFMove(promise)] {
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, id = WTFMove(id), promise = WTFMove(promise)] {
+        if (isContextStopped())
+            return;
         // 3. If the disableRemotePlayback attribute is present for the media element, reject promise with
         //    InvalidStateError and abort all the remaining steps.
         if (!m_mediaElement
@@ -167,7 +172,10 @@
     // 1. Let promise be a new promise->
     // 2. Return promise, and run the following steps below:
 
-    m_taskQueue.enqueueTask([this, promise = WTFMove(promise), processingUserGesture = UserGestureIndicator::processingUserGesture()] () mutable {
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, promise = WTFMove(promise), processingUserGesture = UserGestureIndicator::processingUserGesture()] () mutable {
+        if (isContextStopped())
+            return;
+
         // 3. If the disableRemotePlayback attribute is present for the media element, reject the promise with
         //    InvalidStateError and abort all the remaining steps.
         if (!m_mediaElement
@@ -270,17 +278,18 @@
 
     m_state = state;
 
-    switch (m_state) {
-    case State::Connected:
-        m_eventQueue->enqueueEvent(Event::create(eventNames().connectEvent, Event::CanBubble::No, Event::IsCancelable::No));
-        break;
-    case State::Connecting:
-        m_eventQueue->enqueueEvent(Event::create(eventNames().connectingEvent, Event::CanBubble::No, Event::IsCancelable::No));
-        break;
-    case State::Disconnected:
-        m_eventQueue->enqueueEvent(Event::create(eventNames().disconnectEvent, Event::CanBubble::No, Event::IsCancelable::No));
-        break;
-    }
+    auto eventName = [](State state) {
+        switch (state) {
+        case State::Connected:
+            return eventNames().connectEvent;
+        case State::Connecting:
+            return eventNames().connectingEvent;
+        case State::Disconnected:
+            return eventNames().disconnectEvent;
+        }
+    };
+
+    queueTaskToDispatchEvent(*this, TaskSource::MediaElement, Event::create(eventName(state), Event::CanBubble::No, Event::IsCancelable::No));
 }
 
 void RemotePlayback::establishConnection()
@@ -310,7 +319,10 @@
         return;
 
     // 2. Queue a task to run the following steps:
-    m_taskQueue.enqueueTask([this] {
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this] {
+        if (isContextStopped())
+            return;
+
         // 2.1 Request disconnection of remote from the device. Implementation is user agent specific.
         // NOTE: Implemented by MediaPlayer::setWirelessPlaybackTarget()
         // 2.2 Change the remote's state to disconnected.
@@ -378,7 +390,10 @@
         return;
     m_available = available;
 
-    m_taskQueue.enqueueTask([this, available] {
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, available] {
+        if (isContextStopped())
+            return;
+
         // Protect m_callbackMap against mutation while it's being iterated over.
         Vector<Ref<RemotePlaybackAvailabilityCallback>> callbacks;
         callbacks.reserveInitialCapacity(m_callbackMap.size());
@@ -401,12 +416,6 @@
     return "RemotePlayback";
 }
 
-void RemotePlayback::stop()
-{
-    m_taskQueue.close();
-    m_eventQueue->close();
 }
 
-}
-
 #endif // ENABLE(WIRELESS_PLAYBACK_TARGET)

Modified: trunk/Source/WebCore/Modules/remoteplayback/RemotePlayback.h (278537 => 278538)


--- trunk/Source/WebCore/Modules/remoteplayback/RemotePlayback.h	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/Modules/remoteplayback/RemotePlayback.h	2021-06-06 19:13:07 UTC (rev 278538)
@@ -28,7 +28,6 @@
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
 
 #include "ActiveDOMObject.h"
-#include "EventLoopEventQueue.h"
 #include "EventTarget.h"
 #include <wtf/HashMap.h>
 #include <wtf/Ref.h>
@@ -81,7 +80,6 @@
 
     // ActiveDOMObject.
     const char* activeDOMObjectName() const final;
-    void stop() final;
 
     // EventTargetWithInlineData.
     EventTargetInterface eventTargetInterface() const final { return RemotePlaybackEventTargetInterfaceType; }
@@ -99,9 +97,6 @@
     PromiseVector m_promptPromises;
     State m_state { State::Disconnected };
     bool m_available { false };
-
-    UniqueRef<EventLoopEventQueue> m_eventQueue;
-    EventLoopTaskQueue m_taskQueue;
 };
 
 }

Modified: trunk/Source/WebCore/animation/DocumentTimelinesController.cpp (278537 => 278538)


--- trunk/Source/WebCore/animation/DocumentTimelinesController.cpp	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/animation/DocumentTimelinesController.cpp	2021-06-06 19:13:07 UTC (rev 278538)
@@ -43,7 +43,7 @@
 namespace WebCore {
 
 DocumentTimelinesController::DocumentTimelinesController(Document& document)
-    : m_currentTimeClearingTaskQueue(&document)
+    : m_currentTimeClearingTask(&document)
     , m_document(document)
 {
     if (auto* page = document.page()) {
@@ -73,7 +73,7 @@
 
 void DocumentTimelinesController::detachFromDocument()
 {
-    m_currentTimeClearingTaskQueue.close();
+    m_currentTimeClearingTask.close();
 
     while (!m_timelines.computesEmpty())
         m_timelines.begin()->detachFromDocument();
@@ -233,8 +233,8 @@
     // animations, so we schedule the invalidation task and register a whenIdle callback on the VM, which will
     // fire syncronously if no JS is running.
     m_waitingOnVMIdle = true;
-    if (!m_currentTimeClearingTaskQueue.hasPendingTasks())
-        m_currentTimeClearingTaskQueue.enqueueTask(std::bind(&DocumentTimelinesController::maybeClearCachedCurrentTime, this));
+    if (!m_currentTimeClearingTask.isPending())
+        m_currentTimeClearingTask.scheduleTask(std::bind(&DocumentTimelinesController::maybeClearCachedCurrentTime, this));
     // We extent the associated Document's lifecycle until the VM became idle since the DocumentTimelinesController
     // is owned by the Document.
     m_document.vm().whenIdle([this, protectedDocument = makeRefPtr(m_document)]() {
@@ -249,7 +249,7 @@
     // JS or waiting on all current animation updating code to have completed. This is so that
     // we're guaranteed to have a consistent current time reported for all work happening in a given
     // JS frame or throughout updating animations in WebCore.
-    if (!m_isSuspended && !m_waitingOnVMIdle && !m_currentTimeClearingTaskQueue.hasPendingTasks())
+    if (!m_isSuspended && !m_waitingOnVMIdle && !m_currentTimeClearingTask.isPending())
         m_cachedCurrentTime = std::nullopt;
 }
 

Modified: trunk/Source/WebCore/animation/DocumentTimelinesController.h (278537 => 278538)


--- trunk/Source/WebCore/animation/DocumentTimelinesController.h	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/animation/DocumentTimelinesController.h	2021-06-06 19:13:07 UTC (rev 278538)
@@ -25,7 +25,7 @@
 
 #pragma once
 
-#include "GenericTaskQueue.h"
+#include "DeferrableTask.h"
 #include "ReducedResolutionSeconds.h"
 #include "Timer.h"
 #include <wtf/Markable.h>
@@ -67,7 +67,7 @@
     void maybeClearCachedCurrentTime();
 
     WeakHashSet<DocumentTimeline> m_timelines;
-    EventLoopTaskQueue m_currentTimeClearingTaskQueue;
+    EventLoopDeferrableTask m_currentTimeClearingTask;
     Document& m_document;
     Markable<Seconds, Seconds::MarkableTraits> m_cachedCurrentTime;
     bool m_isSuspended { false };

Modified: trunk/Source/WebCore/dom/FullscreenManager.cpp (278537 => 278538)


--- trunk/Source/WebCore/dom/FullscreenManager.cpp	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/dom/FullscreenManager.cpp	2021-06-06 19:13:07 UTC (rev 278538)
@@ -48,7 +48,6 @@
 
 FullscreenManager::FullscreenManager(Document& document)
     : m_document { document }
-    , m_fullscreenTaskQueue { &document }
 #if !RELEASE_LOG_DISABLED
     , m_logIdentifier(LoggerHelper::uniqueLogIdentifier())
 #endif
@@ -62,10 +61,11 @@
     if (!element)
         element = documentElement();
 
-    auto failedPreflights = [this](auto element) mutable {
+    auto failedPreflights = [this, weakThis = makeWeakPtr(*this)](auto element) mutable {
         m_fullscreenErrorEventTargetQueue.append(WTFMove(element));
-        m_fullscreenTaskQueue.enqueueTask([this] {
-            dispatchFullscreenChangeEvents();
+        m_document.eventLoop().queueTask(TaskSource::MediaElement, [weakThis = WTFMove(weakThis)]() mutable {
+            if (weakThis)
+                weakThis->dispatchFullscreenChangeEvents();
         });
     };
 
@@ -114,7 +114,10 @@
 
     m_pendingFullscreenElement = element;
 
-    m_fullscreenTaskQueue.enqueueTask([this, element = makeRefPtr(element), checkType, hasKeyboardAccess, failedPreflights, identifier = LOGIDENTIFIER] () mutable {
+    m_document.eventLoop().queueTask(TaskSource::MediaElement, [this, weakThis = makeWeakPtr(*this), element = makeRefPtr(element), checkType, hasKeyboardAccess, failedPreflights, identifier = LOGIDENTIFIER] () mutable {
+        if (!weakThis)
+            return;
+
         // Don't allow fullscreen if it has been cancelled or a different fullscreen element
         // has requested fullscreen.
         if (m_pendingFullscreenElement != element) {
@@ -223,7 +226,10 @@
         // 5. Return, and run the remaining steps asynchronously.
         // 6. Optionally, perform some animation.
         m_areKeysEnabledInFullscreen = hasKeyboardAccess;
-        m_fullscreenTaskQueue.enqueueTask([this, element = WTFMove(element), failedPreflights = WTFMove(failedPreflights), identifier] () mutable {
+        m_document.eventLoop().queueTask(TaskSource::MediaElement, [this, weakThis = WTFMove(weakThis), element = WTFMove(element), failedPreflights = WTFMove(failedPreflights), identifier] () mutable {
+            if (!weakThis)
+                return;
+
             auto page = this->page();
             if (!page || document().hidden() || m_pendingFullscreenElement != element || !element->isConnected()) {
                 ERROR_LOG(identifier, "task - page, document, or element mismatch; failing.");
@@ -327,7 +333,10 @@
 
     // 6. Return, and run the remaining steps asynchronously.
     // 7. Optionally, perform some animation.
-    m_fullscreenTaskQueue.enqueueTask([this, newTop = makeRefPtr(newTop), fullscreenElement = m_fullscreenElement, identifier = LOGIDENTIFIER] {
+    m_document.eventLoop().queueTask(TaskSource::MediaElement, [this, weakThis = makeWeakPtr(*this), newTop = makeRefPtr(newTop), fullscreenElement = m_fullscreenElement, identifier = LOGIDENTIFIER] {
+        if (!weakThis)
+            return;
+
         auto* page = this->page();
         if (!page) {
             ERROR_LOG(identifier, "task - Document not in page; bailing.");

Modified: trunk/Source/WebCore/dom/FullscreenManager.h (278537 => 278538)


--- trunk/Source/WebCore/dom/FullscreenManager.h	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/dom/FullscreenManager.h	2021-06-06 19:13:07 UTC (rev 278538)
@@ -28,9 +28,9 @@
 #if ENABLE(FULLSCREEN_API)
 
 #include "Document.h"
-#include "GenericTaskQueue.h"
 #include "LayoutRect.h"
 #include <wtf/Deque.h>
+#include <wtf/WeakPtr.h>
 
 namespace WebCore {
 
@@ -38,7 +38,7 @@
 class RenderTreeBuilder;
 class RenderStyle;
 
-class FullscreenManager final {
+class FullscreenManager final : public CanMakeWeakPtr<FullscreenManager> {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     FullscreenManager(Document&);
@@ -119,7 +119,6 @@
     RefPtr<Element> m_fullscreenElement;
     Vector<RefPtr<Element>> m_fullscreenElementStack;
     WeakPtr<RenderFullScreen> m_fullscreenRenderer { nullptr };
-    EventLoopTaskQueue m_fullscreenTaskQueue;
     Deque<RefPtr<Node>> m_fullscreenChangeEventTargetQueue;
     Deque<RefPtr<Node>> m_fullscreenErrorEventTargetQueue;
     LayoutRect m_savedPlaceholderFrameRect;

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (278537 => 278538)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2021-06-06 19:13:07 UTC (rev 278538)
@@ -403,12 +403,7 @@
     , m_seekTask(&document)
     , m_playbackControlsManagerBehaviorRestrictionsTask(&document)
     , m_bufferedTimeRangesChangedTask(&document)
-    , m_promiseTaskQueue(&document)
-    , m_pauseAfterDetachedTaskQueue(&document)
     , m_resourceSelectionTaskQueue(&document)
-    , m_visibilityChangeTaskQueue(&document)
-    , m_fullscreenTaskQueue(&document)
-    , m_playbackTargetIsWirelessQueue(&document)
     , m_asyncEventQueue(EventLoopEventQueue::create(*this))
 #if PLATFORM(IOS_FAMILY)
     , m_volumeRevertTask(&document)
@@ -451,9 +446,6 @@
     , m_processingPreferenceChange(false)
     , m_shouldAudioPlaybackRequireUserGesture(document.topDocument().audioPlaybackRequiresUserGesture() && !processingUserGestureForMedia())
     , m_shouldVideoPlaybackRequireUserGesture(document.topDocument().videoPlaybackRequiresUserGesture() && !processingUserGestureForMedia())
-#if ENABLE(ENCRYPTED_MEDIA)
-    , m_encryptedMediaQueue(&document)
-#endif
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
     , m_remote(RemotePlayback::create(*this))
 #endif
@@ -589,14 +581,8 @@
 
     m_seekTask.close();
     m_resumeTask.close();
-    m_promiseTaskQueue.close();
-    m_pauseAfterDetachedTaskQueue.close();
     m_playbackControlsManagerBehaviorRestrictionsTask.close();
     m_resourceSelectionTaskQueue.close();
-    m_visibilityChangeTaskQueue.close();
-#if ENABLE(ENCRYPTED_MEDIA)
-    m_encryptedMediaQueue.close();
-#endif
 
     m_completelyLoaded = true;
 
@@ -864,7 +850,10 @@
     setInActiveDocument(false);
     if (removalType.disconnectedFromDocument) {
         // Pause asynchronously to let the operation that removed us finish, in case we get inserted back into a document.
-        m_pauseAfterDetachedTaskQueue.enqueueTask(std::bind(&HTMLMediaElement::pauseAfterDetachedTask, this));
+        queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this] {
+            if (!isContextStopped())
+                pauseAfterDetachedTask();
+        });
     }
 
     if (m_mediaSession)
@@ -948,8 +937,9 @@
     if (m_pendingPlayPromises.isEmpty())
         return;
 
-    m_promiseTaskQueue.enqueueTask([this, pendingPlayPromises = WTFMove(m_pendingPlayPromises)] () mutable {
-        resolvePendingPlayPromises(WTFMove(pendingPlayPromises));
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, pendingPlayPromises = WTFMove(m_pendingPlayPromises)] () mutable {
+        if (!isContextStopped())
+            resolvePendingPlayPromises(WTFMove(pendingPlayPromises));
     });
 }
 
@@ -958,8 +948,9 @@
     if (m_pendingPlayPromises.isEmpty())
         return;
 
-    m_promiseTaskQueue.enqueueTask([this, error = WTFMove(error), pendingPlayPromises = WTFMove(m_pendingPlayPromises)] () mutable {
-        rejectPendingPlayPromises(WTFMove(pendingPlayPromises), WTFMove(error));
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, error = WTFMove(error), pendingPlayPromises = WTFMove(m_pendingPlayPromises)] () mutable {
+        if (!isContextStopped())
+            rejectPendingPlayPromises(WTFMove(pendingPlayPromises), WTFMove(error));
     });
 }
 
@@ -977,8 +968,9 @@
 
 void HTMLMediaElement::scheduleNotifyAboutPlaying()
 {
-    m_promiseTaskQueue.enqueueTask([this, pendingPlayPromises = WTFMove(m_pendingPlayPromises)] () mutable {
-        notifyAboutPlaying(WTFMove(pendingPlayPromises));
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, pendingPlayPromises = WTFMove(m_pendingPlayPromises)] () mutable {
+        if (!isContextStopped())
+            notifyAboutPlaying(WTFMove(pendingPlayPromises));
     });
 }
 
@@ -2606,7 +2598,10 @@
 
     // 4. Let promise be a new promise.
     // 5. Run the following steps in parallel:
-    m_encryptedMediaQueue.enqueueTask([this, mediaKeys = RefPtr<MediaKeys>(mediaKeys), promise = WTFMove(promise)]() mutable {
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, mediaKeys = RefPtr<MediaKeys>(mediaKeys), promise = WTFMove(promise)]() mutable {
+        if (isContextStopped())
+            return;
+
         // 5.1. If all the following conditions hold:
         //      - mediaKeys is not null,
         //      - the CDM instance represented by mediaKeys is already in use by another media element
@@ -2641,8 +2636,9 @@
             // FIXME: ^
 
             // 5.3.3. Queue a task to run the Attempt to Resume Playback If Necessary algorithm on the media element.
-            m_encryptedMediaQueue.enqueueTask([this] {
-                attemptToResumePlaybackIfNecessary();
+            queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this] {
+                if (!isContextStopped())
+                    attemptToResumePlaybackIfNecessary();
             });
         }
 
@@ -5651,13 +5647,7 @@
     m_playbackControlsManagerBehaviorRestrictionsTask.close();
     m_seekTask.close();
     m_resumeTask.close();
-    m_promiseTaskQueue.close();
-    m_pauseAfterDetachedTaskQueue.close();
     m_resourceSelectionTaskQueue.close();
-    m_visibilityChangeTaskQueue.close();
-#if ENABLE(ENCRYPTED_MEDIA)
-    m_encryptedMediaQueue.close();
-#endif
     m_asyncEventQueue->close();
 #if PLATFORM(IOS_FAMILY)
     m_volumeRevertTask.close();
@@ -5750,7 +5740,6 @@
 {
     return m_creatingControls
         || m_asyncEventQueue->hasPendingActivity()
-        || m_playbackTargetIsWirelessQueue.hasPendingTasks()
         || m_resourceSelectionTaskQueue.hasPendingTasks()
         || (hasAudio() && isPlaying())
         || (hasLiveSource() && hasEventListeners());
@@ -5838,7 +5827,10 @@
 void HTMLMediaElement::setIsPlayingToWirelessTarget(bool isPlayingToWirelessTarget)
 {
     auto logSiteIdentifier = LOGIDENTIFIER;
-    m_playbackTargetIsWirelessQueue.enqueueTask([this, isPlayingToWirelessTarget, logSiteIdentifier] {
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, isPlayingToWirelessTarget, logSiteIdentifier] {
+        if (isContextStopped())
+            return;
+
         UNUSED_PARAM(logSiteIdentifier);
 
         if (isPlayingToWirelessTarget == m_isPlayingToWirelessTarget)
@@ -6055,7 +6047,10 @@
     }
 #endif
 
-    m_fullscreenTaskQueue.enqueueTask([this, mode] {
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this, mode] {
+        if (isContextStopped())
+            return;
+
         if (document().hidden()) {
             ALWAYS_LOG(LOGIDENTIFIER, " returning because document is hidden");
             m_changingVideoFullscreenMode = false;
@@ -8002,7 +7997,9 @@
 
 void HTMLMediaElement::isVisibleInViewportChanged()
 {
-    m_visibilityChangeTaskQueue.enqueueTask([this] {
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this] {
+        if (isContextStopped())
+            return;
         mediaSession().isVisibleInViewportChanged();
         updateShouldAutoplay();
         schedulePlaybackControlsManagerUpdate();

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (278537 => 278538)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2021-06-06 19:13:07 UTC (rev 278538)
@@ -950,12 +950,7 @@
     EventLoopDeferrableTask m_seekTask;
     EventLoopDeferrableTask m_playbackControlsManagerBehaviorRestrictionsTask;
     EventLoopDeferrableTask m_bufferedTimeRangesChangedTask;
-    EventLoopTaskQueue m_promiseTaskQueue;
-    EventLoopTaskQueue m_pauseAfterDetachedTaskQueue;
     EventLoopTaskQueue m_resourceSelectionTaskQueue;
-    EventLoopTaskQueue m_visibilityChangeTaskQueue;
-    EventLoopTaskQueue m_fullscreenTaskQueue;
-    EventLoopTaskQueue m_playbackTargetIsWirelessQueue;
     RefPtr<TimeRanges> m_playedTimeRanges;
     UniqueRef<EventLoopEventQueue> m_asyncEventQueue;
 #if PLATFORM(IOS_FAMILY)
@@ -1159,7 +1154,6 @@
     RefPtr<MediaKeys> m_mediaKeys;
     bool m_attachingMediaKeys { false };
     bool m_playbackBlockedWaitingForKey { false };
-    EventLoopTaskQueue m_encryptedMediaQueue;
 #endif
 
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)

Modified: trunk/Source/WebCore/html/shadow/MediaControlTextTrackContainerElement.cpp (278537 => 278538)


--- trunk/Source/WebCore/html/shadow/MediaControlTextTrackContainerElement.cpp	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/html/shadow/MediaControlTextTrackContainerElement.cpp	2021-06-06 19:13:07 UTC (rev 278538)
@@ -75,7 +75,6 @@
 
 MediaControlTextTrackContainerElement::MediaControlTextTrackContainerElement(Document& document, HTMLMediaElement& element)
     : HTMLDivElement(divTag, document)
-    , m_taskQueue(&document)
     , m_mediaElement(makeWeakPtr(&element))
 {
 }
@@ -387,8 +386,9 @@
     for (auto& activeCue : m_mediaElement->currentlyActiveCues())
         activeCue.data()->recalculateStyles();
 
-    m_taskQueue.enqueueTask([this] () {
-        updateDisplay();
+    document().eventLoop().queueTask(TaskSource::MediaElement, [weakThis = makeWeakPtr(*this)] () {
+        if (weakThis)
+            weakThis->updateDisplay();
     });
 }
 

Modified: trunk/Source/WebCore/html/shadow/MediaControlTextTrackContainerElement.h (278537 => 278538)


--- trunk/Source/WebCore/html/shadow/MediaControlTextTrackContainerElement.h	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/html/shadow/MediaControlTextTrackContainerElement.h	2021-06-06 19:13:07 UTC (rev 278538)
@@ -31,7 +31,6 @@
 
 #if ENABLE(VIDEO)
 
-#include "GenericTaskQueue.h"
 #include "HTMLDivElement.h"
 #include "MediaControllerInterface.h"
 #include "TextTrackRepresentation.h"
@@ -97,7 +96,6 @@
 
     std::unique_ptr<TextTrackRepresentation> m_textTrackRepresentation;
 
-    EventLoopTaskQueue m_taskQueue;
     WeakPtr<HTMLMediaElement> m_mediaElement;
     IntRect m_videoDisplaySize;
     int m_fontSize { 0 };

Modified: trunk/Source/WebCore/html/track/TrackListBase.cpp (278537 => 278538)


--- trunk/Source/WebCore/html/track/TrackListBase.cpp	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/html/track/TrackListBase.cpp	2021-06-06 19:13:07 UTC (rev 278538)
@@ -42,7 +42,6 @@
 TrackListBase::TrackListBase(WeakPtr<HTMLMediaElement> element, ScriptExecutionContext* context)
     : ActiveDOMObject(context)
     , m_element(element)
-    , m_asyncEventQueue(EventLoopEventQueue::create(*this))
 {
     ASSERT(!context || is<Document>(context));
 }
@@ -97,7 +96,7 @@
 
 void TrackListBase::scheduleTrackEvent(const AtomString& eventName, Ref<TrackBase>&& track)
 {
-    m_asyncEventQueue->enqueueEvent(TrackEvent::create(eventName, Event::CanBubble::No, Event::IsCancelable::No, WTFMove(track)));
+    queueTaskToDispatchEvent(*this, TaskSource::MediaElement, TrackEvent::create(eventName, Event::CanBubble::No, Event::IsCancelable::No, WTFMove(track)));
 }
 
 void TrackListBase::scheduleAddTrackEvent(Ref<TrackBase>&& track)
@@ -160,14 +159,13 @@
     // Whenever a track in a VideoTrackList that was previously not selected is
     // selected, the user agent must queue a task to fire a simple event named
     // change at the VideoTrackList object.
-    m_asyncEventQueue->enqueueEvent(Event::create(eventNames().changeEvent, Event::CanBubble::No, Event::IsCancelable::No));
+    m_isChangeEventScheduled = true;
+    queueTaskKeepingObjectAlive(*this, TaskSource::MediaElement, [this] {
+        m_isChangeEventScheduled = false;
+        dispatchEvent(Event::create(eventNames().changeEvent, Event::CanBubble::No, Event::IsCancelable::No));
+    });
 }
 
-bool TrackListBase::isChangeEventScheduled() const
-{
-    return m_asyncEventQueue->hasPendingEventsOfType(eventNames().changeEvent);
-}
-
 bool TrackListBase::isAnyTrackEnabled() const
 {
     for (auto& track : m_inbandTracks) {
@@ -177,11 +175,6 @@
     return false;
 }
 
-bool TrackListBase::virtualHasPendingActivity() const
-{
-    return m_asyncEventQueue->hasPendingActivity();
-}
-
 } // namespace WebCore
 
 #endif

Modified: trunk/Source/WebCore/html/track/TrackListBase.h (278537 => 278538)


--- trunk/Source/WebCore/html/track/TrackListBase.h	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/html/track/TrackListBase.h	2021-06-06 19:13:07 UTC (rev 278538)
@@ -28,7 +28,6 @@
 #if ENABLE(VIDEO)
 
 #include "ActiveDOMObject.h"
-#include "EventLoopEventQueue.h"
 #include "EventTarget.h"
 #include <wtf/RefCounted.h>
 #include <wtf/Vector.h>
@@ -61,7 +60,7 @@
 
     // Needs to be public so tracks can call it
     void scheduleChangeEvent();
-    bool isChangeEventScheduled() const;
+    bool isChangeEventScheduled() const { return m_isChangeEventScheduled; }
 
     bool isAnyTrackEnabled() const;
 
@@ -76,16 +75,12 @@
 private:
     void scheduleTrackEvent(const AtomString& eventName, Ref<TrackBase>&&);
 
-    // ActiveDOMObject.
-    bool virtualHasPendingActivity() const override;
-
     // EventTarget
     void refEventTarget() final { ref(); }
     void derefEventTarget() final { deref(); }
 
     WeakPtr<HTMLMediaElement> m_element;
-
-    UniqueRef<EventLoopEventQueue> m_asyncEventQueue;
+    bool m_isChangeEventScheduled { false };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/testing/MockMediaSessionCoordinator.h (278537 => 278538)


--- trunk/Source/WebCore/testing/MockMediaSessionCoordinator.h	2021-06-06 15:15:40 UTC (rev 278537)
+++ trunk/Source/WebCore/testing/MockMediaSessionCoordinator.h	2021-06-06 19:13:07 UTC (rev 278538)
@@ -27,7 +27,6 @@
 
 #if ENABLE(MEDIA_SESSION_COORDINATOR)
 
-#include "EventLoopEventQueue.h"
 #include "MediaSessionCoordinatorPrivate.h"
 #include <wtf/RefCounted.h>
 #include <wtf/WeakPtr.h>
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to