diff options
author | Bobby Holley <bobbyholley@gmail.com> | 2017-06-01 14:28:13 -0700 |
---|---|---|
committer | Bobby Holley <bobbyholley@gmail.com> | 2017-06-05 19:29:23 -0700 |
commit | e3d3c5a7b29e27a11bf2e4f024110b3afaf9cf6d (patch) | |
tree | 9934bc852b8cdbb39f6390cf2375e7f06b83943b | |
parent | b815cabaf7ce5be55321713ae16d5b3c9adba1c2 (diff) | |
download | servo-e3d3c5a7b29e27a11bf2e4f024110b3afaf9cf6d.tar.gz servo-e3d3c5a7b29e27a11bf2e4f024110b3afaf9cf6d.zip |
Hoist specificity_and_flags into ComplexSelector (soon to be Selector).
In the upcoming patches we'll eliminate the existing Selector and SelectorInner,
and ComplexSelector will become an Arc-managed |Selector|. So the tuple-indexed
setup is just temporary.
MozReview-Commit-ID: 4CcOYeHGUED
-rw-r--r-- | components/selectors/parser.rs | 40 |
1 files changed, 20 insertions, 20 deletions
diff --git a/components/selectors/parser.rs b/components/selectors/parser.rs index 197ce4f2629..296a57c6709 100644 --- a/components/selectors/parser.rs +++ b/components/selectors/parser.rs @@ -186,8 +186,8 @@ impl<Impl: SelectorImpl> SelectorInner<Impl> { } /// Creates a SelectorInner from a Vec of Components. Used in tests. - pub fn from_vec(vec: Vec<Component<Impl>>) -> Self { - let complex = ComplexSelector::from_vec(vec); + pub fn from_vec(vec: Vec<Component<Impl>>, specificity_and_flags: u32) -> Self { + let complex = ComplexSelector::from_vec(vec, specificity_and_flags); Self::new(complex) } } @@ -195,7 +195,6 @@ impl<Impl: SelectorImpl> SelectorInner<Impl> { #[derive(PartialEq, Eq, Clone)] pub struct Selector<Impl: SelectorImpl> { pub inner: SelectorInner<Impl>, - specificity_and_flags: u32, } impl<Impl: SelectorImpl> ::std::borrow::Borrow<SelectorInner<Impl>> for Selector<Impl> { @@ -208,14 +207,7 @@ const HAS_PSEUDO_BIT: u32 = 1 << 30; impl<Impl: SelectorImpl> Selector<Impl> { pub fn specificity(&self) -> u32 { - self.specificity_and_flags & !HAS_PSEUDO_BIT - } - - pub fn new_for_unit_testing(inner: SelectorInner<Impl>, specificity: u32) -> Self { - Self { - inner: inner, - specificity_and_flags: specificity, - } + self.inner.complex.specificity() } pub fn pseudo_element(&self) -> Option<&Impl::PseudoElement> { @@ -234,7 +226,7 @@ impl<Impl: SelectorImpl> Selector<Impl> { } pub fn has_pseudo_element(&self) -> bool { - (self.specificity_and_flags & HAS_PSEUDO_BIT) != 0 + self.inner.complex.has_pseudo_element() } /// Whether this selector (pseudo-element part excluded) matches every element. @@ -371,9 +363,17 @@ pub fn namespace_empty_string<Impl: SelectorImpl>() -> Impl::NamespaceUrl { /// canonical iteration order is right-to-left (selector matching order). The /// iterators abstract over these details. #[derive(Clone, Eq, PartialEq)] -pub struct ComplexSelector<Impl: SelectorImpl>(ArcSlice<Component<Impl>>); +pub struct ComplexSelector<Impl: SelectorImpl>(ArcSlice<Component<Impl>>, u32); impl<Impl: SelectorImpl> ComplexSelector<Impl> { + pub fn specificity(&self) -> u32 { + self.1 & !HAS_PSEUDO_BIT + } + + pub fn has_pseudo_element(&self) -> bool { + (self.1 & HAS_PSEUDO_BIT) != 0 + } + /// Returns an iterator over the next sequence of simple selectors. When /// a combinator is reached, the iterator will return None, and /// next_sequence() may be called to continue to the next sequence. @@ -407,7 +407,7 @@ impl<Impl: SelectorImpl> ComplexSelector<Impl> { pub fn slice_from(&self, index: usize) -> Self { // Note that we convert the slice_from to slice_to because selectors are // stored left-to-right but logical order is right-to-left. - ComplexSelector(self.0.clone().slice_to(self.0.len() - index)) + ComplexSelector(self.0.clone().slice_to(self.0.len() - index), self.1) } /// Returns a ComplexSelector identical to |self| but with the leftmost @@ -415,12 +415,12 @@ impl<Impl: SelectorImpl> ComplexSelector<Impl> { pub fn slice_to(&self, index: usize) -> Self { // Note that we convert the slice_to to slice_from because selectors are // stored left-to-right but logical order is right-to-left. - ComplexSelector(self.0.clone().slice_from(self.0.len() - index)) + ComplexSelector(self.0.clone().slice_from(self.0.len() - index), self.1) } /// Creates a ComplexSelector from a vec of Components. Used in tests. - pub fn from_vec(vec: Vec<Component<Impl>>) -> Self { - ComplexSelector(ArcSlice::new(vec.into_boxed_slice())) + pub fn from_vec(vec: Vec<Component<Impl>>, specificity_and_flags: u32) -> Self { + ComplexSelector(ArcSlice::new(vec.into_boxed_slice()), specificity_and_flags) } } @@ -965,13 +965,13 @@ fn complex_selector_specificity<Impl>(selector: &ComplexSelector<Impl>) fn parse_selector<P, Impl>(parser: &P, input: &mut CssParser) -> Result<Selector<Impl>, ()> where P: Parser<Impl=Impl>, Impl: SelectorImpl { - let (complex, has_pseudo_element) = parse_complex_selector(parser, input)?; + let (mut complex, has_pseudo_element) = parse_complex_selector(parser, input)?; let mut specificity = specificity(&complex); if has_pseudo_element { specificity |= HAS_PSEUDO_BIT; } + complex.1 = specificity; Ok(Selector { - specificity_and_flags: specificity, inner: SelectorInner::new(complex), }) } @@ -1042,7 +1042,7 @@ fn parse_complex_selector<P, Impl>( sequence.push(Component::Combinator(combinator)); } - let complex = ComplexSelector(ArcSlice::new(sequence.into_vec().into_boxed_slice())); + let complex = ComplexSelector(ArcSlice::new(sequence.into_vec().into_boxed_slice()), 0); Ok((complex, parsed_pseudo_element)) } |