From 291b3ee57325c50077c3a3a5693a92a79a9b8fe3 Mon Sep 17 00:00:00 2001 From: Oriol Brufau Date: Tue, 16 May 2023 07:22:42 +0200 Subject: [PATCH] style: Move extremum lengths to the individual Size / MaxSize types This will prevent growing them when introducing fit-content(). This can _almost_ be derived, if it wasn't because of the quirky stuff. I think the macro is probably good enough for now but let me know if you disagree. Differential Revision: https://phabricator.services.mozilla.com/D106713 --- components/style/values/computed/length.rs | 36 ++--------------- components/style/values/computed/mod.rs | 2 +- components/style/values/generics/length.rs | 21 +++++++--- components/style/values/specified/length.rs | 43 +++++++++++---------- 4 files changed, 44 insertions(+), 58 deletions(-) diff --git a/components/style/values/computed/length.rs b/components/style/values/computed/length.rs index 0908273b88c..bcba3eb9bce 100644 --- a/components/style/values/computed/length.rs +++ b/components/style/values/computed/length.rs @@ -185,7 +185,10 @@ impl Size { GenericSize::Auto => false, GenericSize::LengthPercentage(ref lp) => lp.is_definitely_zero(), #[cfg(feature = "gecko")] - GenericSize::ExtremumLength(..) => false, + GenericSize::MinContent | + GenericSize::MaxContent | + GenericSize::MozFitContent | + GenericSize::MozAvailable => false } } } @@ -495,37 +498,6 @@ pub type NonNegativeLengthPercentageOrNormal = /// 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)] -#[cfg_attr(feature = "servo", derive(Deserialize, Serialize))] -#[derive( - Clone, - Copy, - Debug, - Eq, - FromPrimitive, - MallocSizeOf, - Parse, - PartialEq, - SpecifiedValueInfo, - ToAnimatedValue, - ToAnimatedZero, - ToComputedValue, - ToCss, - ToResolvedValue, - ToShmem, -)] -#[repr(u8)] -pub enum ExtremumLength { - #[parse(aliases = "-moz-max-content")] - MaxContent, - #[parse(aliases = "-moz-min-content")] - MinContent, - MozFitContent, - MozAvailable, -} - /// A computed value for `min-width`, `min-height`, `width` or `height` property. pub type Size = GenericSize; diff --git a/components/style/values/computed/mod.rs b/components/style/values/computed/mod.rs index 9dbbf40b5f4..0c9496c2fad 100644 --- a/components/style/values/computed/mod.rs +++ b/components/style/values/computed/mod.rs @@ -63,7 +63,7 @@ pub use self::font::{FontVariantAlternates, FontWeight}; pub use self::font::{FontVariantEastAsian, FontVariationSettings}; pub use self::font::{MathDepth, MozScriptMinSize, MozScriptSizeMultiplier, XLang, XTextZoom}; pub use self::image::{Gradient, Image, LineDirection, MozImageRect}; -pub use self::length::{CSSPixelLength, ExtremumLength, NonNegativeLength}; +pub use self::length::{CSSPixelLength, NonNegativeLength}; pub use self::length::{Length, LengthOrNumber, LengthPercentage, NonNegativeLengthOrNumber}; pub use self::length::{LengthOrAuto, LengthPercentageOrAuto, MaxSize, Size}; pub use self::length::{NonNegativeLengthPercentage, NonNegativeLengthPercentageOrAuto}; diff --git a/components/style/values/generics/length.rs b/components/style/values/generics/length.rs index d9a074623c3..879f3a0f502 100644 --- a/components/style/values/generics/length.rs +++ b/components/style/values/generics/length.rs @@ -6,7 +6,6 @@ use crate::parser::{Parse, ParserContext}; #[cfg(feature = "gecko")] -use crate::values::computed::ExtremumLength; use crate::Zero; use cssparser::Parser; use style_traits::ParseError; @@ -151,9 +150,14 @@ impl Parse for LengthPercentageOrAuto pub enum GenericSize { LengthPercentage(LengthPercent), Auto, - #[cfg(feature = "gecko")] #[animation(error)] - ExtremumLength(ExtremumLength), + MaxContent, + #[animation(error)] + MinContent, + #[animation(error)] + MozFitContent, + #[animation(error)] + MozAvailable, } pub use self::GenericSize as Size; @@ -194,9 +198,16 @@ impl Size { pub enum GenericMaxSize { LengthPercentage(LengthPercent), None, - #[cfg(feature = "gecko")] #[animation(error)] - ExtremumLength(ExtremumLength), + #[parse(aliases = "-moz-max-content")] + MaxContent, + #[animation(error)] + #[parse(aliases = "-moz-min-content")] + MinContent, + #[animation(error)] + MozFitContent, + #[animation(error)] + MozAvailable, } pub use self::GenericMaxSize as MaxSize; diff --git a/components/style/values/specified/length.rs b/components/style/values/specified/length.rs index cf529408c98..aaad895dbce 100644 --- a/components/style/values/specified/length.rs +++ b/components/style/values/specified/length.rs @@ -1226,6 +1226,27 @@ impl Parse for Size { } } +macro_rules! parse_size_non_length { + ($size:ident, $input:expr, $auto_or_none:expr => $auto_or_none_ident:ident) => {{ + let size = $input.try_parse(|input| { + Ok(try_match_ident_ignore_ascii_case! { input, + #[cfg(feature = "gecko")] + "min-content" | "-moz-min-content" => $size::MinContent, + #[cfg(feature = "gecko")] + "max-content" | "-moz-max-content" => $size::MaxContent, + #[cfg(feature = "gecko")] + "-moz-fit-content" => $size::MozFitContent, + #[cfg(feature = "gecko")] + "-moz-available" => $size::MozAvailable, + $auto_or_none => $size::$auto_or_none_ident, + }) + }); + if size.is_ok() { + return size; + } + }}; +} + impl Size { /// Parses, with quirks. pub fn parse_quirky<'i, 't>( @@ -1233,16 +1254,7 @@ impl Size { input: &mut Parser<'i, 't>, allow_quirks: AllowQuirks, ) -> Result> { - #[cfg(feature = "gecko")] - { - if let Ok(l) = input.try_parse(computed::ExtremumLength::parse) { - return Ok(GenericSize::ExtremumLength(l)); - } - } - - if input.try_parse(|i| i.expect_ident_matching("auto")).is_ok() { - return Ok(GenericSize::Auto); - } + parse_size_non_length!(Size, input, "auto" => Auto); let length = NonNegativeLengthPercentage::parse_quirky(context, input, allow_quirks)?; Ok(GenericSize::LengthPercentage(length)) @@ -1274,16 +1286,7 @@ impl MaxSize { input: &mut Parser<'i, 't>, allow_quirks: AllowQuirks, ) -> Result> { - #[cfg(feature = "gecko")] - { - if let Ok(l) = input.try_parse(computed::ExtremumLength::parse) { - return Ok(GenericMaxSize::ExtremumLength(l)); - } - } - - if input.try_parse(|i| i.expect_ident_matching("none")).is_ok() { - return Ok(GenericMaxSize::None); - } + parse_size_non_length!(MaxSize, input, "none" => None); let length = NonNegativeLengthPercentage::parse_quirky(context, input, allow_quirks)?; Ok(GenericMaxSize::LengthPercentage(length))