Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(729)

Unified Diff: Source/core/dom/Element.cpp

Issue 129633003: Add a first pass of a class descendant invalidator, and a containing RuleSetAnalyzer (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Removed extra line. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}
}

Powered by Google App Engine
This is Rietveld 408576698