| Index: third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
|
| index c642b3024f1d1bdd29a554a2d04271471def34bb..dd30e1c9bf6ce81a01021e84e91b4fe952332029 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
|
| @@ -576,59 +576,65 @@ inline bool LayoutBlockFlow::layoutBlockFlow(bool relayoutChildren,
|
| return false;
|
| }
|
|
|
| - // Calculate our new height.
|
| - LayoutUnit oldHeight = logicalHeight();
|
| - LayoutUnit oldClientAfterEdge = clientLogicalBottom();
|
| + // Remember the automatic logical height we got from laying out the children.
|
| + LayoutUnit unconstrainedHeight = logicalHeight();
|
| + LayoutUnit unconstrainedClientAfterEdge = clientLogicalBottom();
|
|
|
| + // Adjust logical height to satisfy whatever computed style requires.
|
| updateLogicalHeight();
|
| - LayoutUnit newHeight = logicalHeight();
|
| - if (!childrenInline()) {
|
| - LayoutBlockFlow* lowestBlock = nullptr;
|
| - bool addedOverhangingFloats = false;
|
| - // One of our children's floats may have become an overhanging float for us.
|
| - for (LayoutObject* child = lastChild(); child;
|
| - child = child->previousSibling()) {
|
| - // TODO(robhogan): We should exclude blocks that create formatting
|
| - // contexts, not just out of flow or floating blocks.
|
| - if (child->isLayoutBlockFlow() &&
|
| - !child->isFloatingOrOutOfFlowPositioned()) {
|
| - LayoutBlockFlow* block = toLayoutBlockFlow(child);
|
| - if (!block->containsFloats())
|
| - continue;
|
| - lowestBlock = block;
|
| - if (oldHeight <= newHeight ||
|
| - block->lowestFloatLogicalBottom() + block->logicalTop() <=
|
| - newHeight)
|
| - break;
|
| - addOverhangingFloats(block, false);
|
| - addedOverhangingFloats = true;
|
| - }
|
| - }
|
| - // If we have no overhanging floats we still pass a record of the lowest
|
| - // non-overhanging float up the tree so we can enclose it if we are a
|
| - // formatting context and allow siblings to avoid it if they have negative
|
| - // margin and find themselves in its vicinity.
|
| - if (!addedOverhangingFloats)
|
| - addLowestFloatFromChildren(lowestBlock);
|
| - }
|
|
|
| - bool heightChanged = (previousHeight != newHeight);
|
| - if (heightChanged)
|
| + if (!childrenInline())
|
| + addOverhangingFloatsFromChildren(unconstrainedHeight);
|
| +
|
| + if (previousHeight != logicalHeight() || isDocumentElement())
|
| relayoutChildren = true;
|
|
|
| - layoutPositionedObjects(relayoutChildren || isDocumentElement(),
|
| - oldLeft != logicalLeft()
|
| - ? ForcedLayoutAfterContainingBlockMoved
|
| - : DefaultLayout);
|
| + PositionedLayoutBehavior behavior = DefaultLayout;
|
| + if (oldLeft != logicalLeft())
|
| + behavior = ForcedLayoutAfterContainingBlockMoved;
|
| + layoutPositionedObjects(relayoutChildren, behavior);
|
|
|
| // Add overflow from children (unless we're multi-column, since in that case
|
| // all our child overflow is clipped anyway).
|
| - computeOverflow(oldClientAfterEdge);
|
| + computeOverflow(unconstrainedClientAfterEdge);
|
|
|
| m_descendantsWithFloatsMarkedForLayout = false;
|
| return true;
|
| }
|
|
|
| +void LayoutBlockFlow::addOverhangingFloatsFromChildren(
|
| + LayoutUnit unconstrainedHeight) {
|
| + LayoutBlockFlow* lowestBlock = nullptr;
|
| + bool addedOverhangingFloats = false;
|
| + // One of our children's floats may have become an overhanging float for us.
|
| + for (LayoutObject* child = lastChild(); child;
|
| + child = child->previousSibling()) {
|
| + // TODO(robhogan): We should exclude blocks that create formatting
|
| + // contexts, not just out of flow or floating blocks.
|
| + if (child->isLayoutBlockFlow() &&
|
| + !child->isFloatingOrOutOfFlowPositioned()) {
|
| + LayoutBlockFlow* block = toLayoutBlockFlow(child);
|
| + if (!block->containsFloats())
|
| + continue;
|
| + lowestBlock = block;
|
| + if (unconstrainedHeight <= logicalHeight())
|
| + break;
|
| + LayoutUnit logicalBottom =
|
| + block->logicalTop() + block->lowestFloatLogicalBottom();
|
| + if (logicalBottom <= logicalHeight())
|
| + break;
|
| + addOverhangingFloats(block, false);
|
| + addedOverhangingFloats = true;
|
| + }
|
| + }
|
| + // If we have no overhanging floats we still pass a record of the lowest
|
| + // non-overhanging float up the tree so we can enclose it if we are a
|
| + // formatting context and allow siblings to avoid it if they have negative
|
| + // margin and find themselves in its vicinity.
|
| + if (!addedOverhangingFloats)
|
| + addLowestFloatFromChildren(lowestBlock);
|
| +}
|
| +
|
| void LayoutBlockFlow::addLowestFloatFromChildren(LayoutBlockFlow* block) {
|
| // TODO(robhogan): Make createsNewFormattingContext an ASSERT.
|
| if (!block || !block->containsFloats() ||
|
|
|