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 dfe3167499f4eb0c9bd22e9339cc9621921d009b..d5e4cd2e06e124d95f95c26a66a27093e202f022 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp |
| @@ -642,18 +642,22 @@ void LayoutBlock::collapseAnonymousBlockChild(LayoutBlock* parent, LayoutBlock* |
| child->destroy(); |
| } |
| -static inline bool shouldMakeChildrenInline(const LayoutBlock* block) |
| +void LayoutBlock::makeChildrenInlineIfPossible() |
| { |
| - if (!block->isLayoutBlockFlow()) |
| - return false; |
| - LayoutObject* child = block->firstChild(); |
| + if (!isLayoutBlockFlow() || isRubyRun()) |
|
mstensho (USE GERRIT)
2015/10/22 19:19:57
Where does the ruby check come from? Do we have a
|
| + return; |
| + Vector<LayoutBox*, 16> blocksToRemove; |
|
mstensho (USE GERRIT)
2015/10/22 19:19:58
How many anonymous blocks can we possibly find her
|
| + LayoutObject* child = firstChild(); |
| while (child) { |
| - // TODO(rhogan): If we encounter anonymous blocks with inline children we should fold them in here. |
| - if (!child->isFloatingOrOutOfFlowPositioned()) |
| - return false; |
| + if (child->isAnonymousBlock() && child->childrenInline()) |
| + blocksToRemove.append(toLayoutBox(child)); |
| + else if (!child->isFloatingOrOutOfFlowPositioned()) |
| + return; |
| child = child->nextSibling(); |
| } |
| - return true; |
| + for (size_t i = 0; i < blocksToRemove.size(); i++) |
| + collapseAnonymousBlockChild(this, toLayoutBlock(blocksToRemove[i])); |
|
mstensho (USE GERRIT)
2015/10/22 19:19:58
Looks like blocksToRemove should hold LayoutBlock
|
| + setChildrenInline(true); |
| } |
| void LayoutBlock::removeChild(LayoutObject* oldChild) |
| @@ -758,9 +762,9 @@ void LayoutBlock::removeChild(LayoutObject* oldChild) |
| setContinuation(nullptr); |
| destroy(); |
| } |
| - } else if (!beingDestroyed() && !oldChild->isFloatingOrOutOfFlowPositioned() && shouldMakeChildrenInline(this)) { |
| + } else if (!beingDestroyed() && !oldChild->isFloatingOrOutOfFlowPositioned()) { |
| // 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(); |
| } |
| } |