| Index: Source/core/html/track/vtt/VTTCue.cpp
|
| diff --git a/Source/core/html/track/vtt/VTTCue.cpp b/Source/core/html/track/vtt/VTTCue.cpp
|
| index 9ec278a11e52bfbdc4d04b4fc9d5da9e2599ff75..880d6112b102f892821ea7cfda13c3cc96c7fd88 100644
|
| --- a/Source/core/html/track/vtt/VTTCue.cpp
|
| +++ b/Source/core/html/track/vtt/VTTCue.cpp
|
| @@ -224,7 +224,7 @@ VTTCue::VTTCue(Document& document, double startTime, double endTime, const Strin
|
| , m_text(text)
|
| , m_linePosition(std::numeric_limits<float>::quiet_NaN())
|
| , m_computedLinePosition(std::numeric_limits<float>::quiet_NaN())
|
| - , m_textPosition(50)
|
| + , m_textPosition(std::numeric_limits<float>::quiet_NaN())
|
| , m_cueSize(100)
|
| , m_writingDirection(Horizontal)
|
| , m_cueAlignment(Middle)
|
| @@ -361,18 +361,45 @@ void VTTCue::setLine(const DoubleOrAutoKeyword& position, ExceptionState& except
|
| cueDidChange();
|
| }
|
|
|
| -void VTTCue::setPosition(double position, ExceptionState& exceptionState)
|
| +bool VTTCue::textPositionIsAuto() const
|
| {
|
| - // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-texttrackcue-position
|
| - // On setting, if the new value is negative or greater than 100, then throw an IndexSizeError exception.
|
| - // Otherwise, set the text track cue text position to the new value.
|
| - if (isInvalidPercentage(position, exceptionState))
|
| - return;
|
| + return std::isnan(m_textPosition);
|
| +}
|
|
|
| - // Otherwise, set the text track cue line position to the new value.
|
| - float floatPosition = narrowPrecisionToFloat(position);
|
| - if (m_textPosition == floatPosition)
|
| +void VTTCue::position(DoubleOrAutoKeyword& result) const
|
| +{
|
| + if (textPositionIsAuto())
|
| + result.setAutoKeyword(autoKeyword());
|
| + else
|
| + result.setDouble(m_textPosition);
|
| +}
|
| +
|
| +void VTTCue::setPosition(const DoubleOrAutoKeyword& position, ExceptionState& exceptionState)
|
| +{
|
| + // FIXME: Expecting bindings code to handle this case: https://crbug.com/450252.
|
| + if (position.isDouble() && !std::isfinite(position.getAsDouble())) {
|
| + exceptionState.throwTypeError("The provided double value is non-finite.");
|
| return;
|
| + }
|
| +
|
| + // http://dev.w3.org/html5/webvtt/#dfn-vttcue-position
|
| + // On setting, if the new value is negative or greater than 100, then an
|
| + // IndexSizeError exception must be thrown. Otherwise, the text track cue
|
| + // text position must be set to the new value; if the new value is the
|
| + // string "auto", then it must be interpreted as the special value auto.
|
| + float floatPosition;
|
| + if (position.isAutoKeyword()) {
|
| + if (textPositionIsAuto())
|
| + return;
|
| + floatPosition = std::numeric_limits<float>::quiet_NaN();
|
| + } else {
|
| + ASSERT(position.isDouble());
|
| + if (isInvalidPercentage(position.getAsDouble(), exceptionState))
|
| + return;
|
| + floatPosition = narrowPrecisionToFloat(position.getAsDouble());
|
| + if (m_textPosition == floatPosition)
|
| + return;
|
| + }
|
|
|
| cueWillChange();
|
| m_textPosition = floatPosition;
|
| @@ -604,6 +631,34 @@ static CSSValueID determineTextDirection(DocumentFragment* vttRoot)
|
| return isLeftToRightDirection(textDirection) ? CSSValueLtr : CSSValueRtl;
|
| }
|
|
|
| +float VTTCue::calculateComputedTextPosition() const
|
| +{
|
| + // http://dev.w3.org/html5/webvtt/#dfn-text-track-cue-computed-text-position
|
| +
|
| + // 1. If the text track cue text position is numeric, then return the value
|
| + // of the text track cue text position and abort these steps. (Otherwise,
|
| + // the text track cue text position is the special value auto.)
|
| + if (!textPositionIsAuto())
|
| + return m_textPosition;
|
| +
|
| + switch (m_cueAlignment) {
|
| + // 2. If the text track cue text alignment is start or left, return 0 and abort these steps.
|
| + case Start:
|
| + case Left:
|
| + return 0;
|
| + // 3. If the text track cue text alignment is end or right, return 100 and abort these steps.
|
| + case End:
|
| + case Right:
|
| + return 100;
|
| + // 4. If the text track cue text alignment is middle, return 50 and abort these steps.
|
| + case Middle:
|
| + return 50;
|
| + default:
|
| + ASSERT_NOT_REACHED();
|
| + return 0;
|
| + }
|
| +}
|
| +
|
| static inline VTTCue::CueAlignment resolveCueAlignment(VTTCue::CueAlignment specifiedCueAlignment, CSSValueID direction)
|
| {
|
| ASSERT(direction == CSSValueLtr || direction == CSSValueRtl);
|
| @@ -637,21 +692,22 @@ void VTTCue::calculateDisplayParameters()
|
|
|
| // 10.5 Determine the value of maximum size for cue as per the appropriate
|
| // rules from the following list:
|
| - float maximumSize = m_textPosition;
|
| + float computedTextPosition = calculateComputedTextPosition();
|
| + float maximumSize = computedTextPosition;
|
| if ((m_writingDirection == Horizontal && m_cueAlignment == Start && m_displayDirection == CSSValueLtr)
|
| || (m_writingDirection == Horizontal && m_cueAlignment == End && m_displayDirection == CSSValueRtl)
|
| || (m_writingDirection == Horizontal && m_cueAlignment == Left)
|
| || (m_writingDirection == VerticalGrowingLeft && (m_cueAlignment == Start || m_cueAlignment == Left))
|
| || (m_writingDirection == VerticalGrowingRight && (m_cueAlignment == Start || m_cueAlignment == Left))) {
|
| - maximumSize = 100 - m_textPosition;
|
| + maximumSize = 100 - computedTextPosition;
|
| } else if ((m_writingDirection == Horizontal && m_cueAlignment == End && m_displayDirection == CSSValueLtr)
|
| || (m_writingDirection == Horizontal && m_cueAlignment == Start && m_displayDirection == CSSValueRtl)
|
| || (m_writingDirection == Horizontal && m_cueAlignment == Right)
|
| || (m_writingDirection == VerticalGrowingLeft && (m_cueAlignment == End || m_cueAlignment == Right))
|
| || (m_writingDirection == VerticalGrowingRight && (m_cueAlignment == End || m_cueAlignment == Right))) {
|
| - maximumSize = m_textPosition;
|
| + maximumSize = computedTextPosition;
|
| } else if (m_cueAlignment == Middle) {
|
| - maximumSize = m_textPosition <= 50 ? m_textPosition : (100 - m_textPosition);
|
| + maximumSize = computedTextPosition <= 50 ? computedTextPosition : (100 - computedTextPosition);
|
| maximumSize = maximumSize * 2;
|
| } else {
|
| ASSERT_NOT_REACHED();
|
| @@ -667,7 +723,7 @@ void VTTCue::calculateDisplayParameters()
|
| // 10.8 Determine the value of x-position or y-position for cue as per the
|
| // appropriate rules from the following list:
|
| if (m_writingDirection == Horizontal) {
|
| - float visualTextPosition = m_displayDirection == CSSValueLtr ? m_textPosition : 100 - m_textPosition;
|
| + float visualTextPosition = m_displayDirection == CSSValueLtr ? computedTextPosition : 100 - computedTextPosition;
|
|
|
| switch (resolveCueAlignment(m_cueAlignment, m_displayDirection)) {
|
| case Left:
|
| @@ -687,14 +743,14 @@ void VTTCue::calculateDisplayParameters()
|
| switch (m_cueAlignment) {
|
| case Start:
|
| case Left:
|
| - m_displayPosition.setY(m_textPosition);
|
| + m_displayPosition.setY(computedTextPosition);
|
| break;
|
| case End:
|
| case Right:
|
| - m_displayPosition.setY(m_textPosition - m_displaySize);
|
| + m_displayPosition.setY(computedTextPosition - m_displaySize);
|
| break;
|
| case Middle:
|
| - m_displayPosition.setY(m_textPosition - m_displaySize / 2);
|
| + m_displayPosition.setY(computedTextPosition - m_displaySize / 2);
|
| break;
|
| default:
|
| ASSERT_NOT_REACHED();
|
| @@ -836,7 +892,7 @@ void VTTCue::updateDisplay(const IntSize& videoSize, HTMLDivElement& container)
|
| if (!lineIsAuto())
|
| UseCounter::count(document(), UseCounter::VTTCueRenderLineNotAuto);
|
|
|
| - if (m_textPosition != 50)
|
| + if (textPositionIsAuto())
|
| UseCounter::count(document(), UseCounter::VTTCueRenderPositionNot50);
|
|
|
| if (m_cueSize != 100)
|
| @@ -875,18 +931,19 @@ FloatPoint VTTCue::getPositionCoordinates() const
|
| {
|
| // This method is used for setting x and y when snap to lines is not set.
|
| ASSERT(std::isfinite(m_computedLinePosition));
|
| + float computedTextPosition = calculateComputedTextPosition();
|
|
|
| if (m_writingDirection == Horizontal && m_displayDirection == CSSValueLtr)
|
| - return FloatPoint(m_textPosition, m_computedLinePosition);
|
| + return FloatPoint(computedTextPosition, m_computedLinePosition);
|
|
|
| if (m_writingDirection == Horizontal && m_displayDirection == CSSValueRtl)
|
| - return FloatPoint(100 - m_textPosition, m_computedLinePosition);
|
| + return FloatPoint(100 - computedTextPosition, m_computedLinePosition);
|
|
|
| if (m_writingDirection == VerticalGrowingLeft)
|
| - return FloatPoint(100 - m_computedLinePosition, m_textPosition);
|
| + return FloatPoint(100 - m_computedLinePosition, computedTextPosition);
|
|
|
| if (m_writingDirection == VerticalGrowingRight)
|
| - return FloatPoint(m_computedLinePosition, m_textPosition);
|
| + return FloatPoint(m_computedLinePosition, computedTextPosition);
|
|
|
| ASSERT_NOT_REACHED();
|
| return FloatPoint();
|
|
|