Index: Source/core/rendering/RenderBlockFlow.cpp |
diff --git a/Source/core/rendering/RenderBlockFlow.cpp b/Source/core/rendering/RenderBlockFlow.cpp |
index 601e798dfc88fa3d61c70ce487e112bc7085dec1..e67e947b377957ed25127eac28eb31a433da3bcd 100644 |
--- a/Source/core/rendering/RenderBlockFlow.cpp |
+++ b/Source/core/rendering/RenderBlockFlow.cpp |
@@ -38,6 +38,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" |
@@ -1827,7 +1828,7 @@ void RenderBlockFlow::styleDidChange(StyleDifference diff, const RenderStyle* ol |
} |
if (diff.needsFullLayout() || !oldStyle) |
- createOrDestroyMultiColumnFlowThreadIfNeeded(); |
+ createOrDestroyMultiColumnFlowThreadIfNeeded(oldStyle); |
} |
void RenderBlockFlow::updateStaticInlinePositionForChild(RenderBox* child, LayoutUnit logicalTop) |
@@ -2734,25 +2735,65 @@ RootInlineBox* RenderBlockFlow::createRootInlineBox() |
return new RootInlineBox(*this); |
} |
-void RenderBlockFlow::createOrDestroyMultiColumnFlowThreadIfNeeded() |
+bool RenderBlockFlow::isPagedOverflow(const RenderStyle* style) |
+{ |
+ return style->isOverflowPaged() && node() != document().viewportDefiningElement(); |
+} |
+ |
+RenderBlockFlow::FlowThreadType RenderBlockFlow::flowThreadType(const RenderStyle* style) |
+{ |
+ if (isPagedOverflow(style)) |
+ return PagedFlowThread; |
+ if (style->specifiesColumns()) |
+ return MultiColumnFlowThread; |
+ return NoFlowThread; |
+} |
+ |
+RenderMultiColumnFlowThread* RenderBlockFlow::createMultiColumnFlowThread(FlowThreadType type) |
+{ |
+ switch (type) { |
+ case MultiColumnFlowThread: |
+ return RenderMultiColumnFlowThread::createAnonymous(document(), style()); |
+ case PagedFlowThread: |
+ // Paged overflow is currently done using the multicol implementation. |
+ return RenderPagedFlowThread::createAnonymous(document(), style()); |
+ default: |
+ ASSERT_NOT_REACHED(); |
+ return nullptr; |
+ } |
+} |
+ |
+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. |
+ FlowThreadType type = flowThreadType(style()); |
+ |
+ if (multiColumnFlowThread()) { |
+ ASSERT(oldStyle); |
+ if (type != flowThreadType(oldStyle)) { |
+ // 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 (type == NoFlowThread || multiColumnFlowThread()) |
+ return; |
+ |
+ RenderMultiColumnFlowThread* flowThread = createMultiColumnFlowThread(type); |
+ addChild(flowThread); |
+ flowThread->populate(); |
+ RenderBlockFlowRareData& rareData = ensureRareData(); |
+ ASSERT(!rareData.m_multiColumnFlowThread); |
+ rareData.m_multiColumnFlowThread = flowThread; |
} |
RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData() |