| 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;
|
| }
|
|
|