Index: Source/core/dom/ContainerNode.cpp |
diff --git a/Source/core/dom/ContainerNode.cpp b/Source/core/dom/ContainerNode.cpp |
index d70e39e2f626376c4ac1739efc79423c41ab39f7..84f313231a43233e5e35d4e1b4f7d396b4e287a9 100644 |
--- a/Source/core/dom/ContainerNode.cpp |
+++ b/Source/core/dom/ContainerNode.cpp |
@@ -1289,20 +1289,18 @@ void ContainerNode::checkForSiblingStyleChanges(SiblingCheckType changeType, Nod |
ASSERT(changeType != FinishedParsingChildren); |
// Find our new first child element. |
Element* firstChildElement = ElementTraversal::firstChild(*this); |
- RenderStyle* firstChildElementStyle = firstChildElement ? firstChildElement->renderStyle() : nullptr; |
// Find the first element after the change. |
Element* elementAfterChange = nodeAfterChange->isElementNode() ? toElement(nodeAfterChange) : ElementTraversal::nextSibling(*nodeAfterChange); |
- RenderStyle* elementAfterChangeStyle = elementAfterChange ? elementAfterChange->renderStyle() : nullptr; |
// This is the element insertion as first child element case. |
- if (firstChildElement != elementAfterChange && elementAfterChangeStyle && elementAfterChangeStyle->firstChildState()) { |
- ASSERT(changeType == SiblingElementInserted); |
+ if (changeType == SiblingElementInserted && elementAfterChange && firstChildElement != elementAfterChange |
+ && (!nodeBeforeChange || !nodeBeforeChange->isElementNode()) && elementAfterChange->affectedByFirstChildRules()) { |
elementAfterChange->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::SiblingSelector)); |
rune
2014/11/26 15:14:05
Since the flag is not cleared for every recalc, fa
|
} |
// This is the first child element removal case. |
- if (changeType == SiblingElementRemoved && firstChildElement == elementAfterChange && firstChildElement && (!firstChildElementStyle || !firstChildElementStyle->firstChildState())) |
+ if (changeType == SiblingElementRemoved && firstChildElement == elementAfterChange && firstChildElement && firstChildElement->affectedByFirstChildRules()) |
firstChildElement->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::SiblingSelector)); |
} |
@@ -1311,21 +1309,19 @@ void ContainerNode::checkForSiblingStyleChanges(SiblingCheckType changeType, Nod |
if (childrenAffectedByLastChildRules() && nodeBeforeChange) { |
// Find our new last child element. |
Element* lastChildElement = ElementTraversal::lastChild(*this); |
- RenderStyle* lastChildElementStyle = lastChildElement ? lastChildElement->renderStyle() : nullptr; |
// Find the last element before the change. |
Element* elementBeforeChange = nodeBeforeChange->isElementNode() ? toElement(nodeBeforeChange) : ElementTraversal::previousSibling(*nodeBeforeChange); |
- RenderStyle* elementBeforeChangeStyle = elementBeforeChange ? elementBeforeChange->renderStyle() : nullptr; |
// This is the element insertion as last child element case. |
- if (lastChildElement != elementBeforeChange && elementBeforeChangeStyle && elementBeforeChangeStyle->lastChildState()) { |
- ASSERT(SiblingElementInserted); |
+ if (changeType == SiblingElementInserted && elementBeforeChange && lastChildElement != elementBeforeChange |
+ && (!nodeAfterChange || !nodeAfterChange->isElementNode()) && elementBeforeChange->affectedByLastChildRules()) { |
rune
2014/11/26 15:14:05
Analogue to the other change, only for :last-child
|
elementBeforeChange->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::SiblingSelector)); |
} |
// This is the last child element removal case. The parser callback case is similar to node removal as well in that we need to change the last child |
// to match now. |
- if ((changeType == SiblingElementRemoved || changeType == FinishedParsingChildren) && lastChildElement == elementBeforeChange && lastChildElement && (!lastChildElementStyle || !lastChildElementStyle->lastChildState())) |
+ if ((changeType == SiblingElementRemoved || changeType == FinishedParsingChildren) && lastChildElement == elementBeforeChange && lastChildElement && lastChildElement->affectedByLastChildRules()) |
lastChildElement->setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::SiblingSelector)); |
} |