Diff
Modified: trunk/Source/WebCore/ChangeLog (278644 => 278645)
--- trunk/Source/WebCore/ChangeLog 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/ChangeLog 2021-06-09 04:33:05 UTC (rev 278645)
@@ -1,3 +1,62 @@
+2021-06-08 Chris Dumez <cdu...@apple.com>
+
+ Drop legacy EventLoopEventQueue class
+ https://bugs.webkit.org/show_bug.cgi?id=226748
+
+ Reviewed by Darin Adler.
+
+ Drop legacy EventLoopEventQueue class which was used by HTMLMediaElement. I added a
+ queueCancellableTaskToDispatchEvent() convenience function on ActiveDOMObject to
+ schedule cancellable events directly on the HTML event loop. The function takes
+ care of keeping the object and its wrapper alive until the event has fired.
+
+ Note that the previous code was using EventLoopEventQueue to dispatch events on
+ other objects than the HTMLMediaElement. This was wrong as it wouldn't take
+ care of keeping the real target's JS wrapper alive to actually dispatch the
+ event. As a result, I had to update a couple of media classes to subclass
+ ActiveDOMObject and the HTMLMediaElement now calls
+ queueCancellableTaskToDispatchEvent() directly on the target.
+
+ * Headers.cmake:
+ * Sources.txt:
+ * WebCore.xcodeproj/project.pbxproj:
+ * dom/ActiveDOMObject.cpp:
+ (WebCore::ActiveDOMObjectEventDispatchTask::ActiveDOMObjectEventDispatchTask):
+ (WebCore::ActiveDOMObject::queueTaskToDispatchEventInternal):
+ (WebCore::ActiveDOMObject::queueCancellableTaskToDispatchEventInternal):
+ * dom/ActiveDOMObject.h:
+ * dom/EventLoopEventQueue.cpp: Removed.
+ * dom/EventLoopEventQueue.h: Removed.
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::HTMLMediaElement):
+ (WebCore::HTMLMediaElement::~HTMLMediaElement):
+ (WebCore::HTMLMediaElement::scheduleEvent):
+ (WebCore::HTMLMediaElement::updateActiveTextTrackCues):
+ (WebCore::HTMLMediaElement::cancelPendingEventsAndCallbacks):
+ (WebCore::HTMLMediaElement::mediaPlayerKeyNeeded):
+ (WebCore::HTMLMediaElement::mediaPlayerInitializationDataEncountered):
+ (WebCore::HTMLMediaElement::closeTaskQueues):
+ (WebCore::HTMLMediaElement::virtualHasPendingActivity const):
+ (WebCore::HTMLMediaElement::enqueuePlaybackTargetAvailabilityChangedEvent):
+ (WebCore::HTMLMediaElement::scheduleEventOn):
+ * html/HTMLMediaElement.h:
+ * html/track/InbandTextTrack.cpp:
+ (WebCore::InbandTextTrack::create):
+ * html/track/LoadableTextTrack.cpp:
+ (WebCore::LoadableTextTrack::create):
+ * html/track/TextTrack.cpp:
+ (WebCore::TextTrack::TextTrack):
+ (WebCore::TextTrack::create):
+ (WebCore::TextTrack::activeDOMObjectName const):
+ * html/track/TextTrack.h:
+ * html/track/TextTrack.idl:
+ * html/track/TextTrackCue.cpp:
+ (WebCore::TextTrackCue::create):
+ (WebCore::TextTrackCue::TextTrackCue):
+ (WebCore::TextTrackCue::activeDOMObjectName const):
+ * html/track/TextTrackCue.h:
+ * html/track/TextTrackCue.idl:
+
2021-06-08 Devin Rousso <drou...@apple.com>
Unreviewed, followup to r278630
Modified: trunk/Source/WebCore/Headers.cmake (278644 => 278645)
--- trunk/Source/WebCore/Headers.cmake 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/Headers.cmake 2021-06-09 04:33:05 UTC (rev 278645)
@@ -462,7 +462,6 @@
dom/EventListenerMap.h
dom/EventListenerOptions.h
dom/EventLoop.h
- dom/EventLoopEventQueue.h
dom/EventModifierInit.h
dom/EventNames.h
dom/EventQueue.h
Modified: trunk/Source/WebCore/Sources.txt (278644 => 278645)
--- trunk/Source/WebCore/Sources.txt 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/Sources.txt 2021-06-09 04:33:05 UTC (rev 278645)
@@ -949,7 +949,6 @@
dom/EventDispatcher.cpp
dom/EventListenerMap.cpp
dom/EventLoop.cpp
-dom/EventLoopEventQueue.cpp
dom/EventNames.cpp
dom/EventPath.cpp
dom/EventTarget.cpp
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (278644 => 278645)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2021-06-09 04:33:05 UTC (rev 278645)
@@ -102,7 +102,6 @@
071A9EC3168FBC55002629F9 /* TextTrackCueGeneric.h in Headers */ = {isa = PBXBuildFile; fileRef = 071A9EC1168FB56C002629F9 /* TextTrackCueGeneric.h */; settings = {ATTRIBUTES = (Private, ); }; };
071E496E1AD5AA0D008A50B4 /* MediaPlaybackTargetCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 071E496D1AD5AA0D008A50B4 /* MediaPlaybackTargetCocoa.mm */; };
071E49701AD5AB5E008A50B4 /* MediaPlaybackTargetCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 071E496F1AD5AB5E008A50B4 /* MediaPlaybackTargetCocoa.h */; settings = {ATTRIBUTES = (Private, ); }; };
- 0720B0A114D3323500642955 /* EventLoopEventQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 0720B09F14D3323500642955 /* EventLoopEventQueue.h */; settings = {ATTRIBUTES = (Private, ); }; };
0725EFA9239AD79300A538A9 /* MediaPlayerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 079F5E4B0F3BEBEA005E0782 /* MediaPlayerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
07277E4D17D018CC0015534D /* JSMediaStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 07277E4117D018CC0015534D /* JSMediaStream.h */; };
07277E4D17D018CC0015534E /* JSCanvasCaptureMediaStreamTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 07277E4117D018CC0015534E /* JSCanvasCaptureMediaStreamTrack.h */; };
@@ -5789,8 +5788,6 @@
071A9EC1168FB56C002629F9 /* TextTrackCueGeneric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTrackCueGeneric.h; sourceTree = "<group>"; };
071E496D1AD5AA0D008A50B4 /* MediaPlaybackTargetCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MediaPlaybackTargetCocoa.mm; sourceTree = "<group>"; };
071E496F1AD5AB5E008A50B4 /* MediaPlaybackTargetCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaPlaybackTargetCocoa.h; sourceTree = "<group>"; };
- 0720B09E14D3323500642955 /* EventLoopEventQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventLoopEventQueue.cpp; sourceTree = "<group>"; };
- 0720B09F14D3323500642955 /* EventLoopEventQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventLoopEventQueue.h; sourceTree = "<group>"; };
07221B4C17CEC32700848E51 /* MediaStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaStream.cpp; sourceTree = "<group>"; };
07221B4D17CEC32700848E51 /* MediaStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStream.h; sourceTree = "<group>"; };
07221B4E17CEC32700848E51 /* MediaStream.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = MediaStream.idl; sourceTree = "<group>"; };
@@ -30708,8 +30705,6 @@
46BD05C025BB6E4D00225F30 /* EventListenerOptions.idl */,
9B91DCCC2383792D000EEE0F /* EventLoop.cpp */,
9B0ABCA123679AB300B45085 /* EventLoop.h */,
- 0720B09E14D3323500642955 /* EventLoopEventQueue.cpp */,
- 0720B09F14D3323500642955 /* EventLoopEventQueue.h */,
83FE7CA31DA9F1650037237C /* EventModifierInit.h */,
83FE7CA61DA9F1660037237C /* EventModifierInit.idl */,
939885C108B7E3D100E707C4 /* EventNames.cpp */,
@@ -32636,7 +32631,6 @@
AD4495F4141FC08900541EDF /* EventListenerMap.h in Headers */,
46BD05C625BB6E6C00225F30 /* EventListenerOptions.h in Headers */,
46F02A1A23737F8300106A64 /* EventLoop.h in Headers */,
- 0720B0A114D3323500642955 /* EventLoopEventQueue.h in Headers */,
83FE7CA81DA9F1B60037237C /* EventModifierInit.h in Headers */,
939885C408B7E3D100E707C4 /* EventNames.h in Headers */,
9B714E211C91166900AC0E92 /* EventPath.h in Headers */,
Modified: trunk/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp (278644 => 278645)
--- trunk/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -43,11 +43,9 @@
JSTextTrackCue* jsTextTrackCue = jsCast<JSTextTrackCue*>(handle.slot()->asCell());
TextTrackCue& textTrackCue = jsTextTrackCue->wrapped();
- // If the cue is firing event listeners, its wrapper is reachable because
- // the wrapper is responsible for marking those event listeners.
- if (textTrackCue.isFiringEventListeners()) {
+ if (!textTrackCue.isContextStopped() && textTrackCue.hasPendingActivity()) {
if (UNLIKELY(reason))
- *reason = "TextTrackCue is firing event listeners";
+ *reason = "TextTrackCue with pending activity";
return true;
}
Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (278644 => 278645)
--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm 2021-06-09 04:33:05 UTC (rev 278645)
@@ -4661,7 +4661,7 @@
AddToImplIncludes("ActiveDOMObject.h");
if ($codeGenerator->InheritsExtendedAttribute($interface, "ActiveDOMObject")) {
push(@implContent, " static_assert(std::is_base_of<ActiveDOMObject, ${implType}>::value, \"Interface is marked as [ActiveDOMObject] but implementation class does not subclass ActiveDOMObject.\");\n\n");
- } else {
+ } elsif (!$codeGenerator->InheritsExtendedAttribute($interface, "CustomIsReachable")) {
push(@implContent, " static_assert(!std::is_base_of<ActiveDOMObject, ${implType}>::value, \"Interface is not marked as [ActiveDOMObject] even though implementation class subclasses ActiveDOMObject.\");\n\n");
}
}
Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestDOMJIT.cpp (278644 => 278645)
--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestDOMJIT.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestDOMJIT.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -586,8 +586,6 @@
Base::finishCreation(vm);
ASSERT(inherits(vm, info()));
- static_assert(!std::is_base_of<ActiveDOMObject, TestDOMJIT>::value, "Interface is not marked as [ActiveDOMObject] even though implementation class subclasses ActiveDOMObject.");
-
}
JSObject* JSTestDOMJIT::createPrototype(VM& vm, JSDOMGlobalObject& globalObject)
Modified: trunk/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp (278644 => 278645)
--- trunk/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -241,8 +241,6 @@
Base::finishCreation(vm);
ASSERT(inherits(vm, info()));
- static_assert(!std::is_base_of<ActiveDOMObject, TestNode>::value, "Interface is not marked as [ActiveDOMObject] even though implementation class subclasses ActiveDOMObject.");
-
}
JSObject* JSTestNode::createPrototype(VM& vm, JSDOMGlobalObject& globalObject)
Modified: trunk/Source/WebCore/dom/ActiveDOMObject.cpp (278644 => 278645)
--- trunk/Source/WebCore/dom/ActiveDOMObject.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/dom/ActiveDOMObject.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -138,11 +138,10 @@
class ActiveDOMObjectEventDispatchTask : public EventLoopTask {
public:
- ActiveDOMObjectEventDispatchTask(TaskSource source, EventLoopTaskGroup& group, ActiveDOMObject& object, EventTarget& target, Ref<Event>&& event)
+ ActiveDOMObjectEventDispatchTask(TaskSource source, EventLoopTaskGroup& group, ActiveDOMObject& object, Function<void()>&& dispatchEvent)
: EventLoopTask(source, group)
, m_object(object)
- , m_target(target)
- , m_event(WTFMove(event))
+ , m_dispatchEvent(WTFMove(dispatchEvent))
{
++m_object.m_pendingActivityInstanceCount;
}
@@ -158,13 +157,12 @@
// If this task executes after the script execution context has been stopped, don't
// actually dispatch the event.
if (m_object.isAllowedToRunScript())
- m_target->dispatchEvent(m_event.get());
+ m_dispatchEvent();
}
private:
ActiveDOMObject& m_object;
- Ref<EventTarget> m_target;
- Ref<Event> m_event;
+ Function<void()> m_dispatchEvent;
};
void ActiveDOMObject::queueTaskToDispatchEventInternal(EventTarget& target, TaskSource source, Ref<Event>&& event)
@@ -174,8 +172,23 @@
if (!context)
return;
auto& eventLoopTaskGroup = context->eventLoop();
- auto task = makeUnique<ActiveDOMObjectEventDispatchTask>(source, eventLoopTaskGroup, *this, target, WTFMove(event));
+ auto task = makeUnique<ActiveDOMObjectEventDispatchTask>(source, eventLoopTaskGroup, *this, [target = makeRef(target), event = WTFMove(event)] {
+ target->dispatchEvent(event);
+ });
eventLoopTaskGroup.queueTask(WTFMove(task));
}
+void ActiveDOMObject::queueCancellableTaskToDispatchEventInternal(EventTarget& target, TaskSource source, TaskCancellationGroup& cancellationGroup, Ref<Event>&& event)
+{
+ ASSERT(!event->target() || &target == event->target());
+ auto* context = scriptExecutionContext();
+ if (!context)
+ return;
+ auto& eventLoopTaskGroup = context->eventLoop();
+ auto task = makeUnique<ActiveDOMObjectEventDispatchTask>(source, eventLoopTaskGroup, *this, CancellableTask(cancellationGroup, [target = makeRef(target), event = WTFMove(event)] {
+ target->dispatchEvent(event);
+ }));
+ eventLoopTaskGroup.queueTask(WTFMove(task));
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/dom/ActiveDOMObject.h (278644 => 278645)
--- trunk/Source/WebCore/dom/ActiveDOMObject.h 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/dom/ActiveDOMObject.h 2021-06-09 04:33:05 UTC (rev 278645)
@@ -120,12 +120,18 @@
});
}
- template<typename EventTargetType, typename EventType>
- static void queueTaskToDispatchEvent(EventTargetType& target, TaskSource source, Ref<EventType>&& event)
+ template<typename EventTargetType>
+ static void queueTaskToDispatchEvent(EventTargetType& target, TaskSource source, Ref<Event>&& event)
{
target.queueTaskToDispatchEventInternal(target, source, WTFMove(event));
}
+ template<typename EventTargetType>
+ static void queueCancellableTaskToDispatchEvent(EventTargetType& target, TaskSource source, TaskCancellationGroup& cancellationGroup, Ref<Event>&& event)
+ {
+ target.queueCancellableTaskToDispatchEventInternal(target, source, cancellationGroup, WTFMove(event));
+ }
+
protected:
explicit ActiveDOMObject(ScriptExecutionContext*);
explicit ActiveDOMObject(Document*);
@@ -142,6 +148,7 @@
void queueTaskInEventLoop(TaskSource, Function<void ()>&&);
void queueTaskToDispatchEventInternal(EventTarget&, TaskSource, Ref<Event>&&);
+ void queueCancellableTaskToDispatchEventInternal(EventTarget&, TaskSource, TaskCancellationGroup&, Ref<Event>&&);
uint64_t m_pendingActivityInstanceCount { 0 };
#if ASSERT_ENABLED
Deleted: trunk/Source/WebCore/dom/EventLoopEventQueue.cpp (278644 => 278645)
--- trunk/Source/WebCore/dom/EventLoopEventQueue.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/dom/EventLoopEventQueue.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2012 Victor Carbune (vic...@rosedu.org)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "EventLoopEventQueue.h"
-
-#include "Document.h"
-#include "Event.h"
-#include "EventLoop.h"
-#include "EventTarget.h"
-#include "Node.h"
-#include "ScriptExecutionContext.h"
-#include "Timer.h"
-#include <wtf/Algorithms.h>
-#include <wtf/MainThread.h>
-#include <wtf/SetForScope.h>
-
-namespace WebCore {
-
-EventLoopEventQueue::EventLoopEventQueue(EventTarget& owner)
- : ActiveDOMObject(owner.scriptExecutionContext())
- , m_owner(owner)
-{
-}
-
-void EventLoopEventQueue::enqueueEvent(RefPtr<Event>&& event)
-{
- if (m_isClosed || !scriptExecutionContext())
- return;
-
- if (event->target() == &m_owner)
- event->setTarget(nullptr);
-
- m_pendingEvents.append(WTFMove(event));
-
- scriptExecutionContext()->eventLoop().queueTask(TaskSource::MediaElement, [weakThis = makeWeakPtr(*this)] {
- if (weakThis)
- weakThis->dispatchOneEvent();
- });
-}
-
-void EventLoopEventQueue::dispatchOneEvent()
-{
- ASSERT(!m_pendingEvents.isEmpty());
-
- Ref<EventTarget> protectedOwner(m_owner);
- SetForScope<bool> eventFiringScope(m_isFiringEvent, true);
-
- RefPtr<Event> event = m_pendingEvents.takeFirst();
- Ref<EventTarget> target = event->target() ? *event->target() : m_owner;
- ASSERT_WITH_MESSAGE(!target->scriptExecutionContext()->activeDOMObjectsAreStopped(),
- "An attempt to dispatch an event on a stopped target by EventTargetInterface=%d (nodeName=%s target=%p owner=%p)",
- m_owner.eventTargetInterface(), m_owner.isNode() ? static_cast<Node&>(m_owner).nodeName().ascii().data() : "", target.ptr(), &m_owner);
- target->dispatchEvent(*event);
-}
-
-void EventLoopEventQueue::close()
-{
- m_isClosed = true;
- cancelAllEvents();
-}
-
-void EventLoopEventQueue::cancelAllEvents()
-{
- weakPtrFactory().revokeAll();
- m_pendingEvents.clear();
-}
-
-bool EventLoopEventQueue::hasPendingActivity() const
-{
- return !m_pendingEvents.isEmpty() || m_isFiringEvent;
-}
-
-bool EventLoopEventQueue::hasPendingEventsOfType(const AtomString& type) const
-{
- return WTF::anyOf(m_pendingEvents, [&](auto& event) { return event->type() == type; });
-}
-
-void EventLoopEventQueue::stop()
-{
- close();
-}
-
-const char* EventLoopEventQueue::activeDOMObjectName() const
-{
- return "EventLoopEventQueue";
-}
-
-UniqueRef<EventLoopEventQueue> EventLoopEventQueue::create(EventTarget& eventTarget)
-{
- auto eventQueue = makeUniqueRef<EventLoopEventQueue>(eventTarget);
- eventQueue->suspendIfNeeded();
- return eventQueue;
-}
-
-}
Deleted: trunk/Source/WebCore/dom/EventLoopEventQueue.h (278644 => 278645)
--- trunk/Source/WebCore/dom/EventLoopEventQueue.h 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/dom/EventLoopEventQueue.h 2021-06-09 04:33:05 UTC (rev 278645)
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2012 Victor Carbune (vic...@rosedu.org)
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "ActiveDOMObject.h"
-#include <wtf/Deque.h>
-#include <wtf/Forward.h>
-#include <wtf/RefPtr.h>
-#include <wtf/UniqueRef.h>
-#include <wtf/WeakPtr.h>
-
-namespace WebCore {
-
-class Event;
-class EventTarget;
-class ScriptExecutionContext;
-
-// FIXME: We should port call sites to the HTML event loop and remove this class.
-class EventLoopEventQueue : public ActiveDOMObject, public CanMakeWeakPtr<EventLoopEventQueue> {
- WTF_MAKE_FAST_ALLOCATED;
-public:
- static UniqueRef<EventLoopEventQueue> create(EventTarget&);
-
- void enqueueEvent(RefPtr<Event>&&);
- void close();
-
- void cancelAllEvents();
- bool hasPendingEventsOfType(const AtomString&) const;
-
- bool hasPendingActivity() const;
-
-private:
- friend UniqueRef<EventLoopEventQueue> WTF::makeUniqueRefWithoutFastMallocCheck<EventLoopEventQueue, WebCore::EventTarget&>(WebCore::EventTarget&);
- explicit EventLoopEventQueue(EventTarget&);
-
- void dispatchOneEvent();
-
- const char* activeDOMObjectName() const final;
- void stop() final;
-
- EventTarget& m_owner;
- Deque<RefPtr<Event>> m_pendingEvents;
- bool m_isClosed { false };
- bool m_isFiringEvent { false };
-};
-
-} // namespace WebCore
Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (278644 => 278645)
--- trunk/Source/WebCore/html/HTMLMediaElement.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -394,7 +394,6 @@
, m_scanTimer(*this, &HTMLMediaElement::scanTimerFired)
, m_playbackControlsManagerBehaviorRestrictionsTimer(*this, &HTMLMediaElement::playbackControlsManagerBehaviorRestrictionsTimerFired)
, m_seekToPlaybackPositionEndedTimer(*this, &HTMLMediaElement::seekToPlaybackPositionEndedTimerFired)
- , m_asyncEventQueue(EventLoopEventQueue::create(*this))
, m_lastTimeUpdateEventMovieTime(MediaTime::positiveInfiniteTime())
, m_firstTimePlaying(true)
, m_playing(false)
@@ -517,8 +516,6 @@
beginIgnoringTrackDisplayUpdateRequests();
allMediaElements().remove(this);
- m_asyncEventQueue->close();
-
setShouldDelayLoadEvent(false);
unregisterWithDocument(document());
@@ -897,20 +894,13 @@
void HTMLMediaElement::scheduleEvent(const AtomString& eventName)
{
- auto event = Event::create(eventName, Event::CanBubble::No, Event::IsCancelable::Yes);
-
- // Don't set the event target, the event queue will set it in GenericEventQueue::timerFired and setting it here
- // will trigger an ASSERT if this element has been marked for deletion.
-
- m_asyncEventQueue->enqueueEvent(WTFMove(event));
+ scheduleEvent(Event::create(eventName, Event::CanBubble::No, Event::IsCancelable::Yes));
}
-#if ENABLE(PICTURE_IN_PICTURE_API)
void HTMLMediaElement::scheduleEvent(Ref<Event>&& event)
{
- m_asyncEventQueue->enqueueEvent(WTFMove(event));
+ queueCancellableTaskToDispatchEvent(*this, TaskSource::MediaElement, m_asyncEventsCancellationGroup, WTFMove(event));
}
-#endif
void HTMLMediaElement::scheduleResolvePendingPlayPromises()
{
@@ -1777,12 +1767,10 @@
// less than the endTime in the cue.
if (eventTask.second->startTime() >= eventTask.second->endTime()) {
auto enterEvent = Event::create(eventNames().enterEvent, Event::CanBubble::No, Event::IsCancelable::No);
- enterEvent->setTarget(eventTask.second);
- m_asyncEventQueue->enqueueEvent(WTFMove(enterEvent));
+ scheduleEventOn(*eventTask.second, WTFMove(enterEvent));
auto exitEvent = Event::create(eventNames().exitEvent, Event::CanBubble::No, Event::IsCancelable::No);
- exitEvent->setTarget(eventTask.second);
- m_asyncEventQueue->enqueueEvent(WTFMove(exitEvent));
+ scheduleEventOn(*eventTask.second, WTFMove(exitEvent));
} else {
RefPtr<Event> event;
if (eventTask.first == eventTask.second->startMediaTime())
@@ -1789,8 +1777,7 @@
event = Event::create(eventNames().enterEvent, Event::CanBubble::No, Event::IsCancelable::No);
else
event = Event::create(eventNames().exitEvent, Event::CanBubble::No, Event::IsCancelable::No);
- event->setTarget(eventTask.second);
- m_asyncEventQueue->enqueueEvent(WTFMove(event));
+ scheduleEventOn(*eventTask.second, event.releaseNonNull());
}
}
@@ -1802,8 +1789,7 @@
// task to fire a simple event named cuechange at the TextTrack object, and, ...
for (auto& affectedTrack : affectedTracks) {
auto event = Event::create(eventNames().cuechangeEvent, Event::CanBubble::No, Event::IsCancelable::No);
- event->setTarget(affectedTrack);
- m_asyncEventQueue->enqueueEvent(WTFMove(event));
+ scheduleEventOn(*affectedTrack, WTFMove(event));
// ... if the text track has a corresponding track element, to then fire a
// simple event named cuechange at the track element as well.
@@ -1811,8 +1797,7 @@
auto event = Event::create(eventNames().cuechangeEvent, Event::CanBubble::No, Event::IsCancelable::No);
auto trackElement = makeRefPtr(downcast<LoadableTextTrack>(*affectedTrack).trackElement());
ASSERT(trackElement);
- event->setTarget(trackElement);
- m_asyncEventQueue->enqueueEvent(WTFMove(event));
+ scheduleEventOn(*trackElement, WTFMove(event));
}
}
@@ -2137,7 +2122,7 @@
void HTMLMediaElement::cancelPendingEventsAndCallbacks()
{
INFO_LOG(LOGIDENTIFIER);
- m_asyncEventQueue->cancelAllEvents();
+ m_asyncEventsCancellationGroup.cancel();
for (auto& source : childrenOfType<HTMLSourceElement>(*this))
source.cancelPendingErrorEvent();
@@ -2501,8 +2486,7 @@
}
auto event = WebKitMediaKeyNeededEvent::create(eventNames().webkitneedkeyEvent, initData);
- event->setTarget(this);
- m_asyncEventQueue->enqueueEvent(WTFMove(event));
+ scheduleEvent(WTFMove(event));
}
String HTMLMediaElement::mediaPlayerMediaKeysStorageDirectory() const
@@ -2651,7 +2635,7 @@
// initDataType = initDataType
// initData = initData
MediaEncryptedEventInit initializer { initDataType, WTFMove(initData) };
- m_asyncEventQueue->enqueueEvent(MediaEncryptedEvent::create(eventNames().encryptedEvent, initializer, Event::IsTrusted::Yes));
+ scheduleEvent(MediaEncryptedEvent::create(eventNames().encryptedEvent, initializer, Event::IsTrusted::Yes));
}
void HTMLMediaElement::mediaPlayerWaitingForKeyChanged()
@@ -5617,7 +5601,7 @@
{
cancelPendingTasks();
m_resourceSelectionTaskCancellationGroup.cancel();
- m_asyncEventQueue->close();
+ m_asyncEventsCancellationGroup.cancel();
}
void HTMLMediaElement::contextDestroyed()
@@ -5705,7 +5689,6 @@
bool HTMLMediaElement::virtualHasPendingActivity() const
{
return m_creatingControls
- || m_asyncEventQueue->hasPendingActivity()
|| (hasAudio() && isPlaying())
|| (hasLiveSource() && hasEventListeners());
}
@@ -5893,8 +5876,7 @@
bool hasTargets = m_mediaSession && mediaSession().hasWirelessPlaybackTargets();
ALWAYS_LOG(LOGIDENTIFIER, "hasTargets = ", hasTargets);
auto event = WebKitPlaybackTargetAvailabilityEvent::create(eventNames().webkitplaybacktargetavailabilitychangedEvent, hasTargets);
- event->setTarget(this);
- m_asyncEventQueue->enqueueEvent(WTFMove(event));
+ scheduleEvent(WTFMove(event));
scheduleUpdateMediaState();
}
@@ -8153,6 +8135,11 @@
return *m_mediaSession;
}
+template<typename T> void HTMLMediaElement::scheduleEventOn(T& target, Ref<Event>&& event)
+{
+ target.queueCancellableTaskToDispatchEvent(target, TaskSource::MediaElement, m_asyncEventsCancellationGroup, WTFMove(event));
}
+}
+
#endif
Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (278644 => 278645)
--- trunk/Source/WebCore/html/HTMLMediaElement.h 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h 2021-06-09 04:33:05 UTC (rev 278645)
@@ -31,7 +31,6 @@
#include "AudioTrack.h"
#include "AutoplayEvent.h"
#include "CaptionUserPreferences.h"
-#include "EventLoopEventQueue.h"
#include "HTMLElement.h"
#include "HTMLMediaElementEnums.h"
#include "MediaCanStartListener.h"
@@ -550,9 +549,7 @@
WEBCORE_EXPORT void willExitFullscreen();
WEBCORE_EXPORT void didStopBeingFullscreenElement() final;
-#if ENABLE(PICTURE_IN_PICTURE_API)
void scheduleEvent(Ref<Event>&&);
-#endif
enum class AutoplayEventPlaybackState { None, PreventedAutoplay, StartedWithUserGesture, StartedWithoutUserGesture };
@@ -575,6 +572,11 @@
void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType, const PlatformMediaSession::RemoteCommandArgument&) override;
+#if ENABLE(WIRELESS_PLAYBACK_TARGET)
+ using EventTarget::dispatchEvent;
+ void dispatchEvent(Event&) override;
+#endif
+
protected:
HTMLMediaElement(const QualifiedName&, Document&, bool createdByParser);
virtual ~HTMLMediaElement();
@@ -603,6 +605,7 @@
void updateMediaControlsAfterPresentationModeChange();
void scheduleEvent(const AtomString&);
+ template<typename T> void scheduleEventOn(T& target, Ref<Event>&&);
bool showPosterFlag() const { return m_showPoster; }
void setShowPosterFlag(bool);
@@ -691,13 +694,10 @@
#if ENABLE(LEGACY_ENCRYPTED_MEDIA) && ENABLE(ENCRYPTED_MEDIA)
void updateShouldContinueAfterNeedKey();
#endif
-
+
#if ENABLE(WIRELESS_PLAYBACK_TARGET)
void mediaPlayerCurrentPlaybackTargetIsWirelessChanged(bool) final;
void enqueuePlaybackTargetAvailabilityChangedEvent();
-
- using EventTarget::dispatchEvent;
- void dispatchEvent(Event&) override;
#endif
String mediaPlayerReferrer() const override;
@@ -952,7 +952,7 @@
TaskCancellationGroup m_bufferedTimeRangesChangedTaskCancellationGroup;
TaskCancellationGroup m_resourceSelectionTaskCancellationGroup;
RefPtr<TimeRanges> m_playedTimeRanges;
- UniqueRef<EventLoopEventQueue> m_asyncEventQueue;
+ TaskCancellationGroup m_asyncEventsCancellationGroup;
#if PLATFORM(IOS_FAMILY)
TaskCancellationGroup m_volumeRevertTaskCancellationGroup;
#endif
Modified: trunk/Source/WebCore/html/track/DataCue.cpp (278644 => 278645)
--- trunk/Source/WebCore/html/track/DataCue.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/DataCue.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -71,22 +71,30 @@
Ref<DataCue> DataCue::create(Document& document, const MediaTime& start, const MediaTime& end, const void* data, unsigned length)
{
- return adoptRef(*new DataCue(document, start, end, data, length));
+ auto dataCue = adoptRef(*new DataCue(document, start, end, data, length));
+ dataCue->suspendIfNeeded();
+ return dataCue;
}
Ref<DataCue> DataCue::create(Document& document, const MediaTime& start, const MediaTime& end, Ref<SerializedPlatformDataCue>&& platformValue, const String& type)
{
- return adoptRef(*new DataCue(document, start, end, WTFMove(platformValue), type));
+ auto dataCue = adoptRef(*new DataCue(document, start, end, WTFMove(platformValue), type));
+ dataCue->suspendIfNeeded();
+ return dataCue;
}
Ref<DataCue> DataCue::create(Document& document, double start, double end, ArrayBuffer& data)
{
- return adoptRef(*new DataCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), data, emptyString()));
+ auto dataCue = adoptRef(*new DataCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), data, emptyString()));
+ dataCue->suspendIfNeeded();
+ return dataCue;
}
Ref<DataCue> DataCue::create(Document& document, double start, double end, JSC::JSValue value, const String& type)
{
- return adoptRef(*new DataCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), value, type));
+ auto dataCue = adoptRef(*new DataCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), value, type));
+ dataCue->suspendIfNeeded();
+ return dataCue;
}
DataCue::~DataCue() = default;
Modified: trunk/Source/WebCore/html/track/InbandDataTextTrack.cpp (278644 => 278645)
--- trunk/Source/WebCore/html/track/InbandDataTextTrack.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/InbandDataTextTrack.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -45,7 +45,9 @@
Ref<InbandDataTextTrack> InbandDataTextTrack::create(Document& document, TextTrackClient& client, InbandTextTrackPrivate& trackPrivate)
{
- return adoptRef(*new InbandDataTextTrack(document, client, trackPrivate));
+ auto textTrack = adoptRef(*new InbandDataTextTrack(document, client, trackPrivate));
+ textTrack->suspendIfNeeded();
+ return textTrack;
}
InbandDataTextTrack::~InbandDataTextTrack() = default;
Modified: trunk/Source/WebCore/html/track/InbandGenericTextTrack.cpp (278644 => 278645)
--- trunk/Source/WebCore/html/track/InbandGenericTextTrack.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/InbandGenericTextTrack.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -70,7 +70,9 @@
Ref<InbandGenericTextTrack> InbandGenericTextTrack::create(Document& document, TextTrackClient& client, InbandTextTrackPrivate& trackPrivate)
{
- return adoptRef(*new InbandGenericTextTrack(document, client, trackPrivate));
+ auto textTrack = adoptRef(*new InbandGenericTextTrack(document, client, trackPrivate));
+ textTrack->suspendIfNeeded();
+ return textTrack;
}
InbandGenericTextTrack::~InbandGenericTextTrack() = default;
Modified: trunk/Source/WebCore/html/track/InbandTextTrack.cpp (278644 => 278645)
--- trunk/Source/WebCore/html/track/InbandTextTrack.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/InbandTextTrack.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -50,7 +50,9 @@
return InbandWebVTTTextTrack::create(document, client, trackPrivate);
}
ASSERT_NOT_REACHED();
- return InbandDataTextTrack::create(document, client, trackPrivate);
+ auto textTrack = InbandDataTextTrack::create(document, client, trackPrivate);
+ textTrack->suspendIfNeeded();
+ return textTrack;
}
InbandTextTrack::InbandTextTrack(Document& document, TextTrackClient& client, InbandTextTrackPrivate& trackPrivate)
Modified: trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.cpp (278644 => 278645)
--- trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -46,7 +46,9 @@
Ref<InbandTextTrack> InbandWebVTTTextTrack::create(Document& document, TextTrackClient& client, InbandTextTrackPrivate& trackPrivate)
{
- return adoptRef(*new InbandWebVTTTextTrack(document, client, trackPrivate));
+ auto textTrack = adoptRef(*new InbandWebVTTTextTrack(document, client, trackPrivate));
+ textTrack->suspendIfNeeded();
+ return textTrack;
}
InbandWebVTTTextTrack::~InbandWebVTTTextTrack() = default;
Modified: trunk/Source/WebCore/html/track/LoadableTextTrack.cpp (278644 => 278645)
--- trunk/Source/WebCore/html/track/LoadableTextTrack.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/LoadableTextTrack.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -48,7 +48,9 @@
Ref<LoadableTextTrack> LoadableTextTrack::create(HTMLTrackElement& track, const String& kind, const String& label, const String& language)
{
- return adoptRef(*new LoadableTextTrack(track, kind, label, language));
+ auto textTrack = adoptRef(*new LoadableTextTrack(track, kind, label, language));
+ textTrack->suspendIfNeeded();
+ return textTrack;
}
void LoadableTextTrack::scheduleLoad(const URL& url)
Modified: trunk/Source/WebCore/html/track/TextTrack.cpp (278644 => 278645)
--- trunk/Source/WebCore/html/track/TextTrack.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/TextTrack.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -100,7 +100,7 @@
TextTrack::TextTrack(ScriptExecutionContext* context, TextTrackClient* client, const AtomString& kind, const AtomString& id, const AtomString& label, const AtomString& language, TextTrackType type)
: TrackBase(TrackBase::TextTrack, id, label, language)
- , ContextDestructionObserver(context)
+ , ActiveDOMObject(context)
, m_client(client)
, m_trackType(type)
{
@@ -118,7 +118,9 @@
Ref<TextTrack> TextTrack::create(Document* document, TextTrackClient* client, const AtomString& kind, const AtomString& id, const AtomString& label, const AtomString& language)
{
- return adoptRef(*new TextTrack(document, client, kind, id, label, language, AddTrack));
+ auto textTrack = adoptRef(*new TextTrack(document, client, kind, id, label, language, AddTrack));
+ textTrack->suspendIfNeeded();
+ return textTrack;
}
TextTrack::~TextTrack()
@@ -590,6 +592,11 @@
return m_kind == Kind::Forced;
}
+const char* TextTrack::activeDOMObjectName() const
+{
+ return "TextTrack";
+}
+
#if ENABLE(MEDIA_SOURCE)
void TextTrack::setLanguage(const AtomString& language)
{
Modified: trunk/Source/WebCore/html/track/TextTrack.h (278644 => 278645)
--- trunk/Source/WebCore/html/track/TextTrack.h 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/TextTrack.h 2021-06-09 04:33:05 UTC (rev 278645)
@@ -52,7 +52,7 @@
virtual void textTrackRemoveCue(TextTrack&, TextTrackCue&) = 0;
};
-class TextTrack : public TrackBase, public EventTargetWithInlineData, public ContextDestructionObserver {
+class TextTrack : public TrackBase, public EventTargetWithInlineData, public ActiveDOMObject {
WTF_MAKE_ISO_ALLOCATED(TextTrack);
public:
static Ref<TextTrack> create(Document*, TextTrackClient*, const AtomString& kind, const AtomString& id, const AtomString& label, const AtomString& language);
@@ -159,6 +159,9 @@
void refEventTarget() final { ref(); }
void derefEventTarget() final { deref(); }
+ // ActiveDOMObject
+ const char* activeDOMObjectName() const final;
+
#if !RELEASE_LOG_DISABLED
const char* logClassName() const override { return "TextTrack"; }
#endif
Modified: trunk/Source/WebCore/html/track/TextTrack.idl (278644 => 278645)
--- trunk/Source/WebCore/html/track/TextTrack.idl 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/TextTrack.idl 2021-06-09 04:33:05 UTC (rev 278645)
@@ -27,6 +27,7 @@
enum TextTrackKind { "subtitles", "captions", "descriptions", "chapters", "metadata", "forced" };
[
+ ActiveDOMObject,
Conditional=VIDEO,
ExportToWrappedFunction,
GenerateIsReachable=ImplElementRoot,
Modified: trunk/Source/WebCore/html/track/TextTrackCue.cpp (278644 => 278645)
--- trunk/Source/WebCore/html/track/TextTrackCue.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/TextTrackCue.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -38,6 +38,7 @@
#include "CSSValueKeywords.h"
#include "DOMRect.h"
#include "Event.h"
+#include "EventNames.h"
#include "HTMLDivElement.h"
#include "HTMLStyleElement.h"
#include "Logging.h"
@@ -222,11 +223,14 @@
if (!nodeTypes.contains(RequiredNodes::CueBackground))
return Exception { InvalidStateError, makeString("Missing required attribute: ", cueBackgroundAttributName().toString()) };
- return adoptRef(*new TextTrackCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), WTFMove(fragment)));
+ auto textTrackCue = adoptRef(*new TextTrackCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), WTFMove(fragment)));
+ textTrackCue->suspendIfNeeded();
+ return textTrackCue;
}
TextTrackCue::TextTrackCue(Document& document, const MediaTime& start, const MediaTime& end, Ref<DocumentFragment>&& cueFragment)
- : m_startTime(start)
+ : ActiveDOMObject(document)
+ , m_startTime(start)
, m_endTime(end)
, m_document(document)
, m_cueNode(WTFMove(cueFragment))
@@ -233,10 +237,11 @@
{
}
-TextTrackCue::TextTrackCue(Document& context, const MediaTime& start, const MediaTime& end)
- : m_startTime(start)
+TextTrackCue::TextTrackCue(Document& document, const MediaTime& start, const MediaTime& end)
+ : ActiveDOMObject(document)
+ , m_startTime(start)
, m_endTime(end)
- , m_document(context)
+ , m_document(document)
{
}
@@ -335,7 +340,7 @@
EventTarget::dispatchEvent(event);
}
-bool TextTrackCue::isActive()
+bool TextTrackCue::isActive() const
{
return m_isActive && track() && track()->mode() != TextTrack::Mode::Disabled;
}
@@ -531,6 +536,11 @@
m_displayTreeNeedsUpdate = false;
}
+const char* TextTrackCue::activeDOMObjectName() const
+{
+ return "TextTrackCue";
+}
+
} // namespace WebCore
#endif
Modified: trunk/Source/WebCore/html/track/TextTrackCue.h (278644 => 278645)
--- trunk/Source/WebCore/html/track/TextTrackCue.h 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/TextTrackCue.h 2021-06-09 04:33:05 UTC (rev 278645)
@@ -62,7 +62,7 @@
WeakPtr<TextTrackCue> m_cue;
};
-class TextTrackCue : public RefCounted<TextTrackCue>, public EventTargetWithInlineData {
+class TextTrackCue : public RefCounted<TextTrackCue>, public EventTargetWithInlineData, public ActiveDOMObject {
WTF_MAKE_ISO_ALLOCATED(TextTrackCue);
public:
static const AtomString& cueShadowPseudoId();
@@ -92,7 +92,7 @@
MediaTime endMediaTime() const { return m_endTime; }
void setEndTime(const MediaTime&);
- bool isActive();
+ bool isActive() const;
virtual void setIsActive(bool);
virtual bool isOrderedBefore(const TextTrackCue*) const;
@@ -137,15 +137,17 @@
private:
TextTrackCue(Document&, const MediaTime& start, const MediaTime& end, Ref<DocumentFragment>&&);
+ // EventTarget
void refEventTarget() final { ref(); }
void derefEventTarget() final { deref(); }
-
using EventTarget::dispatchEvent;
void dispatchEvent(Event&) final;
-
EventTargetInterface eventTargetInterface() const final { return TextTrackCueEventTargetInterfaceType; }
ScriptExecutionContext* scriptExecutionContext() const final;
+ // ActiveDOMObject
+ const char* activeDOMObjectName() const final;
+
void rebuildDisplayTree();
String m_id;
Modified: trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp (278644 => 278645)
--- trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -161,7 +161,9 @@
Ref<TextTrackCueGeneric> TextTrackCueGeneric::create(ScriptExecutionContext& context, const MediaTime& start, const MediaTime& end, const String& content)
{
- return adoptRef(*new TextTrackCueGeneric(downcast<Document>(context), start, end, content));
+ auto cue = adoptRef(*new TextTrackCueGeneric(downcast<Document>(context), start, end, content));
+ cue->suspendIfNeeded();
+ return cue;
}
TextTrackCueGeneric::TextTrackCueGeneric(Document& document, const MediaTime& start, const MediaTime& end, const String& content)
Modified: trunk/Source/WebCore/html/track/VTTCue.cpp (278644 => 278645)
--- trunk/Source/WebCore/html/track/VTTCue.cpp 2021-06-09 03:29:18 UTC (rev 278644)
+++ trunk/Source/WebCore/html/track/VTTCue.cpp 2021-06-09 04:33:05 UTC (rev 278645)
@@ -264,12 +264,16 @@
Ref<VTTCue> VTTCue::create(Document& document, double start, double end, String&& content)
{
- return adoptRef(*new VTTCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), WTFMove(content)));
+ auto cue = adoptRef(*new VTTCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), WTFMove(content)));
+ cue->suspendIfNeeded();
+ return cue;
}
Ref<VTTCue> VTTCue::create(Document& document, const WebVTTCueData& data)
{
- return adoptRef(*new VTTCue(document, data));
+ auto cue = adoptRef(*new VTTCue(document, data));
+ cue->suspendIfNeeded();
+ return cue;
}
VTTCue::VTTCue(Document& document, const MediaTime& start, const MediaTime& end, String&& content)