From c8e05420594a6b02137ca070cee410ceb8bb05a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 23 Mar 2017 10:45:53 +0100 Subject: [PATCH] Bug 1349885: stylo: Simplify computation of float and position. r=heycam,xidorn MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MozReview-Commit-ID: Hh6391DXV5o Signed-off-by: Emilio Cobos Álvarez --- .../style/properties/longhand/box.mako.rs | 73 +++++-------------- .../style/properties/properties.mako.rs | 20 ++++- 2 files changed, 34 insertions(+), 59 deletions(-) diff --git a/components/style/properties/longhand/box.mako.rs b/components/style/properties/longhand/box.mako.rs index 17e95115a5c..f4daad8962e 100644 --- a/components/style/properties/longhand/box.mako.rs +++ b/components/style/properties/longhand/box.mako.rs @@ -103,48 +103,13 @@ ${helpers.single_keyword("-moz-top-layer", "none top", products="gecko", animatable=False, internal=True, spec="Internal (not web-exposed)")} -<%helpers:single_keyword_computed name="position" - values="static absolute relative fixed" - need_clone="True" - extra_gecko_values="sticky" - animatable="False" - creates_stacking_context="True" - abspos_cb="True" - spec="https://drafts.csswg.org/css-position/#position-property"> - impl SpecifiedValue { - pub fn is_absolutely_positioned_style(&self) -> bool { - matches!(*self, SpecifiedValue::absolute | SpecifiedValue::fixed) - } - } - - use values::HasViewportPercentage; - no_viewport_percentage!(SpecifiedValue); - impl ToComputedValue for SpecifiedValue { - type ComputedValue = computed_value::T; - - #[inline] - fn to_computed_value(&self, _context: &Context) -> computed_value::T { - % if product == "gecko": - // https://fullscreen.spec.whatwg.org/#new-stacking-layer - // Any position value other than 'absolute' and 'fixed' are - // computed to 'absolute' if the element is in a top layer. - if !self.is_absolutely_positioned_style() && - matches!(_context.style().get_box().clone__moz_top_layer(), - longhands::_moz_top_layer::SpecifiedValue::top) { - SpecifiedValue::absolute - } else { - *self - } - % else: - *self - % endif - } - #[inline] - fn from_computed_value(computed: &computed_value::T) -> SpecifiedValue { - *computed - } - } - +${helpers.single_keyword("position", "static absolute relative fixed", + need_clone="True", + extra_gecko_values="sticky", + animatable="False", + creates_stacking_context="True", + abspos_cb="True", + spec="https://drafts.csswg.org/css-position/#position-property")} <%helpers:single_keyword_computed name="float" values="none left right" @@ -164,20 +129,16 @@ ${helpers.single_keyword("-moz-top-layer", "none top", #[inline] fn to_computed_value(&self, context: &Context) -> computed_value::T { - if context.style().get_box().clone_position().is_absolutely_positioned_style() { - computed_value::T::none - } else { - let ltr = context.style().writing_mode.is_bidi_ltr(); - // https://drafts.csswg.org/css-logical-props/#float-clear - match *self { - SpecifiedValue::inline_start if ltr => computed_value::T::left, - SpecifiedValue::inline_start => computed_value::T::right, - SpecifiedValue::inline_end if ltr => computed_value::T::right, - SpecifiedValue::inline_end => computed_value::T::left, - % for value in "none left right".split(): - SpecifiedValue::${value} => computed_value::T::${value}, - % endfor - } + let ltr = context.style().writing_mode.is_bidi_ltr(); + // https://drafts.csswg.org/css-logical-props/#float-clear + match *self { + SpecifiedValue::inline_start if ltr => computed_value::T::left, + SpecifiedValue::inline_start => computed_value::T::right, + SpecifiedValue::inline_end if ltr => computed_value::T::right, + SpecifiedValue::inline_end => computed_value::T::left, + % for value in "none left right".split(): + SpecifiedValue::${value} => computed_value::T::${value}, + % endfor } } #[inline] diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index 8fd7dc6d4ee..a0ca7aba54b 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -1950,6 +1950,7 @@ pub fn cascade(device: &Device, /// NOTE: This function expects the declaration with more priority to appear /// first. +#[allow(unused_mut)] // conditionally compiled code for "position" pub fn apply_declarations<'a, F, I>(device: &Device, is_root_element: bool, iter_declarations: F, @@ -2050,8 +2051,6 @@ pub fn apply_declarations<'a, F, I>(device: &Device, LonghandId::FontSize | LonghandId::FontFamily | LonghandId::Color | - LonghandId::Position | - LonghandId::Float | LonghandId::TextDecorationLine | LonghandId::WritingMode | LonghandId::Direction @@ -2094,9 +2093,24 @@ pub fn apply_declarations<'a, F, I>(device: &Device, let mut style = context.style; - let positioned = matches!(style.get_box().clone_position(), + let mut positioned = matches!(style.get_box().clone_position(), longhands::position::SpecifiedValue::absolute | longhands::position::SpecifiedValue::fixed); + + // https://fullscreen.spec.whatwg.org/#new-stacking-layer + // Any position value other than 'absolute' and 'fixed' are + // computed to 'absolute' if the element is in a top layer. + % if product == "gecko": + if !positioned && + matches!(style.get_box().clone__moz_top_layer(), + longhands::_moz_top_layer::SpecifiedValue::top) { + positioned = true; + style.mutate_box().set_position(longhands::position::computed_value::T::absolute); + } + % endif + + let positioned = positioned; // To ensure it's not mutated further. + let floated = style.get_box().clone_float() != longhands::float::computed_value::T::none; let is_item = matches!(context.layout_parent_style.get_box().clone_display(), % if product == "gecko":