⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 278645 in webkit


Ignore:
Timestamp:
Jun 8, 2021, 9:33:05 PM (5 years ago)
Author:
Chris Dumez
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:
Location:
trunk/Source/WebCore
Files:
2 deleted
25 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r278640 r278645  
     12021-06-08  Chris Dumez  <cdumez@apple.com>
     2
     3        Drop legacy EventLoopEventQueue class
     4        https://bugs.webkit.org/show_bug.cgi?id=226748
     5
     6        Reviewed by Darin Adler.
     7
     8        Drop legacy EventLoopEventQueue class which was used by HTMLMediaElement. I added a
     9        queueCancellableTaskToDispatchEvent() convenience function on ActiveDOMObject to
     10        schedule cancellable events directly on the HTML event loop. The function takes
     11        care of keeping the object and its wrapper alive until the event has fired.
     12
     13        Note that the previous code was using EventLoopEventQueue to dispatch events on
     14        other objects than the HTMLMediaElement. This was wrong as it wouldn't take
     15        care of keeping the real target's JS wrapper alive to actually dispatch the
     16        event. As a result, I had to update a couple of media classes to subclass
     17        ActiveDOMObject and the HTMLMediaElement now calls
     18        queueCancellableTaskToDispatchEvent() directly on the target.
     19
     20        * Headers.cmake:
     21        * Sources.txt:
     22        * WebCore.xcodeproj/project.pbxproj:
     23        * dom/ActiveDOMObject.cpp:
     24        (WebCore::ActiveDOMObjectEventDispatchTask::ActiveDOMObjectEventDispatchTask):
     25        (WebCore::ActiveDOMObject::queueTaskToDispatchEventInternal):
     26        (WebCore::ActiveDOMObject::queueCancellableTaskToDispatchEventInternal):
     27        * dom/ActiveDOMObject.h:
     28        * dom/EventLoopEventQueue.cpp: Removed.
     29        * dom/EventLoopEventQueue.h: Removed.
     30        * html/HTMLMediaElement.cpp:
     31        (WebCore::HTMLMediaElement::HTMLMediaElement):
     32        (WebCore::HTMLMediaElement::~HTMLMediaElement):
     33        (WebCore::HTMLMediaElement::scheduleEvent):
     34        (WebCore::HTMLMediaElement::updateActiveTextTrackCues):
     35        (WebCore::HTMLMediaElement::cancelPendingEventsAndCallbacks):
     36        (WebCore::HTMLMediaElement::mediaPlayerKeyNeeded):
     37        (WebCore::HTMLMediaElement::mediaPlayerInitializationDataEncountered):
     38        (WebCore::HTMLMediaElement::closeTaskQueues):
     39        (WebCore::HTMLMediaElement::virtualHasPendingActivity const):
     40        (WebCore::HTMLMediaElement::enqueuePlaybackTargetAvailabilityChangedEvent):
     41        (WebCore::HTMLMediaElement::scheduleEventOn):
     42        * html/HTMLMediaElement.h:
     43        * html/track/InbandTextTrack.cpp:
     44        (WebCore::InbandTextTrack::create):
     45        * html/track/LoadableTextTrack.cpp:
     46        (WebCore::LoadableTextTrack::create):
     47        * html/track/TextTrack.cpp:
     48        (WebCore::TextTrack::TextTrack):
     49        (WebCore::TextTrack::create):
     50        (WebCore::TextTrack::activeDOMObjectName const):
     51        * html/track/TextTrack.h:
     52        * html/track/TextTrack.idl:
     53        * html/track/TextTrackCue.cpp:
     54        (WebCore::TextTrackCue::create):
     55        (WebCore::TextTrackCue::TextTrackCue):
     56        (WebCore::TextTrackCue::activeDOMObjectName const):
     57        * html/track/TextTrackCue.h:
     58        * html/track/TextTrackCue.idl:
     59
    1602021-06-08  Devin Rousso  <drousso@apple.com>
    261
  • trunk/Source/WebCore/Headers.cmake

    r278580 r278645  
    463463    dom/EventListenerOptions.h
    464464    dom/EventLoop.h
    465     dom/EventLoopEventQueue.h
    466465    dom/EventModifierInit.h
    467466    dom/EventNames.h
  • trunk/Source/WebCore/Sources.txt

    r278544 r278645  
    950950dom/EventListenerMap.cpp
    951951dom/EventLoop.cpp
    952 dom/EventLoopEventQueue.cpp
    953952dom/EventNames.cpp
    954953dom/EventPath.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r278630 r278645  
    103103                071E496E1AD5AA0D008A50B4 /* MediaPlaybackTargetCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 071E496D1AD5AA0D008A50B4 /* MediaPlaybackTargetCocoa.mm */; };
    104104                071E49701AD5AB5E008A50B4 /* MediaPlaybackTargetCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 071E496F1AD5AB5E008A50B4 /* MediaPlaybackTargetCocoa.h */; settings = {ATTRIBUTES = (Private, ); }; };
    105                 0720B0A114D3323500642955 /* EventLoopEventQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 0720B09F14D3323500642955 /* EventLoopEventQueue.h */; settings = {ATTRIBUTES = (Private, ); }; };
    106105                0725EFA9239AD79300A538A9 /* MediaPlayerPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 079F5E4B0F3BEBEA005E0782 /* MediaPlayerPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; };
    107106                07277E4D17D018CC0015534D /* JSMediaStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 07277E4117D018CC0015534D /* JSMediaStream.h */; };
     
    57905789                071E496D1AD5AA0D008A50B4 /* MediaPlaybackTargetCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MediaPlaybackTargetCocoa.mm; sourceTree = "<group>"; };
    57915790                071E496F1AD5AB5E008A50B4 /* MediaPlaybackTargetCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaPlaybackTargetCocoa.h; sourceTree = "<group>"; };
    5792                 0720B09E14D3323500642955 /* EventLoopEventQueue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EventLoopEventQueue.cpp; sourceTree = "<group>"; };
    5793                 0720B09F14D3323500642955 /* EventLoopEventQueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EventLoopEventQueue.h; sourceTree = "<group>"; };
    57945791                07221B4C17CEC32700848E51 /* MediaStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaStream.cpp; sourceTree = "<group>"; };
    57955792                07221B4D17CEC32700848E51 /* MediaStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStream.h; sourceTree = "<group>"; };
     
    3070930706                                9B91DCCC2383792D000EEE0F /* EventLoop.cpp */,
    3071030707                                9B0ABCA123679AB300B45085 /* EventLoop.h */,
    30711                                 0720B09E14D3323500642955 /* EventLoopEventQueue.cpp */,
    30712                                 0720B09F14D3323500642955 /* EventLoopEventQueue.h */,
    3071330708                                83FE7CA31DA9F1650037237C /* EventModifierInit.h */,
    3071430709                                83FE7CA61DA9F1660037237C /* EventModifierInit.idl */,
     
    3263732632                                46BD05C625BB6E6C00225F30 /* EventListenerOptions.h in Headers */,
    3263832633                                46F02A1A23737F8300106A64 /* EventLoop.h in Headers */,
    32639                                 0720B0A114D3323500642955 /* EventLoopEventQueue.h in Headers */,
    3264032634                                83FE7CA81DA9F1B60037237C /* EventModifierInit.h in Headers */,
    3264132635                                939885C408B7E3D100E707C4 /* EventNames.h in Headers */,
  • trunk/Source/WebCore/bindings/js/JSTextTrackCueCustom.cpp

    r273138 r278645  
    4444    TextTrackCue& textTrackCue = jsTextTrackCue->wrapped();
    4545
    46     // If the cue is firing event listeners, its wrapper is reachable because
    47     // the wrapper is responsible for marking those event listeners.
    48     if (textTrackCue.isFiringEventListeners()) {
     46    if (!textTrackCue.isContextStopped() && textTrackCue.hasPendingActivity()) {
    4947        if (UNLIKELY(reason))
    50             *reason = "TextTrackCue is firing event listeners";
     48            *reason = "TextTrackCue with pending activity";
    5149        return true;
    5250    }
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm

    r278589 r278645  
    46624662        if ($codeGenerator->InheritsExtendedAttribute($interface, "ActiveDOMObject")) {
    46634663            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");
    4664         } else {
     4664        } elsif (!$codeGenerator->InheritsExtendedAttribute($interface, "CustomIsReachable")) {
    46654665            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");
    46664666        }
  • trunk/Source/WebCore/bindings/scripts/test/JS/JSTestDOMJIT.cpp

    r277830 r278645  
    587587    ASSERT(inherits(vm, info()));
    588588
    589     static_assert(!std::is_base_of<ActiveDOMObject, TestDOMJIT>::value, "Interface is not marked as [ActiveDOMObject] even though implementation class subclasses ActiveDOMObject.");
    590 
    591589}
    592590
  • trunk/Source/WebCore/bindings/scripts/test/JS/JSTestNode.cpp

    r277830 r278645  
    242242    ASSERT(inherits(vm, info()));
    243243
    244     static_assert(!std::is_base_of<ActiveDOMObject, TestNode>::value, "Interface is not marked as [ActiveDOMObject] even though implementation class subclasses ActiveDOMObject.");
    245 
    246244}
    247245
  • trunk/Source/WebCore/dom/ActiveDOMObject.cpp

    r269227 r278645  
    139139class ActiveDOMObjectEventDispatchTask : public EventLoopTask {
    140140public:
    141     ActiveDOMObjectEventDispatchTask(TaskSource source, EventLoopTaskGroup& group, ActiveDOMObject& object, EventTarget& target, Ref<Event>&& event)
     141    ActiveDOMObjectEventDispatchTask(TaskSource source, EventLoopTaskGroup& group, ActiveDOMObject& object, Function<void()>&& dispatchEvent)
    142142        : EventLoopTask(source, group)
    143143        , m_object(object)
    144         , m_target(target)
    145         , m_event(WTFMove(event))
     144        , m_dispatchEvent(WTFMove(dispatchEvent))
    146145    {
    147146        ++m_object.m_pendingActivityInstanceCount;
     
    159158        // actually dispatch the event.
    160159        if (m_object.isAllowedToRunScript())
    161             m_target->dispatchEvent(m_event.get());
     160            m_dispatchEvent();
    162161    }
    163162
    164163private:
    165164    ActiveDOMObject& m_object;
    166     Ref<EventTarget> m_target;
    167     Ref<Event> m_event;
     165    Function<void()> m_dispatchEvent;
    168166};
    169167
     
    175173        return;
    176174    auto& eventLoopTaskGroup = context->eventLoop();
    177     auto task = makeUnique<ActiveDOMObjectEventDispatchTask>(source, eventLoopTaskGroup, *this, target, WTFMove(event));
     175    auto task = makeUnique<ActiveDOMObjectEventDispatchTask>(source, eventLoopTaskGroup, *this, [target = makeRef(target), event = WTFMove(event)] {
     176        target->dispatchEvent(event);
     177    });
     178    eventLoopTaskGroup.queueTask(WTFMove(task));
     179}
     180
     181void ActiveDOMObject::queueCancellableTaskToDispatchEventInternal(EventTarget& target, TaskSource source, TaskCancellationGroup& cancellationGroup, Ref<Event>&& event)
     182{
     183    ASSERT(!event->target() || &target == event->target());
     184    auto* context = scriptExecutionContext();
     185    if (!context)
     186        return;
     187    auto& eventLoopTaskGroup = context->eventLoop();
     188    auto task = makeUnique<ActiveDOMObjectEventDispatchTask>(source, eventLoopTaskGroup, *this, CancellableTask(cancellationGroup, [target = makeRef(target), event = WTFMove(event)] {
     189        target->dispatchEvent(event);
     190    }));
    178191    eventLoopTaskGroup.queueTask(WTFMove(task));
    179192}
  • trunk/Source/WebCore/dom/ActiveDOMObject.h

    r278580 r278645  
    121121    }
    122122
    123     template<typename EventTargetType, typename EventType>
    124     static void queueTaskToDispatchEvent(EventTargetType& target, TaskSource source, Ref<EventType>&& event)
     123    template<typename EventTargetType>
     124    static void queueTaskToDispatchEvent(EventTargetType& target, TaskSource source, Ref<Event>&& event)
    125125    {
    126126        target.queueTaskToDispatchEventInternal(target, source, WTFMove(event));
     127    }
     128
     129    template<typename EventTargetType>
     130    static void queueCancellableTaskToDispatchEvent(EventTargetType& target, TaskSource source, TaskCancellationGroup& cancellationGroup, Ref<Event>&& event)
     131    {
     132        target.queueCancellableTaskToDispatchEventInternal(target, source, cancellationGroup, WTFMove(event));
    127133    }
    128134
     
    143149    void queueTaskInEventLoop(TaskSource, Function<void ()>&&);
    144150    void queueTaskToDispatchEventInternal(EventTarget&, TaskSource, Ref<Event>&&);
     151    void queueCancellableTaskToDispatchEventInternal(EventTarget&, TaskSource, TaskCancellationGroup&, Ref<Event>&&);
    145152
    146153    uint64_t m_pendingActivityInstanceCount { 0 };
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r278618 r278645  
    395395    , m_playbackControlsManagerBehaviorRestrictionsTimer(*this, &HTMLMediaElement::playbackControlsManagerBehaviorRestrictionsTimerFired)
    396396    , m_seekToPlaybackPositionEndedTimer(*this, &HTMLMediaElement::seekToPlaybackPositionEndedTimerFired)
    397     , m_asyncEventQueue(EventLoopEventQueue::create(*this))
    398397    , m_lastTimeUpdateEventMovieTime(MediaTime::positiveInfiniteTime())
    399398    , m_firstTimePlaying(true)
     
    518517    allMediaElements().remove(this);
    519518
    520     m_asyncEventQueue->close();
    521 
    522519    setShouldDelayLoadEvent(false);
    523520    unregisterWithDocument(document());
     
    898895void HTMLMediaElement::scheduleEvent(const AtomString& eventName)
    899896{
    900     auto event = Event::create(eventName, Event::CanBubble::No, Event::IsCancelable::Yes);
    901 
    902     // Don't set the event target, the event queue will set it in GenericEventQueue::timerFired and setting it here
    903     // will trigger an ASSERT if this element has been marked for deletion.
    904 
    905     m_asyncEventQueue->enqueueEvent(WTFMove(event));
    906 }
    907 
    908 #if ENABLE(PICTURE_IN_PICTURE_API)
     897    scheduleEvent(Event::create(eventName, Event::CanBubble::No, Event::IsCancelable::Yes));
     898}
     899
    909900void HTMLMediaElement::scheduleEvent(Ref<Event>&& event)
    910901{
    911     m_asyncEventQueue->enqueueEvent(WTFMove(event));
    912 }
    913 #endif
     902    queueCancellableTaskToDispatchEvent(*this, TaskSource::MediaElement, m_asyncEventsCancellationGroup, WTFMove(event));
     903}
    914904
    915905void HTMLMediaElement::scheduleResolvePendingPlayPromises()
     
    17781768        if (eventTask.second->startTime() >= eventTask.second->endTime()) {
    17791769            auto enterEvent = Event::create(eventNames().enterEvent, Event::CanBubble::No, Event::IsCancelable::No);
    1780             enterEvent->setTarget(eventTask.second);
    1781             m_asyncEventQueue->enqueueEvent(WTFMove(enterEvent));
     1770            scheduleEventOn(*eventTask.second, WTFMove(enterEvent));
    17821771
    17831772            auto exitEvent = Event::create(eventNames().exitEvent, Event::CanBubble::No, Event::IsCancelable::No);
    1784             exitEvent->setTarget(eventTask.second);
    1785             m_asyncEventQueue->enqueueEvent(WTFMove(exitEvent));
     1773            scheduleEventOn(*eventTask.second, WTFMove(exitEvent));
    17861774        } else {
    17871775            RefPtr<Event> event;
     
    17901778            else
    17911779                event = Event::create(eventNames().exitEvent, Event::CanBubble::No, Event::IsCancelable::No);
    1792             event->setTarget(eventTask.second);
    1793             m_asyncEventQueue->enqueueEvent(WTFMove(event));
     1780            scheduleEventOn(*eventTask.second, event.releaseNonNull());
    17941781        }
    17951782    }
     
    18031790    for (auto& affectedTrack : affectedTracks) {
    18041791        auto event = Event::create(eventNames().cuechangeEvent, Event::CanBubble::No, Event::IsCancelable::No);
    1805         event->setTarget(affectedTrack);
    1806         m_asyncEventQueue->enqueueEvent(WTFMove(event));
     1792        scheduleEventOn(*affectedTrack, WTFMove(event));
    18071793
    18081794        // ... if the text track has a corresponding track element, to then fire a
     
    18121798            auto trackElement = makeRefPtr(downcast<LoadableTextTrack>(*affectedTrack).trackElement());
    18131799            ASSERT(trackElement);
    1814             event->setTarget(trackElement);
    1815             m_asyncEventQueue->enqueueEvent(WTFMove(event));
     1800            scheduleEventOn(*trackElement, WTFMove(event));
    18161801        }
    18171802    }
     
    21382123{
    21392124    INFO_LOG(LOGIDENTIFIER);
    2140     m_asyncEventQueue->cancelAllEvents();
     2125    m_asyncEventsCancellationGroup.cancel();
    21412126
    21422127    for (auto& source : childrenOfType<HTMLSourceElement>(*this))
     
    25022487
    25032488    auto event = WebKitMediaKeyNeededEvent::create(eventNames().webkitneedkeyEvent, initData);
    2504     event->setTarget(this);
    2505     m_asyncEventQueue->enqueueEvent(WTFMove(event));
     2489    scheduleEvent(WTFMove(event));
    25062490}
    25072491
     
    26522636    //      initData = initData
    26532637    MediaEncryptedEventInit initializer { initDataType, WTFMove(initData) };
    2654     m_asyncEventQueue->enqueueEvent(MediaEncryptedEvent::create(eventNames().encryptedEvent, initializer, Event::IsTrusted::Yes));
     2638    scheduleEvent(MediaEncryptedEvent::create(eventNames().encryptedEvent, initializer, Event::IsTrusted::Yes));
    26552639}
    26562640
     
    56185602    cancelPendingTasks();
    56195603    m_resourceSelectionTaskCancellationGroup.cancel();
    5620     m_asyncEventQueue->close();
     5604    m_asyncEventsCancellationGroup.cancel();
    56215605}
    56225606
     
    57065690{
    57075691    return m_creatingControls
    5708         || m_asyncEventQueue->hasPendingActivity()
    57095692        || (hasAudio() && isPlaying())
    57105693        || (hasLiveSource() && hasEventListeners());
     
    58945877    ALWAYS_LOG(LOGIDENTIFIER, "hasTargets = ", hasTargets);
    58955878    auto event = WebKitPlaybackTargetAvailabilityEvent::create(eventNames().webkitplaybacktargetavailabilitychangedEvent, hasTargets);
    5896     event->setTarget(this);
    5897     m_asyncEventQueue->enqueueEvent(WTFMove(event));
     5879    scheduleEvent(WTFMove(event));
    58985880    scheduleUpdateMediaState();
    58995881}
     
    81548136}
    81558137
    8156 }
    8157 
    8158 #endif
     8138template<typename T> void HTMLMediaElement::scheduleEventOn(T& target, Ref<Event>&& event)
     8139{
     8140    target.queueCancellableTaskToDispatchEvent(target, TaskSource::MediaElement, m_asyncEventsCancellationGroup, WTFMove(event));
     8141}
     8142
     8143}
     8144
     8145#endif
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r278618 r278645  
    3232#include "AutoplayEvent.h"
    3333#include "CaptionUserPreferences.h"
    34 #include "EventLoopEventQueue.h"
    3534#include "HTMLElement.h"
    3635#include "HTMLMediaElementEnums.h"
     
    551550    WEBCORE_EXPORT void didStopBeingFullscreenElement() final;
    552551
    553 #if ENABLE(PICTURE_IN_PICTURE_API)
    554552    void scheduleEvent(Ref<Event>&&);
    555 #endif
    556553
    557554    enum class AutoplayEventPlaybackState { None, PreventedAutoplay, StartedWithUserGesture, StartedWithoutUserGesture };
     
    575572
    576573    void didReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType, const PlatformMediaSession::RemoteCommandArgument&) override;
     574
     575#if ENABLE(WIRELESS_PLAYBACK_TARGET)
     576    using EventTarget::dispatchEvent;
     577    void dispatchEvent(Event&) override;
     578#endif
    577579
    578580protected:
     
    604606
    605607    void scheduleEvent(const AtomString&);
     608    template<typename T> void scheduleEventOn(T& target, Ref<Event>&&);
    606609
    607610    bool showPosterFlag() const { return m_showPoster; }
     
    692695    void updateShouldContinueAfterNeedKey();
    693696#endif
    694    
     697
    695698#if ENABLE(WIRELESS_PLAYBACK_TARGET)
    696699    void mediaPlayerCurrentPlaybackTargetIsWirelessChanged(bool) final;
    697700    void enqueuePlaybackTargetAvailabilityChangedEvent();
    698 
    699     using EventTarget::dispatchEvent;
    700     void dispatchEvent(Event&) override;
    701701#endif
    702702
     
    953953    TaskCancellationGroup m_resourceSelectionTaskCancellationGroup;
    954954    RefPtr<TimeRanges> m_playedTimeRanges;
    955     UniqueRef<EventLoopEventQueue> m_asyncEventQueue;
     955    TaskCancellationGroup m_asyncEventsCancellationGroup;
    956956#if PLATFORM(IOS_FAMILY)
    957957    TaskCancellationGroup m_volumeRevertTaskCancellationGroup;
  • trunk/Source/WebCore/html/track/DataCue.cpp

    r262695 r278645  
    7272Ref<DataCue> DataCue::create(Document& document, const MediaTime& start, const MediaTime& end, const void* data, unsigned length)
    7373{
    74     return adoptRef(*new DataCue(document, start, end, data, length));
     74    auto dataCue = adoptRef(*new DataCue(document, start, end, data, length));
     75    dataCue->suspendIfNeeded();
     76    return dataCue;
    7577}
    7678
    7779Ref<DataCue> DataCue::create(Document& document, const MediaTime& start, const MediaTime& end, Ref<SerializedPlatformDataCue>&& platformValue, const String& type)
    7880{
    79     return adoptRef(*new DataCue(document, start, end, WTFMove(platformValue), type));
     81    auto dataCue = adoptRef(*new DataCue(document, start, end, WTFMove(platformValue), type));
     82    dataCue->suspendIfNeeded();
     83    return dataCue;
    8084}
    8185
    8286Ref<DataCue> DataCue::create(Document& document, double start, double end, ArrayBuffer& data)
    8387{
    84     return adoptRef(*new DataCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), data, emptyString()));
     88    auto dataCue = adoptRef(*new DataCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), data, emptyString()));
     89    dataCue->suspendIfNeeded();
     90    return dataCue;
    8591}
    8692
    8793Ref<DataCue> DataCue::create(Document& document, double start, double end, JSC::JSValue value, const String& type)
    8894{
    89     return adoptRef(*new DataCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), value, type));
     95    auto dataCue = adoptRef(*new DataCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), value, type));
     96    dataCue->suspendIfNeeded();
     97    return dataCue;
    9098}
    9199
  • trunk/Source/WebCore/html/track/InbandDataTextTrack.cpp

    r262695 r278645  
    4646Ref<InbandDataTextTrack> InbandDataTextTrack::create(Document& document, TextTrackClient& client, InbandTextTrackPrivate& trackPrivate)
    4747{
    48     return adoptRef(*new InbandDataTextTrack(document, client, trackPrivate));
     48    auto textTrack = adoptRef(*new InbandDataTextTrack(document, client, trackPrivate));
     49    textTrack->suspendIfNeeded();
     50    return textTrack;
    4951}
    5052
  • trunk/Source/WebCore/html/track/InbandGenericTextTrack.cpp

    r262695 r278645  
    7171Ref<InbandGenericTextTrack> InbandGenericTextTrack::create(Document& document, TextTrackClient& client, InbandTextTrackPrivate& trackPrivate)
    7272{
    73     return adoptRef(*new InbandGenericTextTrack(document, client, trackPrivate));
     73    auto textTrack = adoptRef(*new InbandGenericTextTrack(document, client, trackPrivate));
     74    textTrack->suspendIfNeeded();
     75    return textTrack;
    7476}
    7577
  • trunk/Source/WebCore/html/track/InbandTextTrack.cpp

    r269121 r278645  
    5151    }
    5252    ASSERT_NOT_REACHED();
    53     return InbandDataTextTrack::create(document, client, trackPrivate);
     53    auto textTrack = InbandDataTextTrack::create(document, client, trackPrivate);
     54    textTrack->suspendIfNeeded();
     55    return textTrack;
    5456}
    5557
  • trunk/Source/WebCore/html/track/InbandWebVTTTextTrack.cpp

    r278532 r278645  
    4747Ref<InbandTextTrack> InbandWebVTTTextTrack::create(Document& document, TextTrackClient& client, InbandTextTrackPrivate& trackPrivate)
    4848{
    49     return adoptRef(*new InbandWebVTTTextTrack(document, client, trackPrivate));
     49    auto textTrack = adoptRef(*new InbandWebVTTTextTrack(document, client, trackPrivate));
     50    textTrack->suspendIfNeeded();
     51    return textTrack;
    5052}
    5153
  • trunk/Source/WebCore/html/track/LoadableTextTrack.cpp

    r262695 r278645  
    4949Ref<LoadableTextTrack> LoadableTextTrack::create(HTMLTrackElement& track, const String& kind, const String& label, const String& language)
    5050{
    51     return adoptRef(*new LoadableTextTrack(track, kind, label, language));
     51    auto textTrack = adoptRef(*new LoadableTextTrack(track, kind, label, language));
     52    textTrack->suspendIfNeeded();
     53    return textTrack;
    5254}
    5355
  • trunk/Source/WebCore/html/track/TextTrack.cpp

    r278185 r278645  
    101101TextTrack::TextTrack(ScriptExecutionContext* context, TextTrackClient* client, const AtomString& kind, const AtomString& id, const AtomString& label, const AtomString& language, TextTrackType type)
    102102    : TrackBase(TrackBase::TextTrack, id, label, language)
    103     , ContextDestructionObserver(context)
     103    , ActiveDOMObject(context)
    104104    , m_client(client)
    105105    , m_trackType(type)
     
    119119Ref<TextTrack> TextTrack::create(Document* document, TextTrackClient* client, const AtomString& kind, const AtomString& id, const AtomString& label, const AtomString& language)
    120120{
    121     return adoptRef(*new TextTrack(document, client, kind, id, label, language, AddTrack));
     121    auto textTrack = adoptRef(*new TextTrack(document, client, kind, id, label, language, AddTrack));
     122    textTrack->suspendIfNeeded();
     123    return textTrack;
    122124}
    123125
     
    591593}
    592594
     595const char* TextTrack::activeDOMObjectName() const
     596{
     597    return "TextTrack";
     598}
     599
    593600#if ENABLE(MEDIA_SOURCE)
    594601void TextTrack::setLanguage(const AtomString& language)
  • trunk/Source/WebCore/html/track/TextTrack.h

    r278253 r278645  
    5353};
    5454
    55 class TextTrack : public TrackBase, public EventTargetWithInlineData, public ContextDestructionObserver {
     55class TextTrack : public TrackBase, public EventTargetWithInlineData, public ActiveDOMObject {
    5656    WTF_MAKE_ISO_ALLOCATED(TextTrack);
    5757public:
     
    159159    void refEventTarget() final { ref(); }
    160160    void derefEventTarget() final { deref(); }
     161
     162    // ActiveDOMObject
     163    const char* activeDOMObjectName() const final;
    161164
    162165#if !RELEASE_LOG_DISABLED
  • trunk/Source/WebCore/html/track/TextTrack.idl

    r274832 r278645  
    2828
    2929[
     30    ActiveDOMObject,
    3031    Conditional=VIDEO,
    3132    ExportToWrappedFunction,
  • trunk/Source/WebCore/html/track/TextTrackCue.cpp

    r277967 r278645  
    3939#include "DOMRect.h"
    4040#include "Event.h"
     41#include "EventNames.h"
    4142#include "HTMLDivElement.h"
    4243#include "HTMLStyleElement.h"
     
    223224        return Exception { InvalidStateError, makeString("Missing required attribute: ", cueBackgroundAttributName().toString()) };
    224225
    225     return adoptRef(*new TextTrackCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), WTFMove(fragment)));
     226    auto textTrackCue = adoptRef(*new TextTrackCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), WTFMove(fragment)));
     227    textTrackCue->suspendIfNeeded();
     228    return textTrackCue;
    226229}
    227230
    228231TextTrackCue::TextTrackCue(Document& document, const MediaTime& start, const MediaTime& end, Ref<DocumentFragment>&& cueFragment)
    229     : m_startTime(start)
     232    : ActiveDOMObject(document)
     233    , m_startTime(start)
    230234    , m_endTime(end)
    231235    , m_document(document)
     
    234238}
    235239
    236 TextTrackCue::TextTrackCue(Document& context, const MediaTime& start, const MediaTime& end)
    237     : m_startTime(start)
     240TextTrackCue::TextTrackCue(Document& document, const MediaTime& start, const MediaTime& end)
     241    : ActiveDOMObject(document)
     242    , m_startTime(start)
    238243    , m_endTime(end)
    239     , m_document(context)
     244    , m_document(document)
    240245{
    241246}
     
    336341}
    337342
    338 bool TextTrackCue::isActive()
     343bool TextTrackCue::isActive() const
    339344{
    340345    return m_isActive && track() && track()->mode() != TextTrack::Mode::Disabled;
     
    532537}
    533538
     539const char* TextTrackCue::activeDOMObjectName() const
     540{
     541    return "TextTrackCue";
     542}
     543
    534544} // namespace WebCore
    535545
  • trunk/Source/WebCore/html/track/TextTrackCue.h

    r271806 r278645  
    6363};
    6464
    65 class TextTrackCue : public RefCounted<TextTrackCue>, public EventTargetWithInlineData {
     65class TextTrackCue : public RefCounted<TextTrackCue>, public EventTargetWithInlineData, public ActiveDOMObject {
    6666    WTF_MAKE_ISO_ALLOCATED(TextTrackCue);
    6767public:
     
    9393    void setEndTime(const MediaTime&);
    9494
    95     bool isActive();
     95    bool isActive() const;
    9696    virtual void setIsActive(bool);
    9797
     
    138138    TextTrackCue(Document&, const MediaTime& start, const MediaTime& end, Ref<DocumentFragment>&&);
    139139
     140    // EventTarget
    140141    void refEventTarget() final { ref(); }
    141142    void derefEventTarget() final { deref(); }
    142 
    143143    using EventTarget::dispatchEvent;
    144144    void dispatchEvent(Event&) final;
    145 
    146145    EventTargetInterface eventTargetInterface() const final { return TextTrackCueEventTargetInterfaceType; }
    147146    ScriptExecutionContext* scriptExecutionContext() const final;
     147
     148    // ActiveDOMObject
     149    const char* activeDOMObjectName() const final;
    148150
    149151    void rebuildDisplayTree();
  • trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp

    r274810 r278645  
    162162Ref<TextTrackCueGeneric> TextTrackCueGeneric::create(ScriptExecutionContext& context, const MediaTime& start, const MediaTime& end, const String& content)
    163163{
    164     return adoptRef(*new TextTrackCueGeneric(downcast<Document>(context), start, end, content));
     164    auto cue = adoptRef(*new TextTrackCueGeneric(downcast<Document>(context), start, end, content));
     165    cue->suspendIfNeeded();
     166    return cue;
    165167}
    166168
  • trunk/Source/WebCore/html/track/VTTCue.cpp

    r270738 r278645  
    265265Ref<VTTCue> VTTCue::create(Document& document, double start, double end, String&& content)
    266266{
    267     return adoptRef(*new VTTCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), WTFMove(content)));
     267    auto cue = adoptRef(*new VTTCue(document, MediaTime::createWithDouble(start), MediaTime::createWithDouble(end), WTFMove(content)));
     268    cue->suspendIfNeeded();
     269    return cue;
    268270}
    269271
    270272Ref<VTTCue> VTTCue::create(Document& document, const WebVTTCueData& data)
    271273{
    272     return adoptRef(*new VTTCue(document, data));
     274    auto cue = adoptRef(*new VTTCue(document, data));
     275    cue->suspendIfNeeded();
     276    return cue;
    273277}
    274278
Note: See TracChangeset for help on using the changeset viewer.