aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHiroyuki Ikezoe <hikezoe@mozilla.com>2017-05-20 11:59:17 +0900
committerHiroyuki Ikezoe <hikezoe@mozilla.com>2017-05-21 08:33:12 +0900
commitaba0db09435bc7894703c377376d1d65553f88d3 (patch)
treedff66d9a4c8d4a864848daef31d46fddf636d6df
parent57c27e5d35e12b5d4822bc9f70a8b3da09f19d38 (diff)
downloadservo-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.rs84
-rw-r--r--components/style/properties/longhand/position.mako.rs10
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,