| Index: Source/core/html/track/TextTrackList.cpp
|
| diff --git a/Source/core/html/track/TextTrackList.cpp b/Source/core/html/track/TextTrackList.cpp
|
| index d2bef9b0f0cddefdb6d97c17a6d878c38b074dd7..0d00ba33fee5220d99c603292f4bc7a5808b24e2 100644
|
| --- a/Source/core/html/track/TextTrackList.cpp
|
| +++ b/Source/core/html/track/TextTrackList.cpp
|
| @@ -27,6 +27,7 @@
|
| #include "core/html/track/TextTrackList.h"
|
|
|
| #include "bindings/v8/ExceptionStatePlaceholder.h"
|
| +#include "core/events/GenericEventQueue.h"
|
| #include "core/events/ThreadLocalEventNames.h"
|
| #include "core/html/HTMLMediaElement.h"
|
| #include "core/html/track/InbandTextTrack.h"
|
| @@ -38,14 +39,14 @@ using namespace WebCore;
|
|
|
| TextTrackList::TextTrackList(HTMLMediaElement* owner)
|
| : m_owner(owner)
|
| - , m_pendingEventTimer(this, &TextTrackList::asyncEventTimerFired)
|
| - , m_dispatchingEvents(0)
|
| + , m_asyncEventQueue(GenericEventQueue::create(this))
|
| {
|
| ScriptWrappable::init(this);
|
| }
|
|
|
| TextTrackList::~TextTrackList()
|
| {
|
| + m_asyncEventQueue->close();
|
| }
|
|
|
| unsigned TextTrackList::length() const
|
| @@ -226,6 +227,8 @@ void TextTrackList::remove(TextTrack* track)
|
|
|
| if (inbandTrack)
|
| inbandTrack->trackRemoved();
|
| +
|
| + scheduleRemoveTrackEvent(track);
|
| }
|
|
|
| bool TextTrackList::contains(TextTrack* track) const
|
| @@ -255,6 +258,16 @@ ExecutionContext* TextTrackList::executionContext() const
|
| return m_owner->executionContext();
|
| }
|
|
|
| +void TextTrackList::scheduleTrackEvent(const AtomicString& eventName, PassRefPtr<TextTrack> track)
|
| +{
|
| + TrackEventInit initializer;
|
| + initializer.track = track;
|
| + initializer.bubbles = false;
|
| + initializer.cancelable = false;
|
| +
|
| + m_asyncEventQueue->enqueueEvent(TrackEvent::create(eventName, initializer));
|
| +}
|
| +
|
| void TextTrackList::scheduleAddTrackEvent(PassRefPtr<TextTrack> track)
|
| {
|
| // 4.8.10.12.3 Sourcing out-of-band text tracks
|
| @@ -263,28 +276,38 @@ void TextTrackList::scheduleAddTrackEvent(PassRefPtr<TextTrack> track)
|
| // bubble and is not cancelable, and that uses the TrackEvent interface, with
|
| // the track attribute initialized to the text track's TextTrack object, at
|
| // the media element's textTracks attribute's TextTrackList object.
|
| + scheduleTrackEvent(EventTypeNames::addtrack, track);
|
| +}
|
|
|
| - RefPtr<TextTrack> trackRef = track;
|
| - TrackEventInit initializer;
|
| - initializer.track = trackRef;
|
| +void TextTrackList::scheduleChangeEvent()
|
| +{
|
| + // 4.8.10.12.1 Text track model
|
| + // Whenever a text track that is in a media element's list of text tracks
|
| + // has its text track mode change value, the user agent must run the
|
| + // following steps for the media element:
|
| + // ...
|
| + // Fire a simple event named change at the media element's textTracks
|
| + // attribute's TextTrackList object.
|
| +
|
| + EventInit initializer;
|
| initializer.bubbles = false;
|
| initializer.cancelable = false;
|
|
|
| - m_pendingEvents.append(TrackEvent::create(EventTypeNames::addtrack, initializer));
|
| - if (!m_pendingEventTimer.isActive())
|
| - m_pendingEventTimer.startOneShot(0);
|
| + m_asyncEventQueue->enqueueEvent(Event::create(EventTypeNames::change, initializer));
|
| }
|
|
|
| -void TextTrackList::asyncEventTimerFired(Timer<TextTrackList>*)
|
| +void TextTrackList::scheduleRemoveTrackEvent(PassRefPtr<TextTrack> track)
|
| {
|
| - Vector<RefPtr<Event> > pendingEvents;
|
| -
|
| - ++m_dispatchingEvents;
|
| - m_pendingEvents.swap(pendingEvents);
|
| - size_t count = pendingEvents.size();
|
| - for (size_t index = 0; index < count; ++index)
|
| - dispatchEvent(pendingEvents[index].release(), IGNORE_EXCEPTION);
|
| - --m_dispatchingEvents;
|
| + // 4.8.10.12.3 Sourcing out-of-band text tracks
|
| + // When a track element's parent element changes and the old parent was a
|
| + // media element, then the user agent must remove the track element's
|
| + // corresponding text track from the media element's list of text tracks,
|
| + // and then queue a task to fire a trusted event with the name removetrack,
|
| + // that does not bubble and is not cancelable, and that uses the TrackEvent
|
| + // interface, with the track attribute initialized to the text track's
|
| + // TextTrack object, at the media element's textTracks attribute's
|
| + // TextTrackList object.
|
| + scheduleTrackEvent(EventTypeNames::removetrack, track);
|
| }
|
|
|
| Node* TextTrackList::owner() const
|
|
|