From af8e8e6a34cb2a6fa93c8ea998c6cd3a0c8c0536 Mon Sep 17 00:00:00 2001 From: violet Date: Tue, 21 May 2019 15:35:41 +0000 Subject: [PATCH] style: Do not report error for unknown property if its known moz prefixed version is specified. Suppose that `prop` is a property that we haven't supported yet, while its `-moz-prop` version is already supported. If an author specifies in a declaration block this property in its standard form as well as multiple verdor specific forms, as long as `-moz-prop` is specified, we shouldn't report error for unknown property `prop`. Because that's just noise. Differential Revision: https://phabricator.services.mozilla.com/D31998 --- .../style/properties/declaration_block.rs | 33 ++++++++++++++----- components/style_traits/lib.rs | 2 -- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/components/style/properties/declaration_block.rs b/components/style/properties/declaration_block.rs index 1ce083c944ff..fcbfb717aa8f 100644 --- a/components/style/properties/declaration_block.rs +++ b/components/style/properties/declaration_block.rs @@ -1301,11 +1301,9 @@ impl<'a, 'b, 'i> DeclarationParser<'i> for PropertyDeclarationParser<'a, 'b> { Ok(id) => id, Err(..) => { self.last_parsed_property_id = None; - return Err(input.new_custom_error(if is_non_mozilla_vendor_identifier(&name) { - StyleParseErrorKind::UnknownVendorProperty - } else { + return Err(input.new_custom_error( StyleParseErrorKind::UnknownProperty(name) - })); + )); } }; if self.context.error_reporting_enabled() { @@ -1326,6 +1324,13 @@ impl<'a, 'b, 'i> DeclarationParser<'i> for PropertyDeclarationParser<'a, 'b> { type SmallParseErrorVec<'i> = SmallVec<[(ParseError<'i>, &'i str, Option); 2]>; +fn alias_of_known_property(name: &str) -> Option { + let mut prefixed = String::with_capacity(name.len() + 5); + prefixed.push_str("-moz-"); + prefixed.push_str(name); + PropertyId::parse_enabled_for_all_content(&prefixed).ok() +} + #[cold] fn report_one_css_error<'i>( context: &ParserContext, @@ -1352,10 +1357,22 @@ fn report_one_css_error<'i>( } } - // If the unrecognized property looks like a vendor-specific property, - // silently ignore it instead of polluting the error output. - if let ParseErrorKind::Custom(StyleParseErrorKind::UnknownVendorProperty) = error.kind { - return; + if let ParseErrorKind::Custom(StyleParseErrorKind::UnknownProperty(ref name)) = error.kind { + if is_non_mozilla_vendor_identifier(name) { + // If the unrecognized property looks like a vendor-specific property, + // silently ignore it instead of polluting the error output. + return; + } + if let Some(alias) = alias_of_known_property(name) { + // This is an unknown property, but its -moz-* version is known. + // We don't want to report error if the -moz-* version is already + // specified. + if let Some(block) = block { + if all_properties_in_block(block, &alias) { + return; + } + } + } } if let Some(ref property) = property { diff --git a/components/style_traits/lib.rs b/components/style_traits/lib.rs index cc87ff36cfff..4e89f6fdf676 100644 --- a/components/style_traits/lib.rs +++ b/components/style_traits/lib.rs @@ -152,8 +152,6 @@ pub enum StyleParseErrorKind<'i> { /// The property declaration was for an unknown property. UnknownProperty(CowRcStr<'i>), - /// An unknown vendor-specific identifier was encountered. - UnknownVendorProperty, /// The property declaration was for a disabled experimental property. ExperimentalProperty, /// The property declaration contained an invalid color value.