diff options
| author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-05-20 09:56:07 +0000 |
|---|---|---|
| committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-05-20 09:56:07 +0000 |
| commit | 41386e9cb918eed93b3f13648cbef387e371e451 (patch) | |
| tree | a97f9d7bd1d9d091833286085f72da9d83fd0606 /Source/WebCore/html/track/TextTrack.cpp | |
| parent | e15dd966d523731101f70ccf768bba12435a0208 (diff) | |
| download | WebKitGtk-tarball-41386e9cb918eed93b3f13648cbef387e371e451.tar.gz | |
webkitgtk-2.4.9webkitgtk-2.4.9
Diffstat (limited to 'Source/WebCore/html/track/TextTrack.cpp')
| -rw-r--r-- | Source/WebCore/html/track/TextTrack.cpp | 133 |
1 files changed, 57 insertions, 76 deletions
diff --git a/Source/WebCore/html/track/TextTrack.cpp b/Source/WebCore/html/track/TextTrack.cpp index 2a133a5fc..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,77 +48,77 @@ static const int invalidTrackIndex = -1; const AtomicString& TextTrack::subtitlesKeyword() { - DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, subtitles, ("subtitles", AtomicString::ConstructFromLiteral)); + DEFINE_STATIC_LOCAL(const AtomicString, subtitles, ("subtitles", AtomicString::ConstructFromLiteral)); return subtitles; } const AtomicString& TextTrack::captionsKeyword() { - DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, captions, ("captions", AtomicString::ConstructFromLiteral)); + DEFINE_STATIC_LOCAL(const AtomicString, captions, ("captions", AtomicString::ConstructFromLiteral)); return captions; } const AtomicString& TextTrack::descriptionsKeyword() { - DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, descriptions, ("descriptions", AtomicString::ConstructFromLiteral)); + DEFINE_STATIC_LOCAL(const AtomicString, descriptions, ("descriptions", AtomicString::ConstructFromLiteral)); return descriptions; } const AtomicString& TextTrack::chaptersKeyword() { - DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, chapters, ("chapters", AtomicString::ConstructFromLiteral)); + DEFINE_STATIC_LOCAL(const AtomicString, chapters, ("chapters", AtomicString::ConstructFromLiteral)); return chapters; } const AtomicString& TextTrack::metadataKeyword() { - DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, metadata, ("metadata", AtomicString::ConstructFromLiteral)); + DEFINE_STATIC_LOCAL(const AtomicString, metadata, ("metadata", AtomicString::ConstructFromLiteral)); return metadata; } const AtomicString& TextTrack::forcedKeyword() { - DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, forced, ("forced", AtomicString::ConstructFromLiteral)); + DEFINE_STATIC_LOCAL(const AtomicString, forced, ("forced", AtomicString::ConstructFromLiteral)); return forced; } const AtomicString& TextTrack::disabledKeyword() { - DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, open, ("disabled", AtomicString::ConstructFromLiteral)); + DEFINE_STATIC_LOCAL(const AtomicString, open, ("disabled", AtomicString::ConstructFromLiteral)); return open; } const AtomicString& TextTrack::hiddenKeyword() { - DEPRECATED_DEFINE_STATIC_LOCAL(const AtomicString, closed, ("hidden", AtomicString::ConstructFromLiteral)); + DEFINE_STATIC_LOCAL(const AtomicString, closed, ("hidden", AtomicString::ConstructFromLiteral)); return closed; } const AtomicString& TextTrack::showingKeyword() { - DEPRECATED_DEFINE_STATIC_LOCAL(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_scriptExecutionContext(context) #if ENABLE(WEBVTT_REGIONS) , m_regions(0) #endif - , m_scriptExecutionContext(context) , m_mode(disabledKeyword().string()) , m_client(client) , m_trackType(type) @@ -140,10 +139,8 @@ TextTrack::~TextTrack() for (size_t i = 0; i < m_cues->length(); ++i) m_cues->item(i)->setTrack(0); #if ENABLE(WEBVTT_REGIONS) - if (m_regions) { - for (size_t i = 0; i < m_regions->length(); ++i) - m_regions->item(i)->setTrack(0); - } + for (size_t i = 0; i < m_regions->length(); ++i) + m_regions->item(i)->setTrack(0); #endif } clearClient(); @@ -210,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; @@ -222,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; @@ -245,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() @@ -257,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 @@ -272,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 @@ -343,35 +326,40 @@ void TextTrack::removeCue(TextTrackCue* cue, ExceptionCode& ec) } #if ENABLE(VIDEO_TRACK) && ENABLE(WEBVTT_REGIONS) -VTTRegionList* TextTrack::ensureVTTRegionList() +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. @@ -383,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; @@ -395,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; @@ -485,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()) @@ -507,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; @@ -519,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; @@ -545,6 +532,8 @@ bool TextTrack::hasCue(TextTrackCue* cue, TextTrackCue::CueMatchRules match) #if USE(PLATFORM_TEXT_TRACK_MENU) PassRefPtr<PlatformTextTrack> TextTrack::platformTextTrack() { + static int uniqueId = 0; + if (m_platformTextTrack) return m_platformTextTrack; @@ -570,15 +559,7 @@ PassRefPtr<PlatformTextTrack> TextTrack::platformTextTrack() else if (m_trackType == InBand) type = PlatformTextTrack::InBand; - PlatformTextTrack::TrackMode platformMode = PlatformTextTrack::Disabled; - if (TextTrack::hiddenKeyword() == mode()) - platformMode = PlatformTextTrack::Hidden; - else if (TextTrack::disabledKeyword() == mode()) - platformMode = PlatformTextTrack::Disabled; - else if (TextTrack::showingKeyword() == mode()) - platformMode = PlatformTextTrack::Showing; - - m_platformTextTrack = PlatformTextTrack::create(this, label(), language(), platformMode, platformKind, type, uniqueId()); + m_platformTextTrack = PlatformTextTrack::create(this, label(), language(), platformKind, type, ++uniqueId); return m_platformTextTrack; } |
