Index: Source/core/css/RuleFeature.cpp |
diff --git a/Source/core/css/RuleFeature.cpp b/Source/core/css/RuleFeature.cpp |
index 4d684e9be2156d84322f107762da3d161389ca9b..0a91ffe656f8e63d530c024d6851e5b166ae762c 100644 |
--- a/Source/core/css/RuleFeature.cpp |
+++ b/Source/core/css/RuleFeature.cpp |
@@ -128,16 +128,44 @@ RuleFeatureSet::InvalidationSetMode RuleFeatureSet::invalidationSetModeForSelect |
if (component->match() == CSSSelector::Class || component->match() == CSSSelector::Id |
|| (component->match() == CSSSelector::Tag && component->tagQName().localName() != starAtom) |
|| component->isAttributeSelector() || component->isCustomPseudoElement()) { |
- if (!foundCombinator) |
+ if (!foundCombinator) { |
+ // We have found an invalidation set feature in the rightmost compound selector. |
foundIdent = true; |
+ } |
} else if (component->pseudoType() == CSSSelector::PseudoHost || component->pseudoType() == CSSSelector::PseudoAny) { |
if (const CSSSelectorList* selectorList = component->selectorList()) { |
+ bool foundUniversal = false; |
for (const CSSSelector* selector = selectorList->first(); selector; selector = CSSSelectorList::next(*selector)) { |
- InvalidationSetMode hostMode = invalidationSetModeForSelector(*selector); |
- if (hostMode == UseSubtreeStyleChange) |
+ // Find the invalidation set mode for each of the selectors in the selector list |
+ // of a :not(), :host(), etc. For instance, ".x :-webkit-any(.a, .b)" yields an |
+ // AddFeatures mode for both ".a" and ".b". ":-webkit-any(.a, *)" yields AddFeatures |
+ // for ".a", but UseSubtreeStyleChange for "*". One sub-selector without invalidation |
+ // set features is sufficient to cause the selector to be a universal selector as far |
+ // the invalidation set is concerned. |
+ InvalidationSetMode subSelectorMode = invalidationSetModeForSelector(*selector); |
+ |
+ // The sub-selector contained something unskippable, fall back to whole subtree |
+ // recalcs in collectFeaturesFromSelector. subSelectorMode will return |
+ // UseSubtreeStyleChange since there are no combinators inside the selector list, |
+ // so translate it to UseLocalStyleChange if a combinator has been seen in the |
+ // outer context. |
+ // |
+ // FIXME: Is UseSubtreeStyleChange ever needed as input to collectFeaturesFromSelector? |
+ // That is, are there any selectors for which we need to use SubtreeStyleChange for |
+ // changing features when present in the rightmost compound selector? |
+ if (subSelectorMode == UseSubtreeStyleChange) |
return foundCombinator ? UseLocalStyleChange : UseSubtreeStyleChange; |
- if (!foundCombinator && hostMode == AddFeatures) |
- foundIdent = true; |
+ |
+ // We found no features in the sub-selector, only skippable ones (foundIdent was |
+ // false at the end of this method). That is a universal selector as far as the |
+ // invalidation set is concerned. |
+ if (subSelectorMode == UseLocalStyleChange) |
+ foundUniversal = true; |
+ } |
+ if (!foundUniversal && !foundCombinator) { |
+ // All sub-selectors contained invalidation set features and |
+ // we are in the rightmost compound selector. |
+ foundIdent = true; |
} |
} |
} else if (!isSkippableComponentForInvalidation(*component)) { |