diff options
| author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-05-24 08:28:08 +0000 |
|---|---|---|
| committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-05-24 08:28:08 +0000 |
| commit | a4e969f4965059196ca948db781e52f7cfebf19e (patch) | |
| tree | 6ca352808c8fdc52006a0f33f6ae3c593b23867d /Source/WebCore/html/track/TextTrack.cpp | |
| parent | 41386e9cb918eed93b3f13648cbef387e371e451 (diff) | |
| download | WebKitGtk-tarball-a4e969f4965059196ca948db781e52f7cfebf19e.tar.gz | |
webkitgtk-2.12.3webkitgtk-2.12.3
Diffstat (limited to 'Source/WebCore/html/track/TextTrack.cpp')
| -rw-r--r-- | Source/WebCore/html/track/TextTrack.cpp | 168 |
1 files changed, 72 insertions, 96 deletions
diff --git a/Source/WebCore/html/track/TextTrack.cpp b/Source/WebCore/html/track/TextTrack.cpp index 52b57b32c..123d16c68 100644 --- a/Source/WebCore/html/track/TextTrack.cpp +++ b/Source/WebCore/html/track/TextTrack.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, 2013 Google Inc. All rights reserved. + * Copyright (C) 2011-2014 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 @@ -40,7 +40,8 @@ #include "SourceBuffer.h" #include "TextTrackCueList.h" #include "TextTrackList.h" -#include "TextTrackRegionList.h" +#include "VTTRegion.h" +#include "VTTRegionList.h" namespace WebCore { @@ -48,77 +49,75 @@ static const int invalidTrackIndex = -1; const AtomicString& TextTrack::subtitlesKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, subtitles, ("subtitles", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> subtitles("subtitles", AtomicString::ConstructFromLiteral); return subtitles; } const AtomicString& TextTrack::captionsKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, captions, ("captions", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> captions("captions", AtomicString::ConstructFromLiteral); return captions; } const AtomicString& TextTrack::descriptionsKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, descriptions, ("descriptions", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> descriptions("descriptions", AtomicString::ConstructFromLiteral); return descriptions; } const AtomicString& TextTrack::chaptersKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, chapters, ("chapters", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> chapters("chapters", AtomicString::ConstructFromLiteral); return chapters; } const AtomicString& TextTrack::metadataKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, metadata, ("metadata", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> metadata("metadata", AtomicString::ConstructFromLiteral); return metadata; } const AtomicString& TextTrack::forcedKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, forced, ("forced", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> forced("forced", AtomicString::ConstructFromLiteral); return forced; } const AtomicString& TextTrack::disabledKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, open, ("disabled", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> open("disabled", AtomicString::ConstructFromLiteral); return open; } const AtomicString& TextTrack::hiddenKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, closed, ("hidden", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> closed("hidden", AtomicString::ConstructFromLiteral); return closed; } const AtomicString& TextTrack::showingKeyword() { - DEFINE_STATIC_LOCAL(const AtomicString, ended, ("showing", AtomicString::ConstructFromLiteral)); + static NeverDestroyed<const AtomicString> ended("showing", AtomicString::ConstructFromLiteral); return ended; } TextTrack* TextTrack::captionMenuOffItem() { - static TextTrack* off = TextTrack::create(0, 0, "off menu item", "", "", "").leakRef(); - return off; + static TextTrack& off = TextTrack::create(0, 0, "off menu item", "", "", "").leakRef(); + return &off; } TextTrack* TextTrack::captionMenuAutomaticItem() { - static TextTrack* automatic = TextTrack::create(0, 0, "automatic menu item", "", "", "").leakRef(); - return automatic; + static TextTrack& automatic = TextTrack::create(0, 0, "automatic menu item", "", "", "").leakRef(); + return &automatic; } TextTrack::TextTrack(ScriptExecutionContext* context, TextTrackClient* client, const AtomicString& kind, const AtomicString& id, const AtomicString& label, const AtomicString& language, TextTrackType type) : TrackBase(TrackBase::TextTrack, id, label, language) , m_cues(0) - , m_scriptExecutionContext(context) -#if ENABLE(WEBVTT_REGIONS) , m_regions(0) -#endif + , m_scriptExecutionContext(context) , m_mode(disabledKeyword().string()) , m_client(client) , m_trackType(type) @@ -137,11 +136,11 @@ TextTrack::~TextTrack() m_client->textTrackRemoveCues(this, m_cues.get()); for (size_t i = 0; i < m_cues->length(); ++i) - m_cues->item(i)->setTrack(0); -#if ENABLE(WEBVTT_REGIONS) + m_cues->item(i)->setTrack(nullptr); + } + if (m_regions) { for (size_t i = 0; i < m_regions->length(); ++i) - m_regions->item(i)->setTrack(0); -#endif + m_regions->item(i)->setTrack(nullptr); } clearClient(); } @@ -207,11 +206,10 @@ void TextTrack::setKind(const AtomicString& newKind) void TextTrack::setMode(const AtomicString& mode) { + ASSERT(mode == disabledKeyword() || mode == hiddenKeyword() || mode == showingKeyword()); + // On setting, if the new value isn't equal to what the attribute would currently // return, the new value must be processed as follows ... - if (mode != disabledKeyword() && mode != hiddenKeyword() && mode != showingKeyword()) - return; - if (m_mode == mode) return; @@ -220,9 +218,13 @@ void TextTrack::setMode(const AtomicString& mode) if (mode == disabledKeyword() && m_client && m_cues) m_client->textTrackRemoveCues(this, m_cues.get()); - if (mode != showingKeyword() && m_cues) - for (size_t i = 0; i < m_cues->length(); ++i) - m_cues->item(i)->removeDisplayTree(); + if (mode != showingKeyword() && m_cues) { + for (size_t i = 0; i < m_cues->length(); ++i) { + TextTrackCue* cue = m_cues->item(i); + if (cue->isRenderable()) + toVTTCue(cue)->removeDisplayTree(); + } + } m_mode = mode; @@ -239,7 +241,7 @@ TextTrackCueList* TextTrack::cues() // http://www.whatwg.org/specs/web-apps/current-work/#dom-texttrack-cues if (m_mode != disabledKeyword()) return ensureTextTrackCueList(); - return 0; + return nullptr; } void TextTrack::removeAllCues() @@ -251,9 +253,9 @@ void TextTrack::removeAllCues() m_client->textTrackRemoveCues(this, m_cues.get()); for (size_t i = 0; i < m_cues->length(); ++i) - m_cues->item(i)->setTrack(0); + m_cues->item(i)->setTrack(nullptr); - m_cues = 0; + m_cues = nullptr; } TextTrackCueList* TextTrack::activeCues() const @@ -266,18 +268,29 @@ TextTrackCueList* TextTrack::activeCues() const // http://www.whatwg.org/specs/web-apps/current-work/#dom-texttrack-activecues if (m_cues && m_mode != disabledKeyword()) return m_cues->activeCues(); - return 0; + return nullptr; } -void TextTrack::addCue(PassRefPtr<TextTrackCue> prpCue) +void TextTrack::addCue(PassRefPtr<TextTrackCue> prpCue, ExceptionCode& ec) { if (!prpCue) return; RefPtr<TextTrackCue> cue = prpCue; + // 4.7.10.12.6 Text tracks exposing in-band metadata + // The UA will use DataCue to expose only text track cue objects that belong to a text track that has a text + // track kind of metadata. + // If a DataCue is added to a TextTrack via the addCue() method but the text track does not have its text + // track kind set to metadata, throw a InvalidNodeTypeError exception and don't add the cue to the TextTrackList + // of the TextTrack. + if (cue->cueType() == TextTrackCue::Data && kind() != metadataKeyword()) { + ec = INVALID_NODE_TYPE_ERR; + return; + } + // TODO(93143): Add spec-compliant behavior for negative time values. - if (std::isnan(cue->startTime()) || std::isnan(cue->endTime()) || cue->startTime() < 0 || cue->endTime() < 0) + if (!cue->startMediaTime().isValid() || !cue->endMediaTime().isValid() || cue->startMediaTime() < MediaTime::zeroTime() || cue->endMediaTime() < MediaTime::zeroTime()) return; // 4.8.10.12.5 Text track API @@ -325,41 +338,35 @@ void TextTrack::removeCue(TextTrackCue* cue, ExceptionCode& ec) m_client->textTrackRemoveCue(this, cue); } -#if ENABLE(VIDEO_TRACK) && ENABLE(WEBVTT_REGIONS) -TextTrackRegionList* TextTrack::regionList() -{ - return ensureTextTrackRegionList(); -} - -TextTrackRegionList* TextTrack::ensureTextTrackRegionList() +VTTRegionList* TextTrack::ensureVTTRegionList() { if (!m_regions) - m_regions = TextTrackRegionList::create(); + m_regions = VTTRegionList::create(); return m_regions.get(); } -TextTrackRegionList* TextTrack::regions() +VTTRegionList* TextTrack::regions() { // If the text track mode of the text track that the TextTrack object // represents is not the text track disabled mode, then the regions - // attribute must return a live TextTrackRegionList object that represents + // attribute must return a live VTTRegionList object that represents // the text track list of regions of the text track. Otherwise, it must // return null. When an object is returned, the same object must be returned // each time. if (m_mode != disabledKeyword()) - return ensureTextTrackRegionList(); + return ensureVTTRegionList(); return 0; } -void TextTrack::addRegion(PassRefPtr<TextTrackRegion> prpRegion) +void TextTrack::addRegion(PassRefPtr<VTTRegion> prpRegion) { if (!prpRegion) return; - RefPtr<TextTrackRegion> region = prpRegion; - TextTrackRegionList* regionList = ensureTextTrackRegionList(); + RefPtr<VTTRegion> region = prpRegion; + VTTRegionList* regionList = ensureVTTRegionList(); // 1. If the given region is in a text track list of regions, then remove // region from that text track list of regions. @@ -371,7 +378,7 @@ void TextTrack::addRegion(PassRefPtr<TextTrackRegion> prpRegion) // a region with the same identifier as region replace the values of that // region's width, height, anchor point, viewport anchor point and scroll // attributes with those of region. - TextTrackRegion* existingRegion = regionList->getRegionById(region->id()); + VTTRegion* existingRegion = regionList->getRegionById(region->id()); if (existingRegion) { existingRegion->updateParametersFromRegion(region.get()); return; @@ -383,7 +390,7 @@ void TextTrack::addRegion(PassRefPtr<TextTrackRegion> prpRegion) regionList->add(region); } -void TextTrack::removeRegion(TextTrackRegion* region, ExceptionCode &ec) +void TextTrack::removeRegion(VTTRegion* region, ExceptionCode &ec) { if (!region) return; @@ -402,7 +409,6 @@ void TextTrack::removeRegion(TextTrackRegion* region, ExceptionCode &ec) region->setTrack(0); } -#endif void TextTrack::cueWillChange(TextTrackCue* cue) { @@ -473,7 +479,7 @@ int TextTrack::trackIndexRelativeToRenderedTracks() bool TextTrack::hasCue(TextTrackCue* cue, TextTrackCue::CueMatchRules match) { - if (cue->startTime() < 0 || cue->endTime() < 0) + if (cue->startMediaTime() < MediaTime::zeroTime() || cue->endMediaTime() < MediaTime::zeroTime()) return false; if (!m_cues || !m_cues->length()) @@ -495,7 +501,7 @@ bool TextTrack::hasCue(TextTrackCue* cue, TextTrackCue::CueMatchRules match) // If there is more than one cue with the same start time, back up to first one so we // consider all of them. - while (searchStart >= 2 && cue->startTime() == m_cues->item(searchStart - 2)->startTime()) + while (searchStart >= 2 && cue->hasEquivalentStartTime(*m_cues->item(searchStart - 2))) --searchStart; bool firstCompare = true; @@ -507,19 +513,20 @@ bool TextTrack::hasCue(TextTrackCue* cue, TextTrackCue::CueMatchRules match) return false; existingCue = m_cues->item(searchStart - 1); - if (!existingCue || cue->startTime() > existingCue->startTime()) + if (!existingCue) + return false; + + if (cue->startMediaTime() > (existingCue->startMediaTime() + startTimeVariance())) return false; - if (!existingCue->isEqual(*cue, match)) - continue; - - return true; + if (existingCue->isEqual(*cue, match)) + return true; } } size_t index = (searchStart + searchEnd) / 2; existingCue = m_cues->item(index); - if (cue->startTime() < existingCue->startTime() || (match != TextTrackCue::IgnoreDuration && cue->startTime() == existingCue->startTime() && cue->endTime() > existingCue->endTime())) + if ((cue->startMediaTime() + startTimeVariance()) < existingCue->startMediaTime() || (match != TextTrackCue::IgnoreDuration && cue->hasEquivalentStartTime(*existingCue) && cue->endMediaTime() > existingCue->endMediaTime())) searchEnd = index; else searchStart = index + 1; @@ -529,42 +536,6 @@ bool TextTrack::hasCue(TextTrackCue* cue, TextTrackCue::CueMatchRules match) return false; } -#if USE(PLATFORM_TEXT_TRACK_MENU) -PassRefPtr<PlatformTextTrack> TextTrack::platformTextTrack() -{ - static int uniqueId = 0; - - if (m_platformTextTrack) - return m_platformTextTrack; - - PlatformTextTrack::TrackKind platformKind = PlatformTextTrack::Caption; - if (kind() == subtitlesKeyword()) - platformKind = PlatformTextTrack::Subtitle; - else if (kind() == captionsKeyword()) - platformKind = PlatformTextTrack::Caption; - else if (kind() == descriptionsKeyword()) - platformKind = PlatformTextTrack::Description; - else if (kind() == chaptersKeyword()) - platformKind = PlatformTextTrack::Chapter; - else if (kind() == metadataKeyword()) - platformKind = PlatformTextTrack::MetaData; - else if (kind() == forcedKeyword()) - platformKind = PlatformTextTrack::Forced; - - PlatformTextTrack::TrackType type = PlatformTextTrack::OutOfBand; - if (m_trackType == TrackElement) - type = PlatformTextTrack::OutOfBand; - else if (m_trackType == AddTrack) - type = PlatformTextTrack::Script; - else if (m_trackType == InBand) - type = PlatformTextTrack::InBand; - - m_platformTextTrack = PlatformTextTrack::create(this, label(), language(), platformKind, type, ++uniqueId); - - return m_platformTextTrack; -} -#endif - bool TextTrack::isMainProgramContent() const { // "Main program" content is intrinsic to the presentation of the media file, regardless of locale. Content such as @@ -574,6 +545,11 @@ bool TextTrack::isMainProgramContent() const return kind() == captionsKeyword(); } +bool TextTrack::containsOnlyForcedSubtitles() const +{ + return kind() == forcedKeyword(); +} + #if ENABLE(MEDIA_SOURCE) void TextTrack::setLanguage(const AtomicString& language) { |
