From 5a55978478bca98115bd274560e2cbbb15d347b1 Mon Sep 17 00:00:00 2001 From: Julian Descottes Date: Wed, 27 Mar 2019 12:12:55 +0000 Subject: [PATCH] style: Augment CSS errors with the CSS selector. Differential Revision: https://phabricator.services.mozilla.com/D24894 --- components/style/error_reporting.rs | 6 ++++-- components/style/properties/declaration_block.rs | 8 ++++++-- components/style/stylesheets/rule_parser.rs | 6 +++--- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/components/style/error_reporting.rs b/components/style/error_reporting.rs index c58964c057a..9d54f62e318 100644 --- a/components/style/error_reporting.rs +++ b/components/style/error_reporting.rs @@ -10,12 +10,14 @@ use crate::stylesheets::UrlExtraData; use cssparser::{BasicParseErrorKind, ParseErrorKind, SourceLocation, Token}; use std::fmt; use style_traits::ParseError; +use crate::selector_parser::{SelectorImpl}; +use selectors::SelectorList; /// Errors that can be encountered while parsing CSS. #[derive(Debug)] pub enum ContextualParseError<'a> { /// A property declaration was not recognized. - UnsupportedPropertyDeclaration(&'a str, ParseError<'a>), + UnsupportedPropertyDeclaration(&'a str, ParseError<'a>, Option<&'a SelectorList>), /// A font face descriptor was not recognized. UnsupportedFontFaceDescriptor(&'a str, ParseError<'a>), /// A font feature values descriptor was not recognized. @@ -121,7 +123,7 @@ impl<'a> fmt::Display for ContextualParseError<'a> { } match *self { - ContextualParseError::UnsupportedPropertyDeclaration(decl, ref err) => { + ContextualParseError::UnsupportedPropertyDeclaration(decl, ref err, _selectors) => { write!(f, "Unsupported property declaration: '{}', ", decl)?; parse_error_to_str(err, f) }, diff --git a/components/style/properties/declaration_block.rs b/components/style/properties/declaration_block.rs index e4396e764a4..5a2fd6f2236 100644 --- a/components/style/properties/declaration_block.rs +++ b/components/style/properties/declaration_block.rs @@ -25,6 +25,8 @@ use style_traits::{CssWriter, ParseError, ParsingMode, StyleParseErrorKind, ToCs use crate::stylesheets::{CssRuleType, Origin, UrlExtraData}; use super::*; use crate::values::computed::Context; +use crate::selector_parser::{SelectorImpl}; +use selectors::SelectorList; /// The animation rules. /// @@ -1211,7 +1213,7 @@ pub fn parse_style_attribute( ); let mut input = ParserInput::new(input); - parse_property_declaration_list(&context, &mut Parser::new(&mut input)) + parse_property_declaration_list(&context, &mut Parser::new(&mut input), None) } /// Parse a given property declaration. Can result in multiple @@ -1248,6 +1250,7 @@ pub fn parse_one_declaration_into( let error = ContextualParseError::UnsupportedPropertyDeclaration( parser.slice_from(start_position), err, + None ); context.log_css_error(location, error); }) @@ -1312,6 +1315,7 @@ impl<'a, 'b, 'i> DeclarationParser<'i> for PropertyDeclarationParser<'a, 'b> { pub fn parse_property_declaration_list( context: &ParserContext, input: &mut Parser, + selectors: Option<&SelectorList> ) -> PropertyDeclarationBlock { let mut declarations = SourcePropertyDeclaration::new(); let mut block = PropertyDeclarationBlock::new(); @@ -1338,7 +1342,7 @@ pub fn parse_property_declaration_list( } let location = error.location; - let error = ContextualParseError::UnsupportedPropertyDeclaration(slice, error); + let error = ContextualParseError::UnsupportedPropertyDeclaration(slice, error, selectors); context.log_css_error(location, error); } } diff --git a/components/style/stylesheets/rule_parser.rs b/components/style/stylesheets/rule_parser.rs index a780ebce250..8f4cb088cf0 100644 --- a/components/style/stylesheets/rule_parser.rs +++ b/components/style/stylesheets/rule_parser.rs @@ -9,7 +9,7 @@ use crate::error_reporting::ContextualParseError; use crate::font_face::parse_font_face_block; use crate::media_queries::MediaList; use crate::parser::{Parse, ParserContext}; -use crate::properties::parse_property_declaration_list; +use crate::properties::{parse_property_declaration_list}; use crate::selector_parser::{SelectorImpl, SelectorParser}; use crate::shared_lock::{Locked, SharedRwLock}; use crate::str::starts_with_ignore_ascii_case; @@ -548,7 +548,7 @@ impl<'a, 'b, 'i> AtRuleParser<'i> for NestedRuleParser<'a, 'b> { self.namespaces, ); - let declarations = parse_property_declaration_list(&context, input); + let declarations = parse_property_declaration_list(&context, input, None); Ok(CssRule::Page(Arc::new(self.shared_lock.wrap(PageRule { block: Arc::new(self.shared_lock.wrap(declarations)), source_location, @@ -596,7 +596,7 @@ impl<'a, 'b, 'i> QualifiedRuleParser<'i> for NestedRuleParser<'a, 'b> { let context = ParserContext::new_with_rule_type(self.context, CssRuleType::Style, self.namespaces); - let declarations = parse_property_declaration_list(&context, input); + let declarations = parse_property_declaration_list(&context, input, Some(&selectors)); let block = Arc::new(self.shared_lock.wrap(declarations)); Ok(CssRule::Style(Arc::new(self.shared_lock.wrap(StyleRule { selectors,