| Index: third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp b/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp
|
| index 226b9d675a9d8f1ebe4c0b86819d0958bc92586c..a8fc25a54f1b6f7bf9d2c5031510a47b930f451e 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp
|
| @@ -384,7 +384,21 @@ void LayoutMultiColumnFlowThread::layoutColumns(SubtreeLayoutScope& layoutScope)
|
| // thread needs layout as well.
|
| layoutScope.setChildNeedsLayout(this);
|
|
|
| - m_blockOffsetInEnclosingFragmentationContext = enclosingFragmentationContext() ? multiColumnBlockFlow()->offsetFromLogicalTopOfFirstPage() : LayoutUnit();
|
| + if (FragmentationContext* enclosingFragmentationContext = this->enclosingFragmentationContext()) {
|
| + m_blockOffsetInEnclosingFragmentationContext = multiColumnBlockFlow()->offsetFromLogicalTopOfFirstPage();
|
| +
|
| + if (LayoutMultiColumnFlowThread* enclosingFlowThread = enclosingFragmentationContext->associatedFlowThread()) {
|
| + if (LayoutMultiColumnSet* firstSet = firstMultiColumnSet()) {
|
| + // Before we can start to lay out the contents of this multicol container, we need
|
| + // to make sure that all ancestor multicol containers have established a row to hold
|
| + // the first column contents of this container (this multicol container may start at
|
| + // the beginning of a new outer row). Without sufficient rows in all ancestor
|
| + // multicol containers, we may use the wrong column height.
|
| + LayoutUnit offset = m_blockOffsetInEnclosingFragmentationContext + firstSet->logicalTopFromMulticolContentEdge();
|
| + enclosingFlowThread->appendNewFragmentainerGroupIfNeeded(offset, AssociateWithLatterPage);
|
| + }
|
| + }
|
| + }
|
|
|
| for (LayoutBox* columnBox = firstMultiColumnBox(); columnBox; columnBox = columnBox->nextSiblingMultiColumnBox()) {
|
| if (!columnBox->isLayoutMultiColumnSet()) {
|
| @@ -455,7 +469,7 @@ FragmentationContext* LayoutMultiColumnFlowThread::enclosingFragmentationContext
|
| return view()->fragmentationContext();
|
| }
|
|
|
| -void LayoutMultiColumnFlowThread::appendNewFragmentainerGroupIfNeeded(LayoutUnit bottomOffsetInFlowThread)
|
| +void LayoutMultiColumnFlowThread::appendNewFragmentainerGroupIfNeeded(LayoutUnit offsetInFlowThread, PageBoundaryRule pageBoundaryRule)
|
| {
|
| if (!isPageLogicalHeightKnown()) {
|
| // If we have no clue about the height of the multicol container, bail. This situation
|
| @@ -465,11 +479,12 @@ void LayoutMultiColumnFlowThread::appendNewFragmentainerGroupIfNeeded(LayoutUnit
|
| // Its height is indefinite for now.
|
| return;
|
| }
|
| - // TODO(mstensho): bottomOffsetInFlowThread is an endpoint-exclusive offset, i.e. the offset
|
| - // just after the bottom of some object. So, ideally, columnSetAtBlockOffset() should be
|
| - // informed about this (i.e. take a PageBoundaryRule argument). This is not the only place with
|
| - // this issue; see also pageRemainingLogicalHeightForOffset().
|
| - LayoutMultiColumnSet* columnSet = columnSetAtBlockOffset(bottomOffsetInFlowThread);
|
| + // TODO(mstensho): If pageBoundaryRule is AssociateWithFormerPage, offsetInFlowThread is an
|
| + // endpoint-exclusive offset, i.e. the offset just after the bottom of some object. So, ideally,
|
| + // columnSetAtBlockOffset() should be informed about this (i.e. take a PageBoundaryRule
|
| + // argument). This is not the only place with this issue; see also
|
| + // pageRemainingLogicalHeightForOffset().
|
| + LayoutMultiColumnSet* columnSet = columnSetAtBlockOffset(offsetInFlowThread);
|
| if (columnSet->isInitialHeightCalculated()) {
|
| // We only insert additional fragmentainer groups in the initial layout pass. We only want
|
| // to balance columns in the last fragmentainer group (if we need to balance at all), so we
|
| @@ -477,7 +492,7 @@ void LayoutMultiColumnFlowThread::appendNewFragmentainerGroupIfNeeded(LayoutUnit
|
| return;
|
| }
|
|
|
| - if (!columnSet->hasFragmentainerGroupForColumnAt(bottomOffsetInFlowThread)) {
|
| + if (!columnSet->hasFragmentainerGroupForColumnAt(offsetInFlowThread, pageBoundaryRule)) {
|
| FragmentationContext* enclosingFragmentationContext = this->enclosingFragmentationContext();
|
| if (!enclosingFragmentationContext)
|
| return; // Not nested. We'll never need more rows than the one we already have then.
|
| @@ -487,7 +502,7 @@ void LayoutMultiColumnFlowThread::appendNewFragmentainerGroupIfNeeded(LayoutUnit
|
| // multicol container. That in turn may mean that we've run out of columns there too.
|
| const MultiColumnFragmentainerGroup& newRow = columnSet->appendNewFragmentainerGroup();
|
| if (LayoutMultiColumnFlowThread* enclosingFlowThread = enclosingFragmentationContext->associatedFlowThread())
|
| - enclosingFlowThread->appendNewFragmentainerGroupIfNeeded(newRow.blockOffsetInEnclosingFragmentationContext() + newRow.logicalHeight());
|
| + enclosingFlowThread->appendNewFragmentainerGroupIfNeeded(newRow.blockOffsetInEnclosingFragmentationContext(), AssociateWithLatterPage);
|
| }
|
| }
|
|
|
| @@ -956,7 +971,7 @@ void LayoutMultiColumnFlowThread::contentWasLaidOut(LayoutUnit logicalBottomInFl
|
| bool mayBeNested = multiColumnBlockFlow()->isInsideFlowThread() || view()->fragmentationContext();
|
| if (!mayBeNested)
|
| return;
|
| - appendNewFragmentainerGroupIfNeeded(logicalBottomInFlowThreadAfterPagination);
|
| + appendNewFragmentainerGroupIfNeeded(logicalBottomInFlowThreadAfterPagination, AssociateWithFormerPage);
|
| }
|
|
|
| bool LayoutMultiColumnFlowThread::canSkipLayout(const LayoutBox& root) const
|
|
|