inline bool SelectorDataList::selectorMatches(const SelectorData& selectorData, Element& element, const ContainerNode& rootNode) const { SelectorChecker selectorChecker(element.document()); SelectorChecker::CheckingContext selectorCheckingContext(SelectorChecker::Mode::QueryingRules); selectorCheckingContext.scope = rootNode.isDocumentNode() ? nullptr : &rootNode; unsigned ignoredSpecificity; return selectorChecker.match(*selectorData.selector, element, selectorCheckingContext, ignoredSpecificity); }
inline bool SelectorDataList::selectorMatches(const CSSSelector& selector, Element& element, const ContainerNode& rootNode) const { SelectorChecker selectorChecker(element.document(), SelectorChecker::QueryingRules); SelectorChecker::SelectorCheckingContext selectorCheckingContext(selector, &element, SelectorChecker::VisitedMatchDisabled); selectorCheckingContext.behaviorAtBoundary = SelectorChecker::StaysWithinTreeScope; selectorCheckingContext.scope = !rootNode.isDocumentNode() ? &rootNode : 0; if (selectorCheckingContext.scope) selectorCheckingContext.behaviorAtBoundary = static_cast<SelectorChecker::BehaviorAtBoundary>(SelectorChecker::StaysWithinTreeScope | SelectorChecker::ScopeContainsLastMatchedElement); return selectorChecker.match(selectorCheckingContext, DOMSiblingTraversalStrategy()) == SelectorChecker::SelectorMatches; }
inline bool SelectorDataList::selectorMatches(const CSSSelector& selector, Element& element, const ContainerNode& rootNode) const { SelectorChecker selectorChecker(SelectorChecker::QueryingRules); SelectorChecker::SelectorCheckingContext selectorCheckingContext(&element, SelectorChecker::VisitedMatchDisabled); selectorCheckingContext.selector = &selector; selectorCheckingContext.scope = !rootNode.isDocumentNode() ? &rootNode : nullptr; if (selectorCheckingContext.scope) selectorCheckingContext.scopeContainsLastMatchedElement = true; return selectorChecker.match(selectorCheckingContext); }
inline Element* SelectorDataList::selectorClosest(const SelectorData& selectorData, Element& element, const ContainerNode& rootNode) const { SelectorChecker selectorChecker(element.document()); SelectorChecker::CheckingContext selectorCheckingContext(SelectorChecker::Mode::QueryingRules); selectorCheckingContext.scope = rootNode.isDocumentNode() ? nullptr : &rootNode; Element* currentNode = &element; unsigned ignoredSpecificity; if (!selectorChecker.match(selectorData.selector, currentNode, selectorCheckingContext, ignoredSpecificity)) return nullptr; return currentNode; }
inline bool SelectorDataList::selectorMatches(const SelectorData& selectorData, Element& element, const ContainerNode& rootNode) const { if (selectorData.isFastCheckable && !element.isSVGElement()) { SelectorCheckerFastPath selectorCheckerFastPath(selectorData.selector, &element); if (!selectorCheckerFastPath.matchesRightmostSelector(SelectorChecker::VisitedMatchDisabled)) return false; return selectorCheckerFastPath.matches(); } SelectorChecker selectorChecker(element.document(), SelectorChecker::QueryingRules); SelectorChecker::SelectorCheckingContext selectorCheckingContext(selectorData.selector, &element, SelectorChecker::VisitedMatchDisabled); selectorCheckingContext.scope = rootNode.isDocumentNode() ? nullptr : &rootNode; return selectorChecker.match(selectorCheckingContext); }
inline bool SelectorDataList::selectorMatches(const SelectorData& selectorData, Element& element, const ContainerNode& rootNode) const { if (selectorData.isFastCheckable && !element.isSVGElement()) { SelectorCheckerFastPath selectorCheckerFastPath(selectorData.selector, element); if (!selectorCheckerFastPath.matchesRightmostSelector(SelectorChecker::VisitedMatchDisabled)) return false; return selectorCheckerFastPath.matches(); } SelectorChecker selectorChecker(element.document(), SelectorChecker::QueryingRules); SelectorChecker::SelectorCheckingContext selectorCheckingContext(selectorData.selector, &element, SelectorChecker::VisitedMatchDisabled); selectorCheckingContext.behaviorAtBoundary = SelectorChecker::StaysWithinTreeScope; selectorCheckingContext.scope = !rootNode.isDocumentNode() ? &rootNode : 0; return selectorChecker.match(selectorCheckingContext, DOMSiblingTraversalStrategy()) == SelectorChecker::SelectorMatches; }
inline bool SelectorDataList::selectorMatches(const SelectorData& selectorData, Element* element, const Node* rootNode) const { if (selectorData.isFastCheckable && !element->isSVGElement()) { SelectorCheckerFastPath selectorCheckerFastPath(selectorData.selector, element); if (!selectorCheckerFastPath.matchesRightmostSelector(SelectorChecker::VisitedMatchDisabled)) return false; return selectorCheckerFastPath.matches(); } SelectorChecker selectorChecker(element->document(), SelectorChecker::QueryingRules); SelectorChecker::SelectorCheckingContext selectorCheckingContext(selectorData.selector, element, SelectorChecker::VisitedMatchDisabled); selectorCheckingContext.behaviorAtBoundary = SelectorChecker::StaysWithinTreeScope; selectorCheckingContext.scope = !rootNode->isDocumentNode() && rootNode->isContainerNode() ? toContainerNode(rootNode) : 0; PseudoId ignoreDynamicPseudo = NOPSEUDO; return selectorChecker.match(selectorCheckingContext, ignoreDynamicPseudo) == SelectorChecker::SelectorMatches; }