From 6118e4d99351eae5f5f1f9708dd8351ee746cf6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Thu, 14 Feb 2019 19:03:04 +0100 Subject: [PATCH] style: Use Rust types for some misc properties. -moz-tab-size, border-image-outset and border-image-slice. This is not a particularly interesting patch, just removes some code. We can remove way more code when a few related properties are also ported. Differential Revision: https://phabricator.services.mozilla.com/D19825 --- components/style/cbindgen.toml | 9 ++- components/style/properties/gecko.mako.rs | 64 ++----------------- .../style/properties/longhands/border.mako.rs | 7 +- .../longhands/inherited_text.mako.rs | 8 +-- components/style/values/computed/length.rs | 32 +++++----- components/style/values/computed/mod.rs | 7 +- components/style/values/computed/rect.rs | 4 +- components/style/values/computed/text.rs | 4 -- components/style/values/generics/border.rs | 5 +- components/style/values/generics/length.rs | 51 +++++++++++++++ components/style/values/generics/mod.rs | 20 ++++++ components/style/values/generics/text.rs | 22 ------- components/style/values/specified/length.rs | 31 ++------- components/style/values/specified/mod.rs | 29 +++++++-- components/style/values/specified/rect.rs | 18 +----- components/style/values/specified/text.rs | 22 +------ 16 files changed, 149 insertions(+), 184 deletions(-) diff --git a/components/style/cbindgen.toml b/components/style/cbindgen.toml index 17f78d83309..7248ab11c1a 100644 --- a/components/style/cbindgen.toml +++ b/components/style/cbindgen.toml @@ -87,19 +87,22 @@ include = [ "FlexBasis", "Position", "BackgroundSize", + "BorderImageSlice", + "NonNegativeLengthOrNumberRect", ] item_types = ["enums", "structs", "typedefs"] [export.body] +"CSSPixelLength" = """ + inline nscoord ToAppUnits() const; +""" + "LengthPercentage" = """ // Defined in nsStyleCoord.h static constexpr inline StyleLengthPercentage Zero(); static inline StyleLengthPercentage FromAppUnits(nscoord); static inline StyleLengthPercentage FromPercentage(float); inline CSSCoord LengthInCSSPixels() const; - private: - inline nscoord LengthComponent() const; - public: inline float Percentage() const; inline bool HasPercent() const; inline bool ConvertsToLength() const; diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 74bae028761..c3e788c9e10 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -61,7 +61,6 @@ use crate::values::computed::font::FontSize; use crate::values::computed::effects::{BoxShadow, Filter, SimpleShadow}; use crate::values::generics::column::ColumnCount; use crate::values::generics::position::ZIndex; -use crate::values::generics::text::MozTabSize; use crate::values::generics::transform::TransformStyle; use crate::values::generics::url::UrlOrNone; @@ -1371,6 +1370,9 @@ impl Clone for ${style_struct.gecko_struct_name} { "MozScriptMinSize": impl_absolute_length, "MozScriptSizeMultiplier": impl_simple, "NonNegativeLengthPercentage": impl_simple, + "NonNegativeLengthOrNumber": impl_simple, + "NonNegativeLengthOrNumberRect": impl_simple, + "BorderImageSlice": impl_simple, "NonNegativeNumber": impl_simple, "Number": impl_simple, "Opacity": impl_simple, @@ -1476,8 +1478,8 @@ fn static_assert() { for x in CORNERS]) %> <%self:impl_trait style_struct_name="Border" - skip_longhands="${skip_border_longhands} border-image-source border-image-outset - border-image-repeat border-image-width border-image-slice"> + skip_longhands="${skip_border_longhands} border-image-source + border-image-repeat border-image-width"> % for side in SIDES: pub fn set_border_${side.ident}_style(&mut self, v: BorderStyle) { self.gecko.mBorderStyle[${side.index}] = v; @@ -1578,8 +1580,6 @@ fn static_assert() { } } - <% impl_style_sides("border_image_outset") %> - <% border_image_repeat_keywords = ["Stretch", "Repeat", "Round", "Space"] %> @@ -1621,36 +1621,6 @@ fn static_assert() { } <% impl_style_sides("border_image_width") %> - - pub fn set_border_image_slice(&mut self, v: longhands::border_image_slice::computed_value::T) { - use crate::gecko_bindings::structs::{NS_STYLE_BORDER_IMAGE_SLICE_NOFILL, NS_STYLE_BORDER_IMAGE_SLICE_FILL}; - - v.offsets.to_gecko_rect(&mut self.gecko.mBorderImageSlice); - - let fill = if v.fill { - NS_STYLE_BORDER_IMAGE_SLICE_FILL - } else { - NS_STYLE_BORDER_IMAGE_SLICE_NOFILL - }; - self.gecko.mBorderImageFill = fill as u8; - } - - <%self:copy_sides_style_coord ident="border_image_slice"> - self.gecko.mBorderImageFill = other.gecko.mBorderImageFill; - - - pub fn clone_border_image_slice(&self) -> longhands::border_image_slice::computed_value::T { - use crate::gecko_bindings::structs::NS_STYLE_BORDER_IMAGE_SLICE_FILL; - use crate::values::computed::{BorderImageSlice, NonNegativeNumberOrPercentage}; - type NumberOrPercentageRect = crate::values::generics::rect::Rect; - - BorderImageSlice { - offsets: - NumberOrPercentageRect::from_gecko_rect(&self.gecko.mBorderImageSlice) - .expect("mBorderImageSlice[${side}] could not convert to NumberOrPercentageRect"), - fill: self.gecko.mBorderImageFill as u32 == NS_STYLE_BORDER_IMAGE_SLICE_FILL - } - } <% skip_scroll_margin_longhands = " ".join(["scroll-margin-%s" % x.ident for x in SIDES]) %> @@ -4377,7 +4347,7 @@ fn static_assert() { <%self:impl_trait style_struct_name="InheritedText" skip_longhands="text-align text-emphasis-style text-shadow line-height letter-spacing word-spacing - -webkit-text-stroke-width text-emphasis-position -moz-tab-size"> + -webkit-text-stroke-width text-emphasis-position"> <% text_align_keyword = Keyword("text-align", "start end left right center justify -moz-center -moz-left -moz-right char", @@ -4566,28 +4536,6 @@ fn static_assert() { ${impl_non_negative_length('_webkit_text_stroke_width', 'mWebkitTextStrokeWidth')} - #[allow(non_snake_case)] - pub fn set__moz_tab_size(&mut self, v: longhands::_moz_tab_size::computed_value::T) { - match v { - MozTabSize::Number(non_negative_number) => { - self.gecko.mTabSize.set_value(CoordDataValue::Factor(non_negative_number.0)); - } - MozTabSize::Length(non_negative_length) => { - self.gecko.mTabSize.set(non_negative_length); - } - } - } - - #[allow(non_snake_case)] - pub fn clone__moz_tab_size(&self) -> longhands::_moz_tab_size::computed_value::T { - match self.gecko.mTabSize.as_value() { - CoordDataValue::Coord(coord) => MozTabSize::Length(Au(coord).into()), - CoordDataValue::Factor(number) => MozTabSize::Number(From::from(number)), - _ => unreachable!(), - } - } - - <%call expr="impl_coord_copy('_moz_tab_size', 'mTabSize')"> <%self:impl_trait style_struct_name="Text" diff --git a/components/style/properties/longhands/border.mako.rs b/components/style/properties/longhands/border.mako.rs index c9d6b7f5e19..13a7f237350 100644 --- a/components/style/properties/longhands/border.mako.rs +++ b/components/style/properties/longhands/border.mako.rs @@ -119,10 +119,9 @@ ${helpers.predefined_type( ${helpers.predefined_type( "border-image-outset", - "LengthOrNumberRect", - parse_method="parse_non_negative", - initial_value="computed::LengthOrNumberRect::all(computed::LengthOrNumber::zero())", - initial_specified_value="specified::LengthOrNumberRect::all(specified::LengthOrNumber::zero())", + "NonNegativeLengthOrNumberRect", + initial_value="generics::rect::Rect::all(computed::NonNegativeLengthOrNumber::zero())", + initial_specified_value="generics::rect::Rect::all(specified::NonNegativeLengthOrNumber::zero())", spec="https://drafts.csswg.org/css-backgrounds/#border-image-outset", animation_value_type="discrete", flags="APPLIES_TO_FIRST_LETTER", diff --git a/components/style/properties/longhands/inherited_text.mako.rs b/components/style/properties/longhands/inherited_text.mako.rs index b1ed79379ca..97d551120a4 100644 --- a/components/style/properties/longhands/inherited_text.mako.rs +++ b/components/style/properties/longhands/inherited_text.mako.rs @@ -257,10 +257,10 @@ ${helpers.predefined_type( ${helpers.predefined_type( "-moz-tab-size", - "MozTabSize", - "generics::text::MozTabSize::Number(From::from(8.0))", + "NonNegativeLengthOrNumber", + "generics::length::LengthOrNumber::Number(From::from(8.0))", products="gecko", - animation_value_type="AnimatedMozTabSize", + animation_value_type="LengthOrNumber", spec="https://drafts.csswg.org/css-text-3/#tab-size-property", )} @@ -349,8 +349,8 @@ ${helpers.single_keyword( "-moz-control-character-visibility", "hidden visible", gecko_constant_prefix="NS_STYLE_CONTROL_CHARACTER_VISIBILITY", - gecko_ffi_name="mControlCharacterVisibility", animation_value_type="none", + gecko_ffi_name="mControlCharacterVisibility", products="gecko", spec="Nonstandard", )} diff --git a/components/style/values/computed/length.rs b/components/style/values/computed/length.rs index 3b2a4dfd476..45a0d941ff0 100644 --- a/components/style/values/computed/length.rs +++ b/components/style/values/computed/length.rs @@ -6,9 +6,10 @@ use super::{Context, Number, Percentage, ToComputedValue}; use crate::values::animated::ToAnimatedValue; +use crate::values::computed::NonNegativeNumber; use crate::values::distance::{ComputeSquaredDistance, SquaredDistance}; use crate::values::generics::length as generics; -use crate::values::generics::length::{MaxSize as GenericMaxSize, Size as GenericSize}; +use crate::values::generics::length::{MaxSize as GenericMaxSize, Size as GenericSize, GenericLengthOrNumber}; use crate::values::generics::transform::IsZeroLength; use crate::values::generics::NonNegative; use crate::values::specified::length::ViewportPercentageLength; @@ -678,6 +679,15 @@ impl ToCss for CSSPixelLength { } } +impl Add for CSSPixelLength { + type Output = Self; + + #[inline] + fn add(self, other: Self) -> Self { + Self::new(self.px() + other.px()) + } +} + impl Neg for CSSPixelLength { type Output = Self; @@ -708,15 +718,7 @@ pub type Length = CSSPixelLength; pub type LengthOrAuto = Either; /// Either a computed `` or a `` value. -pub type LengthOrNumber = Either; - -impl LengthOrNumber { - /// Returns `0`. - #[inline] - pub fn zero() -> Self { - Either::Second(0.) - } -} +pub type LengthOrNumber = GenericLengthOrNumber; /// Either a computed `` or the `normal` keyword. pub type LengthOrNormal = Either; @@ -776,13 +778,6 @@ impl NonNegativeLength { } } -impl Add for NonNegativeLength { - type Output = Self; - fn add(self, other: Self) -> Self { - NonNegativeLength::new(self.px() + other.px()) - } -} - impl From for NonNegativeLength { #[inline] fn from(len: Length) -> Self { @@ -813,6 +808,9 @@ pub type NonNegativeLengthOrNormal = Either; /// Either a computed NonNegativeLengthPercentage or the `normal` keyword. pub type NonNegativeLengthPercentageOrNormal = Either; +/// Either a non-negative `` or a ``. +pub type NonNegativeLengthOrNumber = GenericLengthOrNumber; + /// A type for possible values for min- and max- flavors of width, height, /// block-size, and inline-size. #[allow(missing_docs)] diff --git a/components/style/values/computed/mod.rs b/components/style/values/computed/mod.rs index ab6425a20e7..bc8dd8ab109 100644 --- a/components/style/values/computed/mod.rs +++ b/components/style/values/computed/mod.rs @@ -61,7 +61,7 @@ pub use self::font::{MozScriptLevel, MozScriptMinSize, MozScriptSizeMultiplier, pub use self::gecko::ScrollSnapPoint; pub use self::image::{Gradient, GradientItem, Image, ImageLayer, LineDirection, MozImageRect}; pub use self::length::{CSSPixelLength, ExtremumLength, NonNegativeLength}; -pub use self::length::{Length, LengthOrNumber, LengthPercentage}; +pub use self::length::{Length, LengthOrNumber, LengthPercentage, NonNegativeLengthOrNumber}; pub use self::length::{LengthPercentageOrAuto, MaxSize, Size}; pub use self::length::{NonNegativeLengthPercentage, NonNegativeLengthPercentageOrAuto}; #[cfg(feature = "gecko")] @@ -71,13 +71,13 @@ pub use self::motion::OffsetPath; pub use self::outline::OutlineStyle; pub use self::percentage::{NonNegativePercentage, Percentage}; pub use self::position::{GridAutoFlow, GridTemplateAreas, Position, ZIndex}; -pub use self::rect::LengthOrNumberRect; +pub use self::rect::NonNegativeLengthOrNumberRect; pub use self::resolution::Resolution; pub use self::svg::MozContextProperties; pub use self::svg::{SVGLength, SVGOpacity, SVGPaint, SVGPaintKind}; pub use self::svg::{SVGPaintOrder, SVGStrokeDashArray, SVGWidth}; pub use self::table::XSpan; -pub use self::text::{InitialLetter, LetterSpacing, LineHeight, MozTabSize}; +pub use self::text::{InitialLetter, LetterSpacing, LineHeight}; pub use self::text::{OverflowWrap, TextOverflow, WordSpacing}; pub use self::text::{TextAlign, TextEmphasisPosition, TextEmphasisStyle}; pub use self::time::Time; @@ -536,6 +536,7 @@ impl From for CSSFloat { #[allow(missing_docs)] #[derive(Clone, ComputeSquaredDistance, Copy, Debug, MallocSizeOf, PartialEq, ToCss)] +#[repr(C, u8)] pub enum NumberOrPercentage { Percentage(Percentage), Number(Number), diff --git a/components/style/values/computed/rect.rs b/components/style/values/computed/rect.rs index 40b722ade21..ec44360fc81 100644 --- a/components/style/values/computed/rect.rs +++ b/components/style/values/computed/rect.rs @@ -4,8 +4,8 @@ //! Computed types for CSS borders. -use crate::values::computed::length::LengthOrNumber; +use crate::values::computed::length::NonNegativeLengthOrNumber; use crate::values::generics::rect::Rect; /// A specified rectangle made of four `` values. -pub type LengthOrNumberRect = Rect; +pub type NonNegativeLengthOrNumberRect = Rect; diff --git a/components/style/values/computed/text.rs b/components/style/values/computed/text.rs index 030a6df6cff..2c9a9593ecc 100644 --- a/components/style/values/computed/text.rs +++ b/components/style/values/computed/text.rs @@ -10,7 +10,6 @@ use crate::values::computed::length::{Length, LengthPercentage}; use crate::values::computed::{NonNegativeLength, NonNegativeNumber}; use crate::values::generics::text::InitialLetter as GenericInitialLetter; use crate::values::generics::text::LineHeight as GenericLineHeight; -use crate::values::generics::text::MozTabSize as GenericMozTabSize; use crate::values::generics::text::Spacing; use crate::values::specified::text::TextOverflowSide; use crate::values::specified::text::{TextEmphasisFillMode, TextEmphasisShapeKeyword}; @@ -124,9 +123,6 @@ impl TextDecorationsInEffect { } } -/// A specified value for the `-moz-tab-size` property. -pub type MozTabSize = GenericMozTabSize; - /// computed value for the text-emphasis-style property #[derive(Clone, Debug, MallocSizeOf, PartialEq, ToCss)] pub enum TextEmphasisStyle { diff --git a/components/style/values/generics/border.rs b/components/style/values/generics/border.rs index 0a1cef3b4bb..ffd30e98678 100644 --- a/components/style/values/generics/border.rs +++ b/components/style/values/generics/border.rs @@ -26,7 +26,8 @@ pub enum BorderImageSideWidth { #[derive( Clone, Copy, Debug, MallocSizeOf, PartialEq, SpecifiedValueInfo, ToComputedValue, ToCss, )] -pub struct BorderImageSlice { +#[repr(C)] +pub struct GenericBorderImageSlice { /// The offsets. #[css(field_bound)] pub offsets: Rect, @@ -35,6 +36,8 @@ pub struct BorderImageSlice { pub fill: bool, } +pub use self::GenericBorderImageSlice as BorderImageSlice; + /// A generic value for the `border-*-radius` longhand properties. #[derive( Animate, diff --git a/components/style/values/generics/length.rs b/components/style/values/generics/length.rs index 64860bd07b2..da7fe431dfe 100644 --- a/components/style/values/generics/length.rs +++ b/components/style/values/generics/length.rs @@ -8,6 +8,7 @@ use crate::parser::{Parse, ParserContext}; #[cfg(feature = "gecko")] use crate::values::computed::ExtremumLength; use cssparser::Parser; +use num_traits::Zero; use style_traits::ParseError; /// A ` | auto` value. @@ -155,3 +156,53 @@ impl MaxSize { MaxSize::None } } + +/// A generic `` | `` value for the `-moz-tab-size` property. +#[derive( + Animate, + Clone, + ComputeSquaredDistance, + Copy, + Debug, + MallocSizeOf, + PartialEq, + SpecifiedValueInfo, + ToAnimatedValue, + ToAnimatedZero, + ToComputedValue, + ToCss, +)] +#[repr(C, u8)] +pub enum GenericLengthOrNumber { + /// A length. + Length(L), + /// A number. + Number(N), +} + +pub use self::GenericLengthOrNumber as LengthOrNumber; + +impl Parse for LengthOrNumber { + fn parse<'i, 't>( + context: &ParserContext, + input: &mut Parser<'i, 't>, + ) -> Result> { + if let Ok(number) = input.try(|i| N::parse(context, i)) { + // Numbers need to be parsed first because `0` must be recognised + // as the number `0` and not the length `0px`. + return Ok(LengthOrNumber::Number(number)); + } + + Ok(LengthOrNumber::Length(L::parse(context, input)?)) + } +} + +impl LengthOrNumber { + /// Returns `0`. + pub fn zero() -> Self + where + N: Zero, + { + LengthOrNumber::Number(num_traits::Zero::zero()) + } +} diff --git a/components/style/values/generics/mod.rs b/components/style/values/generics/mod.rs index a5c8c957073..f23d04c99c2 100644 --- a/components/style/values/generics/mod.rs +++ b/components/style/values/generics/mod.rs @@ -9,6 +9,8 @@ use super::CustomIdent; use crate::counter_style::{parse_counter_style_name, Symbols}; use crate::parser::{Parse, ParserContext}; use cssparser::Parser; +use num_traits::Zero; +use std::ops::Add; use style_traits::{KeywordsCollectFn, ParseError}; use style_traits::{SpecifiedValueInfo, StyleParseErrorKind}; @@ -177,6 +179,24 @@ impl SpecifiedValueInfo for CounterStyleOrNone { #[repr(transparent)] pub struct NonNegative(pub T); +impl > Add> for NonNegative { + type Output = Self; + + fn add(self, other: Self) -> Self { + NonNegative(self.0 + other.0) + } +} + +impl Zero for NonNegative { + fn is_zero(&self) -> bool { + self.0.is_zero() + } + + fn zero() -> Self { + NonNegative(T::zero()) + } +} + /// A wrapper of greater-than-or-equal-to-one values. #[cfg_attr(feature = "servo", derive(Deserialize, Serialize))] #[derive( diff --git a/components/style/values/generics/text.rs b/components/style/values/generics/text.rs index 5a4f9213908..029c5681318 100644 --- a/components/style/values/generics/text.rs +++ b/components/style/values/generics/text.rs @@ -149,25 +149,3 @@ impl LineHeight { LineHeight::Normal } } - -/// A generic value for the `-moz-tab-size` property. -#[derive( - Animate, - Clone, - ComputeSquaredDistance, - Copy, - Debug, - MallocSizeOf, - PartialEq, - SpecifiedValueInfo, - ToAnimatedValue, - ToAnimatedZero, - ToComputedValue, - ToCss, -)] -pub enum MozTabSize { - /// A number. - Number(Number), - /// A length. - Length(Length), -} diff --git a/components/style/values/specified/length.rs b/components/style/values/specified/length.rs index 597aa990f0c..78e699ac042 100644 --- a/components/style/values/specified/length.rs +++ b/components/style/values/specified/length.rs @@ -11,9 +11,10 @@ use crate::font_metrics::FontMetricsQueryResult; use crate::parser::{Parse, ParserContext}; use crate::values::computed::{self, CSSPixelLength, Context}; use crate::values::generics::length as generics; -use crate::values::generics::length::{MaxSize as GenericMaxSize, Size as GenericSize}; +use crate::values::generics::length::{MaxSize as GenericMaxSize, Size as GenericSize, GenericLengthOrNumber}; use crate::values::generics::transform::IsZeroLength; use crate::values::generics::NonNegative; +use crate::values::specified::NonNegativeNumber; use crate::values::specified::calc::CalcNode; use crate::values::{Auto, CSSFloat, Either, Normal}; use app_units::Au; @@ -1023,30 +1024,7 @@ pub type LengthOrNormal = Either; pub type LengthOrAuto = Either; /// Either a `` or a ``. -pub type LengthOrNumber = Either; - -impl LengthOrNumber { - /// Parse a non-negative LengthOrNumber. - pub fn parse_non_negative<'i, 't>( - context: &ParserContext, - input: &mut Parser<'i, 't>, - ) -> Result> { - // We try to parse as a Number first because, for cases like - // LengthOrNumber, we want "0" to be parsed as a plain Number rather - // than a Length (0px); this matches the behaviour of all major browsers - if let Ok(v) = input.try(|i| Number::parse_non_negative(context, i)) { - return Ok(Either::Second(v)); - } - - Length::parse_non_negative(context, input).map(Either::First) - } - - /// Returns `0`. - #[inline] - pub fn zero() -> Self { - Either::Second(Number::new(0.)) - } -} +pub type LengthOrNumber = GenericLengthOrNumber; /// A specified value for `min-width`, `min-height`, `width` or `height` property. pub type Size = GenericSize; @@ -1123,3 +1101,6 @@ impl MaxSize { Ok(GenericMaxSize::LengthPercentage(length)) } } + +/// A specified non-negative `` | ``. +pub type NonNegativeLengthOrNumber = GenericLengthOrNumber; diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index 3af896baeb0..16c9e268330 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -19,8 +19,9 @@ use crate::values::serialize_atom_identifier; use crate::values::specified::calc::CalcNode; use crate::{Atom, Namespace, Prefix}; use cssparser::{Parser, Token}; -use num_traits::One; +use num_traits::{Zero, One}; use std::f32; +use std::ops::Add; use std::fmt::{self, Write}; use style_traits::values::specified::AllowedNumericType; use style_traits::{CssWriter, ParseError, SpecifiedValueInfo, StyleParseErrorKind, ToCss}; @@ -58,7 +59,7 @@ pub use self::gecko::ScrollSnapPoint; pub use self::image::{ColorStop, EndingShape as GradientEndingShape, Gradient}; pub use self::image::{GradientItem, GradientKind, Image, ImageLayer, MozImageRect}; pub use self::length::{AbsoluteLength, CalcLengthPercentage, CharacterWidth}; -pub use self::length::{FontRelativeLength, Length, LengthOrNumber}; +pub use self::length::{FontRelativeLength, Length, LengthOrNumber, NonNegativeLengthOrNumber}; pub use self::length::{LengthPercentage, LengthPercentageOrAuto}; pub use self::length::{MaxSize, Size}; pub use self::length::{NoCalcLength, ViewportPercentageLength}; @@ -71,14 +72,14 @@ pub use self::outline::OutlineStyle; pub use self::percentage::Percentage; pub use self::position::{GridAutoFlow, GridTemplateAreas, Position}; pub use self::position::{PositionComponent, ZIndex}; -pub use self::rect::LengthOrNumberRect; +pub use self::rect::NonNegativeLengthOrNumberRect; pub use self::resolution::Resolution; pub use self::svg::MozContextProperties; pub use self::svg::{SVGLength, SVGOpacity, SVGPaint, SVGPaintKind}; pub use self::svg::{SVGPaintOrder, SVGStrokeDashArray, SVGWidth}; pub use self::svg_path::SVGPathData; pub use self::table::XSpan; -pub use self::text::{InitialLetter, LetterSpacing, LineHeight, MozTabSize, TextAlign}; +pub use self::text::{InitialLetter, LetterSpacing, LineHeight, TextAlign}; pub use self::text::{OverflowWrap, TextEmphasisPosition, TextEmphasisStyle}; pub use self::text::{TextAlignKeyword, TextDecorationLine, TextOverflow, WordSpacing}; pub use self::time::Time; @@ -271,6 +272,26 @@ impl IsParallelTo for (Number, Number, Number) { impl SpecifiedValueInfo for Number {} +impl Add for Number { + type Output = Self; + + fn add(self, other: Self) -> Self { + Self::new(self.get() + other.get()) + } +} + +impl Zero for Number { + #[inline] + fn zero() -> Self { + Self::new(0.) + } + + #[inline] + fn is_zero(&self) -> bool { + self.get() == 0. + } +} + impl From for f32 { #[inline] fn from(n: Number) -> Self { diff --git a/components/style/values/specified/rect.rs b/components/style/values/specified/rect.rs index d86a382c7e9..7955ecaa48d 100644 --- a/components/style/values/specified/rect.rs +++ b/components/style/values/specified/rect.rs @@ -4,22 +4,8 @@ //! Specified types for CSS borders. -use crate::parser::ParserContext; use crate::values::generics::rect::Rect; -use crate::values::specified::length::LengthOrNumber; -use cssparser::Parser; -use style_traits::ParseError; +use crate::values::specified::length::NonNegativeLengthOrNumber; /// A specified rectangle made of four `` values. -pub type LengthOrNumberRect = Rect; - -impl LengthOrNumberRect { - /// Parses a `LengthOrNumberRect`, rejecting negative values. - #[inline] - pub fn parse_non_negative<'i, 't>( - context: &ParserContext, - input: &mut Parser<'i, 't>, - ) -> Result> { - Rect::parse_with(context, input, LengthOrNumber::parse_non_negative) - } -} +pub type NonNegativeLengthOrNumberRect = Rect; diff --git a/components/style/values/specified/text.rs b/components/style/values/specified/text.rs index d395132f5b1..2094630a5a7 100644 --- a/components/style/values/specified/text.rs +++ b/components/style/values/specified/text.rs @@ -13,11 +13,10 @@ use crate::values::computed::text::TextOverflow as ComputedTextOverflow; use crate::values::computed::{Context, ToComputedValue}; use crate::values::generics::text::InitialLetter as GenericInitialLetter; use crate::values::generics::text::LineHeight as GenericLineHeight; -use crate::values::generics::text::MozTabSize as GenericMozTabSize; use crate::values::generics::text::Spacing; use crate::values::specified::length::{FontRelativeLength, Length}; use crate::values::specified::length::{LengthPercentage, NoCalcLength}; -use crate::values::specified::length::{NonNegativeLength, NonNegativeLengthPercentage}; +use crate::values::specified::length::{NonNegativeLengthPercentage}; use crate::values::specified::{AllowQuirks, Integer, NonNegativeNumber, Number}; use cssparser::{Parser, Token}; use selectors::parser::SelectorParseErrorKind; @@ -835,25 +834,6 @@ impl From for u8 { } } -/// A specified value for the `-moz-tab-size` property. -pub type MozTabSize = GenericMozTabSize; - -impl Parse for MozTabSize { - fn parse<'i, 't>( - context: &ParserContext, - input: &mut Parser<'i, 't>, - ) -> Result> { - if let Ok(number) = input.try(|i| NonNegativeNumber::parse(context, i)) { - // Numbers need to be parsed first because `0` must be recognised - // as the number `0` and not the length `0px`. - return Ok(GenericMozTabSize::Number(number)); - } - Ok(GenericMozTabSize::Length(NonNegativeLength::parse( - context, input, - )?)) - } -} - /// Values for the `overflow-wrap` property. #[repr(u8)] #[derive(