Bug 1274158 part 2 - Accept zero for perspective. r?heycam draft
authorXidorn Quan <me@upsuper.org>
Fri, 12 Aug 2016 14:52:48 +1000
changeset 399886 6133cbe45da7d32d917ff81b4443c871fb6585b1
parent 399798 645b642f822f5abfcaadcb8ecbef6edebbefaf26
child 528092 f6327fcbd7036e99175d32900ac4ae63e067f7ba
push id26027
push userquanxunzhen@gmail.com
push dateFri, 12 Aug 2016 09:25:32 +0000
reviewersheycam
bugs1274158
milestone51.0a1
Bug 1274158 part 2 - Accept zero for perspective. r?heycam MozReview-Commit-ID: FaXKFav71bD
layout/style/nsCSSParser.cpp
layout/style/nsCSSPropList.h
layout/style/nsCSSProps.h
layout/style/test/property_database.js
--- a/layout/style/nsCSSParser.cpp
+++ b/layout/style/nsCSSParser.cpp
@@ -7812,20 +7812,18 @@ CSSParserImpl::ParseVariant(nsCSSValue& 
     return CSSParseResult::Ok;
   }
   if (((aVariantMask & (VARIANT_LENGTH | VARIANT_ANGLE |
                         VARIANT_FREQUENCY | VARIANT_TIME)) != 0 &&
        eCSSToken_Dimension == tk->mType) ||
       ((aVariantMask & (VARIANT_LENGTH | VARIANT_ZERO_ANGLE)) != 0 &&
        eCSSToken_Number == tk->mType &&
        tk->mNumber == 0.0f)) {
-    if (((aVariantMask & VARIANT_POSITIVE_DIMENSION) != 0 &&
-         tk->mNumber <= 0.0) ||
-        ((aVariantMask & VARIANT_NONNEGATIVE_DIMENSION) != 0 &&
-         tk->mNumber < 0.0)) {
+    if ((aVariantMask & VARIANT_NONNEGATIVE_DIMENSION) != 0 &&
+        tk->mNumber < 0.0) {
         UngetToken();
         AssertNextTokenAt(lineBefore, colBefore);
         return CSSParseResult::NotFound;
     }
     if (TranslateDimension(aValue, aVariantMask, tk->mNumber, tk->mIdent)) {
       return CSSParseResult::Ok;
     }
     // Put the token back; we didn't parse it, so we shouldn't consume it
@@ -15672,18 +15670,18 @@ static bool GetFunctionParseInformation(
          eAbsoluteLengthCalc,
          eTwoLengthPercentCalcs,
          eTwoAbsoluteLengthCalcs,
          eTwoLengthPercentCalcsOneLengthCalc,
          eThreeAbsoluteLengthCalc,
          eAngle,
          eTwoAngles,
          eNumber,
-         ePositiveLength,
-         ePositiveAbsoluteLength,
+         eNonNegativeLength,
+         eNonNegativeAbsoluteLength,
          eTwoNumbers,
          eThreeNumbers,
          eThreeNumbersOneAngle,
          eMatrix,
          eMatrixPrefixed,
          eMatrix3d,
          eMatrix3dPrefixed,
          eNumVariantMasks };
@@ -15694,18 +15692,18 @@ static bool GetFunctionParseInformation(
     {VARIANT_LB},
     {VARIANT_LPCALC, VARIANT_LPCALC},
     {VARIANT_LBCALC, VARIANT_LBCALC},
     {VARIANT_LPCALC, VARIANT_LPCALC, VARIANT_LCALC},
     {VARIANT_LBCALC, VARIANT_LBCALC, VARIANT_LBCALC},
     {VARIANT_ANGLE_OR_ZERO},
     {VARIANT_ANGLE_OR_ZERO, VARIANT_ANGLE_OR_ZERO},
     {VARIANT_NUMBER},
-    {VARIANT_LENGTH|VARIANT_POSITIVE_DIMENSION},
-    {VARIANT_LB|VARIANT_POSITIVE_DIMENSION},
+    {VARIANT_LENGTH|VARIANT_NONNEGATIVE_DIMENSION},
+    {VARIANT_LB|VARIANT_NONNEGATIVE_DIMENSION},
     {VARIANT_NUMBER, VARIANT_NUMBER},
     {VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_NUMBER},
     {VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_ANGLE_OR_ZERO},
     {VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_NUMBER,
      VARIANT_NUMBER, VARIANT_NUMBER},
     {VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_NUMBER,
      VARIANT_LPNCALC, VARIANT_LPNCALC},
     {VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_NUMBER, VARIANT_NUMBER,
@@ -15723,18 +15721,18 @@ static bool GetFunctionParseInformation(
     eAbsoluteLengthCalc,
     eTwoAbsoluteLengthCalcs,
     eTwoAbsoluteLengthCalcs,
     eThreeAbsoluteLengthCalc,
     eThreeAbsoluteLengthCalc,
     eAngle,
     eTwoAngles,
     eNumber,
-    ePositiveAbsoluteLength,
-    ePositiveAbsoluteLength,
+    eNonNegativeAbsoluteLength,
+    eNonNegativeAbsoluteLength,
     eTwoNumbers,
     eThreeNumbers,
     eThreeNumbersOneAngle,
     eMatrix,
     eMatrix,
     eMatrix3d,
     eMatrix3d };
 
@@ -15832,17 +15830,17 @@ static bool GetFunctionParseInformation(
   case eCSSKeyword_matrix3d:
     /* 16 matrix values, all numbers */
     variantIndex = aIsPrefixed ? eMatrix3dPrefixed : eMatrix3d;
     aMinElems = 16U;
     aMaxElems = 16U;
     break;
   case eCSSKeyword_perspective:
     /* Exactly one scale number. */
-    variantIndex = ePositiveLength;
+    variantIndex = eNonNegativeLength;
     aMinElems = 1U;
     aMaxElems = 1U;
     break;
   default:
     /* Oh dear, we didn't match.  Report an error. */
     return false;
   }
 
--- a/layout/style/nsCSSPropList.h
+++ b/layout/style/nsCSSPropList.h
@@ -3477,17 +3477,18 @@ CSS_PROP_SVG(
 CSS_PROP_DISPLAY(
     perspective,
     perspective,
     Perspective,
     CSS_PROPERTY_PARSE_VALUE |
         CSS_PROPERTY_CREATES_STACKING_CONTEXT |
         CSS_PROPERTY_FIXPOS_CB,
     "",
-    VARIANT_NONE | VARIANT_INHERIT | VARIANT_LENGTH | VARIANT_POSITIVE_DIMENSION,
+    VARIANT_NONE | VARIANT_INHERIT | VARIANT_LENGTH |
+      VARIANT_NONNEGATIVE_DIMENSION,
     nullptr,
     offsetof(nsStyleDisplay, mChildPerspective),
     eStyleAnimType_Coord)
 CSS_PROP_DISPLAY(
     perspective-origin,
     perspective_origin,
     PerspectiveOrigin,
     CSS_PROPERTY_PARSE_FUNCTION |
--- a/layout/style/nsCSSProps.h
+++ b/layout/style/nsCSSProps.h
@@ -49,21 +49,20 @@
 #define VARIANT_GRADIENT        0x200000  // eCSSUnit_Gradient
 #define VARIANT_TIMING_FUNCTION 0x400000  // cubic-bezier() and steps()
 #define VARIANT_ALL             0x800000  //
 #define VARIANT_IMAGE_RECT    0x01000000  // eCSSUnit_Function
 // This is an extra bit that says that a VARIANT_ANGLE allows unitless zero:
 #define VARIANT_ZERO_ANGLE    0x02000000  // unitless zero for angles
 #define VARIANT_CALC          0x04000000  // eCSSUnit_Calc
 #define VARIANT_ELEMENT       0x08000000  // eCSSUnit_Element
-#define VARIANT_POSITIVE_DIMENSION 0x10000000 // Only lengths greater than 0.0
-#define VARIANT_NONNEGATIVE_DIMENSION 0x20000000 // Only lengths greater than or equal to 0.0
+#define VARIANT_NONNEGATIVE_DIMENSION 0x10000000 // Only lengths greater than or equal to 0.0
 // Keyword used iff gfx.font_rendering.opentype_svg.enabled is true:
-#define VARIANT_OPENTYPE_SVG_KEYWORD 0x40000000
-#define VARIANT_ABSOLUTE_DIMENSION 0x80000000 // B Only lengths with absolute length unit
+#define VARIANT_OPENTYPE_SVG_KEYWORD 0x20000000
+#define VARIANT_ABSOLUTE_DIMENSION 0x40000000 // B Only lengths with absolute length unit
 
 // Variants that can consume more than one token
 #define VARIANT_MULTIPLE_TOKENS \
   (VARIANT_COLOR |            /* rgb(...), hsl(...), etc. */                  \
    VARIANT_COUNTER |          /* counter(...), counters(...) */               \
    VARIANT_ATTR |             /* attr(...) */                                 \
    VARIANT_GRADIENT |         /* linear-gradient(...), etc. */                \
    VARIANT_TIMING_FUNCTION |  /* cubic-bezier(...), steps(...) */             \
--- a/layout/style/test/property_database.js
+++ b/layout/style/test/property_database.js
@@ -1989,17 +1989,18 @@ var gCSSProperties = {
       "translate(-50px, calc(5px - 10% * 3))",
       "translatez(1px)", "translatez(4em)", "translatez(-4px)",
       "translatez(0px)", "translatez(2px) translatez(5px)",
       "translate3d(3px, 4px, 5px)", "translate3d(2em, 3px, 1em)",
       "translatex(2px) translate3d(4px, 5px, 6px) translatey(1px)",
       "scale3d(4, 4, 4)", "scale3d(-2, 3, -7)", "scalez(4)",
       "scalez(-6)", "rotate3d(2, 3, 4, 45deg)",
       "rotate3d(-3, 7, 0, 12rad)", "rotatex(15deg)", "rotatey(-12grad)",
-      "rotatez(72rad)", "rotatex(0.125turn)", "perspective(1000px)",
+      "rotatez(72rad)", "rotatex(0.125turn)",
+      "perspective(0px)", "perspective(1000px)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)",
     ],
     invalid_values: ["1px", "#0000ff", "red", "auto",
       "translatex(1)", "translatey(1)", "translate(2)",
       "translate(-3, -4)",
       "translatex(1px 1px)", "translatex(translatex(1px))",
       "translatex(#0000ff)", "translatex(red)", "translatey()",
       "matrix(1px, 2px, 3px, 4px, 5px, 6px)", "scale(150%)",
@@ -2009,17 +2010,17 @@ var gCSSProperties = {
       "matrix(1, 2, 3, 4, 5%, 6px)", "matrix(1, 2, 3, 4, 5%, 6%)",
       "matrix(1, 2, 3, 4, 5px, 6em)",
       /* invalid calc() values */
       "translatey(-moz-min(5px,10%))",
       "translatex(-moz-max(5px,10%))",
       "translate(10px, calc(min(5px,10%)))",
       "translate(calc(max(5px,10%)), 10%)",
       "matrix(1, 0, 0, 1, max(5px * 3), calc(10% - 3px))",
-      "perspective(0px)", "perspective(-10px)", "matrix3d(dinosaur)",
+      "perspective(-10px)", "matrix3d(dinosaur)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15%, 16)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16px)",
       "rotatey(words)", "rotatex(7)", "translate3d(3px, 4px, 1px, 7px)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13px, 14em, 15px, 16)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 20%, 10%, 15, 16)"
     ],
@@ -2082,18 +2083,18 @@ var gCSSProperties = {
                       "border", "center red", "right diagonal",
                       "#00ffff bottom"]
   },
   "perspective": {
     domProp: "perspective",
     inherited: false,
     type: CSS_TYPE_LONGHAND,
     initial_values: [ "none" ],
-    other_values: [ "1000px", "500.2px" ],
-    invalid_values: [ "pants", "200", "0", "-100px", "-27.2em", "0px" ]
+    other_values: [ "1000px", "500.2px", "0", "0px" ],
+    invalid_values: [ "pants", "200", "-100px", "-27.2em" ]
   },
   "backface-visibility": {
     domProp: "backfaceVisibility",
     inherited: false,
     type: CSS_TYPE_LONGHAND,
     initial_values: [ "visible" ],
     other_values: [ "hidden" ],
     invalid_values: [ "collapse" ]
@@ -4684,17 +4685,18 @@ var gCSSProperties = {
       "matrix(1, 0, 0, 1, calc(5px * 3), calc(10% - 3px))",
       "translatez(1px)", "translatez(4em)", "translatez(-4px)",
       "translatez(0px)", "translatez(2px) translatez(5px)",
       "translate3d(3px, 4px, 5px)", "translate3d(2em, 3px, 1em)",
       "translatex(2px) translate3d(4px, 5px, 6px) translatey(1px)",
       "scale3d(4, 4, 4)", "scale3d(-2, 3, -7)", "scalez(4)",
       "scalez(-6)", "rotate3d(2, 3, 4, 45deg)",
       "rotate3d(-3, 7, 0, 12rad)", "rotatex(15deg)", "rotatey(-12grad)",
-      "rotatez(72rad)", "rotatex(0.125turn)", "perspective(1000px)",
+      "rotatez(72rad)", "rotatex(0.125turn)",
+      "perspective(0px)", "perspective(1000px)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)",
       /* valid only when prefixed */
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13px, 14em, 15px, 16)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 20%, 10%, 15, 16)",
     ],
     invalid_values: ["1px", "#0000ff", "red", "auto",
       "translatex(1)", "translatey(1)", "translate(2)",
       "translate(-3, -4)",
@@ -4705,17 +4707,17 @@ var gCSSProperties = {
       "matrix(0, 1%, 2, 3, 4px,5px)", "matrix(0, 1, 2%, 3, 4px, 5px)",
       "matrix(0, 1, 2, 3%, 4%, 5%)",
       /* invalid calc() values */
       "translatey(-moz-min(5px,10%))",
       "translatex(-moz-max(5px,10%))",
       "translate(10px, calc(min(5px,10%)))",
       "translate(calc(max(5px,10%)), 10%)",
       "matrix(1, 0, 0, 1, max(5px * 3), calc(10% - 3px))",
-      "perspective(0px)", "perspective(-10px)", "matrix3d(dinosaur)",
+      "perspective(-10px)", "matrix3d(dinosaur)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15%, 16)",
       "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16px)",
       "rotatey(words)", "rotatex(7)", "translate3d(3px, 4px, 1px, 7px)",
     ],
   },
   "-moz-transform-origin": {