style: Augment CSS errors with the CSS selector.

Differential Revision: https://phabricator.services.mozilla.com/D24894
This commit is contained in:
Julian Descottes 2019-03-27 12:12:55 +00:00 committed by Emilio Cobos Álvarez
parent 4fbbcdddbe
commit 5a55978478
3 changed files with 13 additions and 7 deletions

View file

@ -10,12 +10,14 @@ use crate::stylesheets::UrlExtraData;
use cssparser::{BasicParseErrorKind, ParseErrorKind, SourceLocation, Token}; use cssparser::{BasicParseErrorKind, ParseErrorKind, SourceLocation, Token};
use std::fmt; use std::fmt;
use style_traits::ParseError; use style_traits::ParseError;
use crate::selector_parser::{SelectorImpl};
use selectors::SelectorList;
/// Errors that can be encountered while parsing CSS. /// Errors that can be encountered while parsing CSS.
#[derive(Debug)] #[derive(Debug)]
pub enum ContextualParseError<'a> { pub enum ContextualParseError<'a> {
/// A property declaration was not recognized. /// A property declaration was not recognized.
UnsupportedPropertyDeclaration(&'a str, ParseError<'a>), UnsupportedPropertyDeclaration(&'a str, ParseError<'a>, Option<&'a SelectorList<SelectorImpl>>),
/// A font face descriptor was not recognized. /// A font face descriptor was not recognized.
UnsupportedFontFaceDescriptor(&'a str, ParseError<'a>), UnsupportedFontFaceDescriptor(&'a str, ParseError<'a>),
/// A font feature values descriptor was not recognized. /// A font feature values descriptor was not recognized.
@ -121,7 +123,7 @@ impl<'a> fmt::Display for ContextualParseError<'a> {
} }
match *self { match *self {
ContextualParseError::UnsupportedPropertyDeclaration(decl, ref err) => { ContextualParseError::UnsupportedPropertyDeclaration(decl, ref err, _selectors) => {
write!(f, "Unsupported property declaration: '{}', ", decl)?; write!(f, "Unsupported property declaration: '{}', ", decl)?;
parse_error_to_str(err, f) parse_error_to_str(err, f)
}, },

View file

@ -25,6 +25,8 @@ use style_traits::{CssWriter, ParseError, ParsingMode, StyleParseErrorKind, ToCs
use crate::stylesheets::{CssRuleType, Origin, UrlExtraData}; use crate::stylesheets::{CssRuleType, Origin, UrlExtraData};
use super::*; use super::*;
use crate::values::computed::Context; use crate::values::computed::Context;
use crate::selector_parser::{SelectorImpl};
use selectors::SelectorList;
/// The animation rules. /// The animation rules.
/// ///
@ -1211,7 +1213,7 @@ pub fn parse_style_attribute(
); );
let mut input = ParserInput::new(input); 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 /// Parse a given property declaration. Can result in multiple
@ -1248,6 +1250,7 @@ pub fn parse_one_declaration_into(
let error = ContextualParseError::UnsupportedPropertyDeclaration( let error = ContextualParseError::UnsupportedPropertyDeclaration(
parser.slice_from(start_position), parser.slice_from(start_position),
err, err,
None
); );
context.log_css_error(location, error); 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( pub fn parse_property_declaration_list(
context: &ParserContext, context: &ParserContext,
input: &mut Parser, input: &mut Parser,
selectors: Option<&SelectorList<SelectorImpl>>
) -> PropertyDeclarationBlock { ) -> PropertyDeclarationBlock {
let mut declarations = SourcePropertyDeclaration::new(); let mut declarations = SourcePropertyDeclaration::new();
let mut block = PropertyDeclarationBlock::new(); let mut block = PropertyDeclarationBlock::new();
@ -1338,7 +1342,7 @@ pub fn parse_property_declaration_list(
} }
let location = error.location; let location = error.location;
let error = ContextualParseError::UnsupportedPropertyDeclaration(slice, error); let error = ContextualParseError::UnsupportedPropertyDeclaration(slice, error, selectors);
context.log_css_error(location, error); context.log_css_error(location, error);
} }
} }

View file

@ -9,7 +9,7 @@ use crate::error_reporting::ContextualParseError;
use crate::font_face::parse_font_face_block; use crate::font_face::parse_font_face_block;
use crate::media_queries::MediaList; use crate::media_queries::MediaList;
use crate::parser::{Parse, ParserContext}; 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::selector_parser::{SelectorImpl, SelectorParser};
use crate::shared_lock::{Locked, SharedRwLock}; use crate::shared_lock::{Locked, SharedRwLock};
use crate::str::starts_with_ignore_ascii_case; use crate::str::starts_with_ignore_ascii_case;
@ -548,7 +548,7 @@ impl<'a, 'b, 'i> AtRuleParser<'i> for NestedRuleParser<'a, 'b> {
self.namespaces, 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 { Ok(CssRule::Page(Arc::new(self.shared_lock.wrap(PageRule {
block: Arc::new(self.shared_lock.wrap(declarations)), block: Arc::new(self.shared_lock.wrap(declarations)),
source_location, source_location,
@ -596,7 +596,7 @@ impl<'a, 'b, 'i> QualifiedRuleParser<'i> for NestedRuleParser<'a, 'b> {
let context = let context =
ParserContext::new_with_rule_type(self.context, CssRuleType::Style, self.namespaces); 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)); let block = Arc::new(self.shared_lock.wrap(declarations));
Ok(CssRule::Style(Arc::new(self.shared_lock.wrap(StyleRule { Ok(CssRule::Style(Arc::new(self.shared_lock.wrap(StyleRule {
selectors, selectors,