 Chromium Code Reviews
 Chromium Code Reviews Issue 295373006:
  [New Multicolumn] Support for paged overflow.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/blink.git@master
    
  
    Issue 295373006:
  [New Multicolumn] Support for paged overflow.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/blink.git@master| Index: Source/core/rendering/RenderBlockFlow.cpp | 
| diff --git a/Source/core/rendering/RenderBlockFlow.cpp b/Source/core/rendering/RenderBlockFlow.cpp | 
| index e5fadb246635972590f86ef26c5dc2cece8f79f8..d65f741ff88c6f6488d9b67be75c46320848aff7 100644 | 
| --- a/Source/core/rendering/RenderBlockFlow.cpp | 
| +++ b/Source/core/rendering/RenderBlockFlow.cpp | 
| @@ -39,6 +39,7 @@ | 
| #include "core/rendering/RenderFlowThread.h" | 
| #include "core/rendering/RenderLayer.h" | 
| #include "core/rendering/RenderMultiColumnFlowThread.h" | 
| +#include "core/rendering/RenderPagedFlowThread.h" | 
| #include "core/rendering/RenderText.h" | 
| #include "core/rendering/RenderView.h" | 
| #include "core/rendering/line/LineWidth.h" | 
| @@ -1861,7 +1862,7 @@ void RenderBlockFlow::styleDidChange(StyleDifference diff, const RenderStyle* ol | 
| } | 
| if (diff.needsFullLayout() || !oldStyle) | 
| - createOrDestroyMultiColumnFlowThreadIfNeeded(); | 
| + createOrDestroyMultiColumnFlowThreadIfNeeded(oldStyle); | 
| } | 
| void RenderBlockFlow::updateStaticInlinePositionForChild(RenderBox* child, LayoutUnit logicalTop) | 
| @@ -2779,25 +2780,49 @@ RootInlineBox* RenderBlockFlow::createRootInlineBox() | 
| return new RootInlineBox(*this); | 
| } | 
| -void RenderBlockFlow::createOrDestroyMultiColumnFlowThreadIfNeeded() | 
| +static inline bool isPagedOverflow(const RenderBlockFlow* renderer, const RenderStyle* style) | 
| +{ | 
| + return style->isOverflowPaged() && renderer->node() != renderer->document().viewportDefiningElement(); | 
| 
rune
2014/06/18 22:09:05
"this" is always passed as renderer. Why not make
 | 
| +} | 
| + | 
| +void RenderBlockFlow::createOrDestroyMultiColumnFlowThreadIfNeeded(const RenderStyle* oldStyle) | 
| { | 
| if (!document().regionBasedColumnsEnabled()) | 
| return; | 
| - bool needsFlowThread = style()->specifiesColumns(); | 
| - if (needsFlowThread != static_cast<bool>(multiColumnFlowThread())) { | 
| - if (needsFlowThread) { | 
| - RenderMultiColumnFlowThread* flowThread = RenderMultiColumnFlowThread::createAnonymous(document(), style()); | 
| - addChild(flowThread); | 
| - flowThread->populate(); | 
| - RenderBlockFlowRareData& rareData = ensureRareData(); | 
| - ASSERT(!rareData.m_multiColumnFlowThread); | 
| - rareData.m_multiColumnFlowThread = flowThread; | 
| - } else { | 
| + // Paged overflow trumps multicol in this implementation. Ideally, it should be possible to have | 
| + // both paged overflow and multicol on the same element, but then we need two flow | 
| + // threads. Anyway, this is nothing to worry about until we can actually nest multicol properly | 
| + // inside other fragmentation contexts. | 
| + bool shouldBePaged = isPagedOverflow(this, style()); | 
| + bool shouldBeMulticol = !shouldBePaged && style()->specifiesColumns(); | 
| + | 
| 
rune
2014/06/18 22:09:05
We can get rid of this code duplication. Also we c
 | 
| + if (multiColumnFlowThread()) { | 
| + ASSERT(oldStyle); | 
| + bool wasPaged = isPagedOverflow(this, oldStyle); | 
| + bool wasMulticol = !wasPaged && oldStyle->specifiesColumns(); | 
| + if (wasMulticol != shouldBeMulticol || wasPaged != shouldBePaged) { | 
| + // If we're no longer to be multicol/paged, destroy the flow thread. Also destroy it | 
| + // when switching between multicol and paged, since that affects the column set | 
| + // structure (multicol containers may have spanners, paged containers may not). | 
| multiColumnFlowThread()->evacuateAndDestroy(); | 
| ASSERT(!multiColumnFlowThread()); | 
| } | 
| } | 
| + if ((shouldBeMulticol || shouldBePaged) && !multiColumnFlowThread()) { | 
| + RenderMultiColumnFlowThread* flowThread; | 
| + if (shouldBePaged) { | 
| + // Paged overflow is currently done using the multicol implementation. | 
| + flowThread = RenderPagedFlowThread::createAnonymous(document(), style()); | 
| + } else { | 
| + flowThread = RenderMultiColumnFlowThread::createAnonymous(document(), style()); | 
| + } | 
| + addChild(flowThread); | 
| + flowThread->populate(); | 
| + RenderBlockFlowRareData& rareData = ensureRareData(); | 
| + ASSERT(!rareData.m_multiColumnFlowThread); | 
| + rareData.m_multiColumnFlowThread = flowThread; | 
| + } | 
| } | 
| RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData() |