Bug 1454591 part 5 - Generate subproperty lists from Servo data. r?heycam draft
authorXidorn Quan <me@upsuper.org>
Fri, 04 May 2018 15:17:05 +1000
changeset 791425 adffa602ea57242f4efe4a0d08b3e33df983a7dc
parent 791424 f8a3e47aa4d265cf670078c93993776c2439dc7e
child 791426 60ed78b5048a28cfc59a4d024bf844b931b52ef3
push id108809
push userxquan@mozilla.com
push dateFri, 04 May 2018 11:15:53 +0000
reviewersheycam
bugs1454591
milestone61.0a1
Bug 1454591 part 5 - Generate subproperty lists from Servo data. r?heycam I manually diffed the generated lists and the original ones from in nsCSSProps.cpp. All generated lists seem to contain the same set of subproperties as their old correspondents. There are still some differences: Order of subproperties of many shorthands is changed. There are many comments in the old lists stating that the order is important, but they are mostly for serialization. I auditted all users of the subproperty lists, and it doesn't seem to me any of them relies on the order. gOutlineRadiusSubpropTable is renamed to gMozOutlineRadiusSubpropTable which I don't think is a problem at all, but maybe worth mentioning. MozReview-Commit-ID: 190SBZfxVOW
devtools/shared/css/generated/properties-db.js
layout/style/GenerateCSSPropsGenerated.py
layout/style/ServoCSSPropList.mako.py
layout/style/nsCSSProps.cpp
--- a/devtools/shared/css/generated/properties-db.js
+++ b/devtools/shared/css/generated/properties-db.js
@@ -13,24 +13,24 @@
 
 /**
  * A list of CSS Properties and their various characteristics.
  */
 exports.CSS_PROPERTIES = {
   "-moz-animation": {
     "isInherited": false,
     "subproperties": [
+      "animation-name",
       "animation-duration",
       "animation-timing-function",
       "animation-delay",
+      "animation-iteration-count",
       "animation-direction",
       "animation-fill-mode",
-      "animation-iteration-count",
-      "animation-play-state",
-      "animation-name"
+      "animation-play-state"
     ],
     "supports": [
       10
     ],
     "values": [
       "alternate",
       "alternate-reverse",
       "backwards",
@@ -341,19 +341,19 @@ exports.CSS_PROPERTIES = {
       "none",
       "unset",
       "url"
     ]
   },
   "-moz-border-end": {
     "isInherited": false,
     "subproperties": [
-      "border-inline-end-width",
+      "border-inline-end-color",
       "border-inline-end-style",
-      "border-inline-end-color"
+      "border-inline-end-width"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "currentColor",
       "dashed",
@@ -435,21 +435,21 @@ exports.CSS_PROPERTIES = {
       "thick",
       "thin",
       "unset"
     ]
   },
   "-moz-border-image": {
     "isInherited": false,
     "subproperties": [
-      "border-image-source",
+      "border-image-outset",
+      "border-image-repeat",
       "border-image-slice",
-      "border-image-width",
-      "border-image-outset",
-      "border-image-repeat"
+      "border-image-source",
+      "border-image-width"
     ],
     "supports": [
       4
     ],
     "values": [
       "-moz-element",
       "-moz-image-rect",
       "-moz-linear-gradient",
@@ -476,19 +476,19 @@ exports.CSS_PROPERTIES = {
       "stretch",
       "unset",
       "url"
     ]
   },
   "-moz-border-start": {
     "isInherited": false,
     "subproperties": [
-      "border-inline-start-width",
+      "border-inline-start-color",
       "border-inline-start-style",
-      "border-inline-start-color"
+      "border-inline-start-width"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "currentColor",
       "dashed",
@@ -818,18 +818,18 @@ exports.CSS_PROPERTIES = {
       "inherit",
       "initial",
       "unset"
     ]
   },
   "-moz-columns": {
     "isInherited": false,
     "subproperties": [
-      "column-count",
-      "column-width"
+      "column-width",
+      "column-count"
     ],
     "supports": [],
     "values": [
       "auto",
       "inherit",
       "initial",
       "unset"
     ]
@@ -1531,24 +1531,24 @@ exports.CSS_PROPERTIES = {
       "stretch",
       "unsafe",
       "unset"
     ]
   },
   "-webkit-animation": {
     "isInherited": false,
     "subproperties": [
+      "animation-name",
       "animation-duration",
       "animation-timing-function",
       "animation-delay",
+      "animation-iteration-count",
       "animation-direction",
       "animation-fill-mode",
-      "animation-iteration-count",
-      "animation-play-state",
-      "animation-name"
+      "animation-play-state"
     ],
     "supports": [
       10
     ],
     "values": [
       "alternate",
       "alternate-reverse",
       "backwards",
@@ -1777,21 +1777,21 @@ exports.CSS_PROPERTIES = {
       "inherit",
       "initial",
       "unset"
     ]
   },
   "-webkit-border-image": {
     "isInherited": false,
     "subproperties": [
-      "border-image-source",
+      "border-image-outset",
+      "border-image-repeat",
       "border-image-slice",
-      "border-image-width",
-      "border-image-outset",
-      "border-image-repeat"
+      "border-image-source",
+      "border-image-width"
     ],
     "supports": [
       4
     ],
     "values": [
       "-moz-element",
       "-moz-image-rect",
       "-moz-linear-gradient",
@@ -2144,25 +2144,25 @@ exports.CSS_PROPERTIES = {
       "stretch",
       "unsafe",
       "unset"
     ]
   },
   "-webkit-mask": {
     "isInherited": false,
     "subproperties": [
-      "mask-image",
+      "mask-mode",
       "mask-repeat",
+      "mask-clip",
+      "mask-origin",
+      "mask-composite",
       "mask-position-x",
       "mask-position-y",
-      "mask-clip",
-      "mask-origin",
       "mask-size",
-      "mask-composite",
-      "mask-mode"
+      "mask-image"
     ],
     "supports": [
       4
     ],
     "values": [
       "-moz-element",
       "-moz-image-rect",
       "-moz-linear-gradient",
@@ -2775,351 +2775,347 @@ exports.CSS_PROPERTIES = {
       "stretch",
       "unsafe",
       "unset"
     ]
   },
   "all": {
     "isInherited": false,
     "subproperties": [
-      "align-content",
-      "align-items",
-      "align-self",
-      "animation-delay",
-      "animation-direction",
-      "animation-duration",
-      "animation-fill-mode",
-      "animation-iteration-count",
-      "animation-name",
-      "animation-play-state",
-      "animation-timing-function",
-      "-moz-appearance",
-      "backface-visibility",
-      "background-attachment",
-      "background-blend-mode",
-      "background-clip",
+      "border-block-start-color",
+      "border-block-start-style",
+      "border-block-start-width",
+      "border-block-end-color",
+      "border-block-end-style",
+      "border-block-end-width",
+      "border-inline-start-color",
+      "border-inline-start-style",
+      "border-inline-start-width",
+      "border-inline-end-color",
+      "border-inline-end-style",
+      "border-inline-end-width",
+      "margin-block-start",
+      "margin-block-end",
+      "margin-inline-start",
+      "margin-inline-end",
+      "padding-block-start",
+      "padding-block-end",
+      "padding-inline-start",
+      "padding-inline-end",
+      "offset-block-start",
+      "offset-block-end",
+      "offset-inline-start",
+      "offset-inline-end",
+      "block-size",
+      "min-block-size",
+      "max-block-size",
+      "inline-size",
+      "min-inline-size",
+      "max-inline-size",
       "background-color",
       "background-image",
-      "background-origin",
       "background-position-x",
       "background-position-y",
       "background-repeat",
+      "background-attachment",
+      "background-clip",
+      "background-origin",
       "background-size",
-      "-moz-binding",
-      "block-size",
-      "border-block-end-color",
-      "border-block-end-style",
-      "border-block-end-width",
-      "border-block-start-color",
-      "border-block-start-style",
-      "border-block-start-width",
-      "border-bottom-color",
-      "border-bottom-left-radius",
-      "border-bottom-right-radius",
-      "border-bottom-style",
-      "border-bottom-width",
-      "border-collapse",
-      "border-image-outset",
-      "border-image-repeat",
-      "border-image-slice",
-      "border-image-source",
-      "border-image-width",
-      "border-inline-end-color",
-      "border-inline-end-style",
-      "border-inline-end-width",
-      "border-inline-start-color",
-      "border-inline-start-style",
-      "border-inline-start-width",
-      "border-left-color",
-      "border-left-style",
-      "border-left-width",
+      "background-blend-mode",
+      "border-top-color",
+      "border-top-style",
+      "border-top-width",
       "border-right-color",
       "border-right-style",
       "border-right-width",
-      "border-spacing",
-      "border-top-color",
+      "border-bottom-color",
+      "border-bottom-style",
+      "border-bottom-width",
+      "border-left-color",
+      "border-left-style",
+      "border-left-width",
       "border-top-left-radius",
       "border-top-right-radius",
-      "border-top-style",
-      "border-top-width",
-      "bottom",
-      "-moz-box-align",
+      "border-bottom-right-radius",
+      "border-bottom-left-radius",
       "box-decoration-break",
-      "-moz-box-direction",
-      "-moz-box-flex",
-      "-moz-box-ordinal-group",
-      "-moz-box-orient",
-      "-moz-box-pack",
-      "box-shadow",
-      "box-sizing",
-      "caption-side",
-      "caret-color",
+      "-moz-float-edge",
+      "border-image-source",
+      "border-image-outset",
+      "border-image-repeat",
+      "border-image-width",
+      "border-image-slice",
+      "display",
+      "position",
+      "float",
       "clear",
-      "clip",
-      "clip-path",
-      "clip-rule",
+      "vertical-align",
+      "overflow-clip-box-inline",
+      "overflow-clip-box-block",
+      "overflow-x",
+      "overflow-y",
+      "transition-duration",
+      "transition-timing-function",
+      "transition-property",
+      "transition-delay",
+      "animation-name",
+      "animation-duration",
+      "animation-timing-function",
+      "animation-iteration-count",
+      "animation-direction",
+      "animation-play-state",
+      "animation-fill-mode",
+      "animation-delay",
+      "scroll-snap-points-x",
+      "scroll-snap-points-y",
+      "scroll-snap-destination",
+      "scroll-snap-coordinate",
+      "transform",
+      "rotate",
+      "scale",
+      "translate",
+      "scroll-behavior",
+      "scroll-snap-type-x",
+      "scroll-snap-type-y",
+      "overscroll-behavior-x",
+      "overscroll-behavior-y",
+      "isolation",
+      "page-break-after",
+      "page-break-before",
+      "page-break-inside",
+      "resize",
+      "perspective",
+      "perspective-origin",
+      "backface-visibility",
+      "transform-box",
+      "transform-style",
+      "transform-origin",
+      "contain",
+      "-moz-appearance",
+      "-moz-binding",
+      "-moz-orient",
+      "will-change",
+      "shape-image-threshold",
+      "shape-margin",
+      "shape-outside",
+      "touch-action",
       "color",
-      "color-adjust",
-      "color-interpolation",
-      "color-interpolation-filters",
+      "column-width",
       "column-count",
       "column-fill",
-      "column-gap",
+      "column-rule-width",
       "column-rule-color",
-      "column-rule-style",
-      "column-rule-width",
       "column-span",
-      "column-width",
-      "contain",
+      "column-rule-style",
       "content",
-      "-moz-context-properties",
-      "-moz-control-character-visibility",
       "counter-increment",
       "counter-reset",
-      "cursor",
-      "display",
-      "dominant-baseline",
-      "empty-cells",
-      "fill",
-      "fill-opacity",
-      "fill-rule",
+      "opacity",
+      "box-shadow",
+      "clip",
       "filter",
-      "flex-basis",
-      "flex-direction",
-      "flex-grow",
-      "flex-shrink",
-      "flex-wrap",
-      "float",
-      "-moz-float-edge",
-      "flood-color",
-      "flood-opacity",
+      "mix-blend-mode",
       "font-family",
-      "font-feature-settings",
-      "font-kerning",
-      "font-language-override",
-      "font-optical-sizing",
+      "font-style",
+      "font-variant-caps",
+      "font-weight",
       "font-size",
       "font-size-adjust",
-      "-moz-font-smoothing-background-color",
+      "font-synthesis",
       "font-stretch",
-      "font-style",
-      "font-synthesis",
+      "font-kerning",
       "font-variant-alternates",
-      "font-variant-caps",
       "font-variant-east-asian",
       "font-variant-ligatures",
       "font-variant-numeric",
       "font-variant-position",
+      "font-feature-settings",
       "font-variation-settings",
-      "font-weight",
-      "-moz-force-broken-image-icon",
-      "grid-auto-columns",
-      "grid-auto-flow",
-      "grid-auto-rows",
-      "grid-column-end",
-      "grid-column-start",
-      "grid-row-end",
-      "grid-row-start",
-      "grid-template-areas",
-      "grid-template-columns",
-      "grid-template-rows",
-      "height",
+      "font-language-override",
+      "font-optical-sizing",
+      "-moz-osx-font-smoothing",
+      "visibility",
+      "writing-mode",
+      "text-orientation",
+      "color-adjust",
+      "image-rendering",
+      "image-orientation",
+      "border-collapse",
+      "empty-cells",
+      "caption-side",
+      "border-spacing",
+      "line-height",
+      "text-transform",
       "hyphens",
-      "image-orientation",
-      "-moz-image-region",
-      "image-rendering",
-      "ime-mode",
-      "initial-letter",
-      "inline-size",
-      "isolation",
-      "justify-content",
-      "justify-items",
-      "justify-self",
-      "left",
+      "-moz-text-size-adjust",
+      "text-indent",
+      "overflow-wrap",
+      "word-break",
+      "text-justify",
+      "text-align-last",
+      "text-align",
       "letter-spacing",
-      "lighting-color",
-      "line-height",
-      "list-style-image",
+      "word-spacing",
+      "white-space",
+      "text-shadow",
+      "text-emphasis-style",
+      "text-emphasis-position",
+      "text-emphasis-color",
+      "-moz-tab-size",
+      "-webkit-text-fill-color",
+      "-webkit-text-stroke-color",
+      "-webkit-text-stroke-width",
+      "ruby-align",
+      "ruby-position",
+      "text-combine-upright",
+      "text-rendering",
+      "-moz-control-character-visibility",
       "list-style-position",
       "list-style-type",
-      "margin-block-end",
-      "margin-block-start",
-      "margin-bottom",
-      "margin-inline-end",
-      "margin-inline-start",
-      "margin-left",
-      "margin-right",
+      "list-style-image",
+      "quotes",
+      "-moz-image-region",
       "margin-top",
-      "marker-end",
-      "marker-mid",
-      "marker-start",
-      "mask-clip",
-      "mask-composite",
-      "mask-image",
-      "mask-mode",
-      "mask-origin",
-      "mask-position-x",
-      "mask-position-y",
-      "mask-repeat",
-      "mask-size",
-      "mask-type",
-      "max-block-size",
+      "margin-right",
+      "margin-bottom",
+      "margin-left",
+      "outline-color",
+      "outline-style",
+      "outline-width",
+      "-moz-outline-radius-topleft",
+      "-moz-outline-radius-topright",
+      "-moz-outline-radius-bottomright",
+      "-moz-outline-radius-bottomleft",
+      "outline-offset",
+      "padding-top",
+      "padding-right",
+      "padding-bottom",
+      "padding-left",
+      "cursor",
+      "pointer-events",
+      "-moz-user-input",
+      "-moz-user-modify",
+      "-moz-user-focus",
+      "caret-color",
+      "top",
+      "right",
+      "bottom",
+      "left",
+      "z-index",
+      "flex-direction",
+      "flex-wrap",
+      "justify-content",
+      "align-content",
+      "align-items",
+      "justify-items",
+      "flex-grow",
+      "flex-shrink",
+      "align-self",
+      "justify-self",
+      "order",
+      "flex-basis",
+      "width",
+      "min-width",
+      "max-width",
+      "height",
+      "min-height",
       "max-height",
-      "max-inline-size",
-      "max-width",
-      "min-block-size",
-      "-moz-min-font-size-ratio",
-      "min-height",
-      "min-inline-size",
-      "min-width",
-      "mix-blend-mode",
+      "box-sizing",
       "object-fit",
       "object-position",
-      "offset-block-end",
-      "offset-block-start",
-      "offset-inline-end",
-      "offset-inline-start",
-      "opacity",
-      "order",
-      "-moz-orient",
-      "-moz-osx-font-smoothing",
-      "outline-color",
-      "outline-offset",
-      "-moz-outline-radius-bottomleft",
-      "-moz-outline-radius-bottomright",
-      "-moz-outline-radius-topleft",
-      "-moz-outline-radius-topright",
-      "outline-style",
-      "outline-width",
-      "overflow-clip-box-block",
-      "overflow-clip-box-inline",
-      "overflow-wrap",
-      "overflow-x",
-      "overflow-y",
-      "overscroll-behavior-x",
-      "overscroll-behavior-y",
-      "padding-block-end",
-      "padding-block-start",
-      "padding-bottom",
-      "padding-inline-end",
-      "padding-inline-start",
-      "padding-left",
-      "padding-right",
-      "padding-top",
-      "page-break-after",
-      "page-break-before",
-      "page-break-inside",
-      "paint-order",
-      "perspective",
-      "perspective-origin",
-      "pointer-events",
-      "position",
-      "quotes",
-      "resize",
-      "right",
-      "rotate",
+      "grid-row-start",
+      "grid-row-end",
+      "grid-auto-rows",
+      "grid-template-rows",
+      "grid-column-start",
+      "grid-column-end",
+      "grid-auto-columns",
+      "grid-template-columns",
+      "grid-auto-flow",
+      "grid-template-areas",
+      "column-gap",
       "row-gap",
-      "ruby-align",
-      "ruby-position",
-      "scale",
-      "scroll-behavior",
-      "scroll-snap-coordinate",
-      "scroll-snap-destination",
-      "scroll-snap-points-x",
-      "scroll-snap-points-y",
-      "scroll-snap-type-x",
-      "scroll-snap-type-y",
-      "shape-image-threshold",
-      "shape-margin",
-      "shape-outside",
+      "table-layout",
+      "text-overflow",
+      "text-decoration-line",
+      "text-decoration-style",
+      "text-decoration-color",
+      "initial-letter",
+      "ime-mode",
+      "-moz-user-select",
+      "-moz-window-dragging",
+      "-moz-window-opacity",
+      "-moz-window-transform",
+      "-moz-window-transform-origin",
+      "-moz-force-broken-image-icon",
+      "text-anchor",
+      "color-interpolation",
+      "color-interpolation-filters",
+      "fill",
+      "fill-opacity",
+      "fill-rule",
       "shape-rendering",
-      "-moz-stack-sizing",
-      "stop-color",
-      "stop-opacity",
       "stroke",
-      "stroke-dasharray",
-      "stroke-dashoffset",
+      "stroke-width",
       "stroke-linecap",
       "stroke-linejoin",
       "stroke-miterlimit",
       "stroke-opacity",
-      "stroke-width",
-      "-moz-tab-size",
-      "table-layout",
-      "text-align",
-      "text-align-last",
-      "text-anchor",
-      "text-combine-upright",
-      "text-decoration-color",
-      "text-decoration-line",
-      "text-decoration-style",
-      "text-emphasis-color",
-      "text-emphasis-position",
-      "text-emphasis-style",
-      "-webkit-text-fill-color",
-      "text-indent",
-      "text-justify",
-      "text-orientation",
-      "text-overflow",
-      "text-rendering",
-      "text-shadow",
-      "-moz-text-size-adjust",
-      "-webkit-text-stroke-color",
-      "-webkit-text-stroke-width",
-      "text-transform",
-      "top",
-      "-moz-top-layer",
-      "touch-action",
-      "transform",
-      "transform-box",
-      "transform-origin",
-      "transform-style",
-      "transition-delay",
-      "transition-duration",
-      "transition-property",
-      "transition-timing-function",
-      "translate",
-      "-moz-user-focus",
-      "-moz-user-input",
-      "-moz-user-modify",
-      "-moz-user-select",
+      "stroke-dasharray",
+      "stroke-dashoffset",
+      "clip-rule",
+      "marker-start",
+      "marker-mid",
+      "marker-end",
+      "paint-order",
+      "-moz-context-properties",
+      "dominant-baseline",
       "vector-effect",
-      "vertical-align",
-      "visibility",
-      "white-space",
-      "width",
-      "will-change",
-      "-moz-window-dragging",
-      "-moz-window-opacity",
-      "-moz-window-shadow",
-      "-moz-window-transform",
-      "-moz-window-transform-origin",
-      "word-break",
-      "word-spacing",
-      "writing-mode",
-      "z-index"
+      "stop-color",
+      "stop-opacity",
+      "flood-color",
+      "flood-opacity",
+      "lighting-color",
+      "mask-type",
+      "clip-path",
+      "mask-mode",
+      "mask-repeat",
+      "mask-position-x",
+      "mask-position-y",
+      "mask-clip",
+      "mask-origin",
+      "mask-size",
+      "mask-composite",
+      "mask-image",
+      "-moz-box-align",
+      "-moz-box-direction",
+      "-moz-box-flex",
+      "-moz-box-orient",
+      "-moz-box-pack",
+      "-moz-stack-sizing",
+      "-moz-box-ordinal-group"
     ],
     "supports": [],
     "values": [
       "inherit",
       "initial",
       "unset"
     ]
   },
   "animation": {
     "isInherited": false,
     "subproperties": [
+      "animation-name",
       "animation-duration",
       "animation-timing-function",
       "animation-delay",
+      "animation-iteration-count",
       "animation-direction",
       "animation-fill-mode",
-      "animation-iteration-count",
-      "animation-play-state",
-      "animation-name"
+      "animation-play-state"
     ],
     "supports": [
       10
     ],
     "values": [
       "alternate",
       "alternate-reverse",
       "backwards",
@@ -3279,24 +3275,24 @@ exports.CSS_PROPERTIES = {
       "unset",
       "visible"
     ]
   },
   "background": {
     "isInherited": false,
     "subproperties": [
       "background-color",
-      "background-image",
+      "background-position-x",
+      "background-position-y",
       "background-repeat",
       "background-attachment",
-      "background-clip",
+      "background-image",
+      "background-size",
       "background-origin",
-      "background-position-x",
-      "background-position-y",
-      "background-size"
+      "background-clip"
     ],
     "supports": [
       2,
       4
     ],
     "values": [
       "COLOR",
       "-moz-element",
@@ -3570,33 +3566,33 @@ exports.CSS_PROPERTIES = {
       "inherit",
       "initial",
       "unset"
     ]
   },
   "border": {
     "isInherited": false,
     "subproperties": [
+      "border-top-color",
+      "border-top-style",
       "border-top-width",
+      "border-right-color",
+      "border-right-style",
       "border-right-width",
+      "border-bottom-color",
+      "border-bottom-style",
       "border-bottom-width",
-      "border-left-width",
-      "border-top-style",
-      "border-right-style",
-      "border-bottom-style",
+      "border-left-color",
       "border-left-style",
-      "border-top-color",
-      "border-right-color",
-      "border-bottom-color",
-      "border-left-color",
+      "border-left-width",
+      "border-image-outset",
+      "border-image-repeat",
+      "border-image-slice",
       "border-image-source",
-      "border-image-slice",
-      "border-image-width",
-      "border-image-outset",
-      "border-image-repeat"
+      "border-image-width"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "currentColor",
       "dashed",
@@ -3620,19 +3616,19 @@ exports.CSS_PROPERTIES = {
       "thin",
       "transparent",
       "unset"
     ]
   },
   "border-block-end": {
     "isInherited": false,
     "subproperties": [
-      "border-block-end-width",
+      "border-block-end-color",
       "border-block-end-style",
-      "border-block-end-color"
+      "border-block-end-width"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "currentColor",
       "dashed",
@@ -3714,19 +3710,19 @@ exports.CSS_PROPERTIES = {
       "thick",
       "thin",
       "unset"
     ]
   },
   "border-block-start": {
     "isInherited": false,
     "subproperties": [
-      "border-block-start-width",
+      "border-block-start-color",
       "border-block-start-style",
-      "border-block-start-color"
+      "border-block-start-width"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "currentColor",
       "dashed",
@@ -3808,19 +3804,19 @@ exports.CSS_PROPERTIES = {
       "thick",
       "thin",
       "unset"
     ]
   },
   "border-bottom": {
     "isInherited": false,
     "subproperties": [
-      "border-bottom-width",
+      "border-bottom-color",
       "border-bottom-style",
-      "border-bottom-color"
+      "border-bottom-width"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "currentColor",
       "dashed",
@@ -3964,21 +3960,21 @@ exports.CSS_PROPERTIES = {
       "rgba",
       "transparent",
       "unset"
     ]
   },
   "border-image": {
     "isInherited": false,
     "subproperties": [
-      "border-image-source",
+      "border-image-outset",
+      "border-image-repeat",
       "border-image-slice",
-      "border-image-width",
-      "border-image-outset",
-      "border-image-repeat"
+      "border-image-source",
+      "border-image-width"
     ],
     "supports": [
       4
     ],
     "values": [
       "-moz-element",
       "-moz-image-rect",
       "-moz-linear-gradient",
@@ -4090,19 +4086,19 @@ exports.CSS_PROPERTIES = {
       "inherit",
       "initial",
       "unset"
     ]
   },
   "border-inline-end": {
     "isInherited": false,
     "subproperties": [
-      "border-inline-end-width",
+      "border-inline-end-color",
       "border-inline-end-style",
-      "border-inline-end-color"
+      "border-inline-end-width"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "currentColor",
       "dashed",
@@ -4184,19 +4180,19 @@ exports.CSS_PROPERTIES = {
       "thick",
       "thin",
       "unset"
     ]
   },
   "border-inline-start": {
     "isInherited": false,
     "subproperties": [
-      "border-inline-start-width",
+      "border-inline-start-color",
       "border-inline-start-style",
-      "border-inline-start-color"
+      "border-inline-start-width"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "currentColor",
       "dashed",
@@ -4278,19 +4274,19 @@ exports.CSS_PROPERTIES = {
       "thick",
       "thin",
       "unset"
     ]
   },
   "border-left": {
     "isInherited": false,
     "subproperties": [
-      "border-left-width",
+      "border-left-color",
       "border-left-style",
-      "border-left-color"
+      "border-left-width"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "currentColor",
       "dashed",
@@ -4387,19 +4383,19 @@ exports.CSS_PROPERTIES = {
       "inherit",
       "initial",
       "unset"
     ]
   },
   "border-right": {
     "isInherited": false,
     "subproperties": [
-      "border-right-width",
+      "border-right-color",
       "border-right-style",
-      "border-right-color"
+      "border-right-width"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "currentColor",
       "dashed",
@@ -4518,19 +4514,19 @@ exports.CSS_PROPERTIES = {
       "ridge",
       "solid",
       "unset"
     ]
   },
   "border-top": {
     "isInherited": false,
     "subproperties": [
-      "border-top-width",
+      "border-top-color",
       "border-top-style",
-      "border-top-color"
+      "border-top-width"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "currentColor",
       "dashed",
@@ -5041,18 +5037,18 @@ exports.CSS_PROPERTIES = {
       "inherit",
       "initial",
       "unset"
     ]
   },
   "columns": {
     "isInherited": false,
     "subproperties": [
-      "column-count",
-      "column-width"
+      "column-width",
+      "column-count"
     ],
     "supports": [],
     "values": [
       "auto",
       "inherit",
       "initial",
       "unset"
     ]
@@ -5502,34 +5498,34 @@ exports.CSS_PROPERTIES = {
       "inherit",
       "initial",
       "unset"
     ]
   },
   "font": {
     "isInherited": true,
     "subproperties": [
-      "font-family",
       "font-style",
+      "font-variant-caps",
       "font-weight",
+      "font-stretch",
       "font-size",
       "line-height",
+      "font-family",
       "font-size-adjust",
-      "font-stretch",
-      "font-feature-settings",
-      "font-language-override",
       "font-kerning",
       "font-optical-sizing",
-      "font-variation-settings",
       "font-variant-alternates",
-      "font-variant-caps",
       "font-variant-east-asian",
       "font-variant-ligatures",
       "font-variant-numeric",
-      "font-variant-position"
+      "font-variant-position",
+      "font-language-override",
+      "font-feature-settings",
+      "font-variation-settings"
     ],
     "supports": [],
     "values": [
       "-moz-button",
       "-moz-desktop",
       "-moz-dialog",
       "-moz-document",
       "-moz-field",
@@ -5727,18 +5723,18 @@ exports.CSS_PROPERTIES = {
       "style",
       "unset",
       "weight"
     ]
   },
   "font-variant": {
     "isInherited": true,
     "subproperties": [
+      "font-variant-caps",
       "font-variant-alternates",
-      "font-variant-caps",
       "font-variant-east-asian",
       "font-variant-ligatures",
       "font-variant-numeric",
       "font-variant-position"
     ],
     "supports": [],
     "values": [
       "all-petite-caps",
@@ -5948,22 +5944,22 @@ exports.CSS_PROPERTIES = {
       "initial",
       "normal",
       "unset"
     ]
   },
   "grid": {
     "isInherited": false,
     "subproperties": [
-      "grid-template-areas",
       "grid-template-rows",
       "grid-template-columns",
-      "grid-auto-flow",
+      "grid-template-areas",
       "grid-auto-rows",
-      "grid-auto-columns"
+      "grid-auto-columns",
+      "grid-auto-flow"
     ],
     "supports": [],
     "values": [
       "auto",
       "column",
       "dense",
       "fit-content",
       "inherit",
@@ -5976,18 +5972,18 @@ exports.CSS_PROPERTIES = {
       "row",
       "unset"
     ]
   },
   "grid-area": {
     "isInherited": false,
     "subproperties": [
       "grid-row-start",
+      "grid-row-end",
       "grid-column-start",
-      "grid-row-end",
       "grid-column-end"
     ],
     "supports": [],
     "values": [
       "inherit",
       "initial",
       "unset"
     ]
@@ -6153,19 +6149,19 @@ exports.CSS_PROPERTIES = {
       "inherit",
       "initial",
       "unset"
     ]
   },
   "grid-template": {
     "isInherited": false,
     "subproperties": [
-      "grid-template-areas",
       "grid-template-rows",
-      "grid-template-columns"
+      "grid-template-columns",
+      "grid-template-areas"
     ],
     "supports": [],
     "values": [
       "auto",
       "fit-content",
       "inherit",
       "initial",
       "max-content",
@@ -6480,19 +6476,19 @@ exports.CSS_PROPERTIES = {
       "initial",
       "normal",
       "unset"
     ]
   },
   "list-style": {
     "isInherited": true,
     "subproperties": [
-      "list-style-type",
+      "list-style-position",
       "list-style-image",
-      "list-style-position"
+      "list-style-type"
     ],
     "supports": [],
     "values": [
       "arabic-indic",
       "armenian",
       "bengali",
       "cambodian",
       "circle",
@@ -6772,18 +6768,18 @@ exports.CSS_PROPERTIES = {
       "initial",
       "unset"
     ]
   },
   "marker": {
     "isInherited": true,
     "subproperties": [
       "marker-start",
-      "marker-mid",
-      "marker-end"
+      "marker-end",
+      "marker-mid"
     ],
     "supports": [],
     "values": [
       "inherit",
       "initial",
       "none",
       "unset",
       "url"
@@ -6829,25 +6825,25 @@ exports.CSS_PROPERTIES = {
       "none",
       "unset",
       "url"
     ]
   },
   "mask": {
     "isInherited": false,
     "subproperties": [
-      "mask-image",
+      "mask-mode",
       "mask-repeat",
+      "mask-clip",
+      "mask-origin",
+      "mask-composite",
       "mask-position-x",
       "mask-position-y",
-      "mask-clip",
-      "mask-origin",
       "mask-size",
-      "mask-composite",
-      "mask-mode"
+      "mask-image"
     ],
     "supports": [
       4
     ],
     "values": [
       "-moz-element",
       "-moz-image-rect",
       "-moz-linear-gradient",
@@ -7364,19 +7360,19 @@ exports.CSS_PROPERTIES = {
       "inherit",
       "initial",
       "unset"
     ]
   },
   "outline": {
     "isInherited": false,
     "subproperties": [
-      "outline-width",
+      "outline-color",
       "outline-style",
-      "outline-color"
+      "outline-width"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "auto",
       "currentColor",
@@ -8439,19 +8435,19 @@ exports.CSS_PROPERTIES = {
       "initial",
       "none",
       "unset"
     ]
   },
   "text-decoration": {
     "isInherited": false,
     "subproperties": [
-      "text-decoration-color",
       "text-decoration-line",
-      "text-decoration-style"
+      "text-decoration-style",
+      "text-decoration-color"
     ],
     "supports": [
       2
     ],
     "values": [
       "COLOR",
       "-moz-none",
       "blink",
--- a/layout/style/GenerateCSSPropsGenerated.py
+++ b/layout/style/GenerateCSSPropsGenerated.py
@@ -53,14 +53,34 @@ def generate(output, dataFile):
     ps = [(p, position) for position, p in enumerate(ps)]
     ps.sort(key=lambda (p, position): p.index)
     output.write("const int32_t nsCSSProps::"
                  "kIDLNameSortPositionTable[eCSSProperty_COUNT] = {\n")
     for (p, position) in ps:
         output.write("  {},\n".format(position))
     output.write("};\n\n")
 
+    # Generate shorthand subprop tables
+    names = []
+    for p in properties:
+        if p.type() != "shorthand":
+            continue
+        name = "g{}SubpropTable".format(p.method)
+        names.append(name)
+        output.write("static const nsCSSPropertyID {}[] = {{\n".format(name))
+        for subprop in p.subprops:
+            output.write("  eCSSProperty_{},\n".format(subprop))
+        output.write("  eCSSProperty_UNKNOWN\n")
+        output.write("};\n\n")
+    output.write("const nsCSSPropertyID* const\n")
+    output.write("nsCSSProps::kSubpropertyTable["
+                 "eCSSProperty_COUNT - eCSSProperty_COUNT_no_shorthands"
+                 "] = {\n")
+    for name in names:
+        output.write("  {},\n".format(name))
+    output.write("};\n\n")
+
     # Generate assertions
     msg = ("GenerateCSSPropsGenerated.py did not list properties "
            "in nsCSSPropertyID order")
     for p in properties:
         output.write('static_assert(eCSSProperty_{} == {}, "{}");\n'
                      .format(p.id, p.index, msg))
--- a/layout/style/ServoCSSPropList.mako.py
+++ b/layout/style/ServoCSSPropList.mako.py
@@ -14,17 +14,17 @@ class Longhand(object):
         _assign_slots(self, args)
 
     @staticmethod
     def type():
         return "longhand"
 
 
 class Shorthand(object):
-    __slots__ = ["name", "method", "id", "flags", "pref"]
+    __slots__ = ["name", "method", "id", "flags", "pref", "subprops"]
 
     def __init__(self, *args):
         _assign_slots(self, args)
 
     @staticmethod
     def type():
         return "shorthand"
 
@@ -86,23 +86,27 @@ def flags(prop):
     if "CAN_ANIMATE_ON_COMPOSITOR" in prop.flags:
         result.append("CanAnimateOnCompositor")
     return ", ".join('"CSSPropFlags::{}"'.format(flag) for flag in result)
 
 def pref(prop):
     if prop.gecko_pref:
         return '"' + prop.gecko_pref + '"'
     return '""'
+
+def sub_properties(prop):
+    return ", ".join('"{}"'.format(p.ident) for p in prop.sub_properties)
 %>
 
 data = [
     % for prop in sorted(data.longhands, key=order_key):
     Longhand("${prop.name}", "${method(prop)}", "${prop.ident}", [${flags(prop)}], ${pref(prop)}),
     % endfor
 
     % for prop in sorted(data.shorthands, key=order_key):
-    Shorthand("${prop.name}", "${prop.camel_case}", "${prop.ident}", [${flags(prop)}], ${pref(prop)}),
+    Shorthand("${prop.name}", "${prop.camel_case}", "${prop.ident}", [${flags(prop)}], ${pref(prop)},
+              [${sub_properties(prop)}]),
     % endfor
 
     % for prop in sorted(data.all_aliases(), key=lambda x: x.name):
     Alias("${prop.name}", "${prop.camel_case}", "${prop.ident}", "${prop.original.ident}", [], ${pref(prop)}),
     % endfor
 ]
--- a/layout/style/nsCSSProps.cpp
+++ b/layout/style/nsCSSProps.cpp
@@ -2113,462 +2113,16 @@ bool nsCSSProps::GetColorName(int32_t aP
 const CSSPropFlags nsCSSProps::kFlagsTable[eCSSProperty_COUNT] = {
 #define CSS_PROP_LONGHAND(name_, id_, method_, flags_, ...) flags_,
 #define CSS_PROP_SHORTHAND(name_, id_, method_, flags_, ...) flags_,
 #include "mozilla/ServoCSSPropList.h"
 #undef CSS_PROP_SHORTHAND
 #undef CSS_PROP_LONGHAND
 };
 
-static const nsCSSPropertyID gAllSubpropTable[] = {
-#define CSS_PROP_LIST_ONLY_COMPONENTS_OF_ALL_SHORTHAND
-#define CSS_PROP_LONGHAND(name_, id_, ...) eCSSProperty_##id_,
-#include "mozilla/ServoCSSPropList.h"
-#undef CSS_PROP_LONGHAND
-#undef CSS_PROP_LIST_ONLY_COMPONENTS_OF_ALL_SHORTHAND
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gAnimationSubpropTable[] = {
-  eCSSProperty_animation_duration,
-  eCSSProperty_animation_timing_function,
-  eCSSProperty_animation_delay,
-  eCSSProperty_animation_direction,
-  eCSSProperty_animation_fill_mode,
-  eCSSProperty_animation_iteration_count,
-  eCSSProperty_animation_play_state,
-  // List animation-name last so we serialize it last, in case it has
-  // a value that conflicts with one of the other properties.  (See
-  // how Declaration::GetValue serializes 'animation'.
-  eCSSProperty_animation_name,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderRadiusSubpropTable[] = {
-  // Code relies on these being in topleft-topright-bottomright-bottomleft
-  // order.
-  eCSSProperty_border_top_left_radius,
-  eCSSProperty_border_top_right_radius,
-  eCSSProperty_border_bottom_right_radius,
-  eCSSProperty_border_bottom_left_radius,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gOutlineRadiusSubpropTable[] = {
-  // Code relies on these being in topleft-topright-bottomright-bottomleft
-  // order.
-  eCSSProperty__moz_outline_radius_topleft,
-  eCSSProperty__moz_outline_radius_topright,
-  eCSSProperty__moz_outline_radius_bottomright,
-  eCSSProperty__moz_outline_radius_bottomleft,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBackgroundSubpropTable[] = {
-  eCSSProperty_background_color,
-  eCSSProperty_background_image,
-  eCSSProperty_background_repeat,
-  eCSSProperty_background_attachment,
-  eCSSProperty_background_clip,
-  eCSSProperty_background_origin,
-  eCSSProperty_background_position_x,
-  eCSSProperty_background_position_y,
-  eCSSProperty_background_size,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBackgroundPositionSubpropTable[] = {
-  eCSSProperty_background_position_x,
-  eCSSProperty_background_position_y,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderSubpropTable[] = {
-  eCSSProperty_border_top_width,
-  eCSSProperty_border_right_width,
-  eCSSProperty_border_bottom_width,
-  eCSSProperty_border_left_width,
-  eCSSProperty_border_top_style,
-  eCSSProperty_border_right_style,
-  eCSSProperty_border_bottom_style,
-  eCSSProperty_border_left_style,
-  eCSSProperty_border_top_color,
-  eCSSProperty_border_right_color,
-  eCSSProperty_border_bottom_color,
-  eCSSProperty_border_left_color,
-  eCSSProperty_border_image_source,
-  eCSSProperty_border_image_slice,
-  eCSSProperty_border_image_width,
-  eCSSProperty_border_image_outset,
-  eCSSProperty_border_image_repeat,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderBlockEndSubpropTable[] = {
-  // Declaration.cpp outputs the subproperties in this order.
-  // It also depends on the color being third.
-  eCSSProperty_border_block_end_width,
-  eCSSProperty_border_block_end_style,
-  eCSSProperty_border_block_end_color,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderBlockStartSubpropTable[] = {
-  // Declaration.cpp outputs the subproperties in this order.
-  // It also depends on the color being third.
-  eCSSProperty_border_block_start_width,
-  eCSSProperty_border_block_start_style,
-  eCSSProperty_border_block_start_color,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderBottomSubpropTable[] = {
-  // Declaration.cpp outputs the subproperties in this order.
-  // It also depends on the color being third.
-  eCSSProperty_border_bottom_width,
-  eCSSProperty_border_bottom_style,
-  eCSSProperty_border_bottom_color,
-  eCSSProperty_UNKNOWN
-};
-
-static_assert(eSideTop == 0 && eSideRight == 1 &&
-              eSideBottom == 2 && eSideLeft == 3,
-              "box side constants not top/right/bottom/left == 0/1/2/3");
-static const nsCSSPropertyID gBorderColorSubpropTable[] = {
-  // Code relies on these being in top-right-bottom-left order.
-  // Code relies on these matching the enum Side constants.
-  eCSSProperty_border_top_color,
-  eCSSProperty_border_right_color,
-  eCSSProperty_border_bottom_color,
-  eCSSProperty_border_left_color,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderInlineEndSubpropTable[] = {
-  // Declaration.cpp output the subproperties in this order.
-  // It also depends on the color being third.
-  eCSSProperty_border_inline_end_width,
-  eCSSProperty_border_inline_end_style,
-  eCSSProperty_border_inline_end_color,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderLeftSubpropTable[] = {
-  // Declaration.cpp outputs the subproperties in this order.
-  // It also depends on the color being third.
-  eCSSProperty_border_left_width,
-  eCSSProperty_border_left_style,
-  eCSSProperty_border_left_color,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderRightSubpropTable[] = {
-  // Declaration.cpp outputs the subproperties in this order.
-  // It also depends on the color being third.
-  eCSSProperty_border_right_width,
-  eCSSProperty_border_right_style,
-  eCSSProperty_border_right_color,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderInlineStartSubpropTable[] = {
-  // Declaration.cpp outputs the subproperties in this order.
-  // It also depends on the color being third.
-  eCSSProperty_border_inline_start_width,
-  eCSSProperty_border_inline_start_style,
-  eCSSProperty_border_inline_start_color,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderStyleSubpropTable[] = {
-  // Code relies on these being in top-right-bottom-left order.
-  eCSSProperty_border_top_style,
-  eCSSProperty_border_right_style,
-  eCSSProperty_border_bottom_style,
-  eCSSProperty_border_left_style,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderTopSubpropTable[] = {
-  // Declaration.cpp outputs the subproperties in this order.
-  // It also depends on the color being third.
-  eCSSProperty_border_top_width,
-  eCSSProperty_border_top_style,
-  eCSSProperty_border_top_color,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderWidthSubpropTable[] = {
-  // Code relies on these being in top-right-bottom-left order.
-  eCSSProperty_border_top_width,
-  eCSSProperty_border_right_width,
-  eCSSProperty_border_bottom_width,
-  eCSSProperty_border_left_width,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gFontSubpropTable[] = {
-  eCSSProperty_font_family,
-  eCSSProperty_font_style,
-  eCSSProperty_font_weight,
-  eCSSProperty_font_size,
-  eCSSProperty_line_height,
-  eCSSProperty_font_size_adjust,
-  eCSSProperty_font_stretch,
-  eCSSProperty_font_feature_settings,
-  eCSSProperty_font_language_override,
-  eCSSProperty_font_kerning,
-  eCSSProperty_font_optical_sizing,
-  eCSSProperty_font_variation_settings,
-  eCSSProperty_font_variant_alternates,
-  eCSSProperty_font_variant_caps,
-  eCSSProperty_font_variant_east_asian,
-  eCSSProperty_font_variant_ligatures,
-  eCSSProperty_font_variant_numeric,
-  eCSSProperty_font_variant_position,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gFontVariantSubpropTable[] = {
-  eCSSProperty_font_variant_alternates,
-  eCSSProperty_font_variant_caps,
-  eCSSProperty_font_variant_east_asian,
-  eCSSProperty_font_variant_ligatures,
-  eCSSProperty_font_variant_numeric,
-  eCSSProperty_font_variant_position,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gListStyleSubpropTable[] = {
-  eCSSProperty_list_style_type,
-  eCSSProperty_list_style_image,
-  eCSSProperty_list_style_position,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gMarginSubpropTable[] = {
-  // Code relies on these being in top-right-bottom-left order.
-  eCSSProperty_margin_top,
-  eCSSProperty_margin_right,
-  eCSSProperty_margin_bottom,
-  eCSSProperty_margin_left,
-  eCSSProperty_UNKNOWN
-};
-
-
-static const nsCSSPropertyID gOutlineSubpropTable[] = {
-  // nsCSSDeclaration.cpp outputs the subproperties in this order.
-  // It also depends on the color being third.
-  eCSSProperty_outline_width,
-  eCSSProperty_outline_style,
-  eCSSProperty_outline_color,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gColumnsSubpropTable[] = {
-  eCSSProperty_column_count,
-  eCSSProperty_column_width,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gColumnRuleSubpropTable[] = {
-  // nsCSSDeclaration.cpp outputs the subproperties in this order.
-  // It also depends on the color being third.
-  eCSSProperty_column_rule_width,
-  eCSSProperty_column_rule_style,
-  eCSSProperty_column_rule_color,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gFlexSubpropTable[] = {
-  eCSSProperty_flex_grow,
-  eCSSProperty_flex_shrink,
-  eCSSProperty_flex_basis,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gFlexFlowSubpropTable[] = {
-  eCSSProperty_flex_direction,
-  eCSSProperty_flex_wrap,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gGridTemplateSubpropTable[] = {
-  eCSSProperty_grid_template_areas,
-  eCSSProperty_grid_template_rows,
-  eCSSProperty_grid_template_columns,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gGridSubpropTable[] = {
-  eCSSProperty_grid_template_areas,
-  eCSSProperty_grid_template_rows,
-  eCSSProperty_grid_template_columns,
-  eCSSProperty_grid_auto_flow,
-  eCSSProperty_grid_auto_rows,
-  eCSSProperty_grid_auto_columns,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gGridColumnSubpropTable[] = {
-  eCSSProperty_grid_column_start,
-  eCSSProperty_grid_column_end,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gGridRowSubpropTable[] = {
-  eCSSProperty_grid_row_start,
-  eCSSProperty_grid_row_end,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gGridAreaSubpropTable[] = {
-  eCSSProperty_grid_row_start,
-  eCSSProperty_grid_column_start,
-  eCSSProperty_grid_row_end,
-  eCSSProperty_grid_column_end,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gGapSubpropTable[] = {
-  eCSSProperty_row_gap,
-  eCSSProperty_column_gap,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gOverflowSubpropTable[] = {
-  eCSSProperty_overflow_x,
-  eCSSProperty_overflow_y,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gOverflowClipBoxSubpropTable[] = {
-  eCSSProperty_overflow_clip_box_block,
-  eCSSProperty_overflow_clip_box_inline,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gPaddingSubpropTable[] = {
-  // Code relies on these being in top-right-bottom-left order.
-  eCSSProperty_padding_top,
-  eCSSProperty_padding_right,
-  eCSSProperty_padding_bottom,
-  eCSSProperty_padding_left,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gTextDecorationSubpropTable[] = {
-  eCSSProperty_text_decoration_color,
-  eCSSProperty_text_decoration_line,
-  eCSSProperty_text_decoration_style,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gTextEmphasisSubpropTable[] = {
-  eCSSProperty_text_emphasis_style,
-  eCSSProperty_text_emphasis_color,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gWebkitTextStrokeSubpropTable[] = {
-  eCSSProperty__webkit_text_stroke_width,
-  eCSSProperty__webkit_text_stroke_color,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gTransitionSubpropTable[] = {
-  eCSSProperty_transition_property,
-  eCSSProperty_transition_duration,
-  eCSSProperty_transition_timing_function,
-  eCSSProperty_transition_delay,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gBorderImageSubpropTable[] = {
-  eCSSProperty_border_image_source,
-  eCSSProperty_border_image_slice,
-  eCSSProperty_border_image_width,
-  eCSSProperty_border_image_outset,
-  eCSSProperty_border_image_repeat,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gMarkerSubpropTable[] = {
-  eCSSProperty_marker_start,
-  eCSSProperty_marker_mid,
-  eCSSProperty_marker_end,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gPlaceContentSubpropTable[] = {
-  eCSSProperty_align_content,
-  eCSSProperty_justify_content,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gPlaceItemsSubpropTable[] = {
-  eCSSProperty_align_items,
-  eCSSProperty_justify_items,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gPlaceSelfSubpropTable[] = {
-  eCSSProperty_align_self,
-  eCSSProperty_justify_self,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gOverscrollBehaviorSubpropTable[] = {
-  eCSSProperty_overscroll_behavior_x,
-  eCSSProperty_overscroll_behavior_y,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gScrollSnapTypeSubpropTable[] = {
-  eCSSProperty_scroll_snap_type_x,
-  eCSSProperty_scroll_snap_type_y,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gMaskSubpropTable[] = {
-  eCSSProperty_mask_image,
-  eCSSProperty_mask_repeat,
-  eCSSProperty_mask_position_x,
-  eCSSProperty_mask_position_y,
-  eCSSProperty_mask_clip,
-  eCSSProperty_mask_origin,
-  eCSSProperty_mask_size,
-  eCSSProperty_mask_composite,
-  eCSSProperty_mask_mode,
-  eCSSProperty_UNKNOWN
-};
-
-static const nsCSSPropertyID gMaskPositionSubpropTable[] = {
-  eCSSProperty_mask_position_x,
-  eCSSProperty_mask_position_y,
-  eCSSProperty_UNKNOWN
-};
-
-// FIXME: mask-border tables should be added when we implement
-// mask-border properties.
-
-const nsCSSPropertyID *const
-nsCSSProps::kSubpropertyTable[eCSSProperty_COUNT - eCSSProperty_COUNT_no_shorthands] = {
-#define CSS_PROP_PUBLIC_OR_PRIVATE(publicname_, privatename_) privatename_
-// Need an extra level of macro nesting to force expansion of method_
-// params before they get pasted.
-#define NSCSSPROPS_INNER_MACRO(method_) g##method_##SubpropTable,
-#define CSS_PROP_SHORTHAND(name_, id_, method_, flags_, pref_) \
-  NSCSSPROPS_INNER_MACRO(method_)
-#include "mozilla/ServoCSSPropList.h"
-#undef CSS_PROP_SHORTHAND
-#undef NSCSSPROPS_INNER_MACRO
-#undef CSS_PROP_PUBLIC_OR_PRIVATE
-};
-
 /* static */ bool
 nsCSSProps::gPropertyEnabled[eCSSProperty_COUNT_with_aliases] = {
   // If the property has any "ENABLED_IN" flag set, it is disabled by
   // default. Note that, if a property has pref, whatever its default
   // value is, it will later be changed in nsCSSProps::AddRefTable().
   // If the property has "ENABLED_IN" flags but doesn't have a pref,
   // it is an internal property which is disabled elsewhere.
   #define IS_ENABLED_BY_DEFAULT(flags_) \