| Index: Source/core/html/track/TextTrackRegion.cpp
|
| diff --git a/Source/core/html/track/TextTrackRegion.cpp b/Source/core/html/track/TextTrackRegion.cpp
|
| deleted file mode 100644
|
| index 8cb26a974558516a0ee574470d005efa57cd612e..0000000000000000000000000000000000000000
|
| --- a/Source/core/html/track/TextTrackRegion.cpp
|
| +++ /dev/null
|
| @@ -1,503 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2013 Google Inc. All rights reserved.
|
| - *
|
| - * Redistribution and use in source and binary forms, with or without
|
| - * modification, are permitted provided that the following conditions are
|
| - * met:
|
| - *
|
| - * * Redistributions of source code must retain the above copyright
|
| - * notice, this list of conditions and the following disclaimer.
|
| - * * Redistributions in binary form must reproduce the above
|
| - * copyright notice, this list of conditions and the following disclaimer
|
| - * in the documentation and/or other materials provided with the
|
| - * distribution.
|
| - * * Neither the name of Google Inc. nor the names of its
|
| - * contributors may be used to endorse or promote products derived from
|
| - * this software without specific prior written permission.
|
| - *
|
| - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| - * "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 THE COPYRIGHT
|
| - * OWNER 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 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| - */
|
| -
|
| -#include "config.h"
|
| -#include "core/html/track/TextTrackRegion.h"
|
| -
|
| -#include "bindings/v8/ExceptionState.h"
|
| -#include "bindings/v8/ExceptionStatePlaceholder.h"
|
| -#include "core/dom/ClientRect.h"
|
| -#include "core/dom/DOMTokenList.h"
|
| -#include "core/html/HTMLDivElement.h"
|
| -#include "core/html/track/WebVTTParser.h"
|
| -#include "platform/Logging.h"
|
| -#include "core/rendering/RenderInline.h"
|
| -#include "core/rendering/RenderObject.h"
|
| -#include "wtf/MathExtras.h"
|
| -#include "wtf/text/StringBuilder.h"
|
| -
|
| -namespace WebCore {
|
| -
|
| -// The following values default values are defined within the WebVTT Regions Spec.
|
| -// https://dvcs.w3.org/hg/text-tracks/raw-file/default/608toVTT/region.html
|
| -
|
| -// The region occupies by default 100% of the width of the video viewport.
|
| -static const float defaultWidth = 100;
|
| -
|
| -// The region has, by default, 3 lines of text.
|
| -static const long defaultHeightInLines = 3;
|
| -
|
| -// The region and viewport are anchored in the bottom left corner.
|
| -static const float defaultAnchorPointX = 0;
|
| -static const float defaultAnchorPointY = 100;
|
| -
|
| -// The region doesn't have scrolling text, by default.
|
| -static const bool defaultScroll = false;
|
| -
|
| -// Default region line-height (vh units)
|
| -static const float lineHeight = 5.33;
|
| -
|
| -// Default scrolling animation time period (s).
|
| -static const float scrollTime = 0.433;
|
| -
|
| -TextTrackRegion::TextTrackRegion()
|
| - : m_id(emptyString())
|
| - , m_width(defaultWidth)
|
| - , m_heightInLines(defaultHeightInLines)
|
| - , m_regionAnchor(FloatPoint(defaultAnchorPointX, defaultAnchorPointY))
|
| - , m_viewportAnchor(FloatPoint(defaultAnchorPointX, defaultAnchorPointY))
|
| - , m_scroll(defaultScroll)
|
| - , m_track(0)
|
| - , m_currentTop(0)
|
| - , m_scrollTimer(this, &TextTrackRegion::scrollTimerFired)
|
| -{
|
| -}
|
| -
|
| -TextTrackRegion::~TextTrackRegion()
|
| -{
|
| -}
|
| -
|
| -void TextTrackRegion::setTrack(TextTrack* track)
|
| -{
|
| - m_track = track;
|
| -}
|
| -
|
| -void TextTrackRegion::setId(const String& id)
|
| -{
|
| - m_id = id;
|
| -}
|
| -
|
| -void TextTrackRegion::setWidth(double value, ExceptionState& es)
|
| -{
|
| - if (std::isinf(value) || std::isnan(value)) {
|
| - es.throwUninformativeAndGenericTypeError();
|
| - return;
|
| - }
|
| -
|
| - if (value < 0 || value > 100) {
|
| - es.throwUninformativeAndGenericDOMException(IndexSizeError);
|
| - return;
|
| - }
|
| -
|
| - m_width = value;
|
| -}
|
| -
|
| -void TextTrackRegion::setHeight(long value, ExceptionState& es)
|
| -{
|
| - if (value < 0) {
|
| - es.throwUninformativeAndGenericDOMException(IndexSizeError);
|
| - return;
|
| - }
|
| -
|
| - m_heightInLines = value;
|
| -}
|
| -
|
| -void TextTrackRegion::setRegionAnchorX(double value, ExceptionState& es)
|
| -{
|
| - if (std::isinf(value) || std::isnan(value)) {
|
| - es.throwUninformativeAndGenericTypeError();
|
| - return;
|
| - }
|
| -
|
| - if (value < 0 || value > 100) {
|
| - es.throwUninformativeAndGenericDOMException(IndexSizeError);
|
| - return;
|
| - }
|
| -
|
| - m_regionAnchor.setX(value);
|
| -}
|
| -
|
| -void TextTrackRegion::setRegionAnchorY(double value, ExceptionState& es)
|
| -{
|
| - if (std::isinf(value) || std::isnan(value)) {
|
| - es.throwUninformativeAndGenericTypeError();
|
| - return;
|
| - }
|
| -
|
| - if (value < 0 || value > 100) {
|
| - es.throwUninformativeAndGenericDOMException(IndexSizeError);
|
| - return;
|
| - }
|
| -
|
| - m_regionAnchor.setY(value);
|
| -}
|
| -
|
| -void TextTrackRegion::setViewportAnchorX(double value, ExceptionState& es)
|
| -{
|
| - if (std::isinf(value) || std::isnan(value)) {
|
| - es.throwUninformativeAndGenericTypeError();
|
| - return;
|
| - }
|
| -
|
| - if (value < 0 || value > 100) {
|
| - es.throwUninformativeAndGenericDOMException(IndexSizeError);
|
| - return;
|
| - }
|
| -
|
| - m_viewportAnchor.setX(value);
|
| -}
|
| -
|
| -void TextTrackRegion::setViewportAnchorY(double value, ExceptionState& es)
|
| -{
|
| - if (std::isinf(value) || std::isnan(value)) {
|
| - es.throwUninformativeAndGenericTypeError();
|
| - return;
|
| - }
|
| -
|
| - if (value < 0 || value > 100) {
|
| - es.throwUninformativeAndGenericDOMException(IndexSizeError);
|
| - return;
|
| - }
|
| -
|
| - m_viewportAnchor.setY(value);
|
| -}
|
| -
|
| -const AtomicString TextTrackRegion::scroll() const
|
| -{
|
| - DEFINE_STATIC_LOCAL(const AtomicString, upScrollValueKeyword, ("up", AtomicString::ConstructFromLiteral));
|
| -
|
| - if (m_scroll)
|
| - return upScrollValueKeyword;
|
| -
|
| - return "";
|
| -}
|
| -
|
| -void TextTrackRegion::setScroll(const AtomicString& value, ExceptionState& es)
|
| -{
|
| - DEFINE_STATIC_LOCAL(const AtomicString, upScrollValueKeyword, ("up", AtomicString::ConstructFromLiteral));
|
| -
|
| - if (value != emptyString() && value != upScrollValueKeyword) {
|
| - es.throwUninformativeAndGenericDOMException(SyntaxError);
|
| - return;
|
| - }
|
| -
|
| - m_scroll = value == upScrollValueKeyword;
|
| -}
|
| -
|
| -void TextTrackRegion::updateParametersFromRegion(TextTrackRegion* region)
|
| -{
|
| - m_heightInLines = region->height();
|
| - m_width = region->width();
|
| -
|
| - m_regionAnchor = FloatPoint(region->regionAnchorX(), region->regionAnchorY());
|
| - m_viewportAnchor = FloatPoint(region->viewportAnchorX(), region->viewportAnchorY());
|
| -
|
| - setScroll(region->scroll(), ASSERT_NO_EXCEPTION);
|
| -}
|
| -
|
| -void TextTrackRegion::setRegionSettings(const String& input)
|
| -{
|
| - m_settings = input;
|
| - unsigned position = 0;
|
| -
|
| - while (position < input.length()) {
|
| - while (position < input.length() && WebVTTParser::isValidSettingDelimiter(input[position]))
|
| - position++;
|
| -
|
| - if (position >= input.length())
|
| - break;
|
| -
|
| - parseSetting(input, &position);
|
| - }
|
| -}
|
| -
|
| -TextTrackRegion::RegionSetting TextTrackRegion::getSettingFromString(const String& setting)
|
| -{
|
| - DEFINE_STATIC_LOCAL(const AtomicString, idKeyword, ("id", AtomicString::ConstructFromLiteral));
|
| - DEFINE_STATIC_LOCAL(const AtomicString, heightKeyword, ("height", AtomicString::ConstructFromLiteral));
|
| - DEFINE_STATIC_LOCAL(const AtomicString, widthKeyword, ("width", AtomicString::ConstructFromLiteral));
|
| - DEFINE_STATIC_LOCAL(const AtomicString, regionAnchorKeyword, ("regionanchor", AtomicString::ConstructFromLiteral));
|
| - DEFINE_STATIC_LOCAL(const AtomicString, viewportAnchorKeyword, ("viewportanchor", AtomicString::ConstructFromLiteral));
|
| - DEFINE_STATIC_LOCAL(const AtomicString, scrollKeyword, ("scroll", AtomicString::ConstructFromLiteral));
|
| -
|
| - if (setting == idKeyword)
|
| - return Id;
|
| - if (setting == heightKeyword)
|
| - return Height;
|
| - if (setting == widthKeyword)
|
| - return Width;
|
| - if (setting == viewportAnchorKeyword)
|
| - return ViewportAnchor;
|
| - if (setting == regionAnchorKeyword)
|
| - return RegionAnchor;
|
| - if (setting == scrollKeyword)
|
| - return Scroll;
|
| -
|
| - return None;
|
| -}
|
| -
|
| -void TextTrackRegion::parseSettingValue(RegionSetting setting, const String& value)
|
| -{
|
| - DEFINE_STATIC_LOCAL(const AtomicString, scrollUpValueKeyword, ("up", AtomicString::ConstructFromLiteral));
|
| -
|
| - bool isValidSetting;
|
| - String numberAsString;
|
| - int number;
|
| - unsigned position;
|
| - FloatPoint anchorPosition;
|
| -
|
| - switch (setting) {
|
| - case Id:
|
| - if (value.find("-->") == kNotFound)
|
| - m_id = value;
|
| - break;
|
| - case Width:
|
| - number = WebVTTParser::parseFloatPercentageValue(value, isValidSetting);
|
| - if (isValidSetting)
|
| - m_width = number;
|
| - else
|
| - LOG(Media, "TextTrackRegion::parseSettingValue, invalid Width");
|
| - break;
|
| - case Height:
|
| - position = 0;
|
| -
|
| - numberAsString = WebVTTParser::collectDigits(value, &position);
|
| - number = value.toInt(&isValidSetting);
|
| -
|
| - if (isValidSetting && number >= 0)
|
| - m_heightInLines = number;
|
| - else
|
| - LOG(Media, "TextTrackRegion::parseSettingValue, invalid Height");
|
| - break;
|
| - case RegionAnchor:
|
| - anchorPosition = WebVTTParser::parseFloatPercentageValuePair(value, ',', isValidSetting);
|
| - if (isValidSetting)
|
| - m_regionAnchor = anchorPosition;
|
| - else
|
| - LOG(Media, "TextTrackRegion::parseSettingValue, invalid RegionAnchor");
|
| - break;
|
| - case ViewportAnchor:
|
| - anchorPosition = WebVTTParser::parseFloatPercentageValuePair(value, ',', isValidSetting);
|
| - if (isValidSetting)
|
| - m_viewportAnchor = anchorPosition;
|
| - else
|
| - LOG(Media, "TextTrackRegion::parseSettingValue, invalid ViewportAnchor");
|
| - break;
|
| - case Scroll:
|
| - if (value == scrollUpValueKeyword)
|
| - m_scroll = true;
|
| - else
|
| - LOG(Media, "TextTrackRegion::parseSettingValue, invalid Scroll");
|
| - break;
|
| - case None:
|
| - break;
|
| - }
|
| -}
|
| -
|
| -void TextTrackRegion::parseSetting(const String& input, unsigned* position)
|
| -{
|
| - String setting = WebVTTParser::collectWord(input, position);
|
| -
|
| - size_t equalOffset = setting.find('=', 1);
|
| - if (equalOffset == kNotFound || !equalOffset || equalOffset == setting.length() - 1)
|
| - return;
|
| -
|
| - RegionSetting name = getSettingFromString(setting.substring(0, equalOffset));
|
| - String value = setting.substring(equalOffset + 1, setting.length() - 1);
|
| -
|
| - parseSettingValue(name, value);
|
| -}
|
| -
|
| -const AtomicString& TextTrackRegion::textTrackCueContainerShadowPseudoId()
|
| -{
|
| - DEFINE_STATIC_LOCAL(const AtomicString, trackRegionCueContainerPseudoId,
|
| - ("-webkit-media-text-track-region-container", AtomicString::ConstructFromLiteral));
|
| -
|
| - return trackRegionCueContainerPseudoId;
|
| -}
|
| -
|
| -const AtomicString& TextTrackRegion::textTrackCueContainerScrollingClass()
|
| -{
|
| - DEFINE_STATIC_LOCAL(const AtomicString, trackRegionCueContainerScrollingClass,
|
| - ("scrolling", AtomicString::ConstructFromLiteral));
|
| -
|
| - return trackRegionCueContainerScrollingClass;
|
| -}
|
| -
|
| -const AtomicString& TextTrackRegion::textTrackRegionShadowPseudoId()
|
| -{
|
| - DEFINE_STATIC_LOCAL(const AtomicString, trackRegionShadowPseudoId,
|
| - ("-webkit-media-text-track-region", AtomicString::ConstructFromLiteral));
|
| -
|
| - return trackRegionShadowPseudoId;
|
| -}
|
| -
|
| -PassRefPtr<HTMLDivElement> TextTrackRegion::getDisplayTree(Document& document)
|
| -{
|
| - if (!m_regionDisplayTree) {
|
| - m_regionDisplayTree = HTMLDivElement::create(document);
|
| - prepareRegionDisplayTree();
|
| - }
|
| -
|
| - return m_regionDisplayTree;
|
| -}
|
| -
|
| -void TextTrackRegion::willRemoveTextTrackCueBox(TextTrackCueBox* box)
|
| -{
|
| - LOG(Media, "TextTrackRegion::willRemoveTextTrackCueBox");
|
| - ASSERT(m_cueContainer->contains(box));
|
| -
|
| - double boxHeight = box->getBoundingClientRect()->bottom() - box->getBoundingClientRect()->top();
|
| -
|
| - m_cueContainer->classList()->remove(textTrackCueContainerScrollingClass(), ASSERT_NO_EXCEPTION);
|
| -
|
| - m_currentTop += boxHeight;
|
| - m_cueContainer->setInlineStyleProperty(CSSPropertyTop, m_currentTop, CSSPrimitiveValue::CSS_PX);
|
| -}
|
| -
|
| -
|
| -void TextTrackRegion::appendTextTrackCueBox(PassRefPtr<TextTrackCueBox> displayBox)
|
| -{
|
| - ASSERT(m_cueContainer);
|
| -
|
| - if (m_cueContainer->contains(displayBox.get()))
|
| - return;
|
| -
|
| - m_cueContainer->appendChild(displayBox);
|
| - displayLastTextTrackCueBox();
|
| -}
|
| -
|
| -void TextTrackRegion::displayLastTextTrackCueBox()
|
| -{
|
| - LOG(Media, "TextTrackRegion::displayLastTextTrackCueBox");
|
| - ASSERT(m_cueContainer);
|
| -
|
| - // FIXME: This should not be causing recalc styles in a loop to set the "top" css
|
| - // property to move elements. We should just scroll the text track cues on the
|
| - // compositor with an animation.
|
| -
|
| - if (m_scrollTimer.isActive())
|
| - return;
|
| -
|
| - // If it's a scrolling region, add the scrolling class.
|
| - if (isScrollingRegion())
|
| - m_cueContainer->classList()->add(textTrackCueContainerScrollingClass(), ASSERT_NO_EXCEPTION);
|
| -
|
| - float regionBottom = m_regionDisplayTree->getBoundingClientRect()->bottom();
|
| -
|
| - // Find first cue that is not entirely displayed and scroll it upwards.
|
| - for (size_t i = 0; i < m_cueContainer->childNodeCount() && !m_scrollTimer.isActive(); ++i) {
|
| - float childTop = toHTMLDivElement(m_cueContainer->childNode(i))->getBoundingClientRect()->top();
|
| - float childBottom = toHTMLDivElement(m_cueContainer->childNode(i))->getBoundingClientRect()->bottom();
|
| -
|
| - if (regionBottom >= childBottom)
|
| - continue;
|
| -
|
| - float height = childBottom - childTop;
|
| -
|
| - m_currentTop -= std::min(height, childBottom - regionBottom);
|
| - m_cueContainer->setInlineStyleProperty(CSSPropertyTop, m_currentTop, CSSPrimitiveValue::CSS_PX);
|
| -
|
| - startTimer();
|
| - }
|
| -}
|
| -
|
| -void TextTrackRegion::prepareRegionDisplayTree()
|
| -{
|
| - ASSERT(m_regionDisplayTree);
|
| -
|
| - // 7.2 Prepare region CSS boxes
|
| -
|
| - // FIXME: Change the code below to use viewport units when
|
| - // http://crbug/244618 is fixed.
|
| -
|
| - // Let regionWidth be the text track region width.
|
| - // Let width be 'regionWidth vw' ('vw' is a CSS unit)
|
| - m_regionDisplayTree->setInlineStyleProperty(CSSPropertyWidth,
|
| - m_width, CSSPrimitiveValue::CSS_PERCENTAGE);
|
| -
|
| - // Let lineHeight be '0.0533vh' ('vh' is a CSS unit) and regionHeight be
|
| - // the text track region height. Let height be 'lineHeight' multiplied
|
| - // by regionHeight.
|
| - double height = lineHeight * m_heightInLines;
|
| - m_regionDisplayTree->setInlineStyleProperty(CSSPropertyHeight,
|
| - height, CSSPrimitiveValue::CSS_VH);
|
| -
|
| - // Let viewportAnchorX be the x dimension of the text track region viewport
|
| - // anchor and regionAnchorX be the x dimension of the text track region
|
| - // anchor. Let leftOffset be regionAnchorX multiplied by width divided by
|
| - // 100.0. Let left be leftOffset subtracted from 'viewportAnchorX vw'.
|
| - double leftOffset = m_regionAnchor.x() * m_width / 100;
|
| - m_regionDisplayTree->setInlineStyleProperty(CSSPropertyLeft,
|
| - m_viewportAnchor.x() - leftOffset,
|
| - CSSPrimitiveValue::CSS_PERCENTAGE);
|
| -
|
| - // Let viewportAnchorY be the y dimension of the text track region viewport
|
| - // anchor and regionAnchorY be the y dimension of the text track region
|
| - // anchor. Let topOffset be regionAnchorY multiplied by height divided by
|
| - // 100.0. Let top be topOffset subtracted from 'viewportAnchorY vh'.
|
| - double topOffset = m_regionAnchor.y() * height / 100;
|
| - m_regionDisplayTree->setInlineStyleProperty(CSSPropertyTop,
|
| - m_viewportAnchor.y() - topOffset,
|
| - CSSPrimitiveValue::CSS_PERCENTAGE);
|
| -
|
| -
|
| - // The cue container is used to wrap the cues and it is the object which is
|
| - // gradually scrolled out as multiple cues are appended to the region.
|
| - m_cueContainer = HTMLDivElement::create(m_regionDisplayTree->document());
|
| - m_cueContainer->setInlineStyleProperty(CSSPropertyTop,
|
| - 0.0,
|
| - CSSPrimitiveValue::CSS_PX);
|
| -
|
| - m_cueContainer->setPart(textTrackCueContainerShadowPseudoId());
|
| - m_regionDisplayTree->appendChild(m_cueContainer);
|
| -
|
| - // 7.5 Every WebVTT region object is initialised with the following CSS
|
| - m_regionDisplayTree->setPart(textTrackRegionShadowPseudoId());
|
| -}
|
| -
|
| -void TextTrackRegion::startTimer()
|
| -{
|
| - LOG(Media, "TextTrackRegion::startTimer");
|
| -
|
| - if (m_scrollTimer.isActive())
|
| - return;
|
| -
|
| - double duration = isScrollingRegion() ? scrollTime : 0;
|
| - m_scrollTimer.startOneShot(duration);
|
| -}
|
| -
|
| -void TextTrackRegion::stopTimer()
|
| -{
|
| - LOG(Media, "TextTrackRegion::stopTimer");
|
| -
|
| - if (m_scrollTimer.isActive())
|
| - m_scrollTimer.stop();
|
| -}
|
| -
|
| -void TextTrackRegion::scrollTimerFired(Timer<TextTrackRegion>*)
|
| -{
|
| - LOG(Media, "TextTrackRegion::scrollTimerFired");
|
| -
|
| - stopTimer();
|
| - displayLastTextTrackCueBox();
|
| -}
|
| -
|
| -} // namespace WebCore
|
|
|