Skip to content

Commit

Permalink
style: Handle keywords for color values.
Browse files Browse the repository at this point in the history
Bug: 1434130
Reviewed-by: emilio
MozReview-Commit-ID: 5GvIHSeQuCX
  • Loading branch information
upsuper authored and emilio committed Apr 29, 2018
1 parent 2039849 commit 0021c70
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 3 deletions.
11 changes: 10 additions & 1 deletion components/style/values/specified/color.rs
Expand Up @@ -14,7 +14,7 @@ use parser::{Parse, ParserContext};
use properties::longhands::system_colors::SystemColor;
use std::fmt::{self, Write};
use std::io::Write as IoWrite;
use style_traits::{CssType, CssWriter, ParseError, StyleParseErrorKind};
use style_traits::{CssType, CssWriter, KeywordsCollectFn, ParseError, StyleParseErrorKind};
use style_traits::{SpecifiedValueInfo, ToCss, ValueParseErrorKind};
use super::AllowQuirks;
use values::computed::{Color as ComputedColor, Context, ToComputedValue};
Expand Down Expand Up @@ -429,6 +429,15 @@ impl From<Color> for RGBAColor {

impl SpecifiedValueInfo for Color {
const SUPPORTED_TYPES: u8 = CssType::COLOR;

fn collect_completion_keywords(f: KeywordsCollectFn) {
// We are not going to insert all the color names here. Caller and
// devtools should take care of them. XXX Actually, transparent
// should probably be handled that way as well.
// XXX `currentColor` should really be `currentcolor`. But let's
// keep it consistent with the old system for now.
f(&["rgb", "rgba", "hsl", "hsla", "currentColor", "transparent"]);
}
}

/// Specified value for the "color" property, which resolves the `currentcolor`
Expand Down
13 changes: 11 additions & 2 deletions ports/geckolib/glue.rs
Expand Up @@ -1012,9 +1012,18 @@ pub unsafe extern "C" fn Servo_Property_GetCSSValuesForProperty(
let mut values = BTreeSet::<&'static str>::new();
prop_id.collect_property_completion_keywords(&mut |list| values.extend(list.iter()));

let mut extras = vec![];
if values.contains("transparent") {
// This is a special value devtools use to avoid inserting the
// long list of color keywords. We need to prepend it to values.
extras.push("COLOR");
}

let result = result.as_mut().unwrap();
bindings::Gecko_ResizeTArrayForStrings(result, values.len() as u32);
for (src, dest) in values.iter().zip(result.iter_mut()) {
let len = extras.len() + values.len();
bindings::Gecko_ResizeTArrayForStrings(result, len as u32);

for (src, dest) in extras.iter().chain(values.iter()).zip(result.iter_mut()) {
dest.write_str(src).unwrap();
}
}
Expand Down

0 comments on commit 0021c70

Please sign in to comment.