Index: Source/core/dom/Element.cpp |
diff --git a/Source/core/dom/Element.cpp b/Source/core/dom/Element.cpp |
index 45ff5c326d6a6bf146c7c1bd35870a4174f8f4e0..9db7684cfac0b7c5e940df7325c8cb4ee07d8161 100644 |
--- a/Source/core/dom/Element.cpp |
+++ b/Source/core/dom/Element.cpp |
@@ -1045,21 +1045,24 @@ static inline bool classStringHasClassName(const AtomicString& newClassString) |
} |
template<typename Checker> |
-static bool checkSelectorForClassChange(const SpaceSplitString& changedClasses, const Checker& checker) |
+static bool checkSelectorForClassChange(const SpaceSplitString& changedClasses, const Checker& checker, Element* element) |
{ |
unsigned changedSize = changedClasses.size(); |
for (unsigned i = 0; i < changedSize; ++i) { |
- if (checker.hasSelectorForClass(changedClasses[i])) |
+ const RuleSetAnalyzer* ruleSetAnalyzer = checker.getRuleSetAnalyzer(); |
+ if (ruleSetAnalyzer) |
+ ruleSetAnalyzer->invalidateElementSubtreeForClassChange(changedClasses[i], element); |
esprehn
2014/01/14 21:32:56
I had envisioned doing this in a single pass, not
esprehn
2014/01/14 21:32:56
You ignore the return value of invalidateElementSu
chrishtr
2014/01/14 23:33:00
Done.
chrishtr
2014/01/14 23:33:00
Done.
|
+ else if (checker.hasSelectorForClass(changedClasses[i])) |
return true; |
} |
return false; |
} |
template<typename Checker> |
-static bool checkSelectorForClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses, const Checker& checker) |
+static bool checkSelectorForClassChange(const SpaceSplitString& oldClasses, const SpaceSplitString& newClasses, const Checker& checker, Element* element) |
{ |
if (!oldClasses.size()) |
- return checkSelectorForClassChange(newClasses, checker); |
+ return checkSelectorForClassChange(newClasses, checker, element); |
// Class vectors tend to be very short. This is faster than using a hash table. |
BitVector remainingClassBits; |
@@ -1077,15 +1080,25 @@ static bool checkSelectorForClassChange(const SpaceSplitString& oldClasses, cons |
} |
} |
// Class was added. |
- if (!found && checker.hasSelectorForClass(newClasses[i])) |
- return true; |
+ |
+ if (!found) { |
+ const RuleSetAnalyzer* ruleSetAnalyzer = checker.getRuleSetAnalyzer(); |
+ if (ruleSetAnalyzer) |
esprehn
2014/01/14 21:32:56
Combing if and get, if (const RuleSet.... = checke
chrishtr
2014/01/14 23:33:00
Done.
|
+ ruleSetAnalyzer->invalidateElementSubtreeForClassChange(newClasses[i], element); |
+ else if (checker.hasSelectorForClass(newClasses[i])) |
+ return true; |
+ } |
} |
for (unsigned i = 0; i < oldClasses.size(); ++i) { |
if (remainingClassBits.quickGet(i)) |
continue; |
+ |
// Class was removed. |
- if (checker.hasSelectorForClass(oldClasses[i])) |
+ const RuleSetAnalyzer* ruleSetAnalyzer = checker.getRuleSetAnalyzer(); |
+ if (ruleSetAnalyzer) |
+ ruleSetAnalyzer->invalidateElementSubtreeForClassChange(oldClasses[i], element); |
+ else if (checker.hasSelectorForClass(oldClasses[i])) |
return true; |
} |
@@ -1103,10 +1116,10 @@ void Element::classAttributeChanged(const AtomicString& newClassString) |
const SpaceSplitString oldClasses = ensureUniqueElementData()->classNames(); |
elementData()->setClass(newClassString, shouldFoldCase); |
const SpaceSplitString& newClasses = elementData()->classNames(); |
- shouldInvalidateStyle = testShouldInvalidateStyle && checkSelectorForClassChange(oldClasses, newClasses, styleResolver->ensureRuleFeatureSet()); |
+ shouldInvalidateStyle = testShouldInvalidateStyle && checkSelectorForClassChange(oldClasses, newClasses, styleResolver->ensureRuleFeatureSet(), this); |
} else if (elementData()) { |
const SpaceSplitString& oldClasses = elementData()->classNames(); |
- shouldInvalidateStyle = testShouldInvalidateStyle && checkSelectorForClassChange(oldClasses, styleResolver->ensureRuleFeatureSet()); |
+ shouldInvalidateStyle = testShouldInvalidateStyle && checkSelectorForClassChange(oldClasses, styleResolver->ensureRuleFeatureSet(), this); |
elementData()->clearClass(); |
} |
@@ -1139,11 +1152,11 @@ bool Element::shouldInvalidateDistributionWhenAttributeChanged(ElementShadow* el |
const bool shouldFoldCase = document().inQuirksMode(); |
const SpaceSplitString& oldClasses = elementData()->classNames(); |
const SpaceSplitString newClasses(newClassString, shouldFoldCase); |
- if (checkSelectorForClassChange(oldClasses, newClasses, featureSet)) |
+ if (checkSelectorForClassChange(oldClasses, newClasses, featureSet, this)) |
return true; |
} else { |
const SpaceSplitString& oldClasses = elementData()->classNames(); |
- if (checkSelectorForClassChange(oldClasses, featureSet)) |
+ if (checkSelectorForClassChange(oldClasses, featureSet, this)) |
esprehn
2014/01/14 21:32:56
These should be methods now, don't pass |this|, ju
chrishtr
2014/01/14 23:33:00
Done.
|
return true; |
} |
} |