Factor out Gecko-specific color keywords. r?manishearth draft
authorXidorn Quan <me@upsuper.org>
Tue, 06 Jun 2017 17:16:46 +1000
changeset 590136 1000b2c31a1d4e8cb1dd5cbcc15abd45b9a3f484
parent 590135 0522bc54293f6499d3f4c0d67b5eb8363d22f36d
child 590137 e143b9906704165f1a6374d3a0fde5e57736b9f7
push id62604
push userxquan@mozilla.com
push dateWed, 07 Jun 2017 07:07:54 +0000
reviewersmanishearth
milestone55.0a1
Factor out Gecko-specific color keywords. r?manishearth MozReview-Commit-ID: 1tiRZpWwwl3
servo/components/style/values/specified/color.rs
--- a/servo/components/style/values/specified/color.rs
+++ b/servo/components/style/values/specified/color.rs
@@ -32,35 +32,35 @@ mod servo {
 #[cfg(feature = "gecko")]
 mod gecko {
     use cssparser::{Color as CSSParserColor, Parser, RGBA};
     use parser::{Parse, ParserContext};
     use properties::longhands::color::SystemColor;
     use std::fmt;
     use style_traits::ToCss;
 
+    define_css_keyword_enum! { SpecialColorKeyword:
+        "-moz-default-color" => MozDefaultColor,
+        "-moz-default-background-color" => MozDefaultBackgroundColor,
+        "-moz-hyperlinktext" => MozHyperlinktext,
+        "-moz-activehyperlinktext" => MozActiveHyperlinktext,
+        "-moz-visitedhyperlinktext" => MozVisitedHyperlinktext,
+    }
+
     /// Color value including non-standard -moz prefixed values.
     #[derive(Clone, Copy, PartialEq, Debug)]
     pub enum Color {
         /// The 'currentColor' keyword
         CurrentColor,
         /// A specific RGBA color
         RGBA(RGBA),
         /// A system color
         System(SystemColor),
-        /// -moz-default-color
-        MozDefaultColor,
-        /// -moz-default-background-color
-        MozDefaultBackgroundColor,
-        /// -moz-hyperlinktext
-        MozHyperlinktext,
-        /// -moz-activehyperlinktext
-        MozActiveHyperlinktext,
-        /// -moz-visitedhyperlinktext
-        MozVisitedHyperlinktext,
+        /// A special color keyword value used in Gecko
+        Special(SpecialColorKeyword),
         /// Quirksmode-only rule for inheriting color from the body
         InheritFromBodyQuirk,
     }
 
     no_viewport_percentage!(Color);
 
     impl From<CSSParserColor> for Color {
         fn from(value: CSSParserColor) -> Self {
@@ -72,44 +72,34 @@ mod gecko {
     }
 
     impl Parse for Color {
         fn parse(_: &ParserContext, input: &mut Parser) -> Result<Self, ()> {
             if let Ok(value) = input.try(CSSParserColor::parse) {
                 Ok(value.into())
             } else if let Ok(system) = input.try(SystemColor::parse) {
                 Ok(Color::System(system))
+            } else if let Ok(special) = input.try(SpecialColorKeyword::parse) {
+                Ok(Color::Special(special))
             } else {
-                let ident = input.expect_ident()?;
-                match_ignore_ascii_case! { &ident,
-                    "-moz-default-color" => Ok(Color::MozDefaultColor),
-                    "-moz-default-background-color" => Ok(Color::MozDefaultBackgroundColor),
-                    "-moz-hyperlinktext" => Ok(Color::MozHyperlinktext),
-                    "-moz-activehyperlinktext" => Ok(Color::MozActiveHyperlinktext),
-                    "-moz-visitedhyperlinktext" => Ok(Color::MozVisitedHyperlinktext),
-                    _ => Err(())
-                }
+                Err(())
             }
         }
     }
 
     impl ToCss for Color {
         fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
             match *self {
                 // Standard values:
                 Color::CurrentColor => CSSParserColor::CurrentColor.to_css(dest),
                 Color::RGBA(rgba) => rgba.to_css(dest),
                 Color::System(system) => system.to_css(dest),
 
                 // Non-standard values:
-                Color::MozDefaultColor => dest.write_str("-moz-default-color"),
-                Color::MozDefaultBackgroundColor => dest.write_str("-moz-default-background-color"),
-                Color::MozHyperlinktext => dest.write_str("-moz-hyperlinktext"),
-                Color::MozActiveHyperlinktext => dest.write_str("-moz-activehyperlinktext"),
-                Color::MozVisitedHyperlinktext => dest.write_str("-moz-visitedhyperlinktext"),
+                Color::Special(special) => special.to_css(dest),
                 Color::InheritFromBodyQuirk => Ok(()),
             }
         }
     }
 }
 
 #[derive(Clone, PartialEq, Debug)]
 #[cfg_attr(feature = "servo", derive(HeapSizeOf))]
@@ -267,21 +257,26 @@ impl ToComputedValue for Color {
     fn to_computed_value(&self, context: &Context) -> RGBA {
         use gecko::values::convert_nscolor_to_rgba as to_rgba;
         // It's safe to access the nsPresContext immutably during style computation.
         let pres_context = unsafe { &*context.device.pres_context };
         match *self {
             Color::RGBA(rgba) => rgba,
             Color::System(system) => to_rgba(system.to_computed_value(context)),
             Color::CurrentColor => context.inherited_style.get_color().clone_color(),
-            Color::MozDefaultColor => to_rgba(pres_context.mDefaultColor),
-            Color::MozDefaultBackgroundColor => to_rgba(pres_context.mBackgroundColor),
-            Color::MozHyperlinktext => to_rgba(pres_context.mLinkColor),
-            Color::MozActiveHyperlinktext => to_rgba(pres_context.mActiveLinkColor),
-            Color::MozVisitedHyperlinktext => to_rgba(pres_context.mVisitedLinkColor),
+            Color::Special(special) => {
+                use self::gecko::SpecialColorKeyword as Keyword;
+                to_rgba(match special {
+                    Keyword::MozDefaultColor => pres_context.mDefaultColor,
+                    Keyword::MozDefaultBackgroundColor => pres_context.mBackgroundColor,
+                    Keyword::MozHyperlinktext => pres_context.mLinkColor,
+                    Keyword::MozActiveHyperlinktext => pres_context.mActiveLinkColor,
+                    Keyword::MozVisitedHyperlinktext => pres_context.mVisitedLinkColor,
+                })
+            }
             Color::InheritFromBodyQuirk => {
                 use dom::TElement;
                 use gecko::wrapper::GeckoElement;
                 use gecko_bindings::bindings::Gecko_GetBody;
                 let body = unsafe {
                     Gecko_GetBody(pres_context)
                 };
                 if let Some(body) = body {