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>