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 74ef4383eb6dfda73e250de3aacb7c43ef44d427..a4beb0dc179feff0308c06fabf32d9972b683265 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp |
@@ -391,6 +391,7 @@ bool LayoutBlockFlow::checkIfIsSelfCollapsingBlock() const { |
return false; |
} |
+DISABLE_CFI_PERF |
void LayoutBlockFlow::layoutBlock(bool relayoutChildren) { |
ASSERT(needsLayout()); |
ASSERT(isInlineBlockOrInlineTable() || !isInline()); |
@@ -401,11 +402,39 @@ void LayoutBlockFlow::layoutBlock(bool relayoutChildren) { |
LayoutAnalyzer::BlockScope analyzer(*this); |
SubtreeLayoutScope layoutScope(*this); |
+ LayoutUnit previousHeight = logicalHeight(); |
+ LayoutUnit oldLeft = logicalLeft(); |
+ bool logicalWidthChanged = updateLogicalWidthAndColumnWidth(); |
+ relayoutChildren |= logicalWidthChanged; |
+ |
+ TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope); |
+ LayoutState state(*this, logicalWidthChanged); |
+ |
+ if (m_paginationStateChanged) { |
+ // We now need a deep layout to clean up struts after pagination, if we |
+ // just ceased to be paginated, or, if we just became paginated on the |
+ // other hand, we now need the deep layout, to insert pagination struts. |
+ m_paginationStateChanged = false; |
+ state.setPaginationStateChanged(); |
+ } |
+ |
+ bool preferredLogicalWidthsWereDirty = preferredLogicalWidthsDirty(); |
+ |
// Multiple passes might be required for column based layout. |
// The number of passes could be as high as the number of columns. |
LayoutMultiColumnFlowThread* flowThread = multiColumnFlowThread(); |
do { |
- layoutBlockFlow(relayoutChildren, layoutScope); |
+ layoutChildren(relayoutChildren, layoutScope); |
+ |
+ if (!preferredLogicalWidthsWereDirty && preferredLogicalWidthsDirty()) { |
+ // The only thing that should dirty preferred widths at this point is the |
+ // addition of overflow:auto scrollbars in a descendant. To avoid a |
+ // potential infinite loop, run layout again with auto scrollbars frozen |
+ // in their current state. |
+ PaintLayerScrollableArea::FreezeScrollbarsScope freezeScrollbars; |
+ relayoutChildren |= updateLogicalWidthAndColumnWidth(); |
+ layoutChildren(relayoutChildren, layoutScope); |
+ } |
if (flowThread && flowThread->columnHeightsChanged()) { |
setChildNeedsLayout(MarkOnlyThis); |
@@ -419,6 +448,29 @@ void LayoutBlockFlow::layoutBlock(bool relayoutChildren) { |
break; |
} while (true); |
+ // 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(); |
+ |
+ if (!childrenInline()) |
+ addOverhangingFloatsFromChildren(unconstrainedHeight); |
+ |
+ if (logicalHeight() != previousHeight || isDocumentElement()) |
+ relayoutChildren = true; |
+ |
+ PositionedLayoutBehavior behavior = DefaultLayout; |
+ if (oldLeft != logicalLeft()) |
+ behavior = ForcedLayoutAfterContainingBlockMoved; |
+ layoutPositionedObjects(relayoutChildren, behavior); |
+ |
+ // Add overflow from children. |
+ computeOverflow(unconstrainedClientAfterEdge); |
+ |
+ m_descendantsWithFloatsMarkedForLayout = false; |
+ |
updateLayerTransformAfterLayout(); |
updateAfterLayout(); |
@@ -474,23 +526,8 @@ void LayoutBlockFlow::resetLayout() { |
} |
DISABLE_CFI_PERF |
-inline void LayoutBlockFlow::layoutBlockFlow(bool relayoutChildren, |
- SubtreeLayoutScope& layoutScope) { |
- LayoutUnit oldLeft = logicalLeft(); |
- bool logicalWidthChanged = updateLogicalWidthAndColumnWidth(); |
- relayoutChildren |= logicalWidthChanged; |
- |
- LayoutState state(*this, logicalWidthChanged); |
- |
- if (m_paginationStateChanged) { |
- // We now need a deep layout to clean up struts after pagination, if we |
- // just ceased to be paginated, or, if we just became paginated on the |
- // other hand, we now need the deep layout, to insert pagination struts. |
- m_paginationStateChanged = false; |
- state.setPaginationStateChanged(); |
- } |
- |
- LayoutUnit previousHeight = logicalHeight(); |
+void LayoutBlockFlow::layoutChildren(bool relayoutChildren, |
+ SubtreeLayoutScope& layoutScope) { |
resetLayout(); |
LayoutUnit beforeEdge = borderBefore() + paddingBefore(); |
@@ -498,55 +535,15 @@ inline void LayoutBlockFlow::layoutBlockFlow(bool relayoutChildren, |
borderAfter() + paddingAfter() + scrollbarLogicalHeight(); |
setLogicalHeight(beforeEdge); |
- TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope); |
- |
- bool preferredLogicalWidthsWereDirty = preferredLogicalWidthsDirty(); |
- |
if (childrenInline()) |
layoutInlineChildren(relayoutChildren, afterEdge); |
else |
layoutBlockChildren(relayoutChildren, layoutScope, beforeEdge, afterEdge); |
- bool preferredLogicalWidthsBecameDirty = |
- !preferredLogicalWidthsWereDirty && preferredLogicalWidthsDirty(); |
- if (preferredLogicalWidthsBecameDirty) { |
- // The only thing that should dirty preferred widths at this point is the |
- // addition of overflow:auto scrollbars in a descendant. To avoid a |
- // potential infinite loop, run layout again with auto scrollbars frozen in |
- // their current state. |
- PaintLayerScrollableArea::FreezeScrollbarsScope freezeScrollbars; |
- layoutBlockFlow(relayoutChildren, layoutScope); |
- return; |
- } |
- |
// Expand our intrinsic height to encompass floats. |
if (lowestFloatLogicalBottom() > (logicalHeight() - afterEdge) && |
createsNewFormattingContext()) |
setLogicalHeight(lowestFloatLogicalBottom() + afterEdge); |
- |
- // 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(); |
- |
- if (!childrenInline()) |
- addOverhangingFloatsFromChildren(unconstrainedHeight); |
- |
- if (previousHeight != logicalHeight() || isDocumentElement()) |
- relayoutChildren = true; |
- |
- 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(unconstrainedClientAfterEdge); |
- |
- m_descendantsWithFloatsMarkedForLayout = false; |
} |
void LayoutBlockFlow::addOverhangingFloatsFromChildren( |