Chromium Code Reviews| 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; |
| } |
| } |