Index: Source/core/rendering/RenderBlockFlow.cpp |
diff --git a/Source/core/rendering/RenderBlockFlow.cpp b/Source/core/rendering/RenderBlockFlow.cpp |
index 5ee2ccd0d47953db2e13d0d3835a93efee239b03..7c55d4ce820f1ac25ae4fdd37d27cda530df33fa 100644 |
--- a/Source/core/rendering/RenderBlockFlow.cpp |
+++ b/Source/core/rendering/RenderBlockFlow.cpp |
@@ -547,11 +547,50 @@ void RenderBlockFlow::setLogicalTopForChild(RenderBox* child, LayoutUnit logical |
} |
} |
+class ColumnSpannerLayoutScope { |
+public: |
+ ColumnSpannerLayoutScope() |
+ : m_spanner(0) { } |
+ |
+ ~ColumnSpannerLayoutScope() |
+ { |
+ if (!m_spanner) |
+ return; |
+ m_spanner->flowThreadContainingBlock()->leaveColumnSpanner(m_spanner, m_spanner->containingBlock()->logicalHeight()); |
+ } |
+ |
+ LayoutUnit enterSpanner(RenderBox* spanner, SubtreeLayoutScope& layoutScope) |
+ { |
+ ASSERT(!m_spanner); |
+ m_spanner = spanner; |
+ return m_spanner->flowThreadContainingBlock()->enterColumnSpanner(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()) { |
+ // Margins of a column spanner cannot collapse with anything. Block direction margins on |
+ // spanners will be ignored here, inside flow thread layout. Instead they'll be added around |
+ // the RenderMultiColumnSpannerSet. Now skip past the pending margin that belongs to the |
+ // columns. |
+ setLogicalHeight(logicalHeight() + marginInfo.margin()); |
+ marginInfo.clearMargin(); |
+ 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); |
@@ -593,7 +632,6 @@ void RenderBlockFlow::layoutBlockChild(RenderBox* child, MarginInfo& marginInfo, |
previousFloatLogicalBottom = std::max(previousFloatLogicalBottom, oldLogicalTop + childRenderBlockFlow->lowestFloatLogicalBottom()); |
} |
- SubtreeLayoutScope layoutScope(*child); |
if (!child->needsLayout()) |
child->markForPaginationRelayoutIfNeeded(layoutScope); |
@@ -1303,7 +1341,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)); |
@@ -1519,7 +1557,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); |