diff options
Diffstat (limited to 'Source/WebCore/html/track/InbandTextTrack.cpp')
-rw-r--r-- | Source/WebCore/html/track/InbandTextTrack.cpp | 173 |
1 files changed, 92 insertions, 81 deletions
diff --git a/Source/WebCore/html/track/InbandTextTrack.cpp b/Source/WebCore/html/track/InbandTextTrack.cpp index f8772cbc2..bd65e548a 100644 --- a/Source/WebCore/html/track/InbandTextTrack.cpp +++ b/Source/WebCore/html/track/InbandTextTrack.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012 Apple Inc. All rights reserved. + * Copyright (C) 2012-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 @@ -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 @@ -24,160 +24,171 @@ */ #include "config.h" +#include "InbandTextTrack.h" #if ENABLE(VIDEO_TRACK) -#include "InbandTextTrack.h" - -#include "Document.h" -#include "Event.h" -#include "ExceptionCodePlaceholder.h" #include "HTMLMediaElement.h" +#include "InbandDataTextTrack.h" #include "InbandGenericTextTrack.h" #include "InbandTextTrackPrivate.h" #include "InbandWebVTTTextTrack.h" -#include "Logging.h" -#include "TextTrackCueList.h" -#include <math.h> -#include <wtf/text/CString.h> namespace WebCore { -PassRefPtr<InbandTextTrack> InbandTextTrack::create(ScriptExecutionContext* context, - TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> trackPrivate) +Ref<InbandTextTrack> InbandTextTrack::create(ScriptExecutionContext& context, TextTrackClient& client, InbandTextTrackPrivate& trackPrivate) { - switch (trackPrivate->cueFormat()) { + switch (trackPrivate.cueFormat()) { + case InbandTextTrackPrivate::Data: + return InbandDataTextTrack::create(context, client, trackPrivate); case InbandTextTrackPrivate::Generic: return InbandGenericTextTrack::create(context, client, trackPrivate); case InbandTextTrackPrivate::WebVTT: return InbandWebVTTTextTrack::create(context, client, trackPrivate); - default: - ASSERT_NOT_REACHED(); - return 0; } + ASSERT_NOT_REACHED(); + return InbandDataTextTrack::create(context, client, trackPrivate); } -InbandTextTrack::InbandTextTrack(ScriptExecutionContext* context, TextTrackClient* client, PassRefPtr<InbandTextTrackPrivate> trackPrivate) - : TextTrack(context, client, emptyString(), trackPrivate->id(), trackPrivate->label(), trackPrivate->language(), InBand) +InbandTextTrack::InbandTextTrack(ScriptExecutionContext& context, TextTrackClient& client, InbandTextTrackPrivate& trackPrivate) + : TextTrack(&context, &client, emptyAtom, trackPrivate.id(), trackPrivate.label(), trackPrivate.language(), InBand) , m_private(trackPrivate) { m_private->setClient(this); - - switch (m_private->kind()) { - case InbandTextTrackPrivate::Subtitles: - setKind(TextTrack::subtitlesKeyword()); - break; - case InbandTextTrackPrivate::Captions: - setKind(TextTrack::captionsKeyword()); - break; - case InbandTextTrackPrivate::Descriptions: - setKind(TextTrack::descriptionsKeyword()); - break; - case InbandTextTrackPrivate::Chapters: - setKind(TextTrack::chaptersKeyword()); - break; - case InbandTextTrackPrivate::Metadata: - setKind(TextTrack::metadataKeyword()); - break; - case InbandTextTrackPrivate::Forced: - setKind(TextTrack::forcedKeyword()); - break; - case InbandTextTrackPrivate::None: - default: - ASSERT_NOT_REACHED(); - break; - } + updateKindFromPrivate(); } InbandTextTrack::~InbandTextTrack() { - m_private->setClient(0); + m_private->setClient(nullptr); +} + +void InbandTextTrack::setPrivate(InbandTextTrackPrivate& trackPrivate) +{ + if (m_private.ptr() == &trackPrivate) + return; + + m_private->setClient(nullptr); + m_private = trackPrivate; + m_private->setClient(this); + + setModeInternal(mode()); + updateKindFromPrivate(); } -void InbandTextTrack::setMode(const AtomicString& mode) +void InbandTextTrack::setMode(Mode mode) { TextTrack::setMode(mode); + setModeInternal(mode); +} - if (mode == TextTrack::disabledKeyword()) - m_private->setMode(InbandTextTrackPrivate::Disabled); - else if (mode == TextTrack::hiddenKeyword()) - m_private->setMode(InbandTextTrackPrivate::Hidden); - else if (mode == TextTrack::showingKeyword()) - m_private->setMode(InbandTextTrackPrivate::Showing); - else - ASSERT_NOT_REACHED(); +static inline InbandTextTrackPrivate::Mode toPrivate(TextTrack::Mode mode) +{ + switch (mode) { + case TextTrack::Mode::Disabled: + return InbandTextTrackPrivate::Disabled; + case TextTrack::Mode::Hidden: + return InbandTextTrackPrivate::Hidden; + case TextTrack::Mode::Showing: + return InbandTextTrackPrivate::Showing; + } + ASSERT_NOT_REACHED(); + return InbandTextTrackPrivate::Disabled; } -bool InbandTextTrack::isClosedCaptions() const +void InbandTextTrack::setModeInternal(Mode mode) { - if (!m_private) - return false; + m_private->setMode(toPrivate(mode)); +} +bool InbandTextTrack::isClosedCaptions() const +{ return m_private->isClosedCaptions(); } bool InbandTextTrack::isSDH() const { - if (!m_private) - return false; - return m_private->isSDH(); } bool InbandTextTrack::containsOnlyForcedSubtitles() const { - if (!m_private) - return false; - return m_private->containsOnlyForcedSubtitles(); } bool InbandTextTrack::isMainProgramContent() const { - if (!m_private) - return false; - return m_private->isMainProgramContent(); } bool InbandTextTrack::isEasyToRead() const { - if (!m_private) - return false; - return m_private->isEasyToRead(); } size_t InbandTextTrack::inbandTrackIndex() { - ASSERT(m_private); return m_private->trackIndex(); } -void InbandTextTrack::idChanged(TrackPrivateBase* trackPrivate, const String& id) +AtomicString InbandTextTrack::inBandMetadataTrackDispatchType() const +{ + return m_private->inBandMetadataTrackDispatchType(); +} + +void InbandTextTrack::idChanged(const AtomicString& id) { - ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); setId(id); } -void InbandTextTrack::labelChanged(TrackPrivateBase* trackPrivate, const String& label) +void InbandTextTrack::labelChanged(const AtomicString& label) { - ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); setLabel(label); } -void InbandTextTrack::languageChanged(TrackPrivateBase* trackPrivate, const String& language) +void InbandTextTrack::languageChanged(const AtomicString& language) { - ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); setLanguage(language); } -void InbandTextTrack::willRemove(TrackPrivateBase* trackPrivate) +void InbandTextTrack::willRemove() +{ + auto* element = mediaElement(); + if (!element) + return; + element->removeTextTrack(*this); +} + +void InbandTextTrack::updateKindFromPrivate() { - if (!mediaElement()) + switch (m_private->kind()) { + case InbandTextTrackPrivate::Subtitles: + setKind(Kind::Subtitles); return; - ASSERT_UNUSED(trackPrivate, trackPrivate == m_private); - mediaElement()->removeTextTrack(this); + case InbandTextTrackPrivate::Captions: + setKind(Kind::Captions); + return; + case InbandTextTrackPrivate::Descriptions: + setKind(Kind::Descriptions); + return; + case InbandTextTrackPrivate::Chapters: + setKind(Kind::Chapters); + return; + case InbandTextTrackPrivate::Metadata: + setKind(Kind::Metadata); + return; + case InbandTextTrackPrivate::Forced: + setKind(Kind::Forced); + return; + case InbandTextTrackPrivate::None: + break; + } + ASSERT_NOT_REACHED(); +} + +MediaTime InbandTextTrack::startTimeVariance() const +{ + return m_private->startTimeVariance(); } } // namespace WebCore |