Index: Source/core/css/invalidation/StyleInvalidator.cpp |
diff --git a/Source/core/css/invalidation/StyleInvalidator.cpp b/Source/core/css/invalidation/StyleInvalidator.cpp |
index 39fb027fdba4805885ac8874bede480d3cc688ce..3874c2b93e68f63610c8ad2889e925bec1a61e84 100644 |
--- a/Source/core/css/invalidation/StyleInvalidator.cpp |
+++ b/Source/core/css/invalidation/StyleInvalidator.cpp |
@@ -71,6 +71,8 @@ StyleInvalidator::~StyleInvalidator() |
void StyleInvalidator::RecursionData::pushInvalidationSet(const DescendantInvalidationSet& invalidationSet) |
{ |
ASSERT(!m_wholeSubtreeInvalid); |
+ if (invalidationSet.treeBoundaryCrossing()) |
+ m_treeBoundaryCrossing = true; |
if (invalidationSet.wholeSubtreeInvalid()) { |
m_wholeSubtreeInvalid = true; |
return; |
@@ -115,14 +117,16 @@ bool StyleInvalidator::invalidateChildren(Element& element) |
{ |
bool someChildrenNeedStyleRecalc = false; |
for (ShadowRoot* root = element.youngestShadowRoot(); root; root = root->olderShadowRoot()) { |
- for (Element* child = ElementTraversal::firstWithin(*root); child; child = ElementTraversal::nextSibling(*child)) { |
+ if (!m_recursionData.treeBoundaryCrossing() && !root->childNeedsStyleInvalidation() && !root->needsStyleInvalidation()) |
+ continue; |
+ for (Element* child = ElementTraversal::firstChild(*root); child; child = ElementTraversal::nextSibling(*child)) { |
bool childRecalced = invalidate(*child); |
someChildrenNeedStyleRecalc = someChildrenNeedStyleRecalc || childRecalced; |
} |
root->clearChildNeedsStyleInvalidation(); |
root->clearNeedsStyleInvalidation(); |
} |
- for (Element* child = ElementTraversal::firstWithin(element); child; child = ElementTraversal::nextSibling(*child)) { |
+ for (Element* child = ElementTraversal::firstChild(element); child; child = ElementTraversal::nextSibling(*child)) { |
bool childRecalced = invalidate(*child); |
someChildrenNeedStyleRecalc = someChildrenNeedStyleRecalc || childRecalced; |
} |