diff options
Diffstat (limited to 'Source/WebCore/html/track/TextTrackList.cpp')
-rw-r--r-- | Source/WebCore/html/track/TextTrackList.cpp | 176 |
1 files changed, 99 insertions, 77 deletions
diff --git a/Source/WebCore/html/track/TextTrackList.cpp b/Source/WebCore/html/track/TextTrackList.cpp index 18d3f1bab..32f6bca0a 100644 --- a/Source/WebCore/html/track/TextTrackList.cpp +++ b/Source/WebCore/html/track/TextTrackList.cpp @@ -10,10 +10,10 @@ * 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 COMPUTER, INC. ``AS IS'' AND ANY + * 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 COMPUTER, INC. OR + * 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 @@ -29,7 +29,6 @@ #include "TextTrackList.h" -#include "EventNames.h" #include "HTMLMediaElement.h" #include "InbandTextTrack.h" #include "InbandTextTrackPrivate.h" @@ -44,6 +43,20 @@ TextTrackList::TextTrackList(HTMLMediaElement* element, ScriptExecutionContext* TextTrackList::~TextTrackList() { + clearElement(); +} + +void TextTrackList::clearElement() +{ + TrackListBase::clearElement(); + for (auto& track : m_elementTracks) { + track->setMediaElement(nullptr); + track->clearClient(); + } + for (auto& track : m_addTrackTracks) { + track->setMediaElement(nullptr); + track->clearClient(); + } } unsigned TextTrackList::length() const @@ -51,56 +64,51 @@ unsigned TextTrackList::length() const return m_addTrackTracks.size() + m_elementTracks.size() + m_inbandTracks.size(); } -int TextTrackList::getTrackIndex(TextTrack *textTrack) +int TextTrackList::getTrackIndex(TextTrack& textTrack) { - if (textTrack->trackType() == TextTrack::TrackElement) - return static_cast<LoadableTextTrack*>(textTrack)->trackElementIndex(); + if (is<LoadableTextTrack>(textTrack)) + return downcast<LoadableTextTrack>(textTrack).trackElementIndex(); - if (textTrack->trackType() == TextTrack::AddTrack) - return m_elementTracks.size() + m_addTrackTracks.find(textTrack); + if (textTrack.trackType() == TextTrack::AddTrack) + return m_elementTracks.size() + m_addTrackTracks.find(&textTrack); - if (textTrack->trackType() == TextTrack::InBand) - return m_elementTracks.size() + m_addTrackTracks.size() + m_inbandTracks.find(textTrack); + if (textTrack.trackType() == TextTrack::InBand) + return m_elementTracks.size() + m_addTrackTracks.size() + m_inbandTracks.find(&textTrack); ASSERT_NOT_REACHED(); return -1; } -int TextTrackList::getTrackIndexRelativeToRenderedTracks(TextTrack *textTrack) +int TextTrackList::getTrackIndexRelativeToRenderedTracks(TextTrack& textTrack) { // Calculate the "Let n be the number of text tracks whose text track mode is showing and that are in the media element's list of text tracks before track." int trackIndex = 0; - for (size_t i = 0; i < m_elementTracks.size(); ++i) { - if (!toTextTrack(m_elementTracks[i].get())->isRendered()) + for (auto& elementTrack : m_elementTracks) { + if (!downcast<TextTrack>(*elementTrack).isRendered()) continue; - - if (m_elementTracks[i] == textTrack) + if (elementTrack == &textTrack) return trackIndex; ++trackIndex; } - for (size_t i = 0; i < m_addTrackTracks.size(); ++i) { - if (!toTextTrack(m_addTrackTracks[i].get())->isRendered()) + for (auto& addTrack : m_addTrackTracks) { + if (!downcast<TextTrack>(*addTrack).isRendered()) continue; - - if (m_addTrackTracks[i] == textTrack) + if (addTrack == &textTrack) return trackIndex; ++trackIndex; } - for (size_t i = 0; i < m_inbandTracks.size(); ++i) { - if (!toTextTrack(m_inbandTracks[i].get())->isRendered()) + for (auto& inbandTrack : m_inbandTracks) { + if (!downcast<TextTrack>(*inbandTrack).isRendered()) continue; - - if (m_inbandTracks[i] == textTrack) + if (inbandTrack == &textTrack) return trackIndex; ++trackIndex; } - ASSERT_NOT_REACHED(); - return -1; } @@ -114,17 +122,17 @@ TextTrack* TextTrackList::item(unsigned index) const // resource), in the order defined by the media resource's format specification. if (index < m_elementTracks.size()) - return toTextTrack(m_elementTracks[index].get()); + return downcast<TextTrack>(m_elementTracks[index].get()); index -= m_elementTracks.size(); if (index < m_addTrackTracks.size()) - return toTextTrack(m_addTrackTracks[index].get()); + return downcast<TextTrack>(m_addTrackTracks[index].get()); index -= m_addTrackTracks.size(); if (index < m_inbandTracks.size()) - return toTextTrack(m_inbandTracks[index].get()); + return downcast<TextTrack>(m_inbandTracks[index].get()); - return 0; + return nullptr; } TextTrack* TextTrackList::getTrackById(const AtomicString& id) @@ -134,108 +142,122 @@ TextTrack* TextTrackList::getTrackById(const AtomicString& id) // TextTrackList object whose id IDL attribute would return a value equal // to the value of the id argument. for (unsigned i = 0; i < length(); ++i) { - TextTrack* track = item(i); - if (track->id() == id) - return track; + auto& track = *item(i); + if (track.id() == id) + return &track; } // When no tracks match the given argument, the method must return null. return nullptr; } -void TextTrackList::invalidateTrackIndexesAfterTrack(TextTrack* track) +void TextTrackList::invalidateTrackIndexesAfterTrack(TextTrack& track) { - Vector<RefPtr<TrackBase>>* tracks = 0; + Vector<RefPtr<TrackBase>>* tracks = nullptr; - if (track->trackType() == TextTrack::TrackElement) { + switch (track.trackType()) { + case TextTrack::TrackElement: tracks = &m_elementTracks; - for (size_t i = 0; i < m_addTrackTracks.size(); ++i) - toTextTrack(m_addTrackTracks[i].get())->invalidateTrackIndex(); - for (size_t i = 0; i < m_inbandTracks.size(); ++i) - toTextTrack(m_inbandTracks[i].get())->invalidateTrackIndex(); - } else if (track->trackType() == TextTrack::AddTrack) { + for (auto& addTrack : m_addTrackTracks) + downcast<TextTrack>(addTrack.get())->invalidateTrackIndex(); + for (auto& inbandTrack : m_inbandTracks) + downcast<TextTrack>(inbandTrack.get())->invalidateTrackIndex(); + break; + case TextTrack::AddTrack: tracks = &m_addTrackTracks; - for (size_t i = 0; i < m_inbandTracks.size(); ++i) - toTextTrack(m_inbandTracks[i].get())->invalidateTrackIndex(); - } else if (track->trackType() == TextTrack::InBand) + for (auto& inbandTrack : m_inbandTracks) + downcast<TextTrack>(inbandTrack.get())->invalidateTrackIndex(); + break; + case TextTrack::InBand: tracks = &m_inbandTracks; - else + break; + default: ASSERT_NOT_REACHED(); + } - size_t index = tracks->find(track); + size_t index = tracks->find(&track); if (index == notFound) return; for (size_t i = index; i < tracks->size(); ++i) - toTextTrack(tracks->at(index).get())->invalidateTrackIndex(); + downcast<TextTrack>(*tracks->at(index)).invalidateTrackIndex(); } -void TextTrackList::append(PassRefPtr<TextTrack> prpTrack) +void TextTrackList::append(Ref<TextTrack>&& track) { - RefPtr<TextTrack> track = prpTrack; - if (track->trackType() == TextTrack::AddTrack) - m_addTrackTracks.append(track); - else if (track->trackType() == TextTrack::TrackElement) { + m_addTrackTracks.append(track.ptr()); + else if (is<LoadableTextTrack>(track.get())) { // Insert tracks added for <track> element in tree order. - size_t index = static_cast<LoadableTextTrack*>(track.get())->trackElementIndex(); - m_elementTracks.insert(index, track); + size_t index = downcast<LoadableTextTrack>(track.get()).trackElementIndex(); + m_elementTracks.insert(index, track.ptr()); } else if (track->trackType() == TextTrack::InBand) { // Insert tracks added for in-band in the media file order. - size_t index = static_cast<InbandTextTrack*>(track.get())->inbandTrackIndex(); - m_inbandTracks.insert(index, track); + size_t index = downcast<InbandTextTrack>(track.get()).inbandTrackIndex(); + m_inbandTracks.insert(index, track.ptr()); } else ASSERT_NOT_REACHED(); - invalidateTrackIndexesAfterTrack(track.get()); + invalidateTrackIndexesAfterTrack(track); ASSERT(!track->mediaElement() || track->mediaElement() == mediaElement()); track->setMediaElement(mediaElement()); - scheduleAddTrackEvent(track.release()); + scheduleAddTrackEvent(WTFMove(track)); } -void TextTrackList::remove(TrackBase* track) +void TextTrackList::remove(TrackBase& track, bool scheduleEvent) { - TextTrack* textTrack = toTextTrack(track); - Vector<RefPtr<TrackBase>>* tracks = 0; - if (textTrack->trackType() == TextTrack::TrackElement) + auto& textTrack = downcast<TextTrack>(track); + Vector<RefPtr<TrackBase>>* tracks = nullptr; + switch (textTrack.trackType()) { + case TextTrack::TrackElement: tracks = &m_elementTracks; - else if (textTrack->trackType() == TextTrack::AddTrack) + break; + case TextTrack::AddTrack: tracks = &m_addTrackTracks; - else if (textTrack->trackType() == TextTrack::InBand) + break; + case TextTrack::InBand: tracks = &m_inbandTracks; - else + break; + default: ASSERT_NOT_REACHED(); + } - size_t index = tracks->find(track); + size_t index = tracks->find(&track); if (index == notFound) return; invalidateTrackIndexesAfterTrack(textTrack); - ASSERT(!track->mediaElement() || track->mediaElement() == element()); - track->setMediaElement(0); + ASSERT(!track.mediaElement() || !element() || track.mediaElement() == element()); + track.setMediaElement(nullptr); - RefPtr<TrackBase> trackRef = (*tracks)[index]; + Ref<TrackBase> trackRef = *(*tracks)[index]; tracks->remove(index); - scheduleRemoveTrackEvent(trackRef.release()); + + if (scheduleEvent) + scheduleRemoveTrackEvent(WTFMove(trackRef)); } -bool TextTrackList::contains(TrackBase* track) const +bool TextTrackList::contains(TrackBase& track) const { - const Vector<RefPtr<TrackBase>>* tracks = 0; - TextTrack::TextTrackType type = toTextTrack(track)->trackType(); - if (type == TextTrack::TrackElement) + const Vector<RefPtr<TrackBase>>* tracks = nullptr; + switch (downcast<TextTrack>(track).trackType()) { + case TextTrack::TrackElement: tracks = &m_elementTracks; - else if (type == TextTrack::AddTrack) + break; + case TextTrack::AddTrack: tracks = &m_addTrackTracks; - else if (type == TextTrack::InBand) + break; + case TextTrack::InBand: tracks = &m_inbandTracks; - else + break; + default: ASSERT_NOT_REACHED(); + } - return tracks->find(track) != notFound; + return tracks->find(&track) != notFound; } EventTargetInterface TextTrackList::eventTargetInterface() const |