| Index: Source/core/dom/StyleEngine.cpp
|
| diff --git a/Source/core/dom/StyleEngine.cpp b/Source/core/dom/StyleEngine.cpp
|
| index ac5e5483b9738c51603dde1240db6929fcf893c5..f11ec376f94dfde6d8c5b23643892dcda18348c3 100644
|
| --- a/Source/core/dom/StyleEngine.cpp
|
| +++ b/Source/core/dom/StyleEngine.cpp
|
| @@ -36,6 +36,7 @@
|
| #include "core/css/resolver/ScopedStyleResolver.h"
|
| #include "core/dom/DocumentStyleSheetCollector.h"
|
| #include "core/dom/Element.h"
|
| +#include "core/dom/ElementTraversal.h"
|
| #include "core/dom/ProcessingInstruction.h"
|
| #include "core/dom/ShadowTreeStyleSheetCollection.h"
|
| #include "core/dom/shadow/ShadowRoot.h"
|
| @@ -628,18 +629,17 @@ void StyleEngine::platformColorsChanged()
|
| void StyleEngine::classChangedForElement(const SpaceSplitString& changedClasses, Element& element)
|
| {
|
| ASSERT(isMaster());
|
| - InvalidationSetVector invalidationSets;
|
| + InvalidationSetVector descendant, sibling;
|
| unsigned changedSize = changedClasses.size();
|
| RuleFeatureSet& ruleFeatureSet = ensureResolver().ensureUpdatedRuleFeatureSet();
|
| for (unsigned i = 0; i < changedSize; ++i)
|
| - ruleFeatureSet.collectInvalidationSetsForClass(invalidationSets, element, changedClasses[i]);
|
| - scheduleInvalidationSetsForElement(invalidationSets, element);
|
| + ruleFeatureSet.collectInvalidationSetsForClass(descendant, sibling, element, changedClasses[i]);
|
| + scheduleInvalidationSetsForElement(descendant, sibling, element);
|
| }
|
|
|
| void StyleEngine::classChangedForElement(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses, Element& element)
|
| {
|
| ASSERT(isMaster());
|
| - InvalidationSetVector invalidationSets;
|
| if (!oldClasses.size()) {
|
| classChangedForElement(newClasses, element);
|
| return;
|
| @@ -649,6 +649,7 @@ void StyleEngine::classChangedForElement(const SpaceSplitString& oldClasses, con
|
| BitVector remainingClassBits;
|
| remainingClassBits.ensureSize(oldClasses.size());
|
|
|
| + InvalidationSetVector descendant, sibling;
|
| RuleFeatureSet& ruleFeatureSet = ensureResolver().ensureUpdatedRuleFeatureSet();
|
|
|
| for (unsigned i = 0; i < newClasses.size(); ++i) {
|
| @@ -664,51 +665,54 @@ void StyleEngine::classChangedForElement(const SpaceSplitString& oldClasses, con
|
| }
|
| // Class was added.
|
| if (!found)
|
| - ruleFeatureSet.collectInvalidationSetsForClass(invalidationSets, element, newClasses[i]);
|
| + ruleFeatureSet.collectInvalidationSetsForClass(descendant, sibling, element, newClasses[i]);
|
| }
|
|
|
| for (unsigned i = 0; i < oldClasses.size(); ++i) {
|
| if (remainingClassBits.quickGet(i))
|
| continue;
|
| // Class was removed.
|
| - ruleFeatureSet.collectInvalidationSetsForClass(invalidationSets, element, oldClasses[i]);
|
| + ruleFeatureSet.collectInvalidationSetsForClass(descendant, sibling, element, oldClasses[i]);
|
| }
|
|
|
| - scheduleInvalidationSetsForElement(invalidationSets, element);
|
| + scheduleInvalidationSetsForElement(descendant, sibling, element);
|
| }
|
|
|
| void StyleEngine::attributeChangedForElement(const QualifiedName& attributeName, Element& element)
|
| {
|
| ASSERT(isMaster());
|
| - InvalidationSetVector invalidationSets;
|
| - ensureResolver().ensureUpdatedRuleFeatureSet().collectInvalidationSetsForAttribute(invalidationSets, element, attributeName);
|
| - scheduleInvalidationSetsForElement(invalidationSets, element);
|
| + InvalidationSetVector descendant, sibling;
|
| + ensureResolver().ensureUpdatedRuleFeatureSet().collectInvalidationSetsForAttribute(descendant, sibling, element, attributeName);
|
| + scheduleInvalidationSetsForElement(descendant, sibling, element);
|
| }
|
|
|
| void StyleEngine::idChangedForElement(const AtomicString& oldId, const AtomicString& newId, Element& element)
|
| {
|
| ASSERT(isMaster());
|
| - InvalidationSetVector invalidationSets;
|
| + InvalidationSetVector descendant, sibling;
|
| RuleFeatureSet& ruleFeatureSet = ensureResolver().ensureUpdatedRuleFeatureSet();
|
| if (!oldId.isEmpty())
|
| - ruleFeatureSet.collectInvalidationSetsForId(invalidationSets, element, oldId);
|
| + ruleFeatureSet.collectInvalidationSetsForId(descendant, sibling, element, oldId);
|
| if (!newId.isEmpty())
|
| - ruleFeatureSet.collectInvalidationSetsForId(invalidationSets, element, newId);
|
| - scheduleInvalidationSetsForElement(invalidationSets, element);
|
| + ruleFeatureSet.collectInvalidationSetsForId(descendant, sibling, element, newId);
|
| + scheduleInvalidationSetsForElement(descendant, sibling, element);
|
| }
|
|
|
| void StyleEngine::pseudoStateChangedForElement(CSSSelector::PseudoType pseudoType, Element& element)
|
| {
|
| ASSERT(isMaster());
|
| - InvalidationSetVector invalidationSets;
|
| - ensureResolver().ensureUpdatedRuleFeatureSet().collectInvalidationSetsForPseudoClass(invalidationSets, element, pseudoType);
|
| - scheduleInvalidationSetsForElement(invalidationSets, element);
|
| + InvalidationSetVector descendant, sibling;
|
| + ensureResolver().ensureUpdatedRuleFeatureSet().collectInvalidationSetsForPseudoClass(descendant, sibling, element, pseudoType);
|
| + scheduleInvalidationSetsForElement(descendant, sibling, element);
|
| }
|
|
|
| -void StyleEngine::scheduleInvalidationSetsForElement(const InvalidationSetVector& invalidationSets, Element& element)
|
| +void StyleEngine::scheduleInvalidationSetsForElement(const InvalidationSetVector& descendant, const InvalidationSetVector& sibling, Element& element)
|
| {
|
| - for (auto invalidationSet : invalidationSets)
|
| - m_styleInvalidator.scheduleInvalidation(invalidationSet, element);
|
| + for (auto& invalidationSet : descendant)
|
| + m_styleInvalidator.scheduleInvalidation(invalidationSet, element, InvalidateDescendants);
|
| +
|
| + for (auto& invalidationSet : sibling)
|
| + m_styleInvalidator.scheduleInvalidation(invalidationSet, element, InvalidateSiblings);
|
| }
|
|
|
| DEFINE_TRACE(StyleEngine)
|
|
|