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(); |