| Index: Source/core/rendering/RenderBlockFlow.cpp
|
| diff --git a/Source/core/rendering/RenderBlockFlow.cpp b/Source/core/rendering/RenderBlockFlow.cpp
|
| index 79571ad4b80534c6cc8771980d42f5d73a334acc..eac51cc39be917dcdbf7ffdd6d5eb17766a099ac 100644
|
| --- a/Source/core/rendering/RenderBlockFlow.cpp
|
| +++ b/Source/core/rendering/RenderBlockFlow.cpp
|
| @@ -544,11 +544,44 @@ void RenderBlockFlow::setLogicalTopForChild(RenderBox* child, LayoutUnit logical
|
| }
|
| }
|
|
|
| +class ColumnSpannerLayoutScope {
|
| +public:
|
| + ColumnSpannerLayoutScope()
|
| + : m_spanner(0) { }
|
| +
|
| + ~ColumnSpannerLayoutScope()
|
| + {
|
| + if (!m_spanner)
|
| + return;
|
| + m_spanner->flowThreadContainingBlock()->leaveColumnSpannerAfterLayout(m_spanner, m_spanner->containingBlock()->logicalHeight());
|
| + }
|
| +
|
| + LayoutUnit enterSpanner(RenderBox* spanner, SubtreeLayoutScope& layoutScope)
|
| + {
|
| + ASSERT(!m_spanner);
|
| + m_spanner = spanner;
|
| + return m_spanner->flowThreadContainingBlock()->enterColumnSpannerBeforeLayout(m_spanner, m_spanner->containingBlock()->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);
|
|
|
| @@ -590,7 +623,6 @@ void RenderBlockFlow::layoutBlockChild(RenderBox* child, MarginInfo& marginInfo,
|
| previousFloatLogicalBottom = std::max(previousFloatLogicalBottom, oldLogicalTop + childRenderBlockFlow->lowestFloatLogicalBottom());
|
| }
|
|
|
| - SubtreeLayoutScope layoutScope(*child);
|
| if (!child->needsLayout())
|
| child->markForPaginationRelayoutIfNeeded(layoutScope);
|
|
|
| @@ -1295,7 +1327,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()) {
|
| LayoutUnit oldLogicalTop = logicalTop;
|
| logicalTop = std::min(logicalTop, nextPageLogicalTop(beforeCollapseLogicalTop));
|
| setLogicalHeight(logicalHeight() + (logicalTop - oldLogicalTop));
|
| @@ -1511,7 +1543,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())
|
| logicalTopEstimate = std::min(logicalTopEstimate, nextPageLogicalTop(logicalHeight()));
|
|
|
| logicalTopEstimate += getClearDelta(child, logicalTopEstimate);
|
|
|