diff options
| author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
|---|---|---|
| committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2016-04-10 09:28:39 +0000 |
| commit | 32761a6cee1d0dee366b885b7b9c777e67885688 (patch) | |
| tree | d6bec92bebfb216f4126356e55518842c2f476a1 /Source/WebCore/html/track/TextTrack.cpp | |
| parent | a4e969f4965059196ca948db781e52f7cfebf19e (diff) | |
| download | WebKitGtk-tarball-32761a6cee1d0dee366b885b7b9c777e67885688.tar.gz | |
webkitgtk-2.4.11webkitgtk-2.4.11
Diffstat (limited to 'Source/WebCore/html/track/TextTrack.cpp')
| -rw-r--r-- | Source/WebCore/html/track/TextTrack.cpp | 168 |
1 files changed, 96 insertions, 72 deletions
diff --git a/Source/WebCore/html/track/TextTrack.cpp b/Source/WebCore/html/track/TextTrack.cpp index 123d16c68..52b57b32c 100644 --- a/Source/WebCore/html/track/TextTrack.cpp +++ b/Source/WebCore/html/track/TextTrack.cpp @@ -1,6 +1,6 @@ /* - * Copyright (C) 2011, 2013 Google Inc. All rights reserved. - * Copyright (C) 2011-2014 Apple Inc. All rights reserved. + * Copyright (C) 2011 Google Inc. All rights reserved. + * Copyright (C) 2011, 2012, 2013 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,8 +40,7 @@ #include "SourceBuffer.h" #include "TextTrackCueList.h" #include "TextTrackList.h" -#include "VTTRegion.h" -#include "VTTRegionList.h" +#include "TextTrackRegionList.h" namespace WebCore { @@ -49,75 +48,77 @@ static const int invalidTrackIndex = -1; const AtomicString& TextTrack::subtitlesKeyword() { - static NeverDestroyed<const AtomicString> subtitles("subtitles", AtomicString::ConstructFromLiteral); + DEFINE_STATIC_LOCAL(const AtomicString, subtitles, ("subtitles", AtomicString::ConstructFromLiteral)); return subtitles; } const AtomicString& TextTrack::captionsKeyword() { - static NeverDestroyed<const AtomicString> captions("captions", AtomicString::ConstructFromLiteral); + DEFINE_STATIC_LOCAL(const AtomicString, captions, ("captions", AtomicString::ConstructFromLiteral)); return captions; } const AtomicString& TextTrack::descriptionsKeyword() { - static NeverDestroyed<const AtomicString> descriptions("descriptions", AtomicString::ConstructFromLiteral); + DEFINE_STATIC_LOCAL(const AtomicString, descriptions, ("descriptions", AtomicString::ConstructFromLiteral)); return descriptions; } const AtomicString& TextTrack::chaptersKeyword() { - static NeverDestroyed<const AtomicString> chapters("chapters", AtomicString::ConstructFromLiteral); + DEFINE_STATIC_LOCAL(const AtomicString, chapters, ("chapters", AtomicString::ConstructFromLiteral)); return chapters; } const AtomicString& TextTrack::metadataKeyword() { - static NeverDestroyed<const AtomicString> metadata("metadata", AtomicString::ConstructFromLiteral); + DEFINE_STATIC_LOCAL(const AtomicString, metadata, ("metadata", AtomicString::ConstructFromLiteral)); return metadata; } const AtomicString& TextTrack::forcedKeyword() { - static NeverDestroyed<const AtomicString> forced("forced", AtomicString::ConstructFromLiteral); + DEFINE_STATIC_LOCAL(const AtomicString, forced, ("forced", AtomicString::ConstructFromLiteral)); return forced; } const AtomicString& TextTrack::disabledKeyword() { - static NeverDestroyed<const AtomicString> open("disabled", AtomicString::ConstructFromLiteral); + DEFINE_STATIC_LOCAL(const AtomicString, open, ("disabled", AtomicString::ConstructFromLiteral)); return open; } const AtomicString& TextTrack::hiddenKeyword() { - static NeverDestroyed<const AtomicString> closed("hidden", AtomicString::ConstructFromLiteral); + DEFINE_STATIC_LOCAL(const AtomicString, closed, ("hidden", AtomicString::ConstructFromLiteral)); return closed; } const AtomicString& TextTrack::showingKeyword() { - static NeverDestroyed<const AtomicString> ended("showing", AtomicString::ConstructFromLiteral); + DEFINE_STATIC_LOCAL(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_regions(0) , m_scriptExecutionContext(context) +#if ENABLE(WEBVTT_REGIONS) + , m_regions(0) +#endif , m_mode(disabledKeyword().string()) , m_client(client) , m_trackType(type) @@ -136,11 +137,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(nullptr); - } - if (m_regions) { + m_cues->item(i)->setTrack(0); +#if ENABLE(WEBVTT_REGIONS) for (size_t i = 0; i < m_regions->length(); ++i) - m_regions->item(i)->setTrack(nullptr); + m_regions->item(i)->setTrack(0); +#endif } clearClient(); } @@ -206,10 +207,11 @@ 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; @@ -218,13 +220,9 @@ 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) { - TextTrackCue* cue = m_cues->item(i); - if (cue->isRenderable()) - toVTTCue(cue)->removeDisplayTree(); - } - } + if (mode != showingKeyword() && m_cues) + for (size_t i = 0; i < m_cues->length(); ++i) + m_cues->item(i)->removeDisplayTree(); m_mode = mode; @@ -241,7 +239,7 @@ TextTrackCueList* TextTrack::cues() // http://www.whatwg.org/specs/web-apps/current-work/#dom-texttrack-cues if (m_mode != disabledKeyword()) return ensureTextTrackCueList(); - return nullptr; + return 0; } void TextTrack::removeAllCues() @@ -253,9 +251,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(nullptr); + m_cues->item(i)->setTrack(0); - m_cues = nullptr; + m_cues = 0; } TextTrackCueList* TextTrack::activeCues() const @@ -268,29 +266,18 @@ 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 nullptr; + return 0; } -void TextTrack::addCue(PassRefPtr<TextTrackCue> prpCue, ExceptionCode& ec) +void TextTrack::addCue(PassRefPtr<TextTrackCue> prpCue) { 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 (!cue->startMediaTime().isValid() || !cue->endMediaTime().isValid() || cue->startMediaTime() < MediaTime::zeroTime() || cue->endMediaTime() < MediaTime::zeroTime()) + if (std::isnan(cue->startTime()) || std::isnan(cue->endTime()) || cue->startTime() < 0 || cue->endTime() < 0) return; // 4.8.10.12.5 Text track API @@ -338,35 +325,41 @@ void TextTrack::removeCue(TextTrackCue* cue, ExceptionCode& ec) m_client->textTrackRemoveCue(this, cue); } -VTTRegionList* TextTrack::ensureVTTRegionList() +#if ENABLE(VIDEO_TRACK) && ENABLE(WEBVTT_REGIONS) +TextTrackRegionList* TextTrack::regionList() +{ + return ensureTextTrackRegionList(); +} + +TextTrackRegionList* TextTrack::ensureTextTrackRegionList() { if (!m_regions) - m_regions = VTTRegionList::create(); + m_regions = TextTrackRegionList::create(); return m_regions.get(); } -VTTRegionList* TextTrack::regions() +TextTrackRegionList* 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 VTTRegionList object that represents + // attribute must return a live TextTrackRegionList 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 ensureVTTRegionList(); + return ensureTextTrackRegionList(); return 0; } -void TextTrack::addRegion(PassRefPtr<VTTRegion> prpRegion) +void TextTrack::addRegion(PassRefPtr<TextTrackRegion> prpRegion) { if (!prpRegion) return; - RefPtr<VTTRegion> region = prpRegion; - VTTRegionList* regionList = ensureVTTRegionList(); + RefPtr<TextTrackRegion> region = prpRegion; + TextTrackRegionList* regionList = ensureTextTrackRegionList(); // 1. If the given region is in a text track list of regions, then remove // region from that text track list of regions. @@ -378,7 +371,7 @@ void TextTrack::addRegion(PassRefPtr<VTTRegion> 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. - VTTRegion* existingRegion = regionList->getRegionById(region->id()); + TextTrackRegion* existingRegion = regionList->getRegionById(region->id()); if (existingRegion) { existingRegion->updateParametersFromRegion(region.get()); return; @@ -390,7 +383,7 @@ void TextTrack::addRegion(PassRefPtr<VTTRegion> prpRegion) regionList->add(region); } -void TextTrack::removeRegion(VTTRegion* region, ExceptionCode &ec) +void TextTrack::removeRegion(TextTrackRegion* region, ExceptionCode &ec) { if (!region) return; @@ -409,6 +402,7 @@ void TextTrack::removeRegion(VTTRegion* region, ExceptionCode &ec) region->setTrack(0); } +#endif void TextTrack::cueWillChange(TextTrackCue* cue) { @@ -479,7 +473,7 @@ int TextTrack::trackIndexRelativeToRenderedTracks() bool TextTrack::hasCue(TextTrackCue* cue, TextTrackCue::CueMatchRules match) { - if (cue->startMediaTime() < MediaTime::zeroTime() || cue->endMediaTime() < MediaTime::zeroTime()) + if (cue->startTime() < 0 || cue->endTime() < 0) return false; if (!m_cues || !m_cues->length()) @@ -501,7 +495,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->hasEquivalentStartTime(*m_cues->item(searchStart - 2))) + while (searchStart >= 2 && cue->startTime() == m_cues->item(searchStart - 2)->startTime()) --searchStart; bool firstCompare = true; @@ -513,20 +507,19 @@ bool TextTrack::hasCue(TextTrackCue* cue, TextTrackCue::CueMatchRules match) return false; existingCue = m_cues->item(searchStart - 1); - if (!existingCue) - return false; - - if (cue->startMediaTime() > (existingCue->startMediaTime() + startTimeVariance())) + if (!existingCue || cue->startTime() > existingCue->startTime()) return false; - if (existingCue->isEqual(*cue, match)) - return true; + if (!existingCue->isEqual(*cue, match)) + continue; + + return true; } } size_t index = (searchStart + searchEnd) / 2; existingCue = m_cues->item(index); - if ((cue->startMediaTime() + startTimeVariance()) < existingCue->startMediaTime() || (match != TextTrackCue::IgnoreDuration && cue->hasEquivalentStartTime(*existingCue) && cue->endMediaTime() > existingCue->endMediaTime())) + if (cue->startTime() < existingCue->startTime() || (match != TextTrackCue::IgnoreDuration && cue->startTime() == existingCue->startTime() && cue->endTime() > existingCue->endTime())) searchEnd = index; else searchStart = index + 1; @@ -536,6 +529,42 @@ 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 @@ -545,11 +574,6 @@ bool TextTrack::isMainProgramContent() const return kind() == captionsKeyword(); } -bool TextTrack::containsOnlyForcedSubtitles() const -{ - return kind() == forcedKeyword(); -} - #if ENABLE(MEDIA_SOURCE) void TextTrack::setLanguage(const AtomicString& language) { |
