Index: Source/core/css/invalidation/StyleInvalidator.cpp |
diff --git a/Source/core/css/invalidation/StyleInvalidator.cpp b/Source/core/css/invalidation/StyleInvalidator.cpp |
index cefc3d7b17650398f523f56d1e6adc0d4ec46b8d..8687cd29c5e9ff4c492318b9b0d683af1bd74aae 100644 |
--- a/Source/core/css/invalidation/StyleInvalidator.cpp |
+++ b/Source/core/css/invalidation/StyleInvalidator.cpp |
@@ -74,6 +74,8 @@ void StyleInvalidator::RecursionData::pushInvalidationSet(const DescendantInvali |
ASSERT(!m_wholeSubtreeInvalid); |
if (invalidationSet.treeBoundaryCrossing()) |
m_treeBoundaryCrossing = true; |
+ if (invalidationSet.insertionPointCrossing()) |
+ m_insertionPointCrossing = true; |
if (invalidationSet.wholeSubtreeInvalid()) { |
m_wholeSubtreeInvalid = true; |
return; |
@@ -89,6 +91,9 @@ bool StyleInvalidator::RecursionData::matchesCurrentInvalidationSets(Element& el |
if (m_invalidateCustomPseudo && element.shadowPseudoId() != nullAtom) |
return true; |
+ if (m_insertionPointCrossing && element.isInsertionPoint()) |
+ return true; |
+ |
for (InvalidationSets::iterator it = m_invalidationSets.begin(); it != m_invalidationSets.end(); ++it) { |
if ((*it)->invalidatesElement(element)) |
return true; |
@@ -154,6 +159,12 @@ bool StyleInvalidator::invalidate(Element& element, StyleInvalidator::RecursionD |
element.setNeedsStyleRecalc(LocalStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::StyleInvalidator)); |
} |
+ if (recursionData.insertionPointCrossing() && element.isInsertionPoint()) { |
+ const InsertionPoint& insertionPoint = toInsertionPoint(element); |
+ for (size_t i = 0; i < insertionPoint.size(); ++i) |
+ insertionPoint.at(i)->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::StyleInvalidator)); |
+ } |
+ |
element.clearChildNeedsStyleInvalidation(); |
element.clearNeedsStyleInvalidation(); |