diff options
-rw-r--r-- | components/style/properties/gecko.mako.rs | 21 | ||||
-rw-r--r-- | components/style/properties/helpers/animated_properties.mako.rs | 1 | ||||
-rw-r--r-- | components/style/properties/longhand/inherited_svg.mako.rs | 9 | ||||
-rw-r--r-- | components/style/values/computed/length.rs | 7 | ||||
-rw-r--r-- | components/style/values/computed/mod.rs | 5 | ||||
-rw-r--r-- | components/style/values/computed/svg.rs | 12 | ||||
-rw-r--r-- | components/style/values/generics/svg.rs | 4 | ||||
-rw-r--r-- | components/style/values/specified/mod.rs | 17 | ||||
-rw-r--r-- | components/style/values/specified/svg.rs | 28 |
9 files changed, 61 insertions, 43 deletions
diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 69c6b467301..5443c6c96f4 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -616,7 +616,7 @@ def set_gecko_property(ffi_name, expr): }; match length { Either::First(number) => - self.gecko.${gecko_ffi_name}.set_value(CoordDataValue::Factor(number)), + self.gecko.${gecko_ffi_name}.set_value(CoordDataValue::Factor(From::from(number))), Either::Second(lop) => self.gecko.${gecko_ffi_name}.set(lop), } } @@ -641,10 +641,10 @@ def set_gecko_property(ffi_name, expr): return SVGLength::ContextValue; } let length = match self.gecko.${gecko_ffi_name}.as_value() { - CoordDataValue::Factor(number) => Either::First(number), - CoordDataValue::Coord(coord) => Either::Second(LengthOrPercentage::Length(Au(coord))), - CoordDataValue::Percent(p) => Either::Second(LengthOrPercentage::Percentage(Percentage(p))), - CoordDataValue::Calc(calc) => Either::Second(LengthOrPercentage::Calc(calc.into())), + CoordDataValue::Factor(number) => Either::First(From::from(number)), + CoordDataValue::Coord(coord) => Either::Second(From::from(LengthOrPercentage::Length(Au(coord)))), + CoordDataValue::Percent(p) => Either::Second(From::from(LengthOrPercentage::Percentage(Percentage(p)))), + CoordDataValue::Calc(calc) => Either::Second(From::from(LengthOrPercentage::Calc(calc.into()))), _ => unreachable!("Unexpected coordinate {:?} in ${ident}", self.gecko.${gecko_ffi_name}.as_value()), }; @@ -1111,6 +1111,7 @@ impl Clone for ${style_struct.gecko_struct_name} { "SVGLength": impl_svg_length, "SVGOpacity": impl_svg_opacity, "SVGPaint": impl_svg_paint, + "SVGWidth": impl_svg_length, "UrlOrNone": impl_css_url, } @@ -5152,7 +5153,7 @@ clip-path } for (mut gecko, servo) in self.gecko.mStrokeDasharray.iter_mut().zip(v) { match servo { - Either::First(number) => gecko.set_value(CoordDataValue::Factor(number)), + Either::First(number) => gecko.set_value(CoordDataValue::Factor(number.into())), Either::Second(lop) => gecko.set(lop), } } @@ -5192,13 +5193,13 @@ clip-path let mut vec = vec![]; for gecko in self.gecko.mStrokeDasharray.iter() { match gecko.as_value() { - CoordDataValue::Factor(number) => vec.push(Either::First(number)), + CoordDataValue::Factor(number) => vec.push(Either::First(number.into())), CoordDataValue::Coord(coord) => - vec.push(Either::Second(LengthOrPercentage::Length(Au(coord)))), + vec.push(Either::Second(LengthOrPercentage::Length(Au(coord)).into())), CoordDataValue::Percent(p) => - vec.push(Either::Second(LengthOrPercentage::Percentage(Percentage(p)))), + vec.push(Either::Second(LengthOrPercentage::Percentage(Percentage(p)).into())), CoordDataValue::Calc(calc) => - vec.push(Either::Second(LengthOrPercentage::Calc(calc.into()))), + vec.push(Either::Second(LengthOrPercentage::Calc(calc.into()).into())), _ => unreachable!(), } } diff --git a/components/style/properties/helpers/animated_properties.mako.rs b/components/style/properties/helpers/animated_properties.mako.rs index 972fab39ac6..38906e1e458 100644 --- a/components/style/properties/helpers/animated_properties.mako.rs +++ b/components/style/properties/helpers/animated_properties.mako.rs @@ -782,6 +782,7 @@ impl ToAnimatedZero for AnimationValue { impl RepeatableListAnimatable for LengthOrPercentage {} impl RepeatableListAnimatable for Either<f32, LengthOrPercentage> {} +impl RepeatableListAnimatable for Either<NonNegativeNumber, NonNegativeLengthOrPercentage> {} macro_rules! repeated_vec_impl { ($($ty:ty),*) => { diff --git a/components/style/properties/longhand/inherited_svg.mako.rs b/components/style/properties/longhand/inherited_svg.mako.rs index 9828ca030dd..533c2f62e68 100644 --- a/components/style/properties/longhand/inherited_svg.mako.rs +++ b/components/style/properties/longhand/inherited_svg.mako.rs @@ -64,12 +64,11 @@ ${helpers.predefined_type( spec="https://www.w3.org/TR/SVG2/painting.html#SpecifyingStrokePaint")} ${helpers.predefined_type( - "stroke-width", "SVGLength", - "Au::from_px(1).into()", - "parse_non_negative", + "stroke-width", "SVGWidth", + "::values::computed::NonNegativeAu::from_px(1).into()", products="gecko", boxed="True", - animation_value_type="ComputedValue", + animation_value_type="::values::computed::SVGWidth", spec="https://www.w3.org/TR/SVG2/painting.html#StrokeWidth")} ${helpers.single_keyword("stroke-linecap", "butt round square", @@ -95,7 +94,7 @@ ${helpers.predefined_type( "SVGStrokeDashArray", "Default::default()", products="gecko", - animation_value_type="ComputedValue", + animation_value_type="::values::computed::SVGStrokeDashArray", spec="https://www.w3.org/TR/SVG2/painting.html#StrokeDashing", )} diff --git a/components/style/values/computed/length.rs b/components/style/values/computed/length.rs index 4ebd9dc3ea7..12dee4ddf1d 100644 --- a/components/style/values/computed/length.rs +++ b/components/style/values/computed/length.rs @@ -569,6 +569,13 @@ impl ToComputedValue for specified::LengthOrPercentageOrNone { /// A wrapper of LengthOrPercentage, whose value must be >= 0. pub type NonNegativeLengthOrPercentage = NonNegative<LengthOrPercentage>; +impl From<NonNegativeAu> for NonNegativeLengthOrPercentage { + #[inline] + fn from(length: NonNegativeAu) -> Self { + LengthOrPercentage::Length(length.0).into() + } +} + impl From<LengthOrPercentage> for NonNegativeLengthOrPercentage { #[inline] fn from(lop: LengthOrPercentage) -> Self { diff --git a/components/style/values/computed/mod.rs b/components/style/values/computed/mod.rs index 53fa20dbf8f..8cbcbca7eea 100644 --- a/components/style/values/computed/mod.rs +++ b/components/style/values/computed/mod.rs @@ -46,7 +46,7 @@ pub use self::length::{CalcLengthOrPercentage, Length, LengthOrNone, LengthOrNum pub use self::length::{LengthOrPercentageOrAuto, LengthOrPercentageOrNone, MaxLength, MozLength, Percentage}; pub use self::length::NonNegativeLengthOrPercentage; pub use self::position::Position; -pub use self::svg::{SVGLength, SVGOpacity, SVGPaint, SVGPaintKind, SVGStrokeDashArray}; +pub use self::svg::{SVGLength, SVGOpacity, SVGPaint, SVGPaintKind, SVGStrokeDashArray, SVGWidth}; pub use self::text::{InitialLetter, LetterSpacing, LineHeight, WordSpacing}; pub use self::transform::{TimingFunction, TransformOrigin}; @@ -528,6 +528,9 @@ pub type PositiveIntegerOrAuto = Either<PositiveInteger, Auto>; /// <length> | <percentage> | <number> pub type LengthOrPercentageOrNumber = Either<Number, LengthOrPercentage>; +/// NonNegativeLengthOrPercentage | NonNegativeNumber +pub type NonNegativeLengthOrPercentageOrNumber = Either<NonNegativeNumber, NonNegativeLengthOrPercentage>; + #[derive(Clone, PartialEq, Eq, Copy, Debug)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[allow(missing_docs)] diff --git a/components/style/values/computed/svg.rs b/components/style/values/computed/svg.rs index 9edc7a36220..43613baa8c4 100644 --- a/components/style/values/computed/svg.rs +++ b/components/style/values/computed/svg.rs @@ -7,6 +7,7 @@ use app_units::Au; use values::{Either, RGBA}; use values::computed::{LengthOrPercentageOrNumber, Opacity}; +use values::computed::{NonNegativeAu, NonNegativeLengthOrPercentageOrNumber}; use values::generics::svg as generic; /// Computed SVG Paint value @@ -43,8 +44,17 @@ impl From<Au> for SVGLength { } } +/// An non-negative wrapper of SVGLength. +pub type SVGWidth = generic::SVGLength<NonNegativeLengthOrPercentageOrNumber>; + +impl From<NonNegativeAu> for SVGWidth { + fn from(length: NonNegativeAu) -> Self { + generic::SVGLength::Length(Either::Second(length.into())) + } +} + /// [ <length> | <percentage> | <number> ]# | context-value -pub type SVGStrokeDashArray = generic::SVGStrokeDashArray<LengthOrPercentageOrNumber>; +pub type SVGStrokeDashArray = generic::SVGStrokeDashArray<NonNegativeLengthOrPercentageOrNumber>; impl Default for SVGStrokeDashArray { fn default() -> Self { diff --git a/components/style/values/generics/svg.rs b/components/style/values/generics/svg.rs index 0970cd9b4fd..557a63fd24c 100644 --- a/components/style/values/generics/svg.rs +++ b/components/style/values/generics/svg.rs @@ -98,7 +98,7 @@ impl<ColorType: Parse> Parse for SVGPaint<ColorType> { /// An SVG length value supports `context-value` in addition to length. #[cfg_attr(feature = "servo", derive(HeapSizeOf))] -#[derive(Clone, Copy, Debug, PartialEq, HasViewportPercentage, ToComputedValue, ToCss)] +#[derive(Clone, Copy, Debug, PartialEq, HasViewportPercentage, ToAnimatedValue, ToComputedValue, ToCss)] pub enum SVGLength<LengthType> { /// `<length> | <percentage> | <number>` Length(LengthType), @@ -108,7 +108,7 @@ pub enum SVGLength<LengthType> { /// Generic value for stroke-dasharray. #[cfg_attr(feature = "servo", derive(HeapSizeOf))] -#[derive(Clone, Debug, PartialEq, HasViewportPercentage, ToComputedValue)] +#[derive(Clone, Debug, PartialEq, HasViewportPercentage, ToAnimatedValue, ToComputedValue)] pub enum SVGStrokeDashArray<LengthType> { /// `[ <length> | <percentage> | <number> ]#` Values(Vec<LengthType>), diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index bebe9750259..ccbfdd0cfb0 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -45,7 +45,7 @@ pub use self::length::{NoCalcLength, Percentage, ViewportPercentageLength}; pub use self::length::NonNegativeLengthOrPercentage; pub use self::rect::LengthOrNumberRect; pub use self::position::{Position, PositionComponent}; -pub use self::svg::{SVGLength, SVGOpacity, SVGPaint, SVGPaintKind, SVGStrokeDashArray}; +pub use self::svg::{SVGLength, SVGOpacity, SVGPaint, SVGPaintKind, SVGStrokeDashArray, SVGWidth}; pub use self::text::{InitialLetter, LetterSpacing, LineHeight, WordSpacing}; pub use self::transform::{TimingFunction, TransformOrigin}; pub use super::generics::grid::GridLine; @@ -750,19 +750,8 @@ pub type GridTemplateComponent = GenericGridTemplateComponent<LengthOrPercentage /// <length> | <percentage> | <number> pub type LengthOrPercentageOrNumber = Either<Number, LengthOrPercentage>; -impl LengthOrPercentageOrNumber { - /// parse a <length-percentage> | <number> enforcing that the contents aren't negative - pub fn parse_non_negative<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>) - -> Result<Self, ParseError<'i>> { - // NB: Parse numbers before Lengths so we are consistent about how to - // recognize and serialize "0". - if let Ok(num) = input.try(|i| Number::parse_non_negative(context, i)) { - return Ok(Either::First(num)) - } - - LengthOrPercentage::parse_non_negative(context, input).map(Either::Second) - } -} +/// NonNegativeLengthOrPercentage | NonNegativeNumber +pub type NonNegativeLengthOrPercentageOrNumber = Either<NonNegativeNumber, NonNegativeLengthOrPercentage>; #[derive(Clone, Debug, HasViewportPercentage, PartialEq)] #[cfg_attr(feature = "servo", derive(HeapSizeOf))] diff --git a/components/style/values/specified/svg.rs b/components/style/values/specified/svg.rs index a89ba3ad15e..8ee5736bbd7 100644 --- a/components/style/values/specified/svg.rs +++ b/components/style/values/specified/svg.rs @@ -8,7 +8,7 @@ use cssparser::Parser; use parser::{Parse, ParserContext}; use style_traits::{CommaWithSpace, ParseError, Separator, StyleParseError}; use values::generics::svg as generic; -use values::specified::{LengthOrPercentageOrNumber, Opacity}; +use values::specified::{LengthOrPercentageOrNumber, NonNegativeLengthOrPercentageOrNumber, Opacity}; use values::specified::color::RGBAColor; /// Specified SVG Paint value @@ -54,30 +54,38 @@ impl Parse for SVGLength { } } -impl SVGLength { - /// parse a non-negative SVG length - pub fn parse_non_negative<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>) - -> Result<Self, ParseError<'i>> { - input.try(|i| LengthOrPercentageOrNumber::parse_non_negative(context, i)) +impl From<LengthOrPercentageOrNumber> for SVGLength { + fn from(length: LengthOrPercentageOrNumber) -> Self { + generic::SVGLength::Length(length) + } +} + +/// A non-negative version of SVGLength. +pub type SVGWidth = generic::SVGLength<NonNegativeLengthOrPercentageOrNumber>; + +impl Parse for SVGWidth { + fn parse<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>) + -> Result<Self, ParseError<'i>> { + input.try(|i| NonNegativeLengthOrPercentageOrNumber::parse(context, i)) .map(Into::into) .or_else(|_| parse_context_value(input, generic::SVGLength::ContextValue)) } } -impl From<LengthOrPercentageOrNumber> for SVGLength { - fn from(length: LengthOrPercentageOrNumber) -> Self { +impl From<NonNegativeLengthOrPercentageOrNumber> for SVGWidth { + fn from(length: NonNegativeLengthOrPercentageOrNumber) -> Self { generic::SVGLength::Length(length) } } /// [ <length> | <percentage> | <number> ]# | context-value -pub type SVGStrokeDashArray = generic::SVGStrokeDashArray<LengthOrPercentageOrNumber>; +pub type SVGStrokeDashArray = generic::SVGStrokeDashArray<NonNegativeLengthOrPercentageOrNumber>; impl Parse for SVGStrokeDashArray { fn parse<'i, 't>(context: &ParserContext, input: &mut Parser<'i, 't>) -> Result<Self, ParseError<'i>> { if let Ok(values) = input.try(|i| CommaWithSpace::parse(i, |i| { - LengthOrPercentageOrNumber::parse_non_negative(context, i) + NonNegativeLengthOrPercentageOrNumber::parse(context, i) })) { Ok(generic::SVGStrokeDashArray::Values(values)) } else if let Ok(_) = input.try(|i| i.expect_ident_matching("none")) { |