diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2017-05-15 16:38:35 +0200 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2017-05-16 02:53:44 +0200 |
commit | fe8da51feeb11102c25700da839eabbcf33bf22c (patch) | |
tree | 665901ecf5288f2259c5bb7902891ced2689fe0e | |
parent | 1e0edf49090dce7ccdd5c79a0cef566f44ea431b (diff) | |
download | servo-fe8da51feeb11102c25700da839eabbcf33bf22c.tar.gz servo-fe8da51feeb11102c25700da839eabbcf33bf22c.zip |
Bug 1364412: Properly reject to parse pseudo-element states that don't support state. r=bholley
MozReview-Commit-ID: KQCFPtOTGQI
Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
-rw-r--r-- | components/style/gecko/selector_parser.rs | 28 |
1 files changed, 16 insertions, 12 deletions
diff --git a/components/style/gecko/selector_parser.rs b/components/style/gecko/selector_parser.rs index 9c67c06d60a..64f135c73ae 100644 --- a/components/style/gecko/selector_parser.rs +++ b/components/style/gecko/selector_parser.rs @@ -319,22 +319,26 @@ impl<'a> ::selectors::Parser for SelectorParser<'a> { None => return Err(()), }; - let state = input.try(|input| { - let mut state = ElementState::empty(); + let state = if pseudo.supports_user_action_state() { + input.try(|input| { + let mut state = ElementState::empty(); - while !input.is_exhausted() { - input.expect_colon()?; - let ident = input.expect_ident()?; - let pseudo_class = self.parse_non_ts_pseudo_class(ident)?; + while !input.is_exhausted() { + input.expect_colon()?; + let ident = input.expect_ident()?; + let pseudo_class = self.parse_non_ts_pseudo_class(ident)?; - if !pseudo_class.is_safe_user_action_state() { - return Err(()) + if !pseudo_class.is_safe_user_action_state() { + return Err(()) + } + state.insert(pseudo_class.state_flag()); } - state.insert(pseudo_class.state_flag()); - } - Ok(state) - }); + Ok(state) + }).ok() + } else { + None + }; Ok(PseudoElementSelector { pseudo: pseudo, |