--- 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):