Chromium Code Reviews| Index: Source/core/rendering/RenderBlockFlow.cpp |
| diff --git a/Source/core/rendering/RenderBlockFlow.cpp b/Source/core/rendering/RenderBlockFlow.cpp |
| index afc0212fa770522ad2b8b05610560df1286d5192..6e7ddee59d2e1678777ac80e797ca5ec20b93093 100644 |
| --- a/Source/core/rendering/RenderBlockFlow.cpp |
| +++ b/Source/core/rendering/RenderBlockFlow.cpp |
| @@ -546,11 +546,46 @@ void RenderBlockFlow::setLogicalTopForChild(RenderBox* child, LayoutUnit logical |
| } |
| } |
| +class ColumnSpannerLayoutScope { |
| +public: |
| + ColumnSpannerLayoutScope() |
| + : m_spanner(0) |
| + { |
| + } |
| + |
| + ~ColumnSpannerLayoutScope() |
| + { |
| + if (!m_spanner) |
| + return; |
| + m_spanner->flowThreadContainingBlock()->exitColumnSpannerAfterLayout(m_spanner, m_spanner->parentBlock()->logicalHeight()); |
| + } |
| + |
| + LayoutUnit enterSpanner(RenderBox* spanner, SubtreeLayoutScope& layoutScope) |
| + { |
| + ASSERT(!m_spanner); |
| + m_spanner = spanner; |
| + return m_spanner->flowThreadContainingBlock()->enterColumnSpannerBeforeLayout(m_spanner, m_spanner->parentBlock()->logicalHeight(), layoutScope); |
| + } |
| + |
| +private: |
| + RenderBox* m_spanner; |
| +}; |
| + |
| void RenderBlockFlow::layoutBlockChild(RenderBox* child, MarginInfo& marginInfo, LayoutUnit& previousFloatLogicalBottom) |
| { |
| LayoutUnit oldPosMarginBefore = maxPositiveMarginBefore(); |
| LayoutUnit oldNegMarginBefore = maxNegativeMarginBefore(); |
| + SubtreeLayoutScope layoutScope(*child); |
| + |
| + ColumnSpannerLayoutScope columnSpannerLayoutScope; |
| + if (child->isColumnSpanAll()) { |
| + LayoutUnit adjustment = columnSpannerLayoutScope.enterSpanner(child, layoutScope); |
| + // A spanner needs to start at an exact column boundary inside the flow thread, so that it |
| + // doesn't bleed into a preceding column. That's what the adjustment is about. |
| + setLogicalHeight(logicalHeight() + adjustment); |
| + } |
| + |
| // The child is a normal flow object. Compute the margins we will use for collapsing now. |
| child->computeAndSetBlockDirectionMargins(this); |
| @@ -592,7 +627,6 @@ void RenderBlockFlow::layoutBlockChild(RenderBox* child, MarginInfo& marginInfo, |
| previousFloatLogicalBottom = std::max(previousFloatLogicalBottom, oldLogicalTop + childRenderBlockFlow->lowestFloatLogicalBottom()); |
| } |
| - SubtreeLayoutScope layoutScope(*child); |
| if (!child->needsLayout()) |
| child->markForPaginationRelayoutIfNeeded(layoutScope); |
| @@ -867,6 +901,8 @@ void RenderBlockFlow::adjustLinePositionForPagination(RootInlineBox* lineBox, La |
| LayoutUnit RenderBlockFlow::adjustForUnsplittableChild(RenderBox* child, LayoutUnit logicalOffset, bool includeMargins) |
| { |
| + if (child->isColumnSpanAll()) |
| + return logicalOffset; |
| bool checkColumnBreaks = view()->layoutState()->isPaginatingColumns() || flowThreadContainingBlock(); |
| bool checkPageBreaks = !checkColumnBreaks && view()->layoutState()->pageLogicalHeight(); |
| bool isUnsplittable = child->isUnsplittableForPagination() || (checkColumnBreaks && child->style()->columnBreakInside() == PBAVOID) |
| @@ -1297,7 +1333,7 @@ LayoutUnit RenderBlockFlow::collapseMargins(RenderBox* child, MarginInfo& margin |
| // If margins would pull us past the top of the next page, then we need to pull back and pretend like the margins |
| // collapsed into the page edge. |
| LayoutState* layoutState = view()->layoutState(); |
| - if (layoutState->isPaginated() && layoutState->pageLogicalHeight() && logicalTop > beforeCollapseLogicalTop) { |
| + if (layoutState->isPaginated() && layoutState->pageLogicalHeight() && logicalTop > beforeCollapseLogicalTop && !child->isColumnSpanAll()) { |
|
Julien - ping for review
2014/12/03 23:02:22
This check feels magical. Why do column-span: all
mstensho (USE GERRIT)
2014/12/10 13:48:19
Calling nextPageLogicalTop() (see a couple of code
|
| LayoutUnit oldLogicalTop = logicalTop; |
| logicalTop = std::min(logicalTop, nextPageLogicalTop(beforeCollapseLogicalTop)); |
| setLogicalHeight(logicalHeight() + (logicalTop - oldLogicalTop)); |
| @@ -1513,7 +1549,7 @@ LayoutUnit RenderBlockFlow::estimateLogicalTopPosition(RenderBox* child, const M |
| // Adjust logicalTopEstimate down to the next page if the margins are so large that we don't fit on the current |
| // page. |
| LayoutState* layoutState = view()->layoutState(); |
| - if (layoutState->isPaginated() && layoutState->pageLogicalHeight() && logicalTopEstimate > logicalHeight()) |
| + if (layoutState->isPaginated() && layoutState->pageLogicalHeight() && logicalTopEstimate > logicalHeight() && !child->isColumnSpanAll()) |
|
Julien - ping for review
2014/12/03 23:02:22
Same comment :(
mstensho (USE GERRIT)
2014/12/10 13:48:19
Same reply as above, :) only that here we could po
|
| logicalTopEstimate = std::min(logicalTopEstimate, nextPageLogicalTop(logicalHeight())); |
| logicalTopEstimate += getClearDelta(child, logicalTopEstimate); |