diff options
author | Simon Sapin <simon.sapin@exyr.org> | 2015-01-28 20:35:12 +0100 |
---|---|---|
committer | Simon Sapin <simon.sapin@exyr.org> | 2015-01-30 15:07:29 +0100 |
commit | 493a9e6a89d1f70374cfd27052819d61be305ba0 (patch) | |
tree | 329c24449830a42c4f96aaad29f2d8fa869aec3f | |
parent | 966af0030a246dfa407d5d17a66020cd331f326d (diff) | |
download | servo-493a9e6a89d1f70374cfd27052819d61be305ba0.tar.gz servo-493a9e6a89d1f70374cfd27052819d61be305ba0.zip |
Bring CSS parse error reporting back. (Still off by default. Enable with `RUST_LOG=style`.)
-rw-r--r-- | components/servo/Cargo.lock | 2 | ||||
-rw-r--r-- | components/style/font_face.rs | 11 | ||||
-rw-r--r-- | components/style/properties/mod.rs.mako | 22 | ||||
-rw-r--r-- | components/style/stylesheets.rs | 39 | ||||
-rw-r--r-- | ports/cef/Cargo.lock | 2 | ||||
-rw-r--r-- | ports/gonk/Cargo.lock | 2 |
6 files changed, 53 insertions, 25 deletions
diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 01445776c3c..987d2052091 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -134,7 +134,7 @@ dependencies = [ [[package]] name = "cssparser" version = "0.2.0" -source = "git+https://github.com/servo/rust-cssparser#f4214c9a7bfafd6f40a62b0726aa0bde900ef0dc" +source = "git+https://github.com/servo/rust-cssparser#42714934cbe83dab349190695503a09ae23f9528" dependencies = [ "encoding 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/components/style/font_face.rs b/components/style/font_face.rs index 0dde375d602..a731f9462e0 100644 --- a/components/style/font_face.rs +++ b/components/style/font_face.rs @@ -9,7 +9,7 @@ use properties::longhands::font_family::parse_one_family; use properties::computed_values::font_family::FontFamily; use media_queries::Device; use url::{Url, UrlParser}; -use parser::ParserContext; +use parser::{ParserContext, log_css_error}; pub fn iter_font_face_rules_inner<F>(rules: &[CSSRule], device: &Device, @@ -54,9 +54,14 @@ pub fn parse_font_face_block(context: &ParserContext, input: &mut Parser) -> Result<FontFaceRule, ()> { let mut family = None; let mut src = None; - for declaration in DeclarationListParser::new(input, FontFaceRuleParser { context: context }) { + let mut iter = DeclarationListParser::new(input, FontFaceRuleParser { context: context }); + while let Some(declaration) = iter.next() { match declaration { - Err(()) => {} + Err(range) => { + let message = format!("Unsupported @font-face descriptor declaration: '{}'", + iter.input.slice(range)); + log_css_error(iter.input, range.start, &*message); + } Ok(FontFaceDescriptorDeclaration::Family(value)) => { family = Some(value); } diff --git a/components/style/properties/mod.rs.mako b/components/style/properties/mod.rs.mako index 54a02289ca8..fada051ebc1 100644 --- a/components/style/properties/mod.rs.mako +++ b/components/style/properties/mod.rs.mako @@ -20,7 +20,7 @@ use geom::SideOffsets2D; use values::specified::BorderStyle; use values::computed; use selector_matching::DeclarationBlock; -use parser::ParserContext; +use parser::{ParserContext, log_css_error}; use stylesheets::Origin; use self::property_bit_field::PropertyBitField; @@ -2363,12 +2363,20 @@ pub fn parse_property_declaration_list(context: &ParserContext, input: &mut Pars let parser = PropertyDeclarationParser { context: context, }; - for declaration in DeclarationListParser::new(input, parser) { - if let Ok((results, important)) = declaration { - if important { - important_declarations.push_all(results.as_slice()); - } else { - normal_declarations.push_all(results.as_slice()); + let mut iter = DeclarationListParser::new(input, parser); + while let Some(declaration) = iter.next() { + match declaration { + Ok((results, important)) => { + if important { + important_declarations.push_all(results.as_slice()); + } else { + normal_declarations.push_all(results.as_slice()); + } + } + Err(range) => { + let message = format!("Unsupported property declaration: '{}'", + iter.input.slice(range)); + log_css_error(iter.input, range.start, &*message); } } } diff --git a/components/style/stylesheets.rs b/components/style/stylesheets.rs index bfe6c48cc66..1eaa8e838f7 100644 --- a/components/style/stylesheets.rs +++ b/components/style/stylesheets.rs @@ -13,7 +13,7 @@ use cssparser::{Parser, decode_stylesheet_bytes, QualifiedRuleParser, AtRuleParser, RuleListParser, AtRuleType}; use string_cache::{Atom, Namespace}; use selectors::{Selector, parse_selector_list}; -use parser::ParserContext; +use parser::{ParserContext, log_css_error}; use properties::{PropertyDeclarationBlock, parse_property_declaration_list}; use media_queries::{self, Device, MediaQueryList, parse_media_query_list}; use font_face::{FontFaceRule, Source, parse_font_face_block, iter_font_face_rules_inner}; @@ -93,16 +93,22 @@ impl Stylesheet { let mut iter = RuleListParser::new_for_stylesheet(&mut input, rule_parser); let mut rules = Vec::new(); while let Some(result) = iter.next() { - if let Ok(rule) = result { - if let CSSRule::Namespace(ref prefix, ref namespace) = rule { - if let Some(prefix) = prefix.as_ref() { - iter.parser.context.namespaces.prefix_map.insert( - prefix.clone(), namespace.clone()); - } else { - iter.parser.context.namespaces.default = Some(namespace.clone()); + match result { + Ok(rule) => { + if let CSSRule::Namespace(ref prefix, ref namespace) = rule { + if let Some(prefix) = prefix.as_ref() { + iter.parser.context.namespaces.prefix_map.insert( + prefix.clone(), namespace.clone()); + } else { + iter.parser.context.namespaces.default = Some(namespace.clone()); + } } + rules.push(rule); + } + Err(range) => { + let message = format!("Invalid rule: '{}'", iter.input.slice(range)); + log_css_error(iter.input, range.start, &*message); } - rules.push(rule); } } Stylesheet { @@ -114,9 +120,18 @@ impl Stylesheet { fn parse_nested_rules(context: &ParserContext, input: &mut Parser) -> Vec<CSSRule> { - RuleListParser::new_for_nested_rule(input, NestedRuleParser { context: context }) - .filter_map(|result| result.ok()) - .collect() + let mut iter = RuleListParser::new_for_nested_rule(input, NestedRuleParser { context: context }); + let mut rules = Vec::new(); + while let Some(result) = iter.next() { + match result { + Ok(rule) => rules.push(rule), + Err(range) => { + let message = format!("Unsupported rule: '{}'", iter.input.slice(range)); + log_css_error(iter.input, range.start, &*message); + } + } + } + rules } diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock index e69571d5b05..9c4623d5343 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -132,7 +132,7 @@ dependencies = [ [[package]] name = "cssparser" version = "0.2.0" -source = "git+https://github.com/servo/rust-cssparser#f4214c9a7bfafd6f40a62b0726aa0bde900ef0dc" +source = "git+https://github.com/servo/rust-cssparser#42714934cbe83dab349190695503a09ae23f9528" dependencies = [ "encoding 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/ports/gonk/Cargo.lock b/ports/gonk/Cargo.lock index 5316849f37d..bfbd4abf01e 100644 --- a/ports/gonk/Cargo.lock +++ b/ports/gonk/Cargo.lock @@ -103,7 +103,7 @@ dependencies = [ [[package]] name = "cssparser" version = "0.2.0" -source = "git+https://github.com/servo/rust-cssparser#f4214c9a7bfafd6f40a62b0726aa0bde900ef0dc" +source = "git+https://github.com/servo/rust-cssparser#42714934cbe83dab349190695503a09ae23f9528" dependencies = [ "encoding 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", |