aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Sapin <simon.sapin@exyr.org>2015-01-28 20:35:12 +0100
committerSimon Sapin <simon.sapin@exyr.org>2015-01-30 15:07:29 +0100
commit493a9e6a89d1f70374cfd27052819d61be305ba0 (patch)
tree329c24449830a42c4f96aaad29f2d8fa869aec3f
parent966af0030a246dfa407d5d17a66020cd331f326d (diff)
downloadservo-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.lock2
-rw-r--r--components/style/font_face.rs11
-rw-r--r--components/style/properties/mod.rs.mako22
-rw-r--r--components/style/stylesheets.rs39
-rw-r--r--ports/cef/Cargo.lock2
-rw-r--r--ports/gonk/Cargo.lock2
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)",