Skip to content

Commit

Permalink
Auto merge of #17813 - upsuper:supports-decl, r=SimonSapin
Browse files Browse the repository at this point in the history
Store raw string for prop decl in @supports

This fixes the serialization issue of `@supports` rule that whitespaces are not preserved like in other browsers.

It makes the work a bit redundant (the property name and colon is parsed twice), but I suppose this isn't a big deal.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/17813)
<!-- Reviewable:end -->
  • Loading branch information
bors-servo committed Jul 21, 2017
2 parents 291c957 + adee1e4 commit d1ac8b2
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 31 deletions.
6 changes: 5 additions & 1 deletion components/script/dom/css.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
51 changes: 21 additions & 30 deletions components/style/stylesheets/supports_rule.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<W>(&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<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
dest.write_str(&self.0)
}
}

Expand All @@ -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<Declaration, ParseError<'i>> {
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()
}
}

0 comments on commit d1ac8b2

Please sign in to comment.