From 0ff7b5f2def94105b6bf6923eefe8a12bf16bd13 Mon Sep 17 00:00:00 2001 From: Cameron McCormack Date: Mon, 5 Dec 2016 13:47:09 -1000 Subject: [PATCH 1/3] Support declaring keyword property Gecko coverage as inexhaustive. This allows us to control whether the catchall case in the match expression that maps Gecko const to Servo enum will be generated. MozReview-Commit-ID: L65IjTONdfl --- components/style/properties/data.py | 8 ++++++-- components/style/properties/gecko.mako.rs | 5 ++++- components/style/properties/helpers.mako.rs | 2 +- components/style/properties/longhand/border.mako.rs | 2 ++ components/style/properties/longhand/box.mako.rs | 1 + .../style/properties/longhand/inherited_svg.mako.rs | 2 ++ components/style/properties/longhand/pointing.mako.rs | 3 +++ components/style/properties/longhand/ui.mako.rs | 1 + components/style/properties/longhand/xul.mako.rs | 1 + 9 files changed, 21 insertions(+), 4 deletions(-) diff --git a/components/style/properties/data.py b/components/style/properties/data.py index afddf0f4bb7..cdf4560783b 100644 --- a/components/style/properties/data.py +++ b/components/style/properties/data.py @@ -28,7 +28,9 @@ def to_camel_case(ident): class Keyword(object): def __init__(self, name, values, gecko_constant_prefix=None, gecko_enum_prefix=None, custom_consts=None, - extra_gecko_values=None, extra_servo_values=None): + extra_gecko_values=None, extra_servo_values=None, + gecko_strip_moz_prefix=True, + gecko_inexhaustive=None): self.name = name self.values = values.split() if gecko_constant_prefix and gecko_enum_prefix: @@ -39,6 +41,8 @@ class Keyword(object): self.extra_gecko_values = (extra_gecko_values or "").split() self.extra_servo_values = (extra_servo_values or "").split() self.consts_map = {} if custom_consts is None else custom_consts + self.gecko_strip_moz_prefix = gecko_strip_moz_prefix + self.gecko_inexhaustive = gecko_inexhaustive or (gecko_enum_prefix is None) def gecko_values(self): return self.values + self.extra_gecko_values @@ -55,7 +59,7 @@ class Keyword(object): raise Exception("Bad product: " + product) def gecko_constant(self, value): - moz_stripped = value.replace("-moz-", '') + moz_stripped = value.replace("-moz-", '') if self.gecko_strip_moz_prefix else value parts = moz_stripped.split('-') if self.gecko_enum_prefix: parts = [p.title() for p in parts] diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index a9afd64c5b0..95cd6409c37 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -255,7 +255,9 @@ def set_gecko_property(ffi_name, expr): % for value in keyword.values_for('gecko'): structs::${keyword.gecko_constant(value)} => Keyword::${to_rust_ident(value)}, % endfor + % if keyword.gecko_inexhaustive: x => panic!("Found unexpected value in style struct for ${ident} property: {:?}", x), + % endif } } @@ -1027,7 +1029,8 @@ fn static_assert() { "table-header-group table-footer-group table-row table-column-group " + "table-column table-cell table-caption list-item flex none " + "-moz-box -moz-inline-box", - gecko_enum_prefix="StyleDisplay") %> + gecko_enum_prefix="StyleDisplay", + gecko_inexhaustive=True) %> ${impl_keyword('display', 'mDisplay', display_keyword, True)} // overflow-y is implemented as a newtype of overflow-x, so we need special handling. diff --git a/components/style/properties/helpers.mako.rs b/components/style/properties/helpers.mako.rs index 4fdbeda88c8..5d58fd6db5c 100644 --- a/components/style/properties/helpers.mako.rs +++ b/components/style/properties/helpers.mako.rs @@ -329,7 +329,7 @@ keyword_kwargs = {a: kwargs.pop(a, None) for a in [ 'gecko_constant_prefix', 'gecko_enum_prefix', 'extra_gecko_values', 'extra_servo_values', - 'custom_consts', + 'custom_consts', 'gecko_inexhaustive', ]} %> diff --git a/components/style/properties/longhand/border.mako.rs b/components/style/properties/longhand/border.mako.rs index c4ccfeb032f..0393064d532 100644 --- a/components/style/properties/longhand/border.mako.rs +++ b/components/style/properties/longhand/border.mako.rs @@ -58,11 +58,13 @@ ${helpers.single_keyword("box-decoration-break", "slice clone", gecko_enum_prefix="StyleBoxDecorationBreak", + gecko_inexhaustive=True, products="gecko", animatable=False)} ${helpers.single_keyword("-moz-float-edge", "content-box margin-box", gecko_ffi_name="mFloatEdge", gecko_enum_prefix="StyleFloatEdge", + gecko_inexhaustive=True, products="gecko", animatable=False)} diff --git a/components/style/properties/longhand/box.mako.rs b/components/style/properties/longhand/box.mako.rs index c48d4948376..486105e33dd 100644 --- a/components/style/properties/longhand/box.mako.rs +++ b/components/style/properties/longhand/box.mako.rs @@ -92,6 +92,7 @@ ${helpers.single_keyword("position", "static absolute relative fixed", animatable="False" need_clone="True" gecko_enum_prefix="StyleFloat" + gecko_inexhaustive="True" gecko_ffi_name="mFloat"> use values::NoViewportPercentage; impl NoViewportPercentage for SpecifiedValue {} diff --git a/components/style/properties/longhand/inherited_svg.mako.rs b/components/style/properties/longhand/inherited_svg.mako.rs index 8bff77f9c37..6a0b00eced9 100644 --- a/components/style/properties/longhand/inherited_svg.mako.rs +++ b/components/style/properties/longhand/inherited_svg.mako.rs @@ -35,6 +35,7 @@ ${helpers.predefined_type("fill-opacity", "Opacity", "1.0", ${helpers.single_keyword("fill-rule", "nonzero evenodd", gecko_enum_prefix="StyleFillRule", + gecko_inexhaustive=True, products="gecko", animatable=False)} ${helpers.single_keyword("shape-rendering", @@ -60,4 +61,5 @@ ${helpers.predefined_type("stroke-opacity", "Opacity", "1.0", ${helpers.single_keyword("clip-rule", "nonzero evenodd", products="gecko", gecko_enum_prefix="StyleFillRule", + gecko_inexhaustive=True, animatable=False)} diff --git a/components/style/properties/longhand/pointing.mako.rs b/components/style/properties/longhand/pointing.mako.rs index d5306f376a9..412e2fe080c 100644 --- a/components/style/properties/longhand/pointing.mako.rs +++ b/components/style/properties/longhand/pointing.mako.rs @@ -151,15 +151,18 @@ ${helpers.single_keyword("pointer-events", "auto none", animatable=False)} ${helpers.single_keyword("-moz-user-input", "none enabled disabled", products="gecko", gecko_ffi_name="mUserInput", gecko_enum_prefix="StyleUserInput", + gecko_inexhaustive=True, animatable=False)} ${helpers.single_keyword("-moz-user-modify", "read-only read-write write-only", products="gecko", gecko_ffi_name="mUserModify", gecko_enum_prefix="StyleUserModify", + gecko_inexhaustive=True, animatable=False)} ${helpers.single_keyword("-moz-user-focus", "ignore normal select-after select-before select-menu select-same select-all none", products="gecko", gecko_ffi_name="mUserFocus", gecko_enum_prefix="StyleUserFocus", + gecko_inexhaustive=True, animatable=False)} diff --git a/components/style/properties/longhand/ui.mako.rs b/components/style/properties/longhand/ui.mako.rs index f815c1d8518..cd537677f6f 100644 --- a/components/style/properties/longhand/ui.mako.rs +++ b/components/style/properties/longhand/ui.mako.rs @@ -16,4 +16,5 @@ ${helpers.single_keyword("ime-mode", "normal auto active disabled inactive", ${helpers.single_keyword("-moz-user-select", "auto text none all", products="gecko", gecko_ffi_name="mUserSelect", gecko_enum_prefix="StyleUserSelect", + gecko_inexhaustive=True, animatable=False)} diff --git a/components/style/properties/longhand/xul.mako.rs b/components/style/properties/longhand/xul.mako.rs index 23c1da1246b..bc64308a115 100644 --- a/components/style/properties/longhand/xul.mako.rs +++ b/components/style/properties/longhand/xul.mako.rs @@ -11,6 +11,7 @@ ${helpers.single_keyword("-moz-box-align", "stretch start center baseline end", products="gecko", gecko_ffi_name="mBoxAlign", gecko_enum_prefix="StyleBoxAlign", + gecko_inexhaustive=True, animatable=False)} ${helpers.predefined_type("-moz-box-flex", "Number", "0.0", "parse_non_negative", From b92c451b97e03168f923da9be2d5b5b875e3d071 Mon Sep 17 00:00:00 2001 From: Cameron McCormack Date: Mon, 5 Dec 2016 21:48:53 -1000 Subject: [PATCH 2/3] Regenerate bindings. --- .../style/gecko_bindings/structs_debug.rs | 22 +++++++++---------- .../style/gecko_bindings/structs_release.rs | 22 +++++++++---------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/components/style/gecko_bindings/structs_debug.rs b/components/style/gecko_bindings/structs_debug.rs index 2fa43b82fcc..4cfdc5899ed 100644 --- a/components/style/gecko_bindings/structs_debug.rs +++ b/components/style/gecko_bindings/structs_debug.rs @@ -2596,17 +2596,17 @@ pub enum StyleDisplay { Contents = 24, WebkitBox = 25, WebkitInlineBox = 26, - Box = 27, - InlineBox = 28, - XulGrid = 29, - InlineXulGrid = 30, - XulGridGroup = 31, - XulGridLine = 32, - Stack = 33, - InlineStack = 34, - Deck = 35, - Groupbox = 36, - Popup = 37, + MozBox = 27, + MozInlineBox = 28, + MozGrid = 29, + MozInlineGrid = 30, + MozGridGroup = 31, + MozGridLine = 32, + MozStack = 33, + MozInlineStack = 34, + MozDeck = 35, + MozGroupbox = 36, + MozPopup = 37, } /** * A class for holding strong references to handle-managed objects. diff --git a/components/style/gecko_bindings/structs_release.rs b/components/style/gecko_bindings/structs_release.rs index 3d2bf88dbb7..11b1f6ea393 100644 --- a/components/style/gecko_bindings/structs_release.rs +++ b/components/style/gecko_bindings/structs_release.rs @@ -2570,17 +2570,17 @@ pub enum StyleDisplay { Contents = 24, WebkitBox = 25, WebkitInlineBox = 26, - Box = 27, - InlineBox = 28, - XulGrid = 29, - InlineXulGrid = 30, - XulGridGroup = 31, - XulGridLine = 32, - Stack = 33, - InlineStack = 34, - Deck = 35, - Groupbox = 36, - Popup = 37, + MozBox = 27, + MozInlineBox = 28, + MozGrid = 29, + MozInlineGrid = 30, + MozGridGroup = 31, + MozGridLine = 32, + MozStack = 33, + MozInlineStack = 34, + MozDeck = 35, + MozGroupbox = 36, + MozPopup = 37, } /** * A class for holding strong references to handle-managed objects. From 0bc711b0236576995156cce4d62a28435db52dd1 Mon Sep 17 00:00:00 2001 From: Cameron McCormack Date: Mon, 5 Dec 2016 13:51:34 -1000 Subject: [PATCH 3/3] stylo: Support remaining display property values. MozReview-Commit-ID: HjLu7t2g7gF --- components/style/properties/gecko.mako.rs | 8 ++++++-- components/style/properties/longhand/box.mako.rs | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 95cd6409c37..00be40d30a9 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -1028,9 +1028,13 @@ fn static_assert() { <% display_keyword = Keyword("display", "inline block inline-block table inline-table table-row-group " + "table-header-group table-footer-group table-row table-column-group " + "table-column table-cell table-caption list-item flex none " + - "-moz-box -moz-inline-box", + "inline-flex grid inline-grid ruby ruby-base ruby-base-container " + + "ruby-text ruby-text-container contents -webkit-box -webkit-inline-box " + + "-moz-box -moz-inline-box -moz-grid -moz-inline-grid -moz-grid-group " + + "-moz-grid-line -moz-stack -moz-inline-stack -moz-deck -moz-popup " + + "-moz-groupbox", gecko_enum_prefix="StyleDisplay", - gecko_inexhaustive=True) %> + gecko_strip_moz_prefix=False) %> ${impl_keyword('display', 'mDisplay', display_keyword, True)} // overflow-y is implemented as a newtype of overflow-x, so we need special handling. diff --git a/components/style/properties/longhand/box.mako.rs b/components/style/properties/longhand/box.mako.rs index 486105e33dd..818ed9316e1 100644 --- a/components/style/properties/longhand/box.mako.rs +++ b/components/style/properties/longhand/box.mako.rs @@ -22,7 +22,11 @@ none """.split() if product == "gecko": - values += "-moz-box -moz-inline-box".split() + values += """inline-flex grid inline-grid ruby ruby-base ruby-base-container + ruby-text ruby-text-container contents -webkit-box -webkit-inline-box + -moz-box -moz-inline-box -moz-grid -moz-inline-grid -moz-grid-group + -moz-grid-line -moz-stack -moz-inline-stack -moz-deck -moz-popup + -moz-groupbox""".split() %> pub use self::computed_value::T as SpecifiedValue; use values::computed::ComputedValueAsSpecified;