Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1689)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp

Issue 1487083003: It's not just the last column set that may need additional fragmentainer groups. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: sqrt(squareheight) Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 8e25b9523b130a73e44cbc5d31fa9b4979cd8b15..938e9ed881afbc9ef9f5add8b03f5f32b67e60f1 100644
--- a/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp
@@ -439,44 +439,33 @@ LayoutMultiColumnFlowThread* LayoutMultiColumnFlowThread::enclosingFlowThread()
return nullptr;
}
-bool LayoutMultiColumnFlowThread::hasFragmentainerGroupForColumnAt(LayoutUnit offsetInFlowThread) const
+void LayoutMultiColumnFlowThread::appendNewFragmentainerGroupIfNeeded(LayoutUnit offsetInFlowThread)
{
- // If there's no enclosing flow thread, there'll always be only one fragmentainer group, and it
- // can hold as many columns as we like. We shouldn't even be here in that case.
- ASSERT(enclosingFlowThread());
-
if (!isPageLogicalHeightKnown()) {
// If we have no clue about the height of the multicol container, bail. This situation
// occurs initially when an auto-height multicol container is nested inside another
// auto-height multicol container. We need at least an estimated height of the outer
// multicol container before we can check what an inner fragmentainer group has room for.
- // Its height height is indefinite for now.
- return true;
+ // Its height is indefinite for now.
+ return;
}
-
- LayoutMultiColumnSet* lastColumnSet = lastMultiColumnSet();
- if (!lastColumnSet) {
- ASSERT_NOT_REACHED();
- return true;
+ 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
+ // want that last fragmentainer group to be the same one in all layout passes that follow.
+ return;
}
- if (lastColumnSet->logicalTopInFlowThread() > offsetInFlowThread)
- return true;
- const MultiColumnFragmentainerGroup& lastRow = lastColumnSet->lastFragmentainerGroup();
- if (lastRow.logicalTopInFlowThread() > offsetInFlowThread)
- return true;
- return offsetInFlowThread - lastRow.logicalTopInFlowThread() < lastRow.logicalHeight() * lastColumnSet->usedColumnCount();
-}
-void LayoutMultiColumnFlowThread::appendNewFragmentainerGroupIfNeeded(LayoutUnit offsetInFlowThread)
-{
- LayoutMultiColumnFlowThread* enclosingFlowThread = this->enclosingFlowThread();
- if (!enclosingFlowThread)
- return; // Not nested. We'll never need more rows than the one we already have then.
- if (!hasFragmentainerGroupForColumnAt(offsetInFlowThread)) {
+ if (!columnSet->hasFragmentainerGroupForColumnAt(offsetInFlowThread)) {
+ LayoutMultiColumnFlowThread* enclosingFlowThread = this->enclosingFlowThread();
+ if (!enclosingFlowThread)
+ 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 = lastMultiColumnSet()->appendNewFragmentainerGroup();
+ const MultiColumnFragmentainerGroup& newRow = columnSet->appendNewFragmentainerGroup();
enclosingFlowThread->appendNewFragmentainerGroupIfNeeded(newRow.blockOffsetInEnclosingFlowThread());
}
}
@@ -934,18 +923,6 @@ void LayoutMultiColumnFlowThread::contentWasLaidOut(LayoutUnit logicalTopInFlowT
bool mayBeNested = multiColumnBlockFlow()->isInsideFlowThread();
if (!mayBeNested)
return;
- LayoutMultiColumnSet* columnSet = columnSetAtBlockOffset(logicalTopInFlowThreadAfterPagination);
- if (!columnSet)
- return;
- 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
- // want that last fragmentainer group to be the same one in all layout passes that follow.
- return;
- }
- MultiColumnFragmentainerGroup& row = columnSet->fragmentainerGroupAtFlowThreadOffset(logicalTopInFlowThreadAfterPagination);
- if (!row.isLastGroup())
- return;
appendNewFragmentainerGroupIfNeeded(logicalTopInFlowThreadAfterPagination);
}

Powered by Google App Engine
This is Rietveld 408576698