aboutsummaryrefslogtreecommitdiffstats
path: root/components/selectors/parser.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/selectors/parser.rs')
-rw-r--r--components/selectors/parser.rs43
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)]