diff --git a/components/script/dom/css.rs b/components/script/dom/css.rs index 31ca219093e..0ee5a95366f 100644 --- a/components/script/dom/css.rs +++ b/components/script/dom/css.rs @@ -30,7 +30,11 @@ impl CSS { /// https://drafts.csswg.org/css-conditional/#dom-css-supports pub fn Supports(win: &Window, property: DOMString, value: DOMString) -> bool { - let decl = Declaration { prop: property.into(), val: value.into() }; + let mut decl = String::new(); + serialize_identifier(&property, &mut decl).unwrap(); + decl.push_str(": "); + decl.push_str(&value); + let decl = Declaration(decl); let url = win.Document().url(); let context = ParserContext::new_for_cssom(&url, win.css_error_reporter(), Some(CssRuleType::Supports), PARSING_MODE_DEFAULT, diff --git a/components/style/stylesheets/supports_rule.rs b/components/style/stylesheets/supports_rule.rs index 5636a55cadc..9edc4409fb0 100644 --- a/components/style/stylesheets/supports_rule.rs +++ b/components/style/stylesheets/supports_rule.rs @@ -214,21 +214,11 @@ impl ToCss for SupportsCondition { #[derive(Clone, Debug)] /// A possibly-invalid property declaration -pub struct Declaration { - /// The property name - pub prop: String, - /// The property value - pub val: String, -} +pub struct Declaration(pub String); impl ToCss for Declaration { - fn to_css(&self, dest: &mut W) -> fmt::Result - where W: fmt::Write - { - dest.write_str(&self.prop)?; - dest.write_str(":")?; - // no space, the `val` already contains any possible spaces - dest.write_str(&self.val) + fn to_css(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { + dest.write_str(&self.0) } } @@ -240,31 +230,32 @@ fn consume_any_value<'i, 't>(input: &mut Parser<'i, 't>) -> Result<(), ParseErro impl Declaration { /// Parse a declaration pub fn parse<'i, 't>(input: &mut Parser<'i, 't>) -> Result> { - let prop = input.expect_ident()?.into_owned(); - input.expect_colon()?; let pos = input.position(); + input.expect_ident()?; + input.expect_colon()?; consume_any_value(input)?; - Ok(Declaration { prop: prop, val: input.slice_from(pos).to_owned() }) + Ok(Declaration(input.slice_from(pos).to_owned())) } /// Determine if a declaration parses /// /// https://drafts.csswg.org/css-conditional-3/#support-definition pub fn eval(&self, cx: &ParserContext) -> bool { - let id = if let Ok(id) = PropertyId::parse((&*self.prop).into()) { - id - } else { - return false - }; - let mut input = ParserInput::new(&self.val); + let mut input = ParserInput::new(&self.0); let mut input = Parser::new(&mut input); - let context = ParserContext::new_with_rule_type(cx, Some(CssRuleType::Style)); - let mut declarations = SourcePropertyDeclaration::new(); - let res = input.parse_until_before(Delimiter::Bang, |input| { - PropertyDeclaration::parse_into(&mut declarations, id, &context, input) - .map_err(|e| StyleParseError::PropertyDeclaration(e).into()) - }); - let _ = input.try(parse_important); - res.is_ok() && input.is_exhausted() + input.parse_entirely(|input| { + let prop = input.expect_ident().unwrap(); + input.expect_colon().unwrap(); + let id = PropertyId::parse(&prop) + .map_err(|_| StyleParseError::UnspecifiedError)?; + let mut declarations = SourcePropertyDeclaration::new(); + let context = ParserContext::new_with_rule_type(cx, Some(CssRuleType::Style)); + input.parse_until_before(Delimiter::Bang, |input| { + PropertyDeclaration::parse_into(&mut declarations, id, &context, input) + .map_err(|e| StyleParseError::PropertyDeclaration(e).into()) + })?; + let _ = input.try(parse_important); + Ok(()) + }).is_ok() } }