static bool anyAttributeMatches(Element& element, CSSSelector::Match match, const CSSSelector& selector) { const QualifiedName& selectorAttr = selector.attribute(); ASSERT(selectorAttr.localName() != starAtom); // Should not be possible from the CSS grammar. // Synchronize the attribute in case it is lazy-computed. element.synchronizeAttribute(selectorAttr.localName()); const AtomicString& selectorValue = selector.value(); bool caseInsensitive = selector.attributeMatchType() == CSSSelector::CaseInsensitive; AttributeCollection attributes = element.attributesWithoutUpdate(); AttributeCollection::iterator end = attributes.end(); for (AttributeCollection::iterator it = attributes.begin(); it != end; ++it) { const Attribute& attributeItem = *it; if (!attributeItem.matches(selectorAttr)) continue; if (attributeValueMatches(attributeItem, match, selectorValue, !caseInsensitive)) return true; } return false; }
static bool anyAttributeMatches(const Element& element, CSSSelector::Match match, const CSSSelector& selector) { const QualifiedName& selectorAttr = selector.attribute(); ASSERT(selectorAttr.localName() != starAtom); // Should not be possible from the CSS grammar. if (match == CSSSelector::Set) return element.hasAttribute(selectorAttr); ASSERT(match == CSSSelector::Exact); const AtomicString& selectorValue = selector.value(); const AtomicString& value = element.getAttribute(selectorAttr); if (value.isNull()) return false; if (selector.attributeMatchType() == CSSSelector::CaseInsensitive) return equalIgnoringCase(selectorValue, value); return selectorValue == value; }