diff options
author | Hiroyuki Ikezoe <hikezoe@mozilla.com> | 2017-05-20 11:59:17 +0900 |
---|---|---|
committer | Hiroyuki Ikezoe <hikezoe@mozilla.com> | 2017-05-21 08:33:12 +0900 |
commit | aba0db09435bc7894703c377376d1d65553f88d3 (patch) | |
tree | dff66d9a4c8d4a864848daef31d46fddf636d6df | |
parent | 57c27e5d35e12b5d4822bc9f70a8b3da09f19d38 (diff) | |
download | servo-aba0db09435bc7894703c377376d1d65553f88d3.tar.gz servo-aba0db09435bc7894703c377376d1d65553f88d3.zip |
Factor out implemantations for {min,max} size properties as a macro.
-rw-r--r-- | components/style/properties/helpers.mako.rs | 84 | ||||
-rw-r--r-- | components/style/properties/longhand/position.mako.rs | 10 |
2 files changed, 94 insertions, 0 deletions
diff --git a/components/style/properties/helpers.mako.rs b/components/style/properties/helpers.mako.rs index d57f54c24bc..1de154f9a09 100644 --- a/components/style/properties/helpers.mako.rs +++ b/components/style/properties/helpers.mako.rs @@ -1067,3 +1067,87 @@ } } </%def> + +// Define property that supports prefixed intrinsic size keyword values for gecko. +// E.g. -moz-max-content, -moz-min-content, etc. +<%def name="gecko_size_type(name, length_type, initial_value, logical, **kwargs)"> + <%call expr="longhand(name, + predefined_type=length_type, + logical=logical, + **kwargs)"> + use std::fmt; + use style_traits::ToCss; + % if not logical: + use values::specified::AllowQuirks; + % endif + use values::specified::${length_type}; + + pub mod computed_value { + pub type T = ::values::computed::${length_type}; + } + + #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] + #[cfg_attr(feature = "servo", derive(HeapSizeOf))] + pub struct SpecifiedValue(${length_type}); + + #[inline] + pub fn get_initial_value() -> computed_value::T { + use values::computed::${length_type}; + ${length_type}::${initial_value} + } + fn parse(context: &ParserContext, input: &mut Parser) -> Result<SpecifiedValue, ()> { + % if logical: + let ret = ${length_type}::parse(context, input); + % else: + let ret = ${length_type}::parse_quirky(context, input, AllowQuirks::Yes); + % endif + // Keyword values don't make sense in the block direction; don't parse them + % if "block" in name: + if let Ok(${length_type}::ExtremumLength(..)) = ret { + return Err(()) + } + % endif + ret.map(SpecifiedValue) + } + + impl ToCss for SpecifiedValue { + fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + self.0.to_css(dest) + } + } + + impl ToComputedValue for SpecifiedValue { + type ComputedValue = computed_value::T; + #[inline] + fn to_computed_value(&self, context: &Context) -> computed_value::T { + % if not logical or "block" in name: + use values::computed::${length_type}; + % endif + let computed = self.0.to_computed_value(context); + + // filter out keyword values in the block direction + % if logical: + % if "block" in name: + if let ${length_type}::ExtremumLength(..) = computed { + return get_initial_value() + } + % endif + % else: + if let ${length_type}::ExtremumLength(..) = computed { + <% is_height = "true" if "height" in name else "false" %> + if ${is_height} != context.style().writing_mode.is_vertical() { + return get_initial_value() + } + } + % endif + computed + } + + #[inline] + fn from_computed_value(computed: &computed_value::T) -> Self { + SpecifiedValue(ToComputedValue::from_computed_value(computed)) + } + } + </%call> +</%def> + diff --git a/components/style/properties/longhand/position.mako.rs b/components/style/properties/longhand/position.mako.rs index ab4646d0da4..652c8e31fd2 100644 --- a/components/style/properties/longhand/position.mako.rs +++ b/components/style/properties/longhand/position.mako.rs @@ -252,6 +252,16 @@ ${helpers.predefined_type("flex-basis", } </%helpers:longhand> % endfor + // min-width, min-height, min-block-size, min-inline-size, + // max-width, max-height, max-block-size, max-inline-size + ${helpers.gecko_size_type("min-%s" % size, "MozLength", "auto()", + logical, + spec=spec % size, + animation_value_type="ComputedValue")} + ${helpers.gecko_size_type("max-%s" % size, "MaxLength", "none()", + logical, + spec=spec % size, + animation_value_type="ComputedValue")} % else: // servo versions (no keyword support) ${helpers.predefined_type("min-%s" % size, |