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; }
bool operator()(const CSSSelector& selector) { if (selector.match() == CSSSelector::Tag && selector.tagQName().prefix() != nullAtom && selector.tagQName().prefix() != starAtom) return true; if (selector.isAttributeSelector() && selector.attribute().prefix() != nullAtom && selector.attribute().prefix() != starAtom) return true; return false; }
void RuleFeatureSet::extractInvalidationSetFeature(const CSSSelector& selector, InvalidationSetFeatures& features) { if (selector.m_match == CSSSelector::Tag) features.tagName = selector.tagQName().localName(); else if (selector.m_match == CSSSelector::Id) features.id = selector.value(); else if (selector.m_match == CSSSelector::Class) features.classes.append(selector.value()); else if (selector.isAttributeSelector()) features.attributes.append(selector.attribute().localName()); else if (selector.isCustomPseudoElement()) features.customPseudoElement = true; }
bool RuleFeatureSet::extractInvalidationSetFeature(const CSSSelector& selector, InvalidationSetFeatures& features) { if (selector.match() == CSSSelector::Tag && selector.tagQName().localName() != starAtom) features.tagName = selector.tagQName().localName(); else if (selector.match() == CSSSelector::Id) features.id = selector.value(); else if (selector.match() == CSSSelector::Class) features.classes.append(selector.value()); else if (selector.isAttributeSelector()) features.attributes.append(selector.attribute().localName()); else if (selector.pseudoType() == CSSSelector::PseudoWebKitCustomElement) features.customPseudoElement = true; else if (selector.pseudoType() == CSSSelector::PseudoBefore || selector.pseudoType() == CSSSelector::PseudoAfter) features.hasBeforeOrAfter = true; else return false; return true; }
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; }
static bool canBeUsedForIdFastPath(const CSSSelector& selector) { return selector.match() == CSSSelector::Id || (selector.match() == CSSSelector::Exact && selector.attribute() == HTMLNames::idAttr && !selector.attributeValueMatchingIsCaseInsensitive()); }