Bug 1374233 - Part 9: Add NonNegativeLengthOrPercentageOrNumber for stroke-witdh. draft
authorBoris Chiou <boris.chiou@gmail.com>
Fri, 21 Jul 2017 16:59:28 +0800
changeset 615000 aa97c1697ad28ea7be9a9ac28dff40d987355c61
parent 614999 35a82792d901a9acaaf3a8da6287f113435ca071
child 615001 21536b9f0691482825763767254aee527d917ffd
push id70205
push userbmo:boris.chiou@gmail.com
push dateTue, 25 Jul 2017 08:53:17 +0000
bugs1374233
milestone56.0a1
Bug 1374233 - Part 9: Add NonNegativeLengthOrPercentageOrNumber for stroke-witdh. MozReview-Commit-ID: 8gD0fVe2eAe
servo/components/style/properties/gecko.mako.rs
servo/components/style/properties/helpers/animated_properties.mako.rs
servo/components/style/properties/longhand/inherited_svg.mako.rs
servo/components/style/values/computed/mod.rs
servo/components/style/values/specified/mod.rs
--- a/servo/components/style/properties/gecko.mako.rs
+++ b/servo/components/style/properties/gecko.mako.rs
@@ -4566,30 +4566,32 @@ clip-path
             CoordDataValue::Percent(p) => Either::Second(LengthOrPercentage::Percentage(Percentage(p))),
             CoordDataValue::Calc(calc) => Either::Second(LengthOrPercentage::Calc(calc.into())),
             _ => unreachable!(),
         }
     }
 
     pub fn set_stroke_width(&mut self, v: longhands::stroke_width::computed_value::T) {
         match v {
-            Either::First(number) => self.gecko.mStrokeWidth.set_value(CoordDataValue::Factor(number)),
-            Either::Second(lop) => self.gecko.mStrokeWidth.set(lop),
+            Either::First(number) => self.gecko.mStrokeWidth.set_value(CoordDataValue::Factor(number.0)),
+            Either::Second(lop) => self.gecko.mStrokeWidth.set(lop.0),
         }
     }
 
     ${impl_coord_copy('stroke_width', 'mStrokeWidth')}
 
     pub fn clone_stroke_width(&self) -> longhands::stroke_width::computed_value::T {
-        use values::computed::LengthOrPercentage;
+        use values::computed::LengthOrPercentage as LOP;
+        use values::computed::NonNegativeNumber;
+        use values::computed::NonNegativeLengthOrPercentage as NonNegativeLOP;
         match self.gecko.mStrokeWidth.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(NonNegativeNumber(number)),
+            CoordDataValue::Coord(coord) => Either::Second(NonNegativeLOP(LOP::Length(Au(coord)))),
+            CoordDataValue::Percent(p) => Either::Second(NonNegativeLOP(LOP::Percentage(Percentage(p)))),
+            CoordDataValue::Calc(calc) => Either::Second(NonNegativeLOP(LOP::Calc(calc.into()))),
             _ => unreachable!(),
         }
     }
 
     #[allow(non_snake_case)]
     pub fn set__moz_context_properties<I>(&mut self, v: I)
         where I: IntoIterator<Item = longhands::_moz_context_properties::computed_value::single_value::T>,
               I::IntoIter: ExactSizeIterator
--- a/servo/components/style/properties/helpers/animated_properties.mako.rs
+++ b/servo/components/style/properties/helpers/animated_properties.mako.rs
@@ -42,16 +42,17 @@ use values::animated::effects::Filter as
 use values::animated::effects::FilterList as AnimatedFilterList;
 use values::animated::effects::TextShadowList as AnimatedTextShadowList;
 use values::computed::{Angle, LengthOrPercentageOrAuto, LengthOrPercentageOrNone};
 use values::computed::{BorderCornerRadius, ClipRect};
 use values::computed::{CalcLengthOrPercentage, Color, Context, ComputedValueAsSpecified};
 use values::computed::{LengthOrPercentage, MaxLength, MozLength, Percentage, ToComputedValue};
 use values::computed::{GreaterThanOrEqualToOneNumber, NonNegativeAu, NonNegativeNumber};
 use values::computed::{PositiveInteger, PositiveIntegerOrAuto};
+use values::computed::NonNegativeLengthOrPercentageOrNumber;
 use values::computed::length::{NonNegativeLengthOrAuto, NonNegativeLengthOrNormal};
 use values::computed::length::{NonNegativeLengthOrNumber, NonNegativeLengthOrPercentage};
 use values::generics::{SVGPaint, SVGPaintKind};
 use values::generics::border::BorderCornerRadius as GenericBorderCornerRadius;
 use values::generics::effects::Filter;
 use values::generics::position as generic_position;
 
 /// A trait used to implement various procedures used during animation.
--- a/servo/components/style/properties/longhand/inherited_svg.mako.rs
+++ b/servo/components/style/properties/longhand/inherited_svg.mako.rs
@@ -59,21 +59,20 @@
     "stroke", "SVGPaint",
     "Default::default()",
     products="gecko",
     animation_value_type="IntermediateSVGPaint",
     boxed=True,
     spec="https://www.w3.org/TR/SVG2/painting.html#SpecifyingStrokePaint")}
 
 ${helpers.predefined_type(
-    "stroke-width", "LengthOrPercentageOrNumber",
-    "Either::First(1.0)",
-    "parse_non_negative",
+    "stroke-width", "NonNegativeLengthOrPercentageOrNumber",
+    "Either::First(::values::computed::NonNegativeNumber(1.0))",
     products="gecko",
-    animation_value_type="ComputedValue",
+    animation_value_type="NonNegativeLengthOrPercentageOrNumber",
     spec="https://www.w3.org/TR/SVG2/painting.html#StrokeWidth")}
 
 ${helpers.single_keyword("stroke-linecap", "butt round square",
                          products="gecko", animation_value_type="discrete",
                          spec="https://www.w3.org/TR/SVG11/painting.html#StrokeLinecapProperty")}
 
 ${helpers.single_keyword("stroke-linejoin", "miter round bevel",
                          products="gecko", animation_value_type="discrete",
--- a/servo/components/style/values/computed/mod.rs
+++ b/servo/components/style/values/computed/mod.rs
@@ -528,16 +528,19 @@ impl SVGPaint {
             fallback: None,
         }
     }
 }
 
 /// <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)]
 /// A computed cliprect for clip and image-region
 pub struct ClipRect {
     pub top: Option<Au>,
     pub right: Option<Au>,
     pub bottom: Option<Au>,
--- a/servo/components/style/values/specified/mod.rs
+++ b/servo/components/style/values/specified/mod.rs
@@ -807,16 +807,19 @@ impl LengthOrPercentageOrNumber {
         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))]
 /// rect(<top>, <left>, <bottom>, <right>) used by clip and image-region
 pub struct ClipRect {
     /// <top> (<length> | <auto>)
     pub top: Option<Length>,
     /// <right> (<length> | <auto>)
     pub right: Option<Length>,