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

Unified Diff: Source/core/rendering/RenderMultiColumnSet.cpp

Issue 288263002: [New Multicolumn] Rebalance properly when child content changes. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebase master Created 6 years, 7 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: Source/core/rendering/RenderMultiColumnSet.cpp
diff --git a/Source/core/rendering/RenderMultiColumnSet.cpp b/Source/core/rendering/RenderMultiColumnSet.cpp
index 9e7602d08e78160db94dffe4e6f1532e0207abae..3896604e2699dbd06f697d76db37e2616e04f238 100644
--- a/Source/core/rendering/RenderMultiColumnSet.cpp
+++ b/Source/core/rendering/RenderMultiColumnSet.cpp
@@ -84,9 +84,8 @@ LayoutUnit RenderMultiColumnSet::heightAdjustedForSetOffset(LayoutUnit height) c
LayoutUnit RenderMultiColumnSet::pageLogicalTopForOffset(LayoutUnit offset) const
{
- LayoutUnit portionLogicalTop = (isHorizontalWritingMode() ? flowThreadPortionRect().y() : flowThreadPortionRect().x());
unsigned columnIndex = columnIndexAtOffset(offset, AssumeNewColumns);
- return portionLogicalTop + columnIndex * computedColumnHeight();
+ return logicalTopInFlowThread() + columnIndex * computedColumnHeight();
}
void RenderMultiColumnSet::setAndConstrainColumnHeight(LayoutUnit newHeight)
@@ -206,11 +205,15 @@ bool RenderMultiColumnSet::recalculateColumnHeight(bool initial)
// determined that the columns need to be as tall as the specified height of the container, we
// have already laid it out correctly, and there's no need for another pass.
+ // We can get rid of the content runs now, if we haven't already done so. They are only needed
+ // to calculate the initial balanced column height. In fact, we have to get rid of them before
+ // the next layout pass, since each pass will rebuild this.
+ m_contentRuns.clear();
+
if (m_computedColumnHeight == oldColumnHeight)
return false; // No change. We're done.
m_minSpaceShortage = RenderFlowThread::maxLogicalHeight();
- m_contentRuns.clear();
return true; // Need another pass.
}
@@ -248,41 +251,34 @@ void RenderMultiColumnSet::updateLogicalWidth()
setLogicalWidth(logicalWidth() + delta);
}
-void RenderMultiColumnSet::prepareForLayout()
+void RenderMultiColumnSet::prepareForLayout(bool initial)
Julien - ping for review 2014/05/20 17:03:04 We should replace the first-pass boolean logic wit
mstensho (USE GERRIT) 2014/05/22 15:07:18 Done. I did the second best thing - removed the p
{
RenderBlockFlow* multicolBlock = multiColumnBlockFlow();
- RenderStyle* multicolStyle = multicolBlock->style();
// Set box logical top.
ASSERT(!previousSiblingBox() || !previousSiblingBox()->isRenderMultiColumnSet()); // FIXME: multiple set not implemented; need to examine previous set to calculate the correct logical top.
- setLogicalTop(multicolBlock->borderBefore() + multicolBlock->paddingBefore());
-
- // Set box width.
- updateLogicalWidth();
+ setLogicalTop(multicolBlock->borderAndPaddingBefore());
+ if (initial) {
+ m_maxColumnHeight = calculateMaxColumnHeight();
+ updateLogicalWidth();
Julien - ping for review 2014/05/20 17:03:04 It's weird that prepareForLayout actually does wha
mstensho (USE GERRIT) 2014/05/22 15:07:18 Done. All it really needed from updateLogicalWidt
+ }
if (multiColumnFlowThread()->requiresBalancing()) {
- // Set maximum column height. We will not stretch beyond this.
- m_maxColumnHeight = RenderFlowThread::maxLogicalHeight();
- if (!multicolStyle->logicalHeight().isAuto()) {
- m_maxColumnHeight = multicolBlock->computeContentLogicalHeight(multicolStyle->logicalHeight(), -1);
- if (m_maxColumnHeight == -1)
- m_maxColumnHeight = RenderFlowThread::maxLogicalHeight();
- }
- if (!multicolStyle->logicalMaxHeight().isUndefined()) {
- LayoutUnit logicalMaxHeight = multicolBlock->computeContentLogicalHeight(multicolStyle->logicalMaxHeight(), -1);
- if (logicalMaxHeight != -1 && m_maxColumnHeight > logicalMaxHeight)
- m_maxColumnHeight = logicalMaxHeight;
- }
- m_maxColumnHeight = heightAdjustedForSetOffset(m_maxColumnHeight);
- m_computedColumnHeight = 0; // Restart balancing.
+ if (initial)
+ m_computedColumnHeight = 0;
} else {
setAndConstrainColumnHeight(heightAdjustedForSetOffset(multiColumnFlowThread()->columnHeightAvailable()));
}
- m_contentRuns.clear();
+ // Content runs are only needed in the initial layout pass, in order to find an initial column
+ // height, and should have been deleted afterwards. We're about to rebuild the content runs, so
+ // the list needs to be empty.
+ ASSERT(m_contentRuns.isEmpty());
// Nuke previously stored minimum column height. Contents may have changed for all we know.
m_minimumColumnHeight = 0;
+
+ setNeedsLayoutAndFullRepaint();
Julien - ping for review 2014/05/20 17:03:04 There is no branch in prepareForLayout, which mean
mstensho (USE GERRIT) 2014/05/21 09:02:33 No, that looks very unnecessary, apart from being
mstensho (USE GERRIT) 2014/05/22 15:07:18 Done. We now call setChildNeedsLayout(MarkOnlyThi
}
void RenderMultiColumnSet::expandToEncompassFlowThreadContentsIfNeeded()
@@ -306,10 +302,9 @@ void RenderMultiColumnSet::layout()
{
RenderRegion::layout();
- if (!nextSiblingMultiColumnSet()) {
- // This is the last set, i.e. the last region. Seize the opportunity to validate them.
- multiColumnFlowThread()->validateRegions();
- }
+ // At this point the logical top of the column set is known. Update maximum column height
+ // (multicol height may be constrained, and in order to calculate it, we need to know our top).
+ m_maxColumnHeight = calculateMaxColumnHeight();
}
void RenderMultiColumnSet::computeLogicalHeight(LayoutUnit, LayoutUnit logicalTop, LogicalExtentComputedValues& computedValues) const
@@ -318,6 +313,20 @@ void RenderMultiColumnSet::computeLogicalHeight(LayoutUnit, LayoutUnit logicalTo
computedValues.m_position = logicalTop;
}
+LayoutUnit RenderMultiColumnSet::calculateMaxColumnHeight() const
+{
+ RenderBlockFlow* multicolBlock = multiColumnBlockFlow();
+ RenderStyle* multicolStyle = multicolBlock->style();
+ LayoutUnit availableHeight = multiColumnFlowThread()->columnHeightAvailable();
+ LayoutUnit maxColumnHeight = availableHeight ? availableHeight : RenderFlowThread::maxLogicalHeight();
+ if (!multicolStyle->logicalMaxHeight().isUndefined()) {
+ LayoutUnit logicalMaxHeight = multicolBlock->computeContentLogicalHeight(multicolStyle->logicalMaxHeight(), -1);
+ if (logicalMaxHeight != -1 && maxColumnHeight > logicalMaxHeight)
+ maxColumnHeight = logicalMaxHeight;
+ }
+ return heightAdjustedForSetOffset(maxColumnHeight);
+}
+
LayoutUnit RenderMultiColumnSet::columnGap() const
{
RenderBlockFlow* parentBlock = multiColumnBlockFlow();

Powered by Google App Engine
This is Rietveld 408576698