| Index: Source/core/css/RuleFeature.cpp
|
| diff --git a/Source/core/css/RuleFeature.cpp b/Source/core/css/RuleFeature.cpp
|
| index 26aea450ff0eeee0dc418e2384698ddb8d7683e9..75af986dfdf2af2346bf9c8d28c999733361c3c0 100644
|
| --- a/Source/core/css/RuleFeature.cpp
|
| +++ b/Source/core/css/RuleFeature.cpp
|
| @@ -119,44 +119,30 @@ void RuleFeature::trace(Visitor* visitor)
|
| // This method is somewhat conservative in what it accepts.
|
| RuleFeatureSet::InvalidationSetMode RuleFeatureSet::invalidationSetModeForSelector(const CSSSelector& selector)
|
| {
|
| - bool foundDescendantRelation = false;
|
| + bool foundCombinator = false;
|
| bool foundIdent = false;
|
| for (const CSSSelector* component = &selector; component; component = component->tagHistory()) {
|
|
|
| if (component->match() == CSSSelector::Class || component->match() == CSSSelector::Id
|
| || (component->match() == CSSSelector::Tag && component->tagQName().localName() != starAtom)
|
| || component->isAttributeSelector() || component->isCustomPseudoElement()) {
|
| - if (!foundDescendantRelation)
|
| + if (!foundCombinator)
|
| foundIdent = true;
|
| } else if (component->pseudoType() == CSSSelector::PseudoHost || component->pseudoType() == CSSSelector::PseudoAny) {
|
| if (const CSSSelectorList* selectorList = component->selectorList()) {
|
| for (const CSSSelector* selector = selectorList->first(); selector; selector = CSSSelectorList::next(*selector)) {
|
| InvalidationSetMode hostMode = invalidationSetModeForSelector(*selector);
|
| if (hostMode == UseSubtreeStyleChange)
|
| - return foundDescendantRelation ? UseLocalStyleChange : UseSubtreeStyleChange;
|
| - if (!foundDescendantRelation && hostMode == AddFeatures)
|
| + return foundCombinator ? UseLocalStyleChange : UseSubtreeStyleChange;
|
| + if (!foundCombinator && hostMode == AddFeatures)
|
| foundIdent = true;
|
| }
|
| }
|
| } else if (!isSkippableComponentForInvalidation(*component)) {
|
| - return foundDescendantRelation ? UseLocalStyleChange : UseSubtreeStyleChange;
|
| - }
|
| - switch (component->relation()) {
|
| - case CSSSelector::Descendant:
|
| - case CSSSelector::Child:
|
| - case CSSSelector::ShadowPseudo:
|
| - case CSSSelector::ShadowDeep:
|
| - foundDescendantRelation = true;
|
| - // Fall through!
|
| - case CSSSelector::SubSelector:
|
| - case CSSSelector::DirectAdjacent:
|
| - case CSSSelector::IndirectAdjacent:
|
| - continue;
|
| - default:
|
| - // All combinators should be handled above.
|
| - ASSERT_NOT_REACHED();
|
| - return UseLocalStyleChange;
|
| + return foundCombinator ? UseLocalStyleChange : UseSubtreeStyleChange;
|
| }
|
| + if (component->relation() != CSSSelector::SubSelector)
|
| + foundCombinator = true;
|
| }
|
| return foundIdent ? AddFeatures : UseLocalStyleChange;
|
| }
|
|
|