diff options
Diffstat (limited to 'components/selectors/parser.rs')
-rw-r--r-- | components/selectors/parser.rs | 43 |
1 files changed, 31 insertions, 12 deletions
diff --git a/components/selectors/parser.rs b/components/selectors/parser.rs index 91981562366..5fd73ce8d73 100644 --- a/components/selectors/parser.rs +++ b/components/selectors/parser.rs @@ -36,6 +36,18 @@ pub trait PseudoElement : Sized + ToCss { } } +/// A trait that represents a pseudo-class. +pub trait NonTSPseudoClass : Sized + ToCss { + /// The `SelectorImpl` this pseudo-element is used for. + type Impl: SelectorImpl; + + /// Whether this pseudo-class is :active or :hover. + fn is_active_or_hover(&self) -> bool; + + /// Whether this pseudo-class is :host. + fn is_host(&self) -> bool; +} + fn to_ascii_lowercase(s: &str) -> Cow<str> { if let Some(first_uppercase) = s.bytes().position(|byte| byte >= b'A' && byte <= b'Z') { let mut string = s.to_owned(); @@ -96,14 +108,10 @@ macro_rules! with_all_bounds { /// non tree-structural pseudo-classes /// (see: https://drafts.csswg.org/selectors/#structural-pseudos) - type NonTSPseudoClass: $($CommonBounds)* + Sized + ToCss; + type NonTSPseudoClass: $($CommonBounds)* + NonTSPseudoClass<Impl = Self>; /// pseudo-elements type PseudoElement: $($CommonBounds)* + PseudoElement<Impl = Self>; - - /// Returns whether the given pseudo class is :active or :hover. - #[inline] - fn is_active_or_hover(pseudo_class: &Self::NonTSPseudoClass) -> bool; } } } @@ -356,7 +364,10 @@ impl<Impl: SelectorImpl> Visit for Selector<Impl> where Impl::NonTSPseudoClass: } } -impl<Impl: SelectorImpl> Visit for Component<Impl> where Impl::NonTSPseudoClass: Visit<Impl=Impl> { +impl<Impl: SelectorImpl> Visit for Component<Impl> +where + Impl::NonTSPseudoClass: Visit<Impl=Impl> +{ type Impl = Impl; fn visit<V>(&self, visitor: &mut V) -> bool @@ -1981,6 +1992,20 @@ pub mod tests { } } + impl parser::NonTSPseudoClass for PseudoClass { + type Impl = DummySelectorImpl; + + #[inline] + fn is_active_or_hover(&self) -> bool { + matches!(*self, PseudoClass::Active | PseudoClass::Hover) + } + + #[inline] + fn is_host(&self) -> bool { + false + } + } + impl ToCss for PseudoClass { fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write { match *self { @@ -2045,12 +2070,6 @@ pub mod tests { type BorrowedNamespaceUrl = DummyAtom; type NonTSPseudoClass = PseudoClass; type PseudoElement = PseudoElement; - - #[inline] - fn is_active_or_hover(pseudo_class: &Self::NonTSPseudoClass) -> bool { - matches!(*pseudo_class, PseudoClass::Active | - PseudoClass::Hover) - } } #[derive(Clone, Debug, Default, Eq, Hash, PartialEq)] |