pub enum Component<Impl: SelectorImpl> {
Show 28 variants
LocalName(LocalName<Impl>),
ID(Impl::Identifier),
Class(Impl::Identifier),
AttributeInNoNamespaceExists {
local_name: Impl::LocalName,
local_name_lower: Impl::LocalName,
},
AttributeInNoNamespace {
local_name: Impl::LocalName,
operator: AttrSelectorOperator,
value: Impl::AttrValue,
case_sensitivity: ParsedCaseSensitivity,
},
AttributeOther(Box<AttrSelectorWithOptionalNamespace<Impl>>),
ExplicitUniversalType,
ExplicitAnyNamespace,
ExplicitNoNamespace,
DefaultNamespace(Impl::NamespaceUrl),
Namespace(Impl::NamespacePrefix, Impl::NamespaceUrl),
Negation(Box<[Selector<Impl>]>),
Root,
Empty,
Scope,
ParentSelector,
Nth(NthSelectorData),
NthOf(NthOfSelectorData<Impl>),
NonTSPseudoClass(Impl::NonTSPseudoClass),
Slotted(Selector<Impl>),
Part(Box<[Impl::Identifier]>),
Host(Option<Selector<Impl>>),
Where(Box<[Selector<Impl>]>),
Is(Box<[Selector<Impl>]>),
Has(Box<[RelativeSelector<Impl>]>),
PseudoElement(Impl::PseudoElement),
Combinator(Combinator),
RelativeSelectorAnchor,
}
Expand description
A CSS simple selector or combinator. We store both in the same enum for optimal packing and cache performance, see [1].
[1] https://bugzilla.mozilla.org/show_bug.cgi?id=1357973
Variants§
LocalName(LocalName<Impl>)
ID(Impl::Identifier)
Class(Impl::Identifier)
AttributeInNoNamespaceExists
AttributeInNoNamespace
AttributeOther(Box<AttrSelectorWithOptionalNamespace<Impl>>)
ExplicitUniversalType
ExplicitAnyNamespace
ExplicitNoNamespace
DefaultNamespace(Impl::NamespaceUrl)
Namespace(Impl::NamespacePrefix, Impl::NamespaceUrl)
Negation(Box<[Selector<Impl>]>)
Pseudo-classes
Root
Empty
Scope
ParentSelector
Nth(NthSelectorData)
NthOf(NthOfSelectorData<Impl>)
NonTSPseudoClass(Impl::NonTSPseudoClass)
Slotted(Selector<Impl>)
The ::slotted() pseudo-element:
https://drafts.csswg.org/css-scoping/#slotted-pseudo
The selector here is a compound selector, that is, no combinators.
NOTE(emilio): This should support a list of selectors, but as of this writing no other browser does, and that allows them to put ::slotted() in the rule hash, so we do that too.
See https://github.com/w3c/csswg-drafts/issues/2158
Part(Box<[Impl::Identifier]>)
The ::part
pseudo-element.
https://drafts.csswg.org/css-shadow-parts/#part
Host(Option<Selector<Impl>>)
The :host
pseudo-class:
https://drafts.csswg.org/css-scoping/#host-selector
NOTE(emilio): This should support a list of selectors, but as of this writing no other browser does, and that allows them to put :host() in the rule hash, so we do that too.
See https://github.com/w3c/csswg-drafts/issues/2158
Where(Box<[Selector<Impl>]>)
The :where
pseudo-class.
https://drafts.csswg.org/selectors/#zero-matches
The inner argument is conceptually a SelectorList, but we move the selectors to the heap to keep Component small.
Is(Box<[Selector<Impl>]>)
The :is
pseudo-class.
https://drafts.csswg.org/selectors/#matches-pseudo
Same comment as above re. the argument.
Has(Box<[RelativeSelector<Impl>]>)
The :has
pseudo-class.
https://drafts.csswg.org/selectors/#has-pseudo
Same comment as above re. the argument.
PseudoElement(Impl::PseudoElement)
An implementation-dependent pseudo-element selector.
Combinator(Combinator)
RelativeSelectorAnchor
Used only for relative selectors, which starts with a combinator (With an implied descendant combinator if not specified).
https://drafts.csswg.org/selectors-4/#typedef-relative-selector
Implementations§
source§impl<Impl: SelectorImpl> Component<Impl>
impl<Impl: SelectorImpl> Component<Impl>
sourcepub fn is_combinator(&self) -> bool
pub fn is_combinator(&self) -> bool
Returns true if this is a combinator.
sourcepub fn as_combinator(&self) -> Option<Combinator>
pub fn as_combinator(&self) -> Option<Combinator>
Returns the value as a combinator if applicable, None otherwise.
sourcepub fn maybe_allowed_after_pseudo_element(&self) -> bool
pub fn maybe_allowed_after_pseudo_element(&self) -> bool
Whether this component is valid after a pseudo-element. Only intended for sanity-checking.
sourcefn matches_for_stateless_pseudo_element(&self) -> bool
fn matches_for_stateless_pseudo_element(&self) -> bool
Whether a given selector should match for stateless pseudo-elements.
This is a bit subtle: Only selectors that return true in
maybe_allowed_after_pseudo_element
should end up here, and
NonTSPseudoClass
never matches (as it is a stateless pseudo after
all).