Bug 1454830 part 2 - Add GETCS_NEEDS_LAYOUT_FLUSH flag in Servo side and propagate it to ServoCSSPropList.h. r?emilio draft
authorXidorn Quan <me@upsuper.org>
Fri, 20 Apr 2018 19:13:16 +1000
changeset 785617 5dedc67687a80df221ecbdc53a75068d98b6f813
parent 785540 a2c7758dc738fdacc3a7e057249dd2c4ada771dd
child 785618 d1161498b74f5fd4e68a867f64129f43f8d47c53
push id107275
push userxquan@mozilla.com
push dateFri, 20 Apr 2018 13:09:38 +0000
reviewersemilio
bugs1454830
milestone61.0a1
Bug 1454830 part 2 - Add GETCS_NEEDS_LAYOUT_FLUSH flag in Servo side and propagate it to ServoCSSPropList.h. r?emilio MozReview-Commit-ID: 5k08FWjobCg
layout/style/ServoCSSPropList.mako.py
layout/style/nsCSSProps.cpp
servo/components/style/properties/longhand/border.mako.rs
servo/components/style/properties/longhand/box.mako.rs
servo/components/style/properties/longhand/inherited_text.mako.rs
servo/components/style/properties/longhand/margin.mako.rs
servo/components/style/properties/longhand/padding.mako.rs
servo/components/style/properties/longhand/position.mako.rs
servo/components/style/properties/longhand/ui.mako.rs
servo/components/style/properties/properties.mako.rs
--- a/layout/style/ServoCSSPropList.mako.py
+++ b/layout/style/ServoCSSPropList.mako.py
@@ -32,16 +32,18 @@ def flags(prop):
     if prop.explicitly_enabled_in_chrome():
         result.append("CSS_PROPERTY_ENABLED_IN_UA_SHEETS_AND_CHROME")
     elif prop.explicitly_enabled_in_ua_sheets():
         result.append("CSS_PROPERTY_ENABLED_IN_UA_SHEETS")
     if is_internal(prop):
         result.append("CSS_PROPERTY_INTERNAL")
     if prop.enabled_in == "":
         result.append("CSS_PROPERTY_PARSE_INACCESSIBLE")
+    if "GETCS_NEEDS_LAYOUT_FLUSH" in prop.flags:
+        result.append("CSS_PROPERTY_GETCS_NEEDS_LAYOUT_FLUSH")
     return ", ".join('"{}"'.format(flag) for flag in result)
 
 def pref(prop):
     if prop.gecko_pref:
         return '"' + prop.gecko_pref + '"'
     return '""'
 %>
 
--- a/layout/style/nsCSSProps.cpp
+++ b/layout/style/nsCSSProps.cpp
@@ -180,30 +180,30 @@ CheckServoCSSPropList()
 #include "mozilla/ServoCSSPropList.h"
 #undef CSS_PROP_ALIAS
 #undef CSS_PROP_SHORTHAND
 #undef CSS_PROP_LONGHAND
   };
 
   const uint32_t kServoFlags =
     CSS_PROPERTY_ENABLED_MASK | CSS_PROPERTY_INTERNAL |
-    CSS_PROPERTY_PARSE_INACCESSIBLE;
+    CSS_PROPERTY_PARSE_INACCESSIBLE | CSS_PROPERTY_GETCS_NEEDS_LAYOUT_FLUSH;
   bool mismatch = false;
   for (size_t i = 0; i < eCSSProperty_COUNT_with_aliases; i++) {
     auto& geckoData = sGeckoProps[i];
     auto& servoData = sServoProps[i];
     const char* name = nsCSSProps::GetStringValue(geckoData.mID).get();
     if (geckoData.mID != servoData.mID) {
       printf_stderr("Order mismatches: gecko: %s, servo: %s\n",
                     name, nsCSSProps::GetStringValue(servoData.mID).get());
       mismatch = true;
       continue;
     }
     if ((geckoData.mFlags & kServoFlags) != servoData.mFlags) {
-      printf_stderr("Enabled flags of %s mismatch\n", name);
+      printf_stderr("Flags of %s mismatch\n", name);
       mismatch = true;
     }
     if (strcmp(geckoData.mPref, servoData.mPref) != 0) {
       printf_stderr("Pref of %s mismatches\n", name);
       mismatch = true;
     }
   }
 
--- a/servo/components/style/properties/longhand/border.mako.rs
+++ b/servo/components/style/properties/longhand/border.mako.rs
@@ -38,27 +38,29 @@
         alias=maybe_moz_logical_alias(product, side, "-moz-border-%s-style"),
         spec=maybe_logical_spec(side, "style"),
         flags="APPLIES_TO_FIRST_LETTER",
         animation_value_type="discrete" if not is_logical else "none",
         logical=is_logical,
         needs_context=False,
     )}
 
-    ${helpers.predefined_type("border-%s-width" % side_name,
-                              "BorderSideWidth",
-                              "::values::computed::NonNegativeLength::new(3.)",
-                              computed_type="::values::computed::NonNegativeLength",
-                              alias=maybe_moz_logical_alias(product, side, "-moz-border-%s-width"),
-                              spec=maybe_logical_spec(side, "width"),
-                              animation_value_type="NonNegativeLength",
-                              logical=is_logical,
-                              flags="APPLIES_TO_FIRST_LETTER",
-                              allow_quirks=not is_logical,
-                              servo_restyle_damage = "reflow rebuild_and_reflow_inline")}
+    ${helpers.predefined_type(
+        "border-%s-width" % side_name,
+        "BorderSideWidth",
+        "::values::computed::NonNegativeLength::new(3.)",
+        computed_type="::values::computed::NonNegativeLength",
+        alias=maybe_moz_logical_alias(product, side, "-moz-border-%s-width"),
+        spec=maybe_logical_spec(side, "width"),
+        animation_value_type="NonNegativeLength",
+        logical=is_logical,
+        flags="APPLIES_TO_FIRST_LETTER GETCS_NEEDS_LAYOUT_FLUSH",
+        allow_quirks=not is_logical,
+        servo_restyle_damage="reflow rebuild_and_reflow_inline"
+    )}
 % endfor
 
 ${helpers.gecko_keyword_conversion(Keyword('border-style',
                                    "none solid double dotted dashed hidden groove ridge inset outset"),
                                    type="::values::specified::BorderStyle")}
 
 // FIXME(#4126): when gfx supports painting it, make this Size2D<LengthOrPercentage>
 % for corner in ["top-left", "top-right", "bottom-right", "bottom-left"]:
--- a/servo/components/style/properties/longhand/box.mako.rs
+++ b/servo/components/style/properties/longhand/box.mako.rs
@@ -398,24 +398,27 @@
     gecko_pref="layout.css.scroll-snap.enabled",
     spec="Nonstandard (https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-snap-destination)",
     animation_value_type="discrete",
     allow_empty="NotInitial"
 )}
 
 <% transform_extra_prefixes = "moz:layout.css.prefixes.transforms webkit" %>
 
-${helpers.predefined_type("transform", "Transform",
-                          "generics::transform::Transform::none()",
-                          extra_prefixes=transform_extra_prefixes,
-                          animation_value_type="ComputedValue",
-                          gecko_ffi_name="mSpecifiedTransform",
-                          flags="CREATES_STACKING_CONTEXT FIXPOS_CB",
-                          spec="https://drafts.csswg.org/css-transforms/#propdef-transform",
-                          servo_restyle_damage = "reflow_out_of_flow")}
+${helpers.predefined_type(
+    "transform",
+    "Transform",
+    "generics::transform::Transform::none()",
+    extra_prefixes=transform_extra_prefixes,
+    animation_value_type="ComputedValue",
+    gecko_ffi_name="mSpecifiedTransform",
+    flags="CREATES_STACKING_CONTEXT FIXPOS_CB GETCS_NEEDS_LAYOUT_FLUSH",
+    spec="https://drafts.csswg.org/css-transforms/#propdef-transform",
+    servo_restyle_damage="reflow_out_of_flow"
+)}
 
 ${helpers.predefined_type("rotate", "Rotate",
                           "generics::transform::Rotate::None",
                           animation_value_type="ComputedValue",
                           boxed=True,
                           flags="CREATES_STACKING_CONTEXT FIXPOS_CB",
                           gecko_pref="layout.css.individual-transform.enabled",
                           spec="https://drafts.csswg.org/css-transforms-2/#individual-transforms",
@@ -425,24 +428,27 @@
                           "generics::transform::Scale::None",
                           animation_value_type="ComputedValue",
                           boxed=True,
                           flags="CREATES_STACKING_CONTEXT FIXPOS_CB",
                           gecko_pref="layout.css.individual-transform.enabled",
                           spec="https://drafts.csswg.org/css-transforms-2/#individual-transforms",
                           servo_restyle_damage = "reflow_out_of_flow")}
 
-${helpers.predefined_type("translate", "Translate",
-                          "generics::transform::Translate::None",
-                          animation_value_type="ComputedValue",
-                          boxed=True,
-                          flags="CREATES_STACKING_CONTEXT FIXPOS_CB",
-                          gecko_pref="layout.css.individual-transform.enabled",
-                          spec="https://drafts.csswg.org/css-transforms-2/#individual-transforms",
-                          servo_restyle_damage = "reflow_out_of_flow")}
+${helpers.predefined_type(
+    "translate",
+    "Translate",
+    "generics::transform::Translate::None",
+    animation_value_type="ComputedValue",
+    boxed=True,
+    flags="CREATES_STACKING_CONTEXT FIXPOS_CB GETCS_NEEDS_LAYOUT_FLUSH",
+    gecko_pref="layout.css.individual-transform.enabled",
+    spec="https://drafts.csswg.org/css-transforms-2/#individual-transforms",
+    servo_restyle_damage="reflow_out_of_flow"
+)}
 
 // CSSOM View Module
 // https://www.w3.org/TR/cssom-view-1/
 ${helpers.single_keyword("scroll-behavior",
                          "auto smooth",
                          gecko_pref="layout.css.scroll-behavior.property-enabled",
                          products="gecko",
                          spec="https://drafts.csswg.org/cssom-view/#propdef-scroll-behavior",
@@ -524,24 +530,27 @@
     gecko_ffi_name="mChildPerspective",
     spec="https://drafts.csswg.org/css-transforms/#perspective",
     extra_prefixes=transform_extra_prefixes,
     flags="CREATES_STACKING_CONTEXT FIXPOS_CB",
     animation_value_type="AnimatedPerspective",
     servo_restyle_damage = "reflow_out_of_flow",
 )}
 
-${helpers.predefined_type("perspective-origin",
-                          "position::Position",
-                          "computed::position::Position::center()",
-                          boxed=True,
-                          extra_prefixes=transform_extra_prefixes,
-                          spec="https://drafts.csswg.org/css-transforms-2/#perspective-origin-property",
-                          animation_value_type="ComputedValue",
-                          servo_restyle_damage = "reflow_out_of_flow")}
+${helpers.predefined_type(
+    "perspective-origin",
+    "position::Position",
+    "computed::position::Position::center()",
+    boxed=True,
+    extra_prefixes=transform_extra_prefixes,
+    spec="https://drafts.csswg.org/css-transforms-2/#perspective-origin-property",
+    flags="GETCS_NEEDS_LAYOUT_FLUSH",
+    animation_value_type="ComputedValue",
+    servo_restyle_damage="reflow_out_of_flow"
+)}
 
 ${helpers.single_keyword("backface-visibility",
                          "visible hidden",
                          spec="https://drafts.csswg.org/css-transforms/#backface-visibility-property",
                          extra_prefixes=transform_extra_prefixes,
                          animation_value_type="discrete")}
 
 ${helpers.single_keyword("transform-box",
@@ -560,25 +569,28 @@
     spec="https://drafts.csswg.org/css-transforms-2/#transform-style-property",
     needs_context=False,
     extra_prefixes=transform_extra_prefixes,
     flags="CREATES_STACKING_CONTEXT FIXPOS_CB",
     animation_value_type="discrete",
     servo_restyle_damage = "reflow_out_of_flow",
 )}
 
-${helpers.predefined_type("transform-origin",
-                          "TransformOrigin",
-                          "computed::TransformOrigin::initial_value()",
-                          animation_value_type="ComputedValue",
-                          extra_prefixes=transform_extra_prefixes,
-                          gecko_ffi_name="mTransformOrigin",
-                          boxed=True,
-                          spec="https://drafts.csswg.org/css-transforms/#transform-origin-property",
-                          servo_restyle_damage = "reflow_out_of_flow")}
+${helpers.predefined_type(
+    "transform-origin",
+    "TransformOrigin",
+    "computed::TransformOrigin::initial_value()",
+    animation_value_type="ComputedValue",
+    extra_prefixes=transform_extra_prefixes,
+    gecko_ffi_name="mTransformOrigin",
+    boxed=True,
+    flags="GETCS_NEEDS_LAYOUT_FLUSH",
+    spec="https://drafts.csswg.org/css-transforms/#transform-origin-property",
+    servo_restyle_damage="reflow_out_of_flow"
+)}
 
 ${helpers.predefined_type("contain",
                           "Contain",
                           "specified::Contain::empty()",
                           animation_value_type="discrete",
                           products="gecko",
                           flags="FIXPOS_CB",
                           gecko_pref="layout.css.contain.enabled",
--- a/servo/components/style/properties/longhand/inherited_text.mako.rs
+++ b/servo/components/style/properties/longhand/inherited_text.mako.rs
@@ -1,23 +1,26 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 <%namespace name="helpers" file="/helpers.mako.rs" />
 <% from data import Keyword %>
 <% data.new_style_struct("InheritedText", inherited=True, gecko_name="Text") %>
 
-${helpers.predefined_type("line-height",
-                          "LineHeight",
-                          "computed::LineHeight::normal()",
-                          animation_value_type="LineHeight",
-                          flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER",
-                          spec="https://drafts.csswg.org/css2/visudet.html#propdef-line-height",
-                          servo_restyle_damage = "reflow")}
+${helpers.predefined_type(
+    "line-height",
+    "LineHeight",
+    "computed::LineHeight::normal()",
+    animation_value_type="LineHeight",
+    flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE \
+           APPLIES_TO_PLACEHOLDER GETCS_NEEDS_LAYOUT_FLUSH",
+    spec="https://drafts.csswg.org/css2/visudet.html#propdef-line-height",
+    servo_restyle_damage="reflow"
+)}
 
 // CSS Text Module Level 3
 
 // TODO(pcwalton): `full-width`
 ${helpers.single_keyword("text-transform",
                          "none capitalize uppercase lowercase",
                          extra_gecko_values="full-width",
                          animation_value_type="discrete",
--- a/servo/components/style/properties/longhand/margin.mako.rs
+++ b/servo/components/style/properties/longhand/margin.mako.rs
@@ -7,17 +7,22 @@
 <% data.new_style_struct("Margin", inherited=False) %>
 
 % for side in ALL_SIDES:
     <%
         spec = "https://drafts.csswg.org/css-box/#propdef-margin-%s" % side[0]
         if side[1]:
             spec = "https://drafts.csswg.org/css-logical-props/#propdef-margin-%s" % side[1]
     %>
-    ${helpers.predefined_type("margin-%s" % side[0], "LengthOrPercentageOrAuto",
-                              "computed::LengthOrPercentageOrAuto::Length(computed::Length::new(0.))",
-                              alias=maybe_moz_logical_alias(product, side, "-moz-margin-%s"),
-                              allow_quirks=not side[1],
-                              animation_value_type="ComputedValue", logical = side[1], spec = spec,
-                              flags="APPLIES_TO_FIRST_LETTER",
-                              allowed_in_page_rule=True,
-                              servo_restyle_damage = "reflow")}
+    ${helpers.predefined_type(
+        "margin-%s" % side[0],
+        "LengthOrPercentageOrAuto",
+        "computed::LengthOrPercentageOrAuto::Length(computed::Length::new(0.))",
+        alias=maybe_moz_logical_alias(product, side, "-moz-margin-%s"),
+        allow_quirks=not side[1],
+        animation_value_type="ComputedValue",
+        logical=side[1],
+        spec=spec,
+        flags="APPLIES_TO_FIRST_LETTER GETCS_NEEDS_LAYOUT_FLUSH",
+        allowed_in_page_rule=True,
+        servo_restyle_damage="reflow"
+    )}
 % endfor
--- a/servo/components/style/properties/longhand/padding.mako.rs
+++ b/servo/components/style/properties/longhand/padding.mako.rs
@@ -9,18 +9,21 @@
 // APPLIES_TO_PLACEHOLDER so we can set it in UA  stylesheets.  But we use a
 // !important value there, so pages can't set it.
 % for side in ALL_SIDES:
     <%
         spec = "https://drafts.csswg.org/css-box/#propdef-padding-%s" % side[0]
         if side[1]:
             spec = "https://drafts.csswg.org/css-logical-props/#propdef-padding-%s" % side[1]
     %>
-    ${helpers.predefined_type("padding-%s" % side[0], "NonNegativeLengthOrPercentage",
-                              "computed::NonNegativeLengthOrPercentage::zero()",
-                              alias=maybe_moz_logical_alias(product, side, "-moz-padding-%s"),
-                              animation_value_type="NonNegativeLengthOrPercentage",
-                              logical = side[1],
-                              spec = spec,
-                              flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_PLACEHOLDER",
-                              allow_quirks=not side[1],
-                              servo_restyle_damage = "reflow rebuild_and_reflow_inline")}
+    ${helpers.predefined_type(
+        "padding-%s" % side[0],
+        "NonNegativeLengthOrPercentage",
+        "computed::NonNegativeLengthOrPercentage::zero()",
+        alias=maybe_moz_logical_alias(product, side, "-moz-padding-%s"),
+        animation_value_type="NonNegativeLengthOrPercentage",
+        logical=side[1],
+        spec=spec,
+        flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_PLACEHOLDER GETCS_NEEDS_LAYOUT_FLUSH",
+        allow_quirks=not side[1],
+        servo_restyle_damage="reflow rebuild_and_reflow_inline"
+    )}
 % endfor
--- a/servo/components/style/properties/longhand/position.mako.rs
+++ b/servo/components/style/properties/longhand/position.mako.rs
@@ -5,28 +5,38 @@
 <%! from data import to_rust_ident %>
 <%namespace name="helpers" file="/helpers.mako.rs" />
 <% from data import ALL_SIZES, PHYSICAL_SIDES, LOGICAL_SIDES %>
 
 <% data.new_style_struct("Position", inherited=False) %>
 
 // "top" / "left" / "bottom" / "right"
 % for side in PHYSICAL_SIDES:
-    ${helpers.predefined_type(side, "LengthOrPercentageOrAuto",
-                              "computed::LengthOrPercentageOrAuto::Auto",
-                              spec="https://www.w3.org/TR/CSS2/visuren.html#propdef-%s" % side,
-                              animation_value_type="ComputedValue",
-                              allow_quirks=True, servo_restyle_damage = "reflow_out_of_flow")}
+    ${helpers.predefined_type(
+        side,
+        "LengthOrPercentageOrAuto",
+        "computed::LengthOrPercentageOrAuto::Auto",
+        spec="https://www.w3.org/TR/CSS2/visuren.html#propdef-%s" % side,
+        flags="GETCS_NEEDS_LAYOUT_FLUSH",
+        animation_value_type="ComputedValue",
+        allow_quirks=True,
+        servo_restyle_damage="reflow_out_of_flow"
+    )}
 % endfor
 // offset-* logical properties, map to "top" / "left" / "bottom" / "right"
 % for side in LOGICAL_SIDES:
-    ${helpers.predefined_type("offset-%s" % side, "LengthOrPercentageOrAuto",
-                              "computed::LengthOrPercentageOrAuto::Auto",
-                              spec="https://drafts.csswg.org/css-logical-props/#propdef-offset-%s" % side,
-                              animation_value_type="ComputedValue", logical=True)}
+    ${helpers.predefined_type(
+        "offset-%s" % side,
+        "LengthOrPercentageOrAuto",
+        "computed::LengthOrPercentageOrAuto::Auto",
+        spec="https://drafts.csswg.org/css-logical-props/#propdef-offset-%s" % side,
+        flags="GETCS_NEEDS_LAYOUT_FLUSH",
+        animation_value_type="ComputedValue",
+        logical=True,
+    )}
 % endfor
 
 #[cfg(feature = "gecko")]
 macro_rules! impl_align_conversions {
     ($name: path) => {
         impl From<u8> for $name {
             fn from(bits: u8) -> $name {
                 $name(::values::specified::align::AlignFlags::from_bits(bits)
@@ -206,17 +216,18 @@ macro_rules! impl_align_conversions {
             size,
             "MozLength",
             "computed::MozLength::auto()",
             parse_function,
             logical=logical,
             allow_quirks=not logical,
             spec=spec % size,
             animation_value_type="MozLength",
-            servo_restyle_damage = "reflow"
+            flags="GETCS_NEEDS_LAYOUT_FLUSH",
+            servo_restyle_damage="reflow"
         )}
         // min-width, min-height, min-block-size, min-inline-size,
         ${helpers.predefined_type(
             "min-%s" % size,
             "MozLength",
             "computed::MozLength::auto()",
             parse_function,
             logical=logical,
@@ -311,23 +322,26 @@ macro_rules! impl_align_conversions {
     ${helpers.predefined_type("grid-auto-%ss" % kind,
                               "TrackSize",
                               "Default::default()",
                               animation_value_type="discrete",
                               spec="https://drafts.csswg.org/css-grid/#propdef-grid-auto-%ss" % kind,
                               products="gecko",
                               boxed=True)}
 
-    ${helpers.predefined_type("grid-template-%ss" % kind,
-                              "GridTemplateComponent",
-                              "specified::GenericGridTemplateComponent::None",
-                              products="gecko",
-                              spec="https://drafts.csswg.org/css-grid/#propdef-grid-template-%ss" % kind,
-                              boxed=True,
-                              animation_value_type="discrete")}
+    ${helpers.predefined_type(
+        "grid-template-%ss" % kind,
+        "GridTemplateComponent",
+        "specified::GenericGridTemplateComponent::None",
+        products="gecko",
+        spec="https://drafts.csswg.org/css-grid/#propdef-grid-template-%ss" % kind,
+        boxed=True,
+        flags="GETCS_NEEDS_LAYOUT_FLUSH",
+        animation_value_type="discrete"
+    )}
 
 % endfor
 
 ${helpers.predefined_type("grid-auto-flow",
                           "GridAutoFlow",
                           initial_value="computed::GridAutoFlow::row()",
                           products="gecko",
                           animation_value_type="discrete",
--- a/servo/components/style/properties/longhand/ui.mako.rs
+++ b/servo/components/style/properties/longhand/ui.mako.rs
@@ -43,31 +43,39 @@
 
 // TODO(bug 1419695) This should be hidden from content.
 ${helpers.predefined_type("-moz-window-opacity", "Opacity", "1.0", products="gecko",
                           gecko_ffi_name="mWindowOpacity",
                           animation_value_type="ComputedValue",
                           spec="None (Nonstandard internal property)")}
 
 // TODO(bug 1419695) This should be hidden from content.
-${helpers.predefined_type("-moz-window-transform", "Transform",
-                          "generics::transform::Transform::none()",
-                          products="gecko", gecko_ffi_name="mSpecifiedWindowTransform",
-                          animation_value_type="ComputedValue",
-                          spec="None (Nonstandard internal property)")}
+${helpers.predefined_type(
+    "-moz-window-transform",
+    "Transform",
+    "generics::transform::Transform::none()",
+    products="gecko",
+    gecko_ffi_name="mSpecifiedWindowTransform",
+    flags="GETCS_NEEDS_LAYOUT_FLUSH",
+    animation_value_type="ComputedValue",
+    spec="None (Nonstandard internal property)"
+)}
 
 // TODO(bug 1419695) This should be hidden from content.
-${helpers.predefined_type("-moz-window-transform-origin",
-                          "TransformOrigin",
-                          "computed::TransformOrigin::initial_value()",
-                          animation_value_type="ComputedValue",
-                          gecko_ffi_name="mWindowTransformOrigin",
-                          products="gecko",
-                          boxed=True,
-                          spec="None (Nonstandard internal property)")}
+${helpers.predefined_type(
+    "-moz-window-transform-origin",
+    "TransformOrigin",
+    "computed::TransformOrigin::initial_value()",
+    animation_value_type="ComputedValue",
+    gecko_ffi_name="mWindowTransformOrigin",
+    products="gecko",
+    boxed=True,
+    flags="GETCS_NEEDS_LAYOUT_FLUSH",
+    spec="None (Nonstandard internal property)"
+)}
 
 // TODO(emilio): Probably also should be hidden from content.
 ${helpers.predefined_type("-moz-force-broken-image-icon",
                           "MozForceBrokenImageIcon",
                           "computed::MozForceBrokenImageIcon::false_value()",
                           animation_value_type="discrete",
                           products="gecko",
                           spec="None (Nonstandard Firefox-only property)")}
--- a/servo/components/style/properties/properties.mako.rs
+++ b/servo/components/style/properties/properties.mako.rs
@@ -776,16 +776,23 @@ bitflags! {
         /// absolutely positioned elements.
         const ABSPOS_CB = 1 << 2;
         /// This longhand property applies to ::first-letter.
         const APPLIES_TO_FIRST_LETTER = 1 << 3;
         /// This longhand property applies to ::first-line.
         const APPLIES_TO_FIRST_LINE = 1 << 4;
         /// This longhand property applies to ::placeholder.
         const APPLIES_TO_PLACEHOLDER = 1 << 5;
+
+        /* The following flags are currently not used in Rust code, they
+         * only need to be listed in corresponding properties so that
+         * they can be checked in the C++ side via ServoCSSPropList.h. */
+        /// This property's getComputedStyle implementation requires layout
+        /// to be flushed.
+        const GETCS_NEEDS_LAYOUT_FLUSH = 0;
     }
 }
 
 /// An identifier for a given longhand property.
 #[derive(Clone, Copy, Eq, Hash, MallocSizeOf, PartialEq)]
 #[repr(u16)]
 pub enum LonghandId {
     % for i, property in enumerate(data.longhands):