| Index: Source/core/rendering/RenderBlockFlow.cpp | 
| diff --git a/Source/core/rendering/RenderBlockFlow.cpp b/Source/core/rendering/RenderBlockFlow.cpp | 
| index 0f3b3fee6997603689ee58c369c66c8cf0a0ca94..bc24ebc7121b36e2f0b03bda1f9a346a7723c706 100644 | 
| --- a/Source/core/rendering/RenderBlockFlow.cpp | 
| +++ b/Source/core/rendering/RenderBlockFlow.cpp | 
| @@ -38,6 +38,7 @@ | 
| #include "core/rendering/LayoutRectRecorder.h" | 
| #include "core/rendering/LayoutRepainter.h" | 
| #include "core/rendering/RenderLayer.h" | 
| +#include "core/rendering/RenderMultiColumnBlock.h" | 
| #include "core/rendering/RenderNamedFlowFragment.h" | 
| #include "core/rendering/RenderNamedFlowThread.h" | 
| #include "core/rendering/RenderText.h" | 
| @@ -219,57 +220,45 @@ void RenderBlockFlow::checkForPaginationLogicalHeightChange(LayoutUnit& pageLogi | 
| } | 
| } | 
|  | 
| -bool RenderBlockFlow::relayoutForPagination(bool hasSpecifiedPageLogicalHeight, LayoutUnit pageLogicalHeight, LayoutStateMaintainer& statePusher) | 
| +bool RenderBlockFlow::shouldRelayoutForPagination(LayoutUnit& pageLogicalHeight, LayoutUnit layoutOverflowLogicalBottom) const | 
| { | 
| -    if (!hasColumns()) | 
| -        return false; | 
| - | 
| -    OwnPtr<RenderOverflow> savedOverflow = m_overflow.release(); | 
| -    if (childrenInline()) | 
| -        addOverflowFromInlineChildren(); | 
| -    else | 
| -        addOverflowFromBlockChildren(); | 
| -    LayoutUnit layoutOverflowLogicalBottom = (isHorizontalWritingMode() ? layoutOverflowRect().maxY() : layoutOverflowRect().maxX()) - borderBefore() - paddingBefore(); | 
| - | 
| // FIXME: We don't balance properly at all in the presence of forced page breaks. We need to understand what | 
| // the distance between forced page breaks is so that we can avoid making the minimum column height too tall. | 
| ColumnInfo* colInfo = columnInfo(); | 
| -    if (!hasSpecifiedPageLogicalHeight) { | 
| -        LayoutUnit columnHeight = pageLogicalHeight; | 
| -        int minColumnCount = colInfo->forcedBreaks() + 1; | 
| -        int desiredColumnCount = colInfo->desiredColumnCount(); | 
| -        if (minColumnCount >= desiredColumnCount) { | 
| -            // The forced page breaks are in control of the balancing. Just set the column height to the | 
| -            // maximum page break distance. | 
| -            if (!pageLogicalHeight) { | 
| -                LayoutUnit distanceBetweenBreaks = max<LayoutUnit>(colInfo->maximumDistanceBetweenForcedBreaks(), | 
| -                    view()->layoutState()->pageLogicalOffset(this, borderBefore() + paddingBefore() + layoutOverflowLogicalBottom) - colInfo->forcedBreakOffset()); | 
| -                columnHeight = max(colInfo->minimumColumnHeight(), distanceBetweenBreaks); | 
| -            } | 
| -        } else if (layoutOverflowLogicalBottom > boundedMultiply(pageLogicalHeight, desiredColumnCount)) { | 
| -            // Now that we know the intrinsic height of the columns, we have to rebalance them. | 
| -            columnHeight = max<LayoutUnit>(colInfo->minimumColumnHeight(), ceilf((float)layoutOverflowLogicalBottom / desiredColumnCount)); | 
| +    LayoutUnit columnHeight = pageLogicalHeight; | 
| +    const int minColumnCount = colInfo->forcedBreaks() + 1; | 
| +    const int desiredColumnCount = colInfo->desiredColumnCount(); | 
| +    if (minColumnCount >= desiredColumnCount) { | 
| +        // The forced page breaks are in control of the balancing. Just set the column height to the | 
| +        // maximum page break distance. | 
| +        if (!pageLogicalHeight) { | 
| +            LayoutUnit distanceBetweenBreaks = max<LayoutUnit>(colInfo->maximumDistanceBetweenForcedBreaks(), | 
| +                view()->layoutState()->pageLogicalOffset(this, borderBefore() + paddingBefore() + layoutOverflowLogicalBottom) - colInfo->forcedBreakOffset()); | 
| +            columnHeight = max(colInfo->minimumColumnHeight(), distanceBetweenBreaks); | 
| } | 
| +    } else if (layoutOverflowLogicalBottom > boundedMultiply(pageLogicalHeight, desiredColumnCount)) { | 
| +        // Now that we know the intrinsic height of the columns, we have to rebalance them. | 
| +        columnHeight = max<LayoutUnit>(colInfo->minimumColumnHeight(), ceilf((float)layoutOverflowLogicalBottom / desiredColumnCount)); | 
| +    } | 
|  | 
| -        if (columnHeight && columnHeight != pageLogicalHeight) { | 
| -            statePusher.pop(); | 
| -            setEverHadLayout(true); | 
| -            layoutBlockFlow(false, columnHeight); | 
| -            return true; | 
| -        } | 
| +    if (columnHeight && columnHeight != pageLogicalHeight) { | 
| +        pageLogicalHeight = columnHeight; | 
| +        return true; | 
| } | 
|  | 
| +    return false; | 
| +} | 
| + | 
| +void RenderBlockFlow::setColumnCountAndHeight(unsigned count, LayoutUnit pageLogicalHeight) | 
| +{ | 
| +    ColumnInfo* colInfo = columnInfo(); | 
| if (pageLogicalHeight) | 
| -        colInfo->setColumnCountAndHeight(ceilf((float)layoutOverflowLogicalBottom / pageLogicalHeight), pageLogicalHeight); | 
| +        colInfo->setColumnCountAndHeight(count, pageLogicalHeight); | 
|  | 
| if (columnCount(colInfo)) { | 
| setLogicalHeight(borderBefore() + paddingBefore() + colInfo->columnHeight() + borderAfter() + paddingAfter() + scrollbarLogicalHeight()); | 
| m_overflow.clear(); | 
| -    } else { | 
| -        m_overflow = savedOverflow.release(); | 
| } | 
| - | 
| -    return false; | 
| } | 
|  | 
| bool RenderBlockFlow::isSelfCollapsingBlock() const | 
| @@ -280,11 +269,6 @@ bool RenderBlockFlow::isSelfCollapsingBlock() const | 
|  | 
| void RenderBlockFlow::layoutBlock(bool relayoutChildren) | 
| { | 
| -    layoutBlockFlow(relayoutChildren); | 
| -} | 
| - | 
| -inline void RenderBlockFlow::layoutBlockFlow(bool relayoutChildren, LayoutUnit pageLogicalHeight) | 
| -{ | 
| ASSERT(needsLayout()); | 
| ASSERT(isInlineBlockOrInlineTable() || !isInline()); | 
|  | 
| @@ -296,6 +280,20 @@ inline void RenderBlockFlow::layoutBlockFlow(bool relayoutChildren, LayoutUnit p | 
| if (!relayoutChildren && simplifiedLayout()) | 
| return; | 
|  | 
| +    SubtreeLayoutScope layoutScope(this); | 
| + | 
| +    // Multiple passes might be required for column and pagination based layout | 
| +    // In the case of the old column code the number of passes will only be two | 
| +    // however, in the newer column code the number of passes could equal the | 
| +    // number of columns. | 
| +    bool done = false; | 
| +    LayoutUnit pageLogicalHeight = 0; | 
| +    while (!done) | 
| +        done = layoutBlockFlow(relayoutChildren, pageLogicalHeight, layoutScope); | 
| +} | 
| + | 
| +inline bool RenderBlockFlow::layoutBlockFlow(bool relayoutChildren, LayoutUnit &pageLogicalHeight, SubtreeLayoutScope& layoutScope) | 
| +{ | 
| LayoutRepainter repainter(*this, checkForRepaintDuringLayout()); | 
|  | 
| if (updateLogicalWidthAndColumnWidth()) | 
| @@ -336,8 +334,6 @@ inline void RenderBlockFlow::layoutBlockFlow(bool relayoutChildren, LayoutUnit p | 
| setPaginationStrut(0); | 
| } | 
|  | 
| -    SubtreeLayoutScope layoutScope(this); | 
| - | 
| LayoutUnit beforeEdge = borderBefore() + paddingBefore(); | 
| LayoutUnit afterEdge = borderAfter() + paddingAfter() + scrollbarLogicalHeight(); | 
| LayoutUnit previousHeight = logicalHeight(); | 
| @@ -363,16 +359,41 @@ inline void RenderBlockFlow::layoutBlockFlow(bool relayoutChildren, LayoutUnit p | 
|  | 
| if (frameView()->partialLayout().isStopping()) { | 
| statePusher.pop(); | 
| -        return; | 
| +        return true; | 
| } | 
|  | 
| // Expand our intrinsic height to encompass floats. | 
| if (lowestFloatLogicalBottom() > (logicalHeight() - afterEdge) && createsBlockFormattingContext()) | 
| setLogicalHeight(lowestFloatLogicalBottom() + afterEdge); | 
|  | 
| -    if (relayoutForPagination(hasSpecifiedPageLogicalHeight, pageLogicalHeight, statePusher) || relayoutToAvoidWidows(statePusher)) { | 
| -        ASSERT(!shouldBreakAtLineToAvoidWidow()); | 
| -        return; | 
| +    if (isRenderMultiColumnBlock()) { | 
| +        if (toRenderMultiColumnBlock(this)->shouldRelayoutMultiColumnBlock()) { | 
| +            setChildNeedsLayout(MarkOnlyThis); | 
| +            statePusher.pop(); | 
| +            return false; | 
| +        } | 
| +    } else if (hasColumns()) { | 
| +        OwnPtr<RenderOverflow> savedOverflow = m_overflow.release(); | 
| +        if (childrenInline()) | 
| +            addOverflowFromInlineChildren(); | 
| +        else | 
| +            addOverflowFromBlockChildren(); | 
| +        LayoutUnit layoutOverflowLogicalBottom = (isHorizontalWritingMode() ? layoutOverflowRect().maxY() : layoutOverflowRect().maxX()) - borderBefore() - paddingBefore(); | 
| +        m_overflow = savedOverflow.release(); | 
| + | 
| +        if (!hasSpecifiedPageLogicalHeight && shouldRelayoutForPagination(pageLogicalHeight, layoutOverflowLogicalBottom)) { | 
| +            statePusher.pop(); | 
| +            setEverHadLayout(true); | 
| +            return false; | 
| +        } | 
| + | 
| +        setColumnCountAndHeight(ceilf((float)layoutOverflowLogicalBottom / pageLogicalHeight), pageLogicalHeight); | 
| +    } | 
| + | 
| +    if (shouldBreakAtLineToAvoidWidow()) { | 
| +        statePusher.pop(); | 
| +        setEverHadLayout(true); | 
| +        return false; | 
| } | 
|  | 
| // Calculate our new height. | 
| @@ -415,7 +436,7 @@ inline void RenderBlockFlow::layoutBlockFlow(bool relayoutChildren, LayoutUnit p | 
| fitBorderToLinesIfNeeded(); | 
|  | 
| if (frameView()->partialLayout().isStopping()) | 
| -        return; | 
| +        return true; | 
|  | 
| if (renderView->layoutState()->m_pageLogicalHeight) | 
| setPageLogicalOffset(renderView->layoutState()->pageLogicalOffset(this, logicalTop())); | 
| @@ -436,6 +457,7 @@ inline void RenderBlockFlow::layoutBlockFlow(bool relayoutChildren, LayoutUnit p | 
| } | 
|  | 
| clearNeedsLayout(); | 
| +    return true; | 
| } | 
|  | 
| void RenderBlockFlow::layoutBlockChild(RenderBox* child, MarginInfo& marginInfo, LayoutUnit& previousFloatLogicalBottom, LayoutUnit& maxFloatLogicalBottom) | 
|  |