Chromium Code Reviews| Index: Source/core/css/RuleFeature.cpp |
| diff --git a/Source/core/css/RuleFeature.cpp b/Source/core/css/RuleFeature.cpp |
| index 73199ddf1a740df8c9d810b36ea5615e65f032fc..6db203a82999f742580d383b7f50b16965505558 100644 |
| --- a/Source/core/css/RuleFeature.cpp |
| +++ b/Source/core/css/RuleFeature.cpp |
| @@ -100,7 +100,7 @@ static bool isSkippableComponentForInvalidation(const CSSSelector& selector) |
| } |
| // This method is somewhat conservative in what it accepts. |
| -static bool supportsClassDescendantInvalidation(const CSSSelector& selector) |
| +RuleFeatureSet::InvalidationMode RuleFeatureSet::supportsClassDescendantInvalidation(const CSSSelector& selector) |
| { |
| bool foundDescendantRelation = false; |
| bool foundIdent = false; |
| @@ -114,7 +114,7 @@ static bool supportsClassDescendantInvalidation(const CSSSelector& selector) |
| if (!foundDescendantRelation) |
| foundIdent = true; |
| } else if (!isSkippableComponentForInvalidation(*component)) { |
| - return false; |
| + return foundDescendantRelation ? UseLocalStyleChange : UseSubtreeStyleChange; |
| } |
| // FIXME: We can probably support ShadowAll and ShadowDeep. |
| switch (component->relation()) { |
| @@ -125,10 +125,10 @@ static bool supportsClassDescendantInvalidation(const CSSSelector& selector) |
| case CSSSelector::SubSelector: |
| continue; |
| default: |
| - return false; |
| + return UseLocalStyleChange; |
| } |
| } |
| - return foundIdent; |
| + return foundIdent ? UseInvalidationSets : UseLocalStyleChange; |
| } |
| void extractClassIdOrTag(const CSSSelector& selector, Vector<AtomicString>& classes, AtomicString& id, AtomicString& tagName) |
| @@ -146,10 +146,11 @@ RuleFeatureSet::RuleFeatureSet() |
| { |
| } |
| -bool RuleFeatureSet::updateClassInvalidationSets(const CSSSelector& selector) |
| +RuleFeatureSet::InvalidationMode RuleFeatureSet::updateClassInvalidationSets(const CSSSelector& selector) |
| { |
| - if (!supportsClassDescendantInvalidation(selector)) |
| - return false; |
| + InvalidationMode mode = supportsClassDescendantInvalidation(selector); |
| + if (mode != UseInvalidationSets) |
| + return mode; |
| Vector<AtomicString> classes; |
| AtomicString id; |
| @@ -165,7 +166,7 @@ bool RuleFeatureSet::updateClassInvalidationSets(const CSSSelector& selector) |
| } |
| if (!lastSelector) |
| - return true; |
| + return UseInvalidationSets; |
| for (const CSSSelector* current = lastSelector->tagHistory(); current; current = current->tagHistory()) { |
| if (current->m_match == CSSSelector::Class) { |
| @@ -179,7 +180,7 @@ bool RuleFeatureSet::updateClassInvalidationSets(const CSSSelector& selector) |
| } |
| } |
| } |
| - return true; |
| + return UseInvalidationSets; |
| } |
| void RuleFeatureSet::addAttributeInASelector(const AtomicString& attributeName) |
| @@ -190,16 +191,11 @@ void RuleFeatureSet::addAttributeInASelector(const AtomicString& attributeName) |
| void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData) |
| { |
| FeatureMetadata metadata; |
| - bool selectorUsesClassInvalidationSet = false; |
| + InvalidationMode mode = UseSubtreeStyleChange; |
| if (m_targetedStyleRecalcEnabled) |
| - selectorUsesClassInvalidationSet = updateClassInvalidationSets(ruleData.selector()); |
| - |
| - SelectorFeatureCollectionMode collectionMode; |
| - if (selectorUsesClassInvalidationSet) |
| - collectionMode = DontProcessClasses; |
| - else |
| - collectionMode = ProcessClasses; |
| - collectFeaturesFromSelector(ruleData.selector(), metadata, collectionMode); |
| + mode = updateClassInvalidationSets(ruleData.selector()); |
| + |
| + collectFeaturesFromSelector(ruleData.selector(), metadata, mode); |
| m_metadata.add(metadata); |
| if (metadata.foundSiblingSelector) |
| @@ -218,19 +214,20 @@ DescendantInvalidationSet& RuleFeatureSet::ensureClassInvalidationSet(const Atom |
| void RuleFeatureSet::collectFeaturesFromSelector(const CSSSelector& selector) |
| { |
| - collectFeaturesFromSelector(selector, m_metadata, ProcessClasses); |
| + collectFeaturesFromSelector(selector, m_metadata, UseSubtreeStyleChange); |
| } |
| -void RuleFeatureSet::collectFeaturesFromSelector(const CSSSelector& selector, RuleFeatureSet::FeatureMetadata& metadata, SelectorFeatureCollectionMode collectionMode) |
| +void RuleFeatureSet::collectFeaturesFromSelector(const CSSSelector& selector, RuleFeatureSet::FeatureMetadata& metadata, InvalidationMode mode) |
| { |
| unsigned maxDirectAdjacentSelectors = 0; |
| for (const CSSSelector* current = &selector; current; current = current->tagHistory()) { |
| if (current->m_match == CSSSelector::Id) { |
| metadata.idsInRules.add(current->value()); |
| - } else if (current->m_match == CSSSelector::Class && collectionMode == ProcessClasses) { |
| + } else if (current->m_match == CSSSelector::Class && mode != UseInvalidationSets) { |
|
esprehn
2014/03/13 23:28:13
This is confusing since you're saying "mode is not
rune
2014/03/14 13:01:19
Renamed now.
|
| DescendantInvalidationSet& invalidationSet = ensureClassInvalidationSet(current->value()); |
| - invalidationSet.setWholeSubtreeInvalid(); |
| + if (mode == UseSubtreeStyleChange) |
| + invalidationSet.setWholeSubtreeInvalid(); |
| } else if (current->isAttributeSelector()) { |
| metadata.attrsInRules.add(current->attribute().localName()); |
| } |
| @@ -246,19 +243,22 @@ void RuleFeatureSet::collectFeaturesFromSelector(const CSSSelector& selector, Ru |
| if (current->isSiblingSelector()) |
| metadata.foundSiblingSelector = true; |
| - collectFeaturesFromSelectorList(current->selectorList(), metadata, collectionMode); |
| + collectFeaturesFromSelectorList(current->selectorList(), metadata, mode); |
| + |
| + if (mode == UseLocalStyleChange && current->relation() != CSSSelector::SubSelector) |
| + mode = UseSubtreeStyleChange; |
| } |
| ASSERT(!maxDirectAdjacentSelectors); |
| } |
| -void RuleFeatureSet::collectFeaturesFromSelectorList(const CSSSelectorList* selectorList, RuleFeatureSet::FeatureMetadata& metadata, SelectorFeatureCollectionMode collectionMode) |
| +void RuleFeatureSet::collectFeaturesFromSelectorList(const CSSSelectorList* selectorList, RuleFeatureSet::FeatureMetadata& metadata, InvalidationMode mode) |
| { |
| if (!selectorList) |
| return; |
| for (const CSSSelector* selector = selectorList->first(); selector; selector = CSSSelectorList::next(*selector)) |
| - collectFeaturesFromSelector(*selector, metadata, collectionMode); |
| + collectFeaturesFromSelector(*selector, metadata, mode); |
| } |
| void RuleFeatureSet::FeatureMetadata::add(const FeatureMetadata& other) |