Index: Source/core/layout/LayoutInline.cpp |
diff --git a/Source/core/layout/LayoutInline.cpp b/Source/core/layout/LayoutInline.cpp |
index ae7e9c3cdd9abf5581d0a9329bc7ba5880da9a6f..0fe8e2b0a77bdd1f253d198a9ca24e3bf33d950c 100644 |
--- a/Source/core/layout/LayoutInline.cpp |
+++ b/Source/core/layout/LayoutInline.cpp |
@@ -151,32 +151,32 @@ static LayoutObject* inFlowPositionedInlineAncestor(LayoutObject* p) |
return nullptr; |
} |
-static void updateStyleOfAnonymousBlockContinuations(LayoutObject* block, const ComputedStyle& newStyle, const ComputedStyle& oldStyle) |
+static void updateStyleOfAnonymousBlockContinuations(LayoutObject* block, const ComputedStyle& newStyle, const ComputedStyle& oldStyle, LayoutObject* containingBlockOfEndOfContinuation) |
{ |
- for (;block && block->isAnonymousBlock(); block = block->nextSibling()) { |
+ // If an inline's outline or in-flow positioning has changed then any descendant blocks will need to change their styles accordingly. |
+ bool updateOutline = !newStyle.isOutlineEquivalent(&oldStyle); |
+ bool updatePosition = newStyle.position() != oldStyle.position() && (newStyle.hasInFlowPosition() || oldStyle.hasInFlowPosition()); |
+ if (!updateOutline && !updatePosition) |
+ return; |
+ |
+ for (; block && block != containingBlockOfEndOfContinuation && block->isAnonymousBlock(); block = block->nextSibling()) { |
if (!toLayoutBlock(block)->isAnonymousBlockContinuation()) |
continue; |
- RefPtr<ComputedStyle> newBlockStyle; |
+ RefPtr<ComputedStyle> newBlockStyle = ComputedStyle::clone(block->styleRef()); |
- if (!block->style()->isOutlineEquivalent(&newStyle)) { |
- newBlockStyle = ComputedStyle::clone(block->styleRef()); |
+ if (updateOutline) |
newBlockStyle->setOutlineFromStyle(newStyle); |
- } |
- if (block->style()->position() != newStyle.position()) { |
+ if (updatePosition) { |
// If we are no longer in-flow positioned but our descendant block(s) still have an in-flow positioned ancestor then |
// their containing anonymous block should keep its in-flow positioning. |
- if (oldStyle.hasInFlowPosition() |
- && inFlowPositionedInlineAncestor(toLayoutBlock(block)->inlineElementContinuation())) |
+ if (oldStyle.hasInFlowPosition() && inFlowPositionedInlineAncestor(toLayoutBlock(block)->inlineElementContinuation())) |
continue; |
- if (!newBlockStyle) |
- newBlockStyle = ComputedStyle::clone(block->styleRef()); |
newBlockStyle->setPosition(newStyle.position()); |
} |
- if (newBlockStyle) |
- block->setStyle(newBlockStyle); |
+ block->setStyle(newBlockStyle); |
} |
} |
@@ -192,22 +192,20 @@ void LayoutInline::styleDidChange(StyleDifference diff, const ComputedStyle* old |
// need to pass its style on to anyone else. |
const ComputedStyle& newStyle = styleRef(); |
LayoutInline* continuation = inlineElementContinuation(); |
+ LayoutInline* endOfContinuation = nullptr; |
for (LayoutInline* currCont = continuation; currCont; currCont = currCont->inlineElementContinuation()) { |
LayoutBoxModelObject* nextCont = currCont->continuation(); |
currCont->setContinuation(nullptr); |
currCont->setStyle(mutableStyle()); |
currCont->setContinuation(nextCont); |
+ endOfContinuation = currCont; |
} |
- // If an inline's outline or in-flow positioning has changed then any descendant blocks will need to change their styles accordingly. |
- // Do this by updating the styles of the descendant blocks' containing anonymous blocks - there may be more than one. |
- if (continuation && oldStyle |
- && (!newStyle.isOutlineEquivalent(oldStyle) |
- || (newStyle.position() != oldStyle->position() && (newStyle.hasInFlowPosition() || oldStyle->hasInFlowPosition())))) { |
- // If any descendant blocks exist then they will be in the next anonymous block and its siblings. |
+ if (continuation && oldStyle) { |
+ ASSERT(endOfContinuation); |
LayoutObject* block = containingBlock()->nextSibling(); |
if (block && block->isAnonymousBlock()) |
- updateStyleOfAnonymousBlockContinuations(block, newStyle, *oldStyle); |
+ updateStyleOfAnonymousBlockContinuations(block, newStyle, *oldStyle, endOfContinuation->containingBlock()); |
} |
if (!alwaysCreateLineBoxes()) { |