| Index: third_party/WebKit/Source/core/layout/LayoutBlock.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp
|
| index 2ef3c37559e0d29a34041f50adb818f5bc5297d8..c6a11610375126b4310219953ea71280596e3931 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp
|
| @@ -249,38 +249,33 @@ static bool borderOrPaddingLogicalDimensionChanged(const ComputedStyle& oldStyle
|
| || oldStyle.paddingBottom() != newStyle.paddingBottom();
|
| }
|
|
|
| -static bool canMergeContiguousAnonymousBlocks(LayoutObject* prev, LayoutObject* next)
|
| +static bool isMergeableAnonymousBlock(const LayoutBlockFlow* block)
|
| {
|
| - if ((prev && (!prev->isAnonymousBlock() || toLayoutBlock(prev)->continuation() || toLayoutBlock(prev)->beingDestroyed()))
|
| - || (next && (!next->isAnonymousBlock() || toLayoutBlock(next)->continuation() || toLayoutBlock(next)->beingDestroyed())))
|
| - return false;
|
| + return block->isAnonymousBlock() && !block->continuation() && !block->beingDestroyed() && !block->isRubyRun() && !block->isRubyBase();
|
| +}
|
|
|
| - if ((prev && (prev->isRubyRun() || prev->isRubyBase()))
|
| - || (next && (next->isRubyRun() || next->isRubyBase())))
|
| +bool LayoutBlock::mergeSiblingContiguousAnonymousBlock(LayoutBlockFlow* siblingThatMayBeDeleted)
|
| +{
|
| + if (!isLayoutBlockFlow())
|
| return false;
|
|
|
| - return true;
|
| -}
|
| + // Note: |this| and |siblingThatMayBeDeleted| may not be adjacent siblings at this point. There
|
| + // may be an object between them which is about to be removed.
|
|
|
| -static bool mergeContiguousAnonymousBlocks(LayoutObject* prev, LayoutObject*& next)
|
| -{
|
| - if (!prev || !next || !canMergeContiguousAnonymousBlocks(prev, next))
|
| + if (!isMergeableAnonymousBlock(toLayoutBlockFlow(this)) || !isMergeableAnonymousBlock(siblingThatMayBeDeleted))
|
| return false;
|
|
|
| - prev->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalidationReason::AnonymousBlockChange);
|
| - LayoutBlockFlow* nextBlock = toLayoutBlockFlow(next);
|
| - LayoutBlockFlow* prevBlock = toLayoutBlockFlow(prev);
|
| + setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalidationReason::AnonymousBlockChange);
|
|
|
| // If the inlineness of children of the two block don't match, we'd need special code here
|
| // (but there should be no need for it).
|
| - ASSERT(nextBlock->childrenInline() == prevBlock->childrenInline());
|
| + ASSERT(siblingThatMayBeDeleted->childrenInline() == childrenInline());
|
| // Take all the children out of the |next| block and put them in
|
| // the |prev| block.
|
| - nextBlock->moveAllChildrenIncludingFloatsTo(prevBlock, nextBlock->hasLayer() || prevBlock->hasLayer());
|
| + siblingThatMayBeDeleted->moveAllChildrenIncludingFloatsTo(this, siblingThatMayBeDeleted->hasLayer() || hasLayer());
|
| // Delete the now-empty block's lines and nuke it.
|
| - nextBlock->deleteLineBoxTree();
|
| - nextBlock->destroy();
|
| - next = nullptr;
|
| + siblingThatMayBeDeleted->deleteLineBoxTree();
|
| + siblingThatMayBeDeleted->destroy();
|
| return true;
|
| }
|
|
|
| @@ -298,8 +293,10 @@ void LayoutBlock::reparentSubsequentFloatingOrOutOfFlowSiblings()
|
| child = sibling;
|
| }
|
|
|
| - LayoutObject* next = nextSibling();
|
| - mergeContiguousAnonymousBlocks(this, next);
|
| + if (LayoutObject* next = nextSibling()) {
|
| + if (next->isLayoutBlockFlow())
|
| + mergeSiblingContiguousAnonymousBlock(toLayoutBlockFlow(next));
|
| + }
|
| }
|
|
|
| void LayoutBlock::reparentPrecedingFloatingOrOutOfFlowSiblings()
|
| @@ -662,7 +659,13 @@ void LayoutBlock::removeChild(LayoutObject* oldChild)
|
| // fold the inline content back together.
|
| LayoutObject* prev = oldChild->previousSibling();
|
| LayoutObject* next = oldChild->nextSibling();
|
| - bool mergedAnonymousBlocks = !oldChild->documentBeingDestroyed() && !oldChild->isInline() && !oldChild->virtualContinuation() && mergeContiguousAnonymousBlocks(prev, next);
|
| + bool mergedAnonymousBlocks = false;
|
| + if (prev && next && !oldChild->isInline() && !oldChild->virtualContinuation() && prev->isLayoutBlockFlow() && next->isLayoutBlockFlow()) {
|
| + if (toLayoutBlockFlow(prev)->mergeSiblingContiguousAnonymousBlock(toLayoutBlockFlow(next))) {
|
| + mergedAnonymousBlocks = true;
|
| + next = nullptr;
|
| + }
|
| + }
|
|
|
| LayoutBox::removeChild(oldChild);
|
|
|
|
|