Title: [278645] trunk/Source/WebCore
Revision
278645
Author
cdu...@apple.com
Date
2021-06-08 21:33:05 -0700 (Tue, 08 Jun 2021)

Log Message

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:

Modified Paths

Removed Paths

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)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to