mirror of
https://github.com/servo/servo.git
synced 2025-08-04 05:00:08 +01:00
Report unexpected attribute selector tokens (bug 1384216).
This commit is contained in:
parent
8e20a6a110
commit
73e903ad3c
2 changed files with 28 additions and 36 deletions
|
@ -55,7 +55,7 @@ pub enum SelectorParseError<'i, T> {
|
||||||
NegationSelectorComponentNotLocalName,
|
NegationSelectorComponentNotLocalName,
|
||||||
EmptySelector,
|
EmptySelector,
|
||||||
NonSimpleSelectorInNegation,
|
NonSimpleSelectorInNegation,
|
||||||
UnexpectedTokenInAttributeSelector,
|
UnexpectedTokenInAttributeSelector(Token<'i>),
|
||||||
PseudoElementExpectedColon,
|
PseudoElementExpectedColon,
|
||||||
PseudoElementExpectedIdent,
|
PseudoElementExpectedIdent,
|
||||||
UnsupportedPseudoClassOrElement(CowRcStr<'i>),
|
UnsupportedPseudoClassOrElement(CowRcStr<'i>),
|
||||||
|
@ -1292,10 +1292,7 @@ fn parse_attribute_selector<'i, 't, P, E, Impl>(parser: &P, input: &mut CssParse
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let operator;
|
let operator = match input.next() {
|
||||||
let value;
|
|
||||||
let never_matches;
|
|
||||||
match input.next() {
|
|
||||||
// [foo]
|
// [foo]
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
let local_name_lower = to_ascii_lowercase(&local_name).as_ref().into();
|
let local_name_lower = to_ascii_lowercase(&local_name).as_ref().into();
|
||||||
|
@ -1317,43 +1314,33 @@ fn parse_attribute_selector<'i, 't, P, E, Impl>(parser: &P, input: &mut CssParse
|
||||||
}
|
}
|
||||||
|
|
||||||
// [foo=bar]
|
// [foo=bar]
|
||||||
Ok(&Token::Delim('=')) => {
|
Ok(&Token::Delim('=')) => AttrSelectorOperator::Equal,
|
||||||
value = input.expect_ident_or_string()?.clone();
|
|
||||||
never_matches = false;
|
|
||||||
operator = AttrSelectorOperator::Equal;
|
|
||||||
}
|
|
||||||
// [foo~=bar]
|
// [foo~=bar]
|
||||||
Ok(&Token::IncludeMatch) => {
|
Ok(&Token::IncludeMatch) => AttrSelectorOperator::Includes,
|
||||||
value = input.expect_ident_or_string()?.clone();
|
|
||||||
never_matches = value.is_empty() || value.contains(SELECTOR_WHITESPACE);
|
|
||||||
operator = AttrSelectorOperator::Includes;
|
|
||||||
}
|
|
||||||
// [foo|=bar]
|
// [foo|=bar]
|
||||||
Ok(&Token::DashMatch) => {
|
Ok(&Token::DashMatch) => AttrSelectorOperator::DashMatch,
|
||||||
value = input.expect_ident_or_string()?.clone();
|
|
||||||
never_matches = false;
|
|
||||||
operator = AttrSelectorOperator::DashMatch;
|
|
||||||
}
|
|
||||||
// [foo^=bar]
|
// [foo^=bar]
|
||||||
Ok(&Token::PrefixMatch) => {
|
Ok(&Token::PrefixMatch) => AttrSelectorOperator::Prefix,
|
||||||
value = input.expect_ident_or_string()?.clone();
|
|
||||||
never_matches = value.is_empty();
|
|
||||||
operator = AttrSelectorOperator::Prefix;
|
|
||||||
}
|
|
||||||
// [foo*=bar]
|
// [foo*=bar]
|
||||||
Ok(&Token::SubstringMatch) => {
|
Ok(&Token::SubstringMatch) => AttrSelectorOperator::Substring,
|
||||||
value = input.expect_ident_or_string()?.clone();
|
|
||||||
never_matches = value.is_empty();
|
|
||||||
operator = AttrSelectorOperator::Substring;
|
|
||||||
}
|
|
||||||
// [foo$=bar]
|
// [foo$=bar]
|
||||||
Ok(&Token::SuffixMatch) => {
|
Ok(&Token::SuffixMatch) => AttrSelectorOperator::Suffix,
|
||||||
value = input.expect_ident_or_string()?.clone();
|
Ok(t) => return Err(SelectorParseError::UnexpectedTokenInAttributeSelector(t.clone()).into())
|
||||||
never_matches = value.is_empty();
|
};
|
||||||
operator = AttrSelectorOperator::Suffix;
|
|
||||||
|
let value = input.expect_ident_or_string()?.clone();
|
||||||
|
let never_matches = match operator {
|
||||||
|
AttrSelectorOperator::Equal |
|
||||||
|
AttrSelectorOperator::DashMatch => false,
|
||||||
|
|
||||||
|
AttrSelectorOperator::Includes => {
|
||||||
|
value.is_empty() || value.contains(SELECTOR_WHITESPACE)
|
||||||
}
|
}
|
||||||
_ => return Err(SelectorParseError::UnexpectedTokenInAttributeSelector.into())
|
|
||||||
}
|
AttrSelectorOperator::Prefix |
|
||||||
|
AttrSelectorOperator::Substring |
|
||||||
|
AttrSelectorOperator::Suffix => value.is_empty()
|
||||||
|
};
|
||||||
|
|
||||||
let mut case_sensitivity = parse_attribute_flags(input)?;
|
let mut case_sensitivity = parse_attribute_flags(input)?;
|
||||||
|
|
||||||
|
|
|
@ -250,6 +250,9 @@ fn extract_error_params<'a>(err: ParseError<'a>) -> Option<ErrorParams<'a>> {
|
||||||
PropertyDeclarationParseError::InvalidValue(property, Some(e))))) =>
|
PropertyDeclarationParseError::InvalidValue(property, Some(e))))) =>
|
||||||
(Some(ErrorString::Snippet(property.into())), Some(extract_value_error_param(e))),
|
(Some(ErrorString::Snippet(property.into())), Some(extract_value_error_param(e))),
|
||||||
|
|
||||||
|
CssParseError::Custom(SelectorParseError::UnexpectedTokenInAttributeSelector(t)) =>
|
||||||
|
(None, Some(ErrorString::UnexpectedToken(t))),
|
||||||
|
|
||||||
CssParseError::Custom(SelectorParseError::UnsupportedPseudoClassOrElement(p)) =>
|
CssParseError::Custom(SelectorParseError::UnsupportedPseudoClassOrElement(p)) =>
|
||||||
(None, Some(ErrorString::Ident(p))),
|
(None, Some(ErrorString::Ident(p))),
|
||||||
|
|
||||||
|
@ -330,6 +333,8 @@ impl<'a> ErrorHelpers<'a> for ContextualParseError<'a> {
|
||||||
(b"PEAtNSUnexpected\0", Action::Nothing),
|
(b"PEAtNSUnexpected\0", Action::Nothing),
|
||||||
ContextualParseError::InvalidRule(_, ref err) => {
|
ContextualParseError::InvalidRule(_, ref err) => {
|
||||||
let prefix = match *err {
|
let prefix = match *err {
|
||||||
|
CssParseError::Custom(SelectorParseError::UnexpectedTokenInAttributeSelector(_)) =>
|
||||||
|
Some(&b"PEAttSelUnexpected\0"[..]),
|
||||||
CssParseError::Custom(SelectorParseError::UnsupportedPseudoClassOrElement(_)) =>
|
CssParseError::Custom(SelectorParseError::UnsupportedPseudoClassOrElement(_)) =>
|
||||||
Some(&b"PEPseudoSelUnknown\0"[..]),
|
Some(&b"PEPseudoSelUnknown\0"[..]),
|
||||||
_ => None,
|
_ => None,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue