diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 6941dbbb152..ff3529bb53b 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -2885,11 +2885,12 @@ fn static_assert() { pub fn clone_letter_spacing(&self) -> longhands::letter_spacing::computed_value::T { use properties::longhands::letter_spacing::computed_value::T; - match self.gecko.mLetterSpacing.as_value() { - CoordDataValue::Normal => T(None), - CoordDataValue::Coord(coord) => T(Some(Au(coord))), - _ => unreachable!("Unexpected computed value for letter-spacing"), - } + debug_assert!( + matches!(self.gecko.mLetterSpacing.as_value(), + CoordDataValue::Normal | + CoordDataValue::Coord(_)), + "Unexpected computed value for letter-spacing"); + T(Au::from_gecko_style_coord(&self.gecko.mLetterSpacing)) } <%call expr="impl_coord_copy('letter_spacing', 'mLetterSpacing')"> @@ -2902,6 +2903,19 @@ fn static_assert() { } } + pub fn clone_word_spacing(&self) -> longhands::word_spacing::computed_value::T { + use properties::longhands::word_spacing::computed_value::T; + use values::computed::LengthOrPercentage; + debug_assert!( + matches!(self.gecko.mWordSpacing.as_value(), + CoordDataValue::Normal | + CoordDataValue::Coord(_) | + CoordDataValue::Percent(_) | + CoordDataValue::Calc(_)), + "Unexpected computed value for word-spacing"); + T(LengthOrPercentage::from_gecko_style_coord(&self.gecko.mWordSpacing)) + } + <%call expr="impl_coord_copy('word_spacing', 'mWordSpacing')"> fn clear_text_emphasis_style_if_string(&mut self) { diff --git a/components/style/properties/helpers.mako.rs b/components/style/properties/helpers.mako.rs index 39b41ab9a4d..35911564ca7 100644 --- a/components/style/properties/helpers.mako.rs +++ b/components/style/properties/helpers.mako.rs @@ -736,3 +736,26 @@ %> +/// Macro for defining Interpolate trait for tuple struct which has Option, +/// e.g. struct T(pub Option). +<%def name="impl_interpolate_for_option_tuple(value_for_none)"> + impl Interpolate for T { + #[inline] + fn interpolate(&self, other: &Self, progress: f64) -> Result { + match (self, other) { + (&T(Some(ref this)), &T(Some(ref other))) => { + Ok(T(this.interpolate(other, progress).ok())) + }, + (&T(Some(ref this)), &T(None)) => { + Ok(T(this.interpolate(&${value_for_none}, progress).ok())) + }, + (&T(None), &T(Some(ref other))) => { + Ok(T(${value_for_none}.interpolate(other, progress).ok())) + }, + (&T(None), &T(None)) => { + Ok(T(None)) + }, + } + } + } + diff --git a/components/style/properties/longhand/inherited_text.mako.rs b/components/style/properties/longhand/inherited_text.mako.rs index d1557ff70e8..07054fbbd56 100644 --- a/components/style/properties/longhand/inherited_text.mako.rs +++ b/components/style/properties/longhand/inherited_text.mako.rs @@ -445,26 +445,7 @@ ${helpers.single_keyword("text-align-last", #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct T(pub Option); - impl Interpolate for T { - #[inline] - fn interpolate(&self, other: &Self, progress: f64) -> Result { - match (self, other) { - (&T(Some(ref this)), &T(Some(ref other))) => { - Ok(T(this.interpolate(other, progress).ok())) - }, - (&T(Some(ref this)), &T(None)) => { - Ok(T(this.interpolate(&Au(0), progress).ok())) - }, - (&T(None), &T(Some(ref other))) => { - Ok(T(Au(0).interpolate(other, progress).ok())) - }, - (&T(None), &T(None)) => { - Ok(T(None)) - }, - } - } - } - + ${helpers.impl_interpolate_for_option_tuple('Au(0)')} } impl ToCss for computed_value::T { @@ -510,7 +491,7 @@ ${helpers.single_keyword("text-align-last", } -<%helpers:longhand name="word-spacing" animation_type="none" +<%helpers:longhand name="word-spacing" animation_type="normal" spec="https://drafts.csswg.org/css-text/#propdef-word-spacing"> use std::fmt; use style_traits::ToCss; @@ -542,10 +523,13 @@ ${helpers.single_keyword("text-align-last", } pub mod computed_value { + use properties::animated_properties::Interpolate; use values::computed::LengthOrPercentage; #[derive(Debug, Clone, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] pub struct T(pub Option); + + ${helpers.impl_interpolate_for_option_tuple('LengthOrPercentage::zero()')} } impl ToCss for computed_value::T {