Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1408)

Unified Diff: Source/core/rendering/RenderBlockFlow.cpp

Issue 364233005: [New Multicolumn] Support for paged overflow. (By mstensho). (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Run fast/pagination in virtual/regionbasedmulticol. Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/RenderBlockFlow.h ('k') | Source/core/rendering/RenderFlowThread.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()
« no previous file with comments | « Source/core/rendering/RenderBlockFlow.h ('k') | Source/core/rendering/RenderFlowThread.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698