Bug 1420357 - fix postion testcase. r=rillian draft
authorbechen@mozilla.com <bechen@mozilla.com>
Wed, 29 Nov 2017 16:16:40 +0800
changeset 704986 ab6066f260abac25d71a1c35511c5389444e000a
parent 704208 ed9dd2c9f0fd64083311166424b47b10e6c9cbdc
child 705459 56b6cd5befbb7c76384290f2f0d8915231ee27f6
push id91301
push userbmo:bechen@mozilla.com
push dateWed, 29 Nov 2017 08:17:01 +0000
reviewersrillian
bugs1420357
milestone59.0a1
Bug 1420357 - fix postion testcase. r=rillian 1. The default value of position is "auto". 2. follow the spec to parse the position value. MozReview-Commit-ID: HO7sQ0go5A6
dom/media/webvtt/vtt.jsm
testing/web-platform/meta/webvtt/parsing/file-parsing/tests/settings-position.html.ini
--- a/dom/media/webvtt/vtt.jsm
+++ b/dom/media/webvtt/vtt.jsm
@@ -122,19 +122,20 @@ const { XPCOMUtils } = require("resource
     has: function(k) {
       return k in this.values;
     },
     // Accept a setting if its one of the given alternatives.
     alt: function(k, v, a) {
       for (var n = 0; n < a.length; ++n) {
         if (v === a[n]) {
           this.set(k, v);
-          break;
+          return true;
         }
       }
+      return false;
     },
     // Accept a setting if its a valid digits value (int or float)
     digitsValue: function(k, v) {
       if (/^-0+(\.[0]*)?$/.test(v)) { // special case for -0.0
         this.set(k, 0.0);
       } else if (/^-?\d+(\.[\d]*)?$/.test(v)) {
         this.set(k, parseFloat(v));
       }
@@ -145,17 +146,23 @@ const { XPCOMUtils } = require("resource
       if ((m = v.match(/^([\d]{1,3})(\.[\d]*)?%$/))) {
         v = parseFloat(v);
         if (v >= 0 && v <= 100) {
           this.set(k, v);
           return true;
         }
       }
       return false;
-    }
+    },
+    // Delete a setting
+    del: function (k) {
+      if (this.has(k)) {
+        delete this.values[k];
+      }
+    },
   };
 
   // Helper function to parse input into groups separated by 'groupDelim', and
   // interprete each group as a key/value pair separated by 'keyValueDelim'.
   function parseOptions(input, callback, keyValueDelim, groupDelim) {
     var groups = groupDelim ? input.split(groupDelim) : [input];
     for (var i in groups) {
       if (typeof groups[i] !== "string") {
@@ -184,17 +191,16 @@ const { XPCOMUtils } = require("resource
       // Remove time stamp from input.
       input = input.replace(/^[^\s\uFFFDa-zA-Z-]+/, "");
       return ts;
     }
 
     // 4.4.2 WebVTT cue settings
     function consumeCueSettings(input, cue) {
       var settings = new Settings();
-
       parseOptions(input, function (k, v) {
         switch (k) {
         case "region":
           // Find the last region we parsed with the same region id.
           for (var i = regionList.length - 1; i >= 0; i--) {
             if (regionList[i].id === v) {
               settings.set(k, regionList[i].region);
               break;
@@ -211,40 +217,46 @@ const { XPCOMUtils } = require("resource
           settings.percent(k, vals0) ? settings.set("snapToLines", false) : null;
           settings.alt(k, vals0, ["auto"]);
           if (vals.length === 2) {
             settings.alt("lineAlign", vals[1], ["start", "center", "end"]);
           }
           break;
         case "position":
           vals = v.split(",");
-          settings.percent(k, vals[0]);
-          if (vals.length === 2) {
-            settings.alt("positionAlign", vals[1], ["line-left", "center", "line-right", "auto"]);
+          if (settings.percent(k, vals[0])) {
+            if (vals.length === 2) {
+              if (!settings.alt("positionAlign", vals[1], ["line-left", "center", "line-right"])) {
+                // Remove the "position" value because the "positionAlign" is not expected value.
+                // It will be set to default value below.
+                settings.del(k);
+              }
+            }
           }
           break;
         case "size":
           settings.percent(k, v);
           break;
         case "align":
           settings.alt(k, v, ["start", "center", "end", "left", "right"]);
           break;
         }
       }, /:/, /\t|\n|\f|\r| /); // groupDelim is ASCII whitespace
 
       // Apply default values for any missing fields.
+      // https://w3c.github.io/webvtt/#collect-a-webvtt-block step 11.4.1.3
       cue.region = settings.get("region", null);
       cue.vertical = settings.get("vertical", "");
       cue.line = settings.get("line", "auto");
       cue.lineAlign = settings.get("lineAlign", "start");
       cue.snapToLines = settings.get("snapToLines", true);
       cue.size = settings.get("size", 100);
       cue.align = settings.get("align", "center");
       cue.position = settings.get("position", "auto");
-      cue.positionAlign = settings.get("positionAlign", "center");
+      cue.positionAlign = settings.get("positionAlign", "auto");
     }
 
     function skipWhitespace() {
       input = input.replace(/^[ \f\n\r\t]+/, "");
     }
 
     // 4.1 WebVTT cue timings.
     skipWhitespace();
deleted file mode 100644
--- a/testing/web-platform/meta/webvtt/parsing/file-parsing/tests/settings-position.html.ini
+++ /dev/null
@@ -1,5 +0,0 @@
-[settings-position.html]
-  type: testharness
-  [settings, position]
-    expected: FAIL
-