| Index: Source/core/html/track/TextTrackCue.cpp
|
| diff --git a/Source/core/html/track/TextTrackCue.cpp b/Source/core/html/track/TextTrackCue.cpp
|
| index f80d78cbc5f8fc8bff2c3be130ea49516817f4c0..75354569d7cfd3132cf359859d274433629cdc52 100644
|
| --- a/Source/core/html/track/TextTrackCue.cpp
|
| +++ b/Source/core/html/track/TextTrackCue.cpp
|
| @@ -55,6 +55,18 @@ static const int invalidCueIndex = -1;
|
| static const int undefinedPosition = -1;
|
| static const int autoSize = 0;
|
|
|
| +static const CSSValueID displayWritingModeMap[] = {
|
| + CSSValueHorizontalTb, CSSValueVerticalRl, CSSValueVerticalLr
|
| +};
|
| +COMPILE_ASSERT(WTF_ARRAY_LENGTH(displayWritingModeMap) == TextTrackCue::NumberOfWritingDirections,
|
| + displayWritingModeMap_has_wrong_size);
|
| +
|
| +static const CSSValueID displayAlignmentMap[] = {
|
| + CSSValueStart, CSSValueCenter, CSSValueEnd, CSSValueLeft, CSSValueRight
|
| +};
|
| +COMPILE_ASSERT(WTF_ARRAY_LENGTH(displayAlignmentMap) == TextTrackCue::NumberOfAlignments,
|
| + displayAlignmentMap_has_wrong_size);
|
| +
|
| static const String& startKeyword()
|
| {
|
| DEFINE_STATIC_LOCAL(const String, start, ("start"));
|
| @@ -73,6 +85,18 @@ static const String& endKeyword()
|
| return end;
|
| }
|
|
|
| +static const String& leftKeyword()
|
| +{
|
| + DEFINE_STATIC_LOCAL(const String, left, ("left"));
|
| + return left;
|
| +}
|
| +
|
| +static const String& rightKeyword()
|
| +{
|
| + DEFINE_STATIC_LOCAL(const String, right, ("right"));
|
| + return right;
|
| +}
|
| +
|
| static const String& horizontalKeyword()
|
| {
|
| return emptyString();
|
| @@ -149,12 +173,7 @@ void TextTrackCueBox::applyCSSProperties(const IntSize&)
|
| // be set to the value in the second cell of the row of the table below
|
| // whose first cell is the value of the corresponding cue's text track cue
|
| // alignment:
|
| - if (m_cue->align() == startKeyword())
|
| - setInlineStyleProperty(CSSPropertyTextAlign, CSSValueStart);
|
| - else if (m_cue->align() == endKeyword())
|
| - setInlineStyleProperty(CSSPropertyTextAlign, CSSValueEnd);
|
| - else
|
| - setInlineStyleProperty(CSSPropertyTextAlign, CSSValueCenter);
|
| + setInlineStyleProperty(CSSPropertyTextAlign, m_cue->getCSSAlignment());
|
|
|
| if (!m_cue->snapToLines()) {
|
| // 10.13.1 Set up x and y:
|
| @@ -210,15 +229,6 @@ TextTrackCue::TextTrackCue(ScriptExecutionContext* context, double start, double
|
| {
|
| ASSERT(m_scriptExecutionContext->isDocument());
|
| ScriptWrappable::init(this);
|
| -
|
| - // 4. If the text track cue writing direction is horizontal, then let
|
| - // writing-mode be 'horizontal-tb'. Otherwise, if the text track cue writing
|
| - // direction is vertical growing left, then let writing-mode be
|
| - // 'vertical-rl'. Otherwise, the text track cue writing direction is
|
| - // vertical growing right; let writing-mode be 'vertical-lr'.
|
| - m_displayWritingModeMap[Horizontal] = CSSValueHorizontalTb;
|
| - m_displayWritingModeMap[VerticalGrowingLeft] = CSSValueVerticalRl;
|
| - m_displayWritingModeMap[VerticalGrowingRight] = CSSValueVerticalLr;
|
| }
|
|
|
| TextTrackCue::~TextTrackCue()
|
| @@ -435,6 +445,10 @@ const String& TextTrackCue::align() const
|
| return middleKeyword();
|
| case End:
|
| return endKeyword();
|
| + case Left:
|
| + return leftKeyword();
|
| + case Right:
|
| + return rightKeyword();
|
| default:
|
| ASSERT_NOT_REACHED();
|
| return emptyString();
|
| @@ -456,6 +470,10 @@ void TextTrackCue::setAlign(const String& value, ExceptionState& es)
|
| alignment = Middle;
|
| else if (value == endKeyword())
|
| alignment = End;
|
| + else if (value == leftKeyword())
|
| + alignment = Left;
|
| + else if (value == rightKeyword())
|
| + alignment = Right;
|
| else
|
| es.throwUninformativeAndGenericDOMException(SyntaxError);
|
|
|
| @@ -658,64 +676,97 @@ void TextTrackCue::calculateDisplayParameters()
|
| // vertical growing left, then let block-flow be 'lr'. Otherwise, the text
|
| // track cue writing direction is vertical growing right; let block-flow be
|
| // 'rl'.
|
| - m_displayWritingMode = m_displayWritingModeMap[m_writingDirection];
|
| +
|
| + // The above step is done through the writing direction static map.
|
|
|
| // 10.5 Determine the value of maximum size for cue as per the appropriate
|
| // rules from the following list:
|
| int maximumSize = m_textPosition;
|
| if ((m_writingDirection == Horizontal && m_cueAlignment == Start && m_displayDirection == CSSValueLtr)
|
| || (m_writingDirection == Horizontal && m_cueAlignment == End && m_displayDirection == CSSValueRtl)
|
| - || (m_writingDirection == VerticalGrowingLeft && m_cueAlignment == Start)
|
| - || (m_writingDirection == VerticalGrowingRight && m_cueAlignment == Start)) {
|
| + || (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;
|
| } else if ((m_writingDirection == Horizontal && m_cueAlignment == End && m_displayDirection == CSSValueLtr)
|
| || (m_writingDirection == Horizontal && m_cueAlignment == Start && m_displayDirection == CSSValueRtl)
|
| - || (m_writingDirection == VerticalGrowingLeft && m_cueAlignment == End)
|
| - || (m_writingDirection == VerticalGrowingRight && m_cueAlignment == End)) {
|
| + || (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;
|
| } else if (m_cueAlignment == Middle) {
|
| maximumSize = m_textPosition <= 50 ? m_textPosition : (100 - m_textPosition);
|
| maximumSize = maximumSize * 2;
|
| + } else {
|
| + ASSERT_NOT_REACHED();
|
| }
|
|
|
| // 10.6 If the text track cue size is less than maximum size, then let size
|
| // be text track cue size. Otherwise, let size be maximum size.
|
| m_displaySize = std::min(m_cueSize, maximumSize);
|
|
|
| + // FIXME: Understand why step 10.7 is missing (just a copy/paste error?)
|
| + // Could be done within a spec implementation check - http://crbug.com/301580
|
| +
|
| // 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) {
|
| - if (m_cueAlignment == Start) {
|
| + switch (m_cueAlignment) {
|
| + case Start:
|
| if (m_displayDirection == CSSValueLtr)
|
| m_displayPosition.first = m_textPosition;
|
| else
|
| m_displayPosition.first = 100 - m_textPosition - m_displaySize;
|
| - } else if (m_cueAlignment == End) {
|
| + break;
|
| + case End:
|
| if (m_displayDirection == CSSValueRtl)
|
| m_displayPosition.first = 100 - m_textPosition;
|
| else
|
| m_displayPosition.first = m_textPosition - m_displaySize;
|
| + break;
|
| + case Left:
|
| + if (m_displayDirection == CSSValueLtr)
|
| + m_displayPosition.first = m_textPosition;
|
| + else
|
| + m_displayPosition.first = 100 - m_textPosition;
|
| + break;
|
| + case Right:
|
| + if (m_displayDirection == CSSValueLtr)
|
| + m_displayPosition.first = m_textPosition - m_displaySize;
|
| + else
|
| + m_displayPosition.first = 100 - m_textPosition - m_displaySize;
|
| + break;
|
| + case Middle:
|
| + if (m_displayDirection == CSSValueLtr)
|
| + m_displayPosition.first = m_textPosition - m_displaySize / 2;
|
| + else
|
| + m_displayPosition.first = 100 - m_textPosition - m_displaySize / 2;
|
| + break;
|
| + case NumberOfAlignments:
|
| + ASSERT_NOT_REACHED();
|
| + }
|
| + } else {
|
| + // Cases for m_writingDirection being VerticalGrowing{Left|Right}
|
| + switch (m_cueAlignment) {
|
| + case Start:
|
| + case Left:
|
| + m_displayPosition.second = m_textPosition;
|
| + break;
|
| + case End:
|
| + case Right:
|
| + m_displayPosition.second = m_textPosition - m_displaySize;
|
| + break;
|
| + case Middle:
|
| + m_displayPosition.second = m_textPosition - m_displaySize / 2;
|
| + break;
|
| + case NumberOfAlignments:
|
| + ASSERT_NOT_REACHED();
|
| }
|
| }
|
|
|
| - if ((m_writingDirection == VerticalGrowingLeft && m_cueAlignment == Start)
|
| - || (m_writingDirection == VerticalGrowingRight && m_cueAlignment == Start)) {
|
| - m_displayPosition.second = m_textPosition;
|
| - } else if ((m_writingDirection == VerticalGrowingLeft && m_cueAlignment == End)
|
| - || (m_writingDirection == VerticalGrowingRight && m_cueAlignment == End)) {
|
| - m_displayPosition.second = 100 - m_textPosition;
|
| - }
|
| -
|
| - if (m_writingDirection == Horizontal && m_cueAlignment == Middle) {
|
| - if (m_displayDirection == CSSValueLtr)
|
| - m_displayPosition.first = m_textPosition - m_displaySize / 2;
|
| - else
|
| - m_displayPosition.first = 100 - m_textPosition - m_displaySize / 2;
|
| - }
|
| -
|
| - if ((m_writingDirection == VerticalGrowingLeft && m_cueAlignment == Middle)
|
| - || (m_writingDirection == VerticalGrowingRight && m_cueAlignment == Middle))
|
| - m_displayPosition.second = m_textPosition - m_displaySize / 2;
|
| + // A text track cue has a text track cue computed line position whose value
|
| + // is defined in terms of the other aspects of the cue.
|
| + m_computedLinePosition = calculateComputedLinePosition();
|
|
|
| // 10.9 Determine the value of whichever of x-position or y-position is not
|
| // yet calculated for cue as per the appropriate rules from the following
|
| @@ -732,10 +783,6 @@ void TextTrackCue::calculateDisplayParameters()
|
|
|
| if (!m_snapToLines && (m_writingDirection == VerticalGrowingLeft || m_writingDirection == VerticalGrowingRight))
|
| m_displayPosition.first = m_computedLinePosition;
|
| -
|
| - // A text track cue has a text track cue computed line position whose value
|
| - // is defined in terms of the other aspects of the cue.
|
| - m_computedLinePosition = calculateComputedLinePosition();
|
| }
|
|
|
| void TextTrackCue::markFutureAndPastNodes(ContainerNode* root, double previousTimestamp, double movieTime)
|
| @@ -1094,6 +1141,14 @@ void TextTrackCue::setCueSettings(const String& input)
|
| // 3. If value is a case-sensitive match for the string "end", then let cue's text track cue alignment be end alignment.
|
| else if (cueAlignment == endKeyword())
|
| m_cueAlignment = End;
|
| +
|
| + // 4. If value is a case-sensitive match for the string "left", then let cue's text track cue alignment be left alignment.
|
| + else if (cueAlignment == leftKeyword())
|
| + m_cueAlignment = Left;
|
| +
|
| + // 5. If value is a case-sensitive match for the string "right", then let cue's text track cue alignment be right alignment.
|
| + else if (cueAlignment == rightKeyword())
|
| + m_cueAlignment = Right;
|
| }
|
| break;
|
| #if ENABLE(WEBVTT_REGIONS)
|
| @@ -1120,6 +1175,11 @@ NextSetting:
|
| #endif
|
| }
|
|
|
| +CSSValueID TextTrackCue::getCSSAlignment() const
|
| +{
|
| + return displayAlignmentMap[m_cueAlignment];
|
| +}
|
| +
|
| CSSValueID TextTrackCue::getCSSWritingDirection() const
|
| {
|
| return m_displayDirection;
|
| @@ -1127,7 +1187,7 @@ CSSValueID TextTrackCue::getCSSWritingDirection() const
|
|
|
| CSSValueID TextTrackCue::getCSSWritingMode() const
|
| {
|
| - return m_displayWritingMode;
|
| + return displayWritingModeMap[m_writingDirection];
|
| }
|
|
|
| int TextTrackCue::getCSSSize() const
|
|
|