Chromium Code Reviews| 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 75fabaddfae7c3372eb547349e52000fce1ab42a..372b7090be811586fd251dfb85fb93eb7b344af6 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp |
| @@ -269,7 +269,7 @@ void LayoutBlock::styleDidChange(StyleDifference diff, const ComputedStyle* oldS |
| LayoutBox::styleDidChange(diff, oldStyle); |
| if (isFloatingOrOutOfFlowPositioned() && oldStyle && !oldStyle->isFloating() && !oldStyle->hasOutOfFlowPosition() && parent() && parent()->isLayoutBlockFlow()) { |
| - toLayoutBlock(parent())->removeAnonymousWrappersIfRequired(); |
| + toLayoutBlock(parent())->makeChildrenInlineIfPossible(); |
|
mstensho (USE GERRIT)
2015/10/29 10:08:49
Note: I think this belongs in LayoutBox, not here
|
| // Reparent to an adjacent anonymous block if one is available. |
| if (previousSibling() && previousSibling()->isAnonymousBlock()) |
| toLayoutBlock(parent())->moveChildTo(toLayoutBlock(previousSibling()), this, nullptr, false); |
| @@ -604,11 +604,15 @@ static bool canMergeContiguousAnonymousBlocks(LayoutObject* oldChild, LayoutObje |
| return true; |
| } |
| -void LayoutBlock::removeAnonymousWrappersIfRequired() |
| +void LayoutBlock::makeChildrenInlineIfPossible() |
| { |
| ASSERT(isLayoutBlockFlow()); |
| - Vector<LayoutBox*, 16> blocksToRemove; |
| - for (LayoutBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { |
| + // Collapsing away anonymous wrappers isn't relevant for the children of anonymous blocks. |
| + if (isAnonymousBlock()) |
| + return; |
| + |
| + Vector<LayoutBlock*, 3> blocksToRemove; |
| + for (LayoutObject* child = firstChild(); child; child = child->nextSibling()) { |
| if (child->isFloatingOrOutOfFlowPositioned()) |
| continue; |
| @@ -621,13 +625,16 @@ void LayoutBlock::removeAnonymousWrappersIfRequired() |
| // We are only interested in removing anonymous wrappers if there are inline siblings underneath them. |
| if (!child->childrenInline()) |
| return; |
| + // Ruby elements use anonymous wrappers for ruby runs and ruby bases by design, so we don't remove them. |
| + if (child->isRubyRun() || child->isRubyBase()) |
| + return; |
| - if (child->isAnonymousBlock()) |
| - blocksToRemove.append(child); |
| + blocksToRemove.append(toLayoutBlock(child)); |
| } |
| for (size_t i = 0; i < blocksToRemove.size(); i++) |
| - collapseAnonymousBlockChild(this, toLayoutBlock(blocksToRemove[i])); |
| + collapseAnonymousBlockChild(this, blocksToRemove[i]); |
| + setChildrenInline(true); |
| } |
| void LayoutBlock::collapseAnonymousBlockChild(LayoutBlock* parent, LayoutBlock* child) |
| @@ -646,20 +653,6 @@ void LayoutBlock::collapseAnonymousBlockChild(LayoutBlock* parent, LayoutBlock* |
| child->destroy(); |
| } |
| -static inline bool shouldMakeChildrenInline(const LayoutBlock* block) |
| -{ |
| - if (!block->isLayoutBlockFlow()) |
| - return false; |
| - LayoutObject* child = block->firstChild(); |
| - while (child) { |
| - // TODO(rhogan): If we encounter anonymous blocks with inline children we should fold them in here. |
| - if (!child->isFloatingOrOutOfFlowPositioned()) |
| - return false; |
| - child = child->nextSibling(); |
| - } |
| - return true; |
| -} |
| - |
| void LayoutBlock::removeChild(LayoutObject* oldChild) |
| { |
| // No need to waste time in merging or removing empty anonymous blocks. |
| @@ -762,9 +755,9 @@ void LayoutBlock::removeChild(LayoutObject* oldChild) |
| setContinuation(nullptr); |
| destroy(); |
| } |
| - } else if (!beingDestroyed() && !oldChild->isFloatingOrOutOfFlowPositioned() && shouldMakeChildrenInline(this)) { |
| + } else if (!beingDestroyed() && !oldChild->isFloatingOrOutOfFlowPositioned() && isLayoutBlockFlow()) { |
| // If the child we're removing means that we can now treat all children as inline without the need for anonymous blocks, then do that. |
| - setChildrenInline(true); |
| + makeChildrenInlineIfPossible(); |
| } |
| } |