⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 236531 in webkit


Ignore:
Timestamp:
Sep 26, 2018, 4:10:41 PM (8 years ago)
Author:
pvollan@apple.com
Message:

WebVTT cue alignment broken
https://bugs.webkit.org/show_bug.cgi?id=190004

Reviewed by Eric Carlson.

Source/WebCore:

If the position of the queue is unspecified, the default value of 50 was used, which is incorrect.
This patch also updates the API according to https://w3c.github.io/webvtt/#the-vttcue-interface.
The position attribute should not be a double, but either a double or the "auto" keyword. Parts
of this patch is inspired by the associated code in the Chromium project.

Test: media/track/track-cue-left-align.html

  • html/track/TextTrackCueGeneric.cpp:

(WebCore::TextTrackCueGenericBoxElement::applyCSSProperties):
(WebCore::TextTrackCueGeneric::setPosition):

  • html/track/TextTrackCueGeneric.h:
  • html/track/VTTCue.cpp:

(WebCore::VTTCueBox::applyCSSProperties):
(WebCore::VTTCue::initialize):
(WebCore::VTTCue::position const):
(WebCore::VTTCue::setPosition):
(WebCore::VTTCue::textPositionIsAuto const):
(WebCore::VTTCue::calculateComputedTextPosition const):
(WebCore::VTTCue::calculateDisplayParameters):
(WebCore::VTTCue::toJSON const):

  • html/track/VTTCue.h:

(WebCore::VTTCue::position const): Deleted.

  • html/track/VTTCue.idl:

LayoutTests:

  • media/track/captions-webvtt/left-align.vtt: Added.
  • media/track/track-add-remove-cue-expected.txt:
  • media/track/track-add-remove-cue.html:
  • media/track/track-cue-left-align-expected-mismatch.html: Added.
  • media/track/track-cue-left-align.html: Added.
  • media/track/track-cue-mutable-expected.txt:
  • media/track/track-cue-mutable.html:
  • media/track/track-vttcue-expected.txt:
  • media/track/track-vttcue.html:
  • media/track/track-webvtt-tc013-settings-expected.txt:
  • media/track/track-webvtt-tc013-settings.html:
  • media/track/track-webvtt-tc015-positioning-expected.txt:
  • media/track/track-webvtt-tc015-positioning.html:
  • media/track/track-webvtt-tc016-align-positioning-expected.txt:
  • media/track/track-webvtt-tc016-align-positioning.html:
  • media/track/track-webvtt-tc018-align-text-line-position-expected.txt:
  • media/track/track-webvtt-tc018-align-text-line-position.html:
  • media/track/track-webvtt-tc021-valign-expected.txt:
  • media/track/track-webvtt-tc021-valign.html:
  • media/video-test.js:

(testCues):

Location:
trunk
Files:
3 added
24 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r236530 r236531  
     12018-09-26  Per Arne Vollan  <pvollan@apple.com>
     2
     3        WebVTT cue alignment broken
     4        https://bugs.webkit.org/show_bug.cgi?id=190004
     5
     6        Reviewed by Eric Carlson.
     7
     8        * media/track/captions-webvtt/left-align.vtt: Added.
     9        * media/track/track-add-remove-cue-expected.txt:
     10        * media/track/track-add-remove-cue.html:
     11        * media/track/track-cue-left-align-expected-mismatch.html: Added.
     12        * media/track/track-cue-left-align.html: Added.
     13        * media/track/track-cue-mutable-expected.txt:
     14        * media/track/track-cue-mutable.html:
     15        * media/track/track-vttcue-expected.txt:
     16        * media/track/track-vttcue.html:
     17        * media/track/track-webvtt-tc013-settings-expected.txt:
     18        * media/track/track-webvtt-tc013-settings.html:
     19        * media/track/track-webvtt-tc015-positioning-expected.txt:
     20        * media/track/track-webvtt-tc015-positioning.html:
     21        * media/track/track-webvtt-tc016-align-positioning-expected.txt:
     22        * media/track/track-webvtt-tc016-align-positioning.html:
     23        * media/track/track-webvtt-tc018-align-text-line-position-expected.txt:
     24        * media/track/track-webvtt-tc018-align-text-line-position.html:
     25        * media/track/track-webvtt-tc021-valign-expected.txt:
     26        * media/track/track-webvtt-tc021-valign.html:
     27        * media/video-test.js:
     28        (testCues):
     29
    1302018-09-26  James Savage  <james.savage@apple.com>
    231
  • trunk/LayoutTests/media/track/track-add-remove-cue-expected.txt

    r236143 r236531  
    2121EXPECTED (textCue.snapToLines == 'true') OK
    2222EXPECTED (textCue.line == '-1') OK
    23 EXPECTED (textCue.position == '50') OK
     23EXPECTED (textCue.position == 'auto') OK
    2424EXPECTED (textCue.size == '100') OK
    2525EXPECTED (textCue.align == 'center') OK
     
    4444EXPECTED (newCue.snapToLines == 'true') OK
    4545EXPECTED (newCue.line == '-1') OK
    46 EXPECTED (newCue.position == '50') OK
     46EXPECTED (newCue.position == 'auto') OK
    4747EXPECTED (newCue.size == '100') OK
    4848EXPECTED (newCue.align == 'center') OK
  • trunk/LayoutTests/media/track/track-add-remove-cue.html

    r236143 r236531  
    3333                testExpected("textCue.snapToLines", true);
    3434                testExpected("textCue.line", -1);
    35                 testExpected("textCue.position", 50);
     35                testExpected("textCue.position", 'auto');
    3636                testExpected("textCue.size", 100);
    3737                testExpected("textCue.align", "center");
     
    5858                testExpected("newCue.snapToLines", true);
    5959                testExpected("newCue.line", -1);
    60                 testExpected("newCue.position", 50);
     60                testExpected("newCue.position", 'auto');
    6161                testExpected("newCue.size", 100);
    6262                testExpected("newCue.align", "center");
  • trunk/LayoutTests/media/track/track-cue-mutable-expected.txt

    r236143 r236531  
    1010EXPECTED (textCue.snapToLines == 'true') OK
    1111EXPECTED (textCue.line == '-1') OK
    12 EXPECTED (textCue.position == '50') OK
     12EXPECTED (textCue.position == 'auto') OK
    1313EXPECTED (textCue.size == '100') OK
    1414EXPECTED (textCue.align == 'center') OK
  • trunk/LayoutTests/media/track/track-cue-mutable.html

    r236143 r236531  
    3030                testExpected("textCue.snapToLines", true);
    3131                testExpected("textCue.line", -1);
    32                 testExpected("textCue.position", 50);
     32                testExpected("textCue.position", 'auto');
    3333                testExpected("textCue.size", 100);
    3434                testExpected("textCue.align", "center");
  • trunk/LayoutTests/media/track/track-vttcue-expected.txt

    r236143 r236531  
    1515EXPECTED (trackCue.snapToLines == 'true') OK
    1616EXPECTED (trackCue.line == '-1') OK
    17 EXPECTED (trackCue.position == '50') OK
     17EXPECTED (trackCue.position == 'auto') OK
    1818EXPECTED (trackCue.size == '100') OK
    1919EXPECTED (trackCue.align == 'center') OK
     
    3333EXPECTED (newCue.snapToLines == 'true') OK
    3434EXPECTED (newCue.line == '-1') OK
    35 EXPECTED (newCue.position == '50') OK
     35EXPECTED (newCue.position == 'auto') OK
    3636EXPECTED (newCue.size == '100') OK
    3737EXPECTED (newCue.align == 'center') OK
  • trunk/LayoutTests/media/track/track-vttcue.html

    r236143 r236531  
    3434                testExpected("trackCue.snapToLines", true);
    3535                testExpected("trackCue.line", -1);
    36                 testExpected("trackCue.position", 50);
     36                testExpected("trackCue.position", 'auto');
    3737                testExpected("trackCue.size", 100);
    3838                testExpected("trackCue.align", "center");
     
    5454                testExpected("newCue.snapToLines", true);
    5555                testExpected("newCue.line", -1);
    56                 testExpected("newCue.position", 50);
     56                testExpected("newCue.position", 'auto');
    5757                testExpected("newCue.size", 100);
    5858                testExpected("newCue.align", "center");
  • trunk/LayoutTests/media/track/track-webvtt-tc013-settings-expected.txt

    r236143 r236531  
    66EXPECTED (cues.length == '4') OK
    77EXPECTED (cues[0].line == '100') OK
    8 EXPECTED (cues[0].position == '50') OK
     8EXPECTED (cues[0].position == 'auto') OK
    99EXPECTED (cues[0].align == 'start') OK
    1010EXPECTED (cues[0].vertical == '') OK
     
    1818EXPECTED (cues[2].vertical == '') OK
    1919EXPECTED (cues[3].line == '95') OK
    20 EXPECTED (cues[3].position == '50') OK
     20EXPECTED (cues[3].position == 'auto') OK
    2121EXPECTED (cues[3].align == 'end') OK
    2222EXPECTED (cues[3].vertical == 'lr') OK
     
    3333EXPECTED (cues[1].vertical == '') OK
    3434EXPECTED (cues[2].line == '-1') OK
    35 EXPECTED (cues[2].position == '50') OK
     35EXPECTED (cues[2].position == 'auto') OK
    3636EXPECTED (cues[2].align == 'center') OK
    3737EXPECTED (cues[2].vertical == '') OK
  • trunk/LayoutTests/media/track/track-webvtt-tc013-settings.html

    r236143 r236531  
    3434                            {
    3535                                property : "position",
    36                                 values : [50, 40, 10, 50],
     36                                values : ['auto', 40, 10, 'auto'],
    3737                            },
    3838                            {
     
    5656                            {
    5757                                property : "position",
    58                                 values : [10, 50, 50, 90],
     58                                values : [10, 50, 'auto', 90],
    5959                            },
    6060                            {
  • trunk/LayoutTests/media/track/track-webvtt-tc015-positioning-expected.txt

    r170694 r236531  
    77EXPECTED (cues[0].position == '0') OK
    88EXPECTED (cues[1].position == '49.2') OK
    9 EXPECTED (cues[2].position == '50') OK
     9EXPECTED (cues[2].position == 'auto') OK
    1010EXPECTED (cues[3].position == '100') OK
    1111
     
    1414EXPECTED (cues[0].position == '0') OK
    1515EXPECTED (cues[1].position == '49.2') OK
    16 EXPECTED (cues[2].position == '50') OK
     16EXPECTED (cues[2].position == 'auto') OK
    1717EXPECTED (cues[3].position == '100') OK
    1818
    1919*** Testing text track 2
    2020EXPECTED (cues.length == '8') OK
    21 EXPECTED (cues[0].position == '50') OK
    22 EXPECTED (cues[1].position == '50') OK
    23 EXPECTED (cues[2].position == '50') OK
    24 EXPECTED (cues[3].position == '50') OK
    25 EXPECTED (cues[4].position == '50') OK
    26 EXPECTED (cues[5].position == '50') OK
    27 EXPECTED (cues[6].position == '50') OK
    28 EXPECTED (cues[7].position == '50') OK
     21EXPECTED (cues[0].position == 'auto') OK
     22EXPECTED (cues[1].position == 'auto') OK
     23EXPECTED (cues[2].position == 'auto') OK
     24EXPECTED (cues[3].position == 'auto') OK
     25EXPECTED (cues[4].position == 'auto') OK
     26EXPECTED (cues[5].position == 'auto') OK
     27EXPECTED (cues[6].position == 'auto') OK
     28EXPECTED (cues[7].position == 'auto') OK
    2929END OF TEST
    3030
  • trunk/LayoutTests/media/track/track-webvtt-tc015-positioning.html

    r170694 r236531  
    3030                        {
    3131                            property : "position",
    32                             values : [0, 49.2, 50, 100],
     32                            values : [0, 49.2, 'auto', 100],
    3333                            precision : 2,
    3434                        },
     
    5050                        {
    5151                            property : "position",
    52                             values : [50, 50, 50, 50, 50, 50, 50, 50],
     52                            values : ['auto', 'auto', 'auto', 'auto', 'auto', 'auto', 'auto', 'auto'],
    5353                        },
    5454                    ],
  • trunk/LayoutTests/media/track/track-webvtt-tc016-align-positioning-expected.txt

    r236143 r236531  
    1616EXPECTED (cues[0].position == '10') OK
    1717EXPECTED (cues[0].align == 'center') OK
    18 EXPECTED (cues[1].position == '50') OK
     18EXPECTED (cues[1].position == 'auto') OK
    1919EXPECTED (cues[1].align == 'center') OK
    20 EXPECTED (cues[2].position == '50') OK
     20EXPECTED (cues[2].position == 'auto') OK
    2121EXPECTED (cues[2].align == 'center') OK
    2222END OF TEST
  • trunk/LayoutTests/media/track/track-webvtt-tc016-align-positioning.html

    r236143 r236531  
    5252                        {
    5353                            property : "position",
    54                             values : [10, 50, 50],
     54                            values : [10, 'auto', 'auto'],
    5555                        },
    5656                        {
  • trunk/LayoutTests/media/track/track-webvtt-tc018-align-text-line-position-expected.txt

    r236143 r236531  
    1010EXPECTED (cues[0].snapToLines == 'false') OK
    1111EXPECTED (cues[1].align == 'start') OK
    12 EXPECTED (cues[1].position == '50') OK
     12EXPECTED (cues[1].position == 'auto') OK
    1313EXPECTED (cues[1].line == '0') OK
    1414EXPECTED (cues[1].snapToLines == 'true') OK
     
    2929EXPECTED (cues.length == '3') OK
    3030EXPECTED (cues[0].align == 'center') OK
    31 EXPECTED (cues[0].position == '50') OK
     31EXPECTED (cues[0].position == 'auto') OK
    3232EXPECTED (cues[0].line == '-1') OK
    3333EXPECTED (cues[0].snapToLines == 'true') OK
  • trunk/LayoutTests/media/track/track-webvtt-tc018-align-text-line-position.html

    r236143 r236531  
    3434                        {
    3535                            property : "position",
    36                             values : [10, 50, 80.3, 30, 60],
     36                            values : [10, 'auto', 80.3, 30, 60],
    3737                            precision : 2,
    3838                        },
     
    6767                        {
    6868                            property : "position",
    69                             values : [50, 0, 60],
     69                            values : ['auto', 0, 60],
    7070                        },
    7171                        {
  • trunk/LayoutTests/media/track/track-webvtt-tc021-valign-expected.txt

    r236143 r236531  
    77EXPECTED (cues[0].vertical == 'rl') OK
    88EXPECTED (cues[0].align == 'center') OK
    9 EXPECTED (cues[0].position == '50') OK
     9EXPECTED (cues[0].position == 'auto') OK
    1010EXPECTED (cues[1].vertical == 'lr') OK
    1111EXPECTED (cues[1].align == 'center') OK
    12 EXPECTED (cues[1].position == '50') OK
     12EXPECTED (cues[1].position == 'auto') OK
    1313EXPECTED (cues[2].vertical == 'rl') OK
    1414EXPECTED (cues[2].align == 'start') OK
     
    1919EXPECTED (cues[0].vertical == 'rl') OK
    2020EXPECTED (cues[0].align == 'center') OK
    21 EXPECTED (cues[0].position == '50') OK
     21EXPECTED (cues[0].position == 'auto') OK
    2222EXPECTED (cues[1].vertical == 'lr') OK
    2323EXPECTED (cues[1].align == 'center') OK
    24 EXPECTED (cues[1].position == '50') OK
     24EXPECTED (cues[1].position == 'auto') OK
    2525EXPECTED (cues[2].vertical == 'rl') OK
    2626EXPECTED (cues[2].align == 'start') OK
  • trunk/LayoutTests/media/track/track-webvtt-tc021-valign.html

    r236143 r236531  
    3838                        {
    3939                            property : "position",
    40                             values : [50, 50, 0],
     40                            values : ['auto', 'auto', 0],
    4141                        },
    4242                    ],
  • trunk/LayoutTests/media/video-test.js

    r234582 r236531  
    378378            var propertyString = "cues[" + i + "]." + test.property;
    379379            var propertyValue = eval(propertyString);
    380             if (test["precision"])
     380            if (test["precision"] && typeof(propertyValue) == 'number')
    381381                propertyValue = propertyValue.toFixed(test["precision"]);
    382382            reportExpected(test.values[i] == propertyValue, propertyString, "==", test.values[i], propertyValue)
  • trunk/Source/WebCore/ChangeLog

    r236530 r236531  
     12018-09-26  Per Arne Vollan  <pvollan@apple.com>
     2
     3        WebVTT cue alignment broken
     4        https://bugs.webkit.org/show_bug.cgi?id=190004
     5
     6        Reviewed by Eric Carlson.
     7
     8        If the position of the queue is unspecified, the default value of 50 was used, which is incorrect.
     9        This patch also updates the API according to https://w3c.github.io/webvtt/#the-vttcue-interface.
     10        The position attribute should not be a double, but either a double or the "auto" keyword. Parts
     11        of this patch is inspired by the associated code in the Chromium project.
     12
     13        Test: media/track/track-cue-left-align.html
     14
     15        * html/track/TextTrackCueGeneric.cpp:
     16        (WebCore::TextTrackCueGenericBoxElement::applyCSSProperties):
     17        (WebCore::TextTrackCueGeneric::setPosition):
     18        * html/track/TextTrackCueGeneric.h:
     19        * html/track/VTTCue.cpp:
     20        (WebCore::VTTCueBox::applyCSSProperties):
     21        (WebCore::VTTCue::initialize):
     22        (WebCore::VTTCue::position const):
     23        (WebCore::VTTCue::setPosition):
     24        (WebCore::VTTCue::textPositionIsAuto const):
     25        (WebCore::VTTCue::calculateComputedTextPosition const):
     26        (WebCore::VTTCue::calculateDisplayParameters):
     27        (WebCore::VTTCue::toJSON const):
     28        * html/track/VTTCue.h:
     29        (WebCore::VTTCue::position const): Deleted.
     30        * html/track/VTTCue.idl:
     31
    1322018-09-26  James Savage  <james.savage@apple.com>
    233
  • trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp

    r236143 r236531  
    7575    Ref<HTMLSpanElement> cueElement = cue->element();
    7676
     77    double textPosition = cue->calculateComputedTextPosition();
     78
    7779    CSSValueID alignment = cue->getCSSAlignment();
    7880    float size = static_cast<float>(cue->getCSSSize());
     
    8183        setInlineStyleProperty(CSSPropertyMarginBottom, 1.0, CSSPrimitiveValue::CSS_PERCENTAGE);
    8284    } else {
    83         setInlineStyleProperty(CSSPropertyLeft, static_cast<float>(cue->position()), CSSPrimitiveValue::CSS_PERCENTAGE);
     85        setInlineStyleProperty(CSSPropertyLeft, static_cast<float>(textPosition), CSSPrimitiveValue::CSS_PERCENTAGE);
    8486        setInlineStyleProperty(CSSPropertyTop, static_cast<float>(cue->line()), CSSPrimitiveValue::CSS_PERCENTAGE);
    8587
     
    9698            setInlineStyleProperty(CSSPropertyWidth, newCueSize, CSSPrimitiveValue::CSS_PERCENTAGE);
    9799            if ((alignment == CSSValueMiddle || alignment == CSSValueCenter) && multiplier != 1.0)
    98                 setInlineStyleProperty(CSSPropertyLeft, static_cast<double>(cue->position() - (newCueSize - m_cue.getCSSSize()) / 2), CSSPrimitiveValue::CSS_PERCENTAGE);
     100                setInlineStyleProperty(CSSPropertyLeft, static_cast<double>(textPosition - (newCueSize - m_cue.getCSSSize()) / 2), CSSPrimitiveValue::CSS_PERCENTAGE);
    99101        } else {
    100102            setInlineStyleProperty(CSSPropertyHeight, newCueSize,  CSSPrimitiveValue::CSS_PERCENTAGE);
     
    104106    }
    105107
    106     double textPosition = m_cue.position();
    107108    double maxSize = 100.0;
    108109   
     
    170171}
    171172
    172 ExceptionOr<void> TextTrackCueGeneric::setPosition(double position)
     173ExceptionOr<void> TextTrackCueGeneric::setPosition(const LineAndPositionSetting& position)
    173174{
    174175    auto result = VTTCue::setPosition(position);
  • trunk/Source/WebCore/html/track/TextTrackCueGeneric.h

    r225764 r236531  
    4444
    4545    ExceptionOr<void> setLine(double) final;
    46     ExceptionOr<void> setPosition(double) final;
     46    ExceptionOr<void> setPosition(const LineAndPositionSetting&) final;
    4747
    4848    bool useDefaultPosition() const { return m_useDefaultPosition; }
  • trunk/Source/WebCore/html/track/VTTCue.cpp

    r236143 r236531  
    178178        multiplier = m_fontSizeFromCaptionUserPrefs / authorFontSize;
    179179
    180     double textPosition = m_cue.position();
     180    double textPosition = m_cue.calculateComputedTextPosition();
    181181    double maxSize = 100.0;
    182182    CSSValueID alignment = m_cue.getCSSAlignment();
     
    286286    m_linePosition = undefinedPosition;
    287287    m_computedLinePosition = undefinedPosition;
    288     m_textPosition = 50;
     288    m_textPosition = std::numeric_limits<double>::quiet_NaN();
    289289    m_cueSize = 100;
    290290    m_writingDirection = Horizontal;
     
    392392}
    393393
    394 ExceptionOr<void> VTTCue::setPosition(double position)
    395 {
    396     // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-texttrackcue-position
    397     // On setting, if the new value is negative or greater than 100, then throw an IndexSizeError exception.
    398     // Otherwise, set the text track cue text position to the new value.
    399     if (!(position >= 0 && position <= 100))
    400         return Exception { IndexSizeError };
    401 
    402     // Otherwise, set the text track cue line position to the new value.
    403     if (m_textPosition == position)
    404         return { };
    405    
     394VTTCue::LineAndPositionSetting VTTCue::position() const
     395{
     396    if (textPositionIsAuto())
     397        return Auto;
     398    return m_textPosition;
     399}
     400
     401ExceptionOr<void> VTTCue::setPosition(const LineAndPositionSetting& position)
     402{
     403    // http://dev.w3.org/html5/webvtt/#dfn-vttcue-position
     404    // On setting, if the new value is negative or greater than 100, then an
     405    // IndexSizeError exception must be thrown. Otherwise, the WebVTT cue
     406    // position must be set to the new value; if the new value is the string
     407    // "auto", then it must be interpreted as the special value auto.
     408    double textPosition = 0;
     409    if (WTF::holds_alternative<AutoKeyword>(position)) {
     410        if (textPositionIsAuto())
     411            return { };
     412        textPosition = std::numeric_limits<double>::quiet_NaN();
     413    } else {
     414        if (!(WTF::get<double>(position) >= 0 && WTF::get<double>(position) <= 100))
     415            return Exception { IndexSizeError };
     416
     417        // Otherwise, set the text track cue line position to the new value.
     418        textPosition = WTF::get<double>(position);
     419        if (m_textPosition == textPosition)
     420            return { };
     421    }
     422
    406423    willChange();
    407     m_textPosition = position;
     424    m_textPosition = textPosition;
    408425    didChange();
    409426
     
    610627}
    611628
     629bool VTTCue::textPositionIsAuto() const
     630{
     631    return std::isnan(m_textPosition);
     632}
     633
    612634void VTTCue::determineTextDirection()
    613635{
     
    653675}
    654676
     677double VTTCue::calculateComputedTextPosition() const
     678{
     679    // http://dev.w3.org/html5/webvtt/#dfn-cue-computed-position
     680   
     681    // 1. If the position is numeric, then return the value of the position and
     682    // abort these steps. (Otherwise, the position is the special value auto.)
     683    if (!textPositionIsAuto())
     684        return m_textPosition;
     685   
     686    switch (m_cueAlignment) {
     687    case Start:
     688    case Left:
     689        // 2. If the cue text alignment is start or left, return 0 and abort these
     690        // steps.
     691        return 0;
     692    case End:
     693    case Right:
     694        // 3. If the cue text alignment is end or right, return 100 and abort these
     695        // steps.
     696        return 100;
     697    case Center:
     698        // 4. If the cue text alignment is center, return 50 and abort these steps.
     699        return 50;
     700    default:
     701        ASSERT_NOT_REACHED();
     702        return 0;
     703    }
     704}
     705
    655706void VTTCue::calculateDisplayParameters()
    656707{
     
    668719    // 10.5 Determine the value of maximum size for cue as per the appropriate
    669720    // rules from the following list:
    670     int maximumSize = m_textPosition;
     721    double computedTextPosition = calculateComputedTextPosition();
     722    int maximumSize = computedTextPosition;
    671723    if ((m_writingDirection == Horizontal && m_cueAlignment == Start && m_displayDirection == CSSValueLtr)
    672724        || (m_writingDirection == Horizontal && m_cueAlignment == End && m_displayDirection == CSSValueRtl)
     
    674726        || (m_writingDirection == VerticalGrowingLeft && (m_cueAlignment == Start || m_cueAlignment == Left))
    675727        || (m_writingDirection == VerticalGrowingRight && (m_cueAlignment == Start || m_cueAlignment == Left))) {
    676         maximumSize = 100 - m_textPosition;
     728        maximumSize = 100 - computedTextPosition;
    677729    } else if ((m_writingDirection == Horizontal && m_cueAlignment == End && m_displayDirection == CSSValueLtr)
    678730        || (m_writingDirection == Horizontal && m_cueAlignment == Start && m_displayDirection == CSSValueRtl)
     
    680732        || (m_writingDirection == VerticalGrowingLeft && (m_cueAlignment == End || m_cueAlignment == Right))
    681733        || (m_writingDirection == VerticalGrowingRight && (m_cueAlignment == End || m_cueAlignment == Right))) {
    682         maximumSize = m_textPosition;
     734        maximumSize = computedTextPosition;
    683735    } else if (m_cueAlignment == Center) {
    684         maximumSize = m_textPosition <= 50 ? m_textPosition : (100 - m_textPosition);
     736        maximumSize = computedTextPosition <= 50 ? computedTextPosition : (100 - computedTextPosition);
    685737        maximumSize = maximumSize * 2;
    686738    } else
     
    700752        case Start:
    701753            if (m_displayDirection == CSSValueLtr)
    702                 m_displayPosition.first = m_textPosition;
     754                m_displayPosition.first = computedTextPosition;
    703755            else
    704                 m_displayPosition.first = 100 - m_textPosition - m_displaySize;
     756                m_displayPosition.first = 100 - computedTextPosition - m_displaySize;
    705757            break;
    706758        case End:
    707759            if (m_displayDirection == CSSValueRtl)
    708                 m_displayPosition.first = 100 - m_textPosition;
     760                m_displayPosition.first = 100 - computedTextPosition;
    709761            else
    710                 m_displayPosition.first = m_textPosition - m_displaySize;
     762                m_displayPosition.first = computedTextPosition - m_displaySize;
    711763            break;
    712764        case Left:
    713765            if (m_displayDirection == CSSValueLtr)
    714                 m_displayPosition.first = m_textPosition;
     766                m_displayPosition.first = computedTextPosition;
    715767            else
    716                 m_displayPosition.first = 100 - m_textPosition;
     768                m_displayPosition.first = 100 - computedTextPosition;
    717769            break;
    718770        case Right:
    719771            if (m_displayDirection == CSSValueLtr)
    720                 m_displayPosition.first = m_textPosition - m_displaySize;
     772                m_displayPosition.first = computedTextPosition - m_displaySize;
    721773            else
    722                 m_displayPosition.first = 100 - m_textPosition - m_displaySize;
     774                m_displayPosition.first = 100 - computedTextPosition - m_displaySize;
    723775            break;
    724776        case Center:
    725777            if (m_displayDirection == CSSValueLtr)
    726                 m_displayPosition.first = m_textPosition - m_displaySize / 2;
     778                m_displayPosition.first = computedTextPosition - m_displaySize / 2;
    727779            else
    728                 m_displayPosition.first = 100 - m_textPosition - m_displaySize / 2;
     780                m_displayPosition.first = 100 - computedTextPosition - m_displaySize / 2;
    729781            break;
    730782        case NumberOfAlignments:
     
    11981250    object.setBoolean("snapToLines"_s, snapToLines());
    11991251    object.setDouble("line"_s, m_linePosition);
    1200     object.setDouble("position"_s, position());
     1252    if (textPositionIsAuto())
     1253        object.setString("position"_s, "auto");
     1254    else
     1255        object.setDouble("position"_s, m_textPosition);
    12011256    object.setInteger("size"_s, m_cueSize);
    12021257    object.setString("align"_s, align());
  • trunk/Source/WebCore/html/track/VTTCue.h

    r236143 r236531  
    8989    virtual ~VTTCue();
    9090
     91    enum AutoKeyword {
     92        Auto
     93    };
     94   
     95    using LineAndPositionSetting = Variant<double, AutoKeyword>;
     96
    9197    const String& vertical() const;
    9298    ExceptionOr<void> setVertical(const String&);
     
    98104    virtual ExceptionOr<void> setLine(double);
    99105
    100     double position() const { return m_textPosition; }
    101     virtual ExceptionOr<void> setPosition(double);
     106    LineAndPositionSetting position() const;
     107    virtual ExceptionOr<void> setPosition(const LineAndPositionSetting&);
    102108
    103109    int size() const { return m_cueSize; }
     
    171177    String toJSONString() const;
    172178
     179    double calculateComputedTextPosition() const;
     180
    173181protected:
    174182    VTTCue(ScriptExecutionContext&, const MediaTime& start, const MediaTime& end, const String& content);
     
    187195    void parseSettings(const String&);
    188196
     197    bool textPositionIsAuto() const;
     198   
    189199    void determineTextDirection();
    190200    void calculateDisplayParameters();
  • trunk/Source/WebCore/html/track/VTTCue.idl

    r228886 r236531  
    2424 */
    2525
     26enum AutoKeyword { "auto" };
     27typedef (double or AutoKeyword) LineAndPositionSetting;
     28
    2629[
    2730    Conditional=VIDEO_TRACK,
     
    3437    attribute boolean snapToLines;
    3538    attribute double line;
    36     attribute double position;
     39    attribute LineAndPositionSetting position;
    3740    attribute double size;
    3841    attribute DOMString align;
Note: See TracChangeset for help on using the changeset viewer.