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

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

Issue 1399493002: Column balancing refactoring. Don't propagate data during layout. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: more code review Created 5 years, 2 months 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 8d6760f61ee097bbcff8461ea3ace23f15f8ed75..321831fe34a0ff76db3c25b6e493c764d6bc5a77 100644
--- a/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp
@@ -447,6 +447,15 @@ bool LayoutMultiColumnFlowThread::hasFragmentainerGroupForColumnAt(LayoutUnit of
// 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;
+ }
+
LayoutMultiColumnSet* lastColumnSet = lastMultiColumnSet();
if (!lastColumnSet) {
ASSERT_NOT_REACHED();
@@ -925,17 +934,26 @@ void LayoutMultiColumnFlowThread::layout()
m_lastSetWorkedOn = nullptr;
}
-void LayoutMultiColumnFlowThread::setPageBreak(LayoutUnit offset, LayoutUnit spaceShortage)
+void LayoutMultiColumnFlowThread::contentWasLaidOut(LayoutUnit logicalTopInFlowThreadAfterPagination)
{
- // Only positive values are interesting (and allowed) here. Zero space shortage may be reported
- // when we're at the top of a column and the element has zero height. Ignore this, and also
- // ignore any negative values, which may occur when we set an early break in order to honor
- // widows in the next column.
- if (spaceShortage <= 0)
+ // Check if we need another fragmentainer group. If we've run out of columns in the last
+ // fragmentainer group (column row), we need to insert another fragmentainer group to hold more
+ // columns.
+ if (!multiColumnBlockFlow()->isInsideFlowThread())
+ return; // Early bail. We're not nested, so waste no more time on this.
+ if (!isInInitialLayoutPass()) {
+ // 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 (LayoutMultiColumnSet* multicolSet = columnSetAtBlockOffset(offset))
- multicolSet->recordSpaceShortage(offset, spaceShortage);
+ }
+ LayoutMultiColumnSet* columnSet = columnSetAtBlockOffset(logicalTopInFlowThreadAfterPagination);
+ if (!columnSet)
+ return;
+ MultiColumnFragmentainerGroup& row = columnSet->fragmentainerGroupAtFlowThreadOffset(logicalTopInFlowThreadAfterPagination);
+ if (!row.isLastGroup())
+ return;
+ appendNewFragmentainerGroupIfNeeded(logicalTopInFlowThreadAfterPagination);
}
void LayoutMultiColumnFlowThread::updateMinimumPageHeight(LayoutUnit offset, LayoutUnit minHeight)
@@ -944,15 +962,4 @@ void LayoutMultiColumnFlowThread::updateMinimumPageHeight(LayoutUnit offset, Lay
multicolSet->updateMinimumColumnHeight(offset, minHeight);
}
-bool LayoutMultiColumnFlowThread::addForcedColumnBreak(LayoutUnit offset, LayoutObject* /*breakChild*/, bool /*isBefore*/, LayoutUnit* offsetBreakAdjustment)
-{
- if (LayoutMultiColumnSet* multicolSet = columnSetAtBlockOffset(offset)) {
- multicolSet->addContentRun(offset);
- if (offsetBreakAdjustment)
- *offsetBreakAdjustment = pageLogicalHeightForOffset(offset) ? pageRemainingLogicalHeightForOffset(offset, AssociateWithFormerPage) : LayoutUnit();
- return true;
- }
- return false;
-}
-
}

Powered by Google App Engine
This is Rietveld 408576698