Chromium Code Reviews| Index: Source/core/rendering/RenderBlockFlow.cpp |
| diff --git a/Source/core/rendering/RenderBlockFlow.cpp b/Source/core/rendering/RenderBlockFlow.cpp |
| index 23336e8eb52c4db174c03fc8c595c0d7a6ccfb75..cd3387d1316adc084fa7ce26941c25251726d17c 100644 |
| --- a/Source/core/rendering/RenderBlockFlow.cpp |
| +++ b/Source/core/rendering/RenderBlockFlow.cpp |
| @@ -39,7 +39,7 @@ |
| #include "core/rendering/LayoutRepainter.h" |
| #include "core/rendering/RenderFlowThread.h" |
| #include "core/rendering/RenderLayer.h" |
| -#include "core/rendering/RenderMultiColumnBlock.h" |
| +#include "core/rendering/RenderMultiColumnFlowThread.h" |
| #include "core/rendering/RenderText.h" |
| #include "core/rendering/RenderView.h" |
| #include "core/rendering/line/LineWidth.h" |
| @@ -176,10 +176,37 @@ RenderBlockFlow* RenderBlockFlow::createAnonymousBlockFlow() const |
| return toRenderBlockFlow(createAnonymousWithParentRendererAndDisplay(this, BLOCK)); |
| } |
| +RenderObject* RenderBlockFlow::layoutSpecialExcludedChild(bool relayoutChildren, SubtreeLayoutScope& layoutScope) |
|
ojan
2014/02/26 02:56:39
Makes me a little sad to add more overrides of thi
|
| +{ |
| + RenderMultiColumnFlowThread* flowThread = multiColumnFlowThread(); |
| + if (!flowThread) |
| + return 0; |
| + setLogicalTopForChild(flowThread, borderBefore() + paddingBefore()); |
| + flowThread->layoutColumns(relayoutChildren, layoutScope); |
| + determineLogicalLeftPositionForChild(flowThread); |
| + return flowThread; |
| +} |
| + |
| +bool RenderBlockFlow::updateLogicalWidthAndColumnWidth() |
| +{ |
| + bool relayoutChildren = RenderBlock::updateLogicalWidthAndColumnWidth(); |
| + if (RenderMultiColumnFlowThread* flowThread = multiColumnFlowThread()) { |
| + if (flowThread->computeColumnCountAndWidth()) |
| + return true; |
| + } |
| + return relayoutChildren; |
| +} |
| + |
| void RenderBlockFlow::checkForPaginationLogicalHeightChange(LayoutUnit& pageLogicalHeight, bool& pageLogicalHeightChanged, bool& hasSpecifiedPageLogicalHeight) |
| { |
| - ColumnInfo* colInfo = columnInfo(); |
| - if (hasColumns()) { |
| + if (RenderMultiColumnFlowThread* flowThread = multiColumnFlowThread()) { |
| + // We don't actually update any of the variables. We just subclassed to adjust our column height. |
| + updateLogicalHeight(); |
| + flowThread->setColumnHeightAvailable(std::max<LayoutUnit>(contentLogicalHeight(), 0)); |
| + setLogicalHeight(0); |
| + } else if (hasColumns()) { |
| + ColumnInfo* colInfo = columnInfo(); |
| + |
| if (!pageLogicalHeight) { |
| LayoutUnit oldLogicalHeight = logicalHeight(); |
| setLogicalHeight(0); |
| @@ -342,8 +369,8 @@ inline bool RenderBlockFlow::layoutBlockFlow(bool relayoutChildren, LayoutUnit & |
| if (lowestFloatLogicalBottom() > (logicalHeight() - afterEdge) && createsBlockFormattingContext()) |
| setLogicalHeight(lowestFloatLogicalBottom() + afterEdge); |
| - if (isRenderMultiColumnBlock()) { |
| - if (toRenderMultiColumnBlock(this)->shouldRelayoutMultiColumnBlock()) { |
| + if (RenderMultiColumnFlowThread* flowThread = multiColumnFlowThread()) { |
| + if (flowThread->recalculateColumnHeights()) { |
| setChildNeedsLayout(MarkOnlyThis); |
| statePusher.pop(); |
| return false; |
| @@ -1809,6 +1836,8 @@ void RenderBlockFlow::styleDidChange(StyleDifference diff, const RenderStyle* ol |
| parentBlockFlow->markAllDescendantsWithFloatsForLayout(); |
| parentBlockFlow->markSiblingsWithFloatsForLayout(); |
| } |
| + |
| + createMultiColumnFlowThreadIfNeeded(); |
| } |
| void RenderBlockFlow::updateStaticInlinePositionForChild(RenderBox* child, LayoutUnit logicalTop) |
| @@ -1824,6 +1853,13 @@ void RenderBlockFlow::setStaticInlinePositionForChild(RenderBox* child, LayoutUn |
| child->layer()->setStaticInlinePosition(inlinePosition); |
| } |
| +void RenderBlockFlow::addChild(RenderObject* newChild, RenderObject* beforeChild) |
| +{ |
| + if (RenderMultiColumnFlowThread* flowThread = multiColumnFlowThread()) |
| + return flowThread->addChild(newChild, beforeChild); |
| + RenderBlock::addChild(newChild, beforeChild); |
| +} |
| + |
| void RenderBlockFlow::moveAllChildrenIncludingFloatsTo(RenderBlock* toBlock, bool fullRemoveInsert) |
| { |
| RenderBlockFlow* toBlockFlow = toRenderBlockFlow(toBlock); |
| @@ -2732,6 +2768,22 @@ RootInlineBox* RenderBlockFlow::createRootInlineBox() |
| return new RootInlineBox(this); |
| } |
| +void RenderBlockFlow::createMultiColumnFlowThreadIfNeeded() |
| +{ |
| + if ((style()->hasAutoColumnCount() && style()->hasAutoColumnWidth()) || !document().regionBasedColumnsEnabled()) |
| + return; |
| + |
| + if (multiColumnFlowThread()) |
| + return; |
| + |
| + setChildrenInline(false); |
| + RenderMultiColumnFlowThread* flowThread = RenderMultiColumnFlowThread::createAnonymous(document(), style()); |
| + RenderBlock::addChild(flowThread); |
| + RenderBlockFlowRareData& rareData = ensureRareData(); |
| + ASSERT(!rareData.m_multiColumnFlowThread); |
| + rareData.m_multiColumnFlowThread = flowThread; |
| +} |
| + |
| RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData() |
| { |
| if (m_rareData) |