Index: Source/core/css/RuleFeature.cpp |
diff --git a/Source/core/css/RuleFeature.cpp b/Source/core/css/RuleFeature.cpp |
index d6c34ec9f1ae1a32f7f40b8c24521ab402ade12c..a8df5fbbf23489e113dc80a03e65bd146958f110 100644 |
--- a/Source/core/css/RuleFeature.cpp |
+++ b/Source/core/css/RuleFeature.cpp |
@@ -208,12 +208,6 @@ void RuleFeatureSet::collectFeaturesFromRuleData(const RuleData& ruleData) |
uncommonAttributeRules.append(RuleFeature(ruleData.rule(), ruleData.selectorIndex(), ruleData.hasDocumentSecurityOrigin())); |
} |
-bool RuleFeatureSet::classInvalidationRequiresSubtreeRecalc(const AtomicString& className) |
-{ |
- DescendantInvalidationSet* set = m_classInvalidationSets.get(className); |
- return set && set->wholeSubtreeInvalid(); |
-} |
- |
DescendantInvalidationSet& RuleFeatureSet::ensureClassInvalidationSet(const AtomicString& className) |
{ |
InvalidationSetMap::AddResult addResult = m_classInvalidationSets.add(className, nullptr); |
@@ -311,37 +305,16 @@ void RuleFeatureSet::clear() |
void RuleFeatureSet::scheduleStyleInvalidationForClassChange(const SpaceSplitString& changedClasses, Element* element) |
{ |
- if (computeInvalidationSetsForClassChange(changedClasses, element)) { |
- // FIXME: remove eager calls to setNeedsStyleRecalc here, and instead reuse the invalidation tree walk. |
- // This code remains for now out of conservatism about avoiding performance regressions before TargetedStyleRecalc is launched. |
- element->setNeedsStyleRecalc(SubtreeStyleChange); |
- } |
-} |
- |
-void RuleFeatureSet::scheduleStyleInvalidationForClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses, Element* element) |
-{ |
- if (computeInvalidationSetsForClassChange(oldClasses, newClasses, element)) { |
- // FIXME: remove eager calls to setNeedsStyleRecalc here, and instead reuse the invalidation tree walk. |
- // This code remains for now out of conservatism about avoiding performance regressions before TargetedStyleRecalc is launched. |
- element->setNeedsStyleRecalc(SubtreeStyleChange); |
- } |
-} |
- |
-bool RuleFeatureSet::computeInvalidationSetsForClassChange(const SpaceSplitString& changedClasses, Element* element) |
-{ |
unsigned changedSize = changedClasses.size(); |
for (unsigned i = 0; i < changedSize; ++i) { |
- if (classInvalidationRequiresSubtreeRecalc(changedClasses[i])) |
- return true; |
addClassToInvalidationSet(changedClasses[i], element); |
} |
- return false; |
} |
-bool RuleFeatureSet::computeInvalidationSetsForClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses, Element* element) |
+void RuleFeatureSet::scheduleStyleInvalidationForClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses, Element* element) |
{ |
if (!oldClasses.size()) |
- return computeInvalidationSetsForClassChange(newClasses, element); |
+ scheduleStyleInvalidationForClassChange(newClasses, element); |
// Class vectors tend to be very short. This is faster than using a hash table. |
BitVector remainingClassBits; |
@@ -359,23 +332,16 @@ bool RuleFeatureSet::computeInvalidationSetsForClassChange(const SpaceSplitStrin |
} |
} |
// Class was added. |
- if (!found) { |
- if (classInvalidationRequiresSubtreeRecalc(newClasses[i])) |
- return true; |
+ if (!found) |
addClassToInvalidationSet(newClasses[i], element); |
- } |
} |
for (unsigned i = 0; i < oldClasses.size(); ++i) { |
if (remainingClassBits.quickGet(i)) |
continue; |
- |
// Class was removed. |
- if (classInvalidationRequiresSubtreeRecalc(oldClasses[i])) |
- return true; |
addClassToInvalidationSet(oldClasses[i], element); |
} |
- return false; |
} |
void RuleFeatureSet::addClassToInvalidationSet(const AtomicString& className, Element* element) |
@@ -403,6 +369,7 @@ void RuleFeatureSet::computeStyleInvalidation(Document& document) |
} |
} |
document.clearChildNeedsStyleInvalidation(); |
+ document.clearNeedsStyleInvalidation(); |
m_pendingInvalidationMap.clear(); |
} |
@@ -426,23 +393,22 @@ bool RuleFeatureSet::invalidateStyleForClassChange(Element* element, Vector<Atom |
{ |
bool thisElementNeedsStyleRecalc = false; |
int oldSize = invalidationClasses.size(); |
- |
if (element->needsStyleInvalidation()) { |
- InvalidationList* invalidationList = m_pendingInvalidationMap.get(element); |
- ASSERT(invalidationList); |
- // FIXME: it's really only necessary to clone the render style for this element, not full style recalc. |
- thisElementNeedsStyleRecalc = true; |
- foundInvalidationSet = true; |
- for (InvalidationList::const_iterator it = invalidationList->begin(); it != invalidationList->end(); ++it) { |
- if ((*it)->wholeSubtreeInvalid()) { |
- element->setNeedsStyleRecalc(SubtreeStyleChange); |
- // Even though we have set needsStyleRecalc on the whole subtree, we need to keep walking over the subtree |
- // in order to clear the invalidation dirty bits on all elements. |
- // FIXME: we can optimize this by having a dedicated function that just traverses the tree and removes the dirty bits, |
- // without checking classes etc. |
- break; |
+ if (InvalidationList* invalidationList = m_pendingInvalidationMap.get(element)) { |
+ // FIXME: it's really only necessary to clone the render style for this element, not full style recalc. |
+ thisElementNeedsStyleRecalc = true; |
+ foundInvalidationSet = true; |
+ for (InvalidationList::const_iterator it = invalidationList->begin(); it != invalidationList->end(); ++it) { |
+ if ((*it)->wholeSubtreeInvalid()) { |
+ element->setNeedsStyleRecalc(SubtreeStyleChange); |
+ // Even though we have set needsStyleRecalc on the whole subtree, we need to keep walking over the subtree |
+ // in order to clear the invalidation dirty bits on all elements. |
+ // FIXME: we can optimize this by having a dedicated function that just traverses the tree and removes the dirty bits, |
+ // without checking classes etc. |
+ break; |
+ } |
+ (*it)->getClasses(invalidationClasses); |
} |
- (*it)->getClasses(invalidationClasses); |
} |
} |