tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

property_database.js (408303B)


      1 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
      2 /* eslint-disable dot-notation */
      3 /* vim: set ts=2 sw=2 sts=2 et: */
      4 /* This Source Code Form is subject to the terms of the Mozilla Public
      5 * License, v. 2.0. If a copy of the MPL was not distributed with this
      6 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      7 
      8 // Utility function. Returns true if the given boolean pref...
      9 //  (a) exists and (b) is set to true.
     10 // Otherwise, returns false.
     11 //
     12 // This function also reports a test failure if the pref isn't set at all. This
     13 // ensures that we remove pref-checks from mochitests (instead of accidentally
     14 // disabling the tests that are controlled by that check) when we remove a
     15 // mature feature's pref from the rest of the codebase.
     16 function IsCSSPropertyPrefEnabled(prefName) {
     17  try {
     18    if (SpecialPowers.getBoolPref(prefName)) {
     19      return true;
     20    }
     21  } catch (ex) {
     22    ok(
     23      false,
     24      "Failed to look up property-controlling pref '" +
     25        prefName +
     26        "' (" +
     27        ex +
     28        ")"
     29    );
     30  }
     31 
     32  return false;
     33 }
     34 
     35 // True longhand properties.
     36 const CSS_TYPE_LONGHAND = 0;
     37 
     38 // True shorthand properties.
     39 const CSS_TYPE_TRUE_SHORTHAND = 1;
     40 
     41 // Properties that we handle as shorthands but were longhands either in
     42 // the current spec or earlier versions of the spec.
     43 const CSS_TYPE_SHORTHAND_AND_LONGHAND = 2;
     44 
     45 // Legacy shorthand properties, that behave mostly like an alias
     46 // (CSS_TYPE_SHORTHAND_AND_LONGHAND) but not quite because their syntax may not
     47 // match, plus they shouldn't serialize in cssText.
     48 const CSS_TYPE_LEGACY_SHORTHAND = 3;
     49 
     50 // Each property has the following fields:
     51 //   domProp: The name of the relevant member of CSSStyleProperties
     52 //   inherited: Whether the property is inherited by default (stated as
     53 //     yes or no in the property header in all CSS specs)
     54 //   type: see above
     55 //   alias_for: optional, indicates that the property is an alias for
     56 //     some other property that is the preferred serialization.  (Type
     57 //     must not be CSS_TYPE_LONGHAND.)
     58 //   logical: optional, indicates that the property is a logical directional
     59 //     property.  (Type must be CSS_TYPE_LONGHAND.)
     60 //   axis: optional, indicates that the property is an axis-related logical
     61 //     directional property.  (Type must be CSS_TYPE_LONGHAND and 'logical'
     62 //     must be true.)
     63 //   initial_values: Values whose computed value should be the same as the
     64 //     computed value for the property's initial value.
     65 //   other_values: Values whose computed value should be different from the
     66 //     computed value for the property's initial value.
     67 //   XXX Should have a third field for values whose computed value may or
     68 //     may not be the same as for the property's initial value.
     69 //   invalid_values: Things that are not values for the property and
     70 //     should be rejected, but which are balanced and should not absorb
     71 //     what follows
     72 //   quirks_values: Values that should be accepted in quirks mode only,
     73 //     mapped to the values they are equivalent to.
     74 //   unbalanced_values: Things that are not values for the property and
     75 //     should be rejected, and which also contain unbalanced constructs
     76 //     that should absorb what follows
     77 //
     78 // Note: By default, an alias is assumed to accept/reject the same values as
     79 // the property that it aliases, and to have the same prerequisites. So, if
     80 // "alias_for" is set, the "*_values" and "prerequisites" fields can simply
     81 // be omitted, and they'll be populated automatically to match the aliased
     82 // property's fields.
     83 
     84 // Helper functions used to construct gCSSProperties.
     85 
     86 function initial_font_family_is_sans_serif() {
     87  // The initial value of 'font-family' might be 'serif' or
     88  // 'sans-serif'.
     89  const meta = document.createElement("meta");
     90  meta.setAttribute("style", "font: initial;");
     91  document.documentElement.appendChild(meta);
     92  const family = getComputedStyle(meta).fontFamily;
     93  meta.remove();
     94  return family == "sans-serif";
     95 }
     96 
     97 var gInitialFontFamilyIsSansSerif = initial_font_family_is_sans_serif();
     98 
     99 // shared by background-image and border-image-source
    100 var validNonUrlImageValues = [
    101  "-moz-element(#a)",
    102  "-moz-element(  #a  )",
    103  "-moz-element(#a-1)",
    104  "-moz-element(#a\\:1)",
    105  /* gradient torture test */
    106  "linear-gradient(red, blue)",
    107  "linear-gradient(red, yellow, blue)",
    108  "linear-gradient(red 1px, yellow 20%, blue 24em, green)",
    109  "linear-gradient(red, yellow, green, blue 50%)",
    110  "linear-gradient(red -50%, yellow -25%, green, blue)",
    111  "linear-gradient(red -99px, yellow, green, blue 120%)",
    112  "linear-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
    113  "linear-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
    114  "linear-gradient(red, green calc(50% + 20px), blue)",
    115  "linear-gradient(180deg, red, blue)",
    116 
    117  "linear-gradient(to top, red, blue)",
    118  "linear-gradient(to bottom, red, blue)",
    119  "linear-gradient(to left, red, blue)",
    120  "linear-gradient(to right, red, blue)",
    121  "linear-gradient(to top left, red, blue)",
    122  "linear-gradient(to top right, red, blue)",
    123  "linear-gradient(to bottom left, red, blue)",
    124  "linear-gradient(to bottom right, red, blue)",
    125  "linear-gradient(to left top, red, blue)",
    126  "linear-gradient(to left bottom, red, blue)",
    127  "linear-gradient(to right top, red, blue)",
    128  "linear-gradient(to right bottom, red, blue)",
    129 
    130  "linear-gradient(-33deg, red, blue)",
    131  "linear-gradient(30grad, red, blue)",
    132  "linear-gradient(10deg, red, blue)",
    133  "linear-gradient(1turn, red, blue)",
    134  "linear-gradient(.414rad, red, blue)",
    135 
    136  "linear-gradient(.414rad, red, 50%, blue)",
    137  "linear-gradient(.414rad, red, 0%, blue)",
    138  "linear-gradient(.414rad, red, 100%, blue)",
    139 
    140  "linear-gradient(.414rad, red 50%, 50%, blue 50%)",
    141  "linear-gradient(.414rad, red 50%, 20%, blue 50%)",
    142  "linear-gradient(.414rad, red 50%, 30%, blue 10%)",
    143  "linear-gradient(to right bottom, red, 20%, green 50%, 65%, blue)",
    144  "linear-gradient(to right bottom, red, 20%, green 10%, blue)",
    145  "linear-gradient(to right bottom, red, 50%, green 50%, 50%, blue)",
    146  "linear-gradient(to right bottom, red, 0%, green 50%, 100%, blue)",
    147 
    148  "linear-gradient(red 0% 100%)",
    149  "linear-gradient(red 0% 50%, blue 50%)",
    150  "linear-gradient(red 0% 50%, blue 50% 100%)",
    151  "linear-gradient(red 0% 50%, 0%, blue 50%)",
    152  "linear-gradient(red 0% 50%, 0%, blue 50% 100%)",
    153 
    154  /* Unitless 0 is valid as an <angle> */
    155  "linear-gradient(0, red, blue)",
    156 
    157  "radial-gradient(red, blue)",
    158  "radial-gradient(red, yellow, blue)",
    159  "radial-gradient(red 1px, yellow 20%, blue 24em, green)",
    160  "radial-gradient(red, yellow, green, blue 50%)",
    161  "radial-gradient(red -50%, yellow -25%, green, blue)",
    162  "radial-gradient(red -99px, yellow, green, blue 120%)",
    163  "radial-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
    164 
    165  "radial-gradient(0 0, red, blue)",
    166  "radial-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
    167 
    168  "radial-gradient(at top left, red, blue)",
    169  "radial-gradient(at 20% bottom, red, blue)",
    170  "radial-gradient(at center 20%, red, blue)",
    171  "radial-gradient(at left 35px, red, blue)",
    172  "radial-gradient(at 10% 10em, red, blue)",
    173  "radial-gradient(at 44px top, red, blue)",
    174  "radial-gradient(at 0 0, red, blue)",
    175 
    176  "radial-gradient(farthest-corner, red, blue)",
    177  "radial-gradient(circle, red, blue)",
    178  "radial-gradient(ellipse closest-corner, red, blue)",
    179  "radial-gradient(closest-corner ellipse, red, blue)",
    180  "radial-gradient(farthest-side circle, red, blue)",
    181 
    182  "radial-gradient(at 43px, red, blue)",
    183  "radial-gradient(at 43px 43px, red, blue)",
    184  "radial-gradient(at 50% 50%, red, blue)",
    185  "radial-gradient(at 43px 50%, red, blue)",
    186  "radial-gradient(at 50% 43px, red, blue)",
    187  "radial-gradient(circle 43px, red, blue)",
    188  "radial-gradient(43px circle, red, blue)",
    189  "radial-gradient(ellipse 43px 43px, red, blue)",
    190  "radial-gradient(ellipse 50% 50%, red, blue)",
    191  "radial-gradient(ellipse 43px 50%, red, blue)",
    192  "radial-gradient(ellipse 50% 43px, red, blue)",
    193  "radial-gradient(50% 43px ellipse, red, blue)",
    194 
    195  "radial-gradient(farthest-corner at top left, red, blue)",
    196  "radial-gradient(ellipse closest-corner at 45px, red, blue)",
    197  "radial-gradient(circle farthest-side at 45px, red, blue)",
    198  "radial-gradient(closest-side ellipse at 50%, red, blue)",
    199  "radial-gradient(farthest-corner circle at 4em, red, blue)",
    200 
    201  "radial-gradient(30% 40% at top left, red, blue)",
    202  "radial-gradient(50px 60px at 15% 20%, red, blue)",
    203  "radial-gradient(7em 8em at 45px, red, blue)",
    204 
    205  "radial-gradient(circle at 15% 20%, red, blue)",
    206 
    207  "radial-gradient(red 0% 100%)",
    208  "radial-gradient(red 0% 50%, blue 50%)",
    209  "radial-gradient(red 0% 50%, blue 50% 100%)",
    210  "radial-gradient(red 0% 50%, 0%, blue 50%)",
    211  "radial-gradient(red 0% 50%, 0%, blue 50% 100%)",
    212 
    213  "repeating-radial-gradient(red, blue)",
    214  "repeating-radial-gradient(red, yellow, blue)",
    215  "repeating-radial-gradient(red 1px, yellow 20%, blue 24em, green)",
    216  "repeating-radial-gradient(red, yellow, green, blue 50%)",
    217  "repeating-radial-gradient(red -50%, yellow -25%, green, blue)",
    218  "repeating-radial-gradient(red -99px, yellow, green, blue 120%)",
    219  "repeating-radial-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
    220  "repeating-radial-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
    221 
    222  "repeating-radial-gradient(at top left, red, blue)",
    223  "repeating-radial-gradient(at 0 0, red, blue)",
    224  "repeating-radial-gradient(at 20% bottom, red, blue)",
    225  "repeating-radial-gradient(at center 20%, red, blue)",
    226  "repeating-radial-gradient(at left 35px, red, blue)",
    227  "repeating-radial-gradient(at 10% 10em, red, blue)",
    228  "repeating-radial-gradient(at 44px top, red, blue)",
    229 
    230  "repeating-radial-gradient(farthest-corner at top left, red, blue)",
    231  "repeating-radial-gradient(closest-corner ellipse at 45px, red, blue)",
    232  "repeating-radial-gradient(farthest-side circle at 45px, red, blue)",
    233  "repeating-radial-gradient(ellipse closest-side at 50%, red, blue)",
    234  "repeating-radial-gradient(circle farthest-corner at 4em, red, blue)",
    235 
    236  "repeating-radial-gradient(30% 40% at top left, red, blue)",
    237  "repeating-radial-gradient(50px 60px at 15% 20%, red, blue)",
    238  "repeating-radial-gradient(7em 8em at 45px, red, blue)",
    239 
    240  // When that happens this should be moved to the `invalid` list.
    241  "repeating-radial-gradient(circle closest-side at left 0px bottom 7in, hsl(2,2%,5%), rgb(1,6,0))",
    242 
    243  "radial-gradient(at calc(25%) top, red, blue)",
    244  "radial-gradient(at left calc(25%), red, blue)",
    245  "radial-gradient(at calc(25px) top, red, blue)",
    246  "radial-gradient(at left calc(25px), red, blue)",
    247  "radial-gradient(at calc(-25%) top, red, blue)",
    248  "radial-gradient(at left calc(-25%), red, blue)",
    249  "radial-gradient(at calc(-25px) top, red, blue)",
    250  "radial-gradient(at left calc(-25px), red, blue)",
    251  "radial-gradient(at calc(100px + -25%) top, red, blue)",
    252  "radial-gradient(at left calc(100px + -25%), red, blue)",
    253  "radial-gradient(at calc(100px + -25px) top, red, blue)",
    254  "radial-gradient(at left calc(100px + -25px), red, blue)",
    255 
    256  "image-set(linear-gradient(green, green) 1x, url(foobar.png) 2x)",
    257  "image-set(linear-gradient(red, red), url(foobar.png) 2x)",
    258  "image-set(url(foobar.png) 2x)",
    259  "image-set(url(foobar.png) 1x, url(bar.png) 2x, url(baz.png) 3x)",
    260  "image-set('foobar.png', 'bar.png' 2x, url(baz.png) 3x)",
    261  "image-set(url(foobar.png) type('image/png'))",
    262  "image-set(url(foobar.png) 1x type('image/png'))",
    263  "image-set(url(foobar.png) type('image/png') 1x)",
    264 
    265  ...(IsCSSPropertyPrefEnabled("layout.css.cross-fade.enabled")
    266    ? [
    267        "cross-fade(red, blue)",
    268        "cross-fade(red)",
    269        "cross-fade(red 50%)",
    270        // see: <https://github.com/w3c/csswg-drafts/issues/5333>. This
    271        // may become invalid depending on how discussion on that issue
    272        // goes.
    273        "cross-fade(red -50%, blue 150%)",
    274        "cross-fade(red -50%, url(www.example.com))",
    275 
    276        "cross-fade(url(http://placekitten.com/200/300), 55% linear-gradient(red, blue))",
    277        "cross-fade(cross-fade(red, white), cross-fade(blue))",
    278        "cross-fade(gold 77%, 60% blue)",
    279 
    280        "cross-fade(url(http://placekitten.com/200/300), url(http://placekitten.com/200/300))",
    281        "cross-fade(#F0F8FF, rgb(0, 0, 0), rgba(0, 255, 0, 1) 25%)",
    282      ]
    283    : []),
    284 
    285  // Conic gradient
    286  "conic-gradient(red, blue)",
    287  "conic-gradient(red,blue,yellow)",
    288  "conic-gradient(  red  ,  blue,   yellow)",
    289  "conic-gradient(red 0, blue 50deg)",
    290  "conic-gradient(red 10%, blue 50%)",
    291  "conic-gradient(red -50deg, blue 50deg)",
    292  "conic-gradient(red 50deg, blue 0.3turn, yellow 200grad, orange 60% 5rad)",
    293 
    294  "conic-gradient(red 0 100%)",
    295  "conic-gradient(red 0 50%, blue 50%)",
    296  "conic-gradient(red 0 50deg, blue 50% 100%)",
    297  "conic-gradient(red 0 50%, 0deg, blue 50%)",
    298  "conic-gradient(red 0deg 50%, 0%, blue 50% 100%)",
    299 
    300  "conic-gradient(from 0, red, blue)",
    301  "conic-gradient(from 40deg, red, blue)",
    302  "conic-gradient(from 0.4turn, red, blue)",
    303  "conic-gradient(from 200grad, red, blue)",
    304  "conic-gradient(from 5rad, red, blue)",
    305 
    306  "conic-gradient(at top, red, blue)",
    307  "conic-gradient(at top left, red, blue)",
    308  "conic-gradient(at left top, red, blue)",
    309  "conic-gradient(at center center, red, blue)",
    310  "conic-gradient(at 20% bottom, red, blue)",
    311  "conic-gradient(at center 20%, red, blue)",
    312  "conic-gradient(at left 35px, red, blue)",
    313  "conic-gradient(at 10% 10em, red, blue)",
    314  "conic-gradient(at 44px top, red, blue)",
    315  "conic-gradient(at 0 0, red, blue)",
    316  "conic-gradient(at 10px, red, blue)",
    317 
    318  "conic-gradient(at calc(25%) top, red, blue)",
    319  "conic-gradient(at left calc(25%), red, blue)",
    320  "conic-gradient(at calc(25px) top, red, blue)",
    321  "conic-gradient(at left calc(25px), red, blue)",
    322  "conic-gradient(at calc(-25%) top, red, blue)",
    323  "conic-gradient(at left calc(-25%), red, blue)",
    324  "conic-gradient(at calc(-25px) top, red, blue)",
    325  "conic-gradient(at left calc(-25px), red, blue)",
    326  "conic-gradient(at calc(100px + -25%) top, red, blue)",
    327  "conic-gradient(at left calc(100px + -25%), red, blue)",
    328  "conic-gradient(at calc(100px + -25px) top, red, blue)",
    329  "conic-gradient(at left calc(100px + -25px), red, blue)",
    330 
    331  "conic-gradient(from 0 at 0 0, red, blue)",
    332  "conic-gradient(from 40deg at 50%, red, blue)",
    333  "conic-gradient(from 0.4turn at left 30%, red, blue)",
    334  "conic-gradient(from 200grad at calc(100px + -25%) top, red, blue)",
    335  "conic-gradient(from 5rad at 10px, red, blue)",
    336 
    337  "repeating-conic-gradient(red, blue)",
    338  "repeating-conic-gradient(red, yellow, blue)",
    339  "repeating-conic-gradient(red 1deg, yellow 20%, blue 5rad, green)",
    340  "repeating-conic-gradient(red, yellow, green, blue 50%)",
    341  "repeating-conic-gradient(red -50%, yellow -25%, green, blue)",
    342  "repeating-conic-gradient(red -99deg, yellow, green, blue 120%)",
    343  "repeating-conic-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
    344  "repeating-conic-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
    345 
    346  "repeating-conic-gradient(from 0, red, blue)",
    347  "repeating-conic-gradient(from 40deg, red, blue)",
    348  "repeating-conic-gradient(from 0.4turn, red, blue)",
    349  "repeating-conic-gradient(from 200grad, red, blue)",
    350  "repeating-conic-gradient(from 5rad, red, blue)",
    351 
    352  "repeating-conic-gradient(at top left, red, blue)",
    353  "repeating-conic-gradient(at 0 0, red, blue)",
    354  "repeating-conic-gradient(at 20% bottom, red, blue)",
    355  "repeating-conic-gradient(at center 20%, red, blue)",
    356  "repeating-conic-gradient(at left 35px, red, blue)",
    357  "repeating-conic-gradient(at 10% 10em, red, blue)",
    358  "repeating-conic-gradient(at 44px top, red, blue)",
    359 
    360  "repeating-conic-gradient(from 0 at 0 0, red, blue)",
    361  "repeating-conic-gradient(from 40deg at 50%, red, blue)",
    362  "repeating-conic-gradient(from 0.4turn at left 30%, red, blue)",
    363  "repeating-conic-gradient(from 200grad at calc(100px + -25%) top, red, blue)",
    364  "repeating-conic-gradient(from 5rad at 10px, red, blue)",
    365 
    366  // 2008 GRADIENTS: -webkit-gradient()
    367  // ----------------------------------
    368  // linear w/ no color stops (valid) and a variety of position values:
    369  "-webkit-gradient(linear, 1 2, 3 4)",
    370  "-webkit-gradient(linear,1 2,3 4)", // (no extra space)
    371  "-webkit-gradient(linear  ,  1   2  ,  3   4  )", // (lots of extra space)
    372  "-webkit-gradient(linear, 1 10% , 0% 4)", // percentages
    373  "-webkit-gradient(linear, +1.0 -2%, +5.3% -0)", // (+/- & decimals are valid)
    374  "-webkit-gradient(linear, left top, right bottom)", // keywords
    375  "-webkit-gradient(linear, right center, center top)",
    376  "-webkit-gradient(linear, center center, center center)",
    377  "-webkit-gradient(linear, center 5%, 30 top)", // keywords mixed w/ nums
    378 
    379  // linear w/ just 1 color stop:
    380  "-webkit-gradient(linear, 1 2, 3 4, from(lime))",
    381  "-webkit-gradient(linear, 1 2, 3 4, to(lime))",
    382  // * testing the various allowable stop values (<number> & <percent>):
    383  "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, lime))",
    384  "-webkit-gradient(linear, 1 2, 3 4, color-stop(-0, lime))",
    385  "-webkit-gradient(linear, 1 2, 3 4, color-stop(-30, lime))",
    386  "-webkit-gradient(linear, 1 2, 3 4, color-stop(+9999, lime))",
    387  "-webkit-gradient(linear, 1 2, 3 4, color-stop(-.1, lime))",
    388  "-webkit-gradient(linear, 1 2, 3 4, color-stop(0%, lime))",
    389  "-webkit-gradient(linear, 1 2, 3 4, color-stop(100%, lime))",
    390  "-webkit-gradient(linear, 1 2, 3 4, color-stop(9999%, lime))",
    391  "-webkit-gradient(linear, 1 2, 3 4, color-stop(-.5%, lime))",
    392  "-webkit-gradient(linear, 1 2, 3 4, color-stop(+0%, lime))",
    393  // * testing the various color values:
    394  "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, transparent))",
    395  "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, rgb(1,2,3)))",
    396  "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, #00ff00))",
    397  "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, #00f))",
    398  "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, hsla(240, 30%, 50%, 0.8)))",
    399  "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, rgba(255, 230, 10, 0.5)))",
    400 
    401  // linear w/ multiple color stops:
    402  // * using from()/to() -- note that out-of-order is OK:
    403  "-webkit-gradient(linear, 1 2, 3 4, from(lime), from(blue))",
    404  "-webkit-gradient(linear, 1 2, 3 4, to(lime),   to(blue))",
    405  "-webkit-gradient(linear, 1 2, 3 4, from(lime), to(blue))",
    406  "-webkit-gradient(linear, 1 2, 3 4, to(lime),   from(blue))",
    407  "-webkit-gradient(linear, 1 2, 3 4, from(lime), to(blue), from(purple))",
    408  // * using color-stop():
    409  "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, lime), color-stop(30%, blue))",
    410  "-webkit-gradient(linear, 1 2, 3 4, color-stop(0, lime), color-stop(30%, blue), color-stop(100%, purple))",
    411  // * using color-stop() intermixed with from()/to() functions:
    412  "-webkit-gradient(linear, 1 2, 3 4, from(lime), color-stop(30%, blue))",
    413  "-webkit-gradient(linear, 1 2, 3 4, color-stop(30%, blue), to(lime))",
    414  // * overshooting endpoints (0 & 1.0)
    415  "-webkit-gradient(linear, 1 2, 3 4, color-stop(-30%, lime), color-stop(.4, blue), color-stop(1.5, purple))",
    416  // * repeating a stop position (valid)
    417  "-webkit-gradient(linear, 1 2, 3 4, color-stop(30%, lime), color-stop(30%, blue))",
    418  // * stops out of order (valid)
    419  "-webkit-gradient(linear, 1 2, 3 4, color-stop(70%, lime), color-stop(20%, blue), color-stop(40%, purple))",
    420 
    421  // radial w/ no color stops (valid) and a several different radius values:
    422  "-webkit-gradient(radial, 1 2, 8, 3 4, 9)",
    423  "-webkit-gradient(radial, 0 0, 10, 0 0, 5)",
    424 
    425  // radial w/ color stops
    426  // (mostly leaning on more-robust 'linear' tests above; just testing a few
    427  // examples w/ radial as a sanity-check):
    428  "-webkit-gradient(radial, 1 2, 8, 3 4, 9, from(lime))",
    429  "-webkit-gradient(radial, 1 2, 8, 3 4, 9, to(blue))",
    430  "-webkit-gradient(radial, 1 2, 8, 3 4, 9, color-stop(0.5, #00f), color-stop(0.8, rgba(100, 200, 0, 0.5)))",
    431 
    432  // 2011 GRADIENTS: -webkit-linear-gradient(), -webkit-radial -gradient()
    433  // ---------------------------------------------------------------------
    434  // Basic linear-gradient syntax (valid when prefixed or unprefixed):
    435  "-webkit-linear-gradient(red, green, blue)",
    436 
    437  // Angled linear-gradients (valid when prefixed or unprefixed):
    438  "-webkit-linear-gradient(135deg, red, blue)",
    439  "-webkit-linear-gradient( 135deg  , red  , blue )",
    440  "-webkit-linear-gradient(280deg, red 60%, blue)",
    441 
    442  // Linear-gradient with unitless-0 <angle> (normally invalid for <angle>
    443  // but accepted here for better webkit emulation):
    444  "-webkit-linear-gradient(0, red, blue)",
    445 
    446  // Linear-gradient with calc expression (bug 1363349)
    447  "-webkit-gradient(linear, calc(5 + 5) top, calc(10 + 10) top, from(blue), to(lime))",
    448  "-webkit-gradient(linear, calc(5 - 5) top, calc(10 + 10) top, from(blue), to(lime))",
    449  "-webkit-gradient(linear, calc(5 * 5) top, calc(10 + 10) top, from(blue), to(lime))",
    450  "-webkit-gradient(linear, calc(5 / 5) top, calc(10 + 10) top, from(blue), to(lime))",
    451  "-webkit-gradient(linear, left calc(25% - 10%), right calc(75% + 10%), from(blue), to(lime))",
    452  "-webkit-gradient(linear, calc(1) 2, 3 4)",
    453 
    454  // Radial-gradient with calc expression (bug 1363349)
    455  "-webkit-gradient(radial, 1 2, 0, 3 4, calc(1 + 5), from(blue), to(lime))",
    456  "-webkit-gradient(radial, 1 2, calc(1 + 2), 3 4, calc(1 + 5), from(blue), to(lime))",
    457  "-webkit-gradient(radial, 1 2, calc(1 - 2), 3 4, calc(1 + 5), from(blue), to(lime))",
    458  "-webkit-gradient(radial, 1 2, calc(1 * 2), 3 4, calc(1 + 5), from(blue), to(lime))",
    459  "-webkit-gradient(radial, 1 2, calc(1 / 2), 3 4, calc(1 + 5), from(blue), to(lime))",
    460  "-webkit-gradient(radial, calc(0 + 1) calc(1 + 1), calc(1 + 2), calc(1 + 2) 4, calc(1 + 5), from(blue), to(lime))",
    461  "-webkit-gradient(radial, 1 2, calc(8), 3 4, 9)",
    462 
    463  // Basic radial-gradient syntax (valid when prefixed or unprefixed):
    464  "-webkit-radial-gradient(circle, white, black)",
    465  "-webkit-radial-gradient(circle, white, black)",
    466  "-webkit-radial-gradient(ellipse closest-side, white, black)",
    467  "-webkit-radial-gradient(circle farthest-corner, white, black)",
    468 
    469  // Contain/cover keywords (valid only for -moz/-webkit prefixed):
    470  "-webkit-radial-gradient(cover, red, blue)",
    471  "-webkit-radial-gradient(cover circle, red, blue)",
    472  "-webkit-radial-gradient(contain, red, blue)",
    473  "-webkit-radial-gradient(contain ellipse, red, blue)",
    474 
    475  // Initial side/corner/point (valid only for -moz/-webkit prefixed):
    476  "-webkit-linear-gradient(top, red, blue)",
    477  "-webkit-linear-gradient(left, red, blue)",
    478  "-webkit-linear-gradient(bottom, red, blue)",
    479  "-webkit-linear-gradient(right top, red, blue)",
    480  "-webkit-linear-gradient(top right, red, blue)",
    481  "-webkit-radial-gradient(right, red, blue)",
    482  "-webkit-radial-gradient(left bottom, red, blue)",
    483  "-webkit-radial-gradient(bottom left, red, blue)",
    484  "-webkit-radial-gradient(center, red, blue)",
    485  "-webkit-radial-gradient(center right, red, blue)",
    486  "-webkit-radial-gradient(center center, red, blue)",
    487  "-webkit-radial-gradient(center top, red, blue)",
    488  "-webkit-radial-gradient(left 50%, red, blue)",
    489  "-webkit-radial-gradient(20px top, red, blue)",
    490  "-webkit-radial-gradient(20em 30%, red, blue)",
    491 
    492  // Point + keyword-sized shape (valid only for -moz/-webkit prefixed):
    493  "-webkit-radial-gradient(center, circle closest-corner, red, blue)",
    494  "-webkit-radial-gradient(10px 20px, cover circle, red, blue)",
    495  "-webkit-radial-gradient(5em 50%, ellipse contain, red, blue)",
    496 
    497  // Repeating examples:
    498  "-webkit-repeating-linear-gradient(red 10%, blue 30%)",
    499  "-webkit-repeating-linear-gradient(30deg, pink 20px, orange 70px)",
    500  "-webkit-repeating-linear-gradient(left, red, blue)",
    501  "-webkit-repeating-linear-gradient(left, red 10%, blue 30%)",
    502  "-webkit-repeating-radial-gradient(circle, red, blue 10%, red 20%)",
    503  "-webkit-repeating-radial-gradient(circle farthest-corner, gray 10px, yellow 20px)",
    504  "-webkit-repeating-radial-gradient(top left, circle, red, blue 4%, red 8%)",
    505 ];
    506 var invalidNonUrlImageValues = [
    507  "-moz-element(#a:1)",
    508  "-moz-element(a#a)",
    509  "-moz-element(#a a)",
    510  "-moz-element(#a+a)",
    511  "-moz-element(#a())",
    512  /* no quirks mode colors */
    513  "linear-gradient(red, ff00ff)",
    514  /* no quirks mode colors */
    515  "radial-gradient(at 10% bottom, ffffff, black) scroll no-repeat",
    516  /* no quirks mode lengths */
    517  "linear-gradient(red -99, yellow, green, blue 120%)",
    518  /* Unitless nonzero numbers are valid as an <angle> */
    519  "linear-gradient(30, red, blue)",
    520  /* There must be a comma between gradient-line (e.g. <angle>) and colors */
    521  "linear-gradient(30deg red, blue)",
    522  "linear-gradient(to top left red, blue)",
    523  "linear-gradient(to right red, blue)",
    524  /* Invalid color or calc() function */
    525  "linear-gradient(red, rgb(0, rubbish, 0) 50%, red)",
    526  "linear-gradient(red, red calc(50% + rubbish), red)",
    527  "linear-gradient(to top calc(50% + rubbish), red, blue)",
    528 
    529  "radial-gradient(circle 175px 20px, black, white)",
    530  "radial-gradient(175px 20px circle, black, white)",
    531  "radial-gradient(ellipse 175px, black, white)",
    532  "radial-gradient(175px ellipse, black, white)",
    533  "radial-gradient(50%, red, blue)",
    534  "radial-gradient(circle 50%, red, blue)",
    535  "radial-gradient(50% circle, red, blue)",
    536 
    537  /* Invalid units */
    538  "conic-gradient(red, blue 50px, yellow 30px)",
    539  "repeating-conic-gradient(red 1deg, yellow 20%, blue 24em, green)",
    540  "conic-gradient(from 0%, black, white)",
    541  "conic-gradient(from 60%, black, white)",
    542  "conic-gradient(from 40px, black, white)",
    543  "conic-gradient(from 50, black, white)",
    544  "conic-gradient(at 50deg, black, white)",
    545  "conic-gradient(from 40deg at 50deg, black, white)",
    546  "conic-gradient(from 40deg at 50deg 60deg, black, white)",
    547  /* Invalid keywords (or ordering) */
    548  "conic-gradient(at 40% from 50deg, black, white)",
    549  "conic-gradient(to 50deg, black, white)",
    550 
    551  /* Used to be valid only when prefixed */
    552  "linear-gradient(top left, red, blue)",
    553  "linear-gradient(0 0, red, blue)",
    554  "linear-gradient(20% bottom, red, blue)",
    555  "linear-gradient(center 20%, red, blue)",
    556  "linear-gradient(left 35px, red, blue)",
    557  "linear-gradient(10% 10em, red, blue)",
    558  "linear-gradient(44px top, red, blue)",
    559 
    560  "linear-gradient(top left 45deg, red, blue)",
    561  "linear-gradient(20% bottom -300deg, red, blue)",
    562  "linear-gradient(center 20% 1.95929rad, red, blue)",
    563  "linear-gradient(left 35px 30grad, red, blue)",
    564  "linear-gradient(left 35px 0.1turn, red, blue)",
    565  "linear-gradient(10% 10em 99999deg, red, blue)",
    566  "linear-gradient(44px top -33deg, red, blue)",
    567 
    568  "linear-gradient(30grad left 35px, red, blue)",
    569  "linear-gradient(10deg 20px, red, blue)",
    570  "linear-gradient(1turn 20px, red, blue)",
    571  "linear-gradient(.414rad bottom, red, blue)",
    572 
    573  "linear-gradient(to top, 0%, blue)",
    574  "linear-gradient(to top, red, 100%)",
    575  "linear-gradient(to top, red, 45%, 56%, blue)",
    576  "linear-gradient(to top, red,, blue)",
    577  "linear-gradient(to top, red, green 35%, 15%, 54%, blue)",
    578 
    579  "linear-gradient(unset, 10px 10px, from(blue))",
    580  "linear-gradient(unset, 10px 10px, blue 0)",
    581  "repeating-linear-gradient(unset, 10px 10px, blue 0)",
    582 
    583  "radial-gradient(top left 45deg, red, blue)",
    584  "radial-gradient(20% bottom -300deg, red, blue)",
    585  "radial-gradient(center 20% 1.95929rad, red, blue)",
    586  "radial-gradient(left 35px 30grad, red, blue)",
    587  "radial-gradient(10% 10em 99999deg, red, blue)",
    588  "radial-gradient(44px top -33deg, red, blue)",
    589 
    590  "radial-gradient(-33deg, red, blue)",
    591  "radial-gradient(30grad left 35px, red, blue)",
    592  "radial-gradient(10deg 20px, red, blue)",
    593  "radial-gradient(.414rad bottom, red, blue)",
    594 
    595  "radial-gradient(cover, red, blue)",
    596  "radial-gradient(ellipse contain, red, blue)",
    597  "radial-gradient(cover circle, red, blue)",
    598 
    599  "radial-gradient(top left, cover, red, blue)",
    600  "radial-gradient(15% 20%, circle, red, blue)",
    601  "radial-gradient(45px, ellipse closest-corner, red, blue)",
    602  "radial-gradient(45px, farthest-side circle, red, blue)",
    603 
    604  "radial-gradient(99deg, cover, red, blue)",
    605  "radial-gradient(-1.2345rad, circle, red, blue)",
    606  "radial-gradient(399grad, ellipse closest-corner, red, blue)",
    607  "radial-gradient(399grad, farthest-side circle, red, blue)",
    608 
    609  "radial-gradient(top left 99deg, cover, red, blue)",
    610  "radial-gradient(15% 20% -1.2345rad, circle, red, blue)",
    611  "radial-gradient(45px 399grad, ellipse closest-corner, red, blue)",
    612  "radial-gradient(45px 399grad, farthest-side circle, red, blue)",
    613  "radial-gradient(circle red, blue)",
    614 
    615  /* don't allow more than two positions with multi-position syntax */
    616  "linear-gradient(red 0% 50% 100%)",
    617  "linear-gradient(red 0% 50% 75%, blue 75%)",
    618  "linear-gradient(to bottom, red 0% 50% 100%)",
    619  "linear-gradient(to bottom, red 0% 50% 75%, blue 75%)",
    620  "radial-gradient(red 0% 50% 100%)",
    621  "radial-gradient(red 0% 50% 75%, blue 75%)",
    622  "radial-gradient(center, red 0% 50% 100%)",
    623  "radial-gradient(center, red 0% 50% 75%, blue 75%)",
    624  "conic-gradient(red 0% 50% 100%)",
    625  "conic-gradient(red 0% 50% 75%, blue 75%)",
    626  "conic-gradient(center, red 0% 50% 100%)",
    627  "conic-gradient(center, red 0% 50% 75%, blue 75%)",
    628 
    629  // missing color in color stop
    630  "conic-gradient(red 50deg, blue 0.3turn, yellow 200grad, orange 60%, 5rad)",
    631 
    632  "-moz-linear-gradient(unset, 10px 10px, from(blue))",
    633  "-moz-linear-gradient(unset, 10px 10px, blue 0)",
    634  "-moz-repeating-linear-gradient(unset, 10px 10px, blue 0)",
    635 
    636  // 2008 GRADIENTS: -webkit-gradient()
    637  // https://www.webkit.org/blog/175/introducing-css-gradients/
    638  // ----------------------------------
    639  // Mostly-empty expressions (missing most required pieces):
    640  "-webkit-gradient()",
    641  "-webkit-gradient( )",
    642  "-webkit-gradient(,)",
    643  "-webkit-gradient(bogus)",
    644  "-webkit-gradient(linear)",
    645  "-webkit-gradient(linear,)",
    646  "-webkit-gradient(,linear)",
    647  "-webkit-gradient(radial)",
    648  "-webkit-gradient(radial,)",
    649 
    650  // linear w/ partial/missing <point> expression(s)
    651  "-webkit-gradient(linear, 1)", // Incomplete <point>
    652  "-webkit-gradient(linear, left)", // Incomplete <point>
    653  "-webkit-gradient(linear, center)", // Incomplete <point>
    654  "-webkit-gradient(linear, top)", // Incomplete <point>
    655  "-webkit-gradient(linear, 5%)", // Incomplete <point>
    656  "-webkit-gradient(linear, 1 2)", // Missing 2nd <point>
    657  "-webkit-gradient(linear, 1, 3)", // 2 incomplete <point>s
    658  "-webkit-gradient(linear, 1, 3 4)", // Incomplete 1st <point>
    659  "-webkit-gradient(linear, 1 2, 3)", // Incomplete 2nd <point>
    660  "-webkit-gradient(linear, 1 2, 3, 4)", // Comma inside <point>
    661  "-webkit-gradient(linear, 1, 2, 3 4)", // Comma inside <point>
    662  "-webkit-gradient(linear, 1, 2, 3, 4)", // Comma inside <point>
    663 
    664  // linear w/ invalid units in <point> expression
    665  "-webkit-gradient(linear, 1px 2, 3 4)",
    666  "-webkit-gradient(linear, 1 2, 3 4px)",
    667  "-webkit-gradient(linear, 1px 2px, 3px 4px)",
    668  "-webkit-gradient(linear, 1 2em, 3 4)",
    669 
    670  // linear w/ <radius> (only valid for radial)
    671  "-webkit-gradient(linear, 1 2, 8, 3 4, 9)",
    672 
    673  // linear w/ out-of-order position keywords in <point> expression
    674  // (horizontal keyword is supposed to come first, for "x" coord)
    675  "-webkit-gradient(linear, 0 0, top right)",
    676  "-webkit-gradient(linear, bottom center, 0 0)",
    677  "-webkit-gradient(linear, top bottom, 0 0)",
    678  "-webkit-gradient(linear, bottom top, 0 0)",
    679  "-webkit-gradient(linear, bottom top, 0 0)",
    680 
    681  // linear w/ trailing comma (which implies missing color-stops):
    682  "-webkit-gradient(linear, 1 2, 3 4,)",
    683 
    684  // linear w/ invalid color values:
    685  "-webkit-gradient(linear, 1 2, 3 4, from(invalidcolorname))",
    686  "-webkit-gradient(linear, 1 2, 3 4, from(inherit))",
    687  "-webkit-gradient(linear, 1 2, 3 4, from(initial))",
    688  "-webkit-gradient(linear, 1 2, 3 4, from(currentColor))",
    689  "-webkit-gradient(linear, 1 2, 3 4, from(00ff00))",
    690  "-webkit-gradient(linear, 1 2, 3 4, from(##00ff00))",
    691  "-webkit-gradient(linear, 1 2, 3 4, from(#00fff))", // wrong num hex digits
    692  "-webkit-gradient(linear, 1 2, 3 4, from(xyz(0,0,0)))", // bogus color func
    693  // Mixing <number> and <percentage> is invalid.
    694  "-webkit-gradient(linear, 1 2, 3 4, from(rgb(100, 100%, 30)))",
    695 
    696  // linear w/ color stops that have comma issues
    697  "-webkit-gradient(linear, 1 2, 3 4 from(lime))",
    698  "-webkit-gradient(linear, 1 2, 3 4, from(lime,))",
    699  "-webkit-gradient(linear, 1 2, 3 4, from(lime),)",
    700  "-webkit-gradient(linear, 1 2, 3 4, from(lime) to(blue))",
    701  "-webkit-gradient(linear, 1 2, 3 4, from(lime),, to(blue))",
    702  "-webkit-gradient(linear, 1 2, 3 4, from(rbg(0, 0, 0,)))",
    703  "-webkit-gradient(linear, 1 2, 3 4, color-stop(0 lime))",
    704  "-webkit-gradient(linear, 1 2, 3 4, color-stop(0,, lime))",
    705 
    706  // radial w/ broken <point>/radius expression(s)
    707  "-webkit-gradient(radial, 1)", // Incomplete <point>
    708  "-webkit-gradient(radial, 1 2)", // Missing radius + 2nd <point>
    709  "-webkit-gradient(radial, 1 2, 8)", // Missing 2nd <point>
    710  "-webkit-gradient(radial, 1 2, 8, 3)", // Incomplete 2nd <point>
    711  "-webkit-gradient(radial, 1 2, 8, 3 4)", // Missing 2nd radius
    712  "-webkit-gradient(radial, 1 2, 3 4, 9)", // Missing 1st radius
    713  "-webkit-gradient(radial, 1 2, -1.5, center center, +99999.9999)", // Negative radius
    714 
    715  // radial w/ incorrect units on radius (invalid; expecting <number>)
    716  "-webkit-gradient(radial, 1 2, 8%,      3 4, 9)",
    717  "-webkit-gradient(radial, 1 2, 8px,     3 4, 9)",
    718  "-webkit-gradient(radial, 1 2, 8em,     3 4, 9)",
    719  "-webkit-gradient(radial, 1 2, top,     3 4, 9)",
    720 
    721  // radial w/ trailing comma (which implies missing color-stops):
    722  "-webkit-gradient(linear, 1 2, 8, 3 4, 9,)",
    723 
    724  // radial w/ invalid color value (mostly leaning on 'linear' test above):
    725  "-webkit-gradient(radial, 1 2, 8, 3 4, 9, from(invalidcolorname))",
    726 
    727  // 2011 GRADIENTS: -webkit-linear-gradient(), -webkit-radial -gradient()
    728  // ---------------------------------------------------------------------
    729  // Syntax that's invalid for all types of gradients:
    730  // * empty gradient expressions:
    731  "-webkit-linear-gradient()",
    732  "-webkit-radial-gradient()",
    733  "-webkit-repeating-linear-gradient()",
    734  "-webkit-repeating-radial-gradient()",
    735 
    736  // * missing comma between <legacy-gradient-line> and color list:
    737  "-webkit-linear-gradient(0 red, blue)",
    738  "-webkit-linear-gradient(30deg red, blue)",
    739  "-webkit-linear-gradient(top right red, blue)",
    740  "-webkit-linear-gradient(bottom red, blue)",
    741 
    742  // Linear-gradient with calc expression containing mixed units
    743  // (bug 1363349)
    744  "-webkit-gradient(linear, calc(5 + 5%) top, calc(10 + 10) top, from(blue), to(lime))",
    745  "-webkit-gradient(linear, left calc(25 - 10%), right calc(75% + 10%), from(blue), to(lime))",
    746 
    747  // Radial-gradient with calc expression containing mixed units, or a
    748  // percentage in the radius (bug 1363349)
    749  "-webkit-gradient(radial, 1 2, 0, 3 4, calc(1% + 5%), from(blue), to(lime))",
    750  "-webkit-gradient(radial, 1 2, calc(1 + 2), 3 4, calc(1 + 5%), from(blue), to(lime))",
    751  "-webkit-gradient(radial, calc(0 + 1) calc(1 + 1), calc(1% + 2%), calc(1 + 2) 4, calc(1 + 5), from(blue), to(lime))",
    752 
    753  // Linear syntax that's invalid for both -webkit & unprefixed, but valid
    754  // for -moz:
    755  // * initial <legacy-gradient-line> which includes a length:
    756  "-webkit-linear-gradient(10px, red, blue)",
    757  "-webkit-linear-gradient(10px top, red, blue)",
    758  // * initial <legacy-gradient-line> which includes a side *and* an angle:
    759  "-webkit-linear-gradient(bottom 30deg, red, blue)",
    760  "-webkit-linear-gradient(30deg bottom, red, blue)",
    761  "-webkit-linear-gradient(10px top 50deg, red, blue)",
    762  "-webkit-linear-gradient(50deg 10px top, red, blue)",
    763  // * initial <legacy-gradient-line> which includes explicit "center":
    764  "-webkit-linear-gradient(center, red, blue)",
    765  "-webkit-linear-gradient(left center, red, blue)",
    766  "-webkit-linear-gradient(top center, red, blue)",
    767  "-webkit-linear-gradient(center top, red, blue)",
    768 
    769  // Linear syntax that's invalid for -webkit, but valid for -moz & unprefixed:
    770  // * "to" syntax:
    771  "-webkit-linear-gradient(to top, red, blue)",
    772 
    773  // * <shape> followed by angle:
    774  "-webkit-radial-gradient(circle 10deg, red, blue)",
    775 
    776  // Radial syntax that's invalid for both -webkit & -moz, but valid for
    777  // unprefixed:
    778  // * "<shape> at <position>" syntax:
    779  "-webkit-radial-gradient(circle at left bottom, red, blue)",
    780  // * explicitly-sized shape:
    781  "-webkit-radial-gradient(circle 10px, red, blue)",
    782  "-webkit-radial-gradient(ellipse 40px 20px, red, blue)",
    783 
    784  // Radial syntax that's invalid for both -webkit & unprefixed, but valid
    785  // for -moz:
    786  // * initial angle
    787  "-webkit-radial-gradient(30deg, red, blue)",
    788  // * initial angle/position combo
    789  "-webkit-radial-gradient(top 30deg, red, blue)",
    790  "-webkit-radial-gradient(left top 30deg, red, blue)",
    791  "-webkit-radial-gradient(10px 20px 30deg, red, blue)",
    792 
    793  // Conic gradients should not support prefixed syntax
    794  "-webkit-gradient(conic, 1 2, 3 4, color-stop(0, lime))",
    795  "-webkit-conic-gradient(red, blue)",
    796  "-moz-conic-gradient(red, blue)",
    797  "-webkit-repeating-conic-gradient(red, blue)",
    798  "-moz-repeating-conic-gradient(red, blue)",
    799 
    800  "image-set(url(foobar.png) 1x, none)",
    801  "image-set(garbage)",
    802  "image-set(image-set('foobar.png', 'bar.png' 2x) 1x, url(baz.png) 3x)", // Nested image-sets should fail to parse
    803  "image-set(image-set(garbage))",
    804  "image-set()",
    805  "image-set(type('image/png') url(foobar.png) 1x)",
    806  "image-set(url(foobar.png) type('image/png') 1x type('image/png'))",
    807  "image-set(url(foobar.png) type('image/png') type('image/png'))",
    808  "image-set(url(foobar.png) type(image/png))",
    809  "image-set(url(foobar.png) epyt('image/png'))",
    810 
    811  ...(IsCSSPropertyPrefEnabled("layout.css.cross-fade.enabled")
    812    ? [
    813        "cross-fade(red blue)",
    814        "cross-fade()",
    815        "cross-fade(50%, blue 50%)",
    816        // Old syntax
    817        "cross-fade(red, white, 50%)",
    818        // see: <https://github.com/w3c/csswg-drafts/issues/5333>. This
    819        // may become invalid depending on how discussion on that issue
    820        // goes.
    821        "cross-fade(red, 150%, blue)",
    822        "cross-fade(red auto, blue 10%)",
    823 
    824        // nested invalidity should propagate.
    825        "cross-fade(url(http://placekitten.com/200/300), 55% linear-gradient(center, red, blue))",
    826        "cross-fade(cross-fade(red, white, 50%), cross-fade(blue))",
    827 
    828        "cross-fade(url(http://placekitten.com/200/300) url(http://placekitten.com/200/300))",
    829        "cross-fade(#F0F8FF, rgb(0, 0, 0), rgba(0, 255, 0, 1), 25%)",
    830      ]
    831    : []),
    832 ];
    833 var unbalancedGradientAndElementValues = ["-moz-element(#a()"];
    834 
    835 var basicShapeSVGBoxValues = [
    836  "fill-box",
    837  "stroke-box",
    838  "view-box",
    839 
    840  "polygon(evenodd, 20pt 20cm) fill-box",
    841  "polygon(evenodd, 20ex 20pc) stroke-box",
    842  "polygon(evenodd, 20rem 20in) view-box",
    843 ];
    844 
    845 var basicShapeOtherValues = [
    846  "polygon(20px 20px)",
    847  "polygon(20px 20%)",
    848  "polygon(20% 20%)",
    849  "polygon(20rem 20em)",
    850  "polygon(20cm 20mm)",
    851  "polygon(20px 20px, 30px 30px)",
    852  "polygon(20px 20px, 30% 30%, 30px 30px)",
    853 
    854  "content-box",
    855  "padding-box",
    856  "border-box",
    857 
    858  "polygon(0 0) content-box",
    859  "border-box polygon(0 0)",
    860  "padding-box    polygon(   0  20px ,  30px    20% )  ",
    861 
    862  "circle()",
    863  "circle(at center)",
    864  "circle(at top 0px left 20px)",
    865  "circle(at bottom right)",
    866  "circle(20%)",
    867  "circle(300px)",
    868  "circle(calc(20px + 30px))",
    869  "circle(farthest-side)",
    870  "circle(closest-side)",
    871  "circle(closest-side at center)",
    872  "circle(farthest-side at top)",
    873  "circle(20px at top right)",
    874  "circle(40% at 50% 100%)",
    875  "circle(calc(20% + 20%) at right bottom)",
    876  "circle() padding-box",
    877 
    878  "ellipse()",
    879  "ellipse(at center)",
    880  "ellipse(at top 0px left 20px)",
    881  "ellipse(at bottom right)",
    882  "ellipse(20% 20%)",
    883  "ellipse(300px 50%)",
    884  "ellipse(calc(20px + 30px) 10%)",
    885  "ellipse(farthest-side closest-side)",
    886  "ellipse(closest-side farthest-side)",
    887  "ellipse(farthest-side farthest-side)",
    888  "ellipse(closest-side closest-side)",
    889  "ellipse(closest-side closest-side at center)",
    890  "ellipse(20% farthest-side at top)",
    891  "ellipse(20px 50% at top right)",
    892  "ellipse(closest-side 40% at 50% 100%)",
    893  "ellipse(calc(20% + 20%) calc(20px + 20cm) at right bottom)",
    894 
    895  "inset(1px)",
    896  "inset(20% -20px)",
    897  "inset(20em 4rem calc(20% + 20px))",
    898  "inset(20vh 20vw 20pt 3%)",
    899  "inset(5px round 3px)",
    900  "inset(1px 2px round 3px / 3px)",
    901  "inset(1px 2px 3px round 3px 2em / 20%)",
    902  "inset(1px 2px 3px 4px round 3px 2vw 20% / 20px 3em 2vh 20%)",
    903 ];
    904 
    905 var basicShapeOtherValuesWithFillRule = [
    906  "polygon(nonzero, 20px 20px, 30% 30%, 30px 30px)",
    907  "polygon(evenodd, 20px 20px, 30% 30%, 30px 30px)",
    908  "polygon(evenodd, 20% 20em) content-box",
    909  "polygon(evenodd, 20vh 20em) padding-box",
    910  "polygon(evenodd, 20vh calc(20% + 20em)) border-box",
    911  "polygon(evenodd, 20vh 20vw) margin-box",
    912 ];
    913 
    914 var basicShapeInvalidValues = [
    915  "url(#test) url(#tes2)",
    916  "polygon (0 0)",
    917  "polygon(20px, 40px)",
    918  "border-box content-box",
    919  "polygon(0 0) polygon(0 0)",
    920  "polygon(nonzero 0 0)",
    921  "polygon(evenodd 20px 20px)",
    922  "polygon(20px 20px, evenodd)",
    923  "polygon(20px 20px, nonzero)",
    924  "polygon(0 0) conten-box content-box",
    925  "content-box polygon(0 0) conten-box",
    926  "padding-box polygon(0 0) conten-box",
    927  "polygon(0 0) polygon(0 0) content-box",
    928  "polygon(0 0) content-box polygon(0 0)",
    929  "polygon(0 0), content-box",
    930  "polygon(0 0), polygon(0 0)",
    931  "content-box polygon(0 0) polygon(0 0)",
    932  "content-box polygon(0 0) none",
    933  "none content-box polygon(0 0)",
    934  "inherit content-box polygon(0 0)",
    935  "initial polygon(0 0)",
    936  "polygon(0 0) farthest-side",
    937  "farthest-corner polygon(0 0)",
    938  "polygon(0 0) farthest-corner",
    939  "polygon(0 0) conten-box",
    940  "polygon(0 0) polygon(0 0) farthest-corner",
    941  "polygon(0 0) polygon(0 0) polygon(0 0)",
    942  "border-box polygon(0, 0)",
    943  "border-box padding-box",
    944  "margin-box farthest-side",
    945  "nonsense() border-box",
    946  "border-box nonsense()",
    947 
    948  "circle(at)",
    949  "circle(at 20% 20% 30%)",
    950  "circle(20px 2px at center)",
    951  "circle(2at center)",
    952  "circle(closest-corner)",
    953  "circle(at center top closest-side)",
    954  "circle(-20px)",
    955  "circle(farthest-side closest-side)",
    956  "circle(20% 20%)",
    957  "circle(at farthest-side)",
    958  "circle(calc(20px + rubbish))",
    959  "circle(at top left 20px)",
    960 
    961  "ellipse(at)",
    962  "ellipse(at 20% 20% 30%)",
    963  "ellipse(20px at center)",
    964  "ellipse(-20px 20px)",
    965  "ellipse(closest-corner farthest-corner)",
    966  "ellipse(20px -20px)",
    967  "ellipse(-20px -20px)",
    968  "ellipse(farthest-side)",
    969  "ellipse(20%)",
    970  "ellipse(at farthest-side farthest-side)",
    971  "ellipse(at top left calc(20px + rubbish))",
    972  "ellipse(at top left 20px)",
    973 
    974  "polygon(at)",
    975  "polygon(at 20% 20% 30%)",
    976  "polygon(20px at center)",
    977  "polygon(2px 2at center)",
    978  "polygon(closest-corner farthest-corner)",
    979  "polygon(at center top closest-side closest-side)",
    980  "polygon(40% at 50% 100%)",
    981  "polygon(40% farthest-side 20px at 50% 100%)",
    982 
    983  "inset()",
    984  "inset(round)",
    985  "inset(round 3px)",
    986  "inset(1px round 1px 2px 3px 4px 5px)",
    987  "inset(1px 2px 3px 4px 5px)",
    988  "inset(1px, round 3px)",
    989  "inset(1px, 2px)",
    990  "inset(1px 2px, 3px)",
    991  "inset(1px at 3px)",
    992  "inset(1px round 1px // 2px)",
    993  "inset(1px round)",
    994  "inset(1px calc(2px + rubbish))",
    995  "inset(1px round 2px calc(3px + rubbish))",
    996 ];
    997 
    998 var basicShapeUnbalancedValues = [
    999  "polygon(30% 30%",
   1000  "polygon(nonzero, 20% 20px",
   1001  "polygon(evenodd, 20px 20px",
   1002 
   1003  "circle(",
   1004  "circle(40% at 50% 100%",
   1005  "ellipse(",
   1006  "ellipse(40% at 50% 100%",
   1007 
   1008  "inset(1px",
   1009  "inset(1px 2px",
   1010  "inset(1px 2px 3px",
   1011  "inset(1px 2px 3px 4px",
   1012  "inset(1px 2px 3px 4px round 5px",
   1013  "inset(1px 2px 3px 4px round 5px / 6px",
   1014 ];
   1015 
   1016 var basicShapeXywhRectValues = [
   1017  "xywh(1px 2% 3px 4em)",
   1018  "xywh(1px 2% 3px 4em round 0px)",
   1019  "xywh(1px 2% 3px 4em round 0px 1%)",
   1020  "xywh(1px 2% 3px 4em round 0px 1% 2px)",
   1021  "xywh(1px 2% 3px 4em round 0px 1% 2px 3em)",
   1022  "rect(auto auto auto auto)",
   1023  "rect(1px 2% auto 4em)",
   1024  "rect(1px 2% auto 4em round 0px)",
   1025  "rect(1px 2% auto 4em round 0px 1%)",
   1026  "rect(1px 2% auto 4em round 0px 1% 2px)",
   1027  "rect(1px 2% auto 4em round 0px 1% 2px 3em)",
   1028 ];
   1029 
   1030 var basicShapeShapeValues = [];
   1031 var basicShapeShapeValuesWithFillRule = [];
   1032 if (IsCSSPropertyPrefEnabled("layout.css.basic-shape-shape.enabled")) {
   1033  basicShapeShapeValuesWithFillRule.push(
   1034    "shape(evenodd from 0px 0px, line to 10px 10px)",
   1035    "shape(nonzero from 0px 0px, line to 10px 10px)"
   1036  );
   1037 
   1038  basicShapeShapeValues.push(
   1039    "shape(from 0px 0%, line to 10px 10%)",
   1040    "shape(from 10px 10px, move by 10px 5px, line by 20px 40%, close)",
   1041    "shape(from 10px 10px, hline by 10px, vline to 5rem)",
   1042    "shape(from 10px 10px, vline by 5%, hline to 1vw)",
   1043    "shape(from 10px 10px, curve to 50px 20px with 10rem 1%)",
   1044    "shape(from 10px 10px, smooth to 50px 20px with 10rem 1%)",
   1045    "shape(from 10% 1rem, arc to 50px 1pt of 20% cw large rotate 25deg)"
   1046  );
   1047 
   1048  // It's fine to include this for properties which don't support shape(),
   1049  // e.g. shape-outside, because they must reject these values.
   1050  basicShapeInvalidValues.push(
   1051    "shape()",
   1052    "shape(evenodd, from 0px 0px)",
   1053    "shape(from 0px 0px line to 10px 10px)",
   1054    "shape(from 0px 0px)",
   1055    "shape(close)",
   1056    "shape(nonzero, close)"
   1057  );
   1058 }
   1059 
   1060 if (/* mozGradientsEnabled */ true) {
   1061  // Maybe one day :(
   1062  // Extend gradient lists with valid/invalid moz-prefixed expressions:
   1063  validNonUrlImageValues.push(
   1064    "-moz-linear-gradient(red, blue)",
   1065    "-moz-linear-gradient(red, yellow, blue)",
   1066    "-moz-linear-gradient(red 1px, yellow 20%, blue 24em, green)",
   1067    "-moz-linear-gradient(red, yellow, green, blue 50%)",
   1068    "-moz-linear-gradient(red -50%, yellow -25%, green, blue)",
   1069    "-moz-linear-gradient(red -99px, yellow, green, blue 120%)",
   1070    "-moz-linear-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
   1071    "-moz-linear-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
   1072 
   1073    "-moz-linear-gradient(top, red, blue)",
   1074 
   1075    "-moz-linear-gradient(to top, red, blue)",
   1076    "-moz-linear-gradient(to bottom, red, blue)",
   1077    "-moz-linear-gradient(to left, red, blue)",
   1078    "-moz-linear-gradient(to right, red, blue)",
   1079    "-moz-linear-gradient(to top left, red, blue)",
   1080    "-moz-linear-gradient(to top right, red, blue)",
   1081    "-moz-linear-gradient(to bottom left, red, blue)",
   1082    "-moz-linear-gradient(to bottom right, red, blue)",
   1083    "-moz-linear-gradient(to left top, red, blue)",
   1084    "-moz-linear-gradient(to left bottom, red, blue)",
   1085    "-moz-linear-gradient(to right top, red, blue)",
   1086    "-moz-linear-gradient(to right bottom, red, blue)",
   1087 
   1088    "-moz-linear-gradient(top left, red, blue)",
   1089    "-moz-linear-gradient(left, red, blue)",
   1090    "-moz-linear-gradient(bottom, red, blue)",
   1091 
   1092    "-moz-linear-gradient(0, red, blue)",
   1093 
   1094    "-moz-linear-gradient(-33deg, red, blue)",
   1095 
   1096    "-moz-linear-gradient(blue calc(0px) ,green calc(25%) ,red calc(40px) ,blue calc(60px) , yellow  calc(100px))",
   1097    "-moz-linear-gradient(-33deg, blue calc(-25%) ,red 40px)",
   1098    "-moz-linear-gradient(10deg, blue calc(100px + -25%),red calc(40px))",
   1099    "-moz-linear-gradient(10deg, blue calc(-25px),red calc(100%))",
   1100    "-moz-linear-gradient(.414rad, blue calc(100px + -25px) ,green calc(100px + -25px) ,red calc(100px + -25%) ,blue calc(-25px) , yellow  calc(-25px))",
   1101    "-moz-linear-gradient(1turn, blue calc(-25%) ,green calc(25px) ,red calc(25%),blue calc(0px),white 50px, yellow  calc(-25px))",
   1102 
   1103    "-moz-radial-gradient(red, blue)",
   1104    "-moz-radial-gradient(red, yellow, blue)",
   1105    "-moz-radial-gradient(red 1px, yellow 20%, blue 24em, green)",
   1106    "-moz-radial-gradient(red, yellow, green, blue 50%)",
   1107    "-moz-radial-gradient(red -50%, yellow -25%, green, blue)",
   1108    "-moz-radial-gradient(red -99px, yellow, green, blue 120%)",
   1109    "-moz-radial-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
   1110 
   1111    "-moz-radial-gradient(top left, red, blue)",
   1112    "-moz-radial-gradient(20% bottom, red, blue)",
   1113    "-moz-radial-gradient(center 20%, red, blue)",
   1114    "-moz-radial-gradient(left 35px, red, blue)",
   1115    "-moz-radial-gradient(10% 10em, red, blue)",
   1116    "-moz-radial-gradient(44px top, red, blue)",
   1117 
   1118    "-moz-radial-gradient(0 0, red, blue)",
   1119    "-moz-radial-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
   1120 
   1121    "-moz-radial-gradient(cover, red, blue)",
   1122    "-moz-radial-gradient(cover circle, red, blue)",
   1123    "-moz-radial-gradient(contain, red, blue)",
   1124    "-moz-radial-gradient(contain ellipse, red, blue)",
   1125    "-moz-radial-gradient(circle, red, blue)",
   1126    "-moz-radial-gradient(ellipse closest-corner, red, blue)",
   1127    "-moz-radial-gradient(farthest-side circle, red, blue)",
   1128 
   1129    "-moz-radial-gradient(top left, cover, red, blue)",
   1130    "-moz-radial-gradient(15% 20%, circle, red, blue)",
   1131    "-moz-radial-gradient(45px, ellipse closest-corner, red, blue)",
   1132    "-moz-radial-gradient(45px, farthest-side circle, red, blue)",
   1133 
   1134    "-moz-repeating-linear-gradient(red, blue)",
   1135    "-moz-repeating-linear-gradient(red, yellow, blue)",
   1136    "-moz-repeating-linear-gradient(red 1px, yellow 20%, blue 24em, green)",
   1137    "-moz-repeating-linear-gradient(red, yellow, green, blue 50%)",
   1138    "-moz-repeating-linear-gradient(red -50%, yellow -25%, green, blue)",
   1139    "-moz-repeating-linear-gradient(red -99px, yellow, green, blue 120%)",
   1140    "-moz-repeating-linear-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
   1141    "-moz-repeating-linear-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
   1142 
   1143    "-moz-repeating-linear-gradient(to top, red, blue)",
   1144    "-moz-repeating-linear-gradient(to bottom, red, blue)",
   1145    "-moz-repeating-linear-gradient(to left, red, blue)",
   1146    "-moz-repeating-linear-gradient(to right, red, blue)",
   1147    "-moz-repeating-linear-gradient(to top left, red, blue)",
   1148    "-moz-repeating-linear-gradient(to top right, red, blue)",
   1149    "-moz-repeating-linear-gradient(to bottom left, red, blue)",
   1150    "-moz-repeating-linear-gradient(to bottom right, red, blue)",
   1151    "-moz-repeating-linear-gradient(to left top, red, blue)",
   1152    "-moz-repeating-linear-gradient(to left bottom, red, blue)",
   1153    "-moz-repeating-linear-gradient(to right top, red, blue)",
   1154    "-moz-repeating-linear-gradient(to right bottom, red, blue)",
   1155 
   1156    "-moz-repeating-linear-gradient(top left, red, blue)",
   1157 
   1158    "-moz-repeating-radial-gradient(red, blue)",
   1159    "-moz-repeating-radial-gradient(red, yellow, blue)",
   1160    "-moz-repeating-radial-gradient(red 1px, yellow 20%, blue 24em, green)",
   1161    "-moz-repeating-radial-gradient(red, yellow, green, blue 50%)",
   1162    "-moz-repeating-radial-gradient(red -50%, yellow -25%, green, blue)",
   1163    "-moz-repeating-radial-gradient(red -99px, yellow, green, blue 120%)",
   1164    "-moz-repeating-radial-gradient(#ffff00, #ef3, rgba(10, 20, 30, 0.4))",
   1165    "-moz-repeating-radial-gradient(rgba(10, 20, 30, 0.4), #ffff00, #ef3)",
   1166 
   1167    "-moz-repeating-radial-gradient(farthest-corner, red, blue)",
   1168    "-moz-repeating-radial-gradient(circle, red, blue)",
   1169    "-moz-repeating-radial-gradient(ellipse closest-corner, red, blue)",
   1170 
   1171    "-moz-radial-gradient(calc(25%) top, red, blue)",
   1172    "-moz-radial-gradient(left calc(25%), red, blue)",
   1173    "-moz-radial-gradient(calc(25px) top, red, blue)",
   1174    "-moz-radial-gradient(left calc(25px), red, blue)",
   1175    "-moz-radial-gradient(calc(-25%) top, red, blue)",
   1176    "-moz-radial-gradient(left calc(-25%), red, blue)",
   1177    "-moz-radial-gradient(calc(-25px) top, red, blue)",
   1178    "-moz-radial-gradient(left calc(-25px), red, blue)",
   1179    "-moz-radial-gradient(calc(100px + -25%) top, red, blue)",
   1180    "-moz-radial-gradient(left calc(100px + -25%), red, blue)",
   1181    "-moz-radial-gradient(calc(100px + -25px) top, red, blue)",
   1182    "-moz-radial-gradient(left calc(100px + -25px), red, blue)"
   1183  );
   1184 
   1185  invalidNonUrlImageValues.push(
   1186    // The entries in this block used to be valid with the older more-complex
   1187    // -moz prefixed gradient syntax, but we've since simplified the syntax for
   1188    // consistency with -webkit prefixed gradients, in a way that makes these
   1189    // invalid now.
   1190    "-moz-linear-gradient(center 0%, red, blue)",
   1191    "-moz-linear-gradient(50% top, red, blue)",
   1192    "-moz-linear-gradient(50% 0%, red, blue)",
   1193    "-moz-linear-gradient(0 0, red, blue)",
   1194    "-moz-linear-gradient(20% bottom, red, blue)",
   1195    "-moz-linear-gradient(center 20%, red, blue)",
   1196    "-moz-linear-gradient(left 35px, red, blue)",
   1197    "-moz-linear-gradient(10% 10em, red, blue)",
   1198    "-moz-linear-gradient(44px top, red, blue)",
   1199    "-moz-linear-gradient(0px, red, blue)",
   1200    "-moz-linear-gradient(top left 45deg, red, blue)",
   1201    "-moz-linear-gradient(20% bottom -300deg, red, blue)",
   1202    "-moz-linear-gradient(center 20% 1.95929rad, red, blue)",
   1203    "-moz-linear-gradient(left 35px 30grad, red, blue)",
   1204    "-moz-linear-gradient(left 35px 0.1turn, red, blue)",
   1205    "-moz-linear-gradient(10% 10em 99999deg, red, blue)",
   1206    "-moz-linear-gradient(44px top -33deg, red, blue)",
   1207    "-moz-linear-gradient(30grad left 35px, red, blue)",
   1208    "-moz-linear-gradient(10deg 20px, red, blue)",
   1209    "-moz-linear-gradient(1turn 20px, red, blue)",
   1210    "-moz-linear-gradient(.414rad bottom, red, blue)",
   1211    "-moz-radial-gradient(top left 45deg, red, blue)",
   1212    "-moz-radial-gradient(20% bottom -300deg, red, blue)",
   1213    "-moz-radial-gradient(center 20% 1.95929rad, red, blue)",
   1214    "-moz-radial-gradient(left 35px 30grad, red, blue)",
   1215    "-moz-radial-gradient(10% 10em 99999deg, red, blue)",
   1216    "-moz-radial-gradient(44px top -33deg, red, blue)",
   1217    "-moz-radial-gradient(-33deg, red, blue)",
   1218    "-moz-radial-gradient(30grad left 35px, red, blue)",
   1219    "-moz-radial-gradient(10deg 20px, red, blue)",
   1220    "-moz-radial-gradient(.414rad bottom, red, blue)",
   1221    "-moz-radial-gradient(99deg, cover, red, blue)",
   1222    "-moz-radial-gradient(-1.2345rad, circle, red, blue)",
   1223    "-moz-radial-gradient(399grad, ellipse closest-corner, red, blue)",
   1224    "-moz-radial-gradient(399grad, farthest-side circle, red, blue)",
   1225    "-moz-radial-gradient(top left 99deg, cover, red, blue)",
   1226    "-moz-radial-gradient(15% 20% -1.2345rad, circle, red, blue)",
   1227    "-moz-radial-gradient(45px 399grad, ellipse closest-corner, red, blue)",
   1228    "-moz-radial-gradient(45px 399grad, farthest-side circle, red, blue)",
   1229    "-moz-repeating-linear-gradient(0 0, red, blue)",
   1230    "-moz-repeating-linear-gradient(20% bottom, red, blue)",
   1231    "-moz-repeating-linear-gradient(center 20%, red, blue)",
   1232    "-moz-repeating-linear-gradient(left 35px, red, blue)",
   1233    "-moz-repeating-linear-gradient(10% 10em, red, blue)",
   1234    "-moz-repeating-linear-gradient(44px top, red, blue)",
   1235    "-moz-repeating-linear-gradient(top left 45deg, red, blue)",
   1236    "-moz-repeating-linear-gradient(20% bottom -300deg, red, blue)",
   1237    "-moz-repeating-linear-gradient(center 20% 1.95929rad, red, blue)",
   1238    "-moz-repeating-linear-gradient(left 35px 30grad, red, blue)",
   1239    "-moz-repeating-linear-gradient(10% 10em 99999deg, red, blue)",
   1240    "-moz-repeating-linear-gradient(44px top -33deg, red, blue)",
   1241    "-moz-repeating-linear-gradient(30grad left 35px, red, blue)",
   1242    "-moz-repeating-linear-gradient(10deg 20px, red, blue)",
   1243    "-moz-repeating-linear-gradient(.414rad bottom, red, blue)",
   1244 
   1245    /* Negative radii */
   1246    "-moz-radial-gradient(40%, -100px -10%, red, blue)",
   1247 
   1248    /* no quirks mode colors */
   1249    "-moz-radial-gradient(10% bottom, ffffff, black) scroll no-repeat",
   1250    /* no quirks mode lengths */
   1251    "-moz-linear-gradient(10 10px -45deg, red, blue) repeat",
   1252    "-moz-linear-gradient(10px 10 -45deg, red, blue) repeat",
   1253    /* Unitless 0 is invalid as an <angle> */
   1254    "-moz-linear-gradient(top left 0, red, blue)",
   1255    "-moz-linear-gradient(5px 5px 0, red, blue)",
   1256    /* There must be a comma between gradient-line (e.g. <angle>) and colors */
   1257    "-moz-linear-gradient(30deg red, blue)",
   1258    "-moz-linear-gradient(5px 5px 30deg red, blue)",
   1259    "-moz-linear-gradient(5px 5px red, blue)",
   1260    "-moz-linear-gradient(top left 30deg red, blue)",
   1261 
   1262    /* Old syntax */
   1263    "-moz-linear-gradient(10px 10px, 20px, 30px 30px, 40px, from(blue), to(red))",
   1264    "-moz-radial-gradient(20px 20px, 10px 10px, from(green), to(#ff00ff))",
   1265    "-moz-radial-gradient(10px 10px, 20%, 40px 40px, 10px, from(green), to(#ff00ff))",
   1266    "-moz-linear-gradient(10px, 20px, 30px, 40px, color-stop(0.5, #00ccff))",
   1267    "-moz-linear-gradient(20px 20px, from(blue), to(red))",
   1268    "-moz-linear-gradient(40px 40px, 10px 10px, from(blue) to(red) color-stop(10%, fuchsia))",
   1269    "-moz-linear-gradient(20px 20px 30px, 10px 10px, from(red), to(#ff0000))",
   1270    "-moz-radial-gradient(left top, center, 20px 20px, 10px, from(blue), to(red))",
   1271    "-moz-linear-gradient(left left, top top, from(blue))",
   1272    "-moz-linear-gradient(inherit, 10px 10px, from(blue))",
   1273    /* New syntax */
   1274    "-moz-linear-gradient(10px 10px, 20px, 30px 30px, 40px, blue 0, red 100%)",
   1275    "-moz-radial-gradient(20px 20px, 10px 10px, from(green), to(#ff00ff))",
   1276    "-moz-radial-gradient(10px 10px, 20%, 40px 40px, 10px, from(green), to(#ff00ff))",
   1277    "-moz-linear-gradient(10px, 20px, 30px, 40px, #00ccff 50%)",
   1278    "-moz-linear-gradient(40px 40px, 10px 10px, blue 0 fuchsia 10% red 100%)",
   1279    "-moz-linear-gradient(20px 20px 30px, 10px 10px, red 0, #ff0000 100%)",
   1280    "-moz-radial-gradient(left top, center, 20px 20px, 10px, from(blue), to(red))",
   1281    "-moz-linear-gradient(left left, top top, blue 0)",
   1282    "-moz-linear-gradient(inherit, 10px 10px, blue 0)",
   1283    "-moz-linear-gradient(left left blue red)",
   1284    "-moz-linear-gradient(left left blue, red)",
   1285    "-moz-linear-gradient()",
   1286    "-moz-linear-gradient(cover, red, blue)",
   1287    "-moz-linear-gradient(auto, red, blue)",
   1288    "-moz-linear-gradient(22 top, red, blue)",
   1289    "-moz-linear-gradient(10% red blue)",
   1290    "-moz-linear-gradient(10%, red blue)",
   1291    "-moz-linear-gradient(10%,, red, blue)",
   1292    "-moz-linear-gradient(45px, center, red, blue)",
   1293    "-moz-linear-gradient(45px, center red, blue)",
   1294    "-moz-radial-gradient(contain, ellipse, red, blue)",
   1295    "-moz-radial-gradient(10deg contain, red, blue)",
   1296    "-moz-radial-gradient(10deg, contain,, red, blue)",
   1297    "-moz-radial-gradient(contain contain, red, blue)",
   1298    "-moz-radial-gradient(ellipse circle, red, blue)",
   1299    "-moz-radial-gradient(to top left, red, blue)",
   1300    "-moz-radial-gradient(center, 10%, red, blue)",
   1301    "-moz-radial-gradient(5rad, 20px, red, blue)",
   1302 
   1303    "-moz-radial-gradient(at top left to cover, red, blue)",
   1304    "-moz-radial-gradient(at 15% 20% circle, red, blue)",
   1305 
   1306    "-moz-radial-gradient(to cover, red, blue)",
   1307    "-moz-radial-gradient(to contain, red, blue)",
   1308    "-moz-radial-gradient(to closest-side circle, red, blue)",
   1309    "-moz-radial-gradient(to farthest-corner ellipse, red, blue)",
   1310 
   1311    "-moz-radial-gradient(ellipse at 45px closest-corner, red, blue)",
   1312    "-moz-radial-gradient(circle at 45px farthest-side, red, blue)",
   1313    "-moz-radial-gradient(ellipse 45px, closest-side, red, blue)",
   1314    "-moz-radial-gradient(circle 45px, farthest-corner, red, blue)",
   1315    "-moz-radial-gradient(ellipse, ellipse closest-side, red, blue)",
   1316    "-moz-radial-gradient(circle, circle farthest-corner, red, blue)",
   1317 
   1318    "-moz-radial-gradient(99deg to farthest-corner, red, blue)",
   1319    "-moz-radial-gradient(-1.2345rad circle, red, blue)",
   1320    "-moz-radial-gradient(ellipse 399grad to closest-corner, red, blue)",
   1321    "-moz-radial-gradient(circle 399grad to farthest-side, red, blue)",
   1322 
   1323    "-moz-radial-gradient(at top left 99deg, to farthest-corner, red, blue)",
   1324    "-moz-radial-gradient(circle at 15% 20% -1.2345rad, red, blue)",
   1325    "-moz-radial-gradient(to top left at 30% 40%, red, blue)",
   1326    "-moz-radial-gradient(ellipse at 45px 399grad, to closest-corner, red, blue)",
   1327    "-moz-radial-gradient(at 45px 399grad to farthest-side circle, red, blue)",
   1328 
   1329    "-moz-radial-gradient(to 50%, red, blue)",
   1330    "-moz-radial-gradient(circle to 50%, red, blue)",
   1331    "-moz-radial-gradient(circle to 43px 43px, red, blue)",
   1332    "-moz-radial-gradient(circle to 50% 50%, red, blue)",
   1333    "-moz-radial-gradient(circle to 43px 50%, red, blue)",
   1334    "-moz-radial-gradient(circle to 50% 43px, red, blue)",
   1335    "-moz-radial-gradient(ellipse to 43px, red, blue)",
   1336    "-moz-radial-gradient(ellipse to 50%, red, blue)",
   1337 
   1338    "-moz-linear-gradient(to 0 0, red, blue)",
   1339    "-moz-linear-gradient(to 20% bottom, red, blue)",
   1340    "-moz-linear-gradient(to center 20%, red, blue)",
   1341    "-moz-linear-gradient(to left 35px, red, blue)",
   1342    "-moz-linear-gradient(to 10% 10em, red, blue)",
   1343    "-moz-linear-gradient(to 44px top, red, blue)",
   1344    "-moz-linear-gradient(to top left 45deg, red, blue)",
   1345    "-moz-linear-gradient(to 20% bottom -300deg, red, blue)",
   1346    "-moz-linear-gradient(to center 20% 1.95929rad, red, blue)",
   1347    "-moz-linear-gradient(to left 35px 30grad, red, blue)",
   1348    "-moz-linear-gradient(to 10% 10em 99999deg, red, blue)",
   1349    "-moz-linear-gradient(to 44px top -33deg, red, blue)",
   1350    "-moz-linear-gradient(to -33deg, red, blue)",
   1351    "-moz-linear-gradient(to 30grad left 35px, red, blue)",
   1352    "-moz-linear-gradient(to 10deg 20px, red, blue)",
   1353    "-moz-linear-gradient(to .414rad bottom, red, blue)",
   1354 
   1355    "-moz-linear-gradient(to top top, red, blue)",
   1356    "-moz-linear-gradient(to bottom bottom, red, blue)",
   1357    "-moz-linear-gradient(to left left, red, blue)",
   1358    "-moz-linear-gradient(to right right, red, blue)",
   1359 
   1360    "-moz-repeating-linear-gradient(10px 10px, 20px, 30px 30px, 40px, blue 0, red 100%)",
   1361    "-moz-repeating-radial-gradient(20px 20px, 10px 10px, from(green), to(#ff00ff))",
   1362    "-moz-repeating-radial-gradient(10px 10px, 20%, 40px 40px, 10px, from(green), to(#ff00ff))",
   1363    "-moz-repeating-linear-gradient(10px, 20px, 30px, 40px, #00ccff 50%)",
   1364    "-moz-repeating-linear-gradient(40px 40px, 10px 10px, blue 0 fuchsia 10% red 100%)",
   1365    "-moz-repeating-linear-gradient(20px 20px 30px, 10px 10px, red 0, #ff0000 100%)",
   1366    "-moz-repeating-radial-gradient(left top, center, 20px 20px, 10px, from(blue), to(red))",
   1367    "-moz-repeating-linear-gradient(left left, top top, blue 0)",
   1368    "-moz-repeating-linear-gradient(inherit, 10px 10px, blue 0)",
   1369    "-moz-repeating-linear-gradient(left left blue red)",
   1370    "-moz-repeating-linear-gradient()",
   1371 
   1372    "-moz-repeating-linear-gradient(to 0 0, red, blue)",
   1373    "-moz-repeating-linear-gradient(to 20% bottom, red, blue)",
   1374    "-moz-repeating-linear-gradient(to center 20%, red, blue)",
   1375    "-moz-repeating-linear-gradient(to left 35px, red, blue)",
   1376    "-moz-repeating-linear-gradient(to 10% 10em, red, blue)",
   1377    "-moz-repeating-linear-gradient(to 44px top, red, blue)",
   1378    "-moz-repeating-linear-gradient(to top left 45deg, red, blue)",
   1379    "-moz-repeating-linear-gradient(to 20% bottom -300deg, red, blue)",
   1380    "-moz-repeating-linear-gradient(to center 20% 1.95929rad, red, blue)",
   1381    "-moz-repeating-linear-gradient(to left 35px 30grad, red, blue)",
   1382    "-moz-repeating-linear-gradient(to 10% 10em 99999deg, red, blue)",
   1383    "-moz-repeating-linear-gradient(to 44px top -33deg, red, blue)",
   1384    "-moz-repeating-linear-gradient(to -33deg, red, blue)",
   1385    "-moz-repeating-linear-gradient(to 30grad left 35px, red, blue)",
   1386    "-moz-repeating-linear-gradient(to 10deg 20px, red, blue)",
   1387    "-moz-repeating-linear-gradient(to .414rad bottom, red, blue)",
   1388 
   1389    "-moz-repeating-linear-gradient(to top top, red, blue)",
   1390    "-moz-repeating-linear-gradient(to bottom bottom, red, blue)",
   1391    "-moz-repeating-linear-gradient(to left left, red, blue)",
   1392    "-moz-repeating-linear-gradient(to right right, red, blue)",
   1393 
   1394    "-moz-repeating-radial-gradient(to top left at 30% 40%, red, blue)",
   1395    "-moz-repeating-radial-gradient(ellipse at 45px closest-corner, red, blue)",
   1396    "-moz-repeating-radial-gradient(circle at 45px farthest-side, red, blue)",
   1397 
   1398    /* Valid only when unprefixed */
   1399    "-moz-radial-gradient(at top left, red, blue)",
   1400    "-moz-radial-gradient(at 20% bottom, red, blue)",
   1401    "-moz-radial-gradient(at center 20%, red, blue)",
   1402    "-moz-radial-gradient(at left 35px, red, blue)",
   1403    "-moz-radial-gradient(at 10% 10em, red, blue)",
   1404    "-moz-radial-gradient(at 44px top, red, blue)",
   1405    "-moz-radial-gradient(at 0 0, red, blue)",
   1406 
   1407    "-moz-radial-gradient(circle 43px, red, blue)",
   1408    "-moz-radial-gradient(ellipse 43px 43px, red, blue)",
   1409    "-moz-radial-gradient(ellipse 50% 50%, red, blue)",
   1410    "-moz-radial-gradient(ellipse 43px 50%, red, blue)",
   1411    "-moz-radial-gradient(ellipse 50% 43px, red, blue)",
   1412 
   1413    "-moz-radial-gradient(farthest-corner at top left, red, blue)",
   1414    "-moz-radial-gradient(ellipse closest-corner at 45px, red, blue)",
   1415    "-moz-radial-gradient(circle farthest-side at 45px, red, blue)",
   1416    "-moz-radial-gradient(closest-side ellipse at 50%, red, blue)",
   1417    "-moz-radial-gradient(farthest-corner circle at 4em, red, blue)",
   1418 
   1419    "-moz-radial-gradient(30% 40% at top left, red, blue)",
   1420    "-moz-radial-gradient(50px 60px at 15% 20%, red, blue)",
   1421    "-moz-radial-gradient(7em 8em at 45px, red, blue)"
   1422  );
   1423 }
   1424 
   1425 const pathValues = {
   1426  other_values: [
   1427    "path('M 10 10 20 20 H 90 V 90 Z')",
   1428    "path('M10 10 20,20H90V90Z')",
   1429    "path('M 10 10 C 20 20, 40 20, 50 10')",
   1430    "path('M 10 80 C 40 10, 65 10, 95 80 S 1.5e2 150, 180 80')",
   1431    "path('M 10 80 Q 95 10 180 80')",
   1432    "path('M 10 80 Q 52.5 10, 95 80 T 180 80')",
   1433    "path('M 80 80 A 45 45, 0, 0, 0, 1.25e2 1.25e2 L 125 80 Z')",
   1434    "path('M100-200h20z')",
   1435    "path('M10,10L20.6.5z')",
   1436  ],
   1437  invalid_values: [
   1438    "path()",
   1439    "path(a)",
   1440    "path('M 10 Z')",
   1441    "path('M 10-10 20')",
   1442    "path('M 10 10 C 20 20 40 20')",
   1443  ],
   1444 };
   1445 
   1446 var gCSSProperties = {
   1447  animation: {
   1448    domProp: "animation",
   1449    inherited: false,
   1450    type: CSS_TYPE_TRUE_SHORTHAND,
   1451    applies_to_marker: true,
   1452    subproperties: [
   1453      "animation-name",
   1454      "animation-duration",
   1455      "animation-timing-function",
   1456      "animation-delay",
   1457      "animation-direction",
   1458      "animation-fill-mode",
   1459      "animation-iteration-count",
   1460      "animation-play-state",
   1461    ],
   1462    initial_values: [
   1463      "none none 0s 0s ease normal running 1.0",
   1464      "none",
   1465      "0s",
   1466      "ease",
   1467      "normal",
   1468      "running",
   1469      "1.0",
   1470    ],
   1471    other_values: [
   1472      "none none 0s 0s cubic-bezier(0.25, 0.1, 0.25, 1.0) normal running 1.0",
   1473      "bounce 1s linear 2s",
   1474      "bounce 1s 2s linear",
   1475      "bounce linear 1s 2s",
   1476      "linear bounce 1s 2s",
   1477      "linear 1s bounce 2s",
   1478      "linear 1s 2s bounce",
   1479      "1s bounce linear 2s",
   1480      "1s bounce 2s linear",
   1481      "1s 2s bounce linear",
   1482      "1s linear bounce 2s",
   1483      "1s linear 2s bounce",
   1484      "1s 2s linear bounce",
   1485      "bounce linear 1s",
   1486      "bounce 1s linear",
   1487      "linear bounce 1s",
   1488      "linear 1s bounce",
   1489      "1s bounce linear",
   1490      "1s linear bounce",
   1491      "1s 2s bounce",
   1492      "1s bounce 2s",
   1493      "bounce 1s 2s",
   1494      "1s 2s linear",
   1495      "1s linear 2s",
   1496      "linear 1s 2s",
   1497      "bounce 1s",
   1498      "1s bounce",
   1499      "linear 1s",
   1500      "1s linear",
   1501      "1s 2s",
   1502      "2s 1s",
   1503      "bounce",
   1504      "linear",
   1505      "1s",
   1506      "height",
   1507      "2s",
   1508      "ease-in-out",
   1509      "2s ease-in",
   1510      "opacity linear",
   1511      "ease-out 2s",
   1512      "2s color, 1s bounce, 500ms height linear, 1s opacity 4s cubic-bezier(0.0, 0.1, 1.0, 1.0)",
   1513      "1s \\32bounce linear 2s",
   1514      "1s -bounce linear 2s",
   1515      "1s -\\32bounce linear 2s",
   1516      "1s \\32 0bounce linear 2s",
   1517      "1s -\\32 0bounce linear 2s",
   1518      "1s \\2bounce linear 2s",
   1519      "1s -\\2bounce linear 2s",
   1520      "2s, 1s bounce",
   1521      "1s bounce, 2s",
   1522      "2s all, 1s bounce",
   1523      "1s bounce, 2s all",
   1524      "1s bounce, 2s none",
   1525      "2s none, 1s bounce",
   1526      "2s bounce, 1s all",
   1527      "2s all, 1s bounce",
   1528    ],
   1529    invalid_values: [
   1530      "2s inherit",
   1531      "inherit 2s",
   1532      "2s bounce, 1s inherit",
   1533      "2s inherit, 1s bounce",
   1534      "2s initial",
   1535      "2s all,, 1s bounce",
   1536      "2s all, , 1s bounce",
   1537      "bounce 1s cubic-bezier(0, rubbish) 2s",
   1538      "bounce 1s steps(rubbish) 2s",
   1539      "2s unset",
   1540    ],
   1541  },
   1542  "animation-delay": {
   1543    domProp: "animationDelay",
   1544    inherited: false,
   1545    type: CSS_TYPE_LONGHAND,
   1546    applies_to_marker: true,
   1547    initial_values: ["0s", "0ms"],
   1548    other_values: [
   1549      "1s",
   1550      "250ms",
   1551      "-100ms",
   1552      "-1s",
   1553      "1s, 250ms, 2.3s",
   1554      "calc(1s + 2ms)",
   1555    ],
   1556    invalid_values: ["0", "0px"],
   1557  },
   1558  "animation-direction": {
   1559    domProp: "animationDirection",
   1560    inherited: false,
   1561    type: CSS_TYPE_LONGHAND,
   1562    applies_to_marker: true,
   1563    initial_values: ["normal"],
   1564    other_values: [
   1565      "alternate",
   1566      "normal, alternate",
   1567      "alternate, normal",
   1568      "normal, normal",
   1569      "normal, normal, normal",
   1570      "reverse",
   1571      "alternate-reverse",
   1572      "normal, reverse, alternate-reverse, alternate",
   1573    ],
   1574    invalid_values: [
   1575      "normal normal",
   1576      "inherit, normal",
   1577      "reverse-alternate",
   1578      "normal, unset",
   1579      "unset, normal",
   1580    ],
   1581  },
   1582  "animation-duration": {
   1583    domProp: "animationDuration",
   1584    inherited: false,
   1585    type: CSS_TYPE_LONGHAND,
   1586    initial_values: ["0s", "0ms"],
   1587    applies_to_marker: true,
   1588    other_values: ["1s", "250ms", "1s, 250ms, 2.3s", "calc(1s + 2ms)"],
   1589    invalid_values: ["0", "0px", "-1ms", "-2s"],
   1590  },
   1591  "animation-fill-mode": {
   1592    domProp: "animationFillMode",
   1593    inherited: false,
   1594    type: CSS_TYPE_LONGHAND,
   1595    applies_to_marker: true,
   1596    initial_values: ["none"],
   1597    other_values: [
   1598      "forwards",
   1599      "backwards",
   1600      "both",
   1601      "none, none",
   1602      "forwards, backwards",
   1603      "forwards, none",
   1604      "none, both",
   1605    ],
   1606    invalid_values: ["all"],
   1607  },
   1608  "animation-iteration-count": {
   1609    domProp: "animationIterationCount",
   1610    inherited: false,
   1611    type: CSS_TYPE_LONGHAND,
   1612    applies_to_marker: true,
   1613    initial_values: ["1"],
   1614    other_values: [
   1615      "infinite",
   1616      "0",
   1617      "0.5",
   1618      "7.75",
   1619      "-0.0",
   1620      "1, 2, 3",
   1621      "infinite, 2",
   1622      "1, infinite",
   1623      "calc(1 + 2.0)",
   1624    ],
   1625    // negatives forbidden per
   1626    // http://lists.w3.org/Archives/Public/www-style/2011Mar/0355.html
   1627    invalid_values: ["none", "-1", "-0.5", "-1, infinite", "infinite, -3"],
   1628  },
   1629  "animation-name": {
   1630    domProp: "animationName",
   1631    inherited: false,
   1632    type: CSS_TYPE_LONGHAND,
   1633    applies_to_marker: true,
   1634    initial_values: ["none"],
   1635    other_values: [
   1636      "all",
   1637      "ball",
   1638      "mall",
   1639      "color",
   1640      "bounce, bubble, opacity",
   1641      "foobar",
   1642      "auto",
   1643      "\\32bounce",
   1644      "-bounce",
   1645      "-\\32bounce",
   1646      "\\32 0bounce",
   1647      "-\\32 0bounce",
   1648      "\\2bounce",
   1649      "-\\2bounce",
   1650    ],
   1651    invalid_values: [
   1652      "bounce, initial",
   1653      "initial, bounce",
   1654      "bounce, inherit",
   1655      "inherit, bounce",
   1656      "bounce, unset",
   1657      "unset, bounce",
   1658    ],
   1659  },
   1660  "animation-play-state": {
   1661    domProp: "animationPlayState",
   1662    inherited: false,
   1663    type: CSS_TYPE_LONGHAND,
   1664    applies_to_marker: true,
   1665    initial_values: ["running"],
   1666    other_values: [
   1667      "paused",
   1668      "running, running",
   1669      "paused, running",
   1670      "paused, paused",
   1671      "running, paused",
   1672      "paused, running, running, running, paused, running",
   1673    ],
   1674    invalid_values: ["0"],
   1675  },
   1676  "animation-timing-function": {
   1677    domProp: "animationTimingFunction",
   1678    inherited: false,
   1679    type: CSS_TYPE_LONGHAND,
   1680    applies_to_marker: true,
   1681    initial_values: ["ease"],
   1682    other_values: [
   1683      "cubic-bezier(0.25, 0.1, 0.25, 1.0)",
   1684      "linear",
   1685      "ease-in",
   1686      "ease-out",
   1687      "ease-in-out",
   1688      "linear, ease-in, cubic-bezier(0.1, 0.2, 0.8, 0.9)",
   1689      "cubic-bezier(0.5, 0.5, 0.5, 0.5)",
   1690      "cubic-bezier(0.25, 1.5, 0.75, -0.5)",
   1691      "step-start",
   1692      "step-end",
   1693      "steps(1)",
   1694      "steps(2, start)",
   1695      "steps(386)",
   1696      "steps(3, end)",
   1697      "steps(calc(2 + 1))",
   1698      "steps(1, jump-start)",
   1699      "steps(1, jump-end)",
   1700      "steps(2, jump-none)",
   1701      "steps(1, jump-both)",
   1702    ],
   1703    invalid_values: [
   1704      "none",
   1705      "auto",
   1706      "cubic-bezier(0.25, 0.1, 0.25)",
   1707      "cubic-bezier(0.25, 0.1, 0.25, 0.25, 1.0)",
   1708      "cubic-bezier(-0.5, 0.5, 0.5, 0.5)",
   1709      "cubic-bezier(1.5, 0.5, 0.5, 0.5)",
   1710      "cubic-bezier(0.5, 0.5, -0.5, 0.5)",
   1711      "cubic-bezier(0.5, 0.5, 1.5, 0.5)",
   1712      "steps(2, step-end)",
   1713      "steps(0)",
   1714      "steps(-2)",
   1715      "steps(0, step-end, 1)",
   1716      "steps(0, jump-start)",
   1717      "steps(0, jump-end)",
   1718      "steps(1, jump-none)",
   1719      "steps(0, jump-both)",
   1720    ],
   1721  },
   1722  appearance: {
   1723    domProp: "appearance",
   1724    inherited: false,
   1725    type: CSS_TYPE_LONGHAND,
   1726    initial_values: ["none"],
   1727    other_values: ["auto", "radio", "menulist"],
   1728    invalid_values: [],
   1729  },
   1730  "-moz-appearance": {
   1731    domProp: "MozAppearance",
   1732    domPropDisabled: true, // Bug 1977489
   1733    inherited: false,
   1734    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
   1735    alias_for: "appearance",
   1736    subproperties: ["appearance"],
   1737  },
   1738  "-webkit-appearance": {
   1739    domProp: "webkitAppearance",
   1740    inherited: false,
   1741    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
   1742    alias_for: "appearance",
   1743    subproperties: ["appearance"],
   1744  },
   1745  "aspect-ratio": {
   1746    domProp: "aspectRatio",
   1747    inherited: false,
   1748    type: CSS_TYPE_LONGHAND,
   1749    initial_values: ["auto"],
   1750    other_values: [
   1751      "1",
   1752      "1.0",
   1753      "1 / 2",
   1754      "1/2",
   1755      "16.2 / 9.5",
   1756      "1/0",
   1757      "0/1",
   1758      "0 / 0",
   1759      "auto 1",
   1760      "0 auto",
   1761    ],
   1762    invalid_values: ["none", "1 test", "1 / auto", "auto / 1"],
   1763  },
   1764  "border-inline": {
   1765    domProp: "borderInline",
   1766    inherited: false,
   1767    type: CSS_TYPE_TRUE_SHORTHAND,
   1768    subproperties: [
   1769      "border-inline-start-color",
   1770      "border-inline-start-style",
   1771      "border-inline-start-width",
   1772      "border-inline-end-color",
   1773      "border-inline-end-style",
   1774      "border-inline-end-width",
   1775    ],
   1776    initial_values: [
   1777      "none",
   1778      "medium",
   1779      "currentColor",
   1780      "thin",
   1781      "none medium currentcolor",
   1782    ],
   1783    other_values: [
   1784      "solid",
   1785      "green",
   1786      "medium solid",
   1787      "green solid",
   1788      "10px solid",
   1789      "thick solid",
   1790      "5px green none",
   1791    ],
   1792    invalid_values: ["5%", "5", "5 solid green"],
   1793  },
   1794  "border-inline-end": {
   1795    domProp: "borderInlineEnd",
   1796    inherited: false,
   1797    type: CSS_TYPE_TRUE_SHORTHAND,
   1798    subproperties: [
   1799      "border-inline-end-color",
   1800      "border-inline-end-style",
   1801      "border-inline-end-width",
   1802    ],
   1803    initial_values: [
   1804      "none",
   1805      "medium",
   1806      "currentColor",
   1807      "thin",
   1808      "none medium currentcolor",
   1809    ],
   1810    other_values: [
   1811      "solid",
   1812      "green",
   1813      "medium solid",
   1814      "green solid",
   1815      "10px solid",
   1816      "thick solid",
   1817      "5px green none",
   1818    ],
   1819    invalid_values: ["5%", "5", "5 green none"],
   1820  },
   1821  "border-inline-color": {
   1822    domProp: "borderInlineColor",
   1823    inherited: false,
   1824    type: CSS_TYPE_TRUE_SHORTHAND,
   1825    subproperties: ["border-inline-start-color", "border-inline-end-color"],
   1826    initial_values: ["currentColor"],
   1827    other_values: ["green", "rgba(255,128,0,0.5) blue", "blue transparent"],
   1828    invalid_values: ["#0", "#00", "#00000", "#0000000", "#000000000", "000000"],
   1829  },
   1830  "border-inline-end-color": {
   1831    domProp: "borderInlineEndColor",
   1832    inherited: false,
   1833    type: CSS_TYPE_LONGHAND,
   1834    applies_to_first_letter: true,
   1835    logical: true,
   1836    initial_values: ["currentColor"],
   1837    other_values: ["green", "rgba(255,128,0,0.5)", "transparent"],
   1838    invalid_values: ["#0", "#00", "#00000", "#0000000", "#000000000", "000000"],
   1839  },
   1840  "border-inline-style": {
   1841    domProp: "borderInlineStyle",
   1842    inherited: false,
   1843    type: CSS_TYPE_TRUE_SHORTHAND,
   1844    subproperties: ["border-inline-start-style", "border-inline-end-style"],
   1845    initial_values: ["none"],
   1846    other_values: [
   1847      "solid",
   1848      "dashed solid",
   1849      "solid dotted",
   1850      "double double",
   1851      "inset outset",
   1852      "inset double",
   1853      "none groove",
   1854      "ridge none",
   1855    ],
   1856    invalid_values: [],
   1857  },
   1858  "border-inline-end-style": {
   1859    domProp: "borderInlineEndStyle",
   1860    inherited: false,
   1861    type: CSS_TYPE_LONGHAND,
   1862    applies_to_first_letter: true,
   1863    logical: true,
   1864    /* XXX hidden is sometimes the same as initial */
   1865    initial_values: ["none"],
   1866    other_values: [
   1867      "solid",
   1868      "dashed",
   1869      "dotted",
   1870      "double",
   1871      "outset",
   1872      "inset",
   1873      "groove",
   1874      "ridge",
   1875    ],
   1876    invalid_values: [],
   1877  },
   1878  "border-inline-width": {
   1879    domProp: "borderInlineWidth",
   1880    inherited: false,
   1881    type: CSS_TYPE_TRUE_SHORTHAND,
   1882    subproperties: ["border-inline-start-width", "border-inline-end-width"],
   1883    prerequisites: { "border-style": "solid" },
   1884    initial_values: ["medium", "3px", "medium medium"],
   1885    other_values: [
   1886      "thin",
   1887      "thick",
   1888      "1px",
   1889      "2em",
   1890      "calc(2px)",
   1891      "calc(2px) thin",
   1892      "calc(-2px)",
   1893      "calc(-2px) thick",
   1894      "calc(0em)",
   1895      "medium calc(0em)",
   1896      "calc(0px)",
   1897      "1px calc(0px)",
   1898      "calc(5em)",
   1899      "1em calc(5em)",
   1900    ],
   1901    invalid_values: ["5%", "5", "5 thin", "thin 5%", "blue", "solid"],
   1902  },
   1903  "border-inline-end-width": {
   1904    domProp: "borderInlineEndWidth",
   1905    inherited: false,
   1906    type: CSS_TYPE_LONGHAND,
   1907    applies_to_first_letter: true,
   1908    logical: true,
   1909    prerequisites: { "border-inline-end-style": "solid" },
   1910    initial_values: ["medium", "3px", "calc(4px - 1px)"],
   1911    other_values: [
   1912      "thin",
   1913      "thick",
   1914      "1px",
   1915      "2em",
   1916      "calc(2px)",
   1917      "calc(-2px)",
   1918      "calc(0em)",
   1919      "calc(0px)",
   1920      "calc(5em)",
   1921      "calc(3*25px)",
   1922      "calc(25px*3)",
   1923      "calc(3*25px + 5em)",
   1924    ],
   1925    invalid_values: ["5%", "5", "stretch"],
   1926  },
   1927  "border-image": {
   1928    domProp: "borderImage",
   1929    inherited: false,
   1930    type: CSS_TYPE_TRUE_SHORTHAND,
   1931    subproperties: [
   1932      "border-image-source",
   1933      "border-image-slice",
   1934      "border-image-width",
   1935      "border-image-outset",
   1936      "border-image-repeat",
   1937    ],
   1938    initial_values: ["none"],
   1939    other_values: [
   1940      "url('border.png') 27 27 27 27",
   1941      "url('border.png') 27",
   1942      "stretch url('border.png')",
   1943      "url('border.png') 27 fill",
   1944      "url('border.png') 27 27 27 27 repeat",
   1945      "repeat url('border.png') 27 27 27 27",
   1946      "url('border.png') repeat 27 27 27 27",
   1947      "url('border.png') fill 27 27 27 27 repeat",
   1948      "url('border.png') fill 27 27 27 27 repeat space",
   1949      "url('border.png') 27 27 27 27 / 1em",
   1950      "27 27 27 27 / 1em url('border.png') ",
   1951      "url('border.png') 27 27 27 27 / 10 10 10 / 10 10 repeat",
   1952      "repeat 27 27 27 27 / 10 10 10 / 10 10 url('border.png')",
   1953      "url('border.png') 27 27 27 27 / / 10 10 1em",
   1954      "fill 27 27 27 27 / / 10 10 1em url('border.png')",
   1955      "url('border.png') 27 27 27 27 / 1em 1em 1em 1em repeat",
   1956      "url('border.png') 27 27 27 27 / 1em 1em 1em 1em stretch round",
   1957    ],
   1958    invalid_values: [
   1959      "url('border.png') 27 27 27 27 27",
   1960      "url('border.png') 27 27 27 27 / 1em 1em 1em 1em 1em",
   1961      "url('border.png') 27 27 27 27 /",
   1962      "url('border.png') fill",
   1963      "url('border.png') fill repeat",
   1964      "fill repeat",
   1965      "url('border.png') fill / 1em",
   1966      "url('border.png') / repeat",
   1967      "url('border.png') 1 /",
   1968      "url('border.png') 1 / /",
   1969      "1 / url('border.png')",
   1970      "url('border.png') / 1",
   1971      "url('border.png') / / 1",
   1972    ],
   1973  },
   1974  "border-image-source": {
   1975    domProp: "borderImageSource",
   1976    inherited: false,
   1977    type: CSS_TYPE_LONGHAND,
   1978    applies_to_first_letter: true,
   1979    initial_values: ["none"],
   1980    other_values: ["url('border.png')"].concat(validNonUrlImageValues),
   1981    invalid_values: ["url('border.png') url('border.png')"].concat(
   1982      invalidNonUrlImageValues
   1983    ),
   1984    unbalanced_values: [].concat(unbalancedGradientAndElementValues),
   1985  },
   1986  "border-image-slice": {
   1987    domProp: "borderImageSlice",
   1988    inherited: false,
   1989    type: CSS_TYPE_LONGHAND,
   1990    applies_to_first_letter: true,
   1991    initial_values: ["100%", "100% 100% 100% 100%"],
   1992    other_values: [
   1993      "0%",
   1994      "10",
   1995      "10 100% 0 2",
   1996      "0 0 0 0",
   1997      "fill 10 10",
   1998      "10 10 fill",
   1999    ],
   2000    invalid_values: [
   2001      "-10%",
   2002      "-10",
   2003      "10 10 10 10 10",
   2004      "10 10 10 10 -10",
   2005      "10px",
   2006      "-10px",
   2007      "fill",
   2008      "fill fill 10px",
   2009      "10px fill fill",
   2010    ],
   2011  },
   2012  "border-image-width": {
   2013    domProp: "borderImageWidth",
   2014    inherited: false,
   2015    type: CSS_TYPE_LONGHAND,
   2016    applies_to_first_letter: true,
   2017    initial_values: ["1", "1 1 1 1"],
   2018    other_values: [
   2019      "0",
   2020      "0%",
   2021      "0px",
   2022      "auto auto auto auto",
   2023      "10 10% auto 15px",
   2024      "10px 10px 10px 10px",
   2025      "10",
   2026      "10 10",
   2027      "10 10 10",
   2028      "calc(10px)",
   2029      "calc(10px + 5%)",
   2030    ],
   2031    invalid_values: [
   2032      "stretch",
   2033      "-10",
   2034      "-10px",
   2035      "-10%",
   2036      "10 10 10 10 10",
   2037      "10 10 10 10 auto",
   2038      "auto auto auto auto auto",
   2039      "10px calc(nonsense)",
   2040      "1px red",
   2041    ],
   2042    unbalanced_values: ["10px calc("],
   2043  },
   2044  "border-image-outset": {
   2045    domProp: "borderImageOutset",
   2046    inherited: false,
   2047    type: CSS_TYPE_LONGHAND,
   2048    applies_to_first_letter: true,
   2049    initial_values: ["0", "0 0 0 0"],
   2050    other_values: [
   2051      "10px",
   2052      "10",
   2053      "10 10",
   2054      "10 10 10",
   2055      "10 10 10 10",
   2056      "10px 10 10 10px",
   2057    ],
   2058    invalid_values: [
   2059      "stretch",
   2060      "-10",
   2061      "-10px",
   2062      "-10%",
   2063      "10%",
   2064      "10 10 10 10 10",
   2065      "10px calc(nonsense)",
   2066      "1px red",
   2067    ],
   2068    unbalanced_values: ["10px calc("],
   2069  },
   2070  "border-image-repeat": {
   2071    domProp: "borderImageRepeat",
   2072    inherited: false,
   2073    type: CSS_TYPE_LONGHAND,
   2074    applies_to_first_letter: true,
   2075    initial_values: ["stretch", "stretch stretch"],
   2076    other_values: [
   2077      "round",
   2078      "repeat",
   2079      "stretch round",
   2080      "repeat round",
   2081      "stretch repeat",
   2082      "round round",
   2083      "repeat repeat",
   2084      "space",
   2085      "stretch space",
   2086      "repeat space",
   2087      "round space",
   2088      "space space",
   2089    ],
   2090    invalid_values: ["none", "stretch stretch stretch", "0", "10", "0%", "0px"],
   2091  },
   2092  "border-radius": {
   2093    domProp: "borderRadius",
   2094    inherited: false,
   2095    type: CSS_TYPE_TRUE_SHORTHAND,
   2096    prerequisites: { width: "200px", height: "100px", display: "inline-block" },
   2097    subproperties: [
   2098      "border-bottom-left-radius",
   2099      "border-bottom-right-radius",
   2100      "border-top-left-radius",
   2101      "border-top-right-radius",
   2102    ],
   2103    initial_values: [
   2104      "0",
   2105      "0px",
   2106      "0px 0 0 0px",
   2107      "calc(-2px)",
   2108      "calc(0px) calc(0pt)",
   2109      "calc(0px) calc(0pt) calc(0px) calc(0em)",
   2110    ],
   2111    other_values: [
   2112      "0%",
   2113      "3%",
   2114      "1px",
   2115      "2em",
   2116      "3em 2px",
   2117      "2pt 3% 4em",
   2118      "2px 2px 2px 2px", // circular
   2119      "3% / 2%",
   2120      "1px / 4px",
   2121      "2em / 1em",
   2122      "3em 2px / 2px 3em",
   2123      "2pt 3% 4em / 4pt 1% 5em",
   2124      "2px 2px 2px 2px / 4px 4px 4px 4px",
   2125      "1pt / 2pt 3pt",
   2126      "4pt 5pt / 3pt", // elliptical
   2127      "calc(-1%)",
   2128      "calc(2px)",
   2129      "calc(50%)",
   2130      "calc(3*25px)",
   2131      "calc(3*25px) 5px",
   2132      "5px calc(3*25px)",
   2133      "calc(20%) calc(3*25px)",
   2134      "calc(25px*3)",
   2135      "calc(3*25px + 50%)",
   2136      "2px 2px calc(2px + 1%) 2px",
   2137      "1px 2px 2px 2px / 2px 2px calc(2px + 1%) 2px",
   2138    ],
   2139    invalid_values: [
   2140      "stretch",
   2141      "2px -2px",
   2142      "inherit 2px",
   2143      "inherit / 2px",
   2144      "2px inherit",
   2145      "2px / inherit",
   2146      "2px 2px 2px 2px 2px",
   2147      "1px / 2px 2px 2px 2px 2px",
   2148      "2",
   2149      "2 2",
   2150      "2px 2px 2px 2px / 2px 2px 2 2px",
   2151      "2px calc(0px + rubbish)",
   2152      "unset 2px",
   2153      "unset / 2px",
   2154      "2px unset",
   2155      "2px / unset",
   2156    ],
   2157  },
   2158  "border-bottom-left-radius": {
   2159    domProp: "borderBottomLeftRadius",
   2160    inherited: false,
   2161    type: CSS_TYPE_LONGHAND,
   2162    applies_to_first_letter: true,
   2163    prerequisites: { width: "200px", height: "100px", display: "inline-block" },
   2164    initial_values: ["0", "0px", "calc(-2px)"],
   2165    other_values: [
   2166      "0%",
   2167      "3%",
   2168      "1px",
   2169      "2em", // circular
   2170      "3% 2%",
   2171      "1px 4px",
   2172      "2em 2pt", // elliptical
   2173      "calc(-1%)",
   2174      "calc(2px)",
   2175      "calc(50%)",
   2176      "calc(3*25px)",
   2177      "calc(3*25px) 5px",
   2178      "5px calc(3*25px)",
   2179      "calc(20%) calc(3*25px)",
   2180      "calc(25px*3)",
   2181      "calc(3*25px + 50%)",
   2182    ],
   2183    invalid_values: [
   2184      "-1px",
   2185      "4px -2px",
   2186      "inherit 2px",
   2187      "2px inherit",
   2188      "2",
   2189      "2px 2",
   2190      "2 2px",
   2191      "2px calc(0px + rubbish)",
   2192      "unset 2px",
   2193      "2px unset",
   2194    ],
   2195  },
   2196  "border-bottom-right-radius": {
   2197    domProp: "borderBottomRightRadius",
   2198    inherited: false,
   2199    type: CSS_TYPE_LONGHAND,
   2200    applies_to_first_letter: true,
   2201    prerequisites: { width: "200px", height: "100px", display: "inline-block" },
   2202    initial_values: ["0", "0px", "calc(-2px)"],
   2203    other_values: [
   2204      "0%",
   2205      "3%",
   2206      "1px",
   2207      "2em", // circular
   2208      "3% 2%",
   2209      "1px 4px",
   2210      "2em 2pt", // elliptical
   2211      "calc(-1%)",
   2212      "calc(2px)",
   2213      "calc(50%)",
   2214      "calc(3*25px)",
   2215      "calc(3*25px) 5px",
   2216      "5px calc(3*25px)",
   2217      "calc(20%) calc(3*25px)",
   2218      "calc(25px*3)",
   2219      "calc(3*25px + 50%)",
   2220    ],
   2221    invalid_values: [
   2222      "-1px",
   2223      "4px -2px",
   2224      "inherit 2px",
   2225      "2px inherit",
   2226      "2",
   2227      "2px 2",
   2228      "2 2px",
   2229      "2px calc(0px + rubbish)",
   2230      "unset 2px",
   2231      "2px unset",
   2232    ],
   2233  },
   2234  "border-top-left-radius": {
   2235    domProp: "borderTopLeftRadius",
   2236    inherited: false,
   2237    type: CSS_TYPE_LONGHAND,
   2238    applies_to_first_letter: true,
   2239    prerequisites: { width: "200px", height: "100px", display: "inline-block" },
   2240    initial_values: ["0", "0px", "calc(-2px)"],
   2241    other_values: [
   2242      "0%",
   2243      "3%",
   2244      "1px",
   2245      "2em", // circular
   2246      "3% 2%",
   2247      "1px 4px",
   2248      "2em 2pt", // elliptical
   2249      "calc(-1%)",
   2250      "calc(2px)",
   2251      "calc(50%)",
   2252      "calc(3*25px)",
   2253      "calc(3*25px) 5px",
   2254      "5px calc(3*25px)",
   2255      "calc(20%) calc(3*25px)",
   2256      "calc(25px*3)",
   2257      "calc(3*25px + 50%)",
   2258    ],
   2259    invalid_values: [
   2260      "-1px",
   2261      "4px -2px",
   2262      "inherit 2px",
   2263      "2px inherit",
   2264      "2",
   2265      "2px 2",
   2266      "2 2px",
   2267      "2px calc(0px + rubbish)",
   2268      "unset 2px",
   2269      "2px unset",
   2270    ],
   2271  },
   2272  "border-top-right-radius": {
   2273    domProp: "borderTopRightRadius",
   2274    inherited: false,
   2275    type: CSS_TYPE_LONGHAND,
   2276    applies_to_first_letter: true,
   2277    prerequisites: { width: "200px", height: "100px", display: "inline-block" },
   2278    initial_values: ["0", "0px", "calc(-2px)"],
   2279    other_values: [
   2280      "0%",
   2281      "3%",
   2282      "1px",
   2283      "2em", // circular
   2284      "3% 2%",
   2285      "1px 4px",
   2286      "2em 2pt", // elliptical
   2287      "calc(-1%)",
   2288      "calc(2px)",
   2289      "calc(50%)",
   2290      "calc(3*25px)",
   2291      "calc(3*25px) 5px",
   2292      "5px calc(3*25px)",
   2293      "calc(20%) calc(3*25px)",
   2294      "calc(25px*3)",
   2295      "calc(3*25px + 50%)",
   2296    ],
   2297    invalid_values: [
   2298      "-1px",
   2299      "4px -2px",
   2300      "inherit 2px",
   2301      "2px inherit",
   2302      "2",
   2303      "2px 2",
   2304      "2 2px",
   2305      "2px calc(0px + rubbish)",
   2306      "unset 2px",
   2307      "2px unset",
   2308    ],
   2309  },
   2310  "border-start-start-radius": {
   2311    domProp: "borderStartStartRadius",
   2312    inherited: false,
   2313    type: CSS_TYPE_LONGHAND,
   2314    applies_to_first_letter: true,
   2315    logical: true,
   2316    prerequisites: { width: "200px", height: "100px", display: "inline-block" },
   2317    initial_values: ["0", "0px", "calc(-2px)"],
   2318    other_values: [
   2319      "0%",
   2320      "3%",
   2321      "1px",
   2322      "2em", // circular
   2323      "3% 2%",
   2324      "1px 4px",
   2325      "2em 2pt", // elliptical
   2326      "calc(-1%)",
   2327      "calc(2px)",
   2328      "calc(50%)",
   2329      "calc(3*25px)",
   2330      "calc(3*25px) 5px",
   2331      "5px calc(3*25px)",
   2332      "calc(20%) calc(3*25px)",
   2333      "calc(25px*3)",
   2334      "calc(3*25px + 50%)",
   2335    ],
   2336    invalid_values: [
   2337      "-1px",
   2338      "4px -2px",
   2339      "inherit 2px",
   2340      "2px inherit",
   2341      "2",
   2342      "2px 2",
   2343      "2 2px",
   2344      "2px calc(0px + rubbish)",
   2345      "unset 2px",
   2346      "2px unset",
   2347    ],
   2348  },
   2349  "border-start-end-radius": {
   2350    domProp: "borderStartEndRadius",
   2351    inherited: false,
   2352    type: CSS_TYPE_LONGHAND,
   2353    applies_to_first_letter: true,
   2354    logical: true,
   2355    prerequisites: { width: "200px", height: "100px", display: "inline-block" },
   2356    initial_values: ["0", "0px", "calc(-2px)"],
   2357    other_values: [
   2358      "0%",
   2359      "3%",
   2360      "1px",
   2361      "2em", // circular
   2362      "3% 2%",
   2363      "1px 4px",
   2364      "2em 2pt", // elliptical
   2365      "calc(-1%)",
   2366      "calc(2px)",
   2367      "calc(50%)",
   2368      "calc(3*25px)",
   2369      "calc(3*25px) 5px",
   2370      "5px calc(3*25px)",
   2371      "calc(20%) calc(3*25px)",
   2372      "calc(25px*3)",
   2373      "calc(3*25px + 50%)",
   2374    ],
   2375    invalid_values: [
   2376      "-1px",
   2377      "4px -2px",
   2378      "inherit 2px",
   2379      "2px inherit",
   2380      "2",
   2381      "2px 2",
   2382      "2 2px",
   2383      "2px calc(0px + rubbish)",
   2384      "unset 2px",
   2385      "2px unset",
   2386    ],
   2387  },
   2388  "border-end-start-radius": {
   2389    domProp: "borderEndStartRadius",
   2390    inherited: false,
   2391    type: CSS_TYPE_LONGHAND,
   2392    applies_to_first_letter: true,
   2393    logical: true,
   2394    prerequisites: { width: "200px", height: "100px", display: "inline-block" },
   2395    initial_values: ["0", "0px", "calc(-2px)"],
   2396    other_values: [
   2397      "0%",
   2398      "3%",
   2399      "1px",
   2400      "2em", // circular
   2401      "3% 2%",
   2402      "1px 4px",
   2403      "2em 2pt", // elliptical
   2404      "calc(-1%)",
   2405      "calc(2px)",
   2406      "calc(50%)",
   2407      "calc(3*25px)",
   2408      "calc(3*25px) 5px",
   2409      "5px calc(3*25px)",
   2410      "calc(20%) calc(3*25px)",
   2411      "calc(25px*3)",
   2412      "calc(3*25px + 50%)",
   2413    ],
   2414    invalid_values: [
   2415      "-1px",
   2416      "4px -2px",
   2417      "inherit 2px",
   2418      "2px inherit",
   2419      "2",
   2420      "2px 2",
   2421      "2 2px",
   2422      "2px calc(0px + rubbish)",
   2423      "unset 2px",
   2424      "2px unset",
   2425    ],
   2426  },
   2427  "border-end-end-radius": {
   2428    domProp: "borderEndEndRadius",
   2429    inherited: false,
   2430    type: CSS_TYPE_LONGHAND,
   2431    applies_to_first_letter: true,
   2432    logical: true,
   2433    prerequisites: { width: "200px", height: "100px", display: "inline-block" },
   2434    initial_values: ["0", "0px", "calc(-2px)"],
   2435    other_values: [
   2436      "0%",
   2437      "3%",
   2438      "1px",
   2439      "2em", // circular
   2440      "3% 2%",
   2441      "1px 4px",
   2442      "2em 2pt", // elliptical
   2443      "calc(-1%)",
   2444      "calc(2px)",
   2445      "calc(50%)",
   2446      "calc(3*25px)",
   2447      "calc(3*25px) 5px",
   2448      "5px calc(3*25px)",
   2449      "calc(20%) calc(3*25px)",
   2450      "calc(25px*3)",
   2451      "calc(3*25px + 50%)",
   2452    ],
   2453    invalid_values: [
   2454      "-1px",
   2455      "4px -2px",
   2456      "inherit 2px",
   2457      "2px inherit",
   2458      "2",
   2459      "2px 2",
   2460      "2 2px",
   2461      "2px calc(0px + rubbish)",
   2462      "unset 2px",
   2463      "2px unset",
   2464    ],
   2465  },
   2466  "border-inline-start": {
   2467    domProp: "borderInlineStart",
   2468    inherited: false,
   2469    type: CSS_TYPE_TRUE_SHORTHAND,
   2470    subproperties: [
   2471      "border-inline-start-color",
   2472      "border-inline-start-style",
   2473      "border-inline-start-width",
   2474    ],
   2475    initial_values: [
   2476      "none",
   2477      "medium",
   2478      "currentColor",
   2479      "thin",
   2480      "none medium currentcolor",
   2481    ],
   2482    other_values: [
   2483      "solid",
   2484      "green",
   2485      "medium solid",
   2486      "green solid",
   2487      "10px solid",
   2488      "thick solid",
   2489      "5px green none",
   2490    ],
   2491    invalid_values: ["5%", "5", "5 green solid"],
   2492  },
   2493  "border-inline-start-color": {
   2494    domProp: "borderInlineStartColor",
   2495    inherited: false,
   2496    type: CSS_TYPE_LONGHAND,
   2497    applies_to_first_letter: true,
   2498    logical: true,
   2499    initial_values: ["currentColor"],
   2500    other_values: ["green", "rgba(255,128,0,0.5)", "transparent"],
   2501    invalid_values: ["#0", "#00", "#00000", "#0000000", "#000000000", "000000"],
   2502  },
   2503  "border-inline-start-style": {
   2504    domProp: "borderInlineStartStyle",
   2505    inherited: false,
   2506    type: CSS_TYPE_LONGHAND,
   2507    applies_to_first_letter: true,
   2508    logical: true,
   2509    /* XXX hidden is sometimes the same as initial */
   2510    initial_values: ["none"],
   2511    other_values: [
   2512      "solid",
   2513      "dashed",
   2514      "dotted",
   2515      "double",
   2516      "outset",
   2517      "inset",
   2518      "groove",
   2519      "ridge",
   2520    ],
   2521    invalid_values: [],
   2522  },
   2523  "border-inline-start-width": {
   2524    domProp: "borderInlineStartWidth",
   2525    inherited: false,
   2526    type: CSS_TYPE_LONGHAND,
   2527    applies_to_first_letter: true,
   2528    logical: true,
   2529    prerequisites: { "border-inline-start-style": "solid" },
   2530    initial_values: ["medium", "3px", "calc(4px - 1px)"],
   2531    other_values: [
   2532      "thin",
   2533      "thick",
   2534      "1px",
   2535      "2em",
   2536      "calc(2px)",
   2537      "calc(-2px)",
   2538      "calc(0em)",
   2539      "calc(0px)",
   2540      "calc(5em)",
   2541      "calc(3*25px)",
   2542      "calc(25px*3)",
   2543      "calc(3*25px + 5em)",
   2544    ],
   2545    invalid_values: ["5%", "5", "stretch"],
   2546  },
   2547  "-moz-box-align": {
   2548    domProp: "MozBoxAlign",
   2549    inherited: false,
   2550    type: CSS_TYPE_LONGHAND,
   2551    initial_values: ["stretch"],
   2552    other_values: ["start", "center", "baseline", "end"],
   2553    invalid_values: [],
   2554  },
   2555  "-moz-box-direction": {
   2556    domProp: "MozBoxDirection",
   2557    inherited: false,
   2558    type: CSS_TYPE_LONGHAND,
   2559    initial_values: ["normal"],
   2560    other_values: ["reverse"],
   2561    invalid_values: [],
   2562  },
   2563  "-moz-box-flex": {
   2564    domProp: "MozBoxFlex",
   2565    inherited: false,
   2566    type: CSS_TYPE_LONGHAND,
   2567    initial_values: ["0", "0.0", "-0.0"],
   2568    other_values: ["1", "100", "0.1"],
   2569    invalid_values: ["10px", "-1"],
   2570  },
   2571  "-moz-box-ordinal-group": {
   2572    domProp: "MozBoxOrdinalGroup",
   2573    inherited: false,
   2574    type: CSS_TYPE_LONGHAND,
   2575    initial_values: ["1"],
   2576    other_values: ["2", "100", "0"],
   2577    invalid_values: ["1.0", "-1", "-1000"],
   2578  },
   2579  "-moz-box-orient": {
   2580    domProp: "MozBoxOrient",
   2581    inherited: false,
   2582    type: CSS_TYPE_LONGHAND,
   2583    initial_values: ["horizontal", "inline-axis"],
   2584    other_values: ["vertical", "block-axis"],
   2585    invalid_values: [],
   2586  },
   2587  "-moz-box-pack": {
   2588    domProp: "MozBoxPack",
   2589    inherited: false,
   2590    type: CSS_TYPE_LONGHAND,
   2591    initial_values: ["start"],
   2592    other_values: ["center", "end", "justify"],
   2593    invalid_values: [],
   2594  },
   2595  "box-decoration-break": {
   2596    domProp: "boxDecorationBreak",
   2597    inherited: false,
   2598    type: CSS_TYPE_LONGHAND,
   2599    initial_values: ["slice"],
   2600    other_values: ["clone"],
   2601    invalid_values: ["auto", "none", "1px"],
   2602  },
   2603  "box-sizing": {
   2604    domProp: "boxSizing",
   2605    inherited: false,
   2606    type: CSS_TYPE_LONGHAND,
   2607    initial_values: ["content-box"],
   2608    other_values: ["border-box"],
   2609    invalid_values: [
   2610      "padding-box",
   2611      "margin-box",
   2612      "content",
   2613      "padding",
   2614      "border",
   2615      "margin",
   2616    ],
   2617  },
   2618  "-moz-box-sizing": {
   2619    domProp: "MozBoxSizing",
   2620    inherited: false,
   2621    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
   2622    alias_for: "box-sizing",
   2623    subproperties: ["box-sizing"],
   2624  },
   2625  "print-color-adjust": {
   2626    domProp: "printColorAdjust",
   2627    inherited: true,
   2628    type: CSS_TYPE_LONGHAND,
   2629    initial_values: ["economy"],
   2630    other_values: ["exact"],
   2631    invalid_values: [],
   2632  },
   2633  "color-adjust": {
   2634    domProp: "colorAdjust",
   2635    inherited: true,
   2636    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
   2637    alias_for: "print-color-adjust",
   2638    subproperties: ["print-color-adjust"],
   2639  },
   2640  "color-scheme": {
   2641    domProp: "colorScheme",
   2642    inherited: true,
   2643    type: CSS_TYPE_LONGHAND,
   2644    initial_values: ["normal"],
   2645    other_values: [
   2646      "light",
   2647      "dark",
   2648      "light dark",
   2649      "light dark purple",
   2650      "light light dark",
   2651      "only light",
   2652      "only light dark",
   2653      "only light dark purple",
   2654      "light only",
   2655    ],
   2656    invalid_values: ["only normal", "normal only", "only light only"],
   2657  },
   2658  columns: {
   2659    domProp: "columns",
   2660    inherited: false,
   2661    type: CSS_TYPE_TRUE_SHORTHAND,
   2662    subproperties: ["column-count", "column-width"],
   2663    initial_values: ["auto", "auto auto"],
   2664    other_values: [
   2665      "3",
   2666      "20px",
   2667      "2 10px",
   2668      "10px 2",
   2669      "2 auto",
   2670      "auto 2",
   2671      "auto 50px",
   2672      "50px auto",
   2673    ],
   2674    invalid_values: [
   2675      "stretch",
   2676      "5%",
   2677      "-1px",
   2678      "-1",
   2679      "3 5",
   2680      "10px 4px",
   2681      "10 2px 5in",
   2682      "30px -1",
   2683      "auto 3 5px",
   2684      "5 auto 20px",
   2685      "auto auto auto",
   2686      "calc(50px + rubbish) 2",
   2687    ],
   2688  },
   2689  "column-count": {
   2690    domProp: "columnCount",
   2691    inherited: false,
   2692    type: CSS_TYPE_LONGHAND,
   2693    initial_values: ["auto"],
   2694    other_values: ["1", "17"],
   2695    // negative and zero invalid per editor's draft
   2696    invalid_values: ["-1", "0", "3px"],
   2697  },
   2698  "column-fill": {
   2699    domProp: "columnFill",
   2700    inherited: false,
   2701    type: CSS_TYPE_LONGHAND,
   2702    initial_values: ["balance"],
   2703    other_values: ["auto"],
   2704    invalid_values: ["2px", "dotted", "5em"],
   2705  },
   2706  "column-rule": {
   2707    domProp: "columnRule",
   2708    inherited: false,
   2709    type: CSS_TYPE_TRUE_SHORTHAND,
   2710    prerequisites: { color: "green" },
   2711    subproperties: [
   2712      "column-rule-width",
   2713      "column-rule-style",
   2714      "column-rule-color",
   2715    ],
   2716    initial_values: [
   2717      "medium none currentColor",
   2718      "none",
   2719      "medium",
   2720      "currentColor",
   2721    ],
   2722    other_values: [
   2723      "2px blue solid",
   2724      "red dotted 1px",
   2725      "ridge 4px orange",
   2726      "5px solid",
   2727    ],
   2728    invalid_values: [
   2729      "2px 3px 4px red",
   2730      "dotted dashed",
   2731      "5px dashed green 3px",
   2732      "5 solid",
   2733      "5 green solid",
   2734    ],
   2735  },
   2736  "column-rule-width": {
   2737    domProp: "columnRuleWidth",
   2738    inherited: false,
   2739    type: CSS_TYPE_LONGHAND,
   2740    prerequisites: { "column-rule-style": "solid" },
   2741    initial_values: ["medium", "3px", "calc(3px)", "calc(5em + 3px - 5em)"],
   2742    other_values: [
   2743      "thin",
   2744      "15px",
   2745      /* valid calc() values */
   2746      "calc(-2px)",
   2747      "calc(2px)",
   2748      "calc(3em)",
   2749      "calc(3em + 2px)",
   2750      "calc( 3em + 2px)",
   2751      "calc(3em + 2px )",
   2752      "calc( 3em + 2px )",
   2753      "calc(3*25px)",
   2754      "calc(3 *25px)",
   2755      "calc(3 * 25px)",
   2756      "calc(3* 25px)",
   2757      "calc(25px*3)",
   2758      "calc(25px *3)",
   2759      "calc(25px* 3)",
   2760      "calc(25px * 3)",
   2761      "calc(25px * 3 / 4)",
   2762      "calc((25px * 3) / 4)",
   2763      "calc(25px * (3 / 4))",
   2764      "calc(3 * 25px / 4)",
   2765      "calc((3 * 25px) / 4)",
   2766      "calc(3 * (25px / 4))",
   2767      "calc(3em + 25px * 3 / 4)",
   2768      "calc(3em + (25px * 3) / 4)",
   2769      "calc(3em + 25px * (3 / 4))",
   2770      "calc(25px * 3 / 4 + 3em)",
   2771      "calc((25px * 3) / 4 + 3em)",
   2772      "calc(25px * (3 / 4) + 3em)",
   2773      "calc(3em + (25px * 3 / 4))",
   2774      "calc(3em + ((25px * 3) / 4))",
   2775      "calc(3em + (25px * (3 / 4)))",
   2776      "calc((25px * 3 / 4) + 3em)",
   2777      "calc(((25px * 3) / 4) + 3em)",
   2778      "calc((25px * (3 / 4)) + 3em)",
   2779      "calc(3*25px + 1in)",
   2780      "calc(1in - 3em + 2px)",
   2781      "calc(1in - (3em + 2px))",
   2782      "calc((1in - 3em) + 2px)",
   2783      "calc(50px/2)",
   2784      "calc(50px/(2 - 1))",
   2785      "calc(-3px)",
   2786      /* numeric reduction cases */
   2787      "calc(5 * 3 * 2em)",
   2788      "calc(2em * 5 * 3)",
   2789      "calc((5 * 3) * 2em)",
   2790      "calc(2em * (5 * 3))",
   2791      "calc((5 + 3) * 2em)",
   2792      "calc(2em * (5 + 3))",
   2793      "calc(2em / (5 + 3))",
   2794      "calc(2em * (5*2 + 3))",
   2795      "calc(2em * ((5*2) + 3))",
   2796      "calc(2em * (5*(2 + 3)))",
   2797 
   2798      "calc((5 + 7) * 3em)",
   2799      "calc((5em + 3em) - 2em)",
   2800      "calc((5em - 3em) + 2em)",
   2801      "calc(2em - (5em - 3em))",
   2802      "calc(2em + (5em - 3em))",
   2803      "calc(2em - (5em + 3em))",
   2804      "calc(2em + (5em + 3em))",
   2805      "calc(2em + 5em - 3em)",
   2806      "calc(2em - 5em - 3em)",
   2807      "calc(2em + 5em + 3em)",
   2808      "calc(2em - 5em + 3em)",
   2809 
   2810      "calc(2em / 4 * 3)",
   2811      "calc(2em * 4 / 3)",
   2812      "calc(2em * 4 * 3)",
   2813      "calc(2em / 4 / 3)",
   2814      "calc(4 * 2em / 3)",
   2815      "calc(4 / 3 * 2em)",
   2816 
   2817      "calc((2em / 4) * 3)",
   2818      "calc((2em * 4) / 3)",
   2819      "calc((2em * 4) * 3)",
   2820      "calc((2em / 4) / 3)",
   2821      "calc((4 * 2em) / 3)",
   2822      "calc((4 / 3) * 2em)",
   2823 
   2824      "calc(2em / (4 * 3))",
   2825      "calc(2em * (4 / 3))",
   2826      "calc(2em * (4 * 3))",
   2827      "calc(2em / (4 / 3))",
   2828      "calc(4 * (2em / 3))",
   2829 
   2830      "min(5px)",
   2831      "min(5px,2em)",
   2832 
   2833      "max(5px)",
   2834      "max(5px,2em)",
   2835 
   2836      "calc(min(5px))",
   2837      "calc(min(5px,2em))",
   2838 
   2839      "calc(max(5px))",
   2840      "calc(max(5px,2em))",
   2841 
   2842      // Valid cases with unitless zero (which is never
   2843      // a length).
   2844      "calc(0 * 2em)",
   2845      "calc(2em * 0)",
   2846      "calc(3em + 0 * 2em)",
   2847      "calc(3em + 2em * 0)",
   2848      "calc((0 + 2) * 2em)",
   2849      "calc((2 + 0) * 2em)",
   2850      // And test zero lengths while we're here.
   2851      "calc(2 * 0px)",
   2852      "calc(0 * 0px)",
   2853      "calc(2 * 0em)",
   2854      "calc(0 * 0em)",
   2855      "calc(0px * 0)",
   2856      "calc(0px * 2)",
   2857    ],
   2858    invalid_values: [
   2859      "stretch",
   2860      "20",
   2861      "-1px",
   2862      "red",
   2863      "50%",
   2864      /* invalid calc() values */
   2865      "calc(2em+ 2px)",
   2866      "calc(2em +2px)",
   2867      "calc(2em+2px)",
   2868      "calc(2em- 2px)",
   2869      "calc(2em -2px)",
   2870      "calc(2em-2px)",
   2871      "-moz-min()",
   2872      "calc(min())",
   2873      "-moz-max()",
   2874      "calc(max())",
   2875      "-moz-min(5px)",
   2876      "-moz-max(5px)",
   2877      "-moz-min(5px,2em)",
   2878      "-moz-max(5px,2em)",
   2879      "calc(5 + 5)",
   2880      "calc(5 * 5)",
   2881      "calc(5em * 5em)",
   2882      "calc(5em / 5em * 5em)",
   2883 
   2884      "calc(4 * 3 / 2em)",
   2885      "calc((4 * 3) / 2em)",
   2886      "calc(4 * (3 / 2em))",
   2887      "calc(4 / (3 * 2em))",
   2888 
   2889      // Tests for handling of unitless zero, which cannot
   2890      // be a length inside calc().
   2891      "calc(0)",
   2892      "calc(0 + 2em)",
   2893      "calc(2em + 0)",
   2894      "calc(0 * 2)",
   2895      "calc(2 * 0)",
   2896      "calc(1 * (2em + 0))",
   2897      "calc((2em + 0))",
   2898      "calc((2em + 0) * 1)",
   2899      "calc(1 * (0 + 2em))",
   2900      "calc((0 + 2em))",
   2901      "calc((0 + 2em) * 1)",
   2902    ],
   2903  },
   2904  "column-rule-style": {
   2905    domProp: "columnRuleStyle",
   2906    inherited: false,
   2907    type: CSS_TYPE_LONGHAND,
   2908    initial_values: ["none"],
   2909    other_values: [
   2910      "solid",
   2911      "hidden",
   2912      "ridge",
   2913      "groove",
   2914      "inset",
   2915      "outset",
   2916      "double",
   2917      "dotted",
   2918      "dashed",
   2919    ],
   2920    invalid_values: ["20", "foo"],
   2921  },
   2922  "column-rule-color": {
   2923    domProp: "columnRuleColor",
   2924    inherited: false,
   2925    type: CSS_TYPE_LONGHAND,
   2926    prerequisites: { color: "green" },
   2927    initial_values: ["currentColor"],
   2928    other_values: ["red", "blue", "#ffff00"],
   2929    invalid_values: ["ffff00"],
   2930  },
   2931  "column-span": {
   2932    domProp: "columnSpan",
   2933    inherited: false,
   2934    type: CSS_TYPE_LONGHAND,
   2935    initial_values: ["none"],
   2936    other_values: ["all"],
   2937    invalid_values: ["-1", "0", "auto", "2px"],
   2938  },
   2939  "column-width": {
   2940    domProp: "columnWidth",
   2941    inherited: false,
   2942    type: CSS_TYPE_LONGHAND,
   2943    initial_values: ["auto"],
   2944    other_values: [
   2945      "15px",
   2946      "calc(15px)",
   2947      "calc(30px - 3em)",
   2948      "calc(-15px)",
   2949      "0px",
   2950      "calc(0px)",
   2951    ],
   2952    invalid_values: ["20", "-1px", "50%", "stretch"],
   2953  },
   2954  "container-type": {
   2955    domProp: "containerType",
   2956    inherited: false,
   2957    type: CSS_TYPE_LONGHAND,
   2958    initial_values: ["normal"],
   2959    other_values: ["inline-size", "size"], // see also "layout.css.scroll-state.enabled" in this file
   2960    invalid_values: [
   2961      // invalid values should always be invalid
   2962      "none style",
   2963      "none inline-size",
   2964      "inline-size none",
   2965      "style none",
   2966      "style style",
   2967      "inline-size style inline-size",
   2968      "inline-size normal inline-size",
   2969      "inline-size block-size",
   2970      "block-size",
   2971      "block-size style",
   2972      "size inline-size",
   2973      "size block-size",
   2974      "size normal",
   2975      "normal size",
   2976      "inline-size normal",
   2977      "normal inline-size",
   2978      "scroll-state normal",
   2979      "normal scroll-state",
   2980    ],
   2981  },
   2982  "container-name": {
   2983    domProp: "containerName",
   2984    inherited: false,
   2985    type: CSS_TYPE_LONGHAND,
   2986    initial_values: ["none"],
   2987    other_values: ["foo bar", "foo", "baz bazz", "foo foo"],
   2988    invalid_values: ["foo unset", "none bar", "foo initial", "initial foo"],
   2989  },
   2990  container: {
   2991    domProp: "container",
   2992    inherited: false,
   2993    type: CSS_TYPE_TRUE_SHORTHAND,
   2994    subproperties: ["container-type", "container-name"],
   2995    initial_values: ["none"],
   2996    other_values: ["foo / size", "foo bar / size", "foo / inline-size", "foo"],
   2997    invalid_values: ["size / foo", "size / foo bar"],
   2998  },
   2999  d: {
   3000    domProp: "d",
   3001    inherited: false,
   3002    type: CSS_TYPE_LONGHAND,
   3003    initial_values: ["none"],
   3004    other_values: ["path('')", "path(' ')"].concat(pathValues.other_values),
   3005    invalid_values: pathValues.invalid_values,
   3006  },
   3007  "-moz-float-edge": {
   3008    domProp: "MozFloatEdge",
   3009    inherited: false,
   3010    type: CSS_TYPE_LONGHAND,
   3011    initial_values: ["content-box"],
   3012    other_values: ["margin-box"],
   3013    invalid_values: ["content", "padding", "border", "margin"],
   3014  },
   3015  "-moz-force-broken-image-icon": {
   3016    domProp: "MozForceBrokenImageIcon",
   3017    inherited: false,
   3018    type: CSS_TYPE_LONGHAND,
   3019    initial_values: ["0"],
   3020    other_values: ["1"],
   3021    invalid_values: [],
   3022  },
   3023  "margin-inline": {
   3024    domProp: "marginInline",
   3025    inherited: false,
   3026    type: CSS_TYPE_TRUE_SHORTHAND,
   3027    subproperties: ["margin-inline-start", "margin-inline-end"],
   3028    initial_values: ["0", "0px 0em"],
   3029    other_values: [
   3030      "1px",
   3031      "3em 1%",
   3032      "5%",
   3033      "calc(2px) 1%",
   3034      "calc(-2px) 1%",
   3035      "calc(50%) 1%",
   3036      "calc(3*25px) calc(2px)",
   3037      "calc(25px*3) 1em",
   3038      "calc(3*25px + 50%) calc(3*25px - 50%)",
   3039    ],
   3040    invalid_values: [
   3041      "5",
   3042      "..25px",
   3043      ".+5px",
   3044      ".px",
   3045      "-.px",
   3046      "++5px",
   3047      "-+4px",
   3048      "+-3px",
   3049      "--7px",
   3050      "+-.6px",
   3051      "-+.5px",
   3052      "++.7px",
   3053      "--.4px",
   3054    ],
   3055  },
   3056  "margin-inline-end": {
   3057    domProp: "marginInlineEnd",
   3058    inherited: false,
   3059    type: CSS_TYPE_LONGHAND,
   3060    applies_to_first_letter: true,
   3061    logical: true,
   3062    /* no subproperties */
   3063    /* auto may or may not be initial */
   3064    initial_values: [
   3065      "0",
   3066      "0px",
   3067      "0%",
   3068      "0em",
   3069      "0ex",
   3070      "calc(0pt)",
   3071      "calc(0% + 0px)",
   3072    ],
   3073    other_values: [
   3074      "1px",
   3075      "3em",
   3076      "5%",
   3077      "calc(2px)",
   3078      "calc(-2px)",
   3079      "calc(50%)",
   3080      "calc(3*25px)",
   3081      "calc(25px*3)",
   3082      "calc(3*25px + 50%)",
   3083    ],
   3084    invalid_values: [
   3085      "stretch",
   3086      "5",
   3087      "..25px",
   3088      ".+5px",
   3089      ".px",
   3090      "-.px",
   3091      "++5px",
   3092      "-+4px",
   3093      "+-3px",
   3094      "--7px",
   3095      "+-.6px",
   3096      "-+.5px",
   3097      "++.7px",
   3098      "--.4px",
   3099    ],
   3100  },
   3101  "margin-inline-start": {
   3102    domProp: "marginInlineStart",
   3103    inherited: false,
   3104    type: CSS_TYPE_LONGHAND,
   3105    applies_to_first_letter: true,
   3106    logical: true,
   3107    /* no subproperties */
   3108    /* auto may or may not be initial */
   3109    initial_values: [
   3110      "0",
   3111      "0px",
   3112      "0%",
   3113      "0em",
   3114      "0ex",
   3115      "calc(0pt)",
   3116      "calc(0% + 0px)",
   3117    ],
   3118    other_values: [
   3119      "1px",
   3120      "3em",
   3121      "5%",
   3122      "calc(2px)",
   3123      "calc(-2px)",
   3124      "calc(50%)",
   3125      "calc(3*25px)",
   3126      "calc(25px*3)",
   3127      "calc(3*25px + 50%)",
   3128    ],
   3129    invalid_values: [
   3130      "5",
   3131      "..25px",
   3132      ".+5px",
   3133      ".px",
   3134      "-.px",
   3135      "++5px",
   3136      "-+4px",
   3137      "+-3px",
   3138      "--7px",
   3139      "+-.6px",
   3140      "-+.5px",
   3141      "++.7px",
   3142      "--.4px",
   3143    ],
   3144  },
   3145  mask: {
   3146    domProp: "mask",
   3147    inherited: false,
   3148    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
   3149    /* FIXME: All mask-border-* should be added when we implement them. */
   3150    subproperties: [
   3151      "mask-clip",
   3152      "mask-image",
   3153      "mask-mode",
   3154      "mask-origin",
   3155      "mask-position-x",
   3156      "mask-position-y",
   3157      "mask-repeat",
   3158      "mask-size",
   3159      "mask-composite",
   3160    ],
   3161    initial_values: [
   3162      "match-source",
   3163      "none",
   3164      "repeat",
   3165      "add",
   3166      "0% 0%",
   3167      "top left",
   3168      "0% 0% / auto",
   3169      "top left / auto",
   3170      "left top / auto",
   3171      "0% 0% / auto auto",
   3172      "top left none",
   3173      "left top none",
   3174      "none left top",
   3175      "none top left",
   3176      "none 0% 0%",
   3177      "top left / auto none",
   3178      "left top / auto none",
   3179      "top left / auto auto none",
   3180      "match-source none repeat add top left",
   3181      "top left repeat none add",
   3182      "none repeat add top left / auto",
   3183      "top left / auto repeat none add match-source",
   3184      "none repeat add 0% 0% / auto auto match-source",
   3185      "border-box",
   3186      "border-box border-box",
   3187    ],
   3188    other_values: [
   3189      "none alpha repeat add left top",
   3190      "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
   3191      "no-repeat url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==') alpha left top add",
   3192      "repeat-x",
   3193      "repeat-y",
   3194      "no-repeat",
   3195      "none repeat-y alpha add 0% 0%",
   3196      "subtract",
   3197      "0% top subtract alpha repeat none",
   3198      "top",
   3199      "left",
   3200      "50% 50%",
   3201      "center",
   3202      "top / 100px",
   3203      "left / contain",
   3204      "left / cover",
   3205      "10px / 10%",
   3206      "10em / calc(20px)",
   3207      "top left / 100px 100px",
   3208      "top left / 100px auto",
   3209      "top left / 100px 10%",
   3210      "top left / 100px calc(20px)",
   3211      "bottom right add none alpha repeat",
   3212      "50% alpha",
   3213      "alpha 50%",
   3214      "50%",
   3215      "url(#mymask)",
   3216      "radial-gradient(at 10% bottom, #ffffff, black) add no-repeat",
   3217      "repeating-radial-gradient(at 10% bottom, #ffffff, black) no-repeat",
   3218      "-moz-element(#test) alpha",
   3219      /* multiple mask-image */
   3220      "url(404.png), url(404.png)",
   3221      "repeat-x, subtract, none",
   3222      "0% top url(404.png), url(404.png) 50% top",
   3223      "subtract repeat-y top left url(404.png), repeat-x alpha",
   3224      "top left / contain, bottom right / cover",
   3225      /* test cases with clip+origin in the shorthand */
   3226      "url(404.png) alpha padding-box",
   3227      "url(404.png) border-box alpha",
   3228      "content-box url(404.png)",
   3229      "url(404.png) alpha padding-box padding-box",
   3230      "url(404.png) alpha padding-box border-box",
   3231      "content-box border-box url(404.png)",
   3232      "alpha padding-box url(404.png) border-box",
   3233      "alpha padding-box url(404.png) padding-box",
   3234    ],
   3235    invalid_values: [
   3236      /* mixes with keywords have to be in correct order */
   3237      "50% left",
   3238      "top 50%",
   3239      /* no quirks mode colors */
   3240      "radial-gradient(at 10% bottom, ffffff, black) add no-repeat",
   3241      /* no quirks mode lengths */
   3242      "linear-gradient(red -99, yellow, green, blue 120%)",
   3243      /* bug 258080: don't accept background-position separated */
   3244      "left url(404.png) top",
   3245      "top url(404.png) left",
   3246      "-moz-element(#a rubbish)",
   3247      "left top / match-source",
   3248    ],
   3249  },
   3250  "mask-clip": {
   3251    domProp: "maskClip",
   3252    inherited: false,
   3253    type: CSS_TYPE_LONGHAND,
   3254    initial_values: ["border-box"],
   3255    other_values: [
   3256      "content-box",
   3257      "fill-box",
   3258      "stroke-box",
   3259      "view-box",
   3260      "no-clip",
   3261      "padding-box",
   3262      "border-box, padding-box",
   3263      "padding-box, padding-box, padding-box",
   3264      "border-box, border-box",
   3265    ],
   3266    invalid_values: ["content-box content-box", "margin-box"],
   3267  },
   3268  "mask-composite": {
   3269    domProp: "maskComposite",
   3270    inherited: false,
   3271    type: CSS_TYPE_LONGHAND,
   3272    initial_values: ["add"],
   3273    other_values: [
   3274      "subtract",
   3275      "intersect",
   3276      "exclude",
   3277      "add, add",
   3278      "subtract, intersect",
   3279      "subtract, subtract, add",
   3280    ],
   3281    invalid_values: ["add subtract", "intersect exclude"],
   3282  },
   3283  "mask-image": {
   3284    domProp: "maskImage",
   3285    inherited: false,
   3286    type: CSS_TYPE_LONGHAND,
   3287    initial_values: ["none"],
   3288    other_values: [
   3289      "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
   3290      "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==')",
   3291      'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
   3292      "none, none",
   3293      "none, none, none, none, none",
   3294      "url(#mymask)",
   3295      "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), none",
   3296      "none, url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), none",
   3297      "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
   3298    ].concat(validNonUrlImageValues),
   3299    invalid_values: [].concat(invalidNonUrlImageValues),
   3300    unbalanced_values: [].concat(unbalancedGradientAndElementValues),
   3301  },
   3302  "mask-mode": {
   3303    domProp: "maskMode",
   3304    inherited: false,
   3305    type: CSS_TYPE_LONGHAND,
   3306    initial_values: ["match-source"],
   3307    other_values: [
   3308      "alpha",
   3309      "luminance",
   3310      "match-source, match-source",
   3311      "match-source, alpha",
   3312      "alpha, luminance, match-source",
   3313    ],
   3314    invalid_values: ["match-source match-source", "alpha match-source"],
   3315  },
   3316  "mask-origin": {
   3317    domProp: "maskOrigin",
   3318    inherited: false,
   3319    type: CSS_TYPE_LONGHAND,
   3320    initial_values: ["border-box"],
   3321    other_values: [
   3322      "padding-box",
   3323      "content-box",
   3324      "fill-box",
   3325      "stroke-box",
   3326      "view-box",
   3327      "border-box, padding-box",
   3328      "padding-box, padding-box, padding-box",
   3329      "border-box, border-box",
   3330    ],
   3331    invalid_values: ["padding-box padding-box", "no-clip", "margin-box"],
   3332  },
   3333  "mask-position": {
   3334    domProp: "maskPosition",
   3335    inherited: false,
   3336    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
   3337    initial_values: [
   3338      "top 0% left 0%",
   3339      "top left",
   3340      "left top",
   3341      "0% 0%",
   3342      "0% top",
   3343      "left 0%",
   3344    ],
   3345    other_values: [
   3346      "top",
   3347      "left",
   3348      "right",
   3349      "bottom",
   3350      "center",
   3351      "center bottom",
   3352      "bottom center",
   3353      "center right",
   3354      "right center",
   3355      "center top",
   3356      "top center",
   3357      "center left",
   3358      "left center",
   3359      "right bottom",
   3360      "bottom right",
   3361      "50%",
   3362      "top left, top left",
   3363      "top left, top right",
   3364      "top right, top left",
   3365      "left top, 0% 0%",
   3366      "10% 20%, 30%, 40%",
   3367      "top left, bottom right",
   3368      "right bottom, left top",
   3369      "0%",
   3370      "0px",
   3371      "30px",
   3372      "0%, 10%, 20%, 30%",
   3373      "top, top, top, top, top",
   3374      "calc(20px)",
   3375      "calc(20px) 10px",
   3376      "10px calc(20px)",
   3377      "calc(20px) 25%",
   3378      "25% calc(20px)",
   3379      "calc(20px) calc(20px)",
   3380      "calc(20px + 1em) calc(20px / 2)",
   3381      "calc(20px + 50%) calc(50% - 10px)",
   3382      "calc(-20px) calc(-50%)",
   3383      "calc(-20%) calc(-50%)",
   3384      "0px 0px",
   3385      "right 20px top 60px",
   3386      "right 20px bottom 60px",
   3387      "left 20px top 60px",
   3388      "left 20px bottom 60px",
   3389      "right -50px top -50px",
   3390      "left -50px bottom -50px",
   3391      "right 20px top -50px",
   3392      "right -20px top 50px",
   3393      "right 3em bottom 10px",
   3394      "bottom 3em right 10px",
   3395      "top 3em right 10px",
   3396      "left 15px",
   3397      "10px top",
   3398      "left 20%",
   3399      "right 20%",
   3400    ],
   3401    subproperties: ["mask-position-x", "mask-position-y"],
   3402    invalid_values: [
   3403      "center 10px center 4px",
   3404      "center 10px center",
   3405      "top 20%",
   3406      "bottom 20%",
   3407      "50% left",
   3408      "top 50%",
   3409      "50% bottom 10%",
   3410      "right 10% 50%",
   3411      "left right",
   3412      "top bottom",
   3413      "left 10% right",
   3414      "top 20px bottom 20px",
   3415      "left left",
   3416      "0px calc(0px + rubbish)",
   3417      "left top 15px",
   3418      "left 10px top",
   3419    ],
   3420  },
   3421  "mask-position-x": {
   3422    domProp: "maskPositionX",
   3423    inherited: false,
   3424    type: CSS_TYPE_LONGHAND,
   3425    initial_values: ["left", "0%"],
   3426    other_values: [
   3427      "right",
   3428      "center",
   3429      "50%",
   3430      "center, center",
   3431      "center, right",
   3432      "right, center",
   3433      "center, 50%",
   3434      "10%, 20%, 40%",
   3435      "1px",
   3436      "30px",
   3437      "50%, 10%, 20%, 30%",
   3438      "center, center, center, center, center",
   3439      "calc(20px)",
   3440      "calc(20px + 1em)",
   3441      "calc(20px / 2)",
   3442      "calc(20px + 50%)",
   3443      "calc(50% - 10px)",
   3444      "calc(-20px)",
   3445      "calc(-50%)",
   3446      "calc(-20%)",
   3447      "right 20px",
   3448      "left 20px",
   3449      "right -50px",
   3450      "left -50px",
   3451      "right 20px",
   3452      "right 3em",
   3453    ],
   3454    invalid_values: [
   3455      "center 10px",
   3456      "right 10% 50%",
   3457      "left right",
   3458      "left left",
   3459      "bottom 20px",
   3460      "top 10%",
   3461      "bottom 3em",
   3462      "top",
   3463      "bottom",
   3464      "top, top",
   3465      "top, bottom",
   3466      "bottom, top",
   3467      "top, 0%",
   3468      "top, top, top, top, top",
   3469      "calc(0px + rubbish)",
   3470      "center 0%",
   3471    ],
   3472  },
   3473  "mask-position-y": {
   3474    domProp: "maskPositionY",
   3475    inherited: false,
   3476    type: CSS_TYPE_LONGHAND,
   3477    initial_values: ["top", "0%"],
   3478    other_values: [
   3479      "bottom",
   3480      "center",
   3481      "50%",
   3482      "center, center",
   3483      "center, bottom",
   3484      "bottom, center",
   3485      "center, 0%",
   3486      "10%, 20%, 40%",
   3487      "1px",
   3488      "30px",
   3489      "50%, 10%, 20%, 30%",
   3490      "center, center, center, center, center",
   3491      "calc(20px)",
   3492      "calc(20px + 1em)",
   3493      "calc(20px / 2)",
   3494      "calc(20px + 50%)",
   3495      "calc(50% - 10px)",
   3496      "calc(-20px)",
   3497      "calc(-50%)",
   3498      "calc(-20%)",
   3499      "bottom 20px",
   3500      "top 20px",
   3501      "bottom -50px",
   3502      "top -50px",
   3503      "bottom 20px",
   3504      "bottom 3em",
   3505    ],
   3506    invalid_values: [
   3507      "center 10px",
   3508      "bottom 10% 50%",
   3509      "top bottom",
   3510      "top top",
   3511      "right 20px",
   3512      "left 10%",
   3513      "right 3em",
   3514      "left",
   3515      "right",
   3516      "left, left",
   3517      "left, right",
   3518      "right, left",
   3519      "left, 0%",
   3520      "left, left, left, left, left",
   3521      "calc(0px + rubbish)",
   3522      "center 0%",
   3523    ],
   3524  },
   3525  "mask-repeat": {
   3526    domProp: "maskRepeat",
   3527    inherited: false,
   3528    type: CSS_TYPE_LONGHAND,
   3529    initial_values: ["repeat", "repeat repeat"],
   3530    other_values: [
   3531      "repeat-x",
   3532      "repeat-y",
   3533      "no-repeat",
   3534      "repeat-x, repeat-x",
   3535      "repeat, no-repeat",
   3536      "repeat-y, no-repeat, repeat-y",
   3537      "repeat, repeat, repeat",
   3538      "repeat no-repeat",
   3539      "no-repeat repeat",
   3540      "no-repeat no-repeat",
   3541      "repeat no-repeat",
   3542      "no-repeat no-repeat, no-repeat no-repeat",
   3543    ],
   3544    invalid_values: [
   3545      "repeat repeat repeat",
   3546      "repeat-x repeat-y",
   3547      "repeat repeat-x",
   3548      "repeat repeat-y",
   3549      "repeat-x repeat",
   3550      "repeat-y repeat",
   3551    ],
   3552  },
   3553  "mask-size": {
   3554    domProp: "maskSize",
   3555    inherited: false,
   3556    type: CSS_TYPE_LONGHAND,
   3557    initial_values: ["auto", "auto auto"],
   3558    other_values: [
   3559      "contain",
   3560      "cover",
   3561      "100px auto",
   3562      "auto 100px",
   3563      "100% auto",
   3564      "auto 100%",
   3565      "25% 50px",
   3566      "3em 40%",
   3567      "calc(20px)",
   3568      "calc(20px) 10px",
   3569      "10px calc(20px)",
   3570      "calc(20px) 25%",
   3571      "25% calc(20px)",
   3572      "calc(20px) calc(20px)",
   3573      "calc(20px + 1em) calc(20px / 2)",
   3574      "calc(20px + 50%) calc(50% - 10px)",
   3575      "calc(-20px) calc(-50%)",
   3576      "calc(-20%) calc(-50%)",
   3577    ],
   3578    invalid_values: [
   3579      "contain contain",
   3580      "cover cover",
   3581      "cover auto",
   3582      "auto cover",
   3583      "contain cover",
   3584      "cover contain",
   3585      "-5px 3px",
   3586      "3px -5px",
   3587      "auto -5px",
   3588      "-5px auto",
   3589      "5 3",
   3590      "10px calc(10px + rubbish)",
   3591    ],
   3592  },
   3593  "mask-type": {
   3594    domProp: "maskType",
   3595    inherited: false,
   3596    type: CSS_TYPE_LONGHAND,
   3597    initial_values: ["luminance"],
   3598    other_values: ["alpha"],
   3599    invalid_values: [],
   3600  },
   3601  "padding-inline-end": {
   3602    domProp: "paddingInlineEnd",
   3603    inherited: false,
   3604    type: CSS_TYPE_LONGHAND,
   3605    applies_to_first_letter: true,
   3606    // No applies_to_placeholder because we have a !important rule in forms.css.
   3607    logical: true,
   3608    /* no subproperties */
   3609    initial_values: [
   3610      "0",
   3611      "0px",
   3612      "0%",
   3613      "0em",
   3614      "0ex",
   3615      "calc(0pt)",
   3616      "calc(0% + 0px)",
   3617      "calc(-3px)",
   3618      "calc(-1%)",
   3619    ],
   3620    other_values: [
   3621      "1px",
   3622      "3em",
   3623      "5%",
   3624      "calc(2px)",
   3625      "calc(50%)",
   3626      "calc(3*25px)",
   3627      "calc(25px*3)",
   3628      "calc(3*25px + 50%)",
   3629    ],
   3630    invalid_values: ["5"],
   3631  },
   3632  "padding-inline-start": {
   3633    domProp: "paddingInlineStart",
   3634    inherited: false,
   3635    type: CSS_TYPE_LONGHAND,
   3636    applies_to_first_letter: true,
   3637    // No applies_to_placeholder because we have a !important rule in forms.css.
   3638    logical: true,
   3639    /* no subproperties */
   3640    initial_values: [
   3641      "0",
   3642      "0px",
   3643      "0%",
   3644      "0em",
   3645      "0ex",
   3646      "calc(0pt)",
   3647      "calc(0% + 0px)",
   3648      "calc(-3px)",
   3649      "calc(-1%)",
   3650    ],
   3651    other_values: [
   3652      "1px",
   3653      "3em",
   3654      "5%",
   3655      "calc(2px)",
   3656      "calc(50%)",
   3657      "calc(3*25px)",
   3658      "calc(25px*3)",
   3659      "calc(3*25px + 50%)",
   3660    ],
   3661    invalid_values: ["5"],
   3662  },
   3663  resize: {
   3664    domProp: "resize",
   3665    inherited: false,
   3666    type: CSS_TYPE_LONGHAND,
   3667    // No applies_to_placeholder because we have a !important rule in forms.css.
   3668    prerequisites: { display: "block", overflow: "auto" },
   3669    initial_values: ["none"],
   3670    other_values: ["both", "horizontal", "vertical", "inline", "block"],
   3671    invalid_values: [],
   3672  },
   3673  "tab-size": {
   3674    domProp: "tabSize",
   3675    inherited: true,
   3676    type: CSS_TYPE_LONGHAND,
   3677    initial_values: ["8"],
   3678    other_values: [
   3679      "0",
   3680      "2.5",
   3681      "3",
   3682      "99",
   3683      "12000",
   3684      "0px",
   3685      "1em",
   3686      "calc(1px + 1em)",
   3687      "calc(1px - 2px)",
   3688      "calc(1 + 1)",
   3689      "calc(-2.5)",
   3690    ],
   3691    invalid_values: [
   3692      "9%",
   3693      "calc(9% + 1px)",
   3694      "calc(1 + 1em)",
   3695      "-1",
   3696      "-808",
   3697      "auto",
   3698    ],
   3699  },
   3700  "-moz-text-size-adjust": {
   3701    domProp: "MozTextSizeAdjust",
   3702    inherited: true,
   3703    type: CSS_TYPE_LONGHAND,
   3704    initial_values: ["auto"],
   3705    other_values: ["none"],
   3706    invalid_values: ["-5%", "0", "100", "0%", "50%", "100%", "220.3%"],
   3707  },
   3708  transform: {
   3709    domProp: "transform",
   3710    inherited: false,
   3711    type: CSS_TYPE_LONGHAND,
   3712    prerequisites: { width: "300px", height: "50px" },
   3713    initial_values: ["none"],
   3714    other_values: [
   3715      "translatex(1px)",
   3716      "translatex(4em)",
   3717      "translatex(-4px)",
   3718      "translatex(3px)",
   3719      "translatex(0px) translatex(1px) translatex(2px) translatex(3px) translatex(4px)",
   3720      "translatey(4em)",
   3721      "translate(3px)",
   3722      "translate(10px, -3px)",
   3723      "rotate(45deg)",
   3724      "rotate(45grad)",
   3725      "rotate(45rad)",
   3726      "rotate(0.25turn)",
   3727      "rotate(0)",
   3728      "scalex(10)",
   3729      "scalex(10%)",
   3730      "scalex(-10)",
   3731      "scalex(-10%)",
   3732      "scaley(10)",
   3733      "scaley(10%)",
   3734      "scaley(-10)",
   3735      "scaley(-10%)",
   3736      "scale(10)",
   3737      "scale(10%)",
   3738      "scale(10, 20)",
   3739      "scale(10%, 20%)",
   3740      "scale(-10)",
   3741      "scale(-10%)",
   3742      "scale(-10, 20)",
   3743      "scale(10%, -20%)",
   3744      "scale(10, 20%)",
   3745      "scale(-10, 20%)",
   3746      "skewx(30deg)",
   3747      "skewx(0)",
   3748      "skewy(0)",
   3749      "skewx(30grad)",
   3750      "skewx(30rad)",
   3751      "skewx(0.08turn)",
   3752      "skewy(30deg)",
   3753      "skewy(30grad)",
   3754      "skewy(30rad)",
   3755      "skewy(0.08turn)",
   3756      "rotate(45deg) scale(2, 1)",
   3757      "skewx(45deg) skewx(-50grad)",
   3758      "translate(0, 0) scale(1, 1) skewx(0) skewy(0) matrix(1, 0, 0, 1, 0, 0)",
   3759      "translatex(50%)",
   3760      "translatey(50%)",
   3761      "translate(50%)",
   3762      "translate(3%, 5px)",
   3763      "translate(5px, 3%)",
   3764      "matrix(1, 2, 3, 4, 5, 6)",
   3765      /* valid calc() values */
   3766      "translatex(calc(5px + 10%))",
   3767      "translatey(calc(0.25 * 5px + 10% / 3))",
   3768      "translate(calc(5px - 10% * 3))",
   3769      "translate(calc(5px - 3 * 10%), 50px)",
   3770      "translate(-50px, calc(5px - 10% * 3))",
   3771      "translate(10px, calc(min(5px,10%)))",
   3772      "translate(calc(max(5px,10%)), 10%)",
   3773      "translate(max(5px,10%), 10%)",
   3774      "translatez(1px)",
   3775      "translatez(4em)",
   3776      "translatez(-4px)",
   3777      "translatez(0px)",
   3778      "translatez(2px) translatez(5px)",
   3779      "translate3d(3px, 4px, 5px)",
   3780      "translate3d(2em, 3px, 1em)",
   3781      "translatex(2px) translate3d(4px, 5px, 6px) translatey(1px)",
   3782      "scale3d(4, 4, 4)",
   3783      "scale3d(4%, 4%, 4%)",
   3784      "scale3d(-2, 3, -7)",
   3785      "scale3d(-2%, 3%, -7%)",
   3786      "scalez(4)",
   3787      "scalez(4%)",
   3788      "scalez(-6)",
   3789      "scalez(-6%)",
   3790      "rotate3d(2, 3, 4, 45deg)",
   3791      "rotate3d(-3, 7, 0, 12rad)",
   3792      "rotatex(15deg)",
   3793      "rotatey(-12grad)",
   3794      "rotatez(72rad)",
   3795      "rotatex(0.125turn)",
   3796      "rotate3d(0, 0, 0, 0rad)",
   3797      "perspective(0px)",
   3798      "perspective(1000px)",
   3799      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)",
   3800    ],
   3801    invalid_values: [
   3802      "1px",
   3803      "#0000ff",
   3804      "red",
   3805      "auto",
   3806      "translatex(1)",
   3807      "translatey(1)",
   3808      "translate(2)",
   3809      "translate(-3, -4)",
   3810      "translatex(1px 1px)",
   3811      "translatex(translatex(1px))",
   3812      "translatex(#0000ff)",
   3813      "translatex(red)",
   3814      "translatey()",
   3815      "matrix(1px, 2px, 3px, 4px, 5px, 6px)",
   3816      "skewx(red)",
   3817      "matrix(1%, 0, 0, 0, 0px, 0px)",
   3818      "matrix(0, 1%, 2, 3, 4px,5px)",
   3819      "matrix(0, 1, 2%, 3, 4px, 5px)",
   3820      "matrix(0, 1, 2, 3%, 4%, 5%)",
   3821      "matrix(1, 2, 3, 4, 5px, 6%)",
   3822      "matrix(1, 2, 3, 4, 5%, 6px)",
   3823      "matrix(1, 2, 3, 4, 5%, 6%)",
   3824      "matrix(1, 2, 3, 4, 5px, 6em)",
   3825      /* invalid calc() values */
   3826      "translatey(-moz-min(5px,10%))",
   3827      "translatex(-moz-max(5px,10%))",
   3828      "matrix(1, 0, 0, 1, max(5px * 3), calc(10% - 3px))",
   3829      "perspective(-10px)",
   3830      "matrix3d(dinosaur)",
   3831      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)",
   3832      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)",
   3833      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15%, 16)",
   3834      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16px)",
   3835      "rotatey(words)",
   3836      "rotatex(7)",
   3837      "translate3d(3px, 4px, 1px, 7px)",
   3838      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13px, 14em, 15px, 16)",
   3839      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 20%, 10%, 15, 16)",
   3840    ],
   3841  },
   3842  "transform-box": {
   3843    domProp: "transformBox",
   3844    inherited: false,
   3845    type: CSS_TYPE_LONGHAND,
   3846    initial_values: ["view-box"],
   3847    other_values: ["fill-box", "border-box", "content-box", "stroke-box"],
   3848    invalid_values: ["padding-box", "margin-box"],
   3849  },
   3850  "transform-origin": {
   3851    domProp: "transformOrigin",
   3852    inherited: false,
   3853    type: CSS_TYPE_LONGHAND,
   3854    /* no subproperties */
   3855    prerequisites: { width: "10px", height: "10px", display: "block" },
   3856    initial_values: ["50% 50%", "center", "center center"],
   3857    other_values: [
   3858      "25% 25%",
   3859      "6px 5px",
   3860      "20% 3em",
   3861      "0 0",
   3862      "0in 1in",
   3863      "top",
   3864      "bottom",
   3865      "top left",
   3866      "top right",
   3867      "top center",
   3868      "center left",
   3869      "center right",
   3870      "bottom left",
   3871      "bottom right",
   3872      "bottom center",
   3873      "20% center",
   3874      "6px center",
   3875      "13in bottom",
   3876      "left 50px",
   3877      "right 13%",
   3878      "center 40px",
   3879      "calc(20px)",
   3880      "calc(20px) 10px",
   3881      "10px calc(20px)",
   3882      "calc(20px) 25%",
   3883      "25% calc(20px)",
   3884      "calc(20px) calc(20px)",
   3885      "calc(20px + 1em) calc(20px / 2)",
   3886      "calc(20px + 50%) calc(50% - 10px)",
   3887      "calc(-20px) calc(-50%)",
   3888      "calc(-20%) calc(-50%)",
   3889      "6px 5px 5px",
   3890      "top center 10px",
   3891    ],
   3892    invalid_values: [
   3893      "red",
   3894      "auto",
   3895      "none",
   3896      "0.5 0.5",
   3897      "40px #0000ff",
   3898      "border",
   3899      "center red",
   3900      "right diagonal",
   3901      "#00ffff bottom",
   3902      "0px calc(0px + rubbish)",
   3903      "0px 0px calc(0px + rubbish)",
   3904    ],
   3905  },
   3906  "perspective-origin": {
   3907    domProp: "perspectiveOrigin",
   3908    inherited: false,
   3909    type: CSS_TYPE_LONGHAND,
   3910    /* no subproperties */
   3911    prerequisites: { width: "10px", height: "10px", display: "block" },
   3912    initial_values: ["50% 50%", "center", "center center"],
   3913    other_values: [
   3914      "25% 25%",
   3915      "6px 5px",
   3916      "20% 3em",
   3917      "0 0",
   3918      "0in 1in",
   3919      "top",
   3920      "bottom",
   3921      "top left",
   3922      "top right",
   3923      "top center",
   3924      "center left",
   3925      "center right",
   3926      "bottom left",
   3927      "bottom right",
   3928      "bottom center",
   3929      "20% center",
   3930      "6px center",
   3931      "13in bottom",
   3932      "left 50px",
   3933      "right 13%",
   3934      "center 40px",
   3935      "calc(20px)",
   3936      "calc(20px) 10px",
   3937      "10px calc(20px)",
   3938      "calc(20px) 25%",
   3939      "25% calc(20px)",
   3940      "calc(20px) calc(20px)",
   3941      "calc(20px + 1em) calc(20px / 2)",
   3942      "calc(20px + 50%) calc(50% - 10px)",
   3943      "calc(-20px) calc(-50%)",
   3944      "calc(-20%) calc(-50%)",
   3945    ],
   3946    invalid_values: [
   3947      "red",
   3948      "auto",
   3949      "none",
   3950      "0.5 0.5",
   3951      "40px #0000ff",
   3952      "border",
   3953      "center red",
   3954      "right diagonal",
   3955      "#00ffff bottom",
   3956    ],
   3957  },
   3958  perspective: {
   3959    domProp: "perspective",
   3960    inherited: false,
   3961    type: CSS_TYPE_LONGHAND,
   3962    initial_values: ["none"],
   3963    other_values: ["1000px", "500.2px", "0", "0px"],
   3964    invalid_values: ["pants", "200", "-100px", "-27.2em"],
   3965  },
   3966  "backface-visibility": {
   3967    domProp: "backfaceVisibility",
   3968    inherited: false,
   3969    type: CSS_TYPE_LONGHAND,
   3970    initial_values: ["visible"],
   3971    other_values: ["hidden"],
   3972    invalid_values: ["collapse"],
   3973  },
   3974  "transform-style": {
   3975    domProp: "transformStyle",
   3976    inherited: false,
   3977    type: CSS_TYPE_LONGHAND,
   3978    initial_values: ["flat"],
   3979    other_values: ["preserve-3d"],
   3980    invalid_values: [],
   3981  },
   3982  "-moz-user-select": {
   3983    domProp: "MozUserSelect",
   3984    inherited: false,
   3985    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
   3986    alias_for: "user-select",
   3987    subproperties: ["user-select"],
   3988  },
   3989  "user-select": {
   3990    domProp: "userSelect",
   3991    inherited: false,
   3992    type: CSS_TYPE_LONGHAND,
   3993    initial_values: ["auto"],
   3994    other_values: ["none", "text", "all", "-moz-none"],
   3995    invalid_values: [],
   3996  },
   3997  background: {
   3998    domProp: "background",
   3999    inherited: false,
   4000    type: CSS_TYPE_TRUE_SHORTHAND,
   4001    subproperties: [
   4002      "background-attachment",
   4003      "background-color",
   4004      "background-image",
   4005      "background-position-x",
   4006      "background-position-y",
   4007      "background-repeat",
   4008      "background-clip",
   4009      "background-origin",
   4010      "background-size",
   4011    ],
   4012    initial_values: [
   4013      "transparent",
   4014      "none",
   4015      "repeat",
   4016      "scroll",
   4017      "0% 0%",
   4018      "top left",
   4019      "left top",
   4020      "0% 0% / auto",
   4021      "top left / auto",
   4022      "left top / auto",
   4023      "0% 0% / auto auto",
   4024      "transparent none",
   4025      "top left none",
   4026      "left top none",
   4027      "none left top",
   4028      "none top left",
   4029      "none 0% 0%",
   4030      "left top / auto none",
   4031      "left top / auto auto none",
   4032      "transparent none repeat scroll top left",
   4033      "left top repeat none scroll transparent",
   4034      "transparent none repeat scroll top left / auto",
   4035      "left top / auto repeat none scroll transparent",
   4036      "none repeat scroll 0% 0% / auto auto transparent",
   4037      "padding-box border-box",
   4038    ],
   4039    other_values: [
   4040      /* without multiple backgrounds */
   4041      "green",
   4042      "none green repeat scroll left top",
   4043      "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
   4044      "repeat url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==') transparent left top scroll",
   4045      "repeat-x",
   4046      "repeat-y",
   4047      "no-repeat",
   4048      "none repeat-y transparent scroll 0% 0%",
   4049      "fixed",
   4050      "0% top transparent fixed repeat none",
   4051      "top",
   4052      "left",
   4053      "50% 50%",
   4054      "center",
   4055      "top / 100px",
   4056      "left / contain",
   4057      "left / cover",
   4058      "10px / 10%",
   4059      "10em / calc(20px)",
   4060      "top left / 100px 100px",
   4061      "top left / 100px auto",
   4062      "top left / 100px 10%",
   4063      "top left / 100px calc(20px)",
   4064      "bottom right 8px scroll none transparent repeat",
   4065      "50% transparent",
   4066      "transparent 50%",
   4067      "50%",
   4068      "radial-gradient(at 10% bottom, #ffffff, black) scroll no-repeat",
   4069      "repeating-radial-gradient(at 10% bottom, #ffffff, black) scroll no-repeat",
   4070      "-moz-element(#test) lime",
   4071      /* multiple backgrounds */
   4072      "url(404.png), url(404.png)",
   4073      "url(404.png), url(404.png) transparent",
   4074      "url(404.png), url(404.png) red",
   4075      "repeat-x, fixed, none",
   4076      "0% top url(404.png), url(404.png) 0% top",
   4077      "fixed repeat-y top left url(404.png), repeat-x green",
   4078      "top left / contain, bottom right / cover",
   4079      /* test cases with clip+origin in the shorthand */
   4080      "url(404.png) green padding-box",
   4081      "url(404.png) border-box transparent",
   4082      "content-box url(404.png) blue",
   4083      "url(404.png) green padding-box padding-box",
   4084      "url(404.png) green padding-box border-box",
   4085      "content-box border-box url(404.png) blue",
   4086      "url(404.png) green padding-box text",
   4087      "content-box text url(404.png) blue",
   4088      /* clip and origin separated in the shorthand */
   4089      "url(404.png) padding-box green border-box",
   4090      "url(404.png) padding-box green padding-box",
   4091      "transparent padding-box url(404.png) border-box",
   4092      "transparent padding-box url(404.png) padding-box",
   4093      /* text */
   4094      "text",
   4095      "text border-box",
   4096    ],
   4097    invalid_values: [
   4098      /* mixes with keywords have to be in correct order */
   4099      "50% left",
   4100      "top 50%",
   4101      /* no quirks mode colors */
   4102      "radial-gradient(at 10% bottom, ffffff, black) scroll no-repeat",
   4103      /* no quirks mode lengths */
   4104      "linear-gradient(red -99, yellow, green, blue 120%)",
   4105      /* bug 258080: don't accept background-position separated */
   4106      "left url(404.png) top",
   4107      "top url(404.png) left",
   4108      /* not allowed to have color in non-bottom layer */
   4109      "url(404.png) transparent, url(404.png)",
   4110      "url(404.png) red, url(404.png)",
   4111      "url(404.png) transparent, url(404.png) transparent",
   4112      "url(404.png) transparent red, url(404.png) transparent red",
   4113      "url(404.png) red, url(404.png) red",
   4114      "url(404.png) rgba(0, 0, 0, 0), url(404.png)",
   4115      "url(404.png) rgb(255, 0, 0), url(404.png)",
   4116      "url(404.png) rgba(0, 0, 0, 0), url(404.png) rgba(0, 0, 0, 0)",
   4117      "url(404.png) rgba(0, 0, 0, 0) rgb(255, 0, 0), url(404.png) rgba(0, 0, 0, 0) rgb(255, 0, 0)",
   4118      "url(404.png) rgb(255, 0, 0), url(404.png) rgb(255, 0, 0)",
   4119      /* error inside functions */
   4120      "-moz-element(#a rubbish) black",
   4121      "content-box text text",
   4122      "padding-box text url(404.png) text",
   4123    ],
   4124  },
   4125  "background-attachment": {
   4126    domProp: "backgroundAttachment",
   4127    inherited: false,
   4128    type: CSS_TYPE_LONGHAND,
   4129    applies_to_first_letter: true,
   4130    applies_to_first_line: true,
   4131    applies_to_placeholder: true,
   4132    applies_to_cue: true,
   4133    initial_values: ["scroll"],
   4134    other_values: [
   4135      "fixed",
   4136      "local",
   4137      "scroll,scroll",
   4138      "fixed, scroll",
   4139      "scroll, fixed, local, scroll",
   4140      "fixed, fixed",
   4141    ],
   4142    invalid_values: [],
   4143  },
   4144  "background-blend-mode": {
   4145    domProp: "backgroundBlendMode",
   4146    inherited: false,
   4147    type: CSS_TYPE_LONGHAND,
   4148    applies_to_first_letter: true,
   4149    applies_to_first_line: true,
   4150    applies_to_placeholder: true,
   4151    applies_to_cue: true,
   4152    initial_values: ["normal"],
   4153    other_values: [
   4154      "multiply",
   4155      "screen",
   4156      "overlay",
   4157      "darken",
   4158      "lighten",
   4159      "color-dodge",
   4160      "color-burn",
   4161      "hard-light",
   4162      "soft-light",
   4163      "difference",
   4164      "exclusion",
   4165      "hue",
   4166      "saturation",
   4167      "color",
   4168      "luminosity",
   4169    ],
   4170    invalid_values: ["none", "10px", "multiply multiply", "plus-lighter"],
   4171  },
   4172  "background-clip": {
   4173    /*
   4174     * When we rename this to 'background-clip', we also
   4175     * need to rename the values to match the spec.
   4176     */
   4177    domProp: "backgroundClip",
   4178    inherited: false,
   4179    type: CSS_TYPE_LONGHAND,
   4180    applies_to_first_letter: true,
   4181    applies_to_first_line: true,
   4182    applies_to_placeholder: true,
   4183    applies_to_cue: true,
   4184    initial_values: ["border-box"],
   4185    other_values: [
   4186      "content-box",
   4187      "padding-box",
   4188      "border-box, padding-box",
   4189      "padding-box, padding-box, padding-box",
   4190      "border-box, border-box",
   4191      "text",
   4192      "content-box, text",
   4193      "text, border-box",
   4194      "text, text",
   4195    ],
   4196    invalid_values: [
   4197      "margin-box",
   4198      "border-box border-box",
   4199      "fill-box",
   4200      "stroke-box",
   4201      "view-box",
   4202      "no-clip",
   4203    ],
   4204  },
   4205  "background-color": {
   4206    domProp: "backgroundColor",
   4207    inherited: false,
   4208    type: CSS_TYPE_LONGHAND,
   4209    applies_to_first_letter: true,
   4210    applies_to_first_line: true,
   4211    applies_to_placeholder: true,
   4212    applies_to_cue: true,
   4213    initial_values: ["transparent", "rgba(0, 0, 0, 0)"],
   4214    other_values: [
   4215      "green",
   4216      "rgb(255, 0, 128)",
   4217      "#fc2",
   4218      "#96ed2a",
   4219      "black",
   4220      "rgba(255,255,0,3)",
   4221      "hsl(240, 50%, 50%)",
   4222      "rgb(50%, 50%, 50%)",
   4223      "-moz-default-background-color",
   4224      "rgb(100, 100.0, 100)",
   4225      "rgba(255, 127, 15, 0)",
   4226      "hsla(240, 97%, 50%, 0.0)",
   4227      "rgba(255,255,255,-3.7)",
   4228    ],
   4229    invalid_values: [
   4230      "#0",
   4231      "#00",
   4232      "#00000",
   4233      "#0000000",
   4234      "#000000000",
   4235      "rgb(100, 100%, 100)",
   4236    ],
   4237    quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a" },
   4238  },
   4239  "background-image": {
   4240    domProp: "backgroundImage",
   4241    inherited: false,
   4242    type: CSS_TYPE_LONGHAND,
   4243    applies_to_first_letter: true,
   4244    applies_to_first_line: true,
   4245    applies_to_placeholder: true,
   4246    applies_to_cue: true,
   4247    initial_values: ["none"],
   4248    other_values: [
   4249      "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
   4250      "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==')",
   4251      'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
   4252      "none, none",
   4253      "none, none, none, none, none",
   4254      "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), none",
   4255      "none, url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), none",
   4256      "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==), url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
   4257    ].concat(validNonUrlImageValues),
   4258    invalid_values: [].concat(invalidNonUrlImageValues),
   4259    unbalanced_values: [].concat(unbalancedGradientAndElementValues),
   4260  },
   4261  "background-origin": {
   4262    domProp: "backgroundOrigin",
   4263    inherited: false,
   4264    type: CSS_TYPE_LONGHAND,
   4265    applies_to_first_letter: true,
   4266    applies_to_first_line: true,
   4267    applies_to_placeholder: true,
   4268    applies_to_cue: true,
   4269    initial_values: ["padding-box"],
   4270    other_values: [
   4271      "border-box",
   4272      "content-box",
   4273      "border-box, padding-box",
   4274      "padding-box, padding-box, padding-box",
   4275      "border-box, border-box",
   4276    ],
   4277    invalid_values: [
   4278      "margin-box",
   4279      "padding-box padding-box",
   4280      "fill-box",
   4281      "stroke-box",
   4282      "view-box",
   4283      "no-clip",
   4284    ],
   4285  },
   4286  "background-position": {
   4287    domProp: "backgroundPosition",
   4288    inherited: false,
   4289    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
   4290    applies_to_first_letter: true,
   4291    applies_to_first_line: true,
   4292    applies_to_placeholder: true,
   4293    applies_to_cue: true,
   4294    initial_values: [
   4295      "top 0% left 0%",
   4296      "top 0% left",
   4297      "top left",
   4298      "left top",
   4299      "0% 0%",
   4300      "0% top",
   4301      "left 0%",
   4302    ],
   4303    other_values: [
   4304      "top",
   4305      "left",
   4306      "right",
   4307      "bottom",
   4308      "center",
   4309      "center bottom",
   4310      "bottom center",
   4311      "center right",
   4312      "right center",
   4313      "center top",
   4314      "top center",
   4315      "center left",
   4316      "left center",
   4317      "right bottom",
   4318      "bottom right",
   4319      "50%",
   4320      "top left, top left",
   4321      "top left, top right",
   4322      "top right, top left",
   4323      "left top, 0% 0%",
   4324      "10% 20%, 30%, 40%",
   4325      "top left, bottom right",
   4326      "right bottom, left top",
   4327      "0%",
   4328      "0px",
   4329      "30px",
   4330      "0%, 10%, 20%, 30%",
   4331      "top, top, top, top, top",
   4332      "calc(20px)",
   4333      "calc(20px) 10px",
   4334      "10px calc(20px)",
   4335      "calc(20px) 25%",
   4336      "25% calc(20px)",
   4337      "calc(20px) calc(20px)",
   4338      "calc(20px + 1em) calc(20px / 2)",
   4339      "calc(20px + 50%) calc(50% - 10px)",
   4340      "calc(-20px) calc(-50%)",
   4341      "calc(-20%) calc(-50%)",
   4342      "0px 0px",
   4343      "right 20px top 60px",
   4344      "right 20px bottom 60px",
   4345      "left 20px top 60px",
   4346      "left 20px bottom 60px",
   4347      "right -50px top -50px",
   4348      "left -50px bottom -50px",
   4349      "right 20px top -50px",
   4350      "right -20px top 50px",
   4351      "right 3em bottom 10px",
   4352      "bottom 3em right 10px",
   4353      "top 3em right 10px",
   4354      "left 15px",
   4355      "10px top",
   4356      "left top 15px",
   4357      "left 10px top",
   4358      "left 20%",
   4359      "right 20%",
   4360    ],
   4361    subproperties: ["background-position-x", "background-position-y"],
   4362    invalid_values: [
   4363      "center 10px center 4px",
   4364      "center 10px center",
   4365      "top 20%",
   4366      "bottom 20%",
   4367      "50% left",
   4368      "top 50%",
   4369      "50% bottom 10%",
   4370      "right 10% 50%",
   4371      "left right",
   4372      "top bottom",
   4373      "left 10% right",
   4374      "top 20px bottom 20px",
   4375      "left left",
   4376      "0px calc(0px + rubbish)",
   4377    ],
   4378    quirks_values: {
   4379      "20 20": "20px 20px",
   4380      "10 5px": "10px 5px",
   4381      "7px 2": "7px 2px",
   4382    },
   4383  },
   4384  "background-position-x": {
   4385    domProp: "backgroundPositionX",
   4386    inherited: false,
   4387    type: CSS_TYPE_LONGHAND,
   4388    applies_to_first_letter: true,
   4389    applies_to_first_line: true,
   4390    applies_to_placeholder: true,
   4391    applies_to_cue: true,
   4392    initial_values: ["left 0%", "left", "0%"],
   4393    other_values: [
   4394      "right",
   4395      "center",
   4396      "50%",
   4397      "left, left",
   4398      "left, right",
   4399      "right, left",
   4400      "left, 0%",
   4401      "10%, 20%, 40%",
   4402      "0px",
   4403      "30px",
   4404      "0%, 10%, 20%, 30%",
   4405      "left, left, left, left, left",
   4406      "calc(20px)",
   4407      "calc(20px + 1em)",
   4408      "calc(20px / 2)",
   4409      "calc(20px + 50%)",
   4410      "calc(50% - 10px)",
   4411      "calc(-20px)",
   4412      "calc(-50%)",
   4413      "calc(-20%)",
   4414      "right 20px",
   4415      "left 20px",
   4416      "right -50px",
   4417      "left -50px",
   4418      "right 20px",
   4419      "right 3em",
   4420    ],
   4421    invalid_values: [
   4422      "center 10px",
   4423      "right 10% 50%",
   4424      "left right",
   4425      "left left",
   4426      "bottom 20px",
   4427      "top 10%",
   4428      "bottom 3em",
   4429      "top",
   4430      "bottom",
   4431      "top, top",
   4432      "top, bottom",
   4433      "bottom, top",
   4434      "top, 0%",
   4435      "top, top, top, top, top",
   4436      "calc(0px + rubbish)",
   4437    ],
   4438  },
   4439  "background-position-y": {
   4440    domProp: "backgroundPositionY",
   4441    inherited: false,
   4442    type: CSS_TYPE_LONGHAND,
   4443    applies_to_first_letter: true,
   4444    applies_to_first_line: true,
   4445    applies_to_placeholder: true,
   4446    applies_to_cue: true,
   4447    initial_values: ["top 0%", "top", "0%"],
   4448    other_values: [
   4449      "bottom",
   4450      "center",
   4451      "50%",
   4452      "top, top",
   4453      "top, bottom",
   4454      "bottom, top",
   4455      "top, 0%",
   4456      "10%, 20%, 40%",
   4457      "0px",
   4458      "30px",
   4459      "0%, 10%, 20%, 30%",
   4460      "top, top, top, top, top",
   4461      "calc(20px)",
   4462      "calc(20px + 1em)",
   4463      "calc(20px / 2)",
   4464      "calc(20px + 50%)",
   4465      "calc(50% - 10px)",
   4466      "calc(-20px)",
   4467      "calc(-50%)",
   4468      "calc(-20%)",
   4469      "bottom 20px",
   4470      "top 20px",
   4471      "bottom -50px",
   4472      "top -50px",
   4473      "bottom 20px",
   4474      "bottom 3em",
   4475    ],
   4476    invalid_values: [
   4477      "center 10px",
   4478      "bottom 10% 50%",
   4479      "top bottom",
   4480      "top top",
   4481      "right 20px",
   4482      "left 10%",
   4483      "right 3em",
   4484      "left",
   4485      "right",
   4486      "left, left",
   4487      "left, right",
   4488      "right, left",
   4489      "left, 0%",
   4490      "left, left, left, left, left",
   4491      "calc(0px + rubbish)",
   4492    ],
   4493  },
   4494  "background-repeat": {
   4495    domProp: "backgroundRepeat",
   4496    inherited: false,
   4497    type: CSS_TYPE_LONGHAND,
   4498    applies_to_first_letter: true,
   4499    applies_to_first_line: true,
   4500    applies_to_placeholder: true,
   4501    applies_to_cue: true,
   4502    initial_values: ["repeat", "repeat repeat"],
   4503    other_values: [
   4504      "repeat-x",
   4505      "repeat-y",
   4506      "no-repeat",
   4507      "repeat-x, repeat-x",
   4508      "repeat, no-repeat",
   4509      "repeat-y, no-repeat, repeat-y",
   4510      "repeat, repeat, repeat",
   4511      "repeat no-repeat",
   4512      "no-repeat repeat",
   4513      "no-repeat no-repeat",
   4514      "repeat repeat, repeat repeat",
   4515      "round, repeat",
   4516      "round repeat, repeat-x",
   4517      "round no-repeat, repeat-y",
   4518      "round round",
   4519      "space, repeat",
   4520      "space repeat, repeat-x",
   4521      "space no-repeat, repeat-y",
   4522      "space space",
   4523      "space round",
   4524    ],
   4525    invalid_values: [
   4526      "repeat repeat repeat",
   4527      "repeat-x repeat-y",
   4528      "repeat repeat-x",
   4529      "repeat repeat-y",
   4530      "repeat-x repeat",
   4531      "repeat-y repeat",
   4532      "round round round",
   4533      "repeat-x round",
   4534      "round repeat-x",
   4535      "repeat-y round",
   4536      "round repeat-y",
   4537      "space space space",
   4538      "repeat-x space",
   4539      "space repeat-x",
   4540      "repeat-y space",
   4541      "space repeat-y",
   4542    ],
   4543  },
   4544  "background-size": {
   4545    domProp: "backgroundSize",
   4546    inherited: false,
   4547    type: CSS_TYPE_LONGHAND,
   4548    applies_to_first_letter: true,
   4549    applies_to_first_line: true,
   4550    applies_to_placeholder: true,
   4551    applies_to_cue: true,
   4552    initial_values: ["auto", "auto auto"],
   4553    other_values: [
   4554      "contain",
   4555      "cover",
   4556      "100px auto",
   4557      "auto 100px",
   4558      "100% auto",
   4559      "auto 100%",
   4560      "25% 50px",
   4561      "3em 40%",
   4562      "calc(20px)",
   4563      "calc(20px) 10px",
   4564      "10px calc(20px)",
   4565      "calc(20px) 25%",
   4566      "25% calc(20px)",
   4567      "calc(20px) calc(20px)",
   4568      "calc(20px + 1em) calc(20px / 2)",
   4569      "calc(20px + 50%) calc(50% - 10px)",
   4570      "calc(-20px) calc(-50%)",
   4571      "calc(-20%) calc(-50%)",
   4572    ],
   4573    invalid_values: [
   4574      "contain contain",
   4575      "cover cover",
   4576      "cover auto",
   4577      "auto cover",
   4578      "contain cover",
   4579      "cover contain",
   4580      "-5px 3px",
   4581      "3px -5px",
   4582      "auto -5px",
   4583      "-5px auto",
   4584      "5 3",
   4585      "10px calc(10px + rubbish)",
   4586    ],
   4587  },
   4588  border: {
   4589    domProp: "border",
   4590    inherited: false,
   4591    type: CSS_TYPE_TRUE_SHORTHAND,
   4592    subproperties: [
   4593      "border-bottom-color",
   4594      "border-bottom-style",
   4595      "border-bottom-width",
   4596      "border-left-color",
   4597      "border-left-style",
   4598      "border-left-width",
   4599      "border-right-color",
   4600      "border-right-style",
   4601      "border-right-width",
   4602      "border-top-color",
   4603      "border-top-style",
   4604      "border-top-width",
   4605      "border-image-source",
   4606      "border-image-slice",
   4607      "border-image-width",
   4608      "border-image-outset",
   4609      "border-image-repeat",
   4610    ],
   4611    initial_values: [
   4612      "none",
   4613      "medium",
   4614      "currentColor",
   4615      "thin",
   4616      "none medium currentcolor",
   4617      "calc(4px - 1px) none",
   4618    ],
   4619    other_values: [
   4620      "solid",
   4621      "medium solid",
   4622      "green solid",
   4623      "10px solid",
   4624      "thick solid",
   4625      "calc(2px) solid blue",
   4626    ],
   4627    invalid_values: ["5%", "medium solid ff00ff", "5 solid green"],
   4628  },
   4629  "border-bottom": {
   4630    domProp: "borderBottom",
   4631    inherited: false,
   4632    type: CSS_TYPE_TRUE_SHORTHAND,
   4633    subproperties: [
   4634      "border-bottom-color",
   4635      "border-bottom-style",
   4636      "border-bottom-width",
   4637    ],
   4638    initial_values: [
   4639      "none",
   4640      "medium",
   4641      "currentColor",
   4642      "thin",
   4643      "none medium currentcolor",
   4644    ],
   4645    other_values: [
   4646      "solid",
   4647      "green",
   4648      "medium solid",
   4649      "green solid",
   4650      "10px solid",
   4651      "thick solid",
   4652      "5px green none",
   4653    ],
   4654    invalid_values: ["5%", "5", "5 solid green"],
   4655  },
   4656  "border-bottom-color": {
   4657    domProp: "borderBottomColor",
   4658    inherited: false,
   4659    type: CSS_TYPE_LONGHAND,
   4660    applies_to_first_letter: true,
   4661    prerequisites: { color: "black" },
   4662    initial_values: ["currentColor"],
   4663    other_values: ["green", "rgba(255,128,0,0.5)", "transparent"],
   4664    invalid_values: ["#0", "#00", "#00000", "#0000000", "#000000000"],
   4665    quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a" },
   4666  },
   4667  "border-bottom-style": {
   4668    domProp: "borderBottomStyle",
   4669    inherited: false,
   4670    type: CSS_TYPE_LONGHAND,
   4671    applies_to_first_letter: true,
   4672    /* XXX hidden is sometimes the same as initial */
   4673    initial_values: ["none"],
   4674    other_values: [
   4675      "solid",
   4676      "dashed",
   4677      "dotted",
   4678      "double",
   4679      "outset",
   4680      "inset",
   4681      "groove",
   4682      "ridge",
   4683    ],
   4684    invalid_values: [],
   4685  },
   4686  "border-bottom-width": {
   4687    domProp: "borderBottomWidth",
   4688    inherited: false,
   4689    type: CSS_TYPE_LONGHAND,
   4690    applies_to_first_letter: true,
   4691    prerequisites: { "border-bottom-style": "solid" },
   4692    initial_values: ["medium", "3px", "calc(4px - 1px)"],
   4693    other_values: [
   4694      "thin",
   4695      "thick",
   4696      "1px",
   4697      "2em",
   4698      "calc(2px)",
   4699      "calc(-2px)",
   4700      "calc(0em)",
   4701      "calc(0px)",
   4702      "calc(5em)",
   4703      "calc(3*25px)",
   4704      "calc(25px*3)",
   4705      "calc(3*25px + 5em)",
   4706    ],
   4707    invalid_values: ["stretch", "5%"],
   4708    quirks_values: { 5: "5px" },
   4709  },
   4710  "border-collapse": {
   4711    domProp: "borderCollapse",
   4712    inherited: true,
   4713    type: CSS_TYPE_LONGHAND,
   4714    initial_values: ["separate"],
   4715    other_values: ["collapse"],
   4716    invalid_values: [],
   4717  },
   4718  "border-color": {
   4719    domProp: "borderColor",
   4720    inherited: false,
   4721    type: CSS_TYPE_TRUE_SHORTHAND,
   4722    subproperties: [
   4723      "border-top-color",
   4724      "border-right-color",
   4725      "border-bottom-color",
   4726      "border-left-color",
   4727    ],
   4728    initial_values: [
   4729      "currentColor",
   4730      "currentColor currentColor",
   4731      "currentColor currentColor currentColor",
   4732      "currentColor currentColor currentcolor CURRENTcolor",
   4733    ],
   4734    other_values: [
   4735      "green",
   4736      "currentColor green",
   4737      "currentColor currentColor green",
   4738      "currentColor currentColor currentColor green",
   4739      "rgba(255,128,0,0.5)",
   4740      "transparent",
   4741    ],
   4742    invalid_values: [
   4743      "#0",
   4744      "#00",
   4745      "#00000",
   4746      "#0000000",
   4747      "#000000000",
   4748      "red rgb(nonsense)",
   4749      "red 1px",
   4750    ],
   4751    unbalanced_values: ["red rgb("],
   4752    quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a" },
   4753  },
   4754  "border-left": {
   4755    domProp: "borderLeft",
   4756    inherited: false,
   4757    type: CSS_TYPE_TRUE_SHORTHAND,
   4758    subproperties: [
   4759      "border-left-color",
   4760      "border-left-style",
   4761      "border-left-width",
   4762    ],
   4763    initial_values: [
   4764      "none",
   4765      "medium",
   4766      "currentColor",
   4767      "thin",
   4768      "none medium currentcolor",
   4769    ],
   4770    other_values: [
   4771      "solid",
   4772      "green",
   4773      "medium solid",
   4774      "green solid",
   4775      "10px solid",
   4776      "thick solid",
   4777      "5px green none",
   4778    ],
   4779    invalid_values: [
   4780      "5%",
   4781      "5",
   4782      "5 solid green",
   4783      "calc(5px + rubbish) green solid",
   4784      "5px rgb(0, rubbish, 0) solid",
   4785    ],
   4786  },
   4787  "border-left-color": {
   4788    domProp: "borderLeftColor",
   4789    inherited: false,
   4790    type: CSS_TYPE_LONGHAND,
   4791    applies_to_first_letter: true,
   4792    prerequisites: { color: "black" },
   4793    initial_values: ["currentColor"],
   4794    other_values: ["green", "rgba(255,128,0,0.5)", "transparent"],
   4795    invalid_values: ["#0", "#00", "#00000", "#0000000", "#000000000"],
   4796    quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a" },
   4797  },
   4798  "border-left-style": {
   4799    domProp: "borderLeftStyle",
   4800    inherited: false,
   4801    type: CSS_TYPE_LONGHAND,
   4802    applies_to_first_letter: true,
   4803    /* XXX hidden is sometimes the same as initial */
   4804    initial_values: ["none"],
   4805    other_values: [
   4806      "solid",
   4807      "dashed",
   4808      "dotted",
   4809      "double",
   4810      "outset",
   4811      "inset",
   4812      "groove",
   4813      "ridge",
   4814    ],
   4815    invalid_values: [],
   4816  },
   4817  "border-left-width": {
   4818    domProp: "borderLeftWidth",
   4819    inherited: false,
   4820    type: CSS_TYPE_LONGHAND,
   4821    applies_to_first_letter: true,
   4822    prerequisites: { "border-left-style": "solid" },
   4823    initial_values: ["medium", "3px", "calc(4px - 1px)"],
   4824    other_values: [
   4825      "thin",
   4826      "thick",
   4827      "1px",
   4828      "2em",
   4829      "calc(2px)",
   4830      "calc(-2px)",
   4831      "calc(0em)",
   4832      "calc(0px)",
   4833      "calc(5em)",
   4834      "calc(3*25px)",
   4835      "calc(25px*3)",
   4836      "calc(3*25px + 5em)",
   4837    ],
   4838    invalid_values: ["stretch", "5%"],
   4839    quirks_values: { 5: "5px" },
   4840  },
   4841  "border-right": {
   4842    domProp: "borderRight",
   4843    inherited: false,
   4844    type: CSS_TYPE_TRUE_SHORTHAND,
   4845    subproperties: [
   4846      "border-right-color",
   4847      "border-right-style",
   4848      "border-right-width",
   4849    ],
   4850    initial_values: [
   4851      "none",
   4852      "medium",
   4853      "currentColor",
   4854      "thin",
   4855      "none medium currentcolor",
   4856    ],
   4857    other_values: [
   4858      "solid",
   4859      "green",
   4860      "medium solid",
   4861      "green solid",
   4862      "10px solid",
   4863      "thick solid",
   4864      "5px green none",
   4865    ],
   4866    invalid_values: ["5%", "5", "5 solid green"],
   4867  },
   4868  "border-right-color": {
   4869    domProp: "borderRightColor",
   4870    inherited: false,
   4871    type: CSS_TYPE_LONGHAND,
   4872    applies_to_first_letter: true,
   4873    prerequisites: { color: "black" },
   4874    initial_values: ["currentColor"],
   4875    other_values: ["green", "rgba(255,128,0,0.5)", "transparent"],
   4876    invalid_values: ["#0", "#00", "#00000", "#0000000", "#000000000"],
   4877    quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a" },
   4878  },
   4879  "border-right-style": {
   4880    domProp: "borderRightStyle",
   4881    inherited: false,
   4882    type: CSS_TYPE_LONGHAND,
   4883    applies_to_first_letter: true,
   4884    /* XXX hidden is sometimes the same as initial */
   4885    initial_values: ["none"],
   4886    other_values: [
   4887      "solid",
   4888      "dashed",
   4889      "dotted",
   4890      "double",
   4891      "outset",
   4892      "inset",
   4893      "groove",
   4894      "ridge",
   4895    ],
   4896    invalid_values: [],
   4897  },
   4898  "border-right-width": {
   4899    domProp: "borderRightWidth",
   4900    inherited: false,
   4901    type: CSS_TYPE_LONGHAND,
   4902    applies_to_first_letter: true,
   4903    prerequisites: { "border-right-style": "solid" },
   4904    initial_values: ["medium", "3px", "calc(4px - 1px)"],
   4905    other_values: [
   4906      "thin",
   4907      "thick",
   4908      "1px",
   4909      "2em",
   4910      "calc(2px)",
   4911      "calc(-2px)",
   4912      "calc(0em)",
   4913      "calc(0px)",
   4914      "calc(5em)",
   4915      "calc(3*25px)",
   4916      "calc(25px*3)",
   4917      "calc(3*25px + 5em)",
   4918    ],
   4919    invalid_values: ["5%"],
   4920    quirks_values: { 5: "5px" },
   4921  },
   4922  "border-spacing": {
   4923    domProp: "borderSpacing",
   4924    inherited: true,
   4925    type: CSS_TYPE_LONGHAND,
   4926    initial_values: [
   4927      "0",
   4928      "0 0",
   4929      "0px",
   4930      "0 0px",
   4931      "calc(0px)",
   4932      "calc(0px) calc(0em)",
   4933      "calc(2em - 2em) calc(3px + 7px - 10px)",
   4934      "calc(-5px)",
   4935      "calc(-5px) calc(-5px)",
   4936    ],
   4937    other_values: [
   4938      "3px",
   4939      "4em 2px",
   4940      "4em 0",
   4941      "0px 2px",
   4942      "calc(7px)",
   4943      "0 calc(7px)",
   4944      "calc(7px) 0",
   4945      "calc(0px) calc(7px)",
   4946      "calc(7px) calc(0px)",
   4947      "7px calc(0px)",
   4948      "calc(0px) 7px",
   4949      "7px calc(0px)",
   4950      "3px calc(2em)",
   4951    ],
   4952    invalid_values: [
   4953      "stretch",
   4954      "0%",
   4955      "0 0%",
   4956      "-5px",
   4957      "-5px -5px",
   4958      "0 -5px",
   4959      "-5px 0",
   4960      "0 calc(0px + rubbish)",
   4961    ],
   4962    quirks_values: {
   4963      "2px 5": "2px 5px",
   4964      7: "7px",
   4965      "3 4px": "3px 4px",
   4966    },
   4967  },
   4968  "border-style": {
   4969    domProp: "borderStyle",
   4970    inherited: false,
   4971    type: CSS_TYPE_TRUE_SHORTHAND,
   4972    subproperties: [
   4973      "border-top-style",
   4974      "border-right-style",
   4975      "border-bottom-style",
   4976      "border-left-style",
   4977    ],
   4978    /* XXX hidden is sometimes the same as initial */
   4979    initial_values: [
   4980      "none",
   4981      "none none",
   4982      "none none none",
   4983      "none none none none",
   4984    ],
   4985    other_values: [
   4986      "solid",
   4987      "dashed",
   4988      "dotted",
   4989      "double",
   4990      "outset",
   4991      "inset",
   4992      "groove",
   4993      "ridge",
   4994      "none solid",
   4995      "none none solid",
   4996      "none none none solid",
   4997      "groove none none none",
   4998      "none ridge none none",
   4999      "none none double none",
   5000      "none none none dotted",
   5001    ],
   5002    invalid_values: [],
   5003  },
   5004  "border-top": {
   5005    domProp: "borderTop",
   5006    inherited: false,
   5007    type: CSS_TYPE_TRUE_SHORTHAND,
   5008    subproperties: ["border-top-color", "border-top-style", "border-top-width"],
   5009    initial_values: [
   5010      "none",
   5011      "medium",
   5012      "currentColor",
   5013      "thin",
   5014      "none medium currentcolor",
   5015    ],
   5016    other_values: [
   5017      "solid",
   5018      "green",
   5019      "medium solid",
   5020      "green solid",
   5021      "10px solid",
   5022      "thick solid",
   5023      "5px green none",
   5024    ],
   5025    invalid_values: ["5%", "5", "5 solid green"],
   5026  },
   5027  "border-top-color": {
   5028    domProp: "borderTopColor",
   5029    inherited: false,
   5030    type: CSS_TYPE_LONGHAND,
   5031    applies_to_first_letter: true,
   5032    prerequisites: { color: "black" },
   5033    initial_values: ["currentColor"],
   5034    other_values: ["green", "rgba(255,128,0,0.5)", "transparent"],
   5035    invalid_values: ["#0", "#00", "#00000", "#0000000", "#000000000"],
   5036    quirks_values: { "000000": "#000000", "96ed2a": "#96ed2a" },
   5037  },
   5038  "border-top-style": {
   5039    domProp: "borderTopStyle",
   5040    inherited: false,
   5041    type: CSS_TYPE_LONGHAND,
   5042    applies_to_first_letter: true,
   5043    /* XXX hidden is sometimes the same as initial */
   5044    initial_values: ["none"],
   5045    other_values: [
   5046      "solid",
   5047      "dashed",
   5048      "dotted",
   5049      "double",
   5050      "outset",
   5051      "inset",
   5052      "groove",
   5053      "ridge",
   5054    ],
   5055    invalid_values: [],
   5056  },
   5057  "border-top-width": {
   5058    domProp: "borderTopWidth",
   5059    inherited: false,
   5060    type: CSS_TYPE_LONGHAND,
   5061    applies_to_first_letter: true,
   5062    prerequisites: { "border-top-style": "solid" },
   5063    initial_values: ["medium", "3px", "calc(4px - 1px)"],
   5064    other_values: [
   5065      "thin",
   5066      "thick",
   5067      "1px",
   5068      "2em",
   5069      "calc(2px)",
   5070      "calc(-2px)",
   5071      "calc(0em)",
   5072      "calc(0px)",
   5073      "calc(5em)",
   5074      "calc(3*25px)",
   5075      "calc(25px*3)",
   5076      "calc(3*25px + 5em)",
   5077    ],
   5078    invalid_values: ["stretch", "5%"],
   5079    quirks_values: { 5: "5px" },
   5080  },
   5081  "border-width": {
   5082    domProp: "borderWidth",
   5083    inherited: false,
   5084    type: CSS_TYPE_TRUE_SHORTHAND,
   5085    subproperties: [
   5086      "border-top-width",
   5087      "border-right-width",
   5088      "border-bottom-width",
   5089      "border-left-width",
   5090    ],
   5091    prerequisites: { "border-style": "solid" },
   5092    initial_values: [
   5093      "medium",
   5094      "3px",
   5095      "medium medium",
   5096      "3px medium medium",
   5097      "medium 3px medium medium",
   5098      "calc(3px) 3px calc(5px - 2px) calc(2px - -1px)",
   5099    ],
   5100    other_values: ["thin", "thick", "1px", "2em", "2px 0 0px 1em", "calc(2em)"],
   5101    invalid_values: ["5%", "1px calc(nonsense)", "1px red"],
   5102    unbalanced_values: ["1px calc("],
   5103    quirks_values: { 5: "5px" },
   5104  },
   5105  bottom: {
   5106    domProp: "bottom",
   5107    inherited: false,
   5108    type: CSS_TYPE_LONGHAND,
   5109    /* FIXME: run tests with multiple prerequisites */
   5110    prerequisites: { position: "relative" },
   5111    /* XXX 0 may or may not be equal to auto */
   5112    initial_values: ["auto"],
   5113    other_values: [
   5114      "32px",
   5115      "-3em",
   5116      "12%",
   5117      "calc(2px)",
   5118      "calc(-2px)",
   5119      "calc(50%)",
   5120      "calc(3*25px)",
   5121      "calc(25px*3)",
   5122      "calc(3*25px + 50%)",
   5123    ],
   5124    invalid_values: ["stretch"],
   5125    quirks_values: { 5: "5px" },
   5126  },
   5127  "box-shadow": {
   5128    domProp: "boxShadow",
   5129    inherited: false,
   5130    type: CSS_TYPE_LONGHAND,
   5131    applies_to_first_letter: true,
   5132    initial_values: ["none"],
   5133    prerequisites: { color: "blue" },
   5134    other_values: [
   5135      "2px 2px",
   5136      "2px 2px 1px",
   5137      "2px 2px 2px 2px",
   5138      "blue 3px 2px",
   5139      "2px 2px 1px 5px green",
   5140      "2px 2px red",
   5141      "green 2px 2px 1px",
   5142      "green 2px 2px, blue 1px 3px 4px",
   5143      "currentColor 3px 3px",
   5144      "blue 2px 2px, currentColor 1px 2px, 1px 2px 3px 2px orange",
   5145      "3px 0 0 0",
   5146      "inset 2px 2px 3px 4px black",
   5147      "2px -2px green inset, 4px 4px 3px blue, inset 2px 2px",
   5148      /* calc() values */
   5149      "2px 2px calc(-5px)" /* clamped */,
   5150      "calc(3em - 2px) 2px green",
   5151      "green calc(3em - 2px) 2px",
   5152      "2px calc(2px + 0.2em)",
   5153      "blue 2px calc(2px + 0.2em)",
   5154      "2px calc(2px + 0.2em) blue",
   5155      "calc(-2px) calc(-2px)",
   5156      "-2px -2px",
   5157      "calc(2px) calc(2px)",
   5158      "calc(2px) calc(2px) calc(2px)",
   5159      "calc(2px) calc(2px) calc(2px) calc(2px)",
   5160    ],
   5161    invalid_values: [
   5162      "3% 3%",
   5163      "1px 1px 1px 1px 1px",
   5164      "2px 2px, none",
   5165      "red 2px 2px blue",
   5166      "inherit, 2px 2px",
   5167      "2px 2px, inherit",
   5168      "2px 2px -5px",
   5169      "inset 4px 4px black inset",
   5170      "inset inherit",
   5171      "inset none",
   5172      "3 3",
   5173      "3px 3",
   5174      "3 3px",
   5175      "3px 3px 3",
   5176      "3px 3px 3px 3",
   5177      "3px calc(3px + rubbish)",
   5178      "3px 3px calc(3px + rubbish)",
   5179      "3px 3px 3px calc(3px + rubbish)",
   5180      "3px 3px 3px 3px rgb(0, rubbish, 0)",
   5181      "unset, 2px 2px",
   5182      "2px 2px, unset",
   5183      "inset unset",
   5184    ],
   5185  },
   5186  "caption-side": {
   5187    domProp: "captionSide",
   5188    inherited: true,
   5189    type: CSS_TYPE_LONGHAND,
   5190    initial_values: ["top"],
   5191    other_values: ["bottom"],
   5192    invalid_values: ["right", "left", "top-outside", "bottom-outside"],
   5193  },
   5194  "caret-color": {
   5195    domProp: "caretColor",
   5196    inherited: true,
   5197    type: CSS_TYPE_LONGHAND,
   5198    prerequisites: { color: "black" },
   5199    // Though "auto" is an independent computed-value time keyword value,
   5200    // it is not distinguishable from currentcolor because getComputedStyle
   5201    // always returns used value for <color>.
   5202    initial_values: ["auto", "currentcolor", "black", "rgb(0,0,0)"],
   5203    other_values: ["green", "transparent", "rgba(128,128,128,.5)", "#123"],
   5204    invalid_values: ["#0", "#00", "#00000", "cc00ff"],
   5205  },
   5206  clear: {
   5207    domProp: "clear",
   5208    inherited: false,
   5209    type: CSS_TYPE_LONGHAND,
   5210    initial_values: ["none"],
   5211    other_values: ["left", "right", "both", "inline-start", "inline-end"],
   5212    invalid_values: [],
   5213  },
   5214  clip: {
   5215    domProp: "clip",
   5216    inherited: false,
   5217    type: CSS_TYPE_LONGHAND,
   5218    initial_values: ["auto"],
   5219    other_values: [
   5220      "rect(0 0 0 0)",
   5221      "rect(auto,auto,auto,auto)",
   5222      "rect(3px, 4px, 4em, 0)",
   5223      "rect(auto, 3em, 4pt, 2px)",
   5224      "rect(2px 3px 4px 5px)",
   5225    ],
   5226    invalid_values: ["rect(auto, 3em, 2%, 5px)"],
   5227    quirks_values: { "rect(1, 2, 3, 4)": "rect(1px, 2px, 3px, 4px)" },
   5228  },
   5229  color: {
   5230    domProp: "color",
   5231    inherited: true,
   5232    type: CSS_TYPE_LONGHAND,
   5233    applies_to_first_letter: true,
   5234    applies_to_first_line: true,
   5235    applies_to_marker: true,
   5236    applies_to_placeholder: true,
   5237    applies_to_cue: true,
   5238    /* XXX should test currentColor, but may or may not be initial */
   5239    initial_values: [
   5240      "black",
   5241      "#000",
   5242      "#000f",
   5243      "#000000ff",
   5244      "-moz-default-color",
   5245      "rgb(0, 0, 0)",
   5246      "rgb(0%, 0%, 0%)",
   5247      /* css-color-4: */
   5248      /* rgb() and rgba() are aliases of each other. */
   5249      "rgb(0, 0, 0)",
   5250      "rgba(0, 0, 0)",
   5251      "rgb(0, 0, 0, 1)",
   5252      "rgba(0, 0, 0, 1)",
   5253      /* hsl() and hsla() are aliases of each other. */
   5254      "hsl(0, 0%, 0%)",
   5255      "hsla(0, 0%, 0%)",
   5256      "hsl(0, 0%, 0%, 1)",
   5257      "hsla(0, 0%, 0%, 1)",
   5258      /* rgb() and rgba() functions now accept <number> rather than <integer>. */
   5259      "rgb(0.0, 0.0, 0.0)",
   5260      "rgba(0.0, 0.0, 0.0)",
   5261      "rgb(0.0, 0.0, 0.0, 1)",
   5262      "rgba(0.0, 0.0, 0.0, 1)",
   5263      /* <alpha-value> now accepts <percentage> as well as <number> in rgba() and hsla(). */
   5264      "rgb(0.0, 0.0, 0.0, 100%)",
   5265      "hsl(0, 0%, 0%, 100%)",
   5266      /* rgb() and hsl() now support comma-less expression. */
   5267      "rgb(0 0 0)",
   5268      "rgb(0 0 0 / 1)",
   5269      "rgb(0/* comment */0/* comment */0)",
   5270      "rgb(0/* comment */0/* comment*/0/1.0)",
   5271      "hsl(0 0% 0%)",
   5272      "hsl(0 0% 0% / 1)",
   5273      "hsl(0/* comment */0%/* comment */0%)",
   5274      "hsl(0/* comment */0%/* comment */0%/1)",
   5275      /* Support <angle> for hsl() hue component. */
   5276      "hsl(0deg, 0%, 0%)",
   5277      "hsl(360deg, 0%, 0%)",
   5278      "hsl(0grad, 0%, 0%)",
   5279      "hsl(400grad, 0%, 0%)",
   5280      "hsl(0rad, 0%, 0%)",
   5281      "hsl(0turn, 0%, 0%)",
   5282      "hsl(1turn, 0%, 0%)",
   5283      /* CSS4 System Colors */
   5284      "canvastext",
   5285      /* Preserve previously available specially prefixed colors */
   5286      "-moz-default-color",
   5287    ],
   5288    other_values: [
   5289      "green",
   5290      "#f3c",
   5291      "#fed292",
   5292      "rgba(45,300,12,2)",
   5293      "transparent",
   5294      "LinkText",
   5295      "rgba(255,128,0,0.5)",
   5296      "#e0fc",
   5297      "#10fcee72",
   5298      /* css-color-4: */
   5299      "rgb(100, 100.0, 100)",
   5300      "rgb(300 300 300 / 200%)",
   5301      "rgb(300.0 300.0 300.0 / 2.0)",
   5302      "hsl(720, 200%, 200%, 2.0)",
   5303      "hsla(720 200% 200% / 200%)",
   5304      "hsl(480deg, 20%, 30%, 0.3)",
   5305      "hsl(55grad, 400%, 30%)",
   5306      "hsl(0.5grad 400% 500% / 9.0)",
   5307      "hsl(33rad 100% 90% / 4)",
   5308      "hsl(0.33turn, 40%, 40%, 10%)",
   5309      "hsl(63e292, 41%, 34%)",
   5310      /* CSS4 System Colors */
   5311      "canvas",
   5312      "linktext",
   5313      "visitedtext",
   5314      "activetext",
   5315      "buttonface",
   5316      "field",
   5317      "highlight",
   5318      "graytext",
   5319      /* Preserve previously available specially prefixed colors */
   5320      "-moz-activehyperlinktext",
   5321      "-moz-default-background-color",
   5322      "-moz-hyperlinktext",
   5323      "-moz-visitedhyperlinktext",
   5324      /* color-mix */
   5325      "color-mix(red, blue)",
   5326      "color-mix(in srgb, red, blue)",
   5327      "color-mix(in srgb, highlight, rgba(0, 0, 0, .5))",
   5328      "color-mix(in srgb, color-mix(in srgb, red 10%, blue), green)",
   5329      "color-mix(in srgb, blue, red 80%)",
   5330      "color-mix(in srgb, rgba(0, 200, 32, .5) 90%, red 50%)",
   5331      "color-mix(in srgb, currentColor, red)",
   5332    ],
   5333    invalid_values: [
   5334      "#f",
   5335      "#ff",
   5336      "#fffff",
   5337      "#fffffff",
   5338      "#fffffffff",
   5339      "rgb(100%, 0, 100%)",
   5340      "rgba(100, 0, 100%, 30%)",
   5341      "hsl(0, 0, 0%)",
   5342      "hsla(0%, 0%, 0%, 0.1)",
   5343      /* trailing commas */
   5344      "rgb(0, 0, 0,)",
   5345      "rgba(0, 0, 0, 0,)",
   5346      "hsl(0, 0%, 0%,)",
   5347      "hsla(0, 0%, 0%, 1,)",
   5348      /* css-color-4: */
   5349      /* comma and comma-less expressions should not mix together. */
   5350      "rgb(0, 0, 0 / 1)",
   5351      "rgb(0 0 0, 1)",
   5352      "rgb(0, 0 0, 1)",
   5353      "rgb(0 0, 0 / 1)",
   5354      "hsl(0, 0%, 0% / 1)",
   5355      "hsl(0 0% 0%, 1)",
   5356      "hsl(0 0% 0%, 1)",
   5357      "hsl(0 0%, 0% / 1)",
   5358      /* trailing slash */
   5359      "rgb(0 0 0 /)",
   5360      "rgb(0, 0, 0 /)",
   5361      "hsl(0 0% 0% /)",
   5362      "hsl(0, 0%, 0% /)",
   5363      /* color-mix */
   5364      "color-mix(red blue)",
   5365      "color-mix(in srgb, red blue)",
   5366      "color-mix(in srgb, red 10% blue)",
   5367    ],
   5368    quirks_values: {
   5369      "000000": "#000000",
   5370      "96ed2a": "#96ed2a",
   5371      fff: "#ffffff",
   5372      ffffff: "#ffffff",
   5373    },
   5374  },
   5375  content: {
   5376    domProp: "content",
   5377    inherited: false,
   5378    type: CSS_TYPE_LONGHAND,
   5379    applies_to_marker: true,
   5380    // XXX This really depends on pseudo-element-ness.
   5381    initial_values: ["normal", "none"],
   5382    other_values: [
   5383      '""',
   5384      "''",
   5385      '"hello"',
   5386      "url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==)",
   5387      "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==')",
   5388      'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
   5389      "counter(foo)",
   5390      "counter(bar, upper-roman)",
   5391      'counters(foo, ".")',
   5392      "counters(bar, '-', lower-greek)",
   5393      "'-' counter(foo) '.'",
   5394      "attr(title)",
   5395      "open-quote",
   5396      "close-quote",
   5397      "no-open-quote",
   5398      "no-close-quote",
   5399      "close-quote attr(title) counters(foo, '.', upper-alpha)",
   5400      "attr(\\32)",
   5401      "attr(\\2)",
   5402      "attr(-\\2)",
   5403      "attr(-\\32)",
   5404      'attr(title, "fallback")',
   5405      'attr(\\32, "fallback")',
   5406      'attr(-\\32, "fallback")',
   5407      "counter(\\2)",
   5408      "counters(\\32, '.')",
   5409      "counter(-\\32, upper-roman)",
   5410      "counters(-\\2, '-', lower-greek)",
   5411      "counter(\\()",
   5412      "counters(a\\+b, '.')",
   5413      "counter(\\}, upper-alpha)",
   5414      "counter(foo, symbols('*'))",
   5415      "counter(foo, symbols(numeric '0' '1'))",
   5416      "counters(foo, '.', symbols('*'))",
   5417      "counters(foo, '.', symbols(numeric '0' '1'))",
   5418      "image-set(url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==))",
   5419    ].concat(validNonUrlImageValues),
   5420    invalid_values: [
   5421      "counter(foo, none)",
   5422      "counters(bar, '.', none)",
   5423      "counters(foo)",
   5424      'counter(foo, ".")',
   5425      'attr("title")',
   5426      "attr('title')",
   5427      "attr(2)",
   5428      "attr(-2)",
   5429      "counter(2)",
   5430      "counters(-2, '.')",
   5431      "-moz-alt-content",
   5432      "-moz-alt-content 'foo'",
   5433      "'foo' -moz-alt-content",
   5434      "counter(one, two, three) 'foo'",
   5435    ].concat(invalidNonUrlImageValues),
   5436  },
   5437  "counter-increment": {
   5438    domProp: "counterIncrement",
   5439    inherited: false,
   5440    type: CSS_TYPE_LONGHAND,
   5441    applies_to_marker: true,
   5442    initial_values: ["none"],
   5443    other_values: [
   5444      "foo 1",
   5445      "bar",
   5446      "foo 3 bar baz 2",
   5447      "\\32  1",
   5448      "-\\32  1",
   5449      "-c 1",
   5450      "\\32 1",
   5451      "-\\32 1",
   5452      "\\2  1",
   5453      "-\\2  1",
   5454      "-c 1",
   5455      "\\2 1",
   5456      "-\\2 1",
   5457      "-\\7f \\9e 1",
   5458    ],
   5459    invalid_values: ["none foo", "none foo 3", "foo none", "foo 3 none"],
   5460    unbalanced_values: ["foo 1 ("],
   5461  },
   5462  "counter-reset": {
   5463    domProp: "counterReset",
   5464    inherited: false,
   5465    type: CSS_TYPE_LONGHAND,
   5466    applies_to_marker: true,
   5467    initial_values: ["none"],
   5468    other_values: [
   5469      "foo 1",
   5470      "bar",
   5471      "foo 3 bar baz 2",
   5472      "\\32  1",
   5473      "-\\32  1",
   5474      "-c 1",
   5475      "\\32 1",
   5476      "-\\32 1",
   5477      "\\2  1",
   5478      "-\\2  1",
   5479      "-c 1",
   5480      "\\2 1",
   5481      "-\\2 1",
   5482      "-\\7f \\9e 1",
   5483    ],
   5484    invalid_values: ["none foo", "none foo 3", "foo none", "foo 3 none"],
   5485  },
   5486  "counter-set": {
   5487    domProp: "counterSet",
   5488    inherited: false,
   5489    type: CSS_TYPE_LONGHAND,
   5490    applies_to_marker: true,
   5491    initial_values: ["none"],
   5492    other_values: [
   5493      "foo 1",
   5494      "bar",
   5495      "foo 3 bar baz 2",
   5496      "\\32  1",
   5497      "-\\32  1",
   5498      "-c 1",
   5499      "\\32 1",
   5500      "-\\32 1",
   5501      "\\2  1",
   5502      "-\\2  1",
   5503      "-c 1",
   5504      "\\2 1",
   5505      "-\\2 1",
   5506      "-\\7f \\9e 1",
   5507    ],
   5508    invalid_values: ["none foo", "none foo 3", "foo none", "foo 3 none"],
   5509  },
   5510  cursor: {
   5511    domProp: "cursor",
   5512    inherited: true,
   5513    type: CSS_TYPE_LONGHAND,
   5514    applies_to_marker: true,
   5515    initial_values: ["auto"],
   5516    other_values: [
   5517      "crosshair",
   5518      "default",
   5519      "pointer",
   5520      "move",
   5521      "e-resize",
   5522      "ne-resize",
   5523      "nw-resize",
   5524      "n-resize",
   5525      "se-resize",
   5526      "sw-resize",
   5527      "s-resize",
   5528      "w-resize",
   5529      "text",
   5530      "wait",
   5531      "help",
   5532      "progress",
   5533      "copy",
   5534      "alias",
   5535      "context-menu",
   5536      "cell",
   5537      "not-allowed",
   5538      "col-resize",
   5539      "row-resize",
   5540      "no-drop",
   5541      "vertical-text",
   5542      "all-scroll",
   5543      "nesw-resize",
   5544      "nwse-resize",
   5545      "ns-resize",
   5546      "ew-resize",
   5547      "none",
   5548      "grab",
   5549      "grabbing",
   5550      "zoom-in",
   5551      "zoom-out",
   5552      "-moz-grab",
   5553      "-moz-grabbing",
   5554      "-moz-zoom-in",
   5555      "-moz-zoom-out",
   5556      "url(foo.png), move",
   5557      "url(foo.png) 5 7, move",
   5558      "url(foo.png) 12 3, url(bar.png), no-drop",
   5559      "url(foo.png), url(bar.png) 7 2, wait",
   5560      "url(foo.png) 3 2, url(bar.png) 7 9, pointer",
   5561      "url(foo.png) calc(1 + 2) calc(3), pointer",
   5562      "image-set(url(foo.png)), auto",
   5563    ],
   5564    invalid_values: [
   5565      "url(foo.png)",
   5566      "url(foo.png) 5 5",
   5567      "image-set(linear-gradient(red, blue)), auto",
   5568      // Gradients are supported per spec, but we don't have support for it yet
   5569      "linear-gradient(red, blue), auto",
   5570    ],
   5571  },
   5572  direction: {
   5573    domProp: "direction",
   5574    inherited: true,
   5575    type: CSS_TYPE_LONGHAND,
   5576    applies_to_marker: true,
   5577    initial_values: ["ltr"],
   5578    other_values: ["rtl"],
   5579    invalid_values: [],
   5580  },
   5581  display: {
   5582    domProp: "display",
   5583    inherited: false,
   5584    type: CSS_TYPE_LONGHAND,
   5585    // No applies_to_placeholder because we have a !important rule in forms.css.
   5586    initial_values: ["inline"],
   5587    /* XXX none will really mess with other properties */
   5588    prerequisites: { float: "none", position: "static", contain: "none" },
   5589    other_values: [
   5590      "block",
   5591      "flex",
   5592      "inline-flex",
   5593      "list-item",
   5594      "inline list-item",
   5595      "inline flow-root list-item",
   5596      "inline-block",
   5597      "table",
   5598      "inline-table",
   5599      "table-row-group",
   5600      "table-header-group",
   5601      "table-footer-group",
   5602      "table-row",
   5603      "table-column-group",
   5604      "table-column",
   5605      "table-cell",
   5606      "table-caption",
   5607      "block ruby",
   5608      "ruby",
   5609      "ruby-base",
   5610      "ruby-base-container",
   5611      "ruby-text",
   5612      "ruby-text-container",
   5613      "contents",
   5614      "none",
   5615    ],
   5616    invalid_values: [],
   5617  },
   5618  "empty-cells": {
   5619    domProp: "emptyCells",
   5620    inherited: true,
   5621    type: CSS_TYPE_LONGHAND,
   5622    initial_values: ["show"],
   5623    other_values: ["hide"],
   5624    invalid_values: [],
   5625  },
   5626  float: {
   5627    domProp: "cssFloat",
   5628    inherited: false,
   5629    type: CSS_TYPE_LONGHAND,
   5630    applies_to_first_letter: true,
   5631    initial_values: ["none"],
   5632    other_values: ["left", "right", "inline-start", "inline-end"],
   5633    invalid_values: [],
   5634  },
   5635  font: {
   5636    domProp: "font",
   5637    inherited: true,
   5638    type: CSS_TYPE_TRUE_SHORTHAND,
   5639    prerequisites: { "writing-mode": "initial" },
   5640    subproperties: [
   5641      "font-style",
   5642      "font-variant",
   5643      "font-weight",
   5644      "font-size",
   5645      "line-height",
   5646      "font-family",
   5647      "font-stretch",
   5648      "font-size-adjust",
   5649      "font-feature-settings",
   5650      "font-language-override",
   5651      "font-kerning",
   5652      "font-variant-alternates",
   5653      "font-variant-caps",
   5654      "font-variant-east-asian",
   5655      "font-variant-ligatures",
   5656      "font-variant-numeric",
   5657      "font-variant-position",
   5658    ],
   5659    initial_values: [
   5660      gInitialFontFamilyIsSansSerif ? "medium sans-serif" : "medium serif",
   5661    ],
   5662    other_values: [
   5663      "large serif",
   5664      "9px fantasy",
   5665      "condensed bold italic small-caps 24px/1.4 Times New Roman, serif",
   5666      "small inherit roman",
   5667      "small roman inherit",
   5668      // system fonts
   5669      "caption",
   5670      "icon",
   5671      "menu",
   5672      "message-box",
   5673      "small-caption",
   5674      "status-bar",
   5675      // line-height with calc()
   5676      "condensed bold italic small-caps 24px/calc(2px) Times New Roman, serif",
   5677      "condensed bold italic small-caps 24px/calc(50%) Times New Roman, serif",
   5678      "condensed bold italic small-caps 24px/calc(3*25px) Times New Roman, serif",
   5679      "condensed bold italic small-caps 24px/calc(25px*3) Times New Roman, serif",
   5680      "condensed bold italic small-caps 24px/calc(3*25px + 50%) Times New Roman, serif",
   5681      "condensed bold italic small-caps 24px/calc(1 + 2*3/4) Times New Roman, serif",
   5682    ],
   5683    invalid_values: [
   5684      "9 fantasy",
   5685      "-2px fantasy",
   5686      // line-height with calc()
   5687      "condensed bold italic small-caps 24px/calc(1 + 2px) Times New Roman, serif",
   5688      "condensed bold italic small-caps 24px/calc(100% + 0.1) Times New Roman, serif",
   5689    ],
   5690  },
   5691  "font-family": {
   5692    domProp: "fontFamily",
   5693    inherited: true,
   5694    type: CSS_TYPE_LONGHAND,
   5695    applies_to_first_letter: true,
   5696    applies_to_first_line: true,
   5697    applies_to_marker: true,
   5698    applies_to_placeholder: true,
   5699    applies_to_cue: true,
   5700    initial_values: [gInitialFontFamilyIsSansSerif ? "sans-serif" : "serif"],
   5701    other_values: [
   5702      gInitialFontFamilyIsSansSerif ? "serif" : "sans-serif",
   5703      "Times New Roman, serif",
   5704      "'Times New Roman', serif",
   5705      "cursive",
   5706      "fantasy",
   5707      '\\"Times New Roman',
   5708      '"Times New Roman"',
   5709      'Times, \\"Times New Roman',
   5710      'Times, "Times New Roman"',
   5711      "-no-such-font-installed",
   5712      "inherit roman",
   5713      "roman inherit",
   5714      "Times, inherit roman",
   5715      "inherit roman, Times",
   5716      "roman inherit, Times",
   5717      "Times, roman inherit",
   5718    ],
   5719    invalid_values: [
   5720      '"Times New" Roman',
   5721      '"Times New Roman\n',
   5722      'Times, "Times New Roman\n',
   5723    ],
   5724  },
   5725  "font-feature-settings": {
   5726    domProp: "fontFeatureSettings",
   5727    inherited: true,
   5728    type: CSS_TYPE_LONGHAND,
   5729    applies_to_first_letter: true,
   5730    applies_to_first_line: true,
   5731    applies_to_marker: true,
   5732    applies_to_placeholder: true,
   5733    applies_to_cue: true,
   5734    initial_values: ["normal"],
   5735    other_values: [
   5736      "'liga' on",
   5737      "'liga'",
   5738      '"liga" 1',
   5739      "'liga', 'clig' 1",
   5740      '"liga" off',
   5741      '"liga" 0',
   5742      '"cv01" 3, "cv02" 4',
   5743      '"cswh", "smcp" off, "salt" 4',
   5744      '"cswh" 1, "smcp" off, "salt" 4',
   5745      '"cswh" 0, \'blah\', "liga", "smcp" off, "salt" 4',
   5746      '"liga"        ,"smcp" 0         , "blah"',
   5747      '"ab\\"c"',
   5748      '"ab\\\\c"',
   5749      "'vert' calc(2)",
   5750    ],
   5751    invalid_values: [
   5752      "liga",
   5753      "liga 1",
   5754      "liga normal",
   5755      '"liga" normal',
   5756      "normal liga",
   5757      'normal "liga"',
   5758      'normal, "liga"',
   5759      '"liga=1"',
   5760      "'foobar' on",
   5761      '"blahblah" 0',
   5762      '"liga" 3.14',
   5763      '"liga" 1 3.14',
   5764      '"liga" 1 normal',
   5765      '"liga" 1 off',
   5766      '"liga" on off',
   5767      '"liga" , 0 "smcp"',
   5768      '"liga" "smcp"',
   5769    ],
   5770  },
   5771  "font-kerning": {
   5772    domProp: "fontKerning",
   5773    inherited: true,
   5774    type: CSS_TYPE_LONGHAND,
   5775    applies_to_first_letter: true,
   5776    applies_to_first_line: true,
   5777    applies_to_marker: true,
   5778    applies_to_placeholder: true,
   5779    applies_to_cue: true,
   5780    initial_values: ["auto"],
   5781    other_values: ["normal", "none"],
   5782    invalid_values: ["on"],
   5783  },
   5784  "font-language-override": {
   5785    domProp: "fontLanguageOverride",
   5786    inherited: true,
   5787    type: CSS_TYPE_LONGHAND,
   5788    applies_to_first_letter: true,
   5789    applies_to_first_line: true,
   5790    applies_to_marker: true,
   5791    applies_to_placeholder: true,
   5792    applies_to_cue: true,
   5793    initial_values: ["normal"],
   5794    other_values: ["'ENG'", "'TRK'", '"TRK"', "'N\\'Ko'"],
   5795    invalid_values: ["TRK", "ja"],
   5796  },
   5797  "font-size": {
   5798    domProp: "fontSize",
   5799    inherited: true,
   5800    type: CSS_TYPE_LONGHAND,
   5801    applies_to_first_letter: true,
   5802    applies_to_first_line: true,
   5803    applies_to_marker: true,
   5804    applies_to_placeholder: true,
   5805    applies_to_cue: true,
   5806    initial_values: [
   5807      "medium",
   5808      "1rem",
   5809      "calc(1rem)",
   5810      "calc(0.75rem + 200% - 125% + 0.25rem - 75%)",
   5811    ],
   5812    other_values: [
   5813      "large",
   5814      "2em",
   5815      "50%",
   5816      "xx-small",
   5817      "xxx-large",
   5818      "36pt",
   5819      "8px",
   5820      "larger",
   5821      "smaller",
   5822      "0px",
   5823      "0%",
   5824      "calc(2em)",
   5825      "calc(36pt + 75% + (30% + 2em + 2px))",
   5826      "calc(-2em)",
   5827      "calc(-50%)",
   5828      "calc(-1px)",
   5829    ],
   5830    invalid_values: ["stretch", "-2em", "-50%", "-1px"],
   5831    quirks_values: { 5: "5px" },
   5832  },
   5833  "font-size-adjust": {
   5834    domProp: "fontSizeAdjust",
   5835    inherited: true,
   5836    type: CSS_TYPE_LONGHAND,
   5837    applies_to_first_letter: true,
   5838    applies_to_first_line: true,
   5839    applies_to_marker: true,
   5840    applies_to_placeholder: true,
   5841    applies_to_cue: true,
   5842    initial_values: ["none"],
   5843    other_values: [
   5844      "0.7",
   5845      "0.0",
   5846      "0",
   5847      "3",
   5848      "from-font",
   5849      "cap-height 0.8",
   5850      "ch-width 0.4",
   5851      "ic-width 0.4",
   5852      "ic-height 0.9",
   5853      "ch-width from-font",
   5854    ],
   5855    invalid_values: [
   5856      "-0.3",
   5857      "-1",
   5858      "normal",
   5859      "none none",
   5860      "cap-height none",
   5861      "none from-font",
   5862      "from-font none",
   5863      "0.5 from-font",
   5864      "0.5 cap-height",
   5865      "cap-height, 0.8",
   5866    ],
   5867  },
   5868  "font-stretch": {
   5869    domProp: "fontStretch",
   5870    inherited: true,
   5871    type: CSS_TYPE_LONGHAND,
   5872    applies_to_first_letter: true,
   5873    applies_to_first_line: true,
   5874    applies_to_marker: true,
   5875    applies_to_placeholder: true,
   5876    applies_to_cue: true,
   5877    initial_values: ["normal"],
   5878    other_values: [
   5879      "ultra-condensed",
   5880      "extra-condensed",
   5881      "condensed",
   5882      "semi-condensed",
   5883      "semi-expanded",
   5884      "expanded",
   5885      "extra-expanded",
   5886      "ultra-expanded",
   5887    ],
   5888    invalid_values: ["narrower", "wider"],
   5889  },
   5890  "font-style": {
   5891    domProp: "fontStyle",
   5892    inherited: true,
   5893    type: CSS_TYPE_LONGHAND,
   5894    applies_to_first_letter: true,
   5895    applies_to_first_line: true,
   5896    applies_to_marker: true,
   5897    applies_to_placeholder: true,
   5898    applies_to_cue: true,
   5899    initial_values: ["normal"],
   5900    other_values: ["italic", "oblique"],
   5901    invalid_values: [],
   5902  },
   5903  "font-synthesis": {
   5904    domProp: "fontSynthesis",
   5905    inherited: true,
   5906    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
   5907    subproperties: [
   5908      "font-synthesis-weight",
   5909      "font-synthesis-style",
   5910      "font-synthesis-small-caps",
   5911      "font-synthesis-position",
   5912    ],
   5913    applies_to_first_letter: true,
   5914    applies_to_first_line: true,
   5915    applies_to_marker: true,
   5916    applies_to_placeholder: true,
   5917    applies_to_cue: true,
   5918    initial_values: [
   5919      "weight style small-caps position",
   5920      "weight small-caps style position",
   5921      "small-caps weight position style",
   5922      "small-caps style position weight",
   5923      "style position weight small-caps",
   5924      "style position small-caps weight",
   5925    ],
   5926    other_values: [
   5927      "none",
   5928      "weight",
   5929      "style",
   5930      "oblique-only",
   5931      "small-caps",
   5932      "position",
   5933      "weight style",
   5934      "style weight",
   5935      "weight oblique-only",
   5936      "oblique-only weight",
   5937      "weight small-caps",
   5938      "small-caps weight",
   5939      "weight position",
   5940      "position weight",
   5941      "style small-caps",
   5942      "small-caps style",
   5943      "oblique-only small-caps",
   5944      "small-caps oblique-only",
   5945      "style position",
   5946      "position style",
   5947      "oblique-only position",
   5948      "position oblique-only",
   5949      "small-caps position",
   5950      "position small-caps",
   5951      "weight style small-caps",
   5952      "small-caps weight style",
   5953      "weight oblique-only small-caps",
   5954      "small-caps weight oblique-only",
   5955      "weight style position",
   5956      "position weight style",
   5957      "weight oblique-only position",
   5958      "position weight oblique-only",
   5959      "weight small-caps position",
   5960      "position weight small-caps",
   5961    ],
   5962    invalid_values: [
   5963      "10px",
   5964      "weight none",
   5965      "style none",
   5966      "oblique-only none",
   5967      "none style",
   5968      "none oblique-only",
   5969      "none 10px",
   5970      "weight 10px",
   5971      "weight weight",
   5972      "style style",
   5973      "style oblique-only",
   5974      "oblique-only oblique-only",
   5975      "small-caps none",
   5976      "small-caps small-caps",
   5977      "position none",
   5978      "position position",
   5979    ],
   5980  },
   5981  "font-synthesis-weight": {
   5982    domProp: "fontSynthesisWeight",
   5983    inherited: true,
   5984    type: CSS_TYPE_LONGHAND,
   5985    applies_to_first_letter: true,
   5986    applies_to_first_line: true,
   5987    applies_to_marker: true,
   5988    applies_to_placeholder: true,
   5989    applies_to_cue: true,
   5990    initial_values: ["auto"],
   5991    other_values: ["none"],
   5992    invalid_values: ["auto none", "weight", "normal", "0"],
   5993  },
   5994  "font-synthesis-style": {
   5995    domProp: "fontSynthesisStyle",
   5996    inherited: true,
   5997    type: CSS_TYPE_LONGHAND,
   5998    applies_to_first_letter: true,
   5999    applies_to_first_line: true,
   6000    applies_to_marker: true,
   6001    applies_to_placeholder: true,
   6002    applies_to_cue: true,
   6003    initial_values: ["auto"],
   6004    other_values: ["none", "oblique-only"],
   6005    invalid_values: ["auto none", "style", "normal", "0"],
   6006  },
   6007  "font-synthesis-small-caps": {
   6008    domProp: "fontSynthesisSmallCaps",
   6009    inherited: true,
   6010    type: CSS_TYPE_LONGHAND,
   6011    applies_to_first_letter: true,
   6012    applies_to_first_line: true,
   6013    applies_to_marker: true,
   6014    applies_to_placeholder: true,
   6015    applies_to_cue: true,
   6016    initial_values: ["auto"],
   6017    other_values: ["none"],
   6018    invalid_values: ["auto none", "small-caps", "normal", "0"],
   6019  },
   6020  "font-synthesis-position": {
   6021    domProp: "fontSynthesisPosition",
   6022    inherited: true,
   6023    type: CSS_TYPE_LONGHAND,
   6024    applies_to_first_letter: true,
   6025    applies_to_first_line: true,
   6026    applies_to_marker: true,
   6027    applies_to_placeholder: true,
   6028    applies_to_cue: true,
   6029    initial_values: ["auto"],
   6030    other_values: ["none"],
   6031    invalid_values: ["auto none", "position", "normal", "0"],
   6032  },
   6033  "font-variant": {
   6034    domProp: "fontVariant",
   6035    inherited: true,
   6036    type: CSS_TYPE_TRUE_SHORTHAND,
   6037    subproperties: [
   6038      "font-variant-alternates",
   6039      "font-variant-caps",
   6040      "font-variant-east-asian",
   6041      "font-variant-ligatures",
   6042      "font-variant-numeric",
   6043      "font-variant-position",
   6044    ],
   6045    initial_values: ["normal"],
   6046    other_values: [
   6047      "small-caps",
   6048      "none",
   6049      "traditional oldstyle-nums",
   6050      "all-small-caps",
   6051      "common-ligatures no-discretionary-ligatures",
   6052      "proportional-nums oldstyle-nums",
   6053      "proportional-nums slashed-zero diagonal-fractions oldstyle-nums ordinal",
   6054      "traditional historical-forms styleset(ok-alt-a, ok-alt-b)",
   6055      "styleset(potato)",
   6056    ],
   6057    invalid_values: [
   6058      "small-caps normal",
   6059      "small-caps small-caps",
   6060      "none common-ligatures",
   6061      "common-ligatures none",
   6062      "small-caps potato",
   6063      "small-caps jis83 all-small-caps",
   6064      "super historical-ligatures sub",
   6065      "stacked-fractions diagonal-fractions historical-ligatures",
   6066      "common-ligatures traditional common-ligatures",
   6067      "lining-nums traditional slashed-zero ordinal normal",
   6068      "traditional historical-forms styleset(ok-alt-a, ok-alt-b) historical-forms",
   6069      "historical-forms styleset(ok-alt-a, ok-alt-b) traditional styleset(potato)",
   6070      "annotation(a,b,c)",
   6071    ],
   6072  },
   6073  "font-variant-alternates": {
   6074    domProp: "fontVariantAlternates",
   6075    inherited: true,
   6076    type: CSS_TYPE_LONGHAND,
   6077    applies_to_first_letter: true,
   6078    applies_to_first_line: true,
   6079    applies_to_marker: true,
   6080    applies_to_placeholder: true,
   6081    applies_to_cue: true,
   6082    initial_values: ["normal"],
   6083    other_values: [
   6084      "historical-forms",
   6085      "styleset(alt-a, alt-b)",
   6086      "character-variant(a, b, c)",
   6087      "annotation(circled)",
   6088      "swash(squishy)",
   6089      "styleset(complex\\ blob, a)",
   6090      "annotation(\\62 lah)",
   6091    ],
   6092    invalid_values: [
   6093      "historical-forms normal",
   6094      "historical-forms historical-forms",
   6095      "swash",
   6096      "swash(3)",
   6097      "annotation(a, b)",
   6098      "ornaments(a,b)",
   6099      "styleset(1234blah)",
   6100      "annotation(a), annotation(b)",
   6101      "annotation(a) normal",
   6102    ],
   6103  },
   6104  "font-variant-caps": {
   6105    domProp: "fontVariantCaps",
   6106    inherited: true,
   6107    type: CSS_TYPE_LONGHAND,
   6108    applies_to_first_letter: true,
   6109    applies_to_first_line: true,
   6110    applies_to_marker: true,
   6111    applies_to_placeholder: true,
   6112    applies_to_cue: true,
   6113    initial_values: ["normal"],
   6114    other_values: [
   6115      "small-caps",
   6116      "all-small-caps",
   6117      "petite-caps",
   6118      "all-petite-caps",
   6119      "titling-caps",
   6120      "unicase",
   6121    ],
   6122    invalid_values: [
   6123      "normal small-caps",
   6124      "petite-caps normal",
   6125      "unicase unicase",
   6126    ],
   6127  },
   6128  "font-variant-east-asian": {
   6129    domProp: "fontVariantEastAsian",
   6130    inherited: true,
   6131    type: CSS_TYPE_LONGHAND,
   6132    applies_to_first_letter: true,
   6133    applies_to_first_line: true,
   6134    applies_to_marker: true,
   6135    applies_to_placeholder: true,
   6136    applies_to_cue: true,
   6137    initial_values: ["normal"],
   6138    other_values: [
   6139      "jis78",
   6140      "jis83",
   6141      "jis90",
   6142      "jis04",
   6143      "simplified",
   6144      "traditional",
   6145      "full-width",
   6146      "proportional-width",
   6147      "ruby",
   6148      "jis78 full-width",
   6149      "jis78 full-width ruby",
   6150      "simplified proportional-width",
   6151      "ruby simplified",
   6152    ],
   6153    invalid_values: [
   6154      "jis78 normal",
   6155      "jis90 jis04",
   6156      "simplified traditional",
   6157      "full-width proportional-width",
   6158      "ruby simplified ruby",
   6159      "jis78 ruby simplified",
   6160    ],
   6161  },
   6162  "font-variant-ligatures": {
   6163    domProp: "fontVariantLigatures",
   6164    inherited: true,
   6165    type: CSS_TYPE_LONGHAND,
   6166    applies_to_first_letter: true,
   6167    applies_to_first_line: true,
   6168    applies_to_marker: true,
   6169    applies_to_placeholder: true,
   6170    applies_to_cue: true,
   6171    initial_values: ["normal"],
   6172    other_values: [
   6173      "none",
   6174      "common-ligatures",
   6175      "no-common-ligatures",
   6176      "discretionary-ligatures",
   6177      "no-discretionary-ligatures",
   6178      "historical-ligatures",
   6179      "no-historical-ligatures",
   6180      "contextual",
   6181      "no-contextual",
   6182      "common-ligatures no-discretionary-ligatures",
   6183      "contextual no-discretionary-ligatures",
   6184      "historical-ligatures no-common-ligatures",
   6185      "no-historical-ligatures discretionary-ligatures",
   6186      "common-ligatures no-discretionary-ligatures historical-ligatures no-contextual",
   6187    ],
   6188    invalid_values: [
   6189      "common-ligatures normal",
   6190      "common-ligatures no-common-ligatures",
   6191      "common-ligatures common-ligatures",
   6192      "no-historical-ligatures historical-ligatures",
   6193      "no-discretionary-ligatures discretionary-ligatures",
   6194      "no-contextual contextual",
   6195      "common-ligatures no-discretionary-ligatures no-common-ligatures",
   6196      "common-ligatures none",
   6197      "no-discretionary-ligatures none",
   6198      "none common-ligatures",
   6199    ],
   6200  },
   6201  "font-variant-numeric": {
   6202    domProp: "fontVariantNumeric",
   6203    inherited: true,
   6204    type: CSS_TYPE_LONGHAND,
   6205    applies_to_first_letter: true,
   6206    applies_to_first_line: true,
   6207    applies_to_marker: true,
   6208    applies_to_placeholder: true,
   6209    applies_to_cue: true,
   6210    initial_values: ["normal"],
   6211    other_values: [
   6212      "lining-nums",
   6213      "oldstyle-nums",
   6214      "proportional-nums",
   6215      "tabular-nums",
   6216      "diagonal-fractions",
   6217      "stacked-fractions",
   6218      "slashed-zero",
   6219      "ordinal",
   6220      "lining-nums diagonal-fractions",
   6221      "tabular-nums stacked-fractions",
   6222      "tabular-nums slashed-zero stacked-fractions",
   6223      "proportional-nums slashed-zero diagonal-fractions oldstyle-nums ordinal",
   6224    ],
   6225    invalid_values: [
   6226      "lining-nums normal",
   6227      "lining-nums oldstyle-nums",
   6228      "lining-nums normal slashed-zero ordinal",
   6229      "proportional-nums tabular-nums",
   6230      "diagonal-fractions stacked-fractions",
   6231      "slashed-zero diagonal-fractions slashed-zero",
   6232      "lining-nums slashed-zero diagonal-fractions oldstyle-nums",
   6233      "diagonal-fractions diagonal-fractions",
   6234    ],
   6235  },
   6236  "font-variant-position": {
   6237    domProp: "fontVariantPosition",
   6238    inherited: true,
   6239    type: CSS_TYPE_LONGHAND,
   6240    applies_to_first_letter: true,
   6241    applies_to_first_line: true,
   6242    applies_to_marker: true,
   6243    applies_to_placeholder: true,
   6244    applies_to_cue: true,
   6245    initial_values: ["normal"],
   6246    other_values: ["super", "sub"],
   6247    invalid_values: ["normal sub", "super sub"],
   6248  },
   6249  "font-weight": {
   6250    domProp: "fontWeight",
   6251    inherited: true,
   6252    type: CSS_TYPE_LONGHAND,
   6253    applies_to_first_letter: true,
   6254    applies_to_first_line: true,
   6255    applies_to_marker: true,
   6256    applies_to_placeholder: true,
   6257    applies_to_cue: true,
   6258    initial_values: ["normal", "400"],
   6259    other_values: [
   6260      "bold",
   6261      "100",
   6262      "200",
   6263      "300",
   6264      "500",
   6265      "600",
   6266      "700",
   6267      "800",
   6268      "900",
   6269      "bolder",
   6270      "lighter",
   6271      "10.5",
   6272      "calc(10 + 10)",
   6273      "calc(10 - 99)",
   6274      "100.0",
   6275      "107",
   6276      "399",
   6277      "401",
   6278      "699",
   6279      "710",
   6280      "1000",
   6281    ],
   6282    invalid_values: ["0", "1001", "calc(10%)"],
   6283  },
   6284  height: {
   6285    domProp: "height",
   6286    inherited: false,
   6287    type: CSS_TYPE_LONGHAND,
   6288    /* FIXME: test zero, and test calc clamping */
   6289    initial_values: [" auto"],
   6290    /* computed value tests for height test more with display:block */
   6291    prerequisites: { display: "block" },
   6292    other_values: [
   6293      "15px",
   6294      "3em",
   6295      "15%",
   6296      "max-content",
   6297      "min-content",
   6298      "fit-content",
   6299      "stretch",
   6300      "-moz-max-content",
   6301      "-moz-min-content",
   6302      "-moz-fit-content",
   6303      "-moz-available",
   6304      "-webkit-fill-available",
   6305      "calc(2px)",
   6306      "calc(50%)",
   6307      "calc(3*25px)",
   6308      "calc(25px*3)",
   6309      "calc(3*25px + 50%)",
   6310      "fit-content(100px)",
   6311      "fit-content(10%)",
   6312      "fit-content(calc(3*25px + 50%))",
   6313    ],
   6314    invalid_values: ["none"],
   6315    quirks_values: { 5: "5px" },
   6316  },
   6317  "ime-mode": {
   6318    domProp: "imeMode",
   6319    inherited: false,
   6320    type: CSS_TYPE_LONGHAND,
   6321    initial_values: ["auto"],
   6322    other_values: ["normal", "disabled", "active", "inactive"],
   6323    invalid_values: ["none", "enabled", "1px"],
   6324  },
   6325  left: {
   6326    domProp: "left",
   6327    inherited: false,
   6328    type: CSS_TYPE_LONGHAND,
   6329    /* FIXME: run tests with multiple prerequisites */
   6330    prerequisites: { position: "relative" },
   6331    /* XXX 0 may or may not be equal to auto */
   6332    initial_values: ["auto"],
   6333    other_values: [
   6334      "32px",
   6335      "-3em",
   6336      "12%",
   6337      "calc(2px)",
   6338      "calc(-2px)",
   6339      "calc(50%)",
   6340      "calc(3*25px)",
   6341      "calc(25px*3)",
   6342      "calc(3*25px + 50%)",
   6343    ],
   6344    invalid_values: ["stretch"],
   6345    quirks_values: { 5: "5px" },
   6346  },
   6347  "letter-spacing": {
   6348    domProp: "letterSpacing",
   6349    inherited: true,
   6350    type: CSS_TYPE_LONGHAND,
   6351    applies_to_first_letter: true,
   6352    applies_to_first_line: true,
   6353    applies_to_placeholder: true,
   6354    initial_values: ["normal", "0", "0px", "calc(0px)", "0%"],
   6355    other_values: [
   6356      "1em",
   6357      "2px",
   6358      "-3px",
   6359      "50%",
   6360      "-120%",
   6361      "calc(1em)",
   6362      "calc(1em + 3px)",
   6363      "calc(15px / 2)",
   6364      "calc(15px/2)",
   6365      "calc(-3px)",
   6366      "calc(-10%/2 - 1em)",
   6367    ],
   6368    invalid_values: ["stretch"],
   6369    quirks_values: { 5: "5px" },
   6370  },
   6371  "line-break": {
   6372    domProp: "lineBreak",
   6373    inherited: true,
   6374    type: CSS_TYPE_LONGHAND,
   6375    initial_values: ["auto"],
   6376    other_values: ["loose", "normal", "strict", "anywhere"],
   6377    invalid_values: [],
   6378  },
   6379  "line-height": {
   6380    domProp: "lineHeight",
   6381    inherited: true,
   6382    type: CSS_TYPE_LONGHAND,
   6383    applies_to_marker: true,
   6384    applies_to_first_letter: true,
   6385    applies_to_first_line: true,
   6386    applies_to_placeholder: true,
   6387    applies_to_cue: true,
   6388    /*
   6389     * Inheritance tests require consistent font size, since
   6390     * getComputedStyle (which uses the CSS2 computed value, or
   6391     * CSS2.1 used value) doesn't match what the CSS2.1 computed
   6392     * value is.  And they even require consistent font metrics for
   6393     * computation of 'normal'.
   6394     */
   6395    prerequisites: {
   6396      "font-size": "19px",
   6397      "font-size-adjust": "none",
   6398      "font-family": "serif",
   6399      "font-weight": "normal",
   6400      "font-style": "normal",
   6401      height: "18px",
   6402      display: "block",
   6403      "writing-mode": "initial",
   6404    },
   6405 
   6406    initial_values: ["normal"],
   6407    other_values: [
   6408      "1.0",
   6409      "1",
   6410      "1em",
   6411      "47px",
   6412      "calc(2px)",
   6413      "calc(50%)",
   6414      "calc(3*25px)",
   6415      "calc(25px*3)",
   6416      "calc(3*25px + 50%)",
   6417      "calc(1 + 2*3/4)",
   6418    ],
   6419    invalid_values: ["calc(1 + 2px)", "calc(100% + 0.1)", "stretch"],
   6420  },
   6421  "list-style": {
   6422    domProp: "listStyle",
   6423    inherited: true,
   6424    type: CSS_TYPE_TRUE_SHORTHAND,
   6425    subproperties: [
   6426      "list-style-type",
   6427      "list-style-position",
   6428      "list-style-image",
   6429    ],
   6430    initial_values: [
   6431      "outside",
   6432      "disc",
   6433      "disc outside",
   6434      "outside disc",
   6435      "disc none",
   6436      "none disc",
   6437      "none disc outside",
   6438      "none outside disc",
   6439      "disc none outside",
   6440      "disc outside none",
   6441      "outside none disc",
   6442      "outside disc none",
   6443    ],
   6444    other_values: [
   6445      "inside none",
   6446      "none inside",
   6447      "none none inside",
   6448      "square",
   6449      "none",
   6450      "none none",
   6451      "outside none none",
   6452      "none outside none",
   6453      "none none outside",
   6454      "none outside",
   6455      "outside none",
   6456      "outside outside",
   6457      "outside inside",
   6458      "\\32 style",
   6459      "\\32 style inside",
   6460      '"-"',
   6461      "'-'",
   6462      "inside '-'",
   6463      "'-' outside",
   6464      "none '-'",
   6465      "inside none '-'",
   6466      'symbols("*" "\\2020" "\\2021" "\\A7")',
   6467      'symbols(cyclic "*" "\\2020" "\\2021" "\\A7")',
   6468      'inside symbols("*" "\\2020" "\\2021" "\\A7")',
   6469      'symbols("*" "\\2020" "\\2021" "\\A7") outside',
   6470      'none symbols("*" "\\2020" "\\2021" "\\A7")',
   6471      'inside none symbols("*" "\\2020" "\\2021" "\\A7")',
   6472      'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
   6473      'none url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
   6474      'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") none',
   6475      'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") outside',
   6476      'outside url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
   6477      'outside none url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
   6478      'outside url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") none',
   6479      'none url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") outside',
   6480      'none outside url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
   6481      'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") outside none',
   6482      'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==") none outside',
   6483    ],
   6484    invalid_values: [
   6485      "disc disc",
   6486      "unknown value",
   6487      "none none none",
   6488      "none disc url(404.png)",
   6489      "none url(404.png) disc",
   6490      "disc none url(404.png)",
   6491      "disc url(404.png) none",
   6492      "url(404.png) none disc",
   6493      "url(404.png) disc none",
   6494      "none disc outside url(404.png)",
   6495    ],
   6496  },
   6497  "list-style-image": {
   6498    domProp: "listStyleImage",
   6499    inherited: true,
   6500    type: CSS_TYPE_LONGHAND,
   6501    initial_values: ["none"],
   6502    other_values: [
   6503      'url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAIAAAD8GO2jAAAAKElEQVR42u3NQQ0AAAgEoNP+nTWFDzcoQE1udQQCgUAgEAgEAsGTYAGjxAE/G/Q2tQAAAABJRU5ErkJggg==")',
   6504      // Add some tests for interesting url() values here to test serialization, etc.
   6505      "url('data:text/plain,\"')",
   6506      'url("data:text/plain,\'")',
   6507      "url('data:text/plain,\\'')",
   6508      'url("data:text/plain,\\"")',
   6509      "url('data:text/plain,\\\"')",
   6510      'url("data:text/plain,\\\'")',
   6511      "url(data:text/plain,\\\\)",
   6512    ].concat(validNonUrlImageValues),
   6513    invalid_values: ["url('border.png') url('border.png')"].concat(
   6514      invalidNonUrlImageValues
   6515    ),
   6516    unbalanced_values: [].concat(unbalancedGradientAndElementValues),
   6517  },
   6518  "list-style-position": {
   6519    domProp: "listStylePosition",
   6520    inherited: true,
   6521    type: CSS_TYPE_LONGHAND,
   6522    initial_values: ["outside"],
   6523    other_values: ["inside"],
   6524    invalid_values: [],
   6525  },
   6526  "list-style-type": {
   6527    domProp: "listStyleType",
   6528    inherited: true,
   6529    type: CSS_TYPE_LONGHAND,
   6530    initial_values: ["disc"],
   6531    other_values: [
   6532      "none",
   6533      "circle",
   6534      "square",
   6535      "disclosure-closed",
   6536      "disclosure-open",
   6537      "decimal",
   6538      "decimal-leading-zero",
   6539      "lower-roman",
   6540      "upper-roman",
   6541      "lower-greek",
   6542      "lower-alpha",
   6543      "lower-latin",
   6544      "upper-alpha",
   6545      "upper-latin",
   6546      "hebrew",
   6547      "armenian",
   6548      "georgian",
   6549      "cjk-decimal",
   6550      "cjk-ideographic",
   6551      "hiragana",
   6552      "katakana",
   6553      "hiragana-iroha",
   6554      "katakana-iroha",
   6555      "japanese-informal",
   6556      "japanese-formal",
   6557      "korean-hangul-formal",
   6558      "korean-hanja-informal",
   6559      "korean-hanja-formal",
   6560      "simp-chinese-informal",
   6561      "simp-chinese-formal",
   6562      "trad-chinese-informal",
   6563      "trad-chinese-formal",
   6564      "ethiopic-numeric",
   6565      "-moz-cjk-heavenly-stem",
   6566      "-moz-cjk-earthly-branch",
   6567      "-moz-trad-chinese-informal",
   6568      "-moz-trad-chinese-formal",
   6569      "-moz-simp-chinese-informal",
   6570      "-moz-simp-chinese-formal",
   6571      "-moz-japanese-informal",
   6572      "-moz-japanese-formal",
   6573      "-moz-arabic-indic",
   6574      "-moz-persian",
   6575      "-moz-urdu",
   6576      "-moz-devanagari",
   6577      "-moz-gurmukhi",
   6578      "-moz-gujarati",
   6579      "-moz-oriya",
   6580      "-moz-kannada",
   6581      "-moz-malayalam",
   6582      "-moz-bengali",
   6583      "-moz-tamil",
   6584      "-moz-telugu",
   6585      "-moz-thai",
   6586      "-moz-lao",
   6587      "-moz-myanmar",
   6588      "-moz-khmer",
   6589      "-moz-hangul",
   6590      "-moz-hangul-consonant",
   6591      "-moz-ethiopic-halehame",
   6592      "-moz-ethiopic-numeric",
   6593      "-moz-ethiopic-halehame-am",
   6594      "-moz-ethiopic-halehame-ti-er",
   6595      "-moz-ethiopic-halehame-ti-et",
   6596      "other-style",
   6597      "inside",
   6598      "outside",
   6599      "\\32 style",
   6600      '"-"',
   6601      "'-'",
   6602      'symbols("*" "\\2020" "\\2021" "\\A7")',
   6603      "symbols(cyclic '*' '\\2020' '\\2021' '\\A7')",
   6604    ],
   6605    invalid_values: [],
   6606  },
   6607  margin: {
   6608    domProp: "margin",
   6609    inherited: false,
   6610    type: CSS_TYPE_TRUE_SHORTHAND,
   6611    subproperties: [
   6612      "margin-top",
   6613      "margin-right",
   6614      "margin-bottom",
   6615      "margin-left",
   6616    ],
   6617    initial_values: ["0", "0px 0 0em", "0% 0px 0em 0pt"],
   6618    other_values: [
   6619      "3px 0",
   6620      "2em 4px 2pt",
   6621      "1em 2em 3px 4px",
   6622      "1em calc(2em + 3px) 4ex 5cm",
   6623    ],
   6624    invalid_values: ["1px calc(nonsense)", "1px red"],
   6625    unbalanced_values: ["1px calc("],
   6626    quirks_values: { 5: "5px", "3px 6px 2 5px": "3px 6px 2px 5px" },
   6627  },
   6628  "margin-bottom": {
   6629    domProp: "marginBottom",
   6630    inherited: false,
   6631    type: CSS_TYPE_LONGHAND,
   6632    applies_to_first_letter: true,
   6633    /* XXX testing auto has prerequisites */
   6634    initial_values: ["0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)"],
   6635    other_values: [
   6636      "1px",
   6637      "2em",
   6638      "5%",
   6639      "calc(2px)",
   6640      "calc(-2px)",
   6641      "calc(50%)",
   6642      "calc(3*25px)",
   6643      "calc(25px*3)",
   6644      "calc(3*25px + 50%)",
   6645    ],
   6646    invalid_values: [],
   6647    quirks_values: { 5: "5px" },
   6648  },
   6649  "margin-left": {
   6650    domProp: "marginLeft",
   6651    inherited: false,
   6652    type: CSS_TYPE_LONGHAND,
   6653    applies_to_first_letter: true,
   6654    /* XXX testing auto has prerequisites */
   6655    initial_values: ["0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)"],
   6656    other_values: [
   6657      "1px",
   6658      "2em",
   6659      "5%",
   6660      ".5px",
   6661      "+32px",
   6662      "+.789px",
   6663      "-.328px",
   6664      "+0.56px",
   6665      "-0.974px",
   6666      "237px",
   6667      "-289px",
   6668      "-056px",
   6669      "1987.45px",
   6670      "-84.32px",
   6671      "calc(2px)",
   6672      "calc(-2px)",
   6673      "calc(50%)",
   6674      "calc(3*25px)",
   6675      "calc(25px*3)",
   6676      "calc(3*25px + 50%)",
   6677    ],
   6678    invalid_values: [
   6679      "stretch",
   6680      "..25px",
   6681      ".+5px",
   6682      ".px",
   6683      "-.px",
   6684      "++5px",
   6685      "-+4px",
   6686      "+-3px",
   6687      "--7px",
   6688      "+-.6px",
   6689      "-+.5px",
   6690      "++.7px",
   6691      "--.4px",
   6692    ],
   6693    quirks_values: { 5: "5px" },
   6694  },
   6695  "margin-right": {
   6696    domProp: "marginRight",
   6697    inherited: false,
   6698    type: CSS_TYPE_LONGHAND,
   6699    applies_to_first_letter: true,
   6700    /* XXX testing auto has prerequisites */
   6701    initial_values: ["0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)"],
   6702    other_values: [
   6703      "1px",
   6704      "2em",
   6705      "5%",
   6706      "calc(2px)",
   6707      "calc(-2px)",
   6708      "calc(50%)",
   6709      "calc(3*25px)",
   6710      "calc(25px*3)",
   6711      "calc(3*25px + 50%)",
   6712    ],
   6713    invalid_values: [],
   6714    quirks_values: { 5: "5px" },
   6715  },
   6716  "margin-top": {
   6717    domProp: "marginTop",
   6718    inherited: false,
   6719    type: CSS_TYPE_LONGHAND,
   6720    applies_to_first_letter: true,
   6721    /* XXX testing auto has prerequisites */
   6722    initial_values: ["0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)"],
   6723    other_values: [
   6724      "1px",
   6725      "2em",
   6726      "5%",
   6727      "calc(2px)",
   6728      "calc(-2px)",
   6729      "calc(50%)",
   6730      "calc(3*25px)",
   6731      "calc(25px*3)",
   6732      "calc(3*25px + 50%)",
   6733    ],
   6734    invalid_values: [],
   6735    quirks_values: { 5: "5px" },
   6736  },
   6737  "max-height": {
   6738    domProp: "maxHeight",
   6739    inherited: false,
   6740    type: CSS_TYPE_LONGHAND,
   6741    prerequisites: { display: "block" },
   6742    initial_values: ["none"],
   6743    other_values: [
   6744      "30px",
   6745      "50%",
   6746      "0",
   6747      "max-content",
   6748      "min-content",
   6749      "fit-content",
   6750      "stretch",
   6751      "-moz-max-content",
   6752      "-moz-min-content",
   6753      "-moz-fit-content",
   6754      "-moz-available",
   6755      "-webkit-fill-available",
   6756      "calc(2px)",
   6757      "calc(-2px)",
   6758      "calc(0px)",
   6759      "calc(50%)",
   6760      "calc(3*25px)",
   6761      "calc(25px*3)",
   6762      "calc(3*25px + 50%)",
   6763      "fit-content(100px)",
   6764      "fit-content(10%)",
   6765      "fit-content(calc(3*25px + 50%))",
   6766    ],
   6767    invalid_values: ["auto"],
   6768    quirks_values: { 5: "5px" },
   6769  },
   6770  "max-width": {
   6771    domProp: "maxWidth",
   6772    inherited: false,
   6773    type: CSS_TYPE_LONGHAND,
   6774    prerequisites: { display: "block" },
   6775    initial_values: ["none"],
   6776    other_values: [
   6777      "30px",
   6778      "50%",
   6779      "0",
   6780      "max-content",
   6781      "min-content",
   6782      "fit-content",
   6783      "stretch",
   6784      "-moz-max-content",
   6785      "-moz-min-content",
   6786      "-moz-fit-content",
   6787      "-moz-available",
   6788      "-webkit-fill-available",
   6789      "calc(2px)",
   6790      "calc(-2px)",
   6791      "calc(0px)",
   6792      "calc(50%)",
   6793      "calc(3*25px)",
   6794      "calc(25px*3)",
   6795      "calc(3*25px + 50%)",
   6796      "fit-content(100px)",
   6797      "fit-content(10%)",
   6798      "fit-content(calc(3*25px + 50%))",
   6799    ],
   6800    invalid_values: ["auto"],
   6801    quirks_values: { 5: "5px" },
   6802  },
   6803  "min-height": {
   6804    domProp: "minHeight",
   6805    inherited: false,
   6806    type: CSS_TYPE_LONGHAND,
   6807    prerequisites: { display: "block" },
   6808    initial_values: ["auto", "0", "calc(0em)", "calc(-2px)"],
   6809    other_values: [
   6810      "30px",
   6811      "50%",
   6812      "max-content",
   6813      "min-content",
   6814      "fit-content",
   6815      "stretch",
   6816      "-moz-max-content",
   6817      "-moz-min-content",
   6818      "-moz-fit-content",
   6819      "-moz-available",
   6820      "-webkit-fill-available",
   6821      "calc(-1%)",
   6822      "calc(2px)",
   6823      "calc(50%)",
   6824      "calc(3*25px)",
   6825      "calc(25px*3)",
   6826      "calc(3*25px + 50%)",
   6827      "fit-content(100px)",
   6828      "fit-content(10%)",
   6829      "fit-content(calc(3*25px + 50%))",
   6830    ],
   6831    invalid_values: ["none"],
   6832    quirks_values: { 5: "5px" },
   6833  },
   6834  "min-width": {
   6835    domProp: "minWidth",
   6836    inherited: false,
   6837    type: CSS_TYPE_LONGHAND,
   6838    prerequisites: { display: "block" },
   6839    initial_values: ["auto", "0", "calc(0em)", "calc(-2px)"],
   6840    other_values: [
   6841      "30px",
   6842      "50%",
   6843      "max-content",
   6844      "min-content",
   6845      "fit-content",
   6846      "stretch",
   6847      "-moz-max-content",
   6848      "-moz-min-content",
   6849      "-moz-fit-content",
   6850      "-moz-available",
   6851      "-webkit-fill-available",
   6852      "calc(-1%)",
   6853      "calc(2px)",
   6854      "calc(50%)",
   6855      "calc(3*25px)",
   6856      "calc(25px*3)",
   6857      "calc(3*25px + 50%)",
   6858      "fit-content(100px)",
   6859      "fit-content(10%)",
   6860      "fit-content(calc(3*25px + 50%))",
   6861    ],
   6862    invalid_values: ["none"],
   6863    quirks_values: { 5: "5px" },
   6864  },
   6865  "object-fit": {
   6866    domProp: "objectFit",
   6867    inherited: false,
   6868    type: CSS_TYPE_LONGHAND,
   6869    initial_values: ["fill"],
   6870    other_values: ["contain", "cover", "none", "scale-down"],
   6871    invalid_values: ["auto", "5px", "100%"],
   6872  },
   6873  "object-position": {
   6874    domProp: "objectPosition",
   6875    inherited: false,
   6876    type: CSS_TYPE_LONGHAND,
   6877    initial_values: ["50% 50%", "50%", "center", "center center"],
   6878    other_values: [
   6879      "calc(20px)",
   6880      "calc(20px) 10px",
   6881      "10px calc(20px)",
   6882      "calc(20px) 25%",
   6883      "25% calc(20px)",
   6884      "calc(20px) calc(20px)",
   6885      "calc(20px + 1em) calc(20px / 2)",
   6886      "calc(20px + 50%) calc(50% - 10px)",
   6887      "calc(-20px) calc(-50%)",
   6888      "calc(-20%) calc(-50%)",
   6889      "0px 0px",
   6890      "right 20px top 60px",
   6891      "right 20px bottom 60px",
   6892      "left 20px top 60px",
   6893      "left 20px bottom 60px",
   6894      "right -50px top -50px",
   6895      "left -50px bottom -50px",
   6896      "right 20px top -50px",
   6897      "right -20px top 50px",
   6898      "right 3em bottom 10px",
   6899      "bottom 3em right 10px",
   6900      "top 3em right 10px",
   6901      "left 15px",
   6902      "10px top",
   6903      "left 20%",
   6904      "right 20%",
   6905    ],
   6906    invalid_values: [
   6907      "center 10px center 4px",
   6908      "center 10px center",
   6909      "top 20%",
   6910      "bottom 20%",
   6911      "50% left",
   6912      "top 50%",
   6913      "50% bottom 10%",
   6914      "right 10% 50%",
   6915      "left right",
   6916      "top bottom",
   6917      "left 10% right",
   6918      "top 20px bottom 20px",
   6919      "left left",
   6920      "20 20",
   6921      "left top 15px",
   6922      "left 10px top",
   6923    ],
   6924  },
   6925  offset: {
   6926    domProp: "offset",
   6927    inherited: false,
   6928    type: CSS_TYPE_TRUE_SHORTHAND,
   6929    subproperties: [
   6930      "offset-path",
   6931      "offset-distance",
   6932      "offset-rotate",
   6933      "offset-anchor",
   6934      "offset-position",
   6935    ],
   6936    initial_values: ["none"],
   6937    other_values: [
   6938      "none 30deg reverse",
   6939      "none 50px reverse 30deg",
   6940      "none calc(10px + 20%) auto",
   6941      "none reverse",
   6942      "none / left center",
   6943      "path('M 0 0 H 1') -200% auto",
   6944      "path('M 0 0 H 1') -200%",
   6945      "path('M 0 0 H 1') 50px",
   6946      "path('M 0 0 H 1') auto",
   6947      "path('M 0 0 H 1') reverse 30deg 50px",
   6948      "path('M 0 0 H 1')",
   6949      "path('m 20 0 h 100') -7rad 8px / auto",
   6950      "path('m 0 30 v 100') -7rad 8px / left top",
   6951      "path('m 0 0 h 100') -7rad 8px",
   6952      "path('M 0 0 H 100') 100px 0deg",
   6953      "top right / top left",
   6954      "top right ray(45deg closest-side)",
   6955      "50% 50% ray(0rad farthest-side)",
   6956    ],
   6957    invalid_values: [
   6958      "stretch",
   6959      "100px 0deg path('m 0 0 h 100')",
   6960      "30deg",
   6961      "auto 30deg 100px",
   6962      "auto / none",
   6963      "none /",
   6964      "none / 100px 20px 30deg",
   6965      "path('M 20 30 A 60 70 80') bottom",
   6966      "path('M 20 30 A 60 70 80') bottom top",
   6967      "path('M 20 30 A 60 70 80') 100px 200px",
   6968      "path('M 20 30 A 60 70 80') reverse auto",
   6969      "path('M 20 30 A 60 70 80') reverse 10px 30deg",
   6970      "path('M 20 30 A 60 70 80') /",
   6971    ],
   6972  },
   6973  "offset-anchor": {
   6974    domProp: "offsetAnchor",
   6975    inherited: false,
   6976    type: CSS_TYPE_LONGHAND,
   6977    initial_values: ["auto"],
   6978    other_values: [
   6979      "left bottom",
   6980      "center center",
   6981      "calc(20% + 10px) center",
   6982      "right 30em",
   6983      "10px 20%",
   6984      "left -10px top -20%",
   6985      "right 10% bottom 20em",
   6986    ],
   6987    invalid_values: ["none", "10deg", "left 10% top"],
   6988  },
   6989  "offset-distance": {
   6990    domProp: "offsetDistance",
   6991    inherited: false,
   6992    type: CSS_TYPE_LONGHAND,
   6993    initial_values: ["0"],
   6994    other_values: ["10px", "10%", "190%", "-280%", "calc(30px + 40%)"],
   6995    invalid_values: ["stretch", "none", "45deg"],
   6996  },
   6997  "offset-path": {
   6998    domProp: "offsetPath",
   6999    inherited: false,
   7000    type: CSS_TYPE_LONGHAND,
   7001    initial_values: ["none"],
   7002    other_values: [
   7003      "ray(0deg)",
   7004      "ray(45deg closest-side)",
   7005      "ray(0rad farthest-side)",
   7006      "ray(0.5turn closest-corner contain)",
   7007      "ray(200grad farthest-corner)",
   7008      "ray(sides 180deg)",
   7009      "ray(contain farthest-side 180deg)",
   7010      "ray(calc(180deg - 45deg) farthest-side)",
   7011      "ray(0deg at center center)",
   7012      "ray(at 10% 10% 1rad)",
   7013    ]
   7014      .concat(pathValues.other_values)
   7015      .concat(basicShapeOtherValues)
   7016      .concat(basicShapeXywhRectValues)
   7017      .concat(basicShapeShapeValues),
   7018    invalid_values: [
   7019      "path('')",
   7020      "ray(closest-side)",
   7021      "ray(0deg, closest-side)",
   7022      "ray(contain 0deg closest-side contain)",
   7023    ].concat(pathValues.invalid_values),
   7024  },
   7025  "offset-position": {
   7026    domProp: "offsetPosition",
   7027    inherited: false,
   7028    type: CSS_TYPE_LONGHAND,
   7029    initial_values: ["normal"],
   7030    other_values: [
   7031      "auto",
   7032      "left bottom",
   7033      "center center",
   7034      "calc(20% + 10px) center",
   7035      "right 30em",
   7036      "10px 20%",
   7037      "left -10px top -20%",
   7038      "right 10% bottom 20em",
   7039    ],
   7040    invalid_values: ["none", "10deg", "left 10% top"],
   7041  },
   7042  "offset-rotate": {
   7043    domProp: "offsetRotate",
   7044    inherited: false,
   7045    type: CSS_TYPE_LONGHAND,
   7046    initial_values: ["auto"],
   7047    other_values: ["reverse", "0deg", "0rad reverse", "-45deg", "5turn auto"],
   7048    invalid_values: ["none", "10px", "reverse 0deg reverse", "reverse auto"],
   7049  },
   7050  opacity: {
   7051    domProp: "opacity",
   7052    inherited: false,
   7053    type: CSS_TYPE_LONGHAND,
   7054    applies_to_first_letter: true,
   7055    applies_to_first_line: true,
   7056    applies_to_placeholder: true,
   7057    applies_to_cue: true,
   7058    initial_values: [
   7059      "1",
   7060      "17",
   7061      "397.376",
   7062      "3e1",
   7063      "3e+1",
   7064      "3e0",
   7065      "3e+0",
   7066      "3e-0",
   7067      "300%",
   7068    ],
   7069    other_values: ["0", "0.4", "0.0000", "-3", "3e-1", "-100%", "50%"],
   7070    invalid_values: ["0px", "1px"],
   7071  },
   7072  "-moz-orient": {
   7073    domProp: "MozOrient",
   7074    inherited: false,
   7075    type: CSS_TYPE_LONGHAND,
   7076    initial_values: ["inline"],
   7077    other_values: ["horizontal", "vertical", "block"],
   7078    invalid_values: ["none"],
   7079  },
   7080  outline: {
   7081    domProp: "outline",
   7082    inherited: false,
   7083    type: CSS_TYPE_TRUE_SHORTHAND,
   7084    subproperties: ["outline-color", "outline-style", "outline-width"],
   7085    initial_values: [
   7086      "none",
   7087      "medium",
   7088      "currentColor",
   7089      "none medium currentcolor",
   7090    ],
   7091    other_values: [
   7092      "thin",
   7093      "solid",
   7094      "medium solid",
   7095      "green solid",
   7096      "10px solid",
   7097      "thick solid",
   7098    ],
   7099    invalid_values: ["5%", "5", "5 solid green"],
   7100  },
   7101  "outline-color": {
   7102    domProp: "outlineColor",
   7103    inherited: false,
   7104    type: CSS_TYPE_LONGHAND,
   7105    applies_to_cue: true,
   7106    prerequisites: { color: "black" },
   7107    initial_values: ["currentColor"], // XXX should be invert
   7108    other_values: ["green", "rgba(255,128,0,0.5)", "transparent"],
   7109    invalid_values: [
   7110      "#0",
   7111      "#00",
   7112      "#00000",
   7113      "#0000000",
   7114      "#000000000",
   7115      "000000",
   7116      "cc00ff",
   7117    ],
   7118  },
   7119  "outline-offset": {
   7120    domProp: "outlineOffset",
   7121    inherited: false,
   7122    type: CSS_TYPE_LONGHAND,
   7123    initial_values: [
   7124      "0",
   7125      "0px",
   7126      "-0",
   7127      "calc(0px)",
   7128      "calc(3em + 2px - 2px - 3em)",
   7129      "calc(-0em)",
   7130    ],
   7131    other_values: [
   7132      "-3px",
   7133      "1em",
   7134      "calc(3em)",
   7135      "calc(7pt + 3 * 2em)",
   7136      "calc(-3px)",
   7137    ],
   7138    invalid_values: ["stretch", "5%"],
   7139  },
   7140  "outline-style": {
   7141    domProp: "outlineStyle",
   7142    inherited: false,
   7143    type: CSS_TYPE_LONGHAND,
   7144    applies_to_cue: true,
   7145    // XXX Should 'hidden' be the same as initial?
   7146    initial_values: ["none"],
   7147    other_values: [
   7148      "solid",
   7149      "dashed",
   7150      "dotted",
   7151      "double",
   7152      "outset",
   7153      "inset",
   7154      "groove",
   7155      "ridge",
   7156      "auto",
   7157    ],
   7158    invalid_values: [],
   7159  },
   7160  "outline-width": {
   7161    domProp: "outlineWidth",
   7162    inherited: false,
   7163    type: CSS_TYPE_LONGHAND,
   7164    applies_to_cue: true,
   7165    prerequisites: { "outline-style": "solid" },
   7166    initial_values: ["medium", "3px", "calc(4px - 1px)"],
   7167    other_values: [
   7168      "thin",
   7169      "thick",
   7170      "1px",
   7171      "2em",
   7172      "calc(2px)",
   7173      "calc(-2px)",
   7174      "calc(0px)",
   7175      "calc(0px)",
   7176      "calc(5em)",
   7177      "calc(3*25px)",
   7178      "calc(25px*3)",
   7179      "calc(3*25px + 5em)",
   7180    ],
   7181    invalid_values: ["stretch", "5%", "5"],
   7182  },
   7183  overflow: {
   7184    domProp: "overflow",
   7185    inherited: false,
   7186    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
   7187    prerequisites: { display: "block", contain: "none" },
   7188    subproperties: ["overflow-x", "overflow-y"],
   7189    initial_values: ["visible"],
   7190    other_values: [
   7191      "auto",
   7192      "scroll",
   7193      "hidden",
   7194      "clip",
   7195      "auto auto",
   7196      "auto scroll",
   7197      "hidden scroll",
   7198      "auto hidden",
   7199      "clip clip",
   7200      "overlay",
   7201      "overlay overlay",
   7202    ],
   7203    invalid_values: [
   7204      "clip -moz-scrollbars-none",
   7205      "-moz-scrollbars-none",
   7206      "-moz-scrollbars-horizontal",
   7207      "-moz-scrollbars-vertical",
   7208    ],
   7209  },
   7210  "overflow-x": {
   7211    domProp: "overflowX",
   7212    inherited: false,
   7213    type: CSS_TYPE_LONGHAND,
   7214    // No applies_to_placeholder because we have a !important rule in forms.css.
   7215    prerequisites: {
   7216      display: "block",
   7217      "overflow-y": "visible",
   7218      contain: "none",
   7219    },
   7220    initial_values: ["visible"],
   7221    other_values: ["auto", "scroll", "hidden", "clip", "overlay"],
   7222    invalid_values: [],
   7223  },
   7224  "overflow-y": {
   7225    domProp: "overflowY",
   7226    inherited: false,
   7227    type: CSS_TYPE_LONGHAND,
   7228    // No applies_to_placeholder because we have a !important rule in forms.css.
   7229    prerequisites: {
   7230      display: "block",
   7231      "overflow-x": "visible",
   7232      contain: "none",
   7233    },
   7234    initial_values: ["visible"],
   7235    other_values: ["auto", "scroll", "hidden", "clip", "overlay"],
   7236    invalid_values: [],
   7237  },
   7238  "overflow-inline": {
   7239    domProp: "overflowInline",
   7240    inherited: false,
   7241    type: CSS_TYPE_LONGHAND,
   7242    logical: true,
   7243    // No applies_to_placeholder because we have a !important rule in forms.css.
   7244    prerequisites: {
   7245      display: "block",
   7246      "overflow-block": "visible",
   7247      contain: "none",
   7248    },
   7249    initial_values: ["visible"],
   7250    other_values: ["auto", "scroll", "hidden", "clip"],
   7251    invalid_values: [],
   7252  },
   7253  "overflow-block": {
   7254    domProp: "overflowBlock",
   7255    inherited: false,
   7256    type: CSS_TYPE_LONGHAND,
   7257    logical: true,
   7258    // No applies_to_placeholder because we have a !important rule in forms.css.
   7259    prerequisites: {
   7260      display: "block",
   7261      "overflow-inline": "visible",
   7262      contain: "none",
   7263    },
   7264    initial_values: ["visible"],
   7265    other_values: ["auto", "scroll", "hidden", "clip"],
   7266    invalid_values: [],
   7267  },
   7268  "overflow-clip-margin": {
   7269    domProp: "overflowClipMargin",
   7270    inherited: false,
   7271    type: CSS_TYPE_LONGHAND,
   7272    initial_values: ["0px"],
   7273    other_values: ["1px", "2em", "calc(10px + 1vh)"],
   7274    invalid_values: ["stretch", "-10px"],
   7275  },
   7276  padding: {
   7277    domProp: "padding",
   7278    inherited: false,
   7279    type: CSS_TYPE_TRUE_SHORTHAND,
   7280    subproperties: [
   7281      "padding-top",
   7282      "padding-right",
   7283      "padding-bottom",
   7284      "padding-left",
   7285    ],
   7286    initial_values: [
   7287      "0",
   7288      "0px 0 0em",
   7289      "0% 0px 0em 0pt",
   7290      "calc(0px) calc(0em) calc(-2px) calc(-1%)",
   7291    ],
   7292    other_values: ["3px 0", "2em 4px 2pt", "1em 2em 3px 4px"],
   7293    invalid_values: ["1px calc(nonsense)", "1px red", "-1px"],
   7294    unbalanced_values: ["1px calc("],
   7295    quirks_values: { 5: "5px", "3px 6px 2 5px": "3px 6px 2px 5px" },
   7296  },
   7297  "padding-block": {
   7298    domProp: "paddingBlock",
   7299    inherited: false,
   7300    type: CSS_TYPE_TRUE_SHORTHAND,
   7301    subproperties: ["padding-block-start", "padding-block-end"],
   7302    initial_values: ["0", "0px 0em"],
   7303    other_values: ["3px 0", "2% 4px", "1em", "calc(1px) calc(-1%)"],
   7304    invalid_values: ["1px calc(nonsense)", "1px red", "-1px", "auto", "none"],
   7305    unbalanced_values: ["1px calc("],
   7306  },
   7307  "padding-inline": {
   7308    domProp: "paddingInline",
   7309    inherited: false,
   7310    type: CSS_TYPE_TRUE_SHORTHAND,
   7311    subproperties: ["padding-inline-start", "padding-inline-end"],
   7312    initial_values: ["0", "0px 0em"],
   7313    other_values: ["3px 0", "2% 4px", "1em", "calc(1px) calc(-1%)"],
   7314    invalid_values: ["1px calc(nonsense)", "1px red", "-1px", "auto", "none"],
   7315    unbalanced_values: ["1px calc("],
   7316  },
   7317  "padding-bottom": {
   7318    domProp: "paddingBottom",
   7319    inherited: false,
   7320    type: CSS_TYPE_LONGHAND,
   7321    applies_to_first_letter: true,
   7322    // No applies_to_placeholder because we have a !important rule in forms.css.
   7323    initial_values: [
   7324      "0",
   7325      "0px",
   7326      "0%",
   7327      "calc(0pt)",
   7328      "calc(0% + 0px)",
   7329      "calc(-3px)",
   7330      "calc(-1%)",
   7331    ],
   7332    other_values: [
   7333      "1px",
   7334      "2em",
   7335      "5%",
   7336      "calc(2px)",
   7337      "calc(50%)",
   7338      "calc(3*25px)",
   7339      "calc(25px*3)",
   7340      "calc(3*25px + 50%)",
   7341    ],
   7342    invalid_values: ["stretch"],
   7343    quirks_values: { 5: "5px" },
   7344  },
   7345  "padding-left": {
   7346    domProp: "paddingLeft",
   7347    inherited: false,
   7348    type: CSS_TYPE_LONGHAND,
   7349    applies_to_first_letter: true,
   7350    // No applies_to_placeholder because we have a !important rule in forms.css.
   7351    initial_values: [
   7352      "0",
   7353      "0px",
   7354      "0%",
   7355      "calc(0pt)",
   7356      "calc(0% + 0px)",
   7357      "calc(-3px)",
   7358      "calc(-1%)",
   7359    ],
   7360    other_values: [
   7361      "1px",
   7362      "2em",
   7363      "5%",
   7364      "calc(2px)",
   7365      "calc(50%)",
   7366      "calc(3*25px)",
   7367      "calc(25px*3)",
   7368      "calc(3*25px + 50%)",
   7369    ],
   7370    invalid_values: ["stretch"],
   7371    quirks_values: { 5: "5px" },
   7372  },
   7373  "padding-right": {
   7374    domProp: "paddingRight",
   7375    inherited: false,
   7376    type: CSS_TYPE_LONGHAND,
   7377    applies_to_first_letter: true,
   7378    // No applies_to_placeholder because we have a !important rule in forms.css.
   7379    initial_values: [
   7380      "0",
   7381      "0px",
   7382      "0%",
   7383      "calc(0pt)",
   7384      "calc(0% + 0px)",
   7385      "calc(-3px)",
   7386      "calc(-1%)",
   7387    ],
   7388    other_values: [
   7389      "1px",
   7390      "2em",
   7391      "5%",
   7392      "calc(2px)",
   7393      "calc(50%)",
   7394      "calc(3*25px)",
   7395      "calc(25px*3)",
   7396      "calc(3*25px + 50%)",
   7397    ],
   7398    invalid_values: ["stretch"],
   7399    quirks_values: { 5: "5px" },
   7400  },
   7401  "padding-top": {
   7402    domProp: "paddingTop",
   7403    inherited: false,
   7404    type: CSS_TYPE_LONGHAND,
   7405    applies_to_first_letter: true,
   7406    // No applies_to_placeholder because we have a !important rule in forms.css.
   7407    initial_values: [
   7408      "0",
   7409      "0px",
   7410      "0%",
   7411      "calc(0pt)",
   7412      "calc(0% + 0px)",
   7413      "calc(-3px)",
   7414      "calc(-1%)",
   7415    ],
   7416    other_values: [
   7417      "1px",
   7418      "2em",
   7419      "5%",
   7420      "calc(2px)",
   7421      "calc(50%)",
   7422      "calc(3*25px)",
   7423      "calc(25px*3)",
   7424      "calc(3*25px + 50%)",
   7425    ],
   7426    invalid_values: ["stretch"],
   7427    quirks_values: { 5: "5px" },
   7428  },
   7429  "page-break-after": {
   7430    domProp: "pageBreakAfter",
   7431    inherited: false,
   7432    type: CSS_TYPE_LEGACY_SHORTHAND,
   7433    alias_for: "break-after",
   7434    subproperties: ["break-after"],
   7435    initial_values: ["auto"],
   7436    other_values: ["always", "avoid", "left", "right"],
   7437    legacy_mapping: {
   7438      always: "page",
   7439    },
   7440    invalid_values: ["page", "column"],
   7441  },
   7442  "page-break-before": {
   7443    domProp: "pageBreakBefore",
   7444    inherited: false,
   7445    type: CSS_TYPE_LEGACY_SHORTHAND,
   7446    alias_for: "break-before",
   7447    subproperties: ["break-before"],
   7448    initial_values: ["auto"],
   7449    other_values: ["always", "avoid", "left", "right"],
   7450    legacy_mapping: {
   7451      always: "page",
   7452    },
   7453    invalid_values: ["page", "column"],
   7454  },
   7455  "break-after": {
   7456    domProp: "breakAfter",
   7457    inherited: false,
   7458    type: CSS_TYPE_LONGHAND,
   7459    initial_values: ["auto"],
   7460    other_values: ["always", "page", "avoid", "left", "right"],
   7461    invalid_values: [],
   7462  },
   7463  "break-before": {
   7464    domProp: "breakBefore",
   7465    inherited: false,
   7466    type: CSS_TYPE_LONGHAND,
   7467    initial_values: ["auto"],
   7468    other_values: ["always", "page", "avoid", "left", "right"],
   7469    invalid_values: [],
   7470  },
   7471  "break-inside": {
   7472    domProp: "breakInside",
   7473    inherited: false,
   7474    type: CSS_TYPE_LONGHAND,
   7475    initial_values: ["auto"],
   7476    other_values: ["avoid", "avoid-page", "avoid-column"],
   7477    invalid_values: ["left", "right", "always"],
   7478  },
   7479  "page-break-inside": {
   7480    domProp: "pageBreakInside",
   7481    inherited: false,
   7482    type: CSS_TYPE_LEGACY_SHORTHAND,
   7483    alias_for: "break-inside",
   7484    subproperties: ["break-inside"],
   7485    initial_values: ["auto"],
   7486    other_values: ["avoid"],
   7487    invalid_values: ["avoid-page", "avoid-column"],
   7488  },
   7489  "paint-order": {
   7490    domProp: "paintOrder",
   7491    inherited: true,
   7492    type: CSS_TYPE_LONGHAND,
   7493    applies_to_first_letter: true,
   7494    applies_to_first_line: true,
   7495    initial_values: ["normal"],
   7496    other_values: [
   7497      "fill",
   7498      "fill stroke",
   7499      "fill stroke markers",
   7500      "stroke markers fill",
   7501    ],
   7502    invalid_values: ["fill stroke markers fill", "fill normal"],
   7503  },
   7504  "pointer-events": {
   7505    domProp: "pointerEvents",
   7506    inherited: true,
   7507    type: CSS_TYPE_LONGHAND,
   7508    // No applies_to_placeholder because we have a !important rule in forms.css.
   7509    initial_values: ["auto"],
   7510    other_values: [
   7511      "visiblePainted",
   7512      "visibleFill",
   7513      "visibleStroke",
   7514      "visible",
   7515      "painted",
   7516      "fill",
   7517      "stroke",
   7518      "all",
   7519      "none",
   7520    ],
   7521    invalid_values: [],
   7522  },
   7523  position: {
   7524    domProp: "position",
   7525    inherited: false,
   7526    type: CSS_TYPE_LONGHAND,
   7527    initial_values: ["static"],
   7528    other_values: ["relative", "absolute", "fixed", "sticky"],
   7529    invalid_values: [],
   7530  },
   7531  quotes: {
   7532    domProp: "quotes",
   7533    inherited: true,
   7534    type: CSS_TYPE_LONGHAND,
   7535    applies_to_marker: true,
   7536    initial_values: ["auto"],
   7537    other_values: [
   7538      "none",
   7539      "'\"' '\"'",
   7540      "'' ''",
   7541      '"\u201C" "\u201D" "\u2018" "\u2019"',
   7542      '"\\201C" "\\201D" "\\2018" "\\2019"',
   7543    ],
   7544    invalid_values: ["'\"'", '"" "" ""'],
   7545  },
   7546  right: {
   7547    domProp: "right",
   7548    inherited: false,
   7549    type: CSS_TYPE_LONGHAND,
   7550    /* FIXME: run tests with multiple prerequisites */
   7551    prerequisites: { position: "relative" },
   7552    /* XXX 0 may or may not be equal to auto */
   7553    initial_values: ["auto"],
   7554    other_values: [
   7555      "32px",
   7556      "-3em",
   7557      "12%",
   7558      "calc(2px)",
   7559      "calc(-2px)",
   7560      "calc(50%)",
   7561      "calc(3*25px)",
   7562      "calc(25px*3)",
   7563      "calc(3*25px + 50%)",
   7564    ],
   7565    invalid_values: ["stretch"],
   7566    quirks_values: { 5: "5px" },
   7567  },
   7568  "ruby-align": {
   7569    domProp: "rubyAlign",
   7570    inherited: true,
   7571    type: CSS_TYPE_LONGHAND,
   7572    initial_values: ["space-around"],
   7573    other_values: ["start", "center", "space-between"],
   7574    invalid_values: ["end", "1", "10px", "50%", "start center"],
   7575  },
   7576  "ruby-position": {
   7577    domProp: "rubyPosition",
   7578    inherited: true,
   7579    type: CSS_TYPE_LONGHAND,
   7580    applies_to_cue: true,
   7581    initial_values: ["alternate", "alternate over", "over alternate"],
   7582    other_values: ["over", "under", "alternate under", "under alternate"],
   7583    invalid_values: [
   7584      "left",
   7585      "right",
   7586      "auto",
   7587      "none",
   7588      "not_a_position",
   7589      "over left",
   7590      "right under",
   7591      "over under",
   7592      "alternate alternate",
   7593      "0",
   7594      "100px",
   7595      "50%",
   7596    ],
   7597  },
   7598  "scroll-behavior": {
   7599    domProp: "scrollBehavior",
   7600    inherited: false,
   7601    type: CSS_TYPE_LONGHAND,
   7602    initial_values: ["auto"],
   7603    other_values: ["smooth"],
   7604    invalid_values: ["none", "1px"],
   7605  },
   7606  "scroll-snap-stop": {
   7607    domProp: "scrollSnapStop",
   7608    inherited: false,
   7609    type: CSS_TYPE_LONGHAND,
   7610    initial_values: ["normal"],
   7611    other_values: ["always"],
   7612    invalid_values: ["auto", "none", "1px"],
   7613  },
   7614  "scroll-snap-type": {
   7615    domProp: "scrollSnapType",
   7616    inherited: false,
   7617    type: CSS_TYPE_LONGHAND,
   7618    initial_values: ["none"],
   7619    other_values: [
   7620      "both mandatory",
   7621      "y mandatory",
   7622      "inline proximity",
   7623      "both",
   7624      "x",
   7625      "y",
   7626      "block",
   7627      "inline",
   7628    ],
   7629    invalid_values: [
   7630      "auto",
   7631      "1px",
   7632      "x y",
   7633      "block mandatory inline",
   7634      "mandatory",
   7635      "proximity",
   7636      "mandatory inline",
   7637      "proximity both",
   7638      "mandatory x",
   7639      "proximity y",
   7640      "mandatory block",
   7641      "proximity mandatory",
   7642    ],
   7643  },
   7644  "scroll-snap-align": {
   7645    domProp: "scrollSnapAlign",
   7646    inherited: false,
   7647    type: CSS_TYPE_LONGHAND,
   7648    initial_values: ["none"],
   7649    other_values: [
   7650      "start",
   7651      "end",
   7652      "center",
   7653      "start none",
   7654      "center end",
   7655      "start start",
   7656    ],
   7657    invalid_values: ["auto", "start invalid", "start end center"],
   7658  },
   7659  "scroll-margin": {
   7660    domProp: "scrollMargin",
   7661    inherited: false,
   7662    type: CSS_TYPE_TRUE_SHORTHAND,
   7663    subproperties: [
   7664      "scroll-margin-top",
   7665      "scroll-margin-right",
   7666      "scroll-margin-bottom",
   7667      "scroll-margin-left",
   7668    ],
   7669    initial_values: ["0"],
   7670    other_values: [
   7671      "-10px",
   7672      "calc(2em + 3ex)",
   7673      "1px 2px",
   7674      "1px 2px 3px",
   7675      "1px 2px 3px 4px",
   7676    ],
   7677    invalid_values: ["stretch", "auto", "20%", "-30%", "1px 2px 3px 4px 5px"],
   7678  },
   7679  "scroll-margin-top": {
   7680    domProp: "scrollMarginTop",
   7681    inherited: false,
   7682    type: CSS_TYPE_LONGHAND,
   7683    initial_values: ["0"],
   7684    other_values: ["-10px", "calc(2em + 3ex)"],
   7685    invalid_values: ["stretch", "auto", "20%", "-30%", "1px 2px"],
   7686  },
   7687  "scroll-margin-right": {
   7688    domProp: "scrollMarginRight",
   7689    inherited: false,
   7690    type: CSS_TYPE_LONGHAND,
   7691    initial_values: ["0"],
   7692    other_values: ["-10px", "calc(2em + 3ex)"],
   7693    invalid_values: ["stretch", "auto", "20%", "-30%", "1px 2px"],
   7694  },
   7695  "scroll-margin-bottom": {
   7696    domProp: "scrollMarginBottom",
   7697    inherited: false,
   7698    type: CSS_TYPE_LONGHAND,
   7699    initial_values: ["0"],
   7700    other_values: ["-10px", "calc(2em + 3ex)"],
   7701    invalid_values: ["stretch", "auto", "20%", "-30%", "1px 2px"],
   7702  },
   7703  "scroll-margin-left": {
   7704    domProp: "scrollMarginLeft",
   7705    inherited: false,
   7706    type: CSS_TYPE_LONGHAND,
   7707    initial_values: ["0"],
   7708    other_values: ["-10px", "calc(2em + 3ex)"],
   7709    invalid_values: ["stretch", "auto", "20%", "-30%", "1px 2px"],
   7710  },
   7711  "scroll-margin-inline": {
   7712    domProp: "scrollMarginInline",
   7713    inherited: false,
   7714    type: CSS_TYPE_TRUE_SHORTHAND,
   7715    subproperties: ["scroll-margin-inline-start", "scroll-margin-inline-end"],
   7716    initial_values: ["0"],
   7717    other_values: ["-10px", "calc(2em + 3ex)", "1px 2px"],
   7718    invalid_values: ["stretch", "auto", "20%", "-30%", "1px 2px 3px"],
   7719  },
   7720  "scroll-margin-inline-start": {
   7721    domProp: "scrollMarginInlineStart",
   7722    inherited: false,
   7723    type: CSS_TYPE_LONGHAND,
   7724    logical: true,
   7725    initial_values: ["0"],
   7726    other_values: ["-10px", "calc(2em + 3ex)"],
   7727    invalid_values: ["auto", "20%", "-30%", "1px 2px"],
   7728  },
   7729  "scroll-margin-inline-end": {
   7730    domProp: "scrollMarginInlineEnd",
   7731    inherited: false,
   7732    type: CSS_TYPE_LONGHAND,
   7733    logical: true,
   7734    initial_values: ["0"],
   7735    other_values: ["-10px", "calc(2em + 3ex)"],
   7736    invalid_values: ["auto", "20%", "-30%", "1px 2px"],
   7737  },
   7738  "scroll-margin-block": {
   7739    domProp: "scrollMarginBlock",
   7740    inherited: false,
   7741    type: CSS_TYPE_TRUE_SHORTHAND,
   7742    subproperties: ["scroll-margin-block-start", "scroll-margin-block-end"],
   7743    initial_values: ["0"],
   7744    other_values: ["-10px", "calc(2em + 3ex)", "1px 2px"],
   7745    invalid_values: ["auto", "20%", "-30%", "1px 2px 3px"],
   7746  },
   7747  "scroll-margin-block-start": {
   7748    domProp: "scrollMarginBlockStart",
   7749    inherited: false,
   7750    type: CSS_TYPE_LONGHAND,
   7751    logical: true,
   7752    initial_values: ["0"],
   7753    other_values: ["-10px", "calc(2em + 3ex)"],
   7754    invalid_values: ["auto", "20%", "-30%", "1px 2px"],
   7755  },
   7756  "scroll-margin-block-end": {
   7757    domProp: "scrollMarginBlockEnd",
   7758    inherited: false,
   7759    type: CSS_TYPE_LONGHAND,
   7760    logical: true,
   7761    initial_values: ["0"],
   7762    other_values: ["-10px", "calc(2em + 3ex)"],
   7763    invalid_values: ["auto", "20%", "-30%", "1px 2px"],
   7764  },
   7765  "scroll-padding": {
   7766    domProp: "scrollPadding",
   7767    inherited: false,
   7768    type: CSS_TYPE_TRUE_SHORTHAND,
   7769    subproperties: [
   7770      "scroll-padding-top",
   7771      "scroll-padding-right",
   7772      "scroll-padding-bottom",
   7773      "scroll-padding-left",
   7774    ],
   7775    initial_values: ["auto"],
   7776    other_values: [
   7777      "10px",
   7778      "0",
   7779      "20%",
   7780      "calc(2em + 3ex)",
   7781      "1px 2px",
   7782      "1px 2px 3%",
   7783      "1px 2px 3% 4px",
   7784      "1px auto",
   7785    ],
   7786    invalid_values: ["stretch", "20", "-20px"],
   7787  },
   7788  "scroll-padding-top": {
   7789    domProp: "scrollPaddingTop",
   7790    inherited: false,
   7791    type: CSS_TYPE_LONGHAND,
   7792    initial_values: ["auto"],
   7793    other_values: [
   7794      "0",
   7795      "10px",
   7796      "20%",
   7797      "calc(2em + 3ex)",
   7798      "calc(50% + 60px)",
   7799      "calc(-50px)",
   7800    ],
   7801    invalid_values: ["stretch", "20", "-20px"],
   7802  },
   7803  "scroll-padding-right": {
   7804    domProp: "scrollPaddingRight",
   7805    inherited: false,
   7806    type: CSS_TYPE_LONGHAND,
   7807    initial_values: ["auto"],
   7808    other_values: [
   7809      "0",
   7810      "10px",
   7811      "20%",
   7812      "calc(2em + 3ex)",
   7813      "calc(50% + 60px)",
   7814      "calc(-50px)",
   7815    ],
   7816    invalid_values: ["stretch", "20", "-20px"],
   7817  },
   7818  "scroll-padding-bottom": {
   7819    domProp: "scrollPaddingBottom",
   7820    inherited: false,
   7821    type: CSS_TYPE_LONGHAND,
   7822    initial_values: ["auto"],
   7823    other_values: [
   7824      "0",
   7825      "10px",
   7826      "20%",
   7827      "calc(2em + 3ex)",
   7828      "calc(50% + 60px)",
   7829      "calc(-50px)",
   7830    ],
   7831    invalid_values: ["stretch", "20", "-20px"],
   7832  },
   7833  "scroll-padding-left": {
   7834    domProp: "scrollPaddingLeft",
   7835    inherited: false,
   7836    type: CSS_TYPE_LONGHAND,
   7837    initial_values: ["auto"],
   7838    other_values: [
   7839      "0",
   7840      "10px",
   7841      "20%",
   7842      "calc(2em + 3ex)",
   7843      "calc(50% + 60px)",
   7844      "calc(-50px)",
   7845    ],
   7846    invalid_values: ["stretch", "20", "-20px"],
   7847  },
   7848  "scroll-padding-inline": {
   7849    domProp: "scrollPaddingInline",
   7850    inherited: false,
   7851    type: CSS_TYPE_TRUE_SHORTHAND,
   7852    subproperties: ["scroll-padding-inline-start", "scroll-padding-inline-end"],
   7853    initial_values: ["auto", "auto auto"],
   7854    other_values: [
   7855      "10px",
   7856      "0",
   7857      "20%",
   7858      "calc(2em + 3ex)",
   7859      "1px 2px",
   7860      "1px auto",
   7861    ],
   7862    invalid_values: ["stretch", "20", "-20px"],
   7863  },
   7864  "scroll-padding-inline-start": {
   7865    domProp: "scrollPaddingInlineStart",
   7866    inherited: false,
   7867    type: CSS_TYPE_LONGHAND,
   7868    logical: true,
   7869    initial_values: ["auto"],
   7870    other_values: [
   7871      "0",
   7872      "10px",
   7873      "20%",
   7874      "calc(2em + 3ex)",
   7875      "calc(50% + 60px)",
   7876      "calc(-50px)",
   7877    ],
   7878    invalid_values: ["stretch", "20", "-20px"],
   7879  },
   7880  "scroll-padding-inline-end": {
   7881    domProp: "scrollPaddingInlineEnd",
   7882    inherited: false,
   7883    type: CSS_TYPE_LONGHAND,
   7884    logical: true,
   7885    initial_values: ["auto"],
   7886    other_values: [
   7887      "0",
   7888      "10px",
   7889      "20%",
   7890      "calc(2em + 3ex)",
   7891      "calc(50% + 60px)",
   7892      "calc(-50px)",
   7893    ],
   7894    invalid_values: ["stretch", "20", "-20px"],
   7895  },
   7896  "scroll-padding-block": {
   7897    domProp: "scrollPaddingBlock",
   7898    inherited: false,
   7899    type: CSS_TYPE_TRUE_SHORTHAND,
   7900    subproperties: ["scroll-padding-block-start", "scroll-padding-block-end"],
   7901    initial_values: ["auto", "auto auto"],
   7902    other_values: [
   7903      "10px",
   7904      "0",
   7905      "20%",
   7906      "calc(2em + 3ex)",
   7907      "1px 2px",
   7908      "1px auto",
   7909    ],
   7910    invalid_values: ["stretch", "20", "-20px"],
   7911  },
   7912  "scroll-padding-block-start": {
   7913    domProp: "scrollPaddingBlockStart",
   7914    inherited: false,
   7915    type: CSS_TYPE_LONGHAND,
   7916    logical: true,
   7917    initial_values: ["auto"],
   7918    other_values: [
   7919      "0",
   7920      "10px",
   7921      "20%",
   7922      "calc(2em + 3ex)",
   7923      "calc(50% + 60px)",
   7924      "calc(-50px)",
   7925    ],
   7926    invalid_values: ["stretch", "20", "-20px"],
   7927  },
   7928  "scroll-padding-block-end": {
   7929    domProp: "scrollPaddingBlockEnd",
   7930    inherited: false,
   7931    type: CSS_TYPE_LONGHAND,
   7932    logical: true,
   7933    initial_values: ["auto"],
   7934    other_values: [
   7935      "0",
   7936      "10px",
   7937      "20%",
   7938      "calc(2em + 3ex)",
   7939      "calc(50% + 60px)",
   7940      "calc(-50px)",
   7941    ],
   7942    invalid_values: ["stretch", "20", "-20px"],
   7943  },
   7944  "table-layout": {
   7945    domProp: "tableLayout",
   7946    inherited: false,
   7947    type: CSS_TYPE_LONGHAND,
   7948    initial_values: ["auto"],
   7949    other_values: ["fixed"],
   7950    invalid_values: [],
   7951  },
   7952  "text-align": {
   7953    domProp: "textAlign",
   7954    inherited: true,
   7955    type: CSS_TYPE_LONGHAND,
   7956    applies_to_placeholder: true,
   7957    // don't know whether left and right are same as start
   7958    initial_values: ["start"],
   7959    other_values: [
   7960      "center",
   7961      "justify",
   7962      "end",
   7963      "match-parent",
   7964      // At least -webkit-center is needed for compat, see bug 1899042.
   7965      "-moz-center",
   7966      "-webkit-center",
   7967      "-moz-left",
   7968      "-webkit-left",
   7969      "-moz-right",
   7970      "-webkit-right",
   7971    ],
   7972    invalid_values: [
   7973      "true",
   7974      "true true",
   7975      "char",
   7976      "-moz-center-or-inherit",
   7977      "true left",
   7978      "unsafe left",
   7979    ],
   7980  },
   7981  "text-align-last": {
   7982    domProp: "textAlignLast",
   7983    inherited: true,
   7984    type: CSS_TYPE_LONGHAND,
   7985    initial_values: ["auto"],
   7986    other_values: ["center", "justify", "start", "end", "left", "right"],
   7987    invalid_values: [],
   7988  },
   7989  "text-combine-upright": {
   7990    domProp: "textCombineUpright",
   7991    inherited: true,
   7992    type: CSS_TYPE_LONGHAND,
   7993    applies_to_cue: true,
   7994    applies_to_marker: true,
   7995    initial_values: ["none"],
   7996    other_values: ["all"],
   7997    invalid_values: [
   7998      "auto",
   7999      "all 2",
   8000      "none all",
   8001      "digits -3",
   8002      "digits 0",
   8003      "digits 12",
   8004      "none 3",
   8005      "digits 3.1415",
   8006      "digits3",
   8007      "digits 1",
   8008      "digits 3 all",
   8009      "digits foo",
   8010      "digits all",
   8011      "digits 3.0",
   8012    ],
   8013  },
   8014  "text-decoration": {
   8015    domProp: "textDecoration",
   8016    inherited: false,
   8017    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
   8018    applies_to_first_letter: true,
   8019    applies_to_first_line: true,
   8020    applies_to_placeholder: true,
   8021    applies_to_cue: true,
   8022    subproperties: [
   8023      "text-decoration-color",
   8024      "text-decoration-line",
   8025      "text-decoration-style",
   8026      "text-decoration-thickness",
   8027    ],
   8028    initial_values: ["none"],
   8029    other_values: [
   8030      "underline",
   8031      "overline",
   8032      "line-through",
   8033      "blink",
   8034      "blink line-through underline",
   8035      "underline overline line-through blink",
   8036      "underline red solid",
   8037      "underline #ff0000",
   8038      "solid underline",
   8039      "red underline",
   8040      "#ff0000 underline",
   8041      "dotted underline",
   8042      "solid underline 50px",
   8043      "underline 50px blue",
   8044      "50px dotted line-through purple",
   8045      "overline 2em",
   8046      "underline from-font",
   8047      "red from-font overline",
   8048      "5% underline blue",
   8049      "dotted line-through 25%",
   8050    ],
   8051    invalid_values: [
   8052      "none none",
   8053      "underline none",
   8054      "none underline",
   8055      "blink none",
   8056      "none blink",
   8057      "line-through blink line-through",
   8058      "underline overline line-through blink none",
   8059      "underline overline line-throuh blink blink",
   8060      "rgb(0, rubbish, 0) underline",
   8061      "from font blue underline",
   8062    ],
   8063  },
   8064  "text-decoration-color": {
   8065    domProp: "textDecorationColor",
   8066    inherited: false,
   8067    type: CSS_TYPE_LONGHAND,
   8068    applies_to_first_letter: true,
   8069    applies_to_first_line: true,
   8070    applies_to_placeholder: true,
   8071    applies_to_cue: true,
   8072    prerequisites: { color: "black" },
   8073    initial_values: ["currentColor"],
   8074    other_values: ["green", "rgba(255,128,0,0.5)", "transparent"],
   8075    invalid_values: [
   8076      "#0",
   8077      "#00",
   8078      "#00000",
   8079      "#0000000",
   8080      "#000000000",
   8081      "000000",
   8082      "ff00ff",
   8083    ],
   8084  },
   8085  "text-decoration-line": {
   8086    domProp: "textDecorationLine",
   8087    inherited: false,
   8088    type: CSS_TYPE_LONGHAND,
   8089    applies_to_first_letter: true,
   8090    applies_to_first_line: true,
   8091    applies_to_placeholder: true,
   8092    applies_to_cue: true,
   8093    initial_values: ["none"],
   8094    other_values: [
   8095      "underline",
   8096      "overline",
   8097      "line-through",
   8098      "blink",
   8099      "blink line-through underline",
   8100      "underline overline line-through blink",
   8101    ],
   8102    invalid_values: [
   8103      "none none",
   8104      "underline none",
   8105      "none underline",
   8106      "line-through blink line-through",
   8107      "underline overline line-through blink none",
   8108      "underline overline line-throuh blink blink",
   8109    ],
   8110  },
   8111  "text-decoration-style": {
   8112    domProp: "textDecorationStyle",
   8113    inherited: false,
   8114    type: CSS_TYPE_LONGHAND,
   8115    applies_to_first_letter: true,
   8116    applies_to_first_line: true,
   8117    applies_to_placeholder: true,
   8118    applies_to_cue: true,
   8119    initial_values: ["solid"],
   8120    other_values: ["double", "dotted", "dashed", "wavy", "-moz-none"],
   8121    invalid_values: [
   8122      "none",
   8123      "groove",
   8124      "ridge",
   8125      "inset",
   8126      "outset",
   8127      "solid dashed",
   8128      "wave",
   8129    ],
   8130  },
   8131  "text-decoration-thickness": {
   8132    domProp: "textDecorationThickness",
   8133    inherited: false,
   8134    type: CSS_TYPE_LONGHAND,
   8135    applies_to_first_letter: true,
   8136    applies_to_first_line: true,
   8137    applies_to_placeholder: true,
   8138    applies_to_cue: true,
   8139    initial_values: ["auto"],
   8140    other_values: [
   8141      "from-font",
   8142      "0",
   8143      "-14px",
   8144      "25px",
   8145      "100em",
   8146      "-45em",
   8147      "43%",
   8148      "-10%",
   8149    ],
   8150    invalid_values: ["13", "-25", "rubbish", ",./!@#$", "from font", "stretch"],
   8151  },
   8152  "text-decoration-skip-ink": {
   8153    domProp: "textDecorationSkipInk",
   8154    inherited: true,
   8155    type: CSS_TYPE_LONGHAND,
   8156    applies_to_first_letter: true,
   8157    applies_to_first_line: true,
   8158    applies_to_placeholder: true,
   8159    initial_values: ["auto"],
   8160    other_values: ["none", "all"],
   8161    invalid_values: [
   8162      "13",
   8163      "15%",
   8164      "-1",
   8165      "0",
   8166      "otto",
   8167      "trash",
   8168      "non",
   8169      "nada",
   8170      "!@#$%^",
   8171      "none auto",
   8172      "auto none",
   8173    ],
   8174  },
   8175  "text-underline-offset": {
   8176    domProp: "textUnderlineOffset",
   8177    inherited: true,
   8178    type: CSS_TYPE_LONGHAND,
   8179    applies_to_first_letter: true,
   8180    applies_to_first_line: true,
   8181    applies_to_placeholder: true,
   8182    initial_values: ["auto"],
   8183    other_values: ["0", "-14px", "25px", "100em", "-45em", "43%", "-10%"],
   8184    invalid_values: [
   8185      "13",
   8186      "-25",
   8187      "rubbish",
   8188      ",./!@#$",
   8189      "from-font",
   8190      "from font",
   8191      "stretch",
   8192    ],
   8193  },
   8194  "text-underline-position": {
   8195    domProp: "textUnderlinePosition",
   8196    inherited: true,
   8197    type: CSS_TYPE_LONGHAND,
   8198    applies_to_first_letter: true,
   8199    applies_to_first_line: true,
   8200    applies_to_placeholder: true,
   8201    initial_values: ["auto"],
   8202    other_values: [
   8203      "under",
   8204      "left",
   8205      "right",
   8206      "left under",
   8207      "under left",
   8208      "right under",
   8209      "under right",
   8210      "from-font",
   8211      "from-font left",
   8212      "from-font right",
   8213      "left from-font",
   8214      "right from-font",
   8215    ],
   8216    invalid_values: [
   8217      "none",
   8218      "auto from-font",
   8219      "auto under",
   8220      "under from-font",
   8221      "left right",
   8222      "right auto",
   8223      "0",
   8224      "1px",
   8225      "10%",
   8226      "from font",
   8227    ],
   8228  },
   8229  "text-emphasis": {
   8230    domProp: "textEmphasis",
   8231    inherited: true,
   8232    type: CSS_TYPE_TRUE_SHORTHAND,
   8233    prerequisites: { color: "black" },
   8234    subproperties: ["text-emphasis-style", "text-emphasis-color"],
   8235    initial_values: [
   8236      "none currentColor",
   8237      "currentColor none",
   8238      "none",
   8239      "currentColor",
   8240      "none black",
   8241    ],
   8242    other_values: [
   8243      "filled dot black",
   8244      "#f00 circle open",
   8245      "sesame filled rgba(0,0,255,0.5)",
   8246      "red",
   8247      "green none",
   8248      "currentColor filled",
   8249      "currentColor open",
   8250    ],
   8251    invalid_values: [
   8252      "filled black dot",
   8253      "filled filled red",
   8254      "open open circle #000",
   8255      "circle dot #f00",
   8256      "rubbish",
   8257    ],
   8258  },
   8259  "text-emphasis-color": {
   8260    domProp: "textEmphasisColor",
   8261    inherited: true,
   8262    type: CSS_TYPE_LONGHAND,
   8263    applies_to_marker: true,
   8264    prerequisites: { color: "black" },
   8265    initial_values: ["currentColor", "black", "rgb(0,0,0)"],
   8266    other_values: ["red", "rgba(255,255,255,0.5)", "transparent"],
   8267    invalid_values: [
   8268      "#0",
   8269      "#00",
   8270      "#00000",
   8271      "#0000000",
   8272      "#000000000",
   8273      "000000",
   8274      "ff00ff",
   8275      "rgb(255,xxx,255)",
   8276    ],
   8277  },
   8278  "text-emphasis-position": {
   8279    domProp: "textEmphasisPosition",
   8280    inherited: true,
   8281    type: CSS_TYPE_LONGHAND,
   8282    applies_to_marker: true,
   8283    initial_values: ["auto"],
   8284    other_values: [
   8285      "over right",
   8286      "right over",
   8287      "over",
   8288      "over left",
   8289      "left over",
   8290      "under left",
   8291      "left under",
   8292      "under right",
   8293      "right under",
   8294      "under",
   8295    ],
   8296    invalid_values: [
   8297      "auto auto",
   8298      "auto over",
   8299      "auto right",
   8300      "left auto",
   8301      "left right",
   8302      "over under right",
   8303      "over over",
   8304      "left left",
   8305      "over right left",
   8306      "rubbish left",
   8307      "over rubbish",
   8308    ],
   8309  },
   8310  "text-emphasis-style": {
   8311    domProp: "textEmphasisStyle",
   8312    inherited: true,
   8313    type: CSS_TYPE_LONGHAND,
   8314    applies_to_marker: true,
   8315    initial_values: ["none"],
   8316    other_values: [
   8317      "filled",
   8318      "open",
   8319      "dot",
   8320      "circle",
   8321      "double-circle",
   8322      "triangle",
   8323      "sesame",
   8324      "'#'",
   8325      "filled dot",
   8326      "filled circle",
   8327      "filled double-circle",
   8328      "filled triangle",
   8329      "filled sesame",
   8330      "dot filled",
   8331      "circle filled",
   8332      "double-circle filled",
   8333      "triangle filled",
   8334      "sesame filled",
   8335      "dot open",
   8336      "circle open",
   8337      "double-circle open",
   8338      "triangle open",
   8339      "sesame open",
   8340    ],
   8341    invalid_values: [
   8342      "rubbish",
   8343      "dot rubbish",
   8344      "rubbish dot",
   8345      "open rubbish",
   8346      "rubbish open",
   8347      "open filled",
   8348      "dot circle",
   8349      "open '#'",
   8350      "'#' filled",
   8351      "dot '#'",
   8352      "'#' circle",
   8353      "1",
   8354      "1 open",
   8355      "open 1",
   8356    ],
   8357  },
   8358  "text-indent": {
   8359    domProp: "textIndent",
   8360    inherited: true,
   8361    type: CSS_TYPE_LONGHAND,
   8362    initial_values: ["0", "calc(3em - 5em + 2px + 2em - 2px)"],
   8363    other_values: [
   8364      "2em",
   8365      "5%",
   8366      "-10px",
   8367      "calc(2px)",
   8368      "calc(-2px)",
   8369      "calc(50%)",
   8370      "calc(3*25px)",
   8371      "calc(25px*3)",
   8372      "calc(3*25px + 50%)",
   8373      "2em hanging",
   8374      "5% each-line",
   8375      "-10px hanging each-line",
   8376      "hanging calc(2px)",
   8377      "each-line calc(-2px)",
   8378      "each-line calc(50%) hanging",
   8379      "hanging calc(3*25px) each-line",
   8380      "each-line hanging calc(25px*3)",
   8381    ],
   8382    invalid_values: [
   8383      "stretch",
   8384      "hanging",
   8385      "each-line",
   8386      "-10px hanging hanging",
   8387      "each-line calc(2px) each-line",
   8388    ],
   8389    quirks_values: { 5: "5px" },
   8390  },
   8391  "text-overflow": {
   8392    domProp: "textOverflow",
   8393    inherited: false,
   8394    type: CSS_TYPE_LONGHAND,
   8395    applies_to_placeholder: true,
   8396    initial_values: ["clip"],
   8397    other_values: [
   8398      "ellipsis",
   8399      '""',
   8400      "''",
   8401      '"hello"',
   8402      "clip clip",
   8403      "ellipsis ellipsis",
   8404      "clip ellipsis",
   8405      'clip ""',
   8406      '"hello" ""',
   8407      '"" ellipsis',
   8408    ],
   8409    invalid_values: [
   8410      "none",
   8411      "auto",
   8412      '"hello" inherit',
   8413      'inherit "hello"',
   8414      "clip initial",
   8415      "initial clip",
   8416      "initial inherit",
   8417      "inherit initial",
   8418      "inherit none",
   8419      '"hello" unset',
   8420      'unset "hello"',
   8421      "clip unset",
   8422      "unset clip",
   8423      "unset inherit",
   8424      "unset none",
   8425      "initial unset",
   8426    ],
   8427  },
   8428  "text-shadow": {
   8429    domProp: "textShadow",
   8430    inherited: true,
   8431    type: CSS_TYPE_LONGHAND,
   8432    applies_to_first_letter: true,
   8433    applies_to_first_line: true,
   8434    applies_to_marker: true,
   8435    applies_to_placeholder: true,
   8436    applies_to_cue: true,
   8437    prerequisites: { color: "blue" },
   8438    initial_values: ["none"],
   8439    other_values: [
   8440      "2px 2px",
   8441      "2px 2px 1px",
   8442      "2px 2px green",
   8443      "2px 2px 1px green",
   8444      "green 2px 2px",
   8445      "green 2px 2px 1px",
   8446      "green 2px 2px, blue 1px 3px 4px",
   8447      "currentColor 3px 3px",
   8448      "blue 2px 2px, currentColor 1px 2px",
   8449      /* calc() values */
   8450      "2px 2px calc(-5px)" /* clamped */,
   8451      "calc(3em - 2px) 2px green",
   8452      "green calc(3em - 2px) 2px",
   8453      "2px calc(2px + 0.2em)",
   8454      "blue 2px calc(2px + 0.2em)",
   8455      "2px calc(2px + 0.2em) blue",
   8456      "calc(-2px) calc(-2px)",
   8457      "-2px -2px",
   8458      "calc(2px) calc(2px)",
   8459      "calc(2px) calc(2px) calc(2px)",
   8460    ],
   8461    invalid_values: [
   8462      "3% 3%",
   8463      "2px 2px -5px",
   8464      "2px 2px 2px 2px",
   8465      "2px 2px, none",
   8466      "none, 2px 2px",
   8467      "inherit, 2px 2px",
   8468      "2px 2px, inherit",
   8469      "2 2px",
   8470      "2px 2",
   8471      "2px 2px 2",
   8472      "2px 2px 2px 2",
   8473      "calc(2px) calc(2px) calc(2px) calc(2px)",
   8474      "3px 3px calc(3px + rubbish)",
   8475      "unset, 2px 2px",
   8476      "2px 2px, unset",
   8477    ],
   8478  },
   8479  "text-transform": {
   8480    domProp: "textTransform",
   8481    inherited: true,
   8482    type: CSS_TYPE_LONGHAND,
   8483    applies_to_first_letter: true,
   8484    applies_to_first_line: true,
   8485    applies_to_placeholder: true,
   8486    applies_to_marker: true,
   8487    initial_values: ["none"],
   8488    other_values: [
   8489      "capitalize",
   8490      "uppercase",
   8491      "lowercase",
   8492      "full-width",
   8493      "full-size-kana",
   8494      "uppercase full-width",
   8495      "full-size-kana capitalize",
   8496      "full-width lowercase full-size-kana",
   8497    ],
   8498    invalid_values: [
   8499      "none none",
   8500      "none uppercase",
   8501      "full-width none",
   8502      "uppercase lowercase",
   8503      "full-width capitalize full-width",
   8504      "uppercase full-width lowercase",
   8505    ],
   8506  },
   8507  "text-wrap": {
   8508    domProp: "textWrap",
   8509    inherited: true,
   8510    type: CSS_TYPE_TRUE_SHORTHAND,
   8511    subproperties: ["text-wrap-mode", "text-wrap-style"],
   8512    applies_to_placeholder: true,
   8513    applies_to_cue: true,
   8514    applies_to_marker: true,
   8515    initial_values: ["wrap"],
   8516    other_values: [
   8517      "nowrap",
   8518      "stable",
   8519      "balance",
   8520      "wrap stable",
   8521      "nowrap balance",
   8522    ],
   8523    invalid_values: [],
   8524  },
   8525  "text-wrap-mode": {
   8526    domProp: "textWrapMode",
   8527    inherited: true,
   8528    type: CSS_TYPE_LONGHAND,
   8529    applies_to_cue: true,
   8530    applies_to_placeholder: true,
   8531    applies_to_marker: true,
   8532    initial_values: ["wrap"],
   8533    other_values: ["nowrap"],
   8534    invalid_values: ["none", "normal", "on", "off", "wrap nowrap"],
   8535  },
   8536  top: {
   8537    domProp: "top",
   8538    inherited: false,
   8539    type: CSS_TYPE_LONGHAND,
   8540    /* FIXME: run tests with multiple prerequisites */
   8541    prerequisites: { position: "relative" },
   8542    /* XXX 0 may or may not be equal to auto */
   8543    initial_values: ["auto"],
   8544    other_values: [
   8545      "32px",
   8546      "-3em",
   8547      "12%",
   8548      "calc(2px)",
   8549      "calc(-2px)",
   8550      "calc(50%)",
   8551      "calc(3*25px)",
   8552      "calc(25px*3)",
   8553      "calc(3*25px + 50%)",
   8554    ],
   8555    invalid_values: ["stretch"],
   8556    quirks_values: { 5: "5px" },
   8557  },
   8558  transition: {
   8559    domProp: "transition",
   8560    inherited: false,
   8561    type: CSS_TYPE_TRUE_SHORTHAND,
   8562    applies_to_marker: true,
   8563    subproperties: [
   8564      "transition-property",
   8565      "transition-duration",
   8566      "transition-timing-function",
   8567      "transition-delay",
   8568      "transition-behavior",
   8569    ],
   8570    initial_values: ["all 0s ease 0s", "all", "0s", "0s 0s", "ease", "normal"],
   8571    other_values: [
   8572      "all 0s cubic-bezier(0.25, 0.1, 0.25, 1.0) 0s",
   8573      "width 1s linear 2s",
   8574      "width 1s 2s linear",
   8575      "width linear 1s 2s",
   8576      "linear width 1s 2s",
   8577      "linear 1s width 2s",
   8578      "linear 1s 2s width",
   8579      "1s width linear 2s",
   8580      "1s width 2s linear",
   8581      "1s 2s width linear",
   8582      "1s linear width 2s",
   8583      "1s linear 2s width",
   8584      "1s 2s linear width",
   8585      "width linear 1s",
   8586      "width 1s linear",
   8587      "linear width 1s",
   8588      "linear 1s width",
   8589      "1s width linear",
   8590      "1s linear width",
   8591      "1s 2s width",
   8592      "1s width 2s",
   8593      "width 1s 2s",
   8594      "1s 2s linear",
   8595      "1s linear 2s",
   8596      "linear 1s 2s",
   8597      "width 1s",
   8598      "1s width",
   8599      "linear 1s",
   8600      "1s linear",
   8601      "1s 2s",
   8602      "2s 1s",
   8603      "width",
   8604      "linear",
   8605      "1s",
   8606      "height",
   8607      "2s",
   8608      "ease-in-out",
   8609      "2s ease-in",
   8610      "opacity linear",
   8611      "ease-out 2s",
   8612      "2s color, 1s width, 500ms height linear, 1s opacity 4s cubic-bezier(0.0, 0.1, 1.0, 1.0)",
   8613      "1s \\32width linear 2s",
   8614      "1s -width linear 2s",
   8615      "1s -\\32width linear 2s",
   8616      "1s \\32 0width linear 2s",
   8617      "1s -\\32 0width linear 2s",
   8618      "1s \\2width linear 2s",
   8619      "1s -\\2width linear 2s",
   8620      "2s, 1s width",
   8621      "1s width, 2s",
   8622      "2s all, 1s width",
   8623      "1s width, 2s all",
   8624      "2s all, 1s width",
   8625      "2s width, 1s all",
   8626      "3s --my-color",
   8627      "none",
   8628      "none 2s linear 2s",
   8629      "allow-discrete",
   8630      "width allow-discrete",
   8631      "1s allow-discrete",
   8632      "linear allow-discrete",
   8633    ],
   8634    invalid_values: [
   8635      "1s width, 2s none",
   8636      "2s none, 1s width",
   8637      "2s inherit",
   8638      "inherit 2s",
   8639      "2s width, 1s inherit",
   8640      "2s inherit, 1s width",
   8641      "2s initial",
   8642      "1s width,,2s color",
   8643      "1s width, ,2s color",
   8644      "bounce 1s cubic-bezier(0, rubbish) 2s",
   8645      "bounce 1s steps(rubbish) 2s",
   8646      "2s unset",
   8647    ],
   8648  },
   8649  "transition-behavior": {
   8650    domProp: "transitionBehavior",
   8651    inherited: false,
   8652    type: CSS_TYPE_LONGHAND,
   8653    applies_to_marker: true,
   8654    initial_values: ["normal"],
   8655    other_values: ["allow-discrete"],
   8656    invalid_values: ["none", "auto", "discrete"],
   8657  },
   8658  "transition-delay": {
   8659    domProp: "transitionDelay",
   8660    inherited: false,
   8661    type: CSS_TYPE_LONGHAND,
   8662    applies_to_marker: true,
   8663    initial_values: ["0s", "0ms"],
   8664    other_values: ["1s", "250ms", "-100ms", "-1s", "1s, 250ms, 2.3s"],
   8665    invalid_values: ["0", "0px"],
   8666  },
   8667  "transition-duration": {
   8668    domProp: "transitionDuration",
   8669    inherited: false,
   8670    type: CSS_TYPE_LONGHAND,
   8671    applies_to_marker: true,
   8672    initial_values: ["0s", "0ms"],
   8673    other_values: ["1s", "250ms", "1s, 250ms, 2.3s"],
   8674    invalid_values: ["0", "0px", "-1ms", "-2s"],
   8675  },
   8676  "transition-property": {
   8677    domProp: "transitionProperty",
   8678    inherited: false,
   8679    type: CSS_TYPE_LONGHAND,
   8680    applies_to_marker: true,
   8681    initial_values: ["all"],
   8682    other_values: [
   8683      "none",
   8684      "left",
   8685      "top",
   8686      "color",
   8687      "width, height, opacity",
   8688      "foobar",
   8689      "auto",
   8690      "\\32width",
   8691      "-width",
   8692      "-\\32width",
   8693      "\\32 0width",
   8694      "-\\32 0width",
   8695      "\\2width",
   8696      "-\\2width",
   8697      "all, all",
   8698      "all, color",
   8699      "color, all",
   8700      "--my-color",
   8701    ],
   8702    invalid_values: [
   8703      "none, none",
   8704      "color, none",
   8705      "none, color",
   8706      "inherit, color",
   8707      "color, inherit",
   8708      "initial, color",
   8709      "color, initial",
   8710      "none, color",
   8711      "color, none",
   8712      "unset, color",
   8713      "color, unset",
   8714    ],
   8715  },
   8716  "transition-timing-function": {
   8717    domProp: "transitionTimingFunction",
   8718    inherited: false,
   8719    type: CSS_TYPE_LONGHAND,
   8720    applies_to_marker: true,
   8721    initial_values: ["ease"],
   8722    other_values: [
   8723      "cubic-bezier(0.25, 0.1, 0.25, 1.0)",
   8724      "linear",
   8725      "ease-in",
   8726      "ease-out",
   8727      "ease-in-out",
   8728      "linear, ease-in, cubic-bezier(0.1, 0.2, 0.8, 0.9)",
   8729      "cubic-bezier(0.5, 0.5, 0.5, 0.5)",
   8730      "cubic-bezier(0.25, 1.5, 0.75, -0.5)",
   8731      "step-start",
   8732      "step-end",
   8733      "steps(1)",
   8734      "steps(2, start)",
   8735      "steps(386)",
   8736      "steps(3, end)",
   8737      "steps(1, jump-start)",
   8738      "steps(1, jump-end)",
   8739      "steps(2, jump-none)",
   8740      "steps(1, jump-both)",
   8741    ],
   8742    invalid_values: [
   8743      "none",
   8744      "auto",
   8745      "cubic-bezier(0.25, 0.1, 0.25)",
   8746      "cubic-bezier(0.25, 0.1, 0.25, 0.25, 1.0)",
   8747      "cubic-bezier(-0.5, 0.5, 0.5, 0.5)",
   8748      "cubic-bezier(1.5, 0.5, 0.5, 0.5)",
   8749      "cubic-bezier(0.5, 0.5, -0.5, 0.5)",
   8750      "cubic-bezier(0.5, 0.5, 1.5, 0.5)",
   8751      "steps(2, step-end)",
   8752      "steps(0)",
   8753      "steps(-2)",
   8754      "steps(0, step-end, 1)",
   8755      "steps(0, jump-start)",
   8756      "steps(0, jump-end)",
   8757      "steps(1, jump-none)",
   8758      "steps(0, jump-both)",
   8759    ],
   8760  },
   8761  "unicode-bidi": {
   8762    domProp: "unicodeBidi",
   8763    inherited: false,
   8764    type: CSS_TYPE_LONGHAND,
   8765    applies_to_marker: true,
   8766    initial_values: ["normal"],
   8767    other_values: [
   8768      "embed",
   8769      "bidi-override",
   8770      "isolate",
   8771      "plaintext",
   8772      "isolate-override",
   8773    ],
   8774    invalid_values: [
   8775      "auto",
   8776      "none",
   8777      "-moz-isolate",
   8778      "-moz-plaintext",
   8779      "-moz-isolate-override",
   8780    ],
   8781  },
   8782  "vertical-align": {
   8783    domProp: "verticalAlign",
   8784    inherited: false,
   8785    type: CSS_TYPE_LONGHAND,
   8786    applies_to_first_letter: true,
   8787    applies_to_first_line: true,
   8788    applies_to_placeholder: true,
   8789    initial_values: ["baseline"],
   8790    other_values: [
   8791      "sub",
   8792      "super",
   8793      "top",
   8794      "text-top",
   8795      "middle",
   8796      "bottom",
   8797      "text-bottom",
   8798      "-moz-middle-with-baseline",
   8799      "15%",
   8800      "3px",
   8801      "0.2em",
   8802      "-5px",
   8803      "-3%",
   8804      "calc(2px)",
   8805      "calc(-2px)",
   8806      "calc(50%)",
   8807      "calc(3*25px)",
   8808      "calc(25px*3)",
   8809      "calc(3*25px + 50%)",
   8810    ],
   8811    invalid_values: [],
   8812    quirks_values: { 5: "5px" },
   8813  },
   8814  "baseline-source": {
   8815    domProp: "baselineSource",
   8816    inherited: false,
   8817    type: CSS_TYPE_LONGHAND,
   8818    applies_to_first_letter: true,
   8819    applies_to_first_line: true,
   8820    applies_to_placeholder: true,
   8821    initial_values: ["auto"],
   8822    other_values: ["first", "last"],
   8823    invalid_values: [],
   8824  },
   8825  visibility: {
   8826    domProp: "visibility",
   8827    inherited: true,
   8828    type: CSS_TYPE_LONGHAND,
   8829    applies_to_cue: true,
   8830    initial_values: ["visible"],
   8831    other_values: ["hidden", "collapse"],
   8832    invalid_values: [],
   8833  },
   8834  "white-space": {
   8835    domProp: "whiteSpace",
   8836    inherited: true,
   8837    type: CSS_TYPE_TRUE_SHORTHAND,
   8838    subproperties: ["white-space-collapse", "text-wrap-mode"],
   8839    applies_to_placeholder: true,
   8840    applies_to_cue: true,
   8841    applies_to_marker: true,
   8842    initial_values: ["normal"],
   8843    other_values: ["pre", "nowrap", "pre-wrap", "pre-line", "break-spaces"],
   8844    invalid_values: [],
   8845  },
   8846  "white-space-collapse": {
   8847    domProp: "whiteSpaceCollapse",
   8848    inherited: true,
   8849    type: CSS_TYPE_LONGHAND,
   8850    applies_to_placeholder: true,
   8851    applies_to_cue: true,
   8852    applies_to_marker: true,
   8853    initial_values: ["collapse"],
   8854    other_values: [
   8855      "preserve",
   8856      "preserve-breaks",
   8857      "preserve-spaces",
   8858      "break-spaces",
   8859      "-moz-pre-space",
   8860    ],
   8861    invalid_values: ["normal", "auto"],
   8862  },
   8863  width: {
   8864    domProp: "width",
   8865    inherited: false,
   8866    type: CSS_TYPE_LONGHAND,
   8867    prerequisites: {
   8868      // computed value tests for width test more with display:block
   8869      display: "block",
   8870      // add some margin to avoid the initial "auto" value getting
   8871      // resolved to the same length as the parent element.
   8872      "margin-left": "5px",
   8873    },
   8874    initial_values: [" auto"],
   8875    /* XXX these have prerequisites */
   8876    other_values: [
   8877      "15px",
   8878      "3em",
   8879      "15%",
   8880      "max-content",
   8881      "min-content",
   8882      "fit-content",
   8883      "stretch",
   8884      "-moz-max-content",
   8885      "-moz-min-content",
   8886      "-moz-fit-content",
   8887      "-moz-available",
   8888      "-webkit-fill-available",
   8889      "3e1px",
   8890      "3e+1px",
   8891      "3e0px",
   8892      "3e+0px",
   8893      "3e-0px",
   8894      "3e-1px",
   8895      "3.2e1px",
   8896      "3.2e+1px",
   8897      "3.2e0px",
   8898      "3.2e+0px",
   8899      "3.2e-0px",
   8900      "3.2e-1px",
   8901      "3e1%",
   8902      "3e+1%",
   8903      "3e0%",
   8904      "3e+0%",
   8905      "3e-0%",
   8906      "3e-1%",
   8907      "3.2e1%",
   8908      "3.2e+1%",
   8909      "3.2e0%",
   8910      "3.2e+0%",
   8911      "3.2e-0%",
   8912      "3.2e-1%",
   8913      /* valid calc() values */
   8914      "calc(-2px)",
   8915      "calc(2px)",
   8916      "calc(50%)",
   8917      "calc(50% + 2px)",
   8918      "calc( 50% + 2px)",
   8919      "calc(50% + 2px )",
   8920      "calc( 50% + 2px )",
   8921      "calc(50% - -2px)",
   8922      "calc(2px - -50%)",
   8923      "calc(3*25px)",
   8924      "calc(3 *25px)",
   8925      "calc(3 * 25px)",
   8926      "calc(3* 25px)",
   8927      "calc(25px*3)",
   8928      "calc(25px *3)",
   8929      "calc(25px* 3)",
   8930      "calc(25px * 3)",
   8931      "calc(3*25px + 50%)",
   8932      "calc(50% - 3em + 2px)",
   8933      "calc(50% - (3em + 2px))",
   8934      "calc((50% - 3em) + 2px)",
   8935      "calc(2em)",
   8936      "calc(50%)",
   8937      "calc(50px/2)",
   8938      "calc(50px/(2 - 1))",
   8939      "calc(min(5px))",
   8940      "calc(min(5px,2em))",
   8941      "calc(max(5px))",
   8942      "calc(max(5px,2em))",
   8943      "min(5px)",
   8944      "min(5px,2em)",
   8945      "max(5px)",
   8946      "max(5px,2em)",
   8947      "fit-content(100px)",
   8948      "fit-content(10%)",
   8949      "fit-content(calc(3*25px + 50%))",
   8950    ],
   8951    invalid_values: [
   8952      "none",
   8953      "-2px",
   8954      "content" /* (valid for 'flex-basis' but not 'width') */,
   8955      /* invalid calc() values */
   8956      "calc(50%+ 2px)",
   8957      "calc(50% +2px)",
   8958      "calc(50%+2px)",
   8959      "-moz-min()",
   8960      "calc(min())",
   8961      "-moz-max()",
   8962      "calc(max())",
   8963      "-moz-min(5px)",
   8964      "-moz-max(5px)",
   8965      "-moz-min(5px,2em)",
   8966      "-moz-max(5px,2em)",
   8967      /* If we ever support division by values, which is
   8968       * complicated for the reasons described in
   8969       * http://lists.w3.org/Archives/Public/www-style/2010Jan/0007.html
   8970       * , we should support all 4 of these as described in
   8971       * http://lists.w3.org/Archives/Public/www-style/2009Dec/0296.html
   8972       */
   8973      "calc((3em / 100%) * 3em)",
   8974      "calc(3em / 100% * 3em)",
   8975      "calc(3em * (3em / 100%))",
   8976      "calc(3em * 3em / 100%)",
   8977    ],
   8978    quirks_values: { 5: "5px" },
   8979  },
   8980  "will-change": {
   8981    domProp: "willChange",
   8982    inherited: false,
   8983    type: CSS_TYPE_LONGHAND,
   8984    initial_values: ["auto"],
   8985    other_values: [
   8986      "scroll-position",
   8987      "contents",
   8988      "transform",
   8989      "opacity",
   8990      "scroll-position, transform",
   8991      "transform, opacity",
   8992      "contents, transform",
   8993      "property-that-doesnt-exist-yet",
   8994    ],
   8995    invalid_values: [
   8996      "none",
   8997      "all",
   8998      "default",
   8999      "auto, scroll-position",
   9000      "scroll-position, auto",
   9001      "transform scroll-position",
   9002      ",",
   9003      "trailing,",
   9004      "will-change",
   9005      "transform, will-change",
   9006    ],
   9007  },
   9008  "word-break": {
   9009    domProp: "wordBreak",
   9010    inherited: true,
   9011    type: CSS_TYPE_LONGHAND,
   9012    initial_values: ["normal"],
   9013    other_values: ["break-all", "keep-all"],
   9014    invalid_values: [],
   9015  },
   9016  "word-spacing": {
   9017    domProp: "wordSpacing",
   9018    inherited: true,
   9019    type: CSS_TYPE_LONGHAND,
   9020    applies_to_first_letter: true,
   9021    applies_to_first_line: true,
   9022    applies_to_placeholder: true,
   9023    initial_values: ["normal", "0", "0px", "-0em", "calc(-0px)", "calc(0em)"],
   9024    other_values: [
   9025      "1em",
   9026      "2px",
   9027      "-3px",
   9028      "0%",
   9029      "50%",
   9030      "-120%",
   9031      "calc(1em)",
   9032      "calc(1em + 3px)",
   9033      "calc(15px / 2)",
   9034      "calc(15px/2)",
   9035      "calc(-2em)",
   9036      "calc(0% + 0px)",
   9037      "calc(-10%/2 - 1em)",
   9038    ],
   9039    invalid_values: ["stretch"],
   9040    quirks_values: { 5: "5px" },
   9041  },
   9042  "overflow-wrap": {
   9043    domProp: "overflowWrap",
   9044    inherited: true,
   9045    type: CSS_TYPE_LONGHAND,
   9046    initial_values: ["normal"],
   9047    other_values: ["break-word"],
   9048    invalid_values: [],
   9049  },
   9050  hyphens: {
   9051    domProp: "hyphens",
   9052    inherited: true,
   9053    type: CSS_TYPE_LONGHAND,
   9054    applies_to_marker: true,
   9055    initial_values: ["manual"],
   9056    other_values: ["none", "auto"],
   9057    invalid_values: [],
   9058  },
   9059  "z-index": {
   9060    domProp: "zIndex",
   9061    inherited: false,
   9062    type: CSS_TYPE_LONGHAND,
   9063    /* XXX requires position */
   9064    initial_values: ["auto"],
   9065    other_values: ["0", "3", "-7000", "12000"],
   9066    invalid_values: ["3.0", "17.5", "3e1"],
   9067  },
   9068  "clip-path": {
   9069    domProp: "clipPath",
   9070    inherited: false,
   9071    type: CSS_TYPE_LONGHAND,
   9072    initial_values: ["none"],
   9073    other_values: [
   9074      "path(nonzero, 'M 10 10 h 100 v 100 h-100 v-100 z')",
   9075      "path(evenodd, 'M 10 10 h 100 v 100 h-100 v-100 z')",
   9076      "path('M10,30A20,20 0,0,1 50,30A20,20 0,0,1 90,30Q90,60 50,90Q10,60 10,30z')",
   9077      "url(#mypath)",
   9078      "url('404.svg#mypath')",
   9079      "url(#my-clip-path)",
   9080      "margin-box",
   9081    ]
   9082      .concat(basicShapeSVGBoxValues)
   9083      .concat(basicShapeOtherValues)
   9084      .concat(basicShapeOtherValuesWithFillRule)
   9085      .concat(basicShapeXywhRectValues)
   9086      .concat(basicShapeShapeValues)
   9087      .concat(basicShapeShapeValuesWithFillRule),
   9088    invalid_values: [
   9089      "path(nonzero)",
   9090      "path(abs, 'M 10 10 L 10 10 z')",
   9091      "path(evenodd, '')",
   9092      "path('')",
   9093    ].concat(basicShapeInvalidValues),
   9094    unbalanced_values: basicShapeUnbalancedValues,
   9095  },
   9096  "clip-rule": {
   9097    domProp: "clipRule",
   9098    inherited: true,
   9099    type: CSS_TYPE_LONGHAND,
   9100    initial_values: ["nonzero"],
   9101    other_values: ["evenodd"],
   9102    invalid_values: [],
   9103  },
   9104  "color-interpolation": {
   9105    domProp: "colorInterpolation",
   9106    inherited: true,
   9107    type: CSS_TYPE_LONGHAND,
   9108    initial_values: ["sRGB"],
   9109    other_values: ["auto", "linearRGB"],
   9110    invalid_values: [],
   9111  },
   9112  "color-interpolation-filters": {
   9113    domProp: "colorInterpolationFilters",
   9114    inherited: true,
   9115    type: CSS_TYPE_LONGHAND,
   9116    initial_values: ["linearRGB"],
   9117    other_values: ["sRGB", "auto"],
   9118    invalid_values: [],
   9119  },
   9120  "dominant-baseline": {
   9121    domProp: "dominantBaseline",
   9122    inherited: true,
   9123    type: CSS_TYPE_LONGHAND,
   9124    initial_values: ["auto"],
   9125    other_values: [
   9126      "ideographic",
   9127      "alphabetic",
   9128      "hanging",
   9129      "mathematical",
   9130      "central",
   9131      "middle",
   9132      "text-after-edge",
   9133      "text-before-edge",
   9134    ],
   9135    invalid_values: [],
   9136  },
   9137  fill: {
   9138    domProp: "fill",
   9139    inherited: true,
   9140    type: CSS_TYPE_LONGHAND,
   9141    applies_to_first_letter: true,
   9142    applies_to_first_line: true,
   9143    prerequisites: { color: "blue" },
   9144    initial_values: ["black", "#000", "#000000", "rgb(0,0,0)", "rgba(0,0,0,1)"],
   9145    other_values: [
   9146      "green",
   9147      "#fc3",
   9148      "url('#myserver')",
   9149      "url(foo.svg#myserver)",
   9150      'url("#myserver") green',
   9151      "none",
   9152      "currentColor",
   9153      "context-fill",
   9154      "context-stroke",
   9155    ],
   9156    invalid_values: ["000000", "ff00ff", "url('#myserver') rgb(0, rubbish, 0)"],
   9157  },
   9158  "fill-opacity": {
   9159    domProp: "fillOpacity",
   9160    inherited: true,
   9161    type: CSS_TYPE_LONGHAND,
   9162    applies_to_first_letter: true,
   9163    applies_to_first_line: true,
   9164    initial_values: ["1", "2.8", "1.000", "300%"],
   9165    other_values: [
   9166      "0",
   9167      "0.3",
   9168      "-7.3",
   9169      "-100%",
   9170      "50%",
   9171      "context-fill-opacity",
   9172      "context-stroke-opacity",
   9173    ],
   9174    invalid_values: [],
   9175  },
   9176  "fill-rule": {
   9177    domProp: "fillRule",
   9178    inherited: true,
   9179    type: CSS_TYPE_LONGHAND,
   9180    applies_to_first_letter: true,
   9181    applies_to_first_line: true,
   9182    initial_values: ["nonzero"],
   9183    other_values: ["evenodd"],
   9184    invalid_values: [],
   9185  },
   9186  filter: {
   9187    domProp: "filter",
   9188    inherited: false,
   9189    type: CSS_TYPE_LONGHAND,
   9190    initial_values: ["none"],
   9191    other_values: [
   9192      // SVG reference filters
   9193      "url(#my-filter)",
   9194      "url(#my-filter-1) url(#my-filter-2)",
   9195 
   9196      // Filter functions
   9197      "opacity(50%) saturate(1.0)",
   9198      "invert(50%) sepia(0.1) brightness(90%)",
   9199 
   9200      // Mixed SVG reference filters and filter functions
   9201      "grayscale(1) url(#my-filter-1)",
   9202      "url(#my-filter-1) brightness(50%) contrast(0.9)",
   9203 
   9204      // Bad URLs
   9205      "url('badscheme:badurl')",
   9206      "blur(3px) url('badscheme:badurl') grayscale(50%)",
   9207 
   9208      "blur()",
   9209      "blur(0)",
   9210      "blur(0px)",
   9211      "blur(0.5px)",
   9212      "blur(3px)",
   9213      "blur(100px)",
   9214      "blur(0.1em)",
   9215      "blur(calc(-1px))", // Parses and becomes blur(0px).
   9216      "blur(calc(0px))",
   9217      "blur(calc(5px))",
   9218      "blur(calc(2 * 5px))",
   9219 
   9220      "brightness()",
   9221      "brightness(0)",
   9222      "brightness(50%)",
   9223      "brightness(1)",
   9224      "brightness(1.0)",
   9225      "brightness(2)",
   9226      "brightness(350%)",
   9227      "brightness(4.567)",
   9228 
   9229      "contrast()",
   9230      "contrast(0)",
   9231      "contrast(50%)",
   9232      "contrast(1)",
   9233      "contrast(1.0)",
   9234      "contrast(2)",
   9235      "contrast(350%)",
   9236      "contrast(4.567)",
   9237 
   9238      "drop-shadow(2px 2px)",
   9239      "drop-shadow(2px 2px 1px)",
   9240      "drop-shadow(2px 2px green)",
   9241      "drop-shadow(2px 2px 1px green)",
   9242      "drop-shadow(green 2px 2px)",
   9243      "drop-shadow(green 2px 2px 1px)",
   9244      "drop-shadow(currentColor 3px 3px)",
   9245      "drop-shadow(2px 2px calc(-5px))" /* clamped */,
   9246      "drop-shadow(calc(3em - 2px) 2px green)",
   9247      "drop-shadow(green calc(3em - 2px) 2px)",
   9248      "drop-shadow(2px calc(2px + 0.2em))",
   9249      "drop-shadow(blue 2px calc(2px + 0.2em))",
   9250      "drop-shadow(2px calc(2px + 0.2em) blue)",
   9251      "drop-shadow(calc(-2px) calc(-2px))",
   9252      "drop-shadow(-2px -2px)",
   9253      "drop-shadow(calc(2px) calc(2px))",
   9254      "drop-shadow(calc(2px) calc(2px) calc(2px))",
   9255 
   9256      "grayscale()",
   9257      "grayscale(0)",
   9258      "grayscale(50%)",
   9259      "grayscale(1)",
   9260      "grayscale(1.0)",
   9261      "grayscale(2)",
   9262      "grayscale(350%)",
   9263      "grayscale(4.567)",
   9264 
   9265      "hue-rotate()",
   9266      "hue-rotate(0)",
   9267      "hue-rotate(0deg)",
   9268      "hue-rotate(90deg)",
   9269      "hue-rotate(540deg)",
   9270      "hue-rotate(-90deg)",
   9271      "hue-rotate(10grad)",
   9272      "hue-rotate(1.6rad)",
   9273      "hue-rotate(-1.6rad)",
   9274      "hue-rotate(0.5turn)",
   9275      "hue-rotate(-2turn)",
   9276 
   9277      "invert()",
   9278      "invert(0)",
   9279      "invert(50%)",
   9280      "invert(1)",
   9281      "invert(1.0)",
   9282      "invert(2)",
   9283      "invert(350%)",
   9284      "invert(4.567)",
   9285 
   9286      "opacity()",
   9287      "opacity(0)",
   9288      "opacity(50%)",
   9289      "opacity(1)",
   9290      "opacity(1.0)",
   9291      "opacity(2)",
   9292      "opacity(350%)",
   9293      "opacity(4.567)",
   9294 
   9295      "saturate()",
   9296      "saturate(0)",
   9297      "saturate(50%)",
   9298      "saturate(1)",
   9299      "saturate(1.0)",
   9300      "saturate(2)",
   9301      "saturate(350%)",
   9302      "saturate(4.567)",
   9303 
   9304      "sepia()",
   9305      "sepia(0)",
   9306      "sepia(50%)",
   9307      "sepia(1)",
   9308      "sepia(1.0)",
   9309      "sepia(2)",
   9310      "sepia(350%)",
   9311      "sepia(4.567)",
   9312    ],
   9313    invalid_values: [
   9314      // none
   9315      "none none",
   9316      "url(#my-filter) none",
   9317      "none url(#my-filter)",
   9318      "blur(2px) none url(#my-filter)",
   9319 
   9320      // Nested filters
   9321      "grayscale(invert(1.0))",
   9322 
   9323      // Comma delimited filters
   9324      "url(#my-filter),",
   9325      "invert(50%), url(#my-filter), brightness(90%)",
   9326 
   9327      // Test the following situations for each filter function:
   9328      // - Invalid number of arguments
   9329      // - Comma delimited arguments
   9330      // - Wrong argument type
   9331      // - Argument value out of range
   9332      "blur(3px 5px)",
   9333      "blur(3px,)",
   9334      "blur(3px, 5px)",
   9335      "blur(#my-filter)",
   9336      "blur(0.5)",
   9337      "blur(50%)",
   9338      "blur(calc(0))", // Unitless zero in calc is not a valid length.
   9339      "blur(calc(0.1))",
   9340      "blur(calc(10%))",
   9341      "blur(calc(20px - 5%))",
   9342      "blur(-3px)",
   9343 
   9344      "brightness(0.5 0.5)",
   9345      "brightness(0.5,)",
   9346      "brightness(0.5, 0.5)",
   9347      "brightness(#my-filter)",
   9348      "brightness(10px)",
   9349      "brightness(-1)",
   9350 
   9351      "contrast(0.5 0.5)",
   9352      "contrast(0.5,)",
   9353      "contrast(0.5, 0.5)",
   9354      "contrast(#my-filter)",
   9355      "contrast(10px)",
   9356      "contrast(-1)",
   9357 
   9358      "drop-shadow()",
   9359      "drop-shadow(3% 3%)",
   9360      "drop-shadow(2px 2px -5px)",
   9361      "drop-shadow(2px 2px 2px 2px)",
   9362      "drop-shadow(2px 2px, none)",
   9363      "drop-shadow(none, 2px 2px)",
   9364      "drop-shadow(inherit, 2px 2px)",
   9365      "drop-shadow(2px 2px, inherit)",
   9366      "drop-shadow(2 2px)",
   9367      "drop-shadow(2px 2)",
   9368      "drop-shadow(2px 2px 2)",
   9369      "drop-shadow(2px 2px 2px 2)",
   9370      "drop-shadow(calc(2px) calc(2px) calc(2px) calc(2px))",
   9371      "drop-shadow(green 2px 2px, blue 1px 3px 4px)",
   9372      "drop-shadow(blue 2px 2px, currentColor 1px 2px)",
   9373      "drop-shadow(unset, 2px 2px)",
   9374      "drop-shadow(2px 2px, unset)",
   9375 
   9376      "grayscale(0.5 0.5)",
   9377      "grayscale(0.5,)",
   9378      "grayscale(0.5, 0.5)",
   9379      "grayscale(#my-filter)",
   9380      "grayscale(10px)",
   9381      "grayscale(-1)",
   9382 
   9383      "hue-rotate(0.5 0.5)",
   9384      "hue-rotate(0.5,)",
   9385      "hue-rotate(0.5, 0.5)",
   9386      "hue-rotate(#my-filter)",
   9387      "hue-rotate(10px)",
   9388      "hue-rotate(-1)",
   9389      "hue-rotate(45deg,)",
   9390 
   9391      "invert(0.5 0.5)",
   9392      "invert(0.5,)",
   9393      "invert(0.5, 0.5)",
   9394      "invert(#my-filter)",
   9395      "invert(10px)",
   9396      "invert(-1)",
   9397 
   9398      "opacity(0.5 0.5)",
   9399      "opacity(0.5,)",
   9400      "opacity(0.5, 0.5)",
   9401      "opacity(#my-filter)",
   9402      "opacity(10px)",
   9403      "opacity(-1)",
   9404 
   9405      "saturate(0.5 0.5)",
   9406      "saturate(0.5,)",
   9407      "saturate(0.5, 0.5)",
   9408      "saturate(#my-filter)",
   9409      "saturate(10px)",
   9410      "saturate(-1)",
   9411 
   9412      "sepia(0.5 0.5)",
   9413      "sepia(0.5,)",
   9414      "sepia(0.5, 0.5)",
   9415      "sepia(#my-filter)",
   9416      "sepia(10px)",
   9417      "sepia(-1)",
   9418    ],
   9419  },
   9420  "flood-color": {
   9421    domProp: "floodColor",
   9422    inherited: false,
   9423    type: CSS_TYPE_LONGHAND,
   9424    prerequisites: { color: "blue" },
   9425    initial_values: ["black", "#000", "#000000", "rgb(0,0,0)", "rgba(0,0,0,1)"],
   9426    other_values: ["green", "#fc3", "currentColor"],
   9427    invalid_values: [
   9428      "url('#myserver')",
   9429      "url(foo.svg#myserver)",
   9430      'url("#myserver") green',
   9431      "000000",
   9432      "ff00ff",
   9433    ],
   9434  },
   9435  "flood-opacity": {
   9436    domProp: "floodOpacity",
   9437    inherited: false,
   9438    type: CSS_TYPE_LONGHAND,
   9439    initial_values: ["1", "2.8", "1.000", "300%"],
   9440    other_values: ["0", "0.3", "-7.3", "-100%", "50%"],
   9441    invalid_values: [],
   9442  },
   9443  "image-orientation": {
   9444    domProp: "imageOrientation",
   9445    inherited: true,
   9446    type: CSS_TYPE_LONGHAND,
   9447    initial_values: ["from-image"],
   9448    other_values: ["none"],
   9449    invalid_values: ["0", "0deg"],
   9450  },
   9451  "image-rendering": {
   9452    domProp: "imageRendering",
   9453    inherited: true,
   9454    type: CSS_TYPE_LONGHAND,
   9455    initial_values: ["auto"],
   9456    other_values: [
   9457      "optimizeSpeed",
   9458      "optimizeQuality",
   9459      "-moz-crisp-edges",
   9460      "crisp-edges",
   9461      "smooth",
   9462      "pixelated",
   9463    ],
   9464    invalid_values: [],
   9465  },
   9466  isolation: {
   9467    domProp: "isolation",
   9468    inherited: false,
   9469    type: CSS_TYPE_LONGHAND,
   9470    initial_values: ["auto"],
   9471    other_values: ["isolate"],
   9472    invalid_values: [],
   9473  },
   9474  "lighting-color": {
   9475    domProp: "lightingColor",
   9476    inherited: false,
   9477    type: CSS_TYPE_LONGHAND,
   9478    prerequisites: { color: "blue" },
   9479    initial_values: [
   9480      "white",
   9481      "#fff",
   9482      "#ffffff",
   9483      "rgb(255,255,255)",
   9484      "rgba(255,255,255,1.0)",
   9485      "rgba(255,255,255,42.0)",
   9486    ],
   9487    other_values: ["green", "#fc3", "currentColor"],
   9488    invalid_values: [
   9489      "url('#myserver')",
   9490      "url(foo.svg#myserver)",
   9491      'url("#myserver") green',
   9492      "000000",
   9493      "ff00ff",
   9494    ],
   9495  },
   9496  marker: {
   9497    domProp: "marker",
   9498    inherited: true,
   9499    type: CSS_TYPE_TRUE_SHORTHAND,
   9500    subproperties: ["marker-start", "marker-mid", "marker-end"],
   9501    initial_values: ["none"],
   9502    other_values: ["url(#mysym)"],
   9503    invalid_values: [
   9504      "none none",
   9505      "url(#mysym) url(#mysym)",
   9506      "none url(#mysym)",
   9507      "url(#mysym) none",
   9508    ],
   9509  },
   9510  "marker-end": {
   9511    domProp: "markerEnd",
   9512    inherited: true,
   9513    type: CSS_TYPE_LONGHAND,
   9514    initial_values: ["none"],
   9515    other_values: ["url(#mysym)"],
   9516    invalid_values: [],
   9517  },
   9518  "marker-mid": {
   9519    domProp: "markerMid",
   9520    inherited: true,
   9521    type: CSS_TYPE_LONGHAND,
   9522    initial_values: ["none"],
   9523    other_values: ["url(#mysym)"],
   9524    invalid_values: [],
   9525  },
   9526  "marker-start": {
   9527    domProp: "markerStart",
   9528    inherited: true,
   9529    type: CSS_TYPE_LONGHAND,
   9530    initial_values: ["none"],
   9531    other_values: ["url(#mysym)"],
   9532    invalid_values: [],
   9533  },
   9534  "mix-blend-mode": {
   9535    domProp: "mixBlendMode",
   9536    inherited: false,
   9537    type: CSS_TYPE_LONGHAND,
   9538    initial_values: ["normal"],
   9539    other_values: [
   9540      "multiply",
   9541      "screen",
   9542      "overlay",
   9543      "darken",
   9544      "lighten",
   9545      "color-dodge",
   9546      "color-burn",
   9547      "hard-light",
   9548      "soft-light",
   9549      "difference",
   9550      "exclusion",
   9551      "hue",
   9552      "saturation",
   9553      "color",
   9554      "luminosity",
   9555      "plus-lighter",
   9556    ],
   9557    invalid_values: [],
   9558  },
   9559  "shape-image-threshold": {
   9560    domProp: "shapeImageThreshold",
   9561    inherited: false,
   9562    type: CSS_TYPE_LONGHAND,
   9563    applies_to_first_letter: true,
   9564    initial_values: ["0", "0.0000", "-3", "0%", "-100%"],
   9565    other_values: [
   9566      "0.4",
   9567      "1",
   9568      "17",
   9569      "397.376",
   9570      "3e1",
   9571      "3e+1",
   9572      "3e-1",
   9573      "3e0",
   9574      "3e+0",
   9575      "3e-0",
   9576      "50%",
   9577      "300%",
   9578    ],
   9579    invalid_values: ["0px", "1px", "default", "auto"],
   9580  },
   9581  "shape-margin": {
   9582    domProp: "shapeMargin",
   9583    inherited: false,
   9584    type: CSS_TYPE_LONGHAND,
   9585    applies_to_first_letter: true,
   9586    initial_values: ["0"],
   9587    other_values: ["2px", "2%", "1em", "calc(1px + 1em)", "calc(1%)"],
   9588    invalid_values: ["-1px", "auto", "none", "stretch", "1px 1px", "-1%"],
   9589  },
   9590  "shape-outside": {
   9591    domProp: "shapeOutside",
   9592    inherited: false,
   9593    type: CSS_TYPE_LONGHAND,
   9594    applies_to_first_letter: true,
   9595    initial_values: ["none"],
   9596    other_values: ["url(#my-shape-outside)", "margin-box"].concat(
   9597      basicShapeOtherValues,
   9598      basicShapeOtherValuesWithFillRule,
   9599      validNonUrlImageValues
   9600    ),
   9601    invalid_values: [].concat(
   9602      basicShapeSVGBoxValues,
   9603      basicShapeInvalidValues,
   9604      invalidNonUrlImageValues
   9605    ),
   9606    unbalanced_values: [].concat(
   9607      basicShapeUnbalancedValues,
   9608      unbalancedGradientAndElementValues
   9609    ),
   9610  },
   9611  "shape-rendering": {
   9612    domProp: "shapeRendering",
   9613    inherited: true,
   9614    type: CSS_TYPE_LONGHAND,
   9615    initial_values: ["auto"],
   9616    other_values: ["optimizeSpeed", "crispEdges", "geometricPrecision"],
   9617    invalid_values: [],
   9618  },
   9619  "stop-color": {
   9620    domProp: "stopColor",
   9621    inherited: false,
   9622    type: CSS_TYPE_LONGHAND,
   9623    prerequisites: { color: "blue" },
   9624    initial_values: ["black", "#000", "#000000", "rgb(0,0,0)", "rgba(0,0,0,1)"],
   9625    other_values: ["green", "#fc3", "currentColor"],
   9626    invalid_values: [
   9627      "url('#myserver')",
   9628      "url(foo.svg#myserver)",
   9629      'url("#myserver") green',
   9630      "000000",
   9631      "ff00ff",
   9632    ],
   9633  },
   9634  "stop-opacity": {
   9635    domProp: "stopOpacity",
   9636    inherited: false,
   9637    type: CSS_TYPE_LONGHAND,
   9638    initial_values: ["1", "2.8", "1.000", "300%"],
   9639    other_values: ["0", "0.3", "-7.3", "-100%", "50%"],
   9640    invalid_values: [],
   9641  },
   9642  stroke: {
   9643    domProp: "stroke",
   9644    inherited: true,
   9645    type: CSS_TYPE_LONGHAND,
   9646    applies_to_first_letter: true,
   9647    applies_to_first_line: true,
   9648    initial_values: ["none"],
   9649    other_values: [
   9650      "black",
   9651      "#000",
   9652      "#000000",
   9653      "rgb(0,0,0)",
   9654      "rgba(0,0,0,1)",
   9655      "green",
   9656      "#fc3",
   9657      "url('#myserver')",
   9658      "url(foo.svg#myserver)",
   9659      'url("#myserver") green',
   9660      "currentColor",
   9661      "context-fill",
   9662      "context-stroke",
   9663    ],
   9664    invalid_values: ["000000", "ff00ff"],
   9665  },
   9666  "stroke-dasharray": {
   9667    domProp: "strokeDasharray",
   9668    inherited: true,
   9669    type: CSS_TYPE_LONGHAND,
   9670    applies_to_first_letter: true,
   9671    applies_to_first_line: true,
   9672    initial_values: ["none"],
   9673    other_values: [
   9674      "5px,3px,2px",
   9675      "5px 3px 2px",
   9676      "  5px ,3px\t, 2px ",
   9677      "1px",
   9678      "5%",
   9679      "3em",
   9680      "0.0002",
   9681      "context-value",
   9682    ],
   9683    invalid_values: ["stretch", "-5px,3px,2px", "5px,3px,-2px"],
   9684  },
   9685  "stroke-dashoffset": {
   9686    domProp: "strokeDashoffset",
   9687    inherited: true,
   9688    applies_to_first_letter: true,
   9689    applies_to_first_line: true,
   9690    type: CSS_TYPE_LONGHAND,
   9691    initial_values: ["0", "-0px", "0em"],
   9692    other_values: ["3px", "3%", "1em", "0.0002", "context-value"],
   9693    invalid_values: ["stretch"],
   9694  },
   9695  "stroke-linecap": {
   9696    domProp: "strokeLinecap",
   9697    inherited: true,
   9698    type: CSS_TYPE_LONGHAND,
   9699    applies_to_first_letter: true,
   9700    applies_to_first_line: true,
   9701    initial_values: ["butt"],
   9702    other_values: ["round", "square"],
   9703    invalid_values: [],
   9704  },
   9705  "stroke-linejoin": {
   9706    domProp: "strokeLinejoin",
   9707    inherited: true,
   9708    type: CSS_TYPE_LONGHAND,
   9709    applies_to_first_letter: true,
   9710    applies_to_first_line: true,
   9711    initial_values: ["miter"],
   9712    other_values: ["round", "bevel"],
   9713    invalid_values: [],
   9714  },
   9715  "stroke-miterlimit": {
   9716    domProp: "strokeMiterlimit",
   9717    inherited: true,
   9718    type: CSS_TYPE_LONGHAND,
   9719    applies_to_first_letter: true,
   9720    applies_to_first_line: true,
   9721    initial_values: ["4"],
   9722    other_values: ["0", "0.9", "1", "7", "5000", "1.1"],
   9723    invalid_values: ["-1", "3px", "-0.3"],
   9724  },
   9725  "stroke-opacity": {
   9726    domProp: "strokeOpacity",
   9727    inherited: true,
   9728    type: CSS_TYPE_LONGHAND,
   9729    applies_to_first_letter: true,
   9730    applies_to_first_line: true,
   9731    initial_values: ["1", "2.8", "1.000", "300%"],
   9732    other_values: [
   9733      "0",
   9734      "0.3",
   9735      "-7.3",
   9736      "-100%",
   9737      "50%",
   9738      "context-fill-opacity",
   9739      "context-stroke-opacity",
   9740    ],
   9741    invalid_values: [],
   9742  },
   9743  "stroke-width": {
   9744    domProp: "strokeWidth",
   9745    inherited: true,
   9746    type: CSS_TYPE_LONGHAND,
   9747    applies_to_first_letter: true,
   9748    applies_to_first_line: true,
   9749    initial_values: ["1px"],
   9750    other_values: [
   9751      "0",
   9752      "0px",
   9753      "-0em",
   9754      "17px",
   9755      "0.2em",
   9756      "0.0002",
   9757      "context-value",
   9758    ],
   9759    invalid_values: ["stretch", "-0.1px", "-3px"],
   9760  },
   9761  x: {
   9762    domProp: "x",
   9763    inherited: false,
   9764    type: CSS_TYPE_LONGHAND,
   9765    initial_values: ["0px"],
   9766    other_values: ["-1em", "17px", "0.2em", "23.4%"],
   9767    invalid_values: ["stretch", "auto", "context-value", "0.0002"],
   9768  },
   9769  y: {
   9770    domProp: "y",
   9771    inherited: false,
   9772    type: CSS_TYPE_LONGHAND,
   9773    initial_values: ["0px"],
   9774    other_values: ["-1em", "17px", "0.2em", "23.4%"],
   9775    invalid_values: ["stretch", "auto", "context-value", "0.0002"],
   9776  },
   9777  cx: {
   9778    domProp: "cx",
   9779    inherited: false,
   9780    type: CSS_TYPE_LONGHAND,
   9781    initial_values: ["0px"],
   9782    other_values: ["-1em", "17px", "0.2em", "23.4%"],
   9783    invalid_values: ["stretch", "auto", "context-value", "0.0002"],
   9784  },
   9785  cy: {
   9786    domProp: "cy",
   9787    inherited: false,
   9788    type: CSS_TYPE_LONGHAND,
   9789    initial_values: ["0px"],
   9790    other_values: ["-1em", "17px", "0.2em", "23.4%"],
   9791    invalid_values: ["stretch", "auto", "context-value", "0.0002"],
   9792  },
   9793  r: {
   9794    domProp: "r",
   9795    inherited: false,
   9796    type: CSS_TYPE_LONGHAND,
   9797    initial_values: ["0px"],
   9798    other_values: ["17px", "0.2em", "23.4%"],
   9799    invalid_values: ["stretch", "auto", "-1", "-1.5px", "0.0002"],
   9800  },
   9801  rx: {
   9802    domProp: "rx",
   9803    inherited: false,
   9804    type: CSS_TYPE_LONGHAND,
   9805    initial_values: ["auto"],
   9806    other_values: ["17px", "0.2em", "23.4%"],
   9807    invalid_values: ["stretch", "hello", "-12px", "0.0002"],
   9808  },
   9809  ry: {
   9810    domProp: "ry",
   9811    inherited: false,
   9812    type: CSS_TYPE_LONGHAND,
   9813    initial_values: ["auto"],
   9814    other_values: ["17px", "0.2em", "23.4%"],
   9815    invalid_values: ["stretch", "hello", "-1.3px", "0.0002"],
   9816  },
   9817  "text-anchor": {
   9818    domProp: "textAnchor",
   9819    inherited: true,
   9820    type: CSS_TYPE_LONGHAND,
   9821    initial_values: ["start"],
   9822    other_values: ["middle", "end"],
   9823    invalid_values: [],
   9824  },
   9825  "text-rendering": {
   9826    domProp: "textRendering",
   9827    inherited: true,
   9828    type: CSS_TYPE_LONGHAND,
   9829    applies_to_first_letter: true,
   9830    applies_to_first_line: true,
   9831    initial_values: ["auto"],
   9832    other_values: ["optimizeSpeed", "optimizeLegibility", "geometricPrecision"],
   9833    invalid_values: [],
   9834  },
   9835  "vector-effect": {
   9836    domProp: "vectorEffect",
   9837    inherited: false,
   9838    type: CSS_TYPE_LONGHAND,
   9839    applies_to_first_letter: true,
   9840    applies_to_first_line: true,
   9841    initial_values: ["none"],
   9842    other_values: ["non-scaling-stroke"],
   9843    invalid_values: ["none non-scaling-stroke"],
   9844  },
   9845  "accent-color": {
   9846    domProp: "accentColor",
   9847    inherited: true,
   9848    type: CSS_TYPE_LONGHAND,
   9849    prerequisites: { color: "black" },
   9850    initial_values: ["auto"],
   9851    other_values: [
   9852      "currentcolor",
   9853      "black",
   9854      "green",
   9855      "transparent",
   9856      "rgba(128,128,128,.5)",
   9857      "#123",
   9858    ],
   9859    invalid_values: ["#0", "#00", "#00000", "cc00ff"],
   9860  },
   9861  "align-content": {
   9862    domProp: "alignContent",
   9863    inherited: false,
   9864    type: CSS_TYPE_LONGHAND,
   9865    initial_values: ["normal"],
   9866    other_values: [
   9867      "start",
   9868      "end",
   9869      "flex-start",
   9870      "flex-end",
   9871      "center",
   9872      "space-between",
   9873      "space-around",
   9874      "space-evenly",
   9875      "first baseline",
   9876      "last baseline",
   9877      "baseline",
   9878      "stretch",
   9879      "safe start",
   9880      "unsafe end",
   9881      "safe end",
   9882    ],
   9883    invalid_values: [
   9884      "none",
   9885      "5",
   9886      "self-end",
   9887      "safe",
   9888      "normal unsafe",
   9889      "unsafe safe",
   9890      "safe baseline",
   9891      "baseline unsafe",
   9892      "baseline end",
   9893      "end normal",
   9894      "safe end unsafe start",
   9895      "safe end unsafe",
   9896      "normal safe start",
   9897      "unsafe end start",
   9898      "end start safe",
   9899      "space-between unsafe",
   9900      "stretch safe",
   9901      "auto",
   9902      "first",
   9903      "last",
   9904      "left",
   9905      "right",
   9906    ],
   9907  },
   9908  "align-items": {
   9909    domProp: "alignItems",
   9910    inherited: false,
   9911    type: CSS_TYPE_LONGHAND,
   9912    initial_values: ["normal"],
   9913    other_values: [
   9914      "end",
   9915      "flex-start",
   9916      "flex-end",
   9917      "self-start",
   9918      "self-end",
   9919      "center",
   9920      "stretch",
   9921      "first baseline",
   9922      "last baseline",
   9923      "baseline",
   9924      "start",
   9925      "unsafe center",
   9926      "safe center",
   9927    ],
   9928    invalid_values: [
   9929      "space-between",
   9930      "abc",
   9931      "5%",
   9932      "legacy",
   9933      "legacy end",
   9934      "end legacy",
   9935      "unsafe",
   9936      "unsafe baseline",
   9937      "normal unsafe",
   9938      "safe left unsafe",
   9939      "safe stretch",
   9940      "end end",
   9941      "auto",
   9942      "left",
   9943      "right",
   9944    ],
   9945  },
   9946  "align-self": {
   9947    domProp: "alignSelf",
   9948    inherited: false,
   9949    type: CSS_TYPE_LONGHAND,
   9950    initial_values: ["auto"],
   9951    other_values: [
   9952      "normal",
   9953      "start",
   9954      "flex-start",
   9955      "flex-end",
   9956      "center",
   9957      "stretch",
   9958      "first baseline",
   9959      "last baseline",
   9960      "baseline",
   9961      "unsafe center",
   9962      "self-start",
   9963      "safe self-end",
   9964    ],
   9965    invalid_values: [
   9966      "space-between",
   9967      "abc",
   9968      "30px",
   9969      "stretch safe",
   9970      "safe",
   9971      "left",
   9972      "right",
   9973    ],
   9974  },
   9975  "justify-content": {
   9976    domProp: "justifyContent",
   9977    inherited: false,
   9978    type: CSS_TYPE_LONGHAND,
   9979    initial_values: ["normal"],
   9980    other_values: [
   9981      "start",
   9982      "end",
   9983      "flex-start",
   9984      "flex-end",
   9985      "center",
   9986      "left",
   9987      "right",
   9988      "space-between",
   9989      "space-around",
   9990      "space-evenly",
   9991      "stretch",
   9992      "safe start",
   9993      "unsafe end",
   9994      "safe end",
   9995    ],
   9996    invalid_values: [
   9997      "30px",
   9998      "5%",
   9999      "self-end",
  10000      "safe",
  10001      "normal unsafe",
  10002      "unsafe safe",
  10003      "safe baseline",
  10004      "baseline unsafe",
  10005      "baseline end",
  10006      "normal end",
  10007      "safe end unsafe start",
  10008      "safe end unsafe",
  10009      "normal safe start",
  10010      "unsafe end start",
  10011      "end start safe",
  10012      "space-around unsafe",
  10013      "safe stretch",
  10014      "auto",
  10015      "first",
  10016      "last",
  10017    ],
  10018  },
  10019  "justify-items": {
  10020    domProp: "justifyItems",
  10021    inherited: false,
  10022    type: CSS_TYPE_LONGHAND,
  10023    initial_values: ["legacy", "normal"],
  10024    other_values: [
  10025      "end",
  10026      "flex-start",
  10027      "flex-end",
  10028      "self-start",
  10029      "self-end",
  10030      "center",
  10031      "left",
  10032      "right",
  10033      "stretch",
  10034      "start",
  10035      "legacy left",
  10036      "right legacy",
  10037      "legacy center",
  10038      "unsafe right",
  10039      "unsafe left",
  10040      "safe right",
  10041      "safe center",
  10042    ],
  10043    invalid_values: [
  10044      "auto",
  10045      "space-between",
  10046      "abc",
  10047      "30px",
  10048      "legacy start",
  10049      "end legacy",
  10050      "legacy baseline",
  10051      "legacy legacy",
  10052      "unsafe",
  10053      "safe legacy left",
  10054      "legacy left safe",
  10055      "legacy safe left",
  10056      "safe left legacy",
  10057      "legacy left legacy",
  10058      "baseline unsafe",
  10059      "safe unsafe",
  10060      "safe left unsafe",
  10061      "safe stretch",
  10062      "last",
  10063    ],
  10064  },
  10065  "justify-self": {
  10066    domProp: "justifySelf",
  10067    inherited: false,
  10068    type: CSS_TYPE_LONGHAND,
  10069    initial_values: ["auto"],
  10070    other_values: [
  10071      "normal",
  10072      "start",
  10073      "end",
  10074      "flex-start",
  10075      "flex-end",
  10076      "self-start",
  10077      "self-end",
  10078      "center",
  10079      "left",
  10080      "right",
  10081      "stretch",
  10082      "unsafe left",
  10083      "baseline",
  10084      "last baseline",
  10085      "first baseline",
  10086      "unsafe right",
  10087      "safe right",
  10088      "safe center",
  10089    ],
  10090    invalid_values: [
  10091      "space-between",
  10092      "abc",
  10093      "30px",
  10094      "none",
  10095      "first",
  10096      "last",
  10097      "legacy left",
  10098      "right legacy",
  10099      "baseline first",
  10100      "baseline last",
  10101    ],
  10102  },
  10103  "place-content": {
  10104    domProp: "placeContent",
  10105    inherited: false,
  10106    type: CSS_TYPE_TRUE_SHORTHAND,
  10107    subproperties: ["align-content", "justify-content"],
  10108    initial_values: ["normal"],
  10109    other_values: [
  10110      "normal start",
  10111      "baseline end",
  10112      "end end",
  10113      "space-between flex-end",
  10114      "last baseline start",
  10115      "space-evenly",
  10116      "flex-start",
  10117      "end",
  10118      "unsafe start",
  10119      "safe center",
  10120      "baseline",
  10121      "last baseline",
  10122    ],
  10123    invalid_values: [
  10124      "none",
  10125      "center safe",
  10126      "right / end",
  10127      "left",
  10128      "right",
  10129      "left left",
  10130      "right right",
  10131    ],
  10132  },
  10133  "place-items": {
  10134    domProp: "placeItems",
  10135    inherited: false,
  10136    type: CSS_TYPE_TRUE_SHORTHAND,
  10137    subproperties: ["align-items", "justify-items"],
  10138    initial_values: ["normal"],
  10139    other_values: [
  10140      "normal center",
  10141      "baseline end",
  10142      "end legacy",
  10143      "end",
  10144      "flex-end left",
  10145      "last baseline start",
  10146      "stretch",
  10147      "safe center",
  10148      "end legacy left",
  10149    ],
  10150    invalid_values: [
  10151      "space-between",
  10152      "start space-evenly",
  10153      "none",
  10154      "end/end",
  10155      "center safe",
  10156      "auto start",
  10157      "left",
  10158      "right",
  10159      "left left",
  10160      "right right",
  10161    ],
  10162  },
  10163  "place-self": {
  10164    domProp: "placeSelf",
  10165    inherited: false,
  10166    type: CSS_TYPE_TRUE_SHORTHAND,
  10167    subproperties: ["align-self", "justify-self"],
  10168    initial_values: ["auto"],
  10169    other_values: [
  10170      "normal start",
  10171      "first baseline end",
  10172      "end auto",
  10173      "end",
  10174      "normal",
  10175      "baseline start",
  10176      "baseline",
  10177      "start baseline",
  10178      "self-end left",
  10179      "last baseline start",
  10180      "stretch",
  10181    ],
  10182    invalid_values: [
  10183      "space-between",
  10184      "start space-evenly",
  10185      "none",
  10186      "end safe",
  10187      "auto legacy left",
  10188      "legacy left",
  10189      "auto/auto",
  10190      "left",
  10191      "right",
  10192      "left left",
  10193      "right right",
  10194    ],
  10195  },
  10196  flex: {
  10197    domProp: "flex",
  10198    inherited: false,
  10199    type: CSS_TYPE_TRUE_SHORTHAND,
  10200    subproperties: ["flex-grow", "flex-shrink", "flex-basis"],
  10201    initial_values: ["0 1 auto", "auto 0 1", "0 auto", "auto 0"],
  10202    other_values: [
  10203      "none",
  10204      "1",
  10205      "0",
  10206      "0 1",
  10207      "0.5",
  10208      "1.2 3.4",
  10209      "0 0 0",
  10210      "0 0 0px",
  10211      "0px 0 0",
  10212      "5px 0 0",
  10213      "2 auto",
  10214      "auto 4",
  10215      "auto 5.6 7.8",
  10216      "max-content",
  10217      "1 max-content",
  10218      "1 2 max-content",
  10219      "max-content 1",
  10220      "max-content 1 2",
  10221      "-0",
  10222    ],
  10223    invalid_values: [
  10224      "1 2px 3",
  10225      "1 auto 3",
  10226      "1px 2 3px",
  10227      "1px 2 3 4px",
  10228      "-1",
  10229      "1 -1",
  10230      "0 1 calc(0px + rubbish)",
  10231    ],
  10232  },
  10233  "flex-basis": {
  10234    domProp: "flexBasis",
  10235    inherited: false,
  10236    type: CSS_TYPE_LONGHAND,
  10237    initial_values: [" auto"],
  10238    // NOTE: Besides "content", this is cribbed directly from the "width"
  10239    // chunk, since this property takes the exact same values as width
  10240    // (plus 'content' & with different semantics on 'auto').
  10241    // XXXdholbert (Maybe these should get separated out into
  10242    // a reusable array defined at the top of this file?)
  10243    other_values: [
  10244      "content",
  10245      "15px",
  10246      "3em",
  10247      "15%",
  10248      "max-content",
  10249      "min-content",
  10250      "fit-content",
  10251      "stretch",
  10252      "-moz-max-content",
  10253      "-moz-min-content",
  10254      "-moz-fit-content",
  10255      "-moz-available",
  10256      "-webkit-fill-available",
  10257      // valid calc() values
  10258      "calc(-2px)",
  10259      "calc(2px)",
  10260      "calc(50%)",
  10261      "calc(50% + 2px)",
  10262      "calc( 50% + 2px)",
  10263      "calc(50% + 2px )",
  10264      "calc( 50% + 2px )",
  10265      "calc(50% - -2px)",
  10266      "calc(2px - -50%)",
  10267      "calc(3*25px)",
  10268      "calc(3 *25px)",
  10269      "calc(3 * 25px)",
  10270      "calc(3* 25px)",
  10271      "calc(25px*3)",
  10272      "calc(25px *3)",
  10273      "calc(25px* 3)",
  10274      "calc(25px * 3)",
  10275      "calc(3*25px + 50%)",
  10276      "calc(50% - 3em + 2px)",
  10277      "calc(50% - (3em + 2px))",
  10278      "calc((50% - 3em) + 2px)",
  10279      "calc(2em)",
  10280      "calc(50%)",
  10281      "calc(50px/2)",
  10282      "calc(50px/(2 - 1))",
  10283      "calc(min(5px))",
  10284      "calc(min(5px,2em))",
  10285      "calc(max(5px))",
  10286      "calc(max(5px,2em))",
  10287      "min(5px)",
  10288      "min(5px,2em)",
  10289      "max(5px)",
  10290      "max(5px,2em)",
  10291    ],
  10292    invalid_values: [
  10293      "none",
  10294      "-2px",
  10295      // invalid calc() values
  10296      "calc(50%+ 2px)",
  10297      "calc(50% +2px)",
  10298      "calc(50%+2px)",
  10299      "-moz-min()",
  10300      "calc(min())",
  10301      "-moz-max()",
  10302      "calc(max())",
  10303      "-moz-min(5px)",
  10304      "-moz-max(5px)",
  10305      "-moz-min(5px,2em)",
  10306      "-moz-max(5px,2em)",
  10307      // If we ever support division by values, which is
  10308      // complicated for the reasons described in
  10309      // http://lists.w3.org/Archives/Public/www-style/2010Jan/0007.html
  10310      // , we should support all 4 of these as described in
  10311      // http://lists.w3.org/Archives/Public/www-style/2009Dec/0296.html
  10312      "calc((3em / 100%) * 3em)",
  10313      "calc(3em / 100% * 3em)",
  10314      "calc(3em * (3em / 100%))",
  10315      "calc(3em * 3em / 100%)",
  10316      "anchor-size()",
  10317      "anchor-size(--a width)",
  10318      "anchor-size(--a width, 10px)",
  10319    ],
  10320  },
  10321  "flex-direction": {
  10322    domProp: "flexDirection",
  10323    inherited: false,
  10324    type: CSS_TYPE_LONGHAND,
  10325    initial_values: ["row"],
  10326    other_values: ["row-reverse", "column", "column-reverse"],
  10327    invalid_values: ["10px", "30%", "justify", "column wrap"],
  10328  },
  10329  "flex-flow": {
  10330    domProp: "flexFlow",
  10331    inherited: false,
  10332    type: CSS_TYPE_TRUE_SHORTHAND,
  10333    subproperties: ["flex-direction", "flex-wrap"],
  10334    initial_values: ["row nowrap", "nowrap row", "row", "nowrap"],
  10335    other_values: [
  10336      // only specifying one property:
  10337      "column",
  10338      "wrap",
  10339      "wrap-reverse",
  10340      // specifying both properties, 'flex-direction' first:
  10341      "row wrap",
  10342      "row wrap-reverse",
  10343      "column wrap",
  10344      "column wrap-reverse",
  10345      // specifying both properties, 'flex-wrap' first:
  10346      "wrap row",
  10347      "wrap column",
  10348      "wrap-reverse row",
  10349      "wrap-reverse column",
  10350    ],
  10351    invalid_values: [
  10352      // specifying flex-direction twice (invalid):
  10353      "row column",
  10354      "row column nowrap",
  10355      "row nowrap column",
  10356      "nowrap row column",
  10357      // specifying flex-wrap twice (invalid):
  10358      "nowrap wrap-reverse",
  10359      "nowrap wrap-reverse row",
  10360      "nowrap row wrap-reverse",
  10361      "row nowrap wrap-reverse",
  10362      // Invalid data-type / invalid keyword type:
  10363      "1px",
  10364      "5%",
  10365      "justify",
  10366      "none",
  10367    ],
  10368  },
  10369  "flex-grow": {
  10370    domProp: "flexGrow",
  10371    inherited: false,
  10372    type: CSS_TYPE_LONGHAND,
  10373    initial_values: ["0"],
  10374    other_values: ["3", "1", "1.0", "2.5", "123"],
  10375    invalid_values: ["0px", "-5", "1%", "3em", "stretch", "auto"],
  10376  },
  10377  "flex-shrink": {
  10378    domProp: "flexShrink",
  10379    inherited: false,
  10380    type: CSS_TYPE_LONGHAND,
  10381    initial_values: ["1"],
  10382    other_values: ["3", "0", "0.0", "2.5", "123"],
  10383    invalid_values: ["0px", "-5", "1%", "3em", "stretch", "auto"],
  10384  },
  10385  "flex-wrap": {
  10386    domProp: "flexWrap",
  10387    inherited: false,
  10388    type: CSS_TYPE_LONGHAND,
  10389    initial_values: ["nowrap"],
  10390    other_values: ["wrap", "wrap-reverse"],
  10391    invalid_values: ["10px", "30%", "justify", "column wrap", "auto"],
  10392  },
  10393  order: {
  10394    domProp: "order",
  10395    inherited: false,
  10396    type: CSS_TYPE_LONGHAND,
  10397    initial_values: ["0"],
  10398    other_values: ["1", "99999", "-1", "-50"],
  10399    invalid_values: ["0px", "1.0", "1.", "1%", "0.2", "3em", "stretch"],
  10400  },
  10401 
  10402  // Aliases
  10403  "word-wrap": {
  10404    domProp: "wordWrap",
  10405    inherited: true,
  10406    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10407    alias_for: "overflow-wrap",
  10408    subproperties: ["overflow-wrap"],
  10409  },
  10410  "-moz-tab-size": {
  10411    domProp: "MozTabSize",
  10412    inherited: true,
  10413    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10414    alias_for: "tab-size",
  10415    subproperties: ["tab-size"],
  10416  },
  10417  "-moz-border-image": {
  10418    domProp: "MozBorderImage",
  10419    inherited: false,
  10420    type: CSS_TYPE_TRUE_SHORTHAND,
  10421    alias_for: "border-image",
  10422    subproperties: [
  10423      "border-image-source",
  10424      "border-image-slice",
  10425      "border-image-width",
  10426      "border-image-outset",
  10427      "border-image-repeat",
  10428    ],
  10429  },
  10430  "-moz-font-feature-settings": {
  10431    domProp: "MozFontFeatureSettings",
  10432    inherited: true,
  10433    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10434    applies_to_first_letter: true,
  10435    applies_to_first_line: true,
  10436    applies_to_marker: true,
  10437    applies_to_placeholder: true,
  10438    applies_to_cue: true,
  10439    alias_for: "font-feature-settings",
  10440    subproperties: ["font-feature-settings"],
  10441  },
  10442  "-moz-font-language-override": {
  10443    domProp: "MozFontLanguageOverride",
  10444    inherited: true,
  10445    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10446    applies_to_first_letter: true,
  10447    applies_to_first_line: true,
  10448    applies_to_marker: true,
  10449    applies_to_placeholder: true,
  10450    applies_to_cue: true,
  10451    alias_for: "font-language-override",
  10452    subproperties: ["font-language-override"],
  10453  },
  10454  "-moz-hyphens": {
  10455    domProp: "MozHyphens",
  10456    inherited: true,
  10457    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10458    applies_to_marker: true,
  10459    alias_for: "hyphens",
  10460    subproperties: ["hyphens"],
  10461  },
  10462  // vertical text properties
  10463  "writing-mode": {
  10464    domProp: "writingMode",
  10465    inherited: true,
  10466    type: CSS_TYPE_LONGHAND,
  10467    initial_values: ["horizontal-tb", "lr", "lr-tb", "rl", "rl-tb"],
  10468    other_values: [
  10469      "vertical-lr",
  10470      "vertical-rl",
  10471      "sideways-rl",
  10472      "sideways-lr",
  10473      "tb",
  10474      "tb-rl",
  10475    ],
  10476    invalid_values: ["10px", "30%", "justify", "auto", "1em"],
  10477  },
  10478  "text-orientation": {
  10479    domProp: "textOrientation",
  10480    inherited: true,
  10481    type: CSS_TYPE_LONGHAND,
  10482    applies_to_marker: true,
  10483    initial_values: ["mixed"],
  10484    other_values: [
  10485      "upright",
  10486      "sideways",
  10487      "sideways-right",
  10488    ] /* sideways-right alias for backward compatibility */,
  10489    invalid_values: [
  10490      "none",
  10491      "3em",
  10492      "sideways-left",
  10493    ] /* sideways-left removed from CSS Writing Modes */,
  10494  },
  10495  "block-size": {
  10496    domProp: "blockSize",
  10497    inherited: false,
  10498    type: CSS_TYPE_LONGHAND,
  10499    logical: true,
  10500    axis: true,
  10501    /* XXX testing auto has prerequisites */
  10502    initial_values: ["auto"],
  10503    prerequisites: { display: "block" },
  10504    other_values: [
  10505      "15px",
  10506      "3em",
  10507      "15%",
  10508      "max-content",
  10509      "min-content",
  10510      "fit-content",
  10511      "stretch",
  10512      "-moz-max-content",
  10513      "-moz-min-content",
  10514      "-moz-fit-content",
  10515      "-moz-available",
  10516      "-webkit-fill-available",
  10517      "calc(2px)",
  10518      "calc(50%)",
  10519      "calc(3*25px)",
  10520      "calc(25px*3)",
  10521      "calc(3*25px + 50%)",
  10522      "fit-content(100px)",
  10523      "fit-content(10%)",
  10524      "fit-content(calc(3*25px + 50%))",
  10525    ],
  10526    invalid_values: ["none"],
  10527  },
  10528  "border-block": {
  10529    domProp: "borderBlock",
  10530    inherited: false,
  10531    type: CSS_TYPE_TRUE_SHORTHAND,
  10532    subproperties: [
  10533      "border-block-start-color",
  10534      "border-block-start-style",
  10535      "border-block-start-width",
  10536      "border-block-end-color",
  10537      "border-block-end-style",
  10538      "border-block-end-width",
  10539    ],
  10540    initial_values: [
  10541      "none",
  10542      "medium",
  10543      "currentColor",
  10544      "thin",
  10545      "none medium currentcolor",
  10546    ],
  10547    other_values: [
  10548      "solid",
  10549      "green",
  10550      "medium solid",
  10551      "green solid",
  10552      "10px solid",
  10553      "thick solid",
  10554      "5px green none",
  10555    ],
  10556    invalid_values: ["5%", "5", "5 solid green"],
  10557  },
  10558  "border-block-end": {
  10559    domProp: "borderBlockEnd",
  10560    inherited: false,
  10561    type: CSS_TYPE_TRUE_SHORTHAND,
  10562    subproperties: [
  10563      "border-block-end-color",
  10564      "border-block-end-style",
  10565      "border-block-end-width",
  10566    ],
  10567    initial_values: [
  10568      "none",
  10569      "medium",
  10570      "currentColor",
  10571      "thin",
  10572      "none medium currentcolor",
  10573    ],
  10574    other_values: [
  10575      "solid",
  10576      "green",
  10577      "medium solid",
  10578      "green solid",
  10579      "10px solid",
  10580      "thick solid",
  10581      "5px green none",
  10582    ],
  10583    invalid_values: ["5%", "5", "5 solid green"],
  10584  },
  10585  "border-block-color": {
  10586    domProp: "borderBlockColor",
  10587    inherited: false,
  10588    type: CSS_TYPE_TRUE_SHORTHAND,
  10589    subproperties: ["border-block-start-color", "border-block-end-color"],
  10590    initial_values: ["currentColor"],
  10591    other_values: ["green", "rgba(255,128,0,0.5) blue", "blue transparent"],
  10592    invalid_values: ["#0", "#00", "#00000", "#0000000", "#000000000", "000000"],
  10593  },
  10594  "border-block-end-color": {
  10595    domProp: "borderBlockEndColor",
  10596    inherited: false,
  10597    type: CSS_TYPE_LONGHAND,
  10598    applies_to_first_letter: true,
  10599    logical: true,
  10600    initial_values: ["currentColor"],
  10601    other_values: ["green", "rgba(255,128,0,0.5)", "transparent"],
  10602    invalid_values: ["#0", "#00", "#00000", "#0000000", "#000000000", "000000"],
  10603  },
  10604  "border-block-style": {
  10605    domProp: "borderBlockStyle",
  10606    inherited: false,
  10607    type: CSS_TYPE_TRUE_SHORTHAND,
  10608    subproperties: ["border-block-start-style", "border-block-end-style"],
  10609    initial_values: ["none"],
  10610    other_values: [
  10611      "solid",
  10612      "dashed solid",
  10613      "solid dotted",
  10614      "double double",
  10615      "inset outset",
  10616      "inset double",
  10617      "none groove",
  10618      "ridge none",
  10619    ],
  10620    invalid_values: [],
  10621  },
  10622  "border-block-end-style": {
  10623    domProp: "borderBlockEndStyle",
  10624    inherited: false,
  10625    type: CSS_TYPE_LONGHAND,
  10626    applies_to_first_letter: true,
  10627    logical: true,
  10628    /* XXX hidden is sometimes the same as initial */
  10629    initial_values: ["none"],
  10630    other_values: [
  10631      "solid",
  10632      "dashed",
  10633      "dotted",
  10634      "double",
  10635      "outset",
  10636      "inset",
  10637      "groove",
  10638      "ridge",
  10639    ],
  10640    invalid_values: [],
  10641  },
  10642  "border-block-width": {
  10643    domProp: "borderBlockWidth",
  10644    inherited: false,
  10645    type: CSS_TYPE_TRUE_SHORTHAND,
  10646    subproperties: ["border-block-start-width", "border-block-end-width"],
  10647    prerequisites: { "border-style": "solid" },
  10648    initial_values: ["medium", "3px", "medium medium"],
  10649    other_values: [
  10650      "thin",
  10651      "thick",
  10652      "1px",
  10653      "2em",
  10654      "calc(2px)",
  10655      "calc(2px) thin",
  10656      "calc(-2px)",
  10657      "calc(-2px) thick",
  10658      "calc(0em)",
  10659      "medium calc(0em)",
  10660      "calc(0px)",
  10661      "1px calc(0px)",
  10662      "calc(5em)",
  10663      "1em calc(5em)",
  10664    ],
  10665    invalid_values: ["5%", "5", "5 thin", "thin 5%", "blue", "solid"],
  10666  },
  10667  "border-block-end-width": {
  10668    domProp: "borderBlockEndWidth",
  10669    inherited: false,
  10670    type: CSS_TYPE_LONGHAND,
  10671    applies_to_first_letter: true,
  10672    logical: true,
  10673    prerequisites: { "border-block-end-style": "solid" },
  10674    initial_values: ["medium", "3px", "calc(4px - 1px)"],
  10675    other_values: [
  10676      "thin",
  10677      "thick",
  10678      "1px",
  10679      "2em",
  10680      "calc(2px)",
  10681      "calc(-2px)",
  10682      "calc(0em)",
  10683      "calc(0px)",
  10684      "calc(5em)",
  10685      "calc(3*25px)",
  10686      "calc(25px*3)",
  10687      "calc(3*25px + 5em)",
  10688    ],
  10689    invalid_values: ["5%", "5"],
  10690  },
  10691  "border-block-start": {
  10692    domProp: "borderBlockStart",
  10693    inherited: false,
  10694    type: CSS_TYPE_TRUE_SHORTHAND,
  10695    subproperties: [
  10696      "border-block-start-color",
  10697      "border-block-start-style",
  10698      "border-block-start-width",
  10699    ],
  10700    initial_values: [
  10701      "none",
  10702      "medium",
  10703      "currentColor",
  10704      "thin",
  10705      "none medium currentcolor",
  10706    ],
  10707    other_values: [
  10708      "solid",
  10709      "green",
  10710      "medium solid",
  10711      "green solid",
  10712      "10px solid",
  10713      "thick solid",
  10714      "5px green none",
  10715    ],
  10716    invalid_values: ["5%", "5", "5 solid green"],
  10717  },
  10718  "border-block-start-color": {
  10719    domProp: "borderBlockStartColor",
  10720    inherited: false,
  10721    type: CSS_TYPE_LONGHAND,
  10722    applies_to_first_letter: true,
  10723    logical: true,
  10724    initial_values: ["currentColor"],
  10725    other_values: ["green", "rgba(255,128,0,0.5)", "transparent"],
  10726    invalid_values: ["#0", "#00", "#00000", "#0000000", "#000000000", "000000"],
  10727  },
  10728  "border-block-start-style": {
  10729    domProp: "borderBlockStartStyle",
  10730    inherited: false,
  10731    type: CSS_TYPE_LONGHAND,
  10732    applies_to_first_letter: true,
  10733    logical: true,
  10734    /* XXX hidden is sometimes the same as initial */
  10735    initial_values: ["none"],
  10736    other_values: [
  10737      "solid",
  10738      "dashed",
  10739      "dotted",
  10740      "double",
  10741      "outset",
  10742      "inset",
  10743      "groove",
  10744      "ridge",
  10745    ],
  10746    invalid_values: [],
  10747  },
  10748  "border-block-start-width": {
  10749    domProp: "borderBlockStartWidth",
  10750    inherited: false,
  10751    type: CSS_TYPE_LONGHAND,
  10752    applies_to_first_letter: true,
  10753    logical: true,
  10754    prerequisites: { "border-block-start-style": "solid" },
  10755    initial_values: ["medium", "3px", "calc(4px - 1px)"],
  10756    other_values: [
  10757      "thin",
  10758      "thick",
  10759      "1px",
  10760      "2em",
  10761      "calc(2px)",
  10762      "calc(-2px)",
  10763      "calc(0em)",
  10764      "calc(0px)",
  10765      "calc(5em)",
  10766      "calc(3*25px)",
  10767      "calc(25px*3)",
  10768      "calc(3*25px + 5em)",
  10769    ],
  10770    invalid_values: ["5%", "5"],
  10771  },
  10772  "-moz-border-end": {
  10773    domProp: "MozBorderEnd",
  10774    inherited: false,
  10775    type: CSS_TYPE_TRUE_SHORTHAND,
  10776    alias_for: "border-inline-end",
  10777    subproperties: [
  10778      "-moz-border-end-color",
  10779      "-moz-border-end-style",
  10780      "-moz-border-end-width",
  10781    ],
  10782  },
  10783  "-moz-border-end-color": {
  10784    domProp: "MozBorderEndColor",
  10785    inherited: false,
  10786    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10787    applies_to_first_letter: true,
  10788    alias_for: "border-inline-end-color",
  10789    subproperties: ["border-inline-end-color"],
  10790  },
  10791  "-moz-border-end-style": {
  10792    domProp: "MozBorderEndStyle",
  10793    inherited: false,
  10794    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10795    applies_to_first_letter: true,
  10796    alias_for: "border-inline-end-style",
  10797    subproperties: ["border-inline-end-style"],
  10798  },
  10799  "-moz-border-end-width": {
  10800    domProp: "MozBorderEndWidth",
  10801    inherited: false,
  10802    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10803    applies_to_first_letter: true,
  10804    alias_for: "border-inline-end-width",
  10805    subproperties: ["border-inline-end-width"],
  10806  },
  10807  "-moz-border-start": {
  10808    domProp: "MozBorderStart",
  10809    inherited: false,
  10810    type: CSS_TYPE_TRUE_SHORTHAND,
  10811    alias_for: "border-inline-start",
  10812    subproperties: [
  10813      "-moz-border-start-color",
  10814      "-moz-border-start-style",
  10815      "-moz-border-start-width",
  10816    ],
  10817  },
  10818  "-moz-border-start-color": {
  10819    domProp: "MozBorderStartColor",
  10820    inherited: false,
  10821    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10822    applies_to_first_letter: true,
  10823    alias_for: "border-inline-start-color",
  10824    subproperties: ["border-inline-start-color"],
  10825  },
  10826  "-moz-border-start-style": {
  10827    domProp: "MozBorderStartStyle",
  10828    inherited: false,
  10829    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10830    applies_to_first_letter: true,
  10831    alias_for: "border-inline-start-style",
  10832    subproperties: ["border-inline-start-style"],
  10833  },
  10834  "-moz-border-start-width": {
  10835    domProp: "MozBorderStartWidth",
  10836    inherited: false,
  10837    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10838    applies_to_first_letter: true,
  10839    alias_for: "border-inline-start-width",
  10840    subproperties: ["border-inline-start-width"],
  10841  },
  10842  "inline-size": {
  10843    domProp: "inlineSize",
  10844    inherited: false,
  10845    type: CSS_TYPE_LONGHAND,
  10846    logical: true,
  10847    axis: true,
  10848    /* XXX testing auto has prerequisites */
  10849    initial_values: ["auto"],
  10850    prerequisites: {
  10851      display: "block",
  10852      // add some margin to avoid the initial "auto" value getting
  10853      // resolved to the same length as the parent element.
  10854      "margin-left": "5px",
  10855    },
  10856    other_values: [
  10857      "15px",
  10858      "3em",
  10859      "15%",
  10860      "max-content",
  10861      "min-content",
  10862      "fit-content",
  10863      "stretch",
  10864      "-moz-max-content",
  10865      "-moz-min-content",
  10866      "-moz-fit-content",
  10867      "-moz-available",
  10868      "-webkit-fill-available",
  10869      "calc(2px)",
  10870      "calc(50%)",
  10871      "calc(3*25px)",
  10872      "calc(25px*3)",
  10873      "calc(3*25px + 50%)",
  10874      "fit-content(100px)",
  10875      "fit-content(10%)",
  10876      "fit-content(calc(3*25px + 50%))",
  10877    ],
  10878    invalid_values: ["none"],
  10879  },
  10880  "margin-block": {
  10881    domProp: "marginBlock",
  10882    inherited: false,
  10883    type: CSS_TYPE_TRUE_SHORTHAND,
  10884    subproperties: ["margin-block-start", "margin-block-end"],
  10885    initial_values: ["0", "0px 0em"],
  10886    other_values: [
  10887      "1px",
  10888      "3em 1%",
  10889      "5%",
  10890      "calc(2px) 1%",
  10891      "calc(-2px) 1%",
  10892      "calc(50%) 1%",
  10893      "calc(3*25px) calc(2px)",
  10894      "calc(25px*3) 1em",
  10895      "calc(3*25px + 50%) calc(3*25px - 50%)",
  10896    ],
  10897    invalid_values: [
  10898      "5",
  10899      "..25px",
  10900      ".+5px",
  10901      ".px",
  10902      "-.px",
  10903      "++5px",
  10904      "-+4px",
  10905      "+-3px",
  10906      "--7px",
  10907      "+-.6px",
  10908      "-+.5px",
  10909      "++.7px",
  10910      "--.4px",
  10911    ],
  10912  },
  10913  "margin-block-end": {
  10914    domProp: "marginBlockEnd",
  10915    inherited: false,
  10916    type: CSS_TYPE_LONGHAND,
  10917    applies_to_first_letter: true,
  10918    logical: true,
  10919    /* XXX testing auto has prerequisites */
  10920    initial_values: ["0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)"],
  10921    other_values: [
  10922      "1px",
  10923      "2em",
  10924      "5%",
  10925      "calc(2px)",
  10926      "calc(-2px)",
  10927      "calc(50%)",
  10928      "calc(3*25px)",
  10929      "calc(25px*3)",
  10930      "calc(3*25px + 50%)",
  10931    ],
  10932    invalid_values: [
  10933      "..25px",
  10934      ".+5px",
  10935      ".px",
  10936      "-.px",
  10937      "++5px",
  10938      "-+4px",
  10939      "+-3px",
  10940      "--7px",
  10941      "+-.6px",
  10942      "-+.5px",
  10943      "++.7px",
  10944      "--.4px",
  10945    ],
  10946  },
  10947  "margin-block-start": {
  10948    domProp: "marginBlockStart",
  10949    inherited: false,
  10950    type: CSS_TYPE_LONGHAND,
  10951    applies_to_first_letter: true,
  10952    logical: true,
  10953    /* XXX testing auto has prerequisites */
  10954    initial_values: ["0", "0px", "0%", "calc(0pt)", "calc(0% + 0px)"],
  10955    other_values: [
  10956      "1px",
  10957      "2em",
  10958      "5%",
  10959      "calc(2px)",
  10960      "calc(-2px)",
  10961      "calc(50%)",
  10962      "calc(3*25px)",
  10963      "calc(25px*3)",
  10964      "calc(3*25px + 50%)",
  10965    ],
  10966    invalid_values: [
  10967      "..25px",
  10968      ".+5px",
  10969      ".px",
  10970      "-.px",
  10971      "++5px",
  10972      "-+4px",
  10973      "+-3px",
  10974      "--7px",
  10975      "+-.6px",
  10976      "-+.5px",
  10977      "++.7px",
  10978      "--.4px",
  10979    ],
  10980  },
  10981  "-moz-margin-end": {
  10982    domProp: "MozMarginEnd",
  10983    inherited: false,
  10984    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10985    applies_to_first_letter: true,
  10986    alias_for: "margin-inline-end",
  10987    subproperties: ["margin-inline-end"],
  10988  },
  10989  "-moz-margin-start": {
  10990    domProp: "MozMarginStart",
  10991    inherited: false,
  10992    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  10993    applies_to_first_letter: true,
  10994    alias_for: "margin-inline-start",
  10995    subproperties: ["margin-inline-start"],
  10996  },
  10997  "max-block-size": {
  10998    domProp: "maxBlockSize",
  10999    inherited: false,
  11000    type: CSS_TYPE_LONGHAND,
  11001    logical: true,
  11002    axis: true,
  11003    prerequisites: { display: "block" },
  11004    initial_values: ["none"],
  11005    other_values: [
  11006      "30px",
  11007      "50%",
  11008      "max-content",
  11009      "min-content",
  11010      "fit-content",
  11011      "stretch",
  11012      "-moz-max-content",
  11013      "-moz-min-content",
  11014      "-moz-fit-content",
  11015      "-moz-available",
  11016      "-webkit-fill-available",
  11017      "calc(2px)",
  11018      "calc(50%)",
  11019      "calc(3*25px)",
  11020      "calc(25px*3)",
  11021      "calc(3*25px + 50%)",
  11022      "fit-content(100px)",
  11023      "fit-content(10%)",
  11024      "fit-content(calc(3*25px + 50%))",
  11025    ],
  11026    invalid_values: ["auto", "5"],
  11027  },
  11028  "max-inline-size": {
  11029    domProp: "maxInlineSize",
  11030    inherited: false,
  11031    type: CSS_TYPE_LONGHAND,
  11032    logical: true,
  11033    axis: true,
  11034    prerequisites: { display: "block" },
  11035    initial_values: ["none"],
  11036    other_values: [
  11037      "30px",
  11038      "50%",
  11039      "max-content",
  11040      "min-content",
  11041      "fit-content",
  11042      "stretch",
  11043      "-moz-max-content",
  11044      "-moz-min-content",
  11045      "-moz-fit-content",
  11046      "-moz-available",
  11047      "-webkit-fill-available",
  11048      "calc(2px)",
  11049      "calc(50%)",
  11050      "calc(3*25px)",
  11051      "calc(25px*3)",
  11052      "calc(3*25px + 50%)",
  11053      "fit-content(100px)",
  11054      "fit-content(10%)",
  11055      "fit-content(calc(3*25px + 50%))",
  11056    ],
  11057    invalid_values: ["auto", "5"],
  11058  },
  11059  "min-block-size": {
  11060    domProp: "minBlockSize",
  11061    inherited: false,
  11062    type: CSS_TYPE_LONGHAND,
  11063    logical: true,
  11064    axis: true,
  11065    prerequisites: { display: "block" },
  11066    initial_values: ["auto", "0", "calc(0em)", "calc(-2px)"],
  11067    other_values: [
  11068      "30px",
  11069      "50%",
  11070      "max-content",
  11071      "min-content",
  11072      "fit-content",
  11073      "stretch",
  11074      "-moz-max-content",
  11075      "-moz-min-content",
  11076      "-moz-fit-content",
  11077      "-moz-available",
  11078      "-webkit-fill-available",
  11079      "calc(-1%)",
  11080      "calc(2px)",
  11081      "calc(50%)",
  11082      "calc(3*25px)",
  11083      "calc(25px*3)",
  11084      "calc(3*25px + 50%)",
  11085      "fit-content(100px)",
  11086      "fit-content(10%)",
  11087      "fit-content(calc(3*25px + 50%))",
  11088    ],
  11089    invalid_values: ["none", "5"],
  11090  },
  11091  "min-inline-size": {
  11092    domProp: "minInlineSize",
  11093    inherited: false,
  11094    type: CSS_TYPE_LONGHAND,
  11095    logical: true,
  11096    axis: true,
  11097    prerequisites: { display: "block" },
  11098    initial_values: ["auto", "0", "calc(0em)", "calc(-2px)"],
  11099    other_values: [
  11100      "30px",
  11101      "50%",
  11102      "max-content",
  11103      "min-content",
  11104      "fit-content",
  11105      "stretch",
  11106      "-moz-max-content",
  11107      "-moz-min-content",
  11108      "-moz-fit-content",
  11109      "-moz-available",
  11110      "-webkit-fill-available",
  11111      "calc(-1%)",
  11112      "calc(2px)",
  11113      "calc(50%)",
  11114      "calc(3*25px)",
  11115      "calc(25px*3)",
  11116      "calc(3*25px + 50%)",
  11117      "fit-content(100px)",
  11118      "fit-content(10%)",
  11119      "fit-content(calc(3*25px + 50%))",
  11120    ],
  11121    invalid_values: ["none", "5"],
  11122  },
  11123  inset: {
  11124    domProp: "inset",
  11125    inherited: false,
  11126    type: CSS_TYPE_TRUE_SHORTHAND,
  11127    subproperties: ["top", "right", "bottom", "left"],
  11128    /* FIXME: run tests with multiple prerequisites */
  11129    prerequisites: { position: "relative" },
  11130    initial_values: ["auto"],
  11131    other_values: [
  11132      "3px 0",
  11133      "2em 4px 2pt",
  11134      "1em 2em 3px 4px",
  11135      "1em calc(2em + 3px) 4ex 5cm",
  11136    ],
  11137    invalid_values: ["1px calc(nonsense)", "1px red", "3"],
  11138    unbalanced_values: ["1px calc("],
  11139  },
  11140  "inset-block": {
  11141    domProp: "insetBlock",
  11142    inherited: false,
  11143    type: CSS_TYPE_TRUE_SHORTHAND,
  11144    subproperties: ["inset-block-start", "inset-block-end"],
  11145    /* FIXME: run tests with multiple prerequisites */
  11146    prerequisites: { position: "relative" },
  11147    initial_values: ["auto", "auto auto"],
  11148    other_values: [
  11149      "32px",
  11150      "-3em",
  11151      "12%",
  11152      "32px auto",
  11153      "auto -3em",
  11154      "12% auto",
  11155      "calc(2px)",
  11156      "calc(2px) auto",
  11157      "calc(-2px)",
  11158      "auto calc(-2px)",
  11159      "calc(50%)",
  11160      "auto calc(50%)",
  11161      "calc(3*25px)",
  11162      "calc(3*25px) auto",
  11163      "calc(25px*3)",
  11164      "auto calc(25px*3)",
  11165      "calc(3*25px + 50%)",
  11166      "auto calc(3*25px + 50%)",
  11167    ],
  11168    invalid_values: ["none"],
  11169  },
  11170  "inset-block-end": {
  11171    domProp: "insetBlockEnd",
  11172    inherited: false,
  11173    type: CSS_TYPE_LONGHAND,
  11174    logical: true,
  11175    /* FIXME: run tests with multiple prerequisites */
  11176    prerequisites: { position: "relative" },
  11177    /* XXX 0 may or may not be equal to auto */
  11178    initial_values: ["auto"],
  11179    other_values: [
  11180      "32px",
  11181      "-3em",
  11182      "12%",
  11183      "calc(2px)",
  11184      "calc(-2px)",
  11185      "calc(50%)",
  11186      "calc(3*25px)",
  11187      "calc(25px*3)",
  11188      "calc(3*25px + 50%)",
  11189    ],
  11190    invalid_values: [],
  11191  },
  11192  "inset-block-start": {
  11193    domProp: "insetBlockStart",
  11194    inherited: false,
  11195    type: CSS_TYPE_LONGHAND,
  11196    logical: true,
  11197    /* FIXME: run tests with multiple prerequisites */
  11198    prerequisites: { position: "relative" },
  11199    /* XXX 0 may or may not be equal to auto */
  11200    initial_values: ["auto"],
  11201    other_values: [
  11202      "32px",
  11203      "-3em",
  11204      "12%",
  11205      "calc(2px)",
  11206      "calc(-2px)",
  11207      "calc(50%)",
  11208      "calc(3*25px)",
  11209      "calc(25px*3)",
  11210      "calc(3*25px + 50%)",
  11211    ],
  11212    invalid_values: [],
  11213  },
  11214  "inset-inline": {
  11215    domProp: "insetInline",
  11216    inherited: false,
  11217    type: CSS_TYPE_TRUE_SHORTHAND,
  11218    subproperties: ["inset-inline-start", "inset-inline-end"],
  11219    /* FIXME: run tests with multiple prerequisites */
  11220    prerequisites: { position: "relative" },
  11221    initial_values: ["auto", "auto auto"],
  11222    other_values: [
  11223      "32px",
  11224      "-3em",
  11225      "12%",
  11226      "32px auto",
  11227      "auto -3em",
  11228      "12% auto",
  11229      "calc(2px)",
  11230      "calc(2px) auto",
  11231      "calc(-2px)",
  11232      "auto calc(-2px)",
  11233      "calc(50%)",
  11234      "auto calc(50%)",
  11235      "calc(3*25px)",
  11236      "calc(3*25px) auto",
  11237      "calc(25px*3)",
  11238      "auto calc(25px*3)",
  11239      "calc(3*25px + 50%)",
  11240      "auto calc(3*25px + 50%)",
  11241    ],
  11242    invalid_values: ["none"],
  11243  },
  11244  "inset-inline-end": {
  11245    domProp: "insetInlineEnd",
  11246    inherited: false,
  11247    type: CSS_TYPE_LONGHAND,
  11248    logical: true,
  11249    /* FIXME: run tests with multiple prerequisites */
  11250    prerequisites: { position: "relative" },
  11251    /* XXX 0 may or may not be equal to auto */
  11252    initial_values: ["auto"],
  11253    other_values: [
  11254      "32px",
  11255      "-3em",
  11256      "12%",
  11257      "calc(2px)",
  11258      "calc(-2px)",
  11259      "calc(50%)",
  11260      "calc(3*25px)",
  11261      "calc(25px*3)",
  11262      "calc(3*25px + 50%)",
  11263    ],
  11264    invalid_values: [],
  11265  },
  11266  "inset-inline-start": {
  11267    domProp: "insetInlineStart",
  11268    inherited: false,
  11269    type: CSS_TYPE_LONGHAND,
  11270    logical: true,
  11271    /* FIXME: run tests with multiple prerequisites */
  11272    prerequisites: { position: "relative" },
  11273    /* XXX 0 may or may not be equal to auto */
  11274    initial_values: ["auto"],
  11275    other_values: [
  11276      "32px",
  11277      "-3em",
  11278      "12%",
  11279      "calc(2px)",
  11280      "calc(-2px)",
  11281      "calc(50%)",
  11282      "calc(3*25px)",
  11283      "calc(25px*3)",
  11284      "calc(3*25px + 50%)",
  11285    ],
  11286    invalid_values: [],
  11287  },
  11288  "padding-block-end": {
  11289    domProp: "paddingBlockEnd",
  11290    inherited: false,
  11291    type: CSS_TYPE_LONGHAND,
  11292    applies_to_first_letter: true,
  11293    // No applies_to_placeholder because we have a !important rule in forms.css.
  11294    logical: true,
  11295    initial_values: [
  11296      "0",
  11297      "0px",
  11298      "0%",
  11299      "calc(0pt)",
  11300      "calc(0% + 0px)",
  11301      "calc(-3px)",
  11302      "calc(-1%)",
  11303    ],
  11304    other_values: [
  11305      "1px",
  11306      "2em",
  11307      "5%",
  11308      "calc(2px)",
  11309      "calc(50%)",
  11310      "calc(3*25px)",
  11311      "calc(25px*3)",
  11312      "calc(3*25px + 50%)",
  11313    ],
  11314    invalid_values: [],
  11315  },
  11316  "padding-block-start": {
  11317    domProp: "paddingBlockStart",
  11318    inherited: false,
  11319    type: CSS_TYPE_LONGHAND,
  11320    applies_to_first_letter: true,
  11321    // No applies_to_placeholder because we have a !important rule in forms.css.
  11322    logical: true,
  11323    initial_values: [
  11324      "0",
  11325      "0px",
  11326      "0%",
  11327      "calc(0pt)",
  11328      "calc(0% + 0px)",
  11329      "calc(-3px)",
  11330      "calc(-1%)",
  11331    ],
  11332    other_values: [
  11333      "1px",
  11334      "2em",
  11335      "5%",
  11336      "calc(2px)",
  11337      "calc(50%)",
  11338      "calc(3*25px)",
  11339      "calc(25px*3)",
  11340      "calc(3*25px + 50%)",
  11341    ],
  11342    invalid_values: [],
  11343  },
  11344  "-moz-padding-end": {
  11345    domProp: "MozPaddingEnd",
  11346    inherited: false,
  11347    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11348    applies_to_first_letter: true,
  11349    alias_for: "padding-inline-end",
  11350    subproperties: ["padding-inline-end"],
  11351  },
  11352  "-moz-padding-start": {
  11353    domProp: "MozPaddingStart",
  11354    inherited: false,
  11355    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11356    applies_to_first_letter: true,
  11357    alias_for: "padding-inline-start",
  11358    subproperties: ["padding-inline-start"],
  11359  },
  11360  "-webkit-animation": {
  11361    domProp: "webkitAnimation",
  11362    inherited: false,
  11363    type: CSS_TYPE_TRUE_SHORTHAND,
  11364    applies_to_marker: true,
  11365    alias_for: "animation",
  11366    subproperties: [
  11367      "animation-name",
  11368      "animation-duration",
  11369      "animation-timing-function",
  11370      "animation-delay",
  11371      "animation-direction",
  11372      "animation-fill-mode",
  11373      "animation-iteration-count",
  11374      "animation-play-state",
  11375    ],
  11376  },
  11377  "-webkit-animation-delay": {
  11378    domProp: "webkitAnimationDelay",
  11379    inherited: false,
  11380    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11381    applies_to_marker: true,
  11382    alias_for: "animation-delay",
  11383    subproperties: ["animation-delay"],
  11384  },
  11385  "-webkit-animation-direction": {
  11386    domProp: "webkitAnimationDirection",
  11387    inherited: false,
  11388    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11389    applies_to_marker: true,
  11390    alias_for: "animation-direction",
  11391    subproperties: ["animation-direction"],
  11392  },
  11393  "-webkit-animation-duration": {
  11394    domProp: "webkitAnimationDuration",
  11395    inherited: false,
  11396    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11397    applies_to_marker: true,
  11398    alias_for: "animation-duration",
  11399    subproperties: ["animation-duration"],
  11400  },
  11401  "-webkit-animation-fill-mode": {
  11402    domProp: "webkitAnimationFillMode",
  11403    inherited: false,
  11404    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11405    applies_to_marker: true,
  11406    alias_for: "animation-fill-mode",
  11407    subproperties: ["animation-fill-mode"],
  11408  },
  11409  "-webkit-animation-iteration-count": {
  11410    domProp: "webkitAnimationIterationCount",
  11411    inherited: false,
  11412    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11413    applies_to_marker: true,
  11414    alias_for: "animation-iteration-count",
  11415    subproperties: ["animation-iteration-count"],
  11416  },
  11417  "-webkit-animation-name": {
  11418    domProp: "webkitAnimationName",
  11419    inherited: false,
  11420    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11421    applies_to_marker: true,
  11422    alias_for: "animation-name",
  11423    subproperties: ["animation-name"],
  11424  },
  11425  "-webkit-animation-play-state": {
  11426    domProp: "webkitAnimationPlayState",
  11427    inherited: false,
  11428    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11429    applies_to_marker: true,
  11430    alias_for: "animation-play-state",
  11431    subproperties: ["animation-play-state"],
  11432  },
  11433  "-webkit-animation-timing-function": {
  11434    domProp: "webkitAnimationTimingFunction",
  11435    inherited: false,
  11436    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11437    applies_to_marker: true,
  11438    alias_for: "animation-timing-function",
  11439    subproperties: ["animation-timing-function"],
  11440  },
  11441  "-webkit-clip-path": {
  11442    domProp: "webkitClipPath",
  11443    inherited: false,
  11444    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11445    alias_for: "clip-path",
  11446    subproperties: ["clip-path"],
  11447  },
  11448  "-webkit-filter": {
  11449    domProp: "webkitFilter",
  11450    inherited: false,
  11451    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11452    alias_for: "filter",
  11453    subproperties: ["filter"],
  11454  },
  11455  "-webkit-text-security": {
  11456    domProp: "webkitTextSecurity",
  11457    inherited: true,
  11458    type: CSS_TYPE_LONGHAND,
  11459    applies_to_first_letter: true,
  11460    applies_to_first_line: true,
  11461    applies_to_placeholder: true,
  11462    initial_values: ["none"],
  11463    other_values: ["circle", "disc", "square"],
  11464    invalid_values: ["0", "auto", "true", "'*'"],
  11465  },
  11466  "-webkit-text-fill-color": {
  11467    domProp: "webkitTextFillColor",
  11468    inherited: true,
  11469    type: CSS_TYPE_LONGHAND,
  11470    applies_to_first_letter: true,
  11471    applies_to_first_line: true,
  11472    applies_to_placeholder: true,
  11473    prerequisites: { color: "black" },
  11474    initial_values: ["currentColor", "black", "#000", "#000000", "rgb(0,0,0)"],
  11475    other_values: ["red", "rgba(255,255,255,0.5)", "transparent"],
  11476    invalid_values: [
  11477      "#0",
  11478      "#00",
  11479      "#00000",
  11480      "#0000000",
  11481      "#000000000",
  11482      "000000",
  11483      "ff00ff",
  11484      "rgb(255,xxx,255)",
  11485    ],
  11486  },
  11487  "-webkit-text-stroke": {
  11488    domProp: "webkitTextStroke",
  11489    inherited: true,
  11490    type: CSS_TYPE_TRUE_SHORTHAND,
  11491    prerequisites: { color: "black" },
  11492    subproperties: ["-webkit-text-stroke-width", "-webkit-text-stroke-color"],
  11493    initial_values: [
  11494      "0 currentColor",
  11495      "currentColor 0px",
  11496      "0",
  11497      "currentColor",
  11498      "0px black",
  11499    ],
  11500    other_values: [
  11501      "thin black",
  11502      "#f00 medium",
  11503      "thick rgba(0,0,255,0.5)",
  11504      "calc(4px - 8px) green",
  11505      "2px",
  11506      "green 0",
  11507      "currentColor 4em",
  11508      "currentColor calc(5px - 1px)",
  11509    ],
  11510    invalid_values: ["-3px black", "calc(50%+ 2px) #000", "30% #f00"],
  11511  },
  11512  "-webkit-text-stroke-color": {
  11513    domProp: "webkitTextStrokeColor",
  11514    inherited: true,
  11515    type: CSS_TYPE_LONGHAND,
  11516    applies_to_first_letter: true,
  11517    applies_to_first_line: true,
  11518    applies_to_placeholder: true,
  11519    prerequisites: { color: "black" },
  11520    initial_values: ["currentColor", "black", "#000", "#000000", "rgb(0,0,0)"],
  11521    other_values: ["red", "rgba(255,255,255,0.5)", "transparent"],
  11522    invalid_values: [
  11523      "#0",
  11524      "#00",
  11525      "#00000",
  11526      "#0000000",
  11527      "#000000000",
  11528      "000000",
  11529      "ff00ff",
  11530      "rgb(255,xxx,255)",
  11531    ],
  11532  },
  11533  "-webkit-text-stroke-width": {
  11534    domProp: "webkitTextStrokeWidth",
  11535    inherited: true,
  11536    type: CSS_TYPE_LONGHAND,
  11537    applies_to_first_letter: true,
  11538    applies_to_first_line: true,
  11539    applies_to_placeholder: true,
  11540    initial_values: ["0", "0px", "0em", "0ex", "calc(0pt)", "calc(4px - 8px)"],
  11541    other_values: [
  11542      "thin",
  11543      "medium",
  11544      "thick",
  11545      "17px",
  11546      "0.2em",
  11547      "calc(3*25px + 5em)",
  11548      "calc(5px - 1px)",
  11549    ],
  11550    invalid_values: [
  11551      "5%",
  11552      "1px calc(nonsense)",
  11553      "1px red",
  11554      "-0.1px",
  11555      "-3px",
  11556      "30%",
  11557    ],
  11558  },
  11559  "-webkit-text-size-adjust": {
  11560    domProp: "webkitTextSizeAdjust",
  11561    inherited: true,
  11562    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11563    alias_for: "-moz-text-size-adjust",
  11564    subproperties: ["-moz-text-size-adjust"],
  11565  },
  11566  "-webkit-transform": {
  11567    domProp: "webkitTransform",
  11568    inherited: false,
  11569    type: CSS_TYPE_LEGACY_SHORTHAND,
  11570    alias_for: "transform",
  11571    subproperties: ["transform"],
  11572    initial_values: ["none"],
  11573    other_values: ["perspective(1000)", "perspective(25)"],
  11574    invalid_values: [],
  11575  },
  11576  "-webkit-transform-origin": {
  11577    domProp: "webkitTransformOrigin",
  11578    inherited: false,
  11579    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11580    alias_for: "transform-origin",
  11581    subproperties: ["transform-origin"],
  11582  },
  11583  "-webkit-transform-style": {
  11584    domProp: "webkitTransformStyle",
  11585    inherited: false,
  11586    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11587    alias_for: "transform-style",
  11588    subproperties: ["transform-style"],
  11589  },
  11590  "-webkit-backface-visibility": {
  11591    domProp: "webkitBackfaceVisibility",
  11592    inherited: false,
  11593    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11594    alias_for: "backface-visibility",
  11595    subproperties: ["backface-visibility"],
  11596  },
  11597  "-webkit-perspective": {
  11598    domProp: "webkitPerspective",
  11599    inherited: false,
  11600    type: CSS_TYPE_LEGACY_SHORTHAND,
  11601    alias_for: "perspective",
  11602    subproperties: ["perspective"],
  11603    initial_values: ["none"],
  11604    other_values: ["1000", "25"],
  11605    invalid_values: ["calc(1000)", "calc(25)"],
  11606  },
  11607  "-webkit-perspective-origin": {
  11608    domProp: "webkitPerspectiveOrigin",
  11609    inherited: false,
  11610    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11611    alias_for: "perspective-origin",
  11612    subproperties: ["perspective-origin"],
  11613  },
  11614  "-webkit-transition": {
  11615    domProp: "webkitTransition",
  11616    inherited: false,
  11617    type: CSS_TYPE_TRUE_SHORTHAND,
  11618    applies_to_marker: true,
  11619    alias_for: "transition",
  11620    subproperties: [
  11621      "transition-property",
  11622      "transition-duration",
  11623      "transition-timing-function",
  11624      "transition-delay",
  11625      "transition-behavior",
  11626    ],
  11627  },
  11628  "-webkit-transition-delay": {
  11629    domProp: "webkitTransitionDelay",
  11630    inherited: false,
  11631    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11632    applies_to_marker: true,
  11633    alias_for: "transition-delay",
  11634    subproperties: ["transition-delay"],
  11635  },
  11636  "-webkit-transition-duration": {
  11637    domProp: "webkitTransitionDuration",
  11638    inherited: false,
  11639    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11640    applies_to_marker: true,
  11641    alias_for: "transition-duration",
  11642    subproperties: ["transition-duration"],
  11643  },
  11644  "-webkit-transition-property": {
  11645    domProp: "webkitTransitionProperty",
  11646    inherited: false,
  11647    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11648    applies_to_marker: true,
  11649    alias_for: "transition-property",
  11650    subproperties: ["transition-property"],
  11651  },
  11652  "-webkit-transition-timing-function": {
  11653    domProp: "webkitTransitionTimingFunction",
  11654    inherited: false,
  11655    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11656    applies_to_marker: true,
  11657    alias_for: "transition-timing-function",
  11658    subproperties: ["transition-timing-function"],
  11659  },
  11660  "-webkit-border-radius": {
  11661    domProp: "webkitBorderRadius",
  11662    inherited: false,
  11663    type: CSS_TYPE_TRUE_SHORTHAND,
  11664    alias_for: "border-radius",
  11665    subproperties: [
  11666      "border-bottom-left-radius",
  11667      "border-bottom-right-radius",
  11668      "border-top-left-radius",
  11669      "border-top-right-radius",
  11670    ],
  11671  },
  11672  "-webkit-border-top-left-radius": {
  11673    domProp: "webkitBorderTopLeftRadius",
  11674    inherited: false,
  11675    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11676    applies_to_first_letter: true,
  11677    alias_for: "border-top-left-radius",
  11678    subproperties: ["border-top-left-radius"],
  11679  },
  11680  "-webkit-border-top-right-radius": {
  11681    domProp: "webkitBorderTopRightRadius",
  11682    inherited: false,
  11683    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11684    applies_to_first_letter: true,
  11685    alias_for: "border-top-right-radius",
  11686    subproperties: ["border-top-right-radius"],
  11687  },
  11688  "-webkit-border-bottom-left-radius": {
  11689    domProp: "webkitBorderBottomLeftRadius",
  11690    inherited: false,
  11691    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11692    applies_to_first_letter: true,
  11693    alias_for: "border-bottom-left-radius",
  11694    subproperties: ["border-bottom-left-radius"],
  11695  },
  11696  "-webkit-border-bottom-right-radius": {
  11697    domProp: "webkitBorderBottomRightRadius",
  11698    inherited: false,
  11699    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11700    applies_to_first_letter: true,
  11701    alias_for: "border-bottom-right-radius",
  11702    subproperties: ["border-bottom-right-radius"],
  11703  },
  11704  "-webkit-background-clip": {
  11705    domProp: "webkitBackgroundClip",
  11706    inherited: false,
  11707    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11708    applies_to_first_letter: true,
  11709    applies_to_first_line: true,
  11710    applies_to_placeholder: true,
  11711    applies_to_cue: true,
  11712    alias_for: "background-clip",
  11713    subproperties: ["background-clip"],
  11714  },
  11715  "-webkit-background-origin": {
  11716    domProp: "webkitBackgroundOrigin",
  11717    inherited: false,
  11718    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11719    applies_to_first_letter: true,
  11720    applies_to_first_line: true,
  11721    applies_to_placeholder: true,
  11722    applies_to_cue: true,
  11723    alias_for: "background-origin",
  11724    subproperties: ["background-origin"],
  11725  },
  11726  "-webkit-background-size": {
  11727    domProp: "webkitBackgroundSize",
  11728    inherited: false,
  11729    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11730    applies_to_first_letter: true,
  11731    applies_to_first_line: true,
  11732    applies_to_placeholder: true,
  11733    applies_to_cue: true,
  11734    alias_for: "background-size",
  11735    subproperties: ["background-size"],
  11736  },
  11737  "-webkit-border-image": {
  11738    domProp: "webkitBorderImage",
  11739    inherited: false,
  11740    type: CSS_TYPE_TRUE_SHORTHAND,
  11741    alias_for: "border-image",
  11742    subproperties: [
  11743      "border-image-source",
  11744      "border-image-slice",
  11745      "border-image-width",
  11746      "border-image-outset",
  11747      "border-image-repeat",
  11748    ],
  11749  },
  11750  "-webkit-box-shadow": {
  11751    domProp: "webkitBoxShadow",
  11752    inherited: false,
  11753    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11754    applies_to_first_letter: true,
  11755    alias_for: "box-shadow",
  11756    subproperties: ["box-shadow"],
  11757  },
  11758  "-webkit-box-sizing": {
  11759    domProp: "webkitBoxSizing",
  11760    inherited: false,
  11761    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11762    alias_for: "box-sizing",
  11763    subproperties: ["box-sizing"],
  11764  },
  11765  "-webkit-box-flex": {
  11766    domProp: "webkitBoxFlex",
  11767    inherited: false,
  11768    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11769    alias_for: "-moz-box-flex",
  11770    subproperties: ["-moz-box-flex"],
  11771  },
  11772  "-webkit-box-ordinal-group": {
  11773    domProp: "webkitBoxOrdinalGroup",
  11774    inherited: false,
  11775    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11776    alias_for: "-moz-box-ordinal-group",
  11777    subproperties: ["-moz-box-ordinal-group"],
  11778  },
  11779  "-webkit-box-orient": {
  11780    domProp: "webkitBoxOrient",
  11781    inherited: false,
  11782    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11783    alias_for: "-moz-box-orient",
  11784    subproperties: ["-moz-box-orient"],
  11785  },
  11786  "-webkit-box-direction": {
  11787    domProp: "webkitBoxDirection",
  11788    inherited: false,
  11789    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11790    alias_for: "-moz-box-direction",
  11791    subproperties: ["-moz-box-direction"],
  11792  },
  11793  "-webkit-box-align": {
  11794    domProp: "webkitBoxAlign",
  11795    inherited: false,
  11796    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11797    alias_for: "-moz-box-align",
  11798    subproperties: ["-moz-box-align"],
  11799  },
  11800  "-webkit-box-pack": {
  11801    domProp: "webkitBoxPack",
  11802    inherited: false,
  11803    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11804    alias_for: "-moz-box-pack",
  11805    subproperties: ["-moz-box-pack"],
  11806  },
  11807  "-webkit-flex-direction": {
  11808    domProp: "webkitFlexDirection",
  11809    inherited: false,
  11810    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11811    alias_for: "flex-direction",
  11812    subproperties: ["flex-direction"],
  11813  },
  11814  "-webkit-flex-wrap": {
  11815    domProp: "webkitFlexWrap",
  11816    inherited: false,
  11817    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11818    alias_for: "flex-wrap",
  11819    subproperties: ["flex-wrap"],
  11820  },
  11821  "-webkit-flex-flow": {
  11822    domProp: "webkitFlexFlow",
  11823    inherited: false,
  11824    type: CSS_TYPE_TRUE_SHORTHAND,
  11825    alias_for: "flex-flow",
  11826    subproperties: ["flex-direction", "flex-wrap"],
  11827  },
  11828  "-webkit-font-feature-settings": {
  11829    domProp: "webkitFontFeatureSettings",
  11830    inherited: true,
  11831    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11832    applies_to_first_letter: true,
  11833    applies_to_first_line: true,
  11834    applies_to_marker: true,
  11835    applies_to_placeholder: true,
  11836    applies_to_cue: true,
  11837    alias_for: "font-feature-settings",
  11838    subproperties: ["font-feature-settings"],
  11839  },
  11840  "-webkit-line-clamp": {
  11841    domProp: "webkitLineClamp",
  11842    inherited: false,
  11843    type: CSS_TYPE_LONGHAND,
  11844    initial_values: ["none"],
  11845    other_values: ["1", "2"],
  11846    invalid_values: ["auto", "0", "-1"],
  11847  },
  11848  "-webkit-order": {
  11849    domProp: "webkitOrder",
  11850    inherited: false,
  11851    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11852    alias_for: "order",
  11853    subproperties: ["order"],
  11854  },
  11855  "-webkit-flex": {
  11856    domProp: "webkitFlex",
  11857    inherited: false,
  11858    type: CSS_TYPE_TRUE_SHORTHAND,
  11859    alias_for: "flex",
  11860    subproperties: ["flex-grow", "flex-shrink", "flex-basis"],
  11861  },
  11862  "-webkit-flex-grow": {
  11863    domProp: "webkitFlexGrow",
  11864    inherited: false,
  11865    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11866    alias_for: "flex-grow",
  11867    subproperties: ["flex-grow"],
  11868  },
  11869  "-webkit-flex-shrink": {
  11870    domProp: "webkitFlexShrink",
  11871    inherited: false,
  11872    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11873    alias_for: "flex-shrink",
  11874    subproperties: ["flex-shrink"],
  11875  },
  11876  "-webkit-flex-basis": {
  11877    domProp: "webkitFlexBasis",
  11878    inherited: false,
  11879    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11880    alias_for: "flex-basis",
  11881    subproperties: ["flex-basis"],
  11882  },
  11883  "-webkit-justify-content": {
  11884    domProp: "webkitJustifyContent",
  11885    inherited: false,
  11886    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11887    alias_for: "justify-content",
  11888    subproperties: ["justify-content"],
  11889  },
  11890  "-webkit-align-items": {
  11891    domProp: "webkitAlignItems",
  11892    inherited: false,
  11893    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11894    alias_for: "align-items",
  11895    subproperties: ["align-items"],
  11896  },
  11897  "-webkit-align-self": {
  11898    domProp: "webkitAlignSelf",
  11899    inherited: false,
  11900    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11901    alias_for: "align-self",
  11902    subproperties: ["align-self"],
  11903  },
  11904  "-webkit-align-content": {
  11905    domProp: "webkitAlignContent",
  11906    inherited: false,
  11907    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11908    alias_for: "align-content",
  11909    subproperties: ["align-content"],
  11910  },
  11911  "-webkit-user-select": {
  11912    domProp: "webkitUserSelect",
  11913    inherited: false,
  11914    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11915    alias_for: "user-select",
  11916    subproperties: ["user-select"],
  11917  },
  11918  "-webkit-mask": {
  11919    domProp: "webkitMask",
  11920    inherited: false,
  11921    type: CSS_TYPE_TRUE_SHORTHAND,
  11922    alias_for: "mask",
  11923    subproperties: [
  11924      "mask-clip",
  11925      "mask-image",
  11926      "mask-mode",
  11927      "mask-origin",
  11928      "mask-position",
  11929      "mask-repeat",
  11930      "mask-size",
  11931      "mask-composite",
  11932    ],
  11933  },
  11934  "-webkit-mask-clip": {
  11935    domProp: "webkitMaskClip",
  11936    inherited: false,
  11937    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11938    alias_for: "mask-clip",
  11939    subproperties: ["mask-clip"],
  11940  },
  11941 
  11942  "-webkit-mask-composite": {
  11943    domProp: "webkitMaskComposite",
  11944    inherited: false,
  11945    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11946    alias_for: "mask-composite",
  11947    subproperties: ["mask-composite"],
  11948  },
  11949 
  11950  "-webkit-mask-image": {
  11951    domProp: "webkitMaskImage",
  11952    inherited: false,
  11953    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11954    alias_for: "mask-image",
  11955    subproperties: ["mask-image"],
  11956  },
  11957  "-webkit-mask-origin": {
  11958    domProp: "webkitMaskOrigin",
  11959    inherited: false,
  11960    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11961    alias_for: "mask-origin",
  11962    subproperties: ["mask-origin"],
  11963  },
  11964  "-webkit-mask-position": {
  11965    domProp: "webkitMaskPosition",
  11966    inherited: false,
  11967    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11968    alias_for: "mask-position",
  11969    subproperties: ["mask-position"],
  11970  },
  11971  "-webkit-mask-position-x": {
  11972    domProp: "webkitMaskPositionX",
  11973    inherited: false,
  11974    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11975    alias_for: "mask-position-x",
  11976    subproperties: ["mask-position-x"],
  11977  },
  11978  "-webkit-mask-position-y": {
  11979    domProp: "webkitMaskPositionY",
  11980    inherited: false,
  11981    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11982    alias_for: "mask-position-y",
  11983    subproperties: ["mask-position-y"],
  11984  },
  11985  "-webkit-mask-repeat": {
  11986    domProp: "webkitMaskRepeat",
  11987    inherited: false,
  11988    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11989    alias_for: "mask-repeat",
  11990    subproperties: ["mask-repeat"],
  11991  },
  11992  "-webkit-mask-size": {
  11993    domProp: "webkitMaskSize",
  11994    inherited: false,
  11995    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  11996    alias_for: "mask-size",
  11997    subproperties: ["mask-size"],
  11998  },
  11999 }; // end of gCSSProperties
  12000 
  12001 // Get the computed value for a property.  For shorthands, return the
  12002 // computed values of all the subproperties, delimited by " ; ".
  12003 function get_computed_value(cs, property) {
  12004  var info = gCSSProperties[property];
  12005  if (
  12006    info.type == CSS_TYPE_TRUE_SHORTHAND ||
  12007    info.type == CSS_TYPE_LEGACY_SHORTHAND ||
  12008    (info.type == CSS_TYPE_SHORTHAND_AND_LONGHAND &&
  12009      (property == "text-decoration" || property == "mask"))
  12010  ) {
  12011    var results = [];
  12012    for (var idx in info.subproperties) {
  12013      var subprop = info.subproperties[idx];
  12014      results.push(get_computed_value(cs, subprop));
  12015    }
  12016    return results.join(" ; ");
  12017  }
  12018  return cs.getPropertyValue(property);
  12019 }
  12020 
  12021 {
  12022  const mozHiddenUnscrollableEnabled = IsCSSPropertyPrefEnabled(
  12023    "layout.css.overflow-moz-hidden-unscrollable.enabled"
  12024  );
  12025  for (let p of ["overflow", "overflow-x", "overflow-y"]) {
  12026    let prop = gCSSProperties[p];
  12027    let mozHiddenUnscrollableValues = mozHiddenUnscrollableEnabled
  12028      ? prop.other_values
  12029      : prop.invalid_values;
  12030    mozHiddenUnscrollableValues.push("-moz-hidden-unscrollable");
  12031    if (p == "overflow") {
  12032      mozHiddenUnscrollableValues.push(
  12033        "-moz-hidden-unscrollable -moz-hidden-unscrollable"
  12034      );
  12035    }
  12036  }
  12037 }
  12038 
  12039 gCSSProperties.rotate = {
  12040  domProp: "rotate",
  12041  inherited: false,
  12042  type: CSS_TYPE_LONGHAND,
  12043  initial_values: ["none"],
  12044  other_values: [
  12045    "45deg",
  12046    "45grad",
  12047    "72rad",
  12048    "0.25turn",
  12049    ".57rad",
  12050    "0 0 0 0rad",
  12051    "0 0 1 45deg",
  12052    "0 0 1 0rad",
  12053    "0rad 0 0 1",
  12054    "10rad 10 20 30",
  12055    "x 10rad",
  12056    "y 10rad",
  12057    "z 10rad",
  12058    "10rad x",
  12059    "10rad y",
  12060    "10rad z",
  12061    /* valid calc() values */
  12062    "calc(1) 0 0 calc(45deg + 5rad)",
  12063    "0 1 0 calc(400grad + 1rad)",
  12064    "calc(0.5turn + 10deg)",
  12065  ],
  12066  invalid_values: [
  12067    "0",
  12068    "7",
  12069    "0, 0, 1, 45deg",
  12070    "0 0 45deg",
  12071    "0 0 20rad",
  12072    "0 0 0 0",
  12073    "x x 10rad",
  12074    "x y 10rad",
  12075    "0 0 1 10rad z",
  12076    "0 0 1 z 10rad",
  12077    "z 0 0 1 10rad",
  12078    "0 0 z 1 10rad",
  12079    /* invalid calc() values */
  12080    "0.5 1 0 calc(45deg + 10)",
  12081    "calc(0.5turn + 10%)",
  12082  ],
  12083 };
  12084 
  12085 gCSSProperties.translate = {
  12086  domProp: "translate",
  12087  inherited: false,
  12088  type: CSS_TYPE_LONGHAND,
  12089  prerequisites: { width: "10px", height: "10px", display: "block" },
  12090  initial_values: ["none"],
  12091  other_values: [
  12092    "-4px",
  12093    "3px",
  12094    "4em",
  12095    "50%",
  12096    "4px 5px 6px",
  12097    "4px 5px",
  12098    "50% 5px 6px",
  12099    "50% 10% 6em",
  12100    /* valid calc() values */
  12101    "calc(5px + 10%)",
  12102    "calc(0.25 * 5px + 10% / 3)",
  12103    "calc(5px - 10% * 3)",
  12104    "calc(5px - 3 * 10%) 50px",
  12105    "-50px calc(5px - 10% * 3)",
  12106    "10px calc(min(5px,10%))",
  12107  ],
  12108  invalid_values: [
  12109    "1",
  12110    "-moz-min(5px,10%)",
  12111    "4px, 5px, 6px",
  12112    "3px 4px 1px 7px",
  12113    "4px 5px 10%",
  12114    /* invalid calc() values */
  12115    "calc(max(5px,10%) 10%)",
  12116    "calc(nonsense)",
  12117  ],
  12118 };
  12119 gCSSProperties.scale = {
  12120  domProp: "scale",
  12121  inherited: false,
  12122  type: CSS_TYPE_LONGHAND,
  12123  initial_values: ["none"],
  12124  other_values: [
  12125    "10",
  12126    "10%",
  12127    "10 20",
  12128    "10% 20%",
  12129    "10 20 30",
  12130    "10% 20% 30%",
  12131    "10 20% 30",
  12132    "-10",
  12133    "-10%",
  12134    "-10 20",
  12135    "-10% 20%",
  12136    "-10 20 -30",
  12137    "-10% 20% -30%",
  12138    "-10 20% -30",
  12139    "0 2.0",
  12140    /* valid calc() values */
  12141    "calc(1 + 2)",
  12142    "calc(10) calc(20) 30",
  12143  ],
  12144  invalid_values: [
  12145    "10px",
  12146    "10deg",
  12147    "10, 20, 30",
  12148    /* invalid calc() values */
  12149    "calc(1 + 20%)",
  12150    "10 calc(1 + 10px)",
  12151  ],
  12152 };
  12153 
  12154 gCSSProperties["touch-action"] = {
  12155  domProp: "touchAction",
  12156  inherited: false,
  12157  type: CSS_TYPE_LONGHAND,
  12158  initial_values: ["auto"],
  12159  other_values: [
  12160    "none",
  12161    "pan-x",
  12162    "pan-y",
  12163    "pinch-zoom",
  12164    "pan-x pan-y",
  12165    "pan-y pan-x",
  12166    "pinch-zoom pan-x",
  12167    "pinch-zoom pan-y",
  12168    "pan-x pinch-zoom",
  12169    "pan-y pinch-zoom",
  12170    "pinch-zoom pan-x pan-y",
  12171    "pinch-zoom pan-y pan-x",
  12172    "pan-x pinch-zoom pan-y",
  12173    "pan-y pinch-zoom pan-x",
  12174    "pan-x pan-y pinch-zoom",
  12175    "pan-y pan-x pinch-zoom",
  12176    "manipulation",
  12177  ],
  12178  invalid_values: [
  12179    "zoom",
  12180    "pinch",
  12181    "tap",
  12182    "10px",
  12183    "2",
  12184    "auto pan-x",
  12185    "pan-x auto",
  12186    "none pan-x",
  12187    "pan-x none",
  12188    "auto pan-y",
  12189    "pan-y auto",
  12190    "none pan-y",
  12191    "pan-y none",
  12192    "pan-x pan-x",
  12193    "pan-y pan-y",
  12194    "auto pinch-zoom",
  12195    "pinch-zoom auto",
  12196    "none pinch-zoom",
  12197    "pinch-zoom none",
  12198    "pinch-zoom pinch-zoom",
  12199    "pan-x pan-y none",
  12200    "pan-x none pan-y",
  12201    "none pan-x pan-y",
  12202    "pan-y pan-x none",
  12203    "pan-y none pan-x",
  12204    "none pan-y pan-x",
  12205    "pan-x pinch-zoom none",
  12206    "pan-x none pinch-zoom",
  12207    "none pan-x pinch-zoom",
  12208    "pinch-zoom pan-x none",
  12209    "pinch-zoom none pan-x",
  12210    "none pinch-zoom pan-x",
  12211    "pinch-zoom pan-y none",
  12212    "pinch-zoom none pan-y",
  12213    "none pinch-zoom pan-y",
  12214    "pan-y pinch-zoom none",
  12215    "pan-y none pinch-zoom",
  12216    "none pan-y pinch-zoom",
  12217    "pan-x pan-y auto",
  12218    "pan-x auto pan-y",
  12219    "auto pan-x pan-y",
  12220    "pan-y pan-x auto",
  12221    "pan-y auto pan-x",
  12222    "auto pan-y pan-x",
  12223    "pan-x pinch-zoom auto",
  12224    "pan-x auto pinch-zoom",
  12225    "auto pan-x pinch-zoom",
  12226    "pinch-zoom pan-x auto",
  12227    "pinch-zoom auto pan-x",
  12228    "auto pinch-zoom pan-x",
  12229    "pinch-zoom pan-y auto",
  12230    "pinch-zoom auto pan-y",
  12231    "auto pinch-zoom pan-y",
  12232    "pan-y pinch-zoom auto",
  12233    "pan-y auto pinch-zoom",
  12234    "auto pan-y pinch-zoom",
  12235    "pan-x pan-y zoom",
  12236    "pan-x zoom pan-y",
  12237    "zoom pan-x pan-y",
  12238    "pan-y pan-x zoom",
  12239    "pan-y zoom pan-x",
  12240    "zoom pan-y pan-x",
  12241    "pinch-zoom pan-y zoom",
  12242    "pinch-zoom zoom pan-y",
  12243    "zoom pinch-zoom pan-y",
  12244    "pan-y pinch-zoom zoom",
  12245    "pan-y zoom pinch-zoom",
  12246    "zoom pan-y pinch-zoom",
  12247    "pan-x pinch-zoom zoom",
  12248    "pan-x zoom pinch-zoom",
  12249    "zoom pan-x pinch-zoom",
  12250    "pinch-zoom pan-x zoom",
  12251    "pinch-zoom zoom pan-x",
  12252    "zoom pinch-zoom pan-x",
  12253    "pan-x pan-y pan-x",
  12254    "pan-x pan-x pan-y",
  12255    "pan-y pan-x pan-x",
  12256    "pan-y pan-x pan-y",
  12257    "pan-y pan-y pan-x",
  12258    "pan-x pan-y pan-y",
  12259    "pan-x pinch-zoom pan-x",
  12260    "pan-x pan-x pinch-zoom",
  12261    "pinch-zoom pan-x pan-x",
  12262    "pinch-zoom pan-x pinch-zoom",
  12263    "pinch-zoom pinch-zoom pan-x",
  12264    "pan-x pinch-zoom pinch-zoom",
  12265    "pinch-zoom pan-y pinch-zoom",
  12266    "pinch-zoom pinch-zoom pan-y",
  12267    "pan-y pinch-zoom pinch-zoom",
  12268    "pan-y pinch-zoom pan-y",
  12269    "pan-y pan-y pinch-zoom",
  12270    "pinch-zoom pan-y pan-y",
  12271    "manipulation none",
  12272    "none manipulation",
  12273    "manipulation auto",
  12274    "auto manipulation",
  12275    "manipulation zoom",
  12276    "zoom manipulation",
  12277    "manipulation manipulation",
  12278    "manipulation pan-x",
  12279    "pan-x manipulation",
  12280    "manipulation pan-y",
  12281    "pan-y manipulation",
  12282    "manipulation pinch-zoom",
  12283    "pinch-zoom manipulation",
  12284    "manipulation pan-x pan-y",
  12285    "pan-x manipulation pan-y",
  12286    "pan-x pan-y manipulation",
  12287    "manipulation pan-y pan-x",
  12288    "pan-y manipulation pan-x",
  12289    "pan-y pan-x manipulation",
  12290    "manipulation pinch-zoom pan-y",
  12291    "pinch-zoom manipulation pan-y",
  12292    "pinch-zoom pan-y manipulation",
  12293    "manipulation pan-y pinch-zoom",
  12294    "pan-y manipulation pinch-zoom",
  12295    "pan-y pinch-zoom manipulation",
  12296    "manipulation pan-x pinch-zoom",
  12297    "pan-x manipulation pinch-zoom",
  12298    "pan-x pinch-zoom manipulation",
  12299    "manipulation pinch-zoom pan-x",
  12300    "pinch-zoom manipulation pan-x",
  12301    "pinch-zoom pan-x manipulation",
  12302  ],
  12303 };
  12304 
  12305 gCSSProperties["page"] = {
  12306  domProp: "page",
  12307  inherited: false,
  12308  type: CSS_TYPE_LONGHAND,
  12309  initial_values: ["auto"],
  12310  other_values: ["page", "small_page", "large_page", "A4"],
  12311  invalid_values: ["page1 page2", "auto page", "1cm"],
  12312 };
  12313 
  12314 gCSSProperties["text-justify"] = {
  12315  domProp: "textJustify",
  12316  inherited: true,
  12317  type: CSS_TYPE_LONGHAND,
  12318  applies_to_placeholder: true,
  12319  initial_values: ["auto"],
  12320  other_values: ["none", "inter-word", "inter-character", "distribute"],
  12321  invalid_values: [],
  12322 };
  12323 
  12324 if (IsCSSPropertyPrefEnabled("layout.css.font-variations.enabled")) {
  12325  gCSSProperties["font-variation-settings"] = {
  12326    domProp: "fontVariationSettings",
  12327    inherited: true,
  12328    type: CSS_TYPE_LONGHAND,
  12329    applies_to_first_letter: true,
  12330    applies_to_first_line: true,
  12331    applies_to_placeholder: true,
  12332    applies_to_marker: true,
  12333    applies_to_cue: true,
  12334    initial_values: ["normal"],
  12335    other_values: [
  12336      "'wdth' 0",
  12337      "'wdth' -.1",
  12338      '"wdth" 1',
  12339      "'wdth' 2, 'wght' 3",
  12340      '"XXXX" 0',
  12341    ],
  12342    invalid_values: [
  12343      "wdth",
  12344      "wdth 1", // unquoted tags
  12345      "'wdth'",
  12346      "'wdth' 'wght'",
  12347      "'wdth', 'wght'", // missing values
  12348      "'' 1",
  12349      "'wid' 1",
  12350      "'width' 1", // incorrect tag lengths
  12351      "'wd\th' 1", // non-graphic character in tag
  12352      "'wdth' 1 'wght' 2", // missing comma between pairs
  12353      "'wdth' 1,", // trailing comma
  12354      "'wdth' 1 , , 'wght' 2", // extra comma
  12355      "'wdth', 1", // comma within pair
  12356    ],
  12357    unbalanced_values: [
  12358      "'wdth\" 1",
  12359      "\"wdth' 1", // mismatched quotes
  12360    ],
  12361  };
  12362  gCSSProperties["font"].subproperties.push("font-variation-settings");
  12363  gCSSProperties["font-optical-sizing"] = {
  12364    domProp: "fontOpticalSizing",
  12365    inherited: true,
  12366    type: CSS_TYPE_LONGHAND,
  12367    applies_to_first_letter: true,
  12368    applies_to_first_line: true,
  12369    applies_to_placeholder: true,
  12370    applies_to_marker: true,
  12371    applies_to_cue: true,
  12372    initial_values: ["auto"],
  12373    other_values: ["none"],
  12374    invalid_values: ["on"],
  12375  };
  12376  gCSSProperties["font"].subproperties.push("font-optical-sizing");
  12377  gCSSProperties["font-variation-settings"].other_values.push(
  12378    "'vert' calc(2.5)"
  12379  );
  12380 }
  12381 
  12382 if (IsCSSPropertyPrefEnabled("layout.css.font-palette.enabled")) {
  12383  gCSSProperties["font-palette"] = {
  12384    domProp: "fontPalette",
  12385    inherited: true,
  12386    type: CSS_TYPE_LONGHAND,
  12387    applies_to_first_letter: true,
  12388    applies_to_first_line: true,
  12389    applies_to_marker: true,
  12390    applies_to_placeholder: true,
  12391    initial_values: ["normal"],
  12392    other_values: ["light", "dark", "--custom"],
  12393    invalid_values: ["custom"],
  12394  };
  12395 }
  12396 
  12397 if (IsCSSPropertyPrefEnabled("layout.css.font-variant-emoji.enabled")) {
  12398  gCSSProperties["font"].subproperties.push("font-variant-emoji");
  12399  gCSSProperties["font-variant"].subproperties.push("font-variant-emoji");
  12400  gCSSProperties["font-variant-emoji"] = {
  12401    domProp: "fontVariantEmoji",
  12402    inherited: true,
  12403    type: CSS_TYPE_LONGHAND,
  12404    applies_to_first_letter: true,
  12405    applies_to_first_line: true,
  12406    applies_to_marker: true,
  12407    applies_to_placeholder: true,
  12408    applies_to_cue: true,
  12409    initial_values: ["normal"],
  12410    other_values: ["text", "emoji", "unicode"],
  12411    invalid_values: [
  12412      "none",
  12413      "auto",
  12414      "text emoji",
  12415      "auto text",
  12416      "normal, unicode",
  12417    ],
  12418  };
  12419 }
  12420 
  12421 var isGridTemplateMasonryValueEnabled = IsCSSPropertyPrefEnabled(
  12422  "layout.css.grid-template-masonry-value.enabled"
  12423 );
  12424 
  12425 if (isGridTemplateMasonryValueEnabled) {
  12426  gCSSProperties["masonry-auto-flow"] = {
  12427    domProp: "masonryAutoFlow",
  12428    inherited: false,
  12429    type: CSS_TYPE_LONGHAND,
  12430    initial_values: ["pack"],
  12431    other_values: ["pack ordered", "ordered next", "next definite-first"],
  12432    invalid_values: ["auto", "none", "10px", "row", "dense"],
  12433  };
  12434 }
  12435 
  12436 gCSSProperties["display"].other_values.push("grid", "inline-grid");
  12437 gCSSProperties["grid-auto-flow"] = {
  12438  domProp: "gridAutoFlow",
  12439  inherited: false,
  12440  type: CSS_TYPE_LONGHAND,
  12441  initial_values: ["row"],
  12442  other_values: [
  12443    "column",
  12444    "column dense",
  12445    "row dense",
  12446    "dense column",
  12447    "dense row",
  12448    "dense",
  12449  ],
  12450  invalid_values: ["", "auto", "none", "10px", "column row", "dense row dense"],
  12451 };
  12452 
  12453 gCSSProperties["grid-auto-columns"] = {
  12454  domProp: "gridAutoColumns",
  12455  inherited: false,
  12456  type: CSS_TYPE_LONGHAND,
  12457  initial_values: ["auto"],
  12458  other_values: [
  12459    "40px",
  12460    "2em",
  12461    "2.5fr",
  12462    "12%",
  12463    "min-content",
  12464    "max-content",
  12465    "calc(2px - 99%)",
  12466    "minmax(20px, max-content)",
  12467    "minmax(min-content, auto)",
  12468    "minmax(auto, max-content)",
  12469    "m\\69nmax(20px, 4Fr)",
  12470    "MinMax(min-content, calc(20px + 10%))",
  12471    "fit-content(1px)",
  12472    "fit-content(calc(1px - 99%))",
  12473    "fit-content(10%)",
  12474    "40px 12%",
  12475    "2.5fr min-content fit-content(1px)",
  12476  ],
  12477  invalid_values: [
  12478    "",
  12479    "normal",
  12480    "40ms",
  12481    "-40px",
  12482    "-12%",
  12483    "-2em",
  12484    "-2.5fr",
  12485    "minmax()",
  12486    "minmax(20px)",
  12487    "mİnmax(20px, 100px)",
  12488    "minmax(20px, 100px, 200px)",
  12489    "maxmin(100px, 20px)",
  12490    "minmax(min-content, minmax(30px, max-content))",
  12491    "fit-content(-1px)",
  12492    "fit-content(auto)",
  12493    "fit-content(min-content)",
  12494    "1px [a] 1px",
  12495  ],
  12496 };
  12497 gCSSProperties["grid-auto-rows"] = {
  12498  domProp: "gridAutoRows",
  12499  inherited: false,
  12500  type: CSS_TYPE_LONGHAND,
  12501  initial_values: gCSSProperties["grid-auto-columns"].initial_values,
  12502  other_values: gCSSProperties["grid-auto-columns"].other_values,
  12503  invalid_values: gCSSProperties["grid-auto-columns"].invalid_values,
  12504 };
  12505 
  12506 gCSSProperties["grid-template-columns"] = {
  12507  domProp: "gridTemplateColumns",
  12508  inherited: false,
  12509  type: CSS_TYPE_LONGHAND,
  12510  initial_values: ["none"],
  12511  other_values: [
  12512    "auto",
  12513    "40px",
  12514    "2.5fr",
  12515    "[normal] 40px [] auto [ ] 12%",
  12516    "[foo] 40px min-content [ bar ] calc(2px - 99%) max-content",
  12517    "40px min-content calc(20px + 10%) max-content",
  12518    "minmax(min-content, auto)",
  12519    "minmax(auto, max-content)",
  12520    "m\\69nmax(20px, 4Fr)",
  12521    "40px MinMax(min-content, calc(20px + 10%)) max-content",
  12522    "40px 2em",
  12523    "[] 40px [-foo] 2em [bar baz This is one ident]",
  12524    // TODO bug 978478: "[a] repeat(3, [b] 20px [c] 40px [d]) [e]",
  12525    "repeat(1, 20px)",
  12526    "repeat(1, [a] 20px)",
  12527    "[a] Repeat(4, [a] 20px [] auto [b c]) [d]",
  12528    "[a] 2.5fr Repeat(4, [a] 20px [] auto [b c]) [d]",
  12529    "[a] 2.5fr [z] Repeat(4, [a] 20px [] auto [b c]) [d]",
  12530    "[a] 2.5fr [z] Repeat(4, [a] 20px [] auto) [d]",
  12531    "[a] 2.5fr [z] Repeat(4, 20px [b c] auto [b c]) [d]",
  12532    "[a] 2.5fr [z] Repeat(4, 20px auto) [d]",
  12533    "repeat(auto-fill, 0)",
  12534    "[a] repeat( Auto-fill,1%)",
  12535    "minmax(auto,0) [a] repeat(Auto-fit, 0) minmax(0,auto)",
  12536    "minmax(calc(1% + 1px),auto) repeat(Auto-fit,[] 1%) minmax(auto,1%)",
  12537    "[a] repeat( auto-fit,[a b] minmax(0,0) )",
  12538    "[a] 40px repeat(auto-fit,[a b] minmax(1px, 0) [])",
  12539    "[a] calc(1px - 99%) [b] repeat(auto-fit,[a b] minmax(1mm, 1%) [c]) [c]",
  12540    "repeat(auto-fill, 0 0)",
  12541    "repeat(auto-fill, 0 [] 0)",
  12542    "repeat(auto-fill,minmax(1%,auto))",
  12543    "repeat(auto-fill,minmax(1em,min-content)) minmax(min-content,0)",
  12544    "repeat(auto-fill,minmax(max-content,1mm))",
  12545    "repeat(2, fit-content(1px))",
  12546    "fit-content(1px) 1fr",
  12547    "[a] fit-content(calc(1px - 99%)) [b]",
  12548    "[a] fit-content(10%) [b c] fit-content(1em)",
  12549    // See https://bugzilla.mozilla.org/show_bug.cgi?id=981300
  12550    "[none subgrid min-content max-content foo] 40px",
  12551    "subgrid",
  12552    "subgrid [] [foo bar]",
  12553    "subgrid repeat(1, [])",
  12554    "subgrid Repeat(4, [a] [b c] [] [d])",
  12555    "subgrid repeat(auto-fill, [])",
  12556    "subgrid repeat(Auto-fill, [a b c]) [a] []",
  12557    "subgrid [x] repeat( Auto-fill, [a b c]) []",
  12558    "subgrid [x] repeat( auto-fill , [a b] [c]) [y]",
  12559    "subgrid repeat(auto-fill, [a] [b] [c]) [d]",
  12560    "subgrid repeat(Auto-fill, [a] [b c] [] [d])",
  12561    "subgrid [x y] [x] repeat(auto-fill, [a b] [c] [d] [d]) [x] [x]",
  12562    "subgrid [x] repeat(auto-fill, []) [y z]",
  12563    "subgrid [x] repeat(auto-fill, [y]) [z] [] repeat(2, [a] [b]) [y] []",
  12564    "subgrid [x] repeat(auto-fill, []) [x y] [z] [] []",
  12565  ],
  12566  invalid_values: [
  12567    "",
  12568    "normal",
  12569    "40ms",
  12570    "-40px",
  12571    "-12%",
  12572    "-2fr",
  12573    "[foo]",
  12574    "[inherit] 40px",
  12575    "[initial] 40px",
  12576    "[unset] 40px",
  12577    "[default] 40px",
  12578    "[span] 40px",
  12579    "[6%] 40px",
  12580    "[5th] 40px",
  12581    "[foo[] bar] 40px",
  12582    "[foo]] 40px",
  12583    "(foo) 40px",
  12584    "[foo] [bar] 40px",
  12585    "40px [foo] [bar]",
  12586    "minmax()",
  12587    "minmax(20px)",
  12588    "mİnmax(20px, 100px)",
  12589    "minmax(20px, 100px, 200px)",
  12590    "maxmin(100px, 20px)",
  12591    "minmax(min-content, minmax(30px, max-content))",
  12592    "repeat(0, 20px)",
  12593    "repeat(-3, 20px)",
  12594    "rêpeat(1, 20px)",
  12595    "repeat(1)",
  12596    "repeat(1, )",
  12597    "repeat(3px, 20px)",
  12598    "repeat(2.0, 20px)",
  12599    "repeat(2.5, 20px)",
  12600    "repeat(2, (foo))",
  12601    "repeat(2, foo)",
  12602    "40px calc(0px + rubbish)",
  12603    "repeat(1, repeat(1, 20px))",
  12604    "repeat(auto-fill, auto)",
  12605    "repeat(auto-fit,auto)",
  12606    "repeat(auto-fill, fit-content(1px))",
  12607    "repeat(auto-fit, fit-content(1px))",
  12608    "repeat(auto-fit,[])",
  12609    "repeat(auto-fill, 0) repeat(auto-fit, 0) ",
  12610    "repeat(auto-fit, 0) repeat(auto-fill, 0) ",
  12611    "[a] repeat(auto-fit, 0) repeat(auto-fit, 0) ",
  12612    "[a] repeat(auto-fill, 0) [a] repeat(auto-fill, 0) ",
  12613    "repeat(auto-fill, min-content)",
  12614    "repeat(auto-fit,max-content)",
  12615    "repeat(auto-fit,1fr)",
  12616    "repeat(auto-fit,minmax(auto,auto))",
  12617    "repeat(auto-fit,minmax(min-content,1fr))",
  12618    "repeat(auto-fit,minmax(1fr,auto))",
  12619    "repeat(auto-fill,minmax(1fr,1em))",
  12620    "repeat(auto-fill, 10px) auto",
  12621    "auto repeat(auto-fit, 10px)",
  12622    "minmax(min-content,max-content) repeat(auto-fit, 0)",
  12623    "10px [a] 10px [b a] 1fr [b] repeat(auto-fill, 0)",
  12624    "fit-content(-1px)",
  12625    "fit-content(auto)",
  12626    "fit-content(min-content)",
  12627    "fit-content(1px) repeat(auto-fit, 1px)",
  12628    "fit-content(1px) repeat(auto-fill, 1px)",
  12629    "subgrid [inherit]",
  12630    "subgrid [initial]",
  12631    "subgrid [unset]",
  12632    "subgrid [default]",
  12633    "subgrid [span]",
  12634    "subgrid [foo] 40px",
  12635    "subgrid [foo 40px]",
  12636    "[foo] subgrid",
  12637    "subgrid rêpeat(1, [])",
  12638    "subgrid repeat(0, [])",
  12639    "subgrid repeat(-3, [])",
  12640    "subgrid repeat(2.0, [])",
  12641    "subgrid repeat(2.5, [])",
  12642    "subgrid repeat(3px, [])",
  12643    "subgrid repeat(1)",
  12644    "subgrid repeat(1, )",
  12645    "subgrid repeat(2, [40px])",
  12646    "subgrid repeat(2, foo)",
  12647    "subgrid repeat(1, repeat(1, []))",
  12648    "subgrid repeat(auto-fill)",
  12649    "subgrid repeat(auto-fill) [a]",
  12650    "subgrid repeat(auto-fill) []",
  12651    "subgrid [a] repeat(auto-fill)",
  12652    "subgrid repeat(auto-fill,)",
  12653    "subgrid repeat(auto-fill,)",
  12654    "subgrid repeat(auto-fill,) [a]",
  12655    "subgrid repeat(auto-fill,) []",
  12656    "subgrid [a] repeat(auto-fill,)",
  12657    "subgrid repeat(auto-fit,[])",
  12658    "subgrid [] repeat(auto-fit,[])",
  12659    "subgrid [a] repeat(auto-fit,[])",
  12660    "subgrid repeat(auto-fill, 1px)",
  12661    "subgrid repeat(auto-fill, 1px [])",
  12662    "subgrid repeat(auto-fill, []) repeat(auto-fill, [])",
  12663  ],
  12664  unbalanced_values: ["(foo] 40px"],
  12665 };
  12666 if (isGridTemplateMasonryValueEnabled) {
  12667  gCSSProperties["grid-template-columns"].other_values.push("masonry");
  12668  gCSSProperties["grid-template-columns"].invalid_values.push(
  12669    "masonry []",
  12670    "masonry [foo] 40px",
  12671    "masonry 40px",
  12672    "[foo] masonry",
  12673    "0px masonry",
  12674    "masonry masonry",
  12675    "subgrid masonry",
  12676    "masonry subgrid",
  12677    "masonry repeat(1, [])"
  12678  );
  12679 }
  12680 gCSSProperties["grid-template-rows"] = {
  12681  domProp: "gridTemplateRows",
  12682  inherited: false,
  12683  type: CSS_TYPE_LONGHAND,
  12684  initial_values: gCSSProperties["grid-template-columns"].initial_values,
  12685  other_values: gCSSProperties["grid-template-columns"].other_values,
  12686  invalid_values: gCSSProperties["grid-template-columns"].invalid_values,
  12687 };
  12688 gCSSProperties["grid-template-areas"] = {
  12689  domProp: "gridTemplateAreas",
  12690  inherited: false,
  12691  type: CSS_TYPE_LONGHAND,
  12692  initial_values: ["none"],
  12693  other_values: [
  12694    "'1a-é_ .' \"b .\"",
  12695    "' Z\t\\aZ' 'Z Z'",
  12696    " '. . a b'  '. .a b' ",
  12697    "'a.b' '. . .'",
  12698    "'.' '..'",
  12699    "'...' '.'",
  12700    "'...-blah' '. .'",
  12701    "'.. ..' '.. ...'",
  12702  ],
  12703  invalid_values: [
  12704    "''",
  12705    "' '",
  12706    "'' ''",
  12707    "'a b' 'a/b'",
  12708    "'a . a'",
  12709    "'. a a' 'a a a'",
  12710    "'a a .' 'a a a'",
  12711    "'a a' 'a .'",
  12712    "'a a'\n'..'\n'a a'",
  12713  ],
  12714 };
  12715 
  12716 gCSSProperties["grid-template"] = {
  12717  domProp: "gridTemplate",
  12718  inherited: false,
  12719  type: CSS_TYPE_TRUE_SHORTHAND,
  12720  subproperties: [
  12721    "grid-template-areas",
  12722    "grid-template-rows",
  12723    "grid-template-columns",
  12724  ],
  12725  initial_values: ["none", "none / none"],
  12726  other_values: [
  12727    // <'grid-template-rows'> / <'grid-template-columns'>
  12728    "40px / 100px",
  12729    "[foo] 40px [bar] / [baz] repeat(auto-fill,100px) [fizz]",
  12730    " none/100px",
  12731    "40px/none",
  12732    // [ <line-names>? <string> <track-size>? <line-names>? ]+ [ / <explicit-track-list> ]?
  12733    "'fizz'",
  12734    "[bar] 'fizz'",
  12735    "'fizz' / [foo] 40px",
  12736    "[bar] 'fizz' / [foo] 40px",
  12737    "'fizz' 100px / [foo] 40px",
  12738    "[bar] 'fizz' 100px / [foo] 40px",
  12739    "[bar] 'fizz' 100px [buzz] / [foo] 40px",
  12740    "[bar] 'fizz' 100px [buzz] \n [a] '.' 200px [b] / [foo] 40px",
  12741    "subgrid / subgrid",
  12742    "subgrid/40px 20px",
  12743    "subgrid [foo] [] [bar baz] / 40px 20px",
  12744    "40px 20px/subgrid",
  12745    "40px 20px/subgrid  [foo] [] repeat(3, [a] [b]) [bar baz]",
  12746    "subgrid/subgrid",
  12747    "subgrid [foo] [] [bar baz]/subgrid [foo] [] [bar baz]",
  12748  ],
  12749  invalid_values: [
  12750    "'fizz' / repeat(1, 100px)",
  12751    "'fizz' repeat(1, 100px) / 0px",
  12752    "[foo] [bar] 40px / 100px",
  12753    "[fizz] [buzz] 100px / 40px",
  12754    "[fizz] [buzz] 'foo' / 40px",
  12755    "'foo' / none",
  12756    "subgrid",
  12757    "subgrid []",
  12758    "subgrid [] / 'fizz'",
  12759    "subgrid / 'fizz'",
  12760  ],
  12761 };
  12762 if (isGridTemplateMasonryValueEnabled) {
  12763  gCSSProperties["grid-template"].other_values.push(
  12764    "masonry / subgrid",
  12765    "subgrid / masonry",
  12766    "masonry / masonry" /* valid but behaves as 'masonry / none' */,
  12767    "masonry/40px 20px",
  12768    "subgrid [foo] [] [bar baz] / masonry",
  12769    "40px 20px/masonry",
  12770    "masonry/subgrid  [foo] [] repeat(3, [a] [b]) [bar baz]",
  12771    "subgrid [foo] [] [bar baz]/masonry"
  12772  );
  12773  gCSSProperties["grid-template"].invalid_values.push(
  12774    "masonry",
  12775    "masonry / 'fizz'"
  12776  );
  12777 }
  12778 
  12779 gCSSProperties["grid"] = {
  12780  domProp: "grid",
  12781  inherited: false,
  12782  type: CSS_TYPE_TRUE_SHORTHAND,
  12783  subproperties: [
  12784    "grid-template-areas",
  12785    "grid-template-rows",
  12786    "grid-template-columns",
  12787    "grid-auto-flow",
  12788    "grid-auto-rows",
  12789    "grid-auto-columns",
  12790  ],
  12791  initial_values: ["none", "none / none"],
  12792  other_values: [
  12793    "auto-flow 40px / none",
  12794    "auto-flow 40px 100px / 0",
  12795    "auto-flow / 40px",
  12796    "auto-flow dense auto / auto",
  12797    "dense auto-flow minmax(min-content, 2fr) / auto",
  12798    "dense auto-flow / 100px",
  12799    "none / auto-flow 40px",
  12800    "40px / auto-flow",
  12801    "none / dense auto-flow auto",
  12802  ].concat(gCSSProperties["grid-template"].other_values),
  12803  invalid_values: [
  12804    "auto-flow",
  12805    " / auto-flow",
  12806    "dense 0 / 0",
  12807    "dense dense 40px / 0",
  12808    "auto-flow / auto-flow",
  12809    "auto-flow / dense",
  12810    "auto-flow [a] 0 / 0",
  12811    "0 / auto-flow [a] 0",
  12812    "auto-flow -20px / 0",
  12813    "auto-flow 200ms / 0",
  12814    "auto-flow 1px [a] 1px / 0",
  12815  ].concat(
  12816    gCSSProperties["grid-template"].invalid_values,
  12817    gCSSProperties["grid-auto-flow"].other_values,
  12818    gCSSProperties["grid-auto-flow"].invalid_values.filter(v => v != "none")
  12819  ),
  12820 };
  12821 
  12822 var gridLineOtherValues = [
  12823  "foo",
  12824  "2",
  12825  "2 foo",
  12826  "foo 2",
  12827  "-3",
  12828  "-3 bar",
  12829  "bar -3",
  12830  "span 2",
  12831  "2 span",
  12832  "span foo",
  12833  "foo span",
  12834  "span 2 foo",
  12835  "span foo 2",
  12836  "2 foo span",
  12837  "foo 2 span",
  12838 ];
  12839 var gridLineInvalidValues = [
  12840  "",
  12841  "4th",
  12842  "span",
  12843  "inherit 2",
  12844  "2 inherit",
  12845  "20px",
  12846  "2 3",
  12847  "2.5",
  12848  "2.0",
  12849  "0",
  12850  "0 foo",
  12851  "span 0",
  12852  "2 foo 3",
  12853  "foo 2 foo",
  12854  "2 span foo",
  12855  "foo span 2",
  12856  "span -3",
  12857  "span -3 bar",
  12858  "span 2 span",
  12859  "span foo span",
  12860  "span 2 foo span",
  12861 ];
  12862 
  12863 gCSSProperties["grid-column-start"] = {
  12864  domProp: "gridColumnStart",
  12865  inherited: false,
  12866  type: CSS_TYPE_LONGHAND,
  12867  initial_values: ["auto"],
  12868  other_values: gridLineOtherValues,
  12869  invalid_values: gridLineInvalidValues,
  12870 };
  12871 gCSSProperties["grid-column-end"] = {
  12872  domProp: "gridColumnEnd",
  12873  inherited: false,
  12874  type: CSS_TYPE_LONGHAND,
  12875  initial_values: ["auto"],
  12876  other_values: gridLineOtherValues,
  12877  invalid_values: gridLineInvalidValues,
  12878 };
  12879 gCSSProperties["grid-row-start"] = {
  12880  domProp: "gridRowStart",
  12881  inherited: false,
  12882  type: CSS_TYPE_LONGHAND,
  12883  initial_values: ["auto"],
  12884  other_values: gridLineOtherValues,
  12885  invalid_values: gridLineInvalidValues,
  12886 };
  12887 gCSSProperties["grid-row-end"] = {
  12888  domProp: "gridRowEnd",
  12889  inherited: false,
  12890  type: CSS_TYPE_LONGHAND,
  12891  initial_values: ["auto"],
  12892  other_values: gridLineOtherValues,
  12893  invalid_values: gridLineInvalidValues,
  12894 };
  12895 
  12896 // The grid-column and grid-row shorthands take values of the form
  12897 //   <grid-line> [ / <grid-line> ]?
  12898 var gridColumnRowOtherValues = [].concat(gridLineOtherValues);
  12899 gridLineOtherValues.concat(["auto"]).forEach(function (val) {
  12900  gridColumnRowOtherValues.push(" foo / " + val);
  12901  gridColumnRowOtherValues.push(val + "/2");
  12902 });
  12903 var gridColumnRowInvalidValues = ["foo, bar", "foo / bar / baz"].concat(
  12904  gridLineInvalidValues
  12905 );
  12906 gridLineInvalidValues.forEach(function (val) {
  12907  gridColumnRowInvalidValues.push("span 3 / " + val);
  12908  gridColumnRowInvalidValues.push(val + " / foo");
  12909 });
  12910 gCSSProperties["grid-column"] = {
  12911  domProp: "gridColumn",
  12912  inherited: false,
  12913  type: CSS_TYPE_TRUE_SHORTHAND,
  12914  subproperties: ["grid-column-start", "grid-column-end"],
  12915  initial_values: ["auto", "auto / auto"],
  12916  other_values: gridColumnRowOtherValues,
  12917  invalid_values: gridColumnRowInvalidValues,
  12918 };
  12919 gCSSProperties["grid-row"] = {
  12920  domProp: "gridRow",
  12921  inherited: false,
  12922  type: CSS_TYPE_TRUE_SHORTHAND,
  12923  subproperties: ["grid-row-start", "grid-row-end"],
  12924  initial_values: ["auto", "auto / auto"],
  12925  other_values: gridColumnRowOtherValues,
  12926  invalid_values: gridColumnRowInvalidValues,
  12927 };
  12928 
  12929 var gridAreaOtherValues = gridLineOtherValues.slice();
  12930 gridLineOtherValues.forEach(function (val) {
  12931  gridAreaOtherValues.push("foo / " + val);
  12932  gridAreaOtherValues.push(val + "/2/3");
  12933  gridAreaOtherValues.push("foo / bar / " + val + " / baz");
  12934 });
  12935 var gridAreaInvalidValues = [
  12936  "foo, bar",
  12937  "foo / bar / baz / fizz / buzz",
  12938  "default / foo / bar / baz",
  12939  "foo / initial / bar / baz",
  12940  "foo / bar / inherit / baz",
  12941  "foo / bar / baz / unset",
  12942 ].concat(gridLineInvalidValues);
  12943 gridLineInvalidValues.forEach(function (val) {
  12944  gridAreaInvalidValues.push("foo / " + val);
  12945  gridAreaInvalidValues.push("foo / bar / " + val);
  12946  gridAreaInvalidValues.push("foo / 4 / bar / " + val);
  12947 });
  12948 
  12949 gCSSProperties["grid-area"] = {
  12950  domProp: "gridArea",
  12951  inherited: false,
  12952  type: CSS_TYPE_TRUE_SHORTHAND,
  12953  subproperties: [
  12954    "grid-row-start",
  12955    "grid-column-start",
  12956    "grid-row-end",
  12957    "grid-column-end",
  12958  ],
  12959  initial_values: [
  12960    "auto",
  12961    "auto / auto",
  12962    "auto / auto / auto",
  12963    "auto / auto / auto / auto",
  12964  ],
  12965  other_values: gridAreaOtherValues,
  12966  invalid_values: gridAreaInvalidValues,
  12967 };
  12968 
  12969 gCSSProperties["column-gap"] = {
  12970  domProp: "columnGap",
  12971  inherited: false,
  12972  type: CSS_TYPE_LONGHAND,
  12973  initial_values: ["normal"],
  12974  other_values: [
  12975    "2px",
  12976    "2%",
  12977    "1em",
  12978    "calc(1px + 1em)",
  12979    "calc(1%)",
  12980    "calc(1% + 1ch)",
  12981    "calc(1px - 99%)",
  12982  ],
  12983  invalid_values: [
  12984    "-1px",
  12985    "auto",
  12986    "none",
  12987    "1px 1px",
  12988    "-1%",
  12989    "fit-content(1px)",
  12990  ],
  12991 };
  12992 gCSSProperties["grid-column-gap"] = {
  12993  domProp: "gridColumnGap",
  12994  inherited: false,
  12995  type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  12996  alias_for: "column-gap",
  12997  subproperties: ["column-gap"],
  12998 };
  12999 gCSSProperties["row-gap"] = {
  13000  domProp: "rowGap",
  13001  inherited: false,
  13002  type: CSS_TYPE_LONGHAND,
  13003  initial_values: ["normal"],
  13004  other_values: [
  13005    "2px",
  13006    "2%",
  13007    "1em",
  13008    "calc(1px + 1em)",
  13009    "calc(1%)",
  13010    "calc(1% + 1ch)",
  13011    "calc(1px - 99%)",
  13012  ],
  13013  invalid_values: ["-1px", "auto", "none", "1px 1px", "-1%", "min-content"],
  13014 };
  13015 gCSSProperties["grid-row-gap"] = {
  13016  domProp: "gridRowGap",
  13017  inherited: false,
  13018  type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  13019  alias_for: "row-gap",
  13020  subproperties: ["row-gap"],
  13021 };
  13022 gCSSProperties["gap"] = {
  13023  domProp: "gap",
  13024  inherited: false,
  13025  type: CSS_TYPE_TRUE_SHORTHAND,
  13026  subproperties: ["column-gap", "row-gap"],
  13027  initial_values: ["normal", "normal normal"],
  13028  other_values: [
  13029    "1ch 0",
  13030    "1px 1%",
  13031    "1em 1px",
  13032    "calc(1px) calc(1%)",
  13033    "normal 0",
  13034    "1% normal",
  13035  ],
  13036  invalid_values: [
  13037    "-1px",
  13038    "1px -1px",
  13039    "1px 1px 1px",
  13040    "inherit 1px",
  13041    "1px auto",
  13042  ],
  13043 };
  13044 gCSSProperties["grid-gap"] = {
  13045  domProp: "gridGap",
  13046  inherited: false,
  13047  type: CSS_TYPE_TRUE_SHORTHAND,
  13048  alias_for: "gap",
  13049  subproperties: ["column-gap", "row-gap"],
  13050 };
  13051 
  13052 gCSSProperties["contain"] = {
  13053  domProp: "contain",
  13054  inherited: false,
  13055  type: CSS_TYPE_LONGHAND,
  13056  initial_values: ["none"],
  13057  other_values: [
  13058    "strict",
  13059    "layout",
  13060    "size",
  13061    "content",
  13062    "paint",
  13063    "layout paint",
  13064    "paint layout",
  13065    "size layout",
  13066    "paint size",
  13067    "layout size paint",
  13068    "layout paint size",
  13069    "size paint layout",
  13070    "paint size layout",
  13071  ],
  13072  invalid_values: [
  13073    "none strict",
  13074    "none size",
  13075    "strict layout",
  13076    "strict layout size",
  13077    "layout strict",
  13078    "layout content",
  13079    "strict content",
  13080    "layout size strict",
  13081    "layout size paint strict",
  13082    "paint strict",
  13083    "size strict",
  13084    "paint paint",
  13085    "content content",
  13086    "size content",
  13087    "content strict size",
  13088    "paint layout content",
  13089    "layout size content",
  13090    "size size",
  13091    "strict strict",
  13092    "auto",
  13093    "10px",
  13094    "0",
  13095  ],
  13096 };
  13097 
  13098 if (IsCSSPropertyPrefEnabled("layout.css.initial-letter.enabled")) {
  13099  gCSSProperties["initial-letter"] = {
  13100    domProp: "initialLetter",
  13101    inherited: false,
  13102    type: CSS_TYPE_LONGHAND,
  13103    applies_to_first_letter: true,
  13104    initial_values: ["normal"],
  13105    other_values: ["2", "2.5", "3.7 2", "4 3"],
  13106    invalid_values: ["-3", "3.7 -2", "25%", "16px", "1 0", "0", "0 1"],
  13107  };
  13108 }
  13109 
  13110 if (IsCSSPropertyPrefEnabled("layout.css.osx-font-smoothing.enabled")) {
  13111  gCSSProperties["-moz-osx-font-smoothing"] = {
  13112    domProp: "MozOsxFontSmoothing",
  13113    inherited: true,
  13114    type: CSS_TYPE_LONGHAND,
  13115    applies_to_first_letter: true,
  13116    applies_to_first_line: true,
  13117    applies_to_placeholder: true,
  13118    applies_to_cue: true,
  13119    applies_to_marker: true,
  13120    initial_values: ["auto"],
  13121    other_values: ["grayscale", "subpixel-antialiased", "antialiased"],
  13122    invalid_values: ["none"],
  13123  };
  13124 
  13125  gCSSProperties["-webkit-font-smoothing"] = {
  13126    domProp: "webkitFontSmoothing",
  13127    inherited: true,
  13128    type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  13129    applies_to_first_letter: true,
  13130    applies_to_first_line: true,
  13131    applies_to_placeholder: true,
  13132    applies_to_cue: true,
  13133    applies_to_marker: true,
  13134    alias_for: "-moz-osx-font-smoothing",
  13135    subproperties: ["-moz-osx-font-smoothing"],
  13136  };
  13137 }
  13138 
  13139 if (IsCSSPropertyPrefEnabled("layout.css.scroll-anchoring.enabled")) {
  13140  gCSSProperties["overflow-anchor"] = {
  13141    domProp: "overflowAnchor",
  13142    inherited: false,
  13143    type: CSS_TYPE_LONGHAND,
  13144    initial_values: ["auto"],
  13145    other_values: ["none"],
  13146    invalid_values: [],
  13147  };
  13148 }
  13149 
  13150 gCSSProperties["overscroll-behavior-x"] = {
  13151  domProp: "overscrollBehaviorX",
  13152  inherited: false,
  13153  type: CSS_TYPE_LONGHAND,
  13154  initial_values: ["auto"],
  13155  other_values: ["contain", "none"],
  13156  invalid_values: ["left", "1px"],
  13157 };
  13158 gCSSProperties["overscroll-behavior-y"] = {
  13159  domProp: "overscrollBehaviorY",
  13160  inherited: false,
  13161  type: CSS_TYPE_LONGHAND,
  13162  initial_values: ["auto"],
  13163  other_values: ["contain", "none"],
  13164  invalid_values: ["left", "1px"],
  13165 };
  13166 gCSSProperties["overscroll-behavior-inline"] = {
  13167  domProp: "overscrollBehaviorInline",
  13168  inherited: false,
  13169  logical: true,
  13170  type: CSS_TYPE_LONGHAND,
  13171  initial_values: ["auto"],
  13172  other_values: ["contain", "none"],
  13173  invalid_values: ["left", "1px"],
  13174 };
  13175 gCSSProperties["overscroll-behavior-block"] = {
  13176  domProp: "overscrollBehaviorBlock",
  13177  inherited: false,
  13178  logical: true,
  13179  type: CSS_TYPE_LONGHAND,
  13180  initial_values: ["auto"],
  13181  other_values: ["contain", "none"],
  13182  invalid_values: ["left", "1px"],
  13183 };
  13184 gCSSProperties["overscroll-behavior"] = {
  13185  domProp: "overscrollBehavior",
  13186  inherited: false,
  13187  type: CSS_TYPE_TRUE_SHORTHAND,
  13188  subproperties: ["overscroll-behavior-x", "overscroll-behavior-y"],
  13189  initial_values: ["auto"],
  13190  other_values: [
  13191    "contain",
  13192    "none",
  13193    "contain contain",
  13194    "contain auto",
  13195    "none contain",
  13196  ],
  13197  invalid_values: ["left", "1px", "contain auto none", "contain nonsense"],
  13198 };
  13199 
  13200 {
  13201  const patterns = {
  13202    background: [
  13203      "{} scroll no-repeat",
  13204      "{} repeat",
  13205      "url(404.png), {}, -moz-element(#a) black",
  13206    ],
  13207    mask: [
  13208      "{} add no-repeat",
  13209      "{} repeat",
  13210      "url(404.png), {}, -moz-element(#a) alpha",
  13211    ],
  13212  };
  13213 
  13214  for (const prop of ["background", "mask"]) {
  13215    let i = 0;
  13216    const p = patterns[prop];
  13217    for (const v of invalidNonUrlImageValues) {
  13218      gCSSProperties[prop].invalid_values.push(
  13219        p[i++ % p.length].replace("{}", v)
  13220      );
  13221    }
  13222    for (const v of validNonUrlImageValues) {
  13223      gCSSProperties[prop].other_values.push(
  13224        p[i++ % p.length].replace("{}", v)
  13225      );
  13226    }
  13227  }
  13228 }
  13229 
  13230 // XXXdholbert The formerly-pref-controlled assignments below should all just
  13231 // merge into the major gCSSProperties = { ... } bundle above.
  13232 gCSSProperties["display"].other_values.push("flow-root");
  13233 
  13234 gCSSProperties["hyphenate-character"] = {
  13235  domProp: "hyphenateCharacter",
  13236  inherited: true,
  13237  type: CSS_TYPE_LONGHAND,
  13238  applies_to_first_letter: true,
  13239  applies_to_first_line: true,
  13240  applies_to_placeholder: true,
  13241  initial_values: ["auto"],
  13242  other_values: ['"="', '"/-/"', '"\1400"', '""'],
  13243  invalid_values: ["none", "auto auto", "1400", "U+1400"],
  13244 };
  13245 
  13246 gCSSProperties["content-visibility"] = {
  13247  domProp: "contentVisibility",
  13248  inherited: false,
  13249  type: CSS_TYPE_LONGHAND,
  13250  initial_values: ["visible"],
  13251  other_values: ["auto", "hidden"],
  13252  invalid_values: [
  13253    "invisible",
  13254    "partially-visible",
  13255    "auto auto",
  13256    "visible hidden",
  13257  ],
  13258 };
  13259 
  13260 gCSSProperties["contain-intrinsic-width"] = {
  13261  domProp: "containIntrinsicWidth",
  13262  inherited: false,
  13263  type: CSS_TYPE_LONGHAND,
  13264  initial_values: ["none"],
  13265  other_values: ["1em", "1px", "auto 1px", "auto none"],
  13266  invalid_values: ["auto auto", "auto", "-1px"],
  13267 };
  13268 gCSSProperties["contain-intrinsic-height"] = {
  13269  domProp: "containIntrinsicHeight",
  13270  inherited: false,
  13271  type: CSS_TYPE_LONGHAND,
  13272  initial_values: ["none"],
  13273  other_values: ["1em", "1px", "auto 1px", "auto none"],
  13274  invalid_values: ["auto auto", "auto", "-1px"],
  13275 };
  13276 gCSSProperties["contain-intrinsic-block-size"] = {
  13277  domProp: "containIntrinsicBlockSize",
  13278  inherited: false,
  13279  logical: true,
  13280  type: CSS_TYPE_LONGHAND,
  13281  initial_values: ["none"],
  13282  other_values: ["1em", "1px", "auto 1px", "auto none"],
  13283  invalid_values: ["auto auto", "auto", "-1px"],
  13284 };
  13285 gCSSProperties["contain-intrinsic-inline-size"] = {
  13286  domProp: "containIntrinsicInlineSize",
  13287  inherited: false,
  13288  logical: true,
  13289  type: CSS_TYPE_LONGHAND,
  13290  initial_values: ["none"],
  13291  other_values: ["1em", "1px", "auto 1px", "auto none"],
  13292  invalid_values: ["auto auto", "auto", "-1px"],
  13293 };
  13294 
  13295 gCSSProperties["contain-intrinsic-size"] = {
  13296  domProp: "containIntrinsicSize",
  13297  inherited: false,
  13298  type: CSS_TYPE_TRUE_SHORTHAND,
  13299  subproperties: ["contain-intrinsic-width", "contain-intrinsic-height"],
  13300  initial_values: ["none"],
  13301  other_values: ["1em 1em", "1px 1px", "auto 1px auto 1px", "1px auto 1px"],
  13302  invalid_values: ["auto auto", "-1px -1px", "1px, auto none"],
  13303 };
  13304 
  13305 if (IsCSSPropertyPrefEnabled("layout.css.anchor-positioning.enabled")) {
  13306  gCSSProperties["anchor-name"] = {
  13307    domProp: "anchorName",
  13308    inherited: false,
  13309    type: CSS_TYPE_LONGHAND,
  13310    initial_values: ["none"],
  13311    other_values: ["--foo", "--foo, --baz", "--foo,--baz", "--foo ,--baz"],
  13312    invalid_values: [
  13313      "--foo --bar",
  13314      "foo",
  13315      "none bar",
  13316      "none --baz",
  13317      "--foo bar",
  13318      ",--foo",
  13319      "--foo,",
  13320    ],
  13321  };
  13322 
  13323  gCSSProperties["anchor-scope"] = {
  13324    domProp: "anchorScope",
  13325    inherited: false,
  13326    type: CSS_TYPE_LONGHAND,
  13327    initial_values: ["none"],
  13328    other_values: [
  13329      "all",
  13330      "--foo",
  13331      "--foo, --baz",
  13332      "--foo,--baz",
  13333      "--foo ,--baz",
  13334    ],
  13335    invalid_values: [
  13336      "all, --foo",
  13337      "--foo, all",
  13338      "--foo --bar",
  13339      "foo",
  13340      "none bar",
  13341      "none --baz",
  13342      "--foo bar",
  13343      ",--foo",
  13344      "--foo,",
  13345    ],
  13346  };
  13347 
  13348  gCSSProperties["position-anchor"] = {
  13349    domProp: "positionAnchor",
  13350    inherited: false,
  13351    type: CSS_TYPE_LONGHAND,
  13352    initial_values: ["none"],
  13353    other_values: ["auto", "--foo"],
  13354    invalid_values: [
  13355      "normal",
  13356      "none, auto",
  13357      "--foo none",
  13358      "--foo, auto",
  13359      "auto, --bar",
  13360      "foo",
  13361    ],
  13362  };
  13363 
  13364  gCSSProperties["position-area"] = {
  13365    domProp: "positionArea",
  13366    inherited: false,
  13367    type: CSS_TYPE_LONGHAND,
  13368    initial_values: ["none"],
  13369    other_values: [
  13370      "center",
  13371      "span-all",
  13372      "left",
  13373      "right",
  13374      "span-left",
  13375      "span-right",
  13376      "x-start",
  13377      "x-end",
  13378      "span-x-start",
  13379      "span-x-end",
  13380      "self-x-start",
  13381      "self-x-end",
  13382      "span-self-x-start",
  13383      "span-self-x-end",
  13384      "top",
  13385      "bottom",
  13386      "span-top",
  13387      "span-bottom",
  13388      "y-start",
  13389      "y-end",
  13390      "span-y-start",
  13391      "span-y-end",
  13392      "self-y-start",
  13393      "self-y-end",
  13394      "span-self-y-start",
  13395      "span-self-y-end",
  13396      "block-start",
  13397      "block-end",
  13398      "span-block-start",
  13399      "span-block-end",
  13400      "inline-start",
  13401      "inline-end",
  13402      "span-inline-start",
  13403      "span-inline-end",
  13404      "self-block-start",
  13405      "self-block-end",
  13406      "span-self-block-start",
  13407      "span-self-block-end",
  13408      "self-inline-start",
  13409      "self-inline-end",
  13410      "span-self-inline-start",
  13411      "span-self-inline-end",
  13412      "start",
  13413      "end",
  13414      "span-start",
  13415      "span-end",
  13416      "self-start",
  13417      "self-end",
  13418      "span-self-start",
  13419      "span-self-end",
  13420      "center span-all",
  13421      "left center",
  13422      "span-left bottom",
  13423      "span-block-end inline-start",
  13424      "span-inline-start block-end",
  13425      "self-block-end span-self-inline-start",
  13426      "start center",
  13427      "span-start span-end",
  13428      "self-end span-self-start",
  13429    ],
  13430    invalid_values: [
  13431      "auto",
  13432      "none left",
  13433      "left self-top",
  13434      "right block-end",
  13435      "top self-end",
  13436      "inline-start self-block-end",
  13437      "span-self-inline-start start",
  13438      "end span-self-start",
  13439    ],
  13440  };
  13441 
  13442  gCSSProperties["position-try-fallbacks"] = {
  13443    domProp: "positionTryFallbacks",
  13444    inherited: false,
  13445    type: CSS_TYPE_LONGHAND,
  13446    initial_values: ["none"],
  13447    other_values: [
  13448      "--foo",
  13449      "flip-block",
  13450      "flip-inline",
  13451      "flip-x",
  13452      "flip-y",
  13453      "flip-start",
  13454      "left",
  13455      "span-y-start",
  13456      "span-block-start inline-end",
  13457      "span-all self-block-end",
  13458      "end span-start",
  13459      "center span-all",
  13460    ],
  13461    invalid_values: ["foo", "none none", "span-y-start self-block-end"],
  13462  };
  13463 
  13464  const tryOrderEnabled = IsCSSPropertyPrefEnabled(
  13465    "layout.css.anchor-positioning.position-try-order.enabled"
  13466  );
  13467  if (tryOrderEnabled) {
  13468    gCSSProperties["position-try-order"] = {
  13469      domProp: "positionTryOrder",
  13470      inherited: false,
  13471      type: CSS_TYPE_LONGHAND,
  13472      initial_values: ["normal"],
  13473      other_values: [
  13474        "most-width",
  13475        "most-height",
  13476        "most-block-size",
  13477        "most-inline-size",
  13478      ],
  13479      invalid_values: ["auto", "none", "foo"],
  13480    };
  13481  }
  13482 
  13483  gCSSProperties["position-visibility"] = {
  13484    domProp: "positionVisibility",
  13485    inherited: false,
  13486    type: CSS_TYPE_LONGHAND,
  13487    initial_values: ["anchors-visible"],
  13488    other_values: ["anchors-valid", "always", "no-overflow"],
  13489    invalid_values: [
  13490      "none",
  13491      "auto",
  13492      "always anchors-valid",
  13493      "anchors-visible always",
  13494    ],
  13495  };
  13496 
  13497  gCSSProperties["position-try"] = {
  13498    domProp: "positionTry",
  13499    inherited: false,
  13500    type: CSS_TYPE_TRUE_SHORTHAND,
  13501    subproperties: ["position-try-fallbacks"],
  13502    initial_values: ["none"],
  13503    other_values: [
  13504      "--foo",
  13505      "flip-block",
  13506      "flip-inline",
  13507      "flip-x",
  13508      "flip-y",
  13509      "flip-start",
  13510      "left",
  13511      "span-y-start",
  13512      "span-block-start inline-end",
  13513      "span-all self-block-end",
  13514      "end span-start",
  13515      "center span-all",
  13516    ],
  13517    invalid_values: [
  13518      "foo",
  13519      "--foo none none",
  13520      "--foo span-y-start self-block-end",
  13521    ],
  13522  };
  13523  if (tryOrderEnabled) {
  13524    gCSSProperties["position-try"].subproperties.push("position-try-order");
  13525  }
  13526  const positionTryValuesWithOrder = [
  13527    "most-width --foo",
  13528    "most-width flip-block",
  13529    "most-width flip-inline",
  13530    "most-width flip-x",
  13531    "most-width flip-y",
  13532    "most-width flip-start",
  13533    "most-width left",
  13534    "most-width span-y-start",
  13535    "most-width span-block-start inline-end",
  13536    "most-width span-all self-block-end",
  13537    "most-width end span-start",
  13538    "most-width center span-all",
  13539    "most-height --foo",
  13540    "most-height flip-block",
  13541    "most-height flip-inline",
  13542    "most-height flip-x",
  13543    "most-height flip-y",
  13544    "most-height flip-start",
  13545    "most-height left",
  13546    "most-height span-y-start",
  13547    "most-height span-block-start inline-end",
  13548    "most-height span-all self-block-end",
  13549    "most-height end span-start",
  13550    "most-height center span-all",
  13551    "most-block-size --foo",
  13552    "most-block-size flip-block",
  13553    "most-block-size flip-inline",
  13554    "most-block-size flip-x",
  13555    "most-block-size flip-y",
  13556    "most-block-size flip-start",
  13557    "most-block-size left",
  13558    "most-block-size span-y-start",
  13559    "most-block-size span-block-start inline-end",
  13560    "most-block-size span-all self-block-end",
  13561    "most-block-size end span-start",
  13562    "most-block-size center span-all",
  13563    "most-inline-size --foo",
  13564    "most-inline-size flip-block",
  13565    "most-inline-size flip-inline",
  13566    "most-inline-size flip-x",
  13567    "most-inline-size flip-y",
  13568    "most-inline-size flip-start",
  13569    "most-inline-size left",
  13570    "most-inline-size span-y-start",
  13571    "most-inline-size span-block-start inline-end",
  13572    "most-inline-size span-all self-block-end",
  13573    "most-inline-size end span-start",
  13574    "most-inline-size center span-all",
  13575  ];
  13576  (tryOrderEnabled
  13577    ? gCSSProperties["position-try"].other_values
  13578    : gCSSProperties["position-try"].invalid_values
  13579  ).push(...positionTryValuesWithOrder);
  13580 }
  13581 
  13582 if (IsCSSPropertyPrefEnabled("layout.css.scroll-state.enabled")) {
  13583  gCSSProperties["container-type"].other_values.push(
  13584    "scroll-state",
  13585    "size scroll-state",
  13586    "scroll-state size",
  13587    "inline-size scroll-state",
  13588    "scroll-state inline-size"
  13589  );
  13590 }
  13591 
  13592 gCSSProperties["hyphenate-limit-chars"] = {
  13593  domProp: "hyphenateLimitChars",
  13594  inherited: true,
  13595  type: CSS_TYPE_LONGHAND,
  13596  applies_to_first_letter: true,
  13597  applies_to_first_line: true,
  13598  applies_to_placeholder: true,
  13599  initial_values: ["auto"],
  13600  other_values: ["6", "6 2", "8 2 4", "6 2 auto", "6 auto 4"],
  13601  invalid_values: ["none", "auto auto auto auto", "1 2 3 4", '"string"'],
  13602 };
  13603 
  13604 if (false) {
  13605  // TODO These properties are chrome-only, and are not exposed via CSSOM.
  13606  // We may still want to find a way to test them. See bug 1206999.
  13607  gCSSProperties["-moz-window-shadow"] = {
  13608    //domProp: "MozWindowShadow",
  13609    inherited: false,
  13610    type: CSS_TYPE_LONGHAND,
  13611    initial_values: ["default"],
  13612    other_values: ["none", "menu", "tooltip", "sheet", "cliprounded"],
  13613    invalid_values: [],
  13614  };
  13615 
  13616  gCSSProperties["-moz-window-opacity"] = {
  13617    // domProp: "MozWindowOpacity",
  13618    inherited: false,
  13619    type: CSS_TYPE_LONGHAND,
  13620    initial_values: [
  13621      "1",
  13622      "17",
  13623      "397.376",
  13624      "3e1",
  13625      "3e+1",
  13626      "3e0",
  13627      "3e+0",
  13628      "3e-0",
  13629      "300%",
  13630    ],
  13631    other_values: ["0", "0.4", "0.0000", "-3", "3e-1", "-100%", "50%"],
  13632    invalid_values: ["0px", "1px", "20%", "default", "auto"],
  13633  };
  13634 
  13635  gCSSProperties["-moz-window-transform"] = {
  13636    // domProp: "MozWindowTransform",
  13637    inherited: false,
  13638    type: CSS_TYPE_LONGHAND,
  13639    prerequisites: { width: "300px", height: "50px" },
  13640    initial_values: ["none"],
  13641    other_values: [
  13642      "translatex(1px)",
  13643      "translatex(4em)",
  13644      "translatex(-4px)",
  13645      "translatex(3px)",
  13646      "translatex(0px) translatex(1px) translatex(2px) translatex(3px) translatex(4px)",
  13647      "translatey(4em)",
  13648      "translate(3px)",
  13649      "translate(10px, -3px)",
  13650      "rotate(45deg)",
  13651      "rotate(45grad)",
  13652      "rotate(45rad)",
  13653      "rotate(0.25turn)",
  13654      "rotate(0)",
  13655      "scalex(10)",
  13656      "scalex(10%)",
  13657      "scalex(-10)",
  13658      "scalex(-10%)",
  13659      "scaley(10)",
  13660      "scaley(10%)",
  13661      "scaley(-10)",
  13662      "scaley(-10%)",
  13663      "scale(10)",
  13664      "scale(10%)",
  13665      "scale(10, 20)",
  13666      "scale(10%, 20%)",
  13667      "scale(-10)",
  13668      "scale(-10%)",
  13669      "scale(-10, 20)",
  13670      "scale(10%, -20%)",
  13671      "scale(10, 20%)",
  13672      "scale(-10, 20%)",
  13673      "skewx(30deg)",
  13674      "skewx(0)",
  13675      "skewy(0)",
  13676      "skewx(30grad)",
  13677      "skewx(30rad)",
  13678      "skewx(0.08turn)",
  13679      "skewy(30deg)",
  13680      "skewy(30grad)",
  13681      "skewy(30rad)",
  13682      "skewy(0.08turn)",
  13683      "rotate(45deg) scale(2, 1)",
  13684      "skewx(45deg) skewx(-50grad)",
  13685      "translate(0, 0) scale(1, 1) skewx(0) skewy(0) matrix(1, 0, 0, 1, 0, 0)",
  13686      "translatex(50%)",
  13687      "translatey(50%)",
  13688      "translate(50%)",
  13689      "translate(3%, 5px)",
  13690      "translate(5px, 3%)",
  13691      "matrix(1, 2, 3, 4, 5, 6)",
  13692      /* valid calc() values */
  13693      "translatex(calc(5px + 10%))",
  13694      "translatey(calc(0.25 * 5px + 10% / 3))",
  13695      "translate(calc(5px - 10% * 3))",
  13696      "translate(calc(5px - 3 * 10%), 50px)",
  13697      "translate(-50px, calc(5px - 10% * 3))",
  13698      "translatez(1px)",
  13699      "translatez(4em)",
  13700      "translatez(-4px)",
  13701      "translatez(0px)",
  13702      "translatez(2px) translatez(5px)",
  13703      "translate3d(3px, 4px, 5px)",
  13704      "translate3d(2em, 3px, 1em)",
  13705      "translatex(2px) translate3d(4px, 5px, 6px) translatey(1px)",
  13706      "scale3d(4, 4, 4)",
  13707      "scale3d(4%, 4%, 4%)",
  13708      "scale3d(-2, 3, -7)",
  13709      "scale3d(-2%, 3%, -7%)",
  13710      "scalez(4)",
  13711      "scalez(4%)",
  13712      "scalez(-6)",
  13713      "scalez(-6%)",
  13714      "rotate3d(2, 3, 4, 45deg)",
  13715      "rotate3d(-3, 7, 0, 12rad)",
  13716      "rotatex(15deg)",
  13717      "rotatey(-12grad)",
  13718      "rotatez(72rad)",
  13719      "rotatex(0.125turn)",
  13720      "perspective(0px)",
  13721      "perspective(1000px)",
  13722      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16)",
  13723      "translate(10px, calc(min(5px,10%)))",
  13724      "translate(calc(max(5px,10%)), 10%)",
  13725      "translate(max(5px,10%), 10%)",
  13726    ],
  13727    invalid_values: [
  13728      "1px",
  13729      "#0000ff",
  13730      "red",
  13731      "auto",
  13732      "translatex(1)",
  13733      "translatey(1)",
  13734      "translate(2)",
  13735      "translate(-3, -4)",
  13736      "translatex(1px 1px)",
  13737      "translatex(translatex(1px))",
  13738      "translatex(#0000ff)",
  13739      "translatex(red)",
  13740      "translatey()",
  13741      "matrix(1px, 2px, 3px, 4px, 5px, 6px)",
  13742      "skewx(red)",
  13743      "matrix(1%, 0, 0, 0, 0px, 0px)",
  13744      "matrix(0, 1%, 2, 3, 4px,5px)",
  13745      "matrix(0, 1, 2%, 3, 4px, 5px)",
  13746      "matrix(0, 1, 2, 3%, 4%, 5%)",
  13747      "matrix(1, 2, 3, 4, 5px, 6%)",
  13748      "matrix(1, 2, 3, 4, 5%, 6px)",
  13749      "matrix(1, 2, 3, 4, 5%, 6%)",
  13750      "matrix(1, 2, 3, 4, 5px, 6em)",
  13751      /* invalid calc() values */
  13752      "translatey(-moz-min(5px,10%))",
  13753      "translatex(-moz-max(5px,10%))",
  13754      "matrix(1, 0, 0, 1, max(5px * 3), calc(10% - 3px))",
  13755      "perspective(-10px)",
  13756      "matrix3d(dinosaur)",
  13757      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17)",
  13758      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15)",
  13759      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15%, 16)",
  13760      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16px)",
  13761      "rotatey(words)",
  13762      "rotatex(7)",
  13763      "translate3d(3px, 4px, 1px, 7px)",
  13764      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13px, 14em, 15px, 16)",
  13765      "matrix3d(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 20%, 10%, 15, 16)",
  13766    ],
  13767  };
  13768 
  13769  gCSSProperties["-moz-context-properties"] = {
  13770    //domProp: "MozContextProperties",
  13771    inherited: true,
  13772    type: CSS_TYPE_LONGHAND,
  13773    initial_values: ["none"],
  13774    other_values: [
  13775      "fill",
  13776      "stroke",
  13777      "fill, stroke",
  13778      "fill, stroke, fill",
  13779      "fill, foo",
  13780      "foo",
  13781    ],
  13782    invalid_values: [
  13783      "default",
  13784      "fill, auto",
  13785      "all, stroke",
  13786      "none, fill",
  13787      "fill, none",
  13788      "fill, default",
  13789      "2px",
  13790    ],
  13791  };
  13792 }
  13793 
  13794 gCSSProperties["scrollbar-color"] = {
  13795  domProp: "scrollbarColor",
  13796  inherited: true,
  13797  type: CSS_TYPE_LONGHAND,
  13798  initial_values: ["auto"],
  13799  other_values: ["red green", "blue yellow", "#ffff00 white"],
  13800  invalid_values: ["ffff00 red", "auto red", "red auto", "green"],
  13801 };
  13802 
  13803 gCSSProperties["scrollbar-width"] = {
  13804  domProp: "scrollbarWidth",
  13805  inherited: false,
  13806  type: CSS_TYPE_LONGHAND,
  13807  initial_values: ["auto"],
  13808  other_values: ["none", "thin"],
  13809  invalid_values: ["1px"],
  13810 };
  13811 
  13812 if (IsCSSPropertyPrefEnabled("layout.css.motion-path-url.enabled")) {
  13813  gCSSProperties["offset-path"]["other_values"].push("url(#svgPath)");
  13814 }
  13815 
  13816 {
  13817  let linear_function_other_values = [
  13818    "linear(0, 1)",
  13819    "linear(0 0% 50%, 1 50% 100%)",
  13820  ];
  13821 
  13822  let linear_function_invalid_values = [
  13823    "linear()",
  13824    "linear(0.5)",
  13825    "linear(0% 0 100%)",
  13826    "linear(0,)",
  13827  ];
  13828  gCSSProperties["animation-timing-function"].other_values.push(
  13829    ...linear_function_other_values
  13830  );
  13831  gCSSProperties["animation-timing-function"].invalid_values.push(
  13832    ...linear_function_invalid_values
  13833  );
  13834 
  13835  gCSSProperties["transition-timing-function"].other_values.push(
  13836    ...linear_function_other_values
  13837  );
  13838  gCSSProperties["transition-timing-function"].invalid_values.push(
  13839    ...linear_function_invalid_values
  13840  );
  13841 
  13842  gCSSProperties["animation"].other_values.push(
  13843    "1s 2s linear(0, 1) bounce",
  13844    "4s linear(0, 0.5 25% 75%, 1 100% 100%)"
  13845  );
  13846 }
  13847 
  13848 if (IsCSSPropertyPrefEnabled("layout.css.backdrop-filter.enabled")) {
  13849  gCSSProperties["backdrop-filter"] = {
  13850    domProp: "backdropFilter",
  13851    inherited: false,
  13852    type: CSS_TYPE_LONGHAND,
  13853    initial_values: ["none"],
  13854    other_values: gCSSProperties["filter"].other_values,
  13855    invalid_values: gCSSProperties["filter"].invalid_values,
  13856  };
  13857 }
  13858 
  13859 gCSSProperties["math-depth"] = {
  13860  domProp: "mathDepth",
  13861  inherited: true,
  13862  type: CSS_TYPE_LONGHAND,
  13863  initial_values: ["0"],
  13864  other_values: [
  13865    // auto-add cannot be tested here because it has no effect when the
  13866    // inherited math-style is equal to the default (normal).
  13867    "123",
  13868    "-123",
  13869    "add(123)",
  13870    "add(-123)",
  13871    "calc(1 + 2*3)",
  13872    "add(calc(4 - 2/3))",
  13873  ],
  13874  invalid_values: ["auto", "1,23", "1.23", "add(1,23)", "add(1.23)"],
  13875 };
  13876 
  13877 gCSSProperties["math-style"] = {
  13878  domProp: "mathStyle",
  13879  inherited: true,
  13880  type: CSS_TYPE_LONGHAND,
  13881  initial_values: ["normal"],
  13882  other_values: ["compact"],
  13883  invalid_values: [],
  13884 };
  13885 
  13886 if (IsCSSPropertyPrefEnabled("mathml.math_shift.enabled")) {
  13887  gCSSProperties["math-shift"] = {
  13888    domProp: "mathShift",
  13889    inherited: true,
  13890    type: CSS_TYPE_LONGHAND,
  13891    initial_values: ["normal"],
  13892    other_values: ["compact"],
  13893    invalid_values: [],
  13894  };
  13895 }
  13896 
  13897 gCSSProperties["forced-color-adjust"] = {
  13898  domProp: "forcedColorAdjust",
  13899  inherited: true,
  13900  type: CSS_TYPE_LONGHAND,
  13901  initial_values: ["auto"],
  13902  other_values: ["none"],
  13903  invalid_values: [],
  13904 };
  13905 
  13906 gCSSProperties["animation-composition"] = {
  13907  domProp: "animationComposition",
  13908  inherited: false,
  13909  type: CSS_TYPE_LONGHAND,
  13910  applies_to_marker: true,
  13911  initial_values: ["replace"],
  13912  other_values: [
  13913    "add",
  13914    "accumulate",
  13915    "replace, add",
  13916    "add, accumulate",
  13917    "replace, add, accumulate",
  13918  ],
  13919  invalid_values: ["all", "none"],
  13920 };
  13921 
  13922 if (IsCSSPropertyPrefEnabled("layout.css.prefixes.animations")) {
  13923  Object.assign(gCSSProperties, {
  13924    "-moz-animation": {
  13925      domProp: "MozAnimation",
  13926      inherited: false,
  13927      type: CSS_TYPE_TRUE_SHORTHAND,
  13928      applies_to_marker: true,
  13929      alias_for: "animation",
  13930      subproperties: [
  13931        "animation-name",
  13932        "animation-duration",
  13933        "animation-timing-function",
  13934        "animation-delay",
  13935        "animation-direction",
  13936        "animation-fill-mode",
  13937        "animation-iteration-count",
  13938        "animation-play-state",
  13939      ],
  13940    },
  13941    "-moz-animation-delay": {
  13942      domProp: "MozAnimationDelay",
  13943      inherited: false,
  13944      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  13945      applies_to_marker: true,
  13946      alias_for: "animation-delay",
  13947      subproperties: ["animation-delay"],
  13948    },
  13949    "-moz-animation-direction": {
  13950      domProp: "MozAnimationDirection",
  13951      inherited: false,
  13952      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  13953      applies_to_marker: true,
  13954      alias_for: "animation-direction",
  13955      subproperties: ["animation-direction"],
  13956    },
  13957    "-moz-animation-duration": {
  13958      domProp: "MozAnimationDuration",
  13959      inherited: false,
  13960      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  13961      applies_to_marker: true,
  13962      alias_for: "animation-duration",
  13963      subproperties: ["animation-duration"],
  13964    },
  13965    "-moz-animation-fill-mode": {
  13966      domProp: "MozAnimationFillMode",
  13967      inherited: false,
  13968      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  13969      applies_to_marker: true,
  13970      alias_for: "animation-fill-mode",
  13971      subproperties: ["animation-fill-mode"],
  13972    },
  13973    "-moz-animation-iteration-count": {
  13974      domProp: "MozAnimationIterationCount",
  13975      inherited: false,
  13976      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  13977      applies_to_marker: true,
  13978      alias_for: "animation-iteration-count",
  13979      subproperties: ["animation-iteration-count"],
  13980    },
  13981    "-moz-animation-name": {
  13982      domProp: "MozAnimationName",
  13983      inherited: false,
  13984      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  13985      applies_to_marker: true,
  13986      alias_for: "animation-name",
  13987      subproperties: ["animation-name"],
  13988    },
  13989    "-moz-animation-play-state": {
  13990      domProp: "MozAnimationPlayState",
  13991      inherited: false,
  13992      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  13993      applies_to_marker: true,
  13994      alias_for: "animation-play-state",
  13995      subproperties: ["animation-play-state"],
  13996    },
  13997    "-moz-animation-timing-function": {
  13998      domProp: "MozAnimationTimingFunction",
  13999      inherited: false,
  14000      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  14001      applies_to_marker: true,
  14002      alias_for: "animation-timing-function",
  14003      subproperties: ["animation-timing-function"],
  14004    },
  14005  });
  14006 }
  14007 
  14008 if (IsCSSPropertyPrefEnabled("layout.css.scroll-driven-animations.enabled")) {
  14009  // Basically, web-platform-tests should cover most cases, so here we only
  14010  // put some basic test cases.
  14011  gCSSProperties["animation"].subproperties.push("animation-timeline");
  14012  gCSSProperties["-moz-animation"].subproperties.push("animation-timeline");
  14013  gCSSProperties["-webkit-animation"].subproperties.push("animation-timeline");
  14014 
  14015  gCSSProperties["animation-duration"].initial_values.push("auto");
  14016 
  14017  gCSSProperties["animation-timeline"] = {
  14018    domProp: "animationTimeline",
  14019    inherited: false,
  14020    type: CSS_TYPE_LONGHAND,
  14021    applies_to_marker: true,
  14022    initial_values: ["auto"],
  14023    other_values: [
  14024      "none",
  14025      "--all",
  14026      "--ball",
  14027      "--mall",
  14028      "--color",
  14029      "--bounce, --bubble, --opacity",
  14030      "--foobar",
  14031      "--\\32bounce",
  14032      "--bounce",
  14033      "--\\32 0bounce",
  14034      "--\\2bounce",
  14035      "scroll()",
  14036      "scroll(block)",
  14037      "scroll(inline)",
  14038      "scroll(x)",
  14039      "scroll(y)",
  14040      "scroll(root)",
  14041      "scroll(nearest)",
  14042      "scroll(inline nearest)",
  14043      "scroll(y root)",
  14044      "scroll(root x)",
  14045      "view()",
  14046      "view(inline)",
  14047      "view(auto)",
  14048      "view(auto 1px)",
  14049      "view(inline auto)",
  14050      "view(y auto auto)",
  14051      "view(x 1px 1%)",
  14052      "view(1px 1% block)",
  14053    ],
  14054    invalid_values: [
  14055      "abc",
  14056      "--bounce, initial",
  14057      "initial, --bounce",
  14058      "--bounce, inherit",
  14059      "inherit, --bounce",
  14060      "--bounce, unset",
  14061      "unset, --bounce",
  14062    ],
  14063  };
  14064 
  14065  gCSSProperties["scroll-timeline-name"] = {
  14066    domProp: "scrollTimelineName",
  14067    inherited: false,
  14068    type: CSS_TYPE_LONGHAND,
  14069    initial_values: ["none"],
  14070    other_values: [
  14071      "--all",
  14072      "--auto",
  14073      "--ball",
  14074      "--mall",
  14075      "--color",
  14076      "--foobar",
  14077      "--\\32bounce",
  14078      "--bounce",
  14079      "--\\32 0bounce",
  14080      "--\\2bounce",
  14081    ],
  14082    invalid_values: ["abc", "abc --bounce", "10px", "rgb(1, 2, 3)"],
  14083  };
  14084 
  14085  gCSSProperties["scroll-timeline-axis"] = {
  14086    domProp: "scrollTimelineAxis",
  14087    inherited: false,
  14088    type: CSS_TYPE_LONGHAND,
  14089    initial_values: ["block"],
  14090    other_values: ["inline", "x", "y"],
  14091    invalid_values: ["auto", "none", "abc", "horizontal"],
  14092  };
  14093 
  14094  gCSSProperties["scroll-timeline"] = {
  14095    domProp: "scrollTimeline",
  14096    inherited: false,
  14097    type: CSS_TYPE_TRUE_SHORTHAND,
  14098    subproperties: ["scroll-timeline-name", "scroll-timeline-axis"],
  14099    initial_values: ["none block", "none"],
  14100    other_values: [
  14101      "--auto inline",
  14102      "--bounce inline",
  14103      "--bounce y",
  14104      "--\\32bounce inline",
  14105      "--bounce block",
  14106      "--\\32 0bounce y",
  14107      "--\\32 0bounce x",
  14108      "--a, --b, --c",
  14109      "--a block, --b inline, --c y",
  14110    ],
  14111    invalid_values: ["", "--bounce --bounce", "x --a", "block --abc"],
  14112  };
  14113 
  14114  gCSSProperties["view-timeline-name"] = {
  14115    domProp: "viewTimelineName",
  14116    inherited: false,
  14117    type: CSS_TYPE_LONGHAND,
  14118    initial_values: ["none"],
  14119    other_values: [
  14120      "--all",
  14121      "--auto",
  14122      "--ball",
  14123      "--mall",
  14124      "--color",
  14125      "--foobar",
  14126      "--\\32bounce",
  14127      "--bounce",
  14128      "--\\32 0bounce",
  14129      "--\\2bounce",
  14130      "--bounce, --abc",
  14131      "none, none",
  14132    ],
  14133    invalid_values: ["abc", "abc --bounce", "10px", "rgb(1, 2, 3)"],
  14134  };
  14135 
  14136  gCSSProperties["view-timeline-axis"] = {
  14137    domProp: "viewTimelineAxis",
  14138    inherited: false,
  14139    type: CSS_TYPE_LONGHAND,
  14140    initial_values: ["block"],
  14141    other_values: ["inline", "x", "y", "inline, block"],
  14142    invalid_values: ["auto", "none", "abc", "inline block", "vertical"],
  14143  };
  14144 
  14145  gCSSProperties["view-timeline-inset"] = {
  14146    domProp: "viewTimelineInset",
  14147    inherited: false,
  14148    type: CSS_TYPE_LONGHAND,
  14149    initial_values: ["auto"],
  14150    other_values: ["0px", "1%", "1px 1%", "0px 0%", "calc(0px) auto"],
  14151    invalid_values: ["none", "rgb(1, 2, 3)", "foo bar", "1px 2px 3px"],
  14152  };
  14153 
  14154  gCSSProperties["view-timeline"] = {
  14155    domProp: "viewTimeline",
  14156    inherited: false,
  14157    type: CSS_TYPE_TRUE_SHORTHAND,
  14158    subproperties: ["view-timeline-name", "view-timeline-axis"],
  14159    initial_values: ["none block", "none"],
  14160    other_values: [
  14161      "--auto inline",
  14162      "--bounce inline",
  14163      "--bounce y",
  14164      "--\\32bounce inline",
  14165      "--bounce block",
  14166      "--\\32 0bounce y",
  14167      "--\\32 0bounce x",
  14168      "--a, --b, --c",
  14169      "--a block, --b inline, --c y",
  14170    ],
  14171    invalid_values: ["", ",", "--abc --abc", "x --a", "block --abc"],
  14172  };
  14173 }
  14174 
  14175 gCSSProperties["scrollbar-gutter"] = {
  14176  domProp: "scrollbarGutter",
  14177  inherited: false,
  14178  type: CSS_TYPE_LONGHAND,
  14179  initial_values: ["auto"],
  14180  other_values: ["stable", "stable both-edges", "both-edges stable"],
  14181  invalid_values: [
  14182    "auto stable",
  14183    "auto both-edges",
  14184    "both-edges",
  14185    "stable mirror",
  14186    // The following values are from scrollbar-gutter extension in CSS
  14187    // Overflow 4 https://drafts.csswg.org/css-overflow-4/#sbg-ext.
  14188    "always",
  14189    "always both-edges",
  14190    "always force",
  14191    "always both-edges force",
  14192    "stable both-edges force",
  14193    "match-parent",
  14194  ],
  14195 };
  14196 
  14197 gCSSProperties["text-wrap-style"] = {
  14198  domProp: "textWrapStyle",
  14199  inherited: true,
  14200  type: CSS_TYPE_LONGHAND,
  14201  applies_to_placeholder: true,
  14202  applies_to_cue: true,
  14203  applies_to_marker: true,
  14204  initial_values: ["auto"],
  14205  other_values: ["stable", "balance"],
  14206  invalid_values: ["wrap", "nowrap", "normal"],
  14207 };
  14208 
  14209 if (IsCSSPropertyPrefEnabled("layout.css.text-autospace.enabled")) {
  14210  Object.assign(gCSSProperties, {
  14211    "text-autospace": {
  14212      domProp: "textAutospace",
  14213      inherited: true,
  14214      type: CSS_TYPE_LONGHAND,
  14215      applies_to_first_letter: true,
  14216      applies_to_first_line: true,
  14217      applies_to_placeholder: true,
  14218      initial_values: ["no-autospace"],
  14219      other_values: [
  14220        "normal",
  14221        "auto",
  14222        "ideograph-alpha",
  14223        "ideograph-numeric",
  14224        "ideograph-alpha ideograph-numeric",
  14225        "ideograph-alpha insert",
  14226        "ideograph-numeric insert",
  14227        "ideograph-alpha ideograph-numeric insert",
  14228        "insert ideograph-alpha",
  14229        "ideograph-alpha insert",
  14230        "insert ideograph-numeric",
  14231        "ideograph-numeric insert",
  14232        "insert ideograph-alpha ideograph-numeric",
  14233        "ideograph-alpha ideograph-numeric insert",
  14234        //
  14235        // Bug 1986500: Uncomment the 'punctuation' values below to enable the tests.
  14236        // "punctuation",
  14237        // "punctuation ideograph-alpha",
  14238        // "ideograph-alpha punctuation",
  14239        // "punctuation ideograph-alpha ideograph-numeric",
  14240        // "ideograph-alpha ideograph-numeric punctuation",
  14241        // "punctuation insert",
  14242        // "punctuation ideograph-alpha insert",
  14243        // "ideograph-alpha punctuation insert",
  14244        // "insert punctuation",
  14245        // "punctuation insert",
  14246        // "insert punctuation ideograph-alpha",
  14247        // "ideograph-alpha punctuation insert",
  14248        // "insert punctuation ideograph-alpha ideograph-numeric",
  14249        // "ideograph-alpha ideograph-numeric punctuation insert",
  14250        //
  14251        // Bug 1980111: Uncomment the valid 'replace' values below to enable the tests.
  14252        // "ideograph-alpha replace",
  14253        // "ideograph-numeric replace",
  14254        // "ideograph-alpha ideograph-numeric replace",
  14255        // "replace ideograph-alpha",
  14256        // "ideograph-alpha replace",
  14257        // "replace ideograph-numeric",
  14258        // "ideograph-numeric replace",
  14259        // "replace ideograph-alpha ideograph-numeric",
  14260        // "ideograph-alpha ideograph-numeric replace",
  14261        //
  14262        // Both bug 1980111 and bug 1986500 required for these:
  14263        // "punctuation replace",
  14264        // "punctuation ideograph-alpha replace",
  14265        // "ideograph-alpha punctuation replace",
  14266        // "replace punctuation",
  14267        // "punctuation replace",
  14268        // "replace punctuation ideograph-alpha",
  14269        // "ideograph-alpha punctuation replace",
  14270        // "replace punctuation ideograph-alpha ideograph-numeric",
  14271        // "ideograph-alpha ideograph-numeric punctuation replace",
  14272      ],
  14273      invalid_values: [
  14274        "punctuation normal",
  14275        "punctuation normal insert",
  14276        "insert punctuation normal",
  14277        "punctuation normal replace",
  14278        "replace punctuation normal",
  14279        "normal ideograph-alpha",
  14280        "normal ideograph-alpha ideograph-numeric",
  14281        "normal punctuation",
  14282        "auto ideograph-alpha",
  14283        "auto ideograph-alpha ideograph-numeric",
  14284        "auto punctuation",
  14285        "normal insert",
  14286        "normal replace",
  14287        "auto insert",
  14288        "auto replace",
  14289        "13",
  14290        "-25",
  14291        "rubbish",
  14292        ",./!@#$",
  14293        "all",
  14294        "stretch",
  14295        "-10%",
  14296        "calc(10% + 1cm)",
  14297      ],
  14298    },
  14299  });
  14300 }
  14301 
  14302 if (IsCSSPropertyPrefEnabled("layout.css.prefixes.transforms")) {
  14303  Object.assign(gCSSProperties, {
  14304    "-moz-transform": {
  14305      domProp: "MozTransform",
  14306      inherited: false,
  14307      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  14308      alias_for: "transform",
  14309      subproperties: ["transform"],
  14310    },
  14311    "-moz-transform-origin": {
  14312      domProp: "MozTransformOrigin",
  14313      inherited: false,
  14314      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  14315      alias_for: "transform-origin",
  14316      subproperties: ["transform-origin"],
  14317    },
  14318    "-moz-perspective-origin": {
  14319      domProp: "MozPerspectiveOrigin",
  14320      inherited: false,
  14321      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  14322      alias_for: "perspective-origin",
  14323      subproperties: ["perspective-origin"],
  14324    },
  14325    "-moz-perspective": {
  14326      domProp: "MozPerspective",
  14327      inherited: false,
  14328      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  14329      alias_for: "perspective",
  14330      subproperties: ["perspective"],
  14331    },
  14332    "-moz-backface-visibility": {
  14333      domProp: "MozBackfaceVisibility",
  14334      inherited: false,
  14335      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  14336      alias_for: "backface-visibility",
  14337      subproperties: ["backface-visibility"],
  14338    },
  14339    "-moz-transform-style": {
  14340      domProp: "MozTransformStyle",
  14341      inherited: false,
  14342      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  14343      alias_for: "transform-style",
  14344      subproperties: ["transform-style"],
  14345    },
  14346  });
  14347 }
  14348 
  14349 if (IsCSSPropertyPrefEnabled("layout.css.zoom.enabled")) {
  14350  Object.assign(gCSSProperties, {
  14351    zoom: {
  14352      domProp: "zoom",
  14353      inherited: false,
  14354      type: CSS_TYPE_LONGHAND,
  14355      initial_values: ["normal", "1", "100%", "0", "0%"],
  14356      other_values: ["1.5", "2", "150%", "200%"],
  14357      invalid_values: ["-1", "-40%"],
  14358    },
  14359  });
  14360 }
  14361 
  14362 if (IsCSSPropertyPrefEnabled("layout.css.prefixes.transitions")) {
  14363  Object.assign(gCSSProperties, {
  14364    "-moz-transition": {
  14365      domProp: "MozTransition",
  14366      inherited: false,
  14367      type: CSS_TYPE_TRUE_SHORTHAND,
  14368      applies_to_marker: true,
  14369      alias_for: "transition",
  14370      subproperties: [
  14371        "transition-property",
  14372        "transition-duration",
  14373        "transition-timing-function",
  14374        "transition-delay",
  14375        "transition-behavior",
  14376      ],
  14377    },
  14378    "-moz-transition-delay": {
  14379      domProp: "MozTransitionDelay",
  14380      inherited: false,
  14381      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  14382      applies_to_marker: true,
  14383      alias_for: "transition-delay",
  14384      subproperties: ["transition-delay"],
  14385    },
  14386    "-moz-transition-duration": {
  14387      domProp: "MozTransitionDuration",
  14388      inherited: false,
  14389      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  14390      applies_to_marker: true,
  14391      alias_for: "transition-duration",
  14392      subproperties: ["transition-duration"],
  14393    },
  14394    "-moz-transition-property": {
  14395      domProp: "MozTransitionProperty",
  14396      inherited: false,
  14397      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  14398      applies_to_marker: true,
  14399      alias_for: "transition-property",
  14400      subproperties: ["transition-property"],
  14401    },
  14402    "-moz-transition-timing-function": {
  14403      domProp: "MozTransitionTimingFunction",
  14404      inherited: false,
  14405      type: CSS_TYPE_SHORTHAND_AND_LONGHAND,
  14406      applies_to_marker: true,
  14407      alias_for: "transition-timing-function",
  14408      subproperties: ["transition-timing-function"],
  14409    },
  14410  });
  14411 }
  14412 
  14413 if (IsCSSPropertyPrefEnabled("layout.css.field-sizing.enabled")) {
  14414  Object.assign(gCSSProperties, {
  14415    "field-sizing": {
  14416      domProp: "fieldSizing",
  14417      inherited: false,
  14418      type: CSS_TYPE_LONGHAND,
  14419      initial_values: ["fixed"],
  14420      other_values: ["content"],
  14421      invalid_values: ["none", "auto"],
  14422    },
  14423  });
  14424 }
  14425 
  14426 if (IsCSSPropertyPrefEnabled("dom.viewTransitions.enabled")) {
  14427  Object.assign(gCSSProperties, {
  14428    "view-transition-name": {
  14429      domProp: "viewTransitionName",
  14430      inherited: false,
  14431      type: CSS_TYPE_LONGHAND,
  14432      initial_values: ["none"],
  14433      other_values: [
  14434        "all",
  14435        "ball",
  14436        "mall",
  14437        "color",
  14438        "foobar",
  14439        "\\32bounce",
  14440        "-bounce",
  14441        "-\\32bounce",
  14442        "\\32 0bounce",
  14443        "-\\32 0bounce",
  14444        "\\2bounce",
  14445        "-\\2bounce",
  14446      ],
  14447      invalid_values: ["auto", "abc --bounce", "10px", "rgb(1, 2, 3)"],
  14448    },
  14449    "view-transition-class": {
  14450      domProp: "viewTransitionClass",
  14451      inherited: false,
  14452      type: CSS_TYPE_LONGHAND,
  14453      initial_values: ["none"],
  14454      other_values: [
  14455        "all",
  14456        "ball",
  14457        "mall",
  14458        "color",
  14459        "foobar",
  14460        "\\32bounce",
  14461        "-bounce",
  14462        "-\\32bounce",
  14463        "\\32 0bounce",
  14464        "-\\32 0bounce",
  14465        "\\2bounce",
  14466        "-\\2bounce",
  14467        "abc abc",
  14468        "\\32bounce abc",
  14469      ],
  14470      invalid_values: ["abc none", "10px", "rgb(1, 2, 3)", "default"],
  14471    },
  14472  });
  14473 }
  14474 
  14475 if (IsCSSPropertyPrefEnabled("layout.css.text-decoration-inset.enabled")) {
  14476  Object.assign(gCSSProperties, {
  14477    "text-decoration-inset": {
  14478      domProp: "textDecorationInset",
  14479      inherited: false,
  14480      type: CSS_TYPE_LONGHAND,
  14481      applies_to_first_letter: true,
  14482      applies_to_first_line: true,
  14483      applies_to_placeholder: true,
  14484      initial_values: ["0"],
  14485      other_values: [
  14486        "-14px",
  14487        "25px",
  14488        "100em",
  14489        "-45em",
  14490        "-40px",
  14491        "0 1px",
  14492        "4em -2px",
  14493        "100px 2in",
  14494        "3cm 0",
  14495        "-1mm -2px",
  14496        "calc(-1mm + 2em)",
  14497        "2px calc(2px - 1em)",
  14498        "calc(1px) 0",
  14499      ],
  14500      invalid_values: [
  14501        "13",
  14502        "-25",
  14503        "rubbish",
  14504        ",./!@#$",
  14505        "from-font",
  14506        "all",
  14507        "stretch",
  14508        "-10%",
  14509        "43%",
  14510        "10px5cm",
  14511        "10px, 5cm",
  14512        "1em 10%",
  14513        "0 10%",
  14514        "50% 50%",
  14515        "100% 8mm",
  14516        "100% 0",
  14517        "0 solid",
  14518        "auto 7px",
  14519        "word 9em",
  14520        "10em auto",
  14521        "1px 2px 3px",
  14522        "45em auto 0",
  14523        "0px 10% 9em",
  14524        "calc(10% + 1cm)",
  14525        "0 calc(100% - 10px)",
  14526      ],
  14527    },
  14528  });
  14529 }
  14530 
  14531 // Copy aliased properties' fields from their alias targets. Keep this logic
  14532 // at the bottom of this file to ensure all the aliased properties are
  14533 // processed.
  14534 for (var prop in gCSSProperties) {
  14535  var entry = gCSSProperties[prop];
  14536  if (entry.alias_for) {
  14537    var aliasTargetEntry = gCSSProperties[entry.alias_for];
  14538    if (!aliasTargetEntry) {
  14539      ok(
  14540        false,
  14541        "Alias '" +
  14542          prop +
  14543          "' alias_for field, '" +
  14544          entry.alias_for +
  14545          "', " +
  14546          "must be set to a recognized CSS property in gCSSProperties"
  14547      );
  14548    } else {
  14549      // Copy 'values' fields & 'prerequisites' field from aliasTargetEntry:
  14550      var fieldsToCopy = [
  14551        "initial_values",
  14552        "other_values",
  14553        "invalid_values",
  14554        "quirks_values",
  14555        "unbalanced_values",
  14556        "prerequisites",
  14557      ];
  14558 
  14559      fieldsToCopy.forEach(function (fieldName) {
  14560        // (Don't copy the field if the alias already has something there,
  14561        // or if the aliased property doesn't have anything to copy.)
  14562        if (!(fieldName in entry) && fieldName in aliasTargetEntry) {
  14563          entry[fieldName] = aliasTargetEntry[fieldName];
  14564        }
  14565      });
  14566    }
  14567  }
  14568 }