| Index: third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
 | 
| diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
 | 
| index af0e52e9c45cc6da33515403056027086861aa55..765126c2e13257b71d7bc5c96b305fae7ea3ed5d 100644
 | 
| --- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
 | 
| +++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
 | 
| @@ -166,6 +166,18 @@ public:
 | 
|          , m_previousBreakAfterValue(BreakAuto)
 | 
|          , m_isAtFirstInFlowChild(true) { }
 | 
|  
 | 
| +    // Store multicol layout state before first layout of a block child. The child may contain a
 | 
| +    // column spanner. If we need to re-lay out the block child because our initial logical top
 | 
| +    // estimate was wrong, we need to roll back to how things were before laying out the child.
 | 
| +    void storeMultiColumnLayoutState(const LayoutFlowThread& flowThread)
 | 
| +    {
 | 
| +        m_multiColumnLayoutState = flowThread.multiColumnLayoutState();
 | 
| +    }
 | 
| +    void rollBackToInitialMultiColumnLayoutState(LayoutFlowThread& flowThread)
 | 
| +    {
 | 
| +        flowThread.restoreMultiColumnLayoutState(m_multiColumnLayoutState);
 | 
| +    }
 | 
| +
 | 
|      const MarginInfo& marginInfo() const { return m_marginInfo; }
 | 
|      MarginInfo& marginInfo() { return m_marginInfo; }
 | 
|      LayoutUnit& previousFloatLogicalBottom() { return m_previousFloatLogicalBottom; }
 | 
| @@ -177,6 +189,7 @@ public:
 | 
|      void clearIsAtFirstInFlowChild() { m_isAtFirstInFlowChild = false; }
 | 
|  
 | 
|  private:
 | 
| +    MultiColumnLayoutState m_multiColumnLayoutState;
 | 
|      MarginInfo m_marginInfo;
 | 
|      LayoutUnit m_previousFloatLogicalBottom;
 | 
|      EBreak m_previousBreakAfterValue;
 | 
| @@ -623,6 +636,9 @@ void LayoutBlockFlow::markDescendantsWithFloatsForLayoutIfNeeded(LayoutBlockFlow
 | 
|  
 | 
|  bool LayoutBlockFlow::positionAndLayoutOnceIfNeeded(LayoutBox& child, LayoutUnit newLogicalTop, BlockChildrenLayoutInfo& layoutInfo)
 | 
|  {
 | 
| +    if (LayoutFlowThread* flowThread = flowThreadContainingBlock())
 | 
| +        layoutInfo.rollBackToInitialMultiColumnLayoutState(*flowThread);
 | 
| +
 | 
|      if (child.isLayoutBlockFlow()) {
 | 
|          LayoutUnit& previousFloatLogicalBottom = layoutInfo.previousFloatLogicalBottom();
 | 
|          LayoutBlockFlow& childBlockFlow = toLayoutBlockFlow(child);
 | 
| @@ -698,6 +714,9 @@ void LayoutBlockFlow::layoutBlockChild(LayoutBox& child, BlockChildrenLayoutInfo
 | 
|      // Cache our old rect so that we can dirty the proper paint invalidation rects if the child moves.
 | 
|      LayoutRect oldRect = child.frameRect();
 | 
|  
 | 
| +    if (LayoutFlowThread* flowThread = flowThreadContainingBlock())
 | 
| +        layoutInfo.storeMultiColumnLayoutState(*flowThread);
 | 
| +
 | 
|      // Use the estimated block position and lay out the child if needed. After child layout, when
 | 
|      // we have enough information to perform proper margin collapsing, float clearing and
 | 
|      // pagination, we may have to reposition and lay out again if the estimate was wrong.
 | 
| 
 |