From ab445a02b098df29c3aeb5e1885026d229709c73 Mon Sep 17 00:00:00 2001 From: Oriol Brufau Date: Wed, 17 May 2023 00:34:33 +0200 Subject: [PATCH] style: Implement accent-color in nsNativeBasicTheme This is a new addition for CSS UI Level 4: https://drafts.csswg.org/css-ui-4/#widget-accent I want to provide feedback on some spec issues, and thought it was a kinda neat thing to prototype (it also makes testing contrast and such with random GTK themes easier). For now enable for Nightly only. Differential Revision: https://phabricator.services.mozilla.com/D112312 --- .../properties/longhands/inherited_ui.mako.rs | 17 +++++++++-- components/style/values/computed/color.rs | 5 +++- components/style/values/generics/color.rs | 30 +++++++++++++++++++ components/style/values/resolved/color.rs | 8 ++--- components/style/values/specified/color.rs | 14 ++++++++- 5 files changed, 66 insertions(+), 8 deletions(-) diff --git a/components/style/properties/longhands/inherited_ui.mako.rs b/components/style/properties/longhands/inherited_ui.mako.rs index 233ef365329..f08abbc6235 100644 --- a/components/style/properties/longhands/inherited_ui.mako.rs +++ b/components/style/properties/longhands/inherited_ui.mako.rs @@ -73,13 +73,26 @@ ${helpers.single_keyword( ${helpers.predefined_type( "caret-color", + "color::CaretColor", + "generics::color::CaretColor::auto()", + engines="gecko", + spec="https://drafts.csswg.org/css-ui/#caret-color", + animation_value_type="CaretColor", + boxed=True, + ignored_when_colors_disabled=True, +)} + +${helpers.predefined_type( + "accent-color", "ColorOrAuto", "generics::color::ColorOrAuto::Auto", engines="gecko", - spec="https://drafts.csswg.org/css-ui/#caret-color", - animation_value_type="AnimatedCaretColor", + spec="https://drafts.csswg.org/css-ui-4/#widget-accent", + gecko_pref="layout.css.accent-color.enabled", + animation_value_type="ColorOrAuto", boxed=True, ignored_when_colors_disabled=True, + has_effect_on_gecko_scrollbars=False, )} ${helpers.predefined_type( diff --git a/components/style/values/computed/color.rs b/components/style/values/computed/color.rs index 5fdc29a5feb..664fed95886 100644 --- a/components/style/values/computed/color.rs +++ b/components/style/values/computed/color.rs @@ -6,7 +6,7 @@ use crate::values::animated::color::RGBA as AnimatedRGBA; use crate::values::animated::ToAnimatedValue; -use crate::values::generics::color::{Color as GenericColor, ColorOrAuto as GenericColorOrAuto}; +use crate::values::generics::color::{GenericColor, GenericColorOrAuto, GenericCaretColor}; use cssparser::{Color as CSSParserColor, RGBA}; use std::fmt; use style_traits::{CssWriter, ToCss}; @@ -112,3 +112,6 @@ impl ToAnimatedValue for RGBA { /// auto | pub type ColorOrAuto = GenericColorOrAuto; + +/// caret-color +pub type CaretColor = GenericCaretColor; diff --git a/components/style/values/generics/color.rs b/components/style/values/generics/color.rs index 63c4c401689..5b477dee60d 100644 --- a/components/style/values/generics/color.rs +++ b/components/style/values/generics/color.rs @@ -96,6 +96,7 @@ impl From for Color { ToAnimatedValue, ToAnimatedZero, ToComputedValue, + ToResolvedValue, ToCss, ToShmem, )] @@ -108,3 +109,32 @@ pub enum GenericColorOrAuto { } pub use self::GenericColorOrAuto as ColorOrAuto; + +/// Caret color is effectively a ColorOrAuto, but resolves `auto` to +/// currentColor. +#[derive( + Animate, + Clone, + ComputeSquaredDistance, + Copy, + Debug, + MallocSizeOf, + PartialEq, + SpecifiedValueInfo, + ToAnimatedValue, + ToAnimatedZero, + ToComputedValue, + ToCss, + ToShmem, +)] +#[repr(transparent)] +pub struct GenericCaretColor(pub GenericColorOrAuto); + +impl GenericCaretColor { + /// Returns the `auto` value. + pub fn auto() -> Self { + GenericCaretColor(GenericColorOrAuto::Auto) + } +} + +pub use self::GenericCaretColor as CaretColor; diff --git a/components/style/values/resolved/color.rs b/components/style/values/resolved/color.rs index c098815701c..dbf6375e5bf 100644 --- a/components/style/values/resolved/color.rs +++ b/components/style/values/resolved/color.rs @@ -6,7 +6,7 @@ use super::{Context, ToResolvedValue}; -use crate::values::computed; +use crate::values::computed::color as computed; use crate::values::generics::color as generics; impl ToResolvedValue for computed::Color { @@ -24,14 +24,14 @@ impl ToResolvedValue for computed::Color { } } -impl ToResolvedValue for computed::ColorOrAuto { +impl ToResolvedValue for computed::CaretColor { // A resolved caret-color value is an rgba color, with auto resolving to // currentcolor. type ResolvedValue = cssparser::RGBA; #[inline] fn to_resolved_value(self, context: &Context) -> Self::ResolvedValue { - let color = match self { + let color = match self.0 { generics::ColorOrAuto::Color(color) => color, generics::ColorOrAuto::Auto => generics::Color::currentcolor(), }; @@ -40,6 +40,6 @@ impl ToResolvedValue for computed::ColorOrAuto { #[inline] fn from_resolved_value(resolved: Self::ResolvedValue) -> Self { - generics::ColorOrAuto::Color(computed::Color::from_resolved_value(resolved)) + generics::CaretColor(generics::ColorOrAuto::Color(computed::Color::from_resolved_value(resolved))) } } diff --git a/components/style/values/specified/color.rs b/components/style/values/specified/color.rs index d60f4801a11..7c903c5735b 100644 --- a/components/style/values/specified/color.rs +++ b/components/style/values/specified/color.rs @@ -9,7 +9,7 @@ use super::AllowQuirks; use crate::gecko_bindings::structs::nscolor; use crate::parser::{Parse, ParserContext}; use crate::values::computed::{Color as ComputedColor, Context, ToComputedValue}; -use crate::values::generics::color::ColorOrAuto as GenericColorOrAuto; +use crate::values::generics::color::{GenericColorOrAuto, GenericCaretColor}; use crate::values::specified::calc::CalcNode; use crate::values::specified::Percentage; use cssparser::{AngleOrNumber, Color as CSSParserColor, Parser, Token, RGBA}; @@ -808,3 +808,15 @@ impl Parse for ColorPropertyValue { /// auto | pub type ColorOrAuto = GenericColorOrAuto; + +/// caret-color +pub type CaretColor = GenericCaretColor; + +impl Parse for CaretColor { + fn parse<'i, 't>( + context: &ParserContext, + input: &mut Parser<'i, 't>, + ) -> Result> { + ColorOrAuto::parse(context, input).map(GenericCaretColor) + } +}