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 938e9ed881afbc9ef9f5add8b03f5f32b67e60f1..e073f78a84b14ccc67814990d484ab39f2a8d492 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp |
@@ -28,7 +28,9 @@ |
#include "core/layout/LayoutMultiColumnSet.h" |
#include "core/layout/LayoutMultiColumnSpannerPlaceholder.h" |
+#include "core/layout/LayoutView.h" |
#include "core/layout/MultiColumnFragmentainerGroup.h" |
+#include "core/layout/ViewFragmentationContext.h" |
namespace blink { |
@@ -355,7 +357,7 @@ void LayoutMultiColumnFlowThread::layoutColumns(SubtreeLayoutScope& layoutScope) |
m_needsColumnHeightsRecalculation = false; |
- m_blockOffsetInEnclosingFlowThread = enclosingFlowThread() ? multiColumnBlockFlow()->offsetFromLogicalTopOfFirstPage() : LayoutUnit(); |
+ m_blockOffsetInEnclosingFragmentationContext = enclosingFragmentationContext() ? multiColumnBlockFlow()->offsetFromLogicalTopOfFirstPage() : LayoutUnit(); |
for (LayoutBox* columnBox = firstMultiColumnBox(); columnBox; columnBox = columnBox->nextSiblingMultiColumnBox()) { |
if (!columnBox->isLayoutMultiColumnSet()) { |
@@ -439,6 +441,13 @@ LayoutMultiColumnFlowThread* LayoutMultiColumnFlowThread::enclosingFlowThread() |
return nullptr; |
} |
+FragmentationContext* LayoutMultiColumnFlowThread::enclosingFragmentationContext() const |
+{ |
+ if (LayoutMultiColumnFlowThread* enclosingFlowThread = this->enclosingFlowThread()) |
+ return enclosingFlowThread; |
+ return view()->fragmentationContext(); |
+} |
+ |
void LayoutMultiColumnFlowThread::appendNewFragmentainerGroupIfNeeded(LayoutUnit offsetInFlowThread) |
{ |
if (!isPageLogicalHeightKnown()) { |
@@ -458,18 +467,34 @@ void LayoutMultiColumnFlowThread::appendNewFragmentainerGroupIfNeeded(LayoutUnit |
} |
if (!columnSet->hasFragmentainerGroupForColumnAt(offsetInFlowThread)) { |
- LayoutMultiColumnFlowThread* enclosingFlowThread = this->enclosingFlowThread(); |
- if (!enclosingFlowThread) |
+ FragmentationContext* enclosingFragmentationContext = this->enclosingFragmentationContext(); |
+ if (!enclosingFragmentationContext) |
return; // Not nested. We'll never need more rows than the one we already have then. |
// We have run out of columns here, so we add another row to hold more columns. When we add |
// a new row, it implicitly means that we're inserting another column in our enclosing |
// multicol container. That in turn may mean that we've run out of columns there too. |
const MultiColumnFragmentainerGroup& newRow = columnSet->appendNewFragmentainerGroup(); |
- enclosingFlowThread->appendNewFragmentainerGroupIfNeeded(newRow.blockOffsetInEnclosingFlowThread()); |
+ if (LayoutMultiColumnFlowThread* enclosingFlowThread = enclosingFragmentationContext->associatedFlowThread()) |
+ enclosingFlowThread->appendNewFragmentainerGroupIfNeeded(newRow.blockOffsetInEnclosingFragmentationContext()); |
} |
} |
+bool LayoutMultiColumnFlowThread::isFragmentainerLogicalHeightKnown() |
+{ |
+ return isPageLogicalHeightKnown(); |
+} |
+ |
+LayoutUnit LayoutMultiColumnFlowThread::fragmentainerLogicalHeightAt(LayoutUnit blockOffset) |
+{ |
+ return pageLogicalHeightForOffset(blockOffset); |
+} |
+ |
+LayoutUnit LayoutMultiColumnFlowThread::remainingLogicalHeightAt(LayoutUnit blockOffset) |
+{ |
+ return pageRemainingLogicalHeightForOffset(blockOffset, AssociateWithLatterPage); |
+} |
+ |
void LayoutMultiColumnFlowThread::calculateColumnCountAndWidth(LayoutUnit& width, unsigned& count) const |
{ |
LayoutBlock* columnBlock = multiColumnBlockFlow(); |
@@ -915,12 +940,12 @@ void LayoutMultiColumnFlowThread::contentWasLaidOut(LayoutUnit logicalTopInFlowT |
// First figure out if there's any chance that we're nested at all. If we can be sure that |
// we're not, bail early. This code is run very often, and since locating a containing flow |
- // thread has some cost (depending on tree depth), avoid calling enclosingFlowThread() right |
- // away. This test may give some false positives (hence the "mayBe"), if we're in an |
- // out-of-flow subtree and have an outer multicol container that doesn't affect us, but that's |
- // okay. We'll discover that further down the road when trying to locate our enclosing flow |
- // thread for real. |
- bool mayBeNested = multiColumnBlockFlow()->isInsideFlowThread(); |
+ // thread has some cost (depending on tree depth), avoid calling |
+ // enclosingFragmentationContext() right away. This test may give some false positives (hence |
+ // the "mayBe"), if we're in an out-of-flow subtree and have an outer multicol container that |
+ // doesn't affect us, but that's okay. We'll discover that further down the road when trying to |
+ // locate our enclosing flow thread for real. |
+ bool mayBeNested = multiColumnBlockFlow()->isInsideFlowThread() || view()->fragmentationContext(); |
if (!mayBeNested) |
return; |
appendNewFragmentainerGroupIfNeeded(logicalTopInFlowThreadAfterPagination); |