Bug 1349885: stylo: Simplify computation of float and position. r?heycam
MozReview-Commit-ID: Hh6391DXV5o
--- a/servo/components/style/properties/longhand/box.mako.rs
+++ b/servo/components/style/properties/longhand/box.mako.rs
@@ -98,58 +98,23 @@
</%helpers:longhand>
${helpers.single_keyword("-moz-top-layer", "none top",
gecko_constant_prefix="NS_STYLE_TOP_LAYER",
gecko_ffi_name="mTopLayer", need_clone=True,
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_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"
// https://drafts.csswg.org/css-logical-props/#float-clear
extra_specified="inline-start inline-end"
needs_conversion="True"
animatable="False"
need_clone="True"
@@ -159,30 +124,26 @@
spec="https://drafts.csswg.org/css-box/#propdef-float">
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 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]
fn from_computed_value(computed: &computed_value::T) -> SpecifiedValue {
match *computed {
% for value in "none left right".split():
computed_value::T::${value} => SpecifiedValue::${value},
% endfor
--- a/servo/components/style/properties/properties.mako.rs
+++ b/servo/components/style/properties/properties.mako.rs
@@ -2045,18 +2045,16 @@ pub fn apply_declarations<'a, F, I>(devi
// "early" properties then "other".
//
// Unfortunately, it’s not easy to check that this
// classification is correct.
let is_early_property = matches!(longhand_id,
LonghandId::FontSize |
LonghandId::FontFamily |
LonghandId::Color |
- LonghandId::Position |
- LonghandId::Float |
LonghandId::TextDecorationLine |
LonghandId::WritingMode |
LonghandId::Direction
% if product == 'gecko':
| LonghandId::TextOrientation
| LonghandId::AnimationName
| LonghandId::TransitionProperty
% endif
@@ -2089,19 +2087,34 @@ pub fn apply_declarations<'a, F, I>(devi
% if category_to_cascade_now == "early":
let writing_mode = get_writing_mode(context.style.get_inheritedbox());
context.style.writing_mode = writing_mode;
% endif
% endfor
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":
computed_values::display::T::grid |
computed_values::display::T::inline_grid |
% endif
computed_values::display::T::flex |
computed_values::display::T::inline_flex);