diff --git a/components/style/gecko_bindings/sugar/style_complex_color.rs b/components/style/gecko_bindings/sugar/style_complex_color.rs index cd0e408b26f..0d5a20944a8 100644 --- a/components/style/gecko_bindings/sugar/style_complex_color.rs +++ b/components/style/gecko_bindings/sugar/style_complex_color.rs @@ -6,8 +6,8 @@ use gecko::values::{convert_nscolor_to_rgba, convert_rgba_to_nscolor}; use gecko_bindings::structs::{nscolor, StyleComplexColor}; -use values::{Auto, Either}; use values::computed::Color as ComputedColor; +use values::generics::pointing::CaretColor; impl From for StyleComplexColor { fn from(other: nscolor) -> Self { @@ -59,21 +59,27 @@ impl From for ComputedColor { } } -impl From> for StyleComplexColor { - fn from(other: Either) -> Self { +impl From> for StyleComplexColor +where + Color: Into, +{ + fn from(other: CaretColor) -> Self { match other { - Either::First(color) => color.into(), - Either::Second(_auto) => StyleComplexColor::auto(), + CaretColor::Color(color) => color.into(), + CaretColor::Auto => StyleComplexColor::auto(), } } } -impl From for Either { +impl From for CaretColor +where + StyleComplexColor: Into, +{ fn from(other: StyleComplexColor) -> Self { if !other.mIsAuto { - Either::First(other.into()) + CaretColor::Color(other.into()) } else { - Either::Second(Auto) + CaretColor::Auto } } } diff --git a/components/style/properties/longhand/pointing.mako.rs b/components/style/properties/longhand/pointing.mako.rs index fbd34cc5754..3b895749116 100644 --- a/components/style/properties/longhand/pointing.mako.rs +++ b/components/style/properties/longhand/pointing.mako.rs @@ -43,10 +43,10 @@ ${helpers.single_keyword("-moz-user-focus", ${helpers.predefined_type( "caret-color", - "ColorOrAuto", - "Either::Second(Auto)", + "CaretColor", + "generics::pointing::CaretColor::Auto", spec="https://drafts.csswg.org/css-ui/#caret-color", - animation_value_type="Either", + animation_value_type="AnimatedCaretColor", boxed=not RUSTC_HAS_PR45225, ignored_when_colors_disabled=True, products="gecko", diff --git a/components/style/values/computed/mod.rs b/components/style/values/computed/mod.rs index 6239e92e4a0..de3c1ad4dbe 100644 --- a/components/style/values/computed/mod.rs +++ b/components/style/values/computed/mod.rs @@ -70,10 +70,10 @@ pub use self::list::{ListStyleImage, Quotes}; pub use self::list::ListStyleType; pub use self::outline::OutlineStyle; pub use self::percentage::Percentage; -pub use self::position::{GridAutoFlow, GridTemplateAreas, Position, ZIndex}; -pub use self::pointing::Cursor; +pub use self::pointing::{CaretColor, Cursor}; #[cfg(feature = "gecko")] pub use self::pointing::CursorImage; +pub use self::position::{GridAutoFlow, GridTemplateAreas, Position, ZIndex}; pub use self::svg::{SVGLength, SVGOpacity, SVGPaint, SVGPaintKind}; pub use self::svg::{SVGPaintOrder, SVGStrokeDashArray, SVGWidth}; pub use self::svg::MozContextProperties; @@ -633,9 +633,6 @@ impl ClipRectOrAuto { } } -/// | auto -pub type ColorOrAuto = Either; - /// The computed value of a CSS `url()`, resolved relative to the stylesheet URL. #[cfg(feature = "servo")] #[derive(Clone, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)] diff --git a/components/style/values/computed/pointing.rs b/components/style/values/computed/pointing.rs index b14f22dec9c..1c44be7681c 100644 --- a/components/style/values/computed/pointing.rs +++ b/components/style/values/computed/pointing.rs @@ -15,6 +15,10 @@ use std::fmt::{self, Write}; use style_traits::{CssWriter, ToCss}; use style_traits::ParseError; use style_traits::cursor::CursorKind; +use values::computed::color::Color; +use values::generics::pointing::CaretColor as GenericCaretColor; +#[cfg(feature = "gecko")] +use values::specified::url::SpecifiedUrl; /// The computed value for the `cursor` property. /// @@ -22,8 +26,6 @@ use style_traits::cursor::CursorKind; pub use values::specified::pointing::Cursor; #[cfg(feature = "gecko")] pub use values::specified::pointing::CursorImage; -#[cfg(feature = "gecko")] -use values::specified::url::SpecifiedUrl; impl Cursor { /// Set `cursor` to `auto` @@ -138,3 +140,6 @@ impl ToCss for CursorImage { Ok(()) } } + +/// A computed value for the `caret-color` property. +pub type CaretColor = GenericCaretColor; diff --git a/components/style/values/generics/mod.rs b/components/style/values/generics/mod.rs index a69d51da0ba..8af481687d4 100644 --- a/components/style/values/generics/mod.rs +++ b/components/style/values/generics/mod.rs @@ -25,6 +25,7 @@ pub mod font; pub mod gecko; pub mod grid; pub mod image; +pub mod pointing; pub mod position; pub mod rect; pub mod size; diff --git a/components/style/values/generics/pointing.rs b/components/style/values/generics/pointing.rs new file mode 100644 index 00000000000..37130c8a9d1 --- /dev/null +++ b/components/style/values/generics/pointing.rs @@ -0,0 +1,15 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +//! Generic values for pointing properties. + +/// A generic value for the `caret-color` property. +#[derive(Animate, Clone, ComputeSquaredDistance, Copy, Debug, MallocSizeOf)] +#[derive(PartialEq, ToAnimatedValue, ToAnimatedZero, ToComputedValue, ToCss)] +pub enum CaretColor { + /// An explicit color. + Color(Color), + /// The keyword `auto`. + Auto, +} diff --git a/components/style/values/specified/mod.rs b/components/style/values/specified/mod.rs index 35d141b5238..bb5020648d0 100644 --- a/components/style/values/specified/mod.rs +++ b/components/style/values/specified/mod.rs @@ -63,11 +63,11 @@ pub use self::list::ListStyleType; pub use self::outline::OutlineStyle; pub use self::rect::LengthOrNumberRect; pub use self::percentage::Percentage; -pub use self::position::{GridAutoFlow, GridTemplateAreas, Position}; -pub use self::position::{PositionComponent, ZIndex}; -pub use self::pointing::Cursor; +pub use self::pointing::{CaretColor, Cursor}; #[cfg(feature = "gecko")] pub use self::pointing::CursorImage; +pub use self::position::{GridAutoFlow, GridTemplateAreas, Position}; +pub use self::position::{PositionComponent, ZIndex}; pub use self::svg::{SVGLength, SVGOpacity, SVGPaint, SVGPaintKind}; pub use self::svg::{SVGPaintOrder, SVGStrokeDashArray, SVGWidth}; pub use self::svg::MozContextProperties; @@ -693,9 +693,6 @@ impl ClipRectOrAuto { } } -/// | auto -pub type ColorOrAuto = Either; - /// Whether quirks are allowed in this context. #[derive(Clone, Copy, PartialEq)] pub enum AllowQuirks { diff --git a/components/style/values/specified/pointing.rs b/components/style/values/specified/pointing.rs index 8c8b34d93e9..0628746f261 100644 --- a/components/style/values/specified/pointing.rs +++ b/components/style/values/specified/pointing.rs @@ -6,7 +6,12 @@ //! //! https://drafts.csswg.org/css-ui/#pointing-keyboard +use cssparser::Parser; +use parser::{Parse, ParserContext}; +use style_traits::ParseError; use style_traits::cursor::CursorKind; +use values::generics::pointing::CaretColor as GenericCaretColor; +use values::specified::color::Color; #[cfg(feature = "gecko")] use values::specified::url::SpecifiedUrl; @@ -38,3 +43,18 @@ pub struct CursorImage { /// The and coordinates. pub hotspot: Option<(f32, f32)>, } + +/// A specified value for the `caret-color` property. +pub type CaretColor = GenericCaretColor; + +impl Parse for CaretColor { + fn parse<'i, 't>( + context: &ParserContext, + input: &mut Parser<'i, 't>, + ) -> Result> { + if input.try(|i| i.expect_ident_matching("auto")).is_ok() { + return Ok(GenericCaretColor::Auto); + } + Ok(GenericCaretColor::Color(Color::parse(context, input)?)) + } +}