diff options
Diffstat (limited to 'Source/WebCore/html/track/VideoTrack.cpp')
-rw-r--r-- | Source/WebCore/html/track/VideoTrack.cpp | 157 |
1 files changed, 81 insertions, 76 deletions
diff --git a/Source/WebCore/html/track/VideoTrack.cpp b/Source/WebCore/html/track/VideoTrack.cpp index c0480fee2..f662dae3a 100644 --- a/Source/WebCore/html/track/VideoTrack.cpp +++ b/Source/WebCore/html/track/VideoTrack.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2011 Google Inc. All rights reserved. - * Copyright (C) 2011, 2012, 2013 Apple Inc. All rights reserved. + * Copyright (C) 2011 Google Inc. All rights reserved. + * Copyright (C) 2011-2017 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are @@ -30,12 +30,10 @@ */ #include "config.h" +#include "VideoTrack.h" #if ENABLE(VIDEO_TRACK) -#include "VideoTrack.h" - -#include "Event.h" #include "HTMLMediaElement.h" #include "VideoTrackList.h" @@ -47,97 +45,76 @@ namespace WebCore { const AtomicString& VideoTrack::alternativeKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, alternative, ("alternative", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> alternative("alternative", AtomicString::ConstructFromLiteral); return alternative; } const AtomicString& VideoTrack::captionsKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, captions, ("captions", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> captions("captions", AtomicString::ConstructFromLiteral); return captions; } const AtomicString& VideoTrack::mainKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, captions, ("main", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> captions("main", AtomicString::ConstructFromLiteral); return captions; } const AtomicString& VideoTrack::signKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, sign, ("sign", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> sign("sign", AtomicString::ConstructFromLiteral); return sign; } const AtomicString& VideoTrack::subtitlesKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, subtitles, ("subtitles", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> subtitles("subtitles", AtomicString::ConstructFromLiteral); return subtitles; } const AtomicString& VideoTrack::commentaryKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, commentary, ("commentary", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> commentary("commentary", AtomicString::ConstructFromLiteral); return commentary; } -VideoTrack::VideoTrack(VideoTrackClient* client, PassRefPtr<VideoTrackPrivate> trackPrivate) - : TrackBase(TrackBase::VideoTrack, trackPrivate->id(), trackPrivate->label(), trackPrivate->language()) - , m_selected(trackPrivate->selected()) - , m_client(client) +VideoTrack::VideoTrack(VideoTrackClient& client, VideoTrackPrivate& trackPrivate) + : MediaTrackBase(MediaTrackBase::VideoTrack, trackPrivate.id(), trackPrivate.label(), trackPrivate.language()) + , m_selected(trackPrivate.selected()) + , m_client(&client) , m_private(trackPrivate) { m_private->setClient(this); - - switch (m_private->kind()) { - case VideoTrackPrivate::Alternative: - setKindInternal(VideoTrack::alternativeKeyword()); - break; - case VideoTrackPrivate::Captions: - setKindInternal(VideoTrack::captionsKeyword()); - break; - case VideoTrackPrivate::Main: - setKindInternal(VideoTrack::mainKeyword()); - break; - case VideoTrackPrivate::Sign: - setKindInternal(VideoTrack::signKeyword()); - break; - case VideoTrackPrivate::Subtitles: - setKindInternal(VideoTrack::subtitlesKeyword()); - break; - case VideoTrackPrivate::Commentary: - setKindInternal(VideoTrack::commentaryKeyword()); - break; - case VideoTrackPrivate::None: - setKindInternal(emptyString()); - break; - default: - ASSERT_NOT_REACHED(); - break; - } + updateKindFromPrivate(); } VideoTrack::~VideoTrack() { - m_private->setClient(0); + m_private->setClient(nullptr); } -bool VideoTrack::isValidKind(const AtomicString& value) const +void VideoTrack::setPrivate(VideoTrackPrivate& trackPrivate) { - if (value == alternativeKeyword()) - return true; - if (value == captionsKeyword()) - return true; - if (value == mainKeyword()) - return true; - if (value == signKeyword()) - return true; - if (value == subtitlesKeyword()) - return true; - if (value == commentaryKeyword()) - return true; + if (m_private.ptr() == &trackPrivate) + return; - return false; + m_private->setClient(nullptr); + m_private = trackPrivate; + m_private->setClient(this); + + m_private->setSelected(m_selected); + updateKindFromPrivate(); +} + +bool VideoTrack::isValidKind(const AtomicString& value) const +{ + return value == alternativeKeyword() + || value == commentaryKeyword() + || value == captionsKeyword() + || value == mainKeyword() + || value == signKeyword() + || value == subtitlesKeyword(); } void VideoTrack::setSelected(const bool selected) @@ -149,46 +126,44 @@ void VideoTrack::setSelected(const bool selected) m_private->setSelected(selected); if (m_client) - m_client->videoTrackSelectedChanged(this); + m_client->videoTrackSelectedChanged(*this); } size_t VideoTrack::inbandTrackIndex() { - ASSERT(m_private); return m_private->trackIndex(); } -void VideoTrack::selectedChanged(VideoTrackPrivate* trackPrivate, bool selected) +void VideoTrack::selectedChanged(bool selected) { - ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); setSelected(selected); } -void VideoTrack::idChanged(TrackPrivateBase* trackPrivate, const String& id) +void VideoTrack::idChanged(const AtomicString& id) { - ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); setId(id); } -void VideoTrack::labelChanged(TrackPrivateBase* trackPrivate, const String& label) +void VideoTrack::labelChanged(const AtomicString& label) { - ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); setLabel(label); } -void VideoTrack::languageChanged(TrackPrivateBase* trackPrivate, const String& language) +void VideoTrack::languageChanged(const AtomicString& language) { - ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); setLanguage(language); } -void VideoTrack::willRemove(TrackPrivateBase* trackPrivate) +void VideoTrack::willRemove() { - ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); - mediaElement()->removeVideoTrack(this); + auto* element = mediaElement(); + if (!element) + return; + element->removeVideoTrack(*this); } #if ENABLE(MEDIA_SOURCE) + void VideoTrack::setKind(const AtomicString& kind) { // 10.1 kind, on setting: @@ -203,11 +178,11 @@ void VideoTrack::setKind(const AtomicString& kind) // 3. If the sourceBuffer attribute on this track is not null, then queue a task to fire a simple // event named change at sourceBuffer.videoTracks. if (m_sourceBuffer) - m_sourceBuffer->videoTracks()->scheduleChangeEvent(); + m_sourceBuffer->videoTracks().scheduleChangeEvent(); // 4. Queue a task to fire a simple event named change at the VideoTrackList object referenced by // the videoTracks attribute on the HTMLMediaElement. - mediaElement()->videoTracks()->scheduleChangeEvent(); + mediaElement()->videoTracks().scheduleChangeEvent(); } void VideoTrack::setLanguage(const AtomicString& language) @@ -215,22 +190,52 @@ void VideoTrack::setLanguage(const AtomicString& language) // 10.1 language, on setting: // 1. If the value being assigned to this attribute is not an empty string or a BCP 47 language // tag[BCP47], then abort these steps. - // FIXME(123926): Validate the BCP47-ness of langague. + // BCP 47 validation is done in TrackBase::setLanguage() which is + // shared between all tracks that support setting language. // 2. Update this attribute to the new value. - TrackBase::setLanguage(language); + MediaTrackBase::setLanguage(language); // 3. If the sourceBuffer attribute on this track is not null, then queue a task to fire a simple // event named change at sourceBuffer.videoTracks. if (m_sourceBuffer) - m_sourceBuffer->videoTracks()->scheduleChangeEvent(); + m_sourceBuffer->videoTracks().scheduleChangeEvent(); // 4. Queue a task to fire a simple event named change at the VideoTrackList object referenced by // the videoTracks attribute on the HTMLMediaElement. - mediaElement()->videoTracks()->scheduleChangeEvent(); + mediaElement()->videoTracks().scheduleChangeEvent(); } + #endif +void VideoTrack::updateKindFromPrivate() +{ + switch (m_private->kind()) { + case VideoTrackPrivate::Alternative: + setKindInternal(VideoTrack::alternativeKeyword()); + return; + case VideoTrackPrivate::Captions: + setKindInternal(VideoTrack::captionsKeyword()); + return; + case VideoTrackPrivate::Main: + setKindInternal(VideoTrack::mainKeyword()); + return; + case VideoTrackPrivate::Sign: + setKindInternal(VideoTrack::signKeyword()); + return; + case VideoTrackPrivate::Subtitles: + setKindInternal(VideoTrack::subtitlesKeyword()); + return; + case VideoTrackPrivate::Commentary: + setKindInternal(VideoTrack::commentaryKeyword()); + return; + case VideoTrackPrivate::None: + setKindInternal(emptyString()); + return; + } + ASSERT_NOT_REACHED(); +} + } // namespace WebCore #endif |