Index: Source/core/css/invalidation/StyleInvalidator.cpp |
diff --git a/Source/core/css/invalidation/StyleInvalidator.cpp b/Source/core/css/invalidation/StyleInvalidator.cpp |
index fe400494f515777168ffb5def3c8e6dbd9129aff..665d9ac91488b9dc0e7bb37fbb97c741fa0bf0d9 100644 |
--- a/Source/core/css/invalidation/StyleInvalidator.cpp |
+++ b/Source/core/css/invalidation/StyleInvalidator.cpp |
@@ -16,18 +16,56 @@ |
namespace WebCore { |
-void StyleInvalidator::invalidate() |
+void StyleInvalidator::invalidate(Document& document) |
{ |
- if (Element* documentElement = m_document.documentElement()) |
+ if (Element* documentElement = document.documentElement()) |
invalidate(*documentElement); |
- m_document.clearChildNeedsStyleInvalidation(); |
- m_document.clearNeedsStyleInvalidation(); |
+ document.clearChildNeedsStyleInvalidation(); |
+ document.clearNeedsStyleInvalidation(); |
+ clear(); |
+} |
+ |
+void StyleInvalidator::scheduleInvalidation(PassRefPtr<DescendantInvalidationSet> invalidationSet, Element* element) |
+{ |
+ ensurePendingInvalidationList(element).append(invalidationSet); |
+ element->setNeedsStyleInvalidation(); |
+} |
+ |
+StyleInvalidator::InvalidationList& StyleInvalidator::ensurePendingInvalidationList(Element* element) |
esprehn
2014/03/31 18:20:39
by reference
chrishtr
2014/03/31 19:22:59
Done.
|
+{ |
+ PendingInvalidationMap::AddResult addResult = m_pendingInvalidationMap.add(element, nullptr); |
+ if (addResult.isNewEntry) |
+ addResult.storedValue->value = adoptPtr(new InvalidationList); |
+ return *addResult.storedValue->value; |
+} |
+ |
+void StyleInvalidator::clearStyleInvalidation(Node* node) |
+{ |
+ node->clearChildNeedsStyleInvalidation(); |
+ node->clearNeedsStyleInvalidation(); |
+ if (node->isElementNode()) |
+ m_pendingInvalidationMap.remove(toElement(node)); |
+} |
+ |
+void StyleInvalidator::clear() |
+{ |
m_pendingInvalidationMap.clear(); |
+ m_recursionData.clear(); |
esprehn
2014/03/31 18:20:39
How is it possible to have recursion data at this
chrishtr
2014/03/31 19:22:59
It should not be possible. Removed.
|
+} |
+ |
+void StyleInvalidator::RecursionData::clear(); |
+{ |
+ m_invalidationClasses.clear(); |
+ m_invalidationAttributes.clear(); |
+ m_foundInvalidationSet = false; |
+} |
+ |
+StyleInvalidator::RecursionData::RecursionData() |
+{ |
+ clear(); |
} |
-StyleInvalidator::StyleInvalidator(Document& document) |
- : m_document(document) |
- , m_pendingInvalidationMap(document.styleResolver()->ruleFeatureSet().pendingInvalidationMap()) |
+StyleInvalidator::StyleInvalidator() |
{ } |
void StyleInvalidator::RecursionData::pushInvalidationSet(const DescendantInvalidationSet& invalidationSet) |
@@ -60,10 +98,10 @@ bool StyleInvalidator::checkInvalidationSetsAgainstElement(Element& element) |
{ |
bool thisElementNeedsStyleRecalc = false; |
if (element.needsStyleInvalidation()) { |
- if (RuleFeatureSet::InvalidationList* invalidationList = m_pendingInvalidationMap.get(&element)) { |
+ 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; |
- for (RuleFeatureSet::InvalidationList::const_iterator it = invalidationList->begin(); it != invalidationList->end(); ++it) { |
+ for (InvalidationList::const_iterator it = invalidationList->begin(); it != invalidationList->end(); ++it) { |
m_recursionData.pushInvalidationSet(**it); |
if ((*it)->wholeSubtreeInvalid()) { |
element.setNeedsStyleRecalc(SubtreeStyleChange); |