diff --git a/components/selectors/parser.rs b/components/selectors/parser.rs index cb149e16e5c..45ff70df416 100644 --- a/components/selectors/parser.rs +++ b/components/selectors/parser.rs @@ -7,7 +7,7 @@ use attr::{ParsedCaseSensitivity, SELECTOR_WHITESPACE, NamespaceConstraint}; use bloom::BLOOM_HASH_MASK; use builder::{SelectorBuilder, SpecificityAndFlags}; use context::QuirksMode; -use cssparser::{ParseError, BasicParseError, CowRcStr}; +use cssparser::{ParseError, BasicParseError, CowRcStr, Delimiter}; use cssparser::{Token, Parser as CssParser, parse_nth, ToCss, serialize_identifier, CssStringWriter}; use precomputed_hash::PrecomputedHash; use servo_arc::ThinArc; @@ -176,7 +176,7 @@ pub trait Parser<'i> { } #[derive(Clone, Debug, Eq, PartialEq)] -pub struct SelectorList(pub Vec>); +pub struct SelectorList(pub SmallVec<[Selector; 1]>); impl SelectorList { /// Parse a comma-separated list of Selectors. @@ -186,13 +186,20 @@ impl SelectorList { pub fn parse<'i, 't, P, E>(parser: &P, input: &mut CssParser<'i, 't>) -> Result>> where P: Parser<'i, Impl=Impl, Error=E> { - input.parse_comma_separated(|input| parse_selector(parser, input)) - .map(SelectorList) + let mut values = SmallVec::new(); + loop { + values.push(input.parse_until_before(Delimiter::Comma, |input| parse_selector(parser, input))?); + match input.next() { + Err(_) => return Ok(SelectorList(values)), + Ok(&Token::Comma) => continue, + Ok(_) => unreachable!(), + } + } } /// Creates a SelectorList from a Vec of selectors. Used in tests. pub fn from_vec(v: Vec>) -> Self { - SelectorList(v) + SelectorList(SmallVec::from_vec(v)) } }