зеркало из https://github.com/mozilla/gecko-dev.git
servo: Merge #16094 - Bug 1349885: stylo: Simplify computation of float and position (from emilio:simplify-float-pos); r=heycam,upsuper
Source-Repo: https://github.com/servo/servo Source-Revision: 9d0b481789167a330b614240e73668d7d33632fe --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : e65c25d1b1c8b5d0ab3219d5800d4f7f781de2c6
This commit is contained in:
Родитель
0baf047002
Коммит
0a629eb24f
|
@ -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_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]
|
||||
|
|
|
@ -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":
|
||||
|
|
Загрузка…
Ссылка в новой задаче