Support logical values for float/clear

This commit is contained in:
Manish Goregaokar 2017-01-02 14:55:52 -08:00
parent 0b515c2bc9
commit 6a88723409
3 changed files with 70 additions and 14 deletions

View file

@ -338,7 +338,7 @@
</%call> </%call>
</%def> </%def>
<%def name="single_keyword_computed(name, values, vector=False, **kwargs)"> <%def name="single_keyword_computed(name, values, vector=False, extra_specified=None, **kwargs)">
<% <%
keyword_kwargs = {a: kwargs.pop(a, None) for a in [ keyword_kwargs = {a: kwargs.pop(a, None) for a in [
'gecko_constant_prefix', 'gecko_enum_prefix', 'gecko_constant_prefix', 'gecko_enum_prefix',
@ -348,7 +348,16 @@
%> %>
<%def name="inner_body()"> <%def name="inner_body()">
pub use self::computed_value::T as SpecifiedValue; % if extra_specified:
use style_traits::ToCss;
define_css_keyword_enum! { SpecifiedValue:
% for value in data.longhands_by_name[name].keyword.values_for(product) + extra_specified.split():
"${value}" => ${to_rust_ident(value)},
% endfor
}
% else:
pub use self::computed_value::T as SpecifiedValue;
% endif
pub mod computed_value { pub mod computed_value {
use style_traits::ToCss; use style_traits::ToCss;
define_css_keyword_enum! { T: define_css_keyword_enum! { T:
@ -363,12 +372,12 @@
} }
#[inline] #[inline]
pub fn get_initial_specified_value() -> SpecifiedValue { pub fn get_initial_specified_value() -> SpecifiedValue {
get_initial_value() SpecifiedValue::${to_rust_ident(values.split()[0])}
} }
#[inline] #[inline]
pub fn parse(_context: &ParserContext, input: &mut Parser) pub fn parse(_context: &ParserContext, input: &mut Parser)
-> Result<SpecifiedValue, ()> { -> Result<SpecifiedValue, ()> {
computed_value::T::parse(input) SpecifiedValue::parse(input)
} }
</%def> </%def>
% if vector: % if vector:

View file

@ -98,9 +98,10 @@ ${helpers.single_keyword("position", "static absolute relative fixed",
need_clone=True, extra_gecko_values="sticky", animatable=False, need_clone=True, extra_gecko_values="sticky", animatable=False,
spec="https://drafts.csswg.org/css-position/#position-property")} spec="https://drafts.csswg.org/css-position/#position-property")}
// TODO add support for logical values inline-start and inline-end (https://drafts.csswg.org/css-logical-props/#float-clear)
<%helpers:single_keyword_computed name="float" <%helpers:single_keyword_computed name="float"
values="none left right" values="none left right"
// https://drafts.csswg.org/css-logical-props/#float-clear
extra_specified="inline-start inline-end"
animatable="False" animatable="False"
need_clone="True" need_clone="True"
gecko_enum_prefix="StyleFloat" gecko_enum_prefix="StyleFloat"
@ -118,23 +119,69 @@ ${helpers.single_keyword("position", "static absolute relative fixed",
longhands::position::SpecifiedValue::absolute | longhands::position::SpecifiedValue::absolute |
longhands::position::SpecifiedValue::fixed); longhands::position::SpecifiedValue::fixed);
if positioned { if positioned {
SpecifiedValue::none computed_value::T::none
} else { } else {
*self 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] #[inline]
fn from_computed_value(computed: &computed_value::T) -> SpecifiedValue { fn from_computed_value(computed: &computed_value::T) -> SpecifiedValue {
*computed match *computed {
% for value in "none left right".split():
computed_value::T::${value} => SpecifiedValue::${value},
% endfor
}
} }
} }
</%helpers:single_keyword_computed> </%helpers:single_keyword_computed>
${helpers.single_keyword("clear", "none left right both", <%helpers:single_keyword_computed name="clear"
animatable=False, gecko_ffi_name="mBreakType", values="none left right both"
gecko_enum_prefix="StyleClear", // https://drafts.csswg.org/css-logical-props/#float-clear
spec="https://www.w3.org/TR/CSS2/visuren.html#flow-control")} extra_specified="inline-start inline-end"
animatable="False"
gecko_enum_prefix="StyleClear"
gecko_ffi_name="mBreakType"
spec="https://www.w3.org/TR/CSS2/visuren.html#flow-control">
use values::NoViewportPercentage;
impl NoViewportPercentage for SpecifiedValue {}
impl ToComputedValue for SpecifiedValue {
type ComputedValue = computed_value::T;
#[inline]
fn to_computed_value(&self, context: &Context) -> computed_value::T {
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 both".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 both".split():
computed_value::T::${value} => SpecifiedValue::${value},
% endfor
}
}
}
</%helpers:single_keyword_computed>
<%helpers:longhand name="-servo-display-for-hypothetical-box" <%helpers:longhand name="-servo-display-for-hypothetical-box"
animatable="False" animatable="False"

View file

@ -1891,7 +1891,7 @@ pub fn apply_declarations<'a, F, I>(viewport_size: Size2D<Au>,
let positioned = matches!(style.get_box().clone_position(), let positioned = matches!(style.get_box().clone_position(),
longhands::position::SpecifiedValue::absolute | longhands::position::SpecifiedValue::absolute |
longhands::position::SpecifiedValue::fixed); longhands::position::SpecifiedValue::fixed);
let floated = style.get_box().clone_float() != longhands::float::SpecifiedValue::none; let floated = style.get_box().clone_float() != longhands::float::computed_value::T::none;
// FIXME(heycam): We should look past any display:contents ancestors to // FIXME(heycam): We should look past any display:contents ancestors to
// determine if we are a flex or grid item, but we don't have access to // determine if we are a flex or grid item, but we don't have access to
// grandparent or higher style here. // grandparent or higher style here.