Title: [236531] trunk
Revision
236531
Author
pvol...@apple.com
Date
2018-09-26 16:10:41 -0700 (Wed, 26 Sep 2018)

Log 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):

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (236530 => 236531)


--- trunk/LayoutTests/ChangeLog	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/ChangeLog	2018-09-26 23:10:41 UTC (rev 236531)
@@ -1,3 +1,32 @@
+2018-09-26  Per Arne Vollan  <pvol...@apple.com>
+
+        WebVTT cue alignment broken
+        https://bugs.webkit.org/show_bug.cgi?id=190004
+
+        Reviewed by Eric Carlson.
+
+        * 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):
+
 2018-09-26  James Savage  <james.sav...@apple.com>
 
         Allow override of viewport configuration.

Added: trunk/LayoutTests/media/track/captions-webvtt/left-align.vtt (0 => 236531)


--- trunk/LayoutTests/media/track/captions-webvtt/left-align.vtt	                        (rev 0)
+++ trunk/LayoutTests/media/track/captions-webvtt/left-align.vtt	2018-09-26 23:10:41 UTC (rev 236531)
@@ -0,0 +1,5 @@
+WEBVTT
+
+1
+00:00.000 --> 01:00.000 align:left
+Lorum ipsum

Modified: trunk/LayoutTests/media/track/track-add-remove-cue-expected.txt (236530 => 236531)


--- trunk/LayoutTests/media/track/track-add-remove-cue-expected.txt	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-add-remove-cue-expected.txt	2018-09-26 23:10:41 UTC (rev 236531)
@@ -20,7 +20,7 @@
 EXPECTED (textCue.vertical == '') OK
 EXPECTED (textCue.snapToLines == 'true') OK
 EXPECTED (textCue.line == '-1') OK
-EXPECTED (textCue.position == '50') OK
+EXPECTED (textCue.position == 'auto') OK
 EXPECTED (textCue.size == '100') OK
 EXPECTED (textCue.align == 'center') OK
 
@@ -43,7 +43,7 @@
 EXPECTED (newCue.vertical == '') OK
 EXPECTED (newCue.snapToLines == 'true') OK
 EXPECTED (newCue.line == '-1') OK
-EXPECTED (newCue.position == '50') OK
+EXPECTED (newCue.position == 'auto') OK
 EXPECTED (newCue.size == '100') OK
 EXPECTED (newCue.align == 'center') OK
 

Modified: trunk/LayoutTests/media/track/track-add-remove-cue.html (236530 => 236531)


--- trunk/LayoutTests/media/track/track-add-remove-cue.html	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-add-remove-cue.html	2018-09-26 23:10:41 UTC (rev 236531)
@@ -32,7 +32,7 @@
                 testExpected("textCue.vertical", "");
                 testExpected("textCue.snapToLines", true);
                 testExpected("textCue.line", -1);
-                testExpected("textCue.position", 50);
+                testExpected("textCue.position", 'auto');
                 testExpected("textCue.size", 100);
                 testExpected("textCue.align", "center");
 
@@ -57,7 +57,7 @@
                 testExpected("newCue.vertical", "");
                 testExpected("newCue.snapToLines", true);
                 testExpected("newCue.line", -1);
-                testExpected("newCue.position", 50);
+                testExpected("newCue.position", 'auto');
                 testExpected("newCue.size", 100);
                 testExpected("newCue.align", "center");
 

Added: trunk/LayoutTests/media/track/track-cue-left-align-expected-mismatch.html (0 => 236531)


--- trunk/LayoutTests/media/track/track-cue-left-align-expected-mismatch.html	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-cue-left-align-expected-mismatch.html	2018-09-26 23:10:41 UTC (rev 236531)
@@ -0,0 +1,40 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <script>var requirePixelDump = true;</script>
+        <script src=""
+        <script src=""
+        <script src=""
+
+        <style>
+
+        .obscurer {
+            width: 500px;
+            height: 500px;
+            position: absolute;
+            background-color: white;
+        }
+        </style>
+        <script>
+        function seeked()
+        {
+            endTest();
+        }
+
+        function loaded()
+        {
+            consoleWrite("Test that text stroke is applied correctly.");
+            findMediaElement();
+            video.src = "" '../content/test');
+            waitForEvent('seeked', seeked);
+            waitForEvent('canplaythrough', function() { video.currentTime = .5; });
+        }
+
+        setCaptionDisplayMode('Automatic');
+        </script>
+    </head>
+    <body _onload_="loaded()">
+        <video style="position: absolute; left: 0px; top: 0px;" controls ></video>
+        <div class="obscurer" style="left: 100px; top: 0px;"></div>
+    </body>
+</html>

Added: trunk/LayoutTests/media/track/track-cue-left-align.html (0 => 236531)


--- trunk/LayoutTests/media/track/track-cue-left-align.html	                        (rev 0)
+++ trunk/LayoutTests/media/track/track-cue-left-align.html	2018-09-26 23:10:41 UTC (rev 236531)
@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <script>var requirePixelDump = true;</script>
+        <script src=""
+        <script src=""
+        <script src=""
+
+        <style>
+
+        .obscurer {
+            width: 500px;
+            height: 500px;
+            position: absolute;
+            background-color: white;
+        }
+        </style>
+        <script>
+        function seeked()
+        {
+            endTest();
+        }
+
+        function loaded()
+        {
+            consoleWrite("Test that text stroke is applied correctly.");
+            findMediaElement();
+            video.src = "" '../content/test');
+            waitForEvent('seeked', seeked);
+            waitForEvent('canplaythrough', function() { video.currentTime = .5; });
+        }
+
+        setCaptionDisplayMode('Automatic');
+        </script>
+    </head>
+    <body _onload_="loaded()">
+        <video style="position: absolute; left: 0px; top: 0px;" controls >
+            <track src="" kind="captions" default>
+        </video>
+        <div class="obscurer" style="left: 100px; top: 0px;"></div>
+    </body>
+</html>

Modified: trunk/LayoutTests/media/track/track-cue-mutable-expected.txt (236530 => 236531)


--- trunk/LayoutTests/media/track/track-cue-mutable-expected.txt	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-cue-mutable-expected.txt	2018-09-26 23:10:41 UTC (rev 236531)
@@ -9,7 +9,7 @@
 EXPECTED (textCue.vertical == '') OK
 EXPECTED (textCue.snapToLines == 'true') OK
 EXPECTED (textCue.line == '-1') OK
-EXPECTED (textCue.position == '50') OK
+EXPECTED (textCue.position == 'auto') OK
 EXPECTED (textCue.size == '100') OK
 EXPECTED (textCue.align == 'center') OK
 

Modified: trunk/LayoutTests/media/track/track-cue-mutable.html (236530 => 236531)


--- trunk/LayoutTests/media/track/track-cue-mutable.html	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-cue-mutable.html	2018-09-26 23:10:41 UTC (rev 236531)
@@ -29,7 +29,7 @@
                 testExpected("textCue.vertical", "");
                 testExpected("textCue.snapToLines", true);
                 testExpected("textCue.line", -1);
-                testExpected("textCue.position", 50);
+                testExpected("textCue.position", 'auto');
                 testExpected("textCue.size", 100);
                 testExpected("textCue.align", "center");
 

Modified: trunk/LayoutTests/media/track/track-vttcue-expected.txt (236530 => 236531)


--- trunk/LayoutTests/media/track/track-vttcue-expected.txt	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-vttcue-expected.txt	2018-09-26 23:10:41 UTC (rev 236531)
@@ -14,7 +14,7 @@
 EXPECTED (trackCue.vertical == '') OK
 EXPECTED (trackCue.snapToLines == 'true') OK
 EXPECTED (trackCue.line == '-1') OK
-EXPECTED (trackCue.position == '50') OK
+EXPECTED (trackCue.position == 'auto') OK
 EXPECTED (trackCue.size == '100') OK
 EXPECTED (trackCue.align == 'center') OK
 EXPECTED (trackCue.text == 'Lorem') OK
@@ -32,7 +32,7 @@
 EXPECTED (newCue.vertical == '') OK
 EXPECTED (newCue.snapToLines == 'true') OK
 EXPECTED (newCue.line == '-1') OK
-EXPECTED (newCue.position == '50') OK
+EXPECTED (newCue.position == 'auto') OK
 EXPECTED (newCue.size == '100') OK
 EXPECTED (newCue.align == 'center') OK
 EXPECTED (newCue.text == 'Pie') OK

Modified: trunk/LayoutTests/media/track/track-vttcue.html (236530 => 236531)


--- trunk/LayoutTests/media/track/track-vttcue.html	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-vttcue.html	2018-09-26 23:10:41 UTC (rev 236531)
@@ -33,7 +33,7 @@
                 testExpected("trackCue.vertical", "");
                 testExpected("trackCue.snapToLines", true);
                 testExpected("trackCue.line", -1);
-                testExpected("trackCue.position", 50);
+                testExpected("trackCue.position", 'auto');
                 testExpected("trackCue.size", 100);
                 testExpected("trackCue.align", "center");
                 testExpected("trackCue.text", "Lorem");
@@ -53,7 +53,7 @@
                 testExpected("newCue.vertical", "");
                 testExpected("newCue.snapToLines", true);
                 testExpected("newCue.line", -1);
-                testExpected("newCue.position", 50);
+                testExpected("newCue.position", 'auto');
                 testExpected("newCue.size", 100);
                 testExpected("newCue.align", "center");
                 testExpected("newCue.text", "Pie");

Modified: trunk/LayoutTests/media/track/track-webvtt-tc013-settings-expected.txt (236530 => 236531)


--- trunk/LayoutTests/media/track/track-webvtt-tc013-settings-expected.txt	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-webvtt-tc013-settings-expected.txt	2018-09-26 23:10:41 UTC (rev 236531)
@@ -5,7 +5,7 @@
 *** Testing text track 0
 EXPECTED (cues.length == '4') OK
 EXPECTED (cues[0].line == '100') OK
-EXPECTED (cues[0].position == '50') OK
+EXPECTED (cues[0].position == 'auto') OK
 EXPECTED (cues[0].align == 'start') OK
 EXPECTED (cues[0].vertical == '') OK
 EXPECTED (cues[1].line == '15') OK
@@ -17,7 +17,7 @@
 EXPECTED (cues[2].align == 'center') OK
 EXPECTED (cues[2].vertical == '') OK
 EXPECTED (cues[3].line == '95') OK
-EXPECTED (cues[3].position == '50') OK
+EXPECTED (cues[3].position == 'auto') OK
 EXPECTED (cues[3].align == 'end') OK
 EXPECTED (cues[3].vertical == 'lr') OK
 
@@ -32,7 +32,7 @@
 EXPECTED (cues[1].align == 'end') OK
 EXPECTED (cues[1].vertical == '') OK
 EXPECTED (cues[2].line == '-1') OK
-EXPECTED (cues[2].position == '50') OK
+EXPECTED (cues[2].position == 'auto') OK
 EXPECTED (cues[2].align == 'center') OK
 EXPECTED (cues[2].vertical == '') OK
 EXPECTED (cues[3].line == '-1') OK

Modified: trunk/LayoutTests/media/track/track-webvtt-tc013-settings.html (236530 => 236531)


--- trunk/LayoutTests/media/track/track-webvtt-tc013-settings.html	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-webvtt-tc013-settings.html	2018-09-26 23:10:41 UTC (rev 236531)
@@ -33,7 +33,7 @@
                             },
                             {
                                 property : "position",
-                                values : [50, 40, 10, 50],
+                                values : ['auto', 40, 10, 'auto'],
                             },
                             {
                                 property : "align",
@@ -55,7 +55,7 @@
                             },
                             {
                                 property : "position",
-                                values : [10, 50, 50, 90],
+                                values : [10, 50, 'auto', 90],
                             },
                             {
                                 property : "align",

Modified: trunk/LayoutTests/media/track/track-webvtt-tc015-positioning-expected.txt (236530 => 236531)


--- trunk/LayoutTests/media/track/track-webvtt-tc015-positioning-expected.txt	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-webvtt-tc015-positioning-expected.txt	2018-09-26 23:10:41 UTC (rev 236531)
@@ -6,7 +6,7 @@
 EXPECTED (cues.length == '4') OK
 EXPECTED (cues[0].position == '0') OK
 EXPECTED (cues[1].position == '49.2') OK
-EXPECTED (cues[2].position == '50') OK
+EXPECTED (cues[2].position == 'auto') OK
 EXPECTED (cues[3].position == '100') OK
 
 *** Testing text track 1
@@ -13,18 +13,18 @@
 EXPECTED (cues.length == '4') OK
 EXPECTED (cues[0].position == '0') OK
 EXPECTED (cues[1].position == '49.2') OK
-EXPECTED (cues[2].position == '50') OK
+EXPECTED (cues[2].position == 'auto') OK
 EXPECTED (cues[3].position == '100') OK
 
 *** Testing text track 2
 EXPECTED (cues.length == '8') OK
-EXPECTED (cues[0].position == '50') OK
-EXPECTED (cues[1].position == '50') OK
-EXPECTED (cues[2].position == '50') OK
-EXPECTED (cues[3].position == '50') OK
-EXPECTED (cues[4].position == '50') OK
-EXPECTED (cues[5].position == '50') OK
-EXPECTED (cues[6].position == '50') OK
-EXPECTED (cues[7].position == '50') OK
+EXPECTED (cues[0].position == 'auto') OK
+EXPECTED (cues[1].position == 'auto') OK
+EXPECTED (cues[2].position == 'auto') OK
+EXPECTED (cues[3].position == 'auto') OK
+EXPECTED (cues[4].position == 'auto') OK
+EXPECTED (cues[5].position == 'auto') OK
+EXPECTED (cues[6].position == 'auto') OK
+EXPECTED (cues[7].position == 'auto') OK
 END OF TEST
 

Modified: trunk/LayoutTests/media/track/track-webvtt-tc015-positioning.html (236530 => 236531)


--- trunk/LayoutTests/media/track/track-webvtt-tc015-positioning.html	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-webvtt-tc015-positioning.html	2018-09-26 23:10:41 UTC (rev 236531)
@@ -29,7 +29,7 @@
                     [
                         {
                             property : "position",
-                            values : [0, 49.2, 50, 100],
+                            values : [0, 49.2, 'auto', 100],
                             precision : 2,
                         },
                     ],
@@ -49,7 +49,7 @@
                     [
                         {
                             property : "position",
-                            values : [50, 50, 50, 50, 50, 50, 50, 50],
+                            values : ['auto', 'auto', 'auto', 'auto', 'auto', 'auto', 'auto', 'auto'],
                         },
                     ],
                 };
@@ -67,4 +67,4 @@
             <track src="" _onload_="trackLoaded()">
         </video>
     </body>
-</html>
\ No newline at end of file
+</html>

Modified: trunk/LayoutTests/media/track/track-webvtt-tc016-align-positioning-expected.txt (236530 => 236531)


--- trunk/LayoutTests/media/track/track-webvtt-tc016-align-positioning-expected.txt	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-webvtt-tc016-align-positioning-expected.txt	2018-09-26 23:10:41 UTC (rev 236531)
@@ -15,9 +15,9 @@
 EXPECTED (cues.length == '3') OK
 EXPECTED (cues[0].position == '10') OK
 EXPECTED (cues[0].align == 'center') OK
-EXPECTED (cues[1].position == '50') OK
+EXPECTED (cues[1].position == 'auto') OK
 EXPECTED (cues[1].align == 'center') OK
-EXPECTED (cues[2].position == '50') OK
+EXPECTED (cues[2].position == 'auto') OK
 EXPECTED (cues[2].align == 'center') OK
 END OF TEST
 

Modified: trunk/LayoutTests/media/track/track-webvtt-tc016-align-positioning.html (236530 => 236531)


--- trunk/LayoutTests/media/track/track-webvtt-tc016-align-positioning.html	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-webvtt-tc016-align-positioning.html	2018-09-26 23:10:41 UTC (rev 236531)
@@ -51,7 +51,7 @@
                     [
                         {
                             property : "position",
-                            values : [10, 50, 50],
+                            values : [10, 'auto', 'auto'],
                         },
                         {
                             property : "align",

Modified: trunk/LayoutTests/media/track/track-webvtt-tc018-align-text-line-position-expected.txt (236530 => 236531)


--- trunk/LayoutTests/media/track/track-webvtt-tc018-align-text-line-position-expected.txt	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-webvtt-tc018-align-text-line-position-expected.txt	2018-09-26 23:10:41 UTC (rev 236531)
@@ -9,7 +9,7 @@
 EXPECTED (cues[0].line == '0') OK
 EXPECTED (cues[0].snapToLines == 'false') OK
 EXPECTED (cues[1].align == 'start') OK
-EXPECTED (cues[1].position == '50') OK
+EXPECTED (cues[1].position == 'auto') OK
 EXPECTED (cues[1].line == '0') OK
 EXPECTED (cues[1].snapToLines == 'true') OK
 EXPECTED (cues[2].align == 'center') OK
@@ -28,7 +28,7 @@
 *** Testing text track 1
 EXPECTED (cues.length == '3') OK
 EXPECTED (cues[0].align == 'center') OK
-EXPECTED (cues[0].position == '50') OK
+EXPECTED (cues[0].position == 'auto') OK
 EXPECTED (cues[0].line == '-1') OK
 EXPECTED (cues[0].snapToLines == 'true') OK
 EXPECTED (cues[1].align == 'end') OK

Modified: trunk/LayoutTests/media/track/track-webvtt-tc018-align-text-line-position.html (236530 => 236531)


--- trunk/LayoutTests/media/track/track-webvtt-tc018-align-text-line-position.html	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-webvtt-tc018-align-text-line-position.html	2018-09-26 23:10:41 UTC (rev 236531)
@@ -33,7 +33,7 @@
                         },
                         {
                             property : "position",
-                            values : [10, 50, 80.3, 30, 60],
+                            values : [10, 'auto', 80.3, 30, 60],
                             precision : 2,
                         },
                         {
@@ -66,7 +66,7 @@
                         },
                         {
                             property : "position",
-                            values : [50, 0, 60],
+                            values : ['auto', 0, 60],
                         },
                         {
                             property : "line",

Modified: trunk/LayoutTests/media/track/track-webvtt-tc021-valign-expected.txt (236530 => 236531)


--- trunk/LayoutTests/media/track/track-webvtt-tc021-valign-expected.txt	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-webvtt-tc021-valign-expected.txt	2018-09-26 23:10:41 UTC (rev 236531)
@@ -6,10 +6,10 @@
 EXPECTED (cues.length == '3') OK
 EXPECTED (cues[0].vertical == 'rl') OK
 EXPECTED (cues[0].align == 'center') OK
-EXPECTED (cues[0].position == '50') OK
+EXPECTED (cues[0].position == 'auto') OK
 EXPECTED (cues[1].vertical == 'lr') OK
 EXPECTED (cues[1].align == 'center') OK
-EXPECTED (cues[1].position == '50') OK
+EXPECTED (cues[1].position == 'auto') OK
 EXPECTED (cues[2].vertical == 'rl') OK
 EXPECTED (cues[2].align == 'start') OK
 EXPECTED (cues[2].position == '0') OK
@@ -18,10 +18,10 @@
 EXPECTED (cues.length == '3') OK
 EXPECTED (cues[0].vertical == 'rl') OK
 EXPECTED (cues[0].align == 'center') OK
-EXPECTED (cues[0].position == '50') OK
+EXPECTED (cues[0].position == 'auto') OK
 EXPECTED (cues[1].vertical == 'lr') OK
 EXPECTED (cues[1].align == 'center') OK
-EXPECTED (cues[1].position == '50') OK
+EXPECTED (cues[1].position == 'auto') OK
 EXPECTED (cues[2].vertical == 'rl') OK
 EXPECTED (cues[2].align == 'start') OK
 EXPECTED (cues[2].position == '0') OK

Modified: trunk/LayoutTests/media/track/track-webvtt-tc021-valign.html (236530 => 236531)


--- trunk/LayoutTests/media/track/track-webvtt-tc021-valign.html	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/track/track-webvtt-tc021-valign.html	2018-09-26 23:10:41 UTC (rev 236531)
@@ -37,7 +37,7 @@
                         },
                         {
                             property : "position",
-                            values : [50, 50, 0],
+                            values : ['auto', 'auto', 0],
                         },
                     ],
                 };

Modified: trunk/LayoutTests/media/video-test.js (236530 => 236531)


--- trunk/LayoutTests/media/video-test.js	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/LayoutTests/media/video-test.js	2018-09-26 23:10:41 UTC (rev 236531)
@@ -377,7 +377,7 @@
             var test = expected.tests[j];
             var propertyString = "cues[" + i + "]." + test.property;
             var propertyValue = eval(propertyString);
-            if (test["precision"])
+            if (test["precision"] && typeof(propertyValue) == 'number')
                 propertyValue = propertyValue.toFixed(test["precision"]);
             reportExpected(test.values[i] == propertyValue, propertyString, "==", test.values[i], propertyValue)
         }

Modified: trunk/Source/WebCore/ChangeLog (236530 => 236531)


--- trunk/Source/WebCore/ChangeLog	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/Source/WebCore/ChangeLog	2018-09-26 23:10:41 UTC (rev 236531)
@@ -1,3 +1,34 @@
+2018-09-26  Per Arne Vollan  <pvol...@apple.com>
+
+        WebVTT cue alignment broken
+        https://bugs.webkit.org/show_bug.cgi?id=190004
+
+        Reviewed by Eric Carlson.
+
+        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:
+
 2018-09-26  James Savage  <james.sav...@apple.com>
 
         Allow override of viewport configuration.

Modified: trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp (236530 => 236531)


--- trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/Source/WebCore/html/track/TextTrackCueGeneric.cpp	2018-09-26 23:10:41 UTC (rev 236531)
@@ -74,6 +74,8 @@
     RefPtr<TextTrackCueGeneric> cue = static_cast<TextTrackCueGeneric*>(getCue());
     Ref<HTMLSpanElement> cueElement = cue->element();
 
+    double textPosition = cue->calculateComputedTextPosition();
+
     CSSValueID alignment = cue->getCSSAlignment();
     float size = static_cast<float>(cue->getCSSSize());
     if (cue->useDefaultPosition()) {
@@ -80,7 +82,7 @@
         setInlineStyleProperty(CSSPropertyBottom, 0, CSSPrimitiveValue::CSS_PX);
         setInlineStyleProperty(CSSPropertyMarginBottom, 1.0, CSSPrimitiveValue::CSS_PERCENTAGE);
     } else {
-        setInlineStyleProperty(CSSPropertyLeft, static_cast<float>(cue->position()), CSSPrimitiveValue::CSS_PERCENTAGE);
+        setInlineStyleProperty(CSSPropertyLeft, static_cast<float>(textPosition), CSSPrimitiveValue::CSS_PERCENTAGE);
         setInlineStyleProperty(CSSPropertyTop, static_cast<float>(cue->line()), CSSPrimitiveValue::CSS_PERCENTAGE);
 
         double authorFontSize = videoSize.height() * cue->baseFontSizeRelativeToVideoHeight() / 100.0;
@@ -95,7 +97,7 @@
         if (cue->getWritingDirection() == VTTCue::Horizontal) {
             setInlineStyleProperty(CSSPropertyWidth, newCueSize, CSSPrimitiveValue::CSS_PERCENTAGE);
             if ((alignment == CSSValueMiddle || alignment == CSSValueCenter) && multiplier != 1.0)
-                setInlineStyleProperty(CSSPropertyLeft, static_cast<double>(cue->position() - (newCueSize - m_cue.getCSSSize()) / 2), CSSPrimitiveValue::CSS_PERCENTAGE);
+                setInlineStyleProperty(CSSPropertyLeft, static_cast<double>(textPosition - (newCueSize - m_cue.getCSSSize()) / 2), CSSPrimitiveValue::CSS_PERCENTAGE);
         } else {
             setInlineStyleProperty(CSSPropertyHeight, newCueSize,  CSSPrimitiveValue::CSS_PERCENTAGE);
             if ((alignment == CSSValueMiddle || alignment == CSSValueCenter) && multiplier != 1.0)
@@ -103,7 +105,6 @@
         }
     }
 
-    double textPosition = m_cue.position();
     double maxSize = 100.0;
     
     if (alignment == CSSValueEnd || alignment == CSSValueRight)
@@ -169,7 +170,7 @@
     return result;
 }
 
-ExceptionOr<void> TextTrackCueGeneric::setPosition(double position)
+ExceptionOr<void> TextTrackCueGeneric::setPosition(const LineAndPositionSetting& position)
 {
     auto result = VTTCue::setPosition(position);
     if (!result.hasException())

Modified: trunk/Source/WebCore/html/track/TextTrackCueGeneric.h (236530 => 236531)


--- trunk/Source/WebCore/html/track/TextTrackCueGeneric.h	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/Source/WebCore/html/track/TextTrackCueGeneric.h	2018-09-26 23:10:41 UTC (rev 236531)
@@ -43,7 +43,7 @@
     }
 
     ExceptionOr<void> setLine(double) final;
-    ExceptionOr<void> setPosition(double) final;
+    ExceptionOr<void> setPosition(const LineAndPositionSetting&) final;
 
     bool useDefaultPosition() const { return m_useDefaultPosition; }
 

Modified: trunk/Source/WebCore/html/track/VTTCue.cpp (236530 => 236531)


--- trunk/Source/WebCore/html/track/VTTCue.cpp	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/Source/WebCore/html/track/VTTCue.cpp	2018-09-26 23:10:41 UTC (rev 236531)
@@ -177,7 +177,7 @@
     if (authorFontSize)
         multiplier = m_fontSizeFromCaptionUserPrefs / authorFontSize;
 
-    double textPosition = m_cue.position();
+    double textPosition = m_cue.calculateComputedTextPosition();
     double maxSize = 100.0;
     CSSValueID alignment = m_cue.getCSSAlignment();
     if (alignment == CSSValueEnd || alignment == CSSValueRight)
@@ -285,7 +285,7 @@
 {
     m_linePosition = undefinedPosition;
     m_computedLinePosition = undefinedPosition;
-    m_textPosition = 50;
+    m_textPosition = std::numeric_limits<double>::quiet_NaN();
     m_cueSize = 100;
     m_writingDirection = Horizontal;
     m_cueAlignment = Center;
@@ -391,20 +391,37 @@
     return { };
 }
 
-ExceptionOr<void> VTTCue::setPosition(double position)
+VTTCue::LineAndPositionSetting VTTCue::position() 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 (!(position >= 0 && position <= 100))
-        return Exception { IndexSizeError };
+    if (textPositionIsAuto())
+        return Auto;
+    return m_textPosition;
+}
 
-    // Otherwise, set the text track cue line position to the new value.
-    if (m_textPosition == position)
-        return { };
-    
+ExceptionOr<void> VTTCue::setPosition(const LineAndPositionSetting& position)
+{
+    // 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 WebVTT cue
+    // 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.
+    double textPosition = 0;
+    if (WTF::holds_alternative<AutoKeyword>(position)) {
+        if (textPositionIsAuto())
+            return { };
+        textPosition = std::numeric_limits<double>::quiet_NaN();
+    } else {
+        if (!(WTF::get<double>(position) >= 0 && WTF::get<double>(position) <= 100))
+            return Exception { IndexSizeError };
+
+        // Otherwise, set the text track cue line position to the new value.
+        textPosition = WTF::get<double>(position);
+        if (m_textPosition == textPosition)
+            return { };
+    }
+
     willChange();
-    m_textPosition = position;
+    m_textPosition = textPosition;
     didChange();
 
     return { };
@@ -609,6 +626,11 @@
     return u_charType(character) == U_PARAGRAPH_SEPARATOR;
 }
 
+bool VTTCue::textPositionIsAuto() const
+{
+    return std::isnan(m_textPosition);
+}
+
 void VTTCue::determineTextDirection()
 {
     static NeverDestroyed<const String> rtTag(MAKE_STATIC_STRING_IMPL("rt"));
@@ -652,6 +674,35 @@
     }
 }
 
+double VTTCue::calculateComputedTextPosition() const
+{
+    // http://dev.w3.org/html5/webvtt/#dfn-cue-computed-position
+    
+    // 1. If the position is numeric, then return the value of the position and
+    // abort these steps. (Otherwise, the position is the special value auto.)
+    if (!textPositionIsAuto())
+        return m_textPosition;
+    
+    switch (m_cueAlignment) {
+    case Start:
+    case Left:
+        // 2. If the cue text alignment is start or left, return 0 and abort these
+        // steps.
+        return 0;
+    case End:
+    case Right:
+        // 3. If the cue text alignment is end or right, return 100 and abort these
+        // steps.
+        return 100;
+    case Center:
+        // 4. If the cue text alignment is center, return 50 and abort these steps.
+        return 50;
+    default:
+        ASSERT_NOT_REACHED();
+        return 0;
+    }
+}
+
 void VTTCue::calculateDisplayParameters()
 {
     // Steps 10.2, 10.3
@@ -667,21 +718,22 @@
 
     // 10.5 Determine the value of maximum size for cue as per the appropriate
     // rules from the following list:
-    int maximumSize = m_textPosition;
+    double computedTextPosition = calculateComputedTextPosition();
+    int 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 == Center) {
-        maximumSize = m_textPosition <= 50 ? m_textPosition : (100 - m_textPosition);
+        maximumSize = computedTextPosition <= 50 ? computedTextPosition : (100 - computedTextPosition);
         maximumSize = maximumSize * 2;
     } else
         ASSERT_NOT_REACHED();
@@ -699,33 +751,33 @@
         switch (m_cueAlignment) {
         case Start:
             if (m_displayDirection == CSSValueLtr)
-                m_displayPosition.first = m_textPosition;
+                m_displayPosition.first = computedTextPosition;
             else
-                m_displayPosition.first = 100 - m_textPosition - m_displaySize;
+                m_displayPosition.first = 100 - computedTextPosition - m_displaySize;
             break;
         case End:
             if (m_displayDirection == CSSValueRtl)
-                m_displayPosition.first = 100 - m_textPosition;
+                m_displayPosition.first = 100 - computedTextPosition;
             else
-                m_displayPosition.first = m_textPosition - m_displaySize;
+                m_displayPosition.first = computedTextPosition - m_displaySize;
             break;
         case Left:
             if (m_displayDirection == CSSValueLtr)
-                m_displayPosition.first = m_textPosition;
+                m_displayPosition.first = computedTextPosition;
             else
-                m_displayPosition.first = 100 - m_textPosition;
+                m_displayPosition.first = 100 - computedTextPosition;
             break;
         case Right:
             if (m_displayDirection == CSSValueLtr)
-                m_displayPosition.first = m_textPosition - m_displaySize;
+                m_displayPosition.first = computedTextPosition - m_displaySize;
             else
-                m_displayPosition.first = 100 - m_textPosition - m_displaySize;
+                m_displayPosition.first = 100 - computedTextPosition - m_displaySize;
             break;
         case Center:
             if (m_displayDirection == CSSValueLtr)
-                m_displayPosition.first = m_textPosition - m_displaySize / 2;
+                m_displayPosition.first = computedTextPosition - m_displaySize / 2;
             else
-                m_displayPosition.first = 100 - m_textPosition - m_displaySize / 2;
+                m_displayPosition.first = 100 - computedTextPosition - m_displaySize / 2;
             break;
         case NumberOfAlignments:
             ASSERT_NOT_REACHED();
@@ -1197,7 +1249,10 @@
     object.setString("vertical"_s, vertical());
     object.setBoolean("snapToLines"_s, snapToLines());
     object.setDouble("line"_s, m_linePosition);
-    object.setDouble("position"_s, position());
+    if (textPositionIsAuto())
+        object.setString("position"_s, "auto");
+    else
+        object.setDouble("position"_s, m_textPosition);
     object.setInteger("size"_s, m_cueSize);
     object.setString("align"_s, align());
     object.setString("regionId"_s, regionId());

Modified: trunk/Source/WebCore/html/track/VTTCue.h (236530 => 236531)


--- trunk/Source/WebCore/html/track/VTTCue.h	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/Source/WebCore/html/track/VTTCue.h	2018-09-26 23:10:41 UTC (rev 236531)
@@ -88,6 +88,12 @@
 
     virtual ~VTTCue();
 
+    enum AutoKeyword {
+        Auto
+    };
+    
+    using LineAndPositionSetting = Variant<double, AutoKeyword>;
+
     const String& vertical() const;
     ExceptionOr<void> setVertical(const String&);
 
@@ -97,8 +103,8 @@
     double line() const { return m_linePosition; }
     virtual ExceptionOr<void> setLine(double);
 
-    double position() const { return m_textPosition; }
-    virtual ExceptionOr<void> setPosition(double);
+    LineAndPositionSetting position() const;
+    virtual ExceptionOr<void> setPosition(const LineAndPositionSetting&);
 
     int size() const { return m_cueSize; }
     ExceptionOr<void> setSize(int);
@@ -170,6 +176,8 @@
 
     String toJSONString() const;
 
+    double calculateComputedTextPosition() const;
+
 protected:
     VTTCue(ScriptExecutionContext&, const MediaTime& start, const MediaTime& end, const String& content);
     VTTCue(ScriptExecutionContext&, const WebVTTCueData&);
@@ -186,6 +194,8 @@
 
     void parseSettings(const String&);
 
+    bool textPositionIsAuto() const;
+    
     void determineTextDirection();
     void calculateDisplayParameters();
 

Modified: trunk/Source/WebCore/html/track/VTTCue.idl (236530 => 236531)


--- trunk/Source/WebCore/html/track/VTTCue.idl	2018-09-26 22:31:18 UTC (rev 236530)
+++ trunk/Source/WebCore/html/track/VTTCue.idl	2018-09-26 23:10:41 UTC (rev 236531)
@@ -23,6 +23,9 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  */
 
+enum AutoKeyword { "auto" };
+typedef (double or AutoKeyword) LineAndPositionSetting;
+
 [
     Conditional=VIDEO_TRACK,
     Constructor(double startTime, double endTime, DOMString text),
@@ -33,7 +36,7 @@
     attribute DOMString vertical;
     attribute boolean snapToLines;
     attribute double line;
-    attribute double position;
+    attribute LineAndPositionSetting position;
     attribute double size;
     attribute DOMString align;
     attribute DOMString text;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to