From 50b517d0dbc81946fcedeaee6967687f27b3a458 Mon Sep 17 00:00:00 2001 From: chansuke Date: Mon, 13 Nov 2017 19:46:09 +0900 Subject: [PATCH] style: Move border-image-repeat outside of mako. --- components/layout/display_list/builder.rs | 1 + components/style/properties/gecko.mako.rs | 4 +- .../style/properties/longhand/border.mako.rs | 63 +++---------------- components/style/values/computed/border.rs | 46 +++++++++++++- components/style/values/computed/mod.rs | 2 +- components/style/values/specified/border.rs | 36 +++++++++++ components/style/values/specified/mod.rs | 2 +- 7 files changed, 95 insertions(+), 59 deletions(-) diff --git a/components/layout/display_list/builder.rs b/components/layout/display_list/builder.rs index bb60018b389b..ecd867f69d9c 100644 --- a/components/layout/display_list/builder.rs +++ b/components/layout/display_list/builder.rs @@ -69,6 +69,7 @@ use style::values::computed::effects::SimpleShadow; use style::values::computed::pointing::Cursor; use style::values::generics::background::BackgroundSize; use style::values::generics::image::{GradientKind, Image, PaintWorklet}; +use style::values::specified::border::RepeatKeyword; use style_traits::CSSPixel; use style_traits::ToCss; use style_traits::cursor::CursorKind; diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 2e4cf3db43bd..6e24b082d475 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -1713,7 +1713,7 @@ fn static_assert() { %> pub fn set_border_image_repeat(&mut self, v: longhands::border_image_repeat::computed_value::T) { - use properties::longhands::border_image_repeat::computed_value::RepeatKeyword; + use values::specified::border::RepeatKeyword; use gecko_bindings::structs::StyleBorderImageRepeat; % for i, side in enumerate(["H", "V"]): @@ -1735,7 +1735,7 @@ fn static_assert() { } pub fn clone_border_image_repeat(&self) -> longhands::border_image_repeat::computed_value::T { - use properties::longhands::border_image_repeat::computed_value::RepeatKeyword; + use values::specified::border::RepeatKeyword; use gecko_bindings::structs::StyleBorderImageRepeat; % for side in ["H", "V"]: diff --git a/components/style/properties/longhand/border.mako.rs b/components/style/properties/longhand/border.mako.rs index a98c83c6697f..469c57832052 100644 --- a/components/style/properties/longhand/border.mako.rs +++ b/components/style/properties/longhand/border.mako.rs @@ -101,60 +101,15 @@ ${helpers.predefined_type("border-image-outset", "LengthOrNumberRect", flags="APPLIES_TO_FIRST_LETTER", boxed=True)} -<%helpers:longhand name="border-image-repeat" animation_value_type="discrete" - flags="APPLIES_TO_FIRST_LETTER" - spec="https://drafts.csswg.org/css-backgrounds/#border-image-repeat"> - pub mod computed_value { - pub use super::RepeatKeyword; - - #[derive(Clone, Debug, MallocSizeOf, PartialEq, ToCss)] - pub struct T(pub RepeatKeyword, pub RepeatKeyword); - } - - #[derive(Clone, Debug, MallocSizeOf, PartialEq, ToCss)] - pub struct SpecifiedValue(pub RepeatKeyword, - pub Option); - - #[cfg_attr(feature = "servo", derive(Deserialize, Serialize))] - #[derive(Clone, Copy, Debug, Eq, MallocSizeOf, Parse, PartialEq, ToCss)] - pub enum RepeatKeyword { - Stretch, - Repeat, - Round, - Space, - } - - #[inline] - pub fn get_initial_value() -> computed_value::T { - computed_value::T(RepeatKeyword::Stretch, RepeatKeyword::Stretch) - } - - #[inline] - pub fn get_initial_specified_value() -> SpecifiedValue { - SpecifiedValue(RepeatKeyword::Stretch, None) - } - - impl ToComputedValue for SpecifiedValue { - type ComputedValue = computed_value::T; - - #[inline] - fn to_computed_value(&self, _context: &Context) -> computed_value::T { - computed_value::T(self.0, self.1.unwrap_or(self.0)) - } - #[inline] - fn from_computed_value(computed: &computed_value::T) -> Self { - SpecifiedValue(computed.0, Some(computed.1)) - } - } - - pub fn parse<'i, 't>(_context: &ParserContext, input: &mut Parser<'i, 't>) - -> Result> { - let first = RepeatKeyword::parse(input)?; - let second = input.try(RepeatKeyword::parse).ok(); - - Ok(SpecifiedValue(first, second)) - } - +${helpers.predefined_type( + "border-image-repeat", + "BorderImageRepeat", + "computed::BorderImageRepeat::stretch()", + initial_specified_value="specified::BorderImageRepeat::stretch()", + animation_value_type="discrete", + spec="https://drafts.csswg.org/css-backgrounds/#the-border-image-repeat", + flags="APPLIES_TO_FIRST_LETTER", +)} ${helpers.predefined_type("border-image-width", "BorderImageWidth", initial_value="computed::BorderImageWidth::all(computed::BorderImageSideWidth::one())", diff --git a/components/style/values/computed/border.rs b/components/style/values/computed/border.rs index d8f24a2266b1..c430d02dd94d 100644 --- a/components/style/values/computed/border.rs +++ b/components/style/values/computed/border.rs @@ -5,8 +5,10 @@ //! Computed types for CSS values related to borders. use app_units::Au; +use std::fmt::{self, Write}; +use style_traits::{ToCss, CssWriter}; use values::animated::ToAnimatedZero; -use values::computed::{Number, NumberOrPercentage}; +use values::computed::{Context, Number, NumberOrPercentage, ToComputedValue}; use values::computed::length::{LengthOrPercentage, NonNegativeLength}; use values::generics::border::BorderCornerRadius as GenericBorderCornerRadius; use values::generics::border::BorderImageSideWidth as GenericBorderImageSideWidth; @@ -15,6 +17,7 @@ use values::generics::border::BorderRadius as GenericBorderRadius; use values::generics::border::BorderSpacing as GenericBorderSpacing; use values::generics::rect::Rect; use values::generics::size::Size; +use values::specified::border::{BorderImageRepeat as SpecifiedBorderImageRepeat, RepeatKeyword}; /// A computed value for the `border-image-width` property. pub type BorderImageWidth = Rect; @@ -81,3 +84,44 @@ impl ToAnimatedZero for BorderCornerRadius { Err(()) } } + +/// The computed value of the `border-image-repeat` property: +/// +/// https://drafts.csswg.org/css-backgrounds/#the-border-image-repeat +#[derive(Clone, Debug, MallocSizeOf, PartialEq)] +pub struct BorderImageRepeat(pub RepeatKeyword, pub RepeatKeyword); + +impl BorderImageRepeat { + /// Returns the `stretch` value. + pub fn stretch() -> Self { + BorderImageRepeat(RepeatKeyword::Stretch, RepeatKeyword::Stretch) + } +} + +impl ToCss for BorderImageRepeat { + fn to_css(&self, dest: &mut CssWriter) -> fmt::Result + where + W: Write, + { + self.0.to_css(dest)?; + if self.0 != self.1 { + dest.write_str(" ")?; + self.1.to_css(dest)?; + } + Ok(()) + } +} + +impl ToComputedValue for SpecifiedBorderImageRepeat { + type ComputedValue = BorderImageRepeat; + + #[inline] + fn to_computed_value(&self, _: &Context) -> Self::ComputedValue { + BorderImageRepeat(self.0, self.1.unwrap_or(self.0)) + } + + #[inline] + fn from_computed_value(computed: &Self::ComputedValue) -> Self { + SpecifiedBorderImageRepeat(computed.0, Some(computed.1)) + } +} diff --git a/components/style/values/computed/mod.rs b/components/style/values/computed/mod.rs index 874424f45c3a..f51c54bdec6b 100644 --- a/components/style/values/computed/mod.rs +++ b/components/style/values/computed/mod.rs @@ -37,7 +37,7 @@ pub use self::align::{AlignItems, AlignContent, JustifyContent, SelfAlignment, J pub use self::align::{AlignSelf, JustifySelf}; pub use self::angle::Angle; pub use self::background::{BackgroundSize, BackgroundRepeat}; -pub use self::border::{BorderImageSlice, BorderImageWidth, BorderImageSideWidth}; +pub use self::border::{BorderImageRepeat, BorderImageSlice, BorderImageWidth, BorderImageSideWidth}; pub use self::border::{BorderRadius, BorderCornerRadius, BorderSpacing}; pub use self::font::{FontSize, FontSizeAdjust, FontSynthesis, FontWeight, FontVariantAlternates}; pub use self::font::{FontFamily, FontLanguageOverride, FontVariantSettings, FontVariantEastAsian}; diff --git a/components/style/values/specified/border.rs b/components/style/values/specified/border.rs index deb4e827b583..fe5f97b76953 100644 --- a/components/style/values/specified/border.rs +++ b/components/style/values/specified/border.rs @@ -171,3 +171,39 @@ impl Parse for BorderSpacing { }).map(GenericBorderSpacing) } } + +/// A single border-image-repeat keyword. +#[allow(missing_docs)] +#[cfg_attr(feature = "servo", derive(Deserialize, Serialize))] +#[derive(Clone, Copy, Debug, Eq, MallocSizeOf, Parse, PartialEq, ToCss)] +pub enum RepeatKeyword { + Stretch, + Repeat, + Round, + Space, +} + +/// The specified value for the `border-image-repeat` property. +/// +/// https://drafts.csswg.org/css-backgrounds/#the-border-image-repeat +#[derive(Clone, Debug, MallocSizeOf, PartialEq, ToCss)] +pub struct BorderImageRepeat(pub RepeatKeyword, pub Option); + +impl BorderImageRepeat { + /// Returns the `stretch` value. + #[inline] + pub fn stretch() -> Self { + BorderImageRepeat(RepeatKeyword::Stretch, None) + } +} + +impl Parse for BorderImageRepeat { + fn parse<'i, 't>( + _context: &ParserContext, + input: &mut Parser<'i, 't>, + ) -> Result> { + let horizontal = RepeatKeyword::parse(input)?; + let vertical = input.try(RepeatKeyword::parse).ok(); + Ok(BorderImageRepeat(horizontal, vertical)) + } +} diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index 32d9a46f14d9..3298b61ce9e1 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -31,7 +31,7 @@ pub use self::align::{AlignContent, JustifyContent, AlignItems, ContentDistribut pub use self::align::{AlignSelf, JustifySelf}; pub use self::background::{BackgroundRepeat, BackgroundSize}; pub use self::border::{BorderCornerRadius, BorderImageSlice, BorderImageWidth}; -pub use self::border::{BorderImageSideWidth, BorderRadius, BorderSideWidth, BorderSpacing}; +pub use self::border::{BorderImageRepeat, BorderImageSideWidth, BorderRadius, BorderSideWidth, BorderSpacing}; pub use self::font::{FontSize, FontSizeAdjust, FontSynthesis, FontWeight, FontVariantAlternates}; pub use self::font::{FontFamily, FontLanguageOverride, FontVariantSettings, FontVariantEastAsian}; pub use self::font::{FontVariantLigatures, FontVariantNumeric, FontFeatureSettings};