bool SelectorChecker::checkOne(const SelectorCheckingContext& context) const { ASSERT(context.element); Element& element = *context.element; ASSERT(context.selector); const CSSSelector& selector = *context.selector; switch (selector.match()) { case CSSSelector::Tag: return tagMatches(element, selector.tagQName()); case CSSSelector::Class: return element.hasClass() && element.classNames().contains(selector.value()); case CSSSelector::Id: return element.hasID() && element.idForStyleResolution() == selector.value(); case CSSSelector::Exact: case CSSSelector::Set: case CSSSelector::Hyphen: case CSSSelector::List: case CSSSelector::Contain: case CSSSelector::Begin: case CSSSelector::End: return anyAttributeMatches(element, selector.match(), selector); case CSSSelector::PseudoClass: return checkPseudoClass(context); // FIXME(sky): Remove pseudo elements completely. case CSSSelector::PseudoElement: case CSSSelector::Unknown: return false; } ASSERT_NOT_REACHED(); return false; }
bool SelectorChecker::checkOne(const CSSSelector& selector) { switch (selector.match()) { case CSSSelector::Tag: { const AtomicString& localName = selector.tagQName().localName(); return localName == starAtom || localName == m_element.localName(); } case CSSSelector::Class: return m_element.hasClass() && m_element.classNames().contains(selector.value()); case CSSSelector::Id: return m_element.hasID() && m_element.idForStyleResolution() == selector.value(); case CSSSelector::Exact: case CSSSelector::Set: if (anyAttributeMatches(m_element, selector.match(), selector)) { m_matchedAttributeSelector = true; return true; } return false; case CSSSelector::PseudoClass: return checkPseudoClass(selector); // FIXME(sky): Remove pseudo elements completely. case CSSSelector::PseudoElement: case CSSSelector::Unknown: return false; } ASSERT_NOT_REACHED(); return false; }