Index: Source/core/rendering/RenderMultiColumnFlowThread.cpp |
diff --git a/Source/core/rendering/RenderMultiColumnFlowThread.cpp b/Source/core/rendering/RenderMultiColumnFlowThread.cpp |
index 070408cc3577962fc0ead4cc1e8607ea7d67f068..027a721718c1ac30a2d8e0adff3403bd05575fc0 100644 |
--- a/Source/core/rendering/RenderMultiColumnFlowThread.cpp |
+++ b/Source/core/rendering/RenderMultiColumnFlowThread.cpp |
@@ -73,6 +73,57 @@ RenderMultiColumnSet* RenderMultiColumnFlowThread::lastMultiColumnSet() const |
return 0; |
} |
+static RenderObject* firstRendererInSet(RenderMultiColumnSet* multicolSet) |
+{ |
+ RenderBox* sibling = multicolSet->previousSiblingMultiColumnBox(); |
+ if (!sibling) |
+ return multicolSet->flowThread()->firstChild(); |
+ // Adjacent column content sets should not occur. We would have no way of figuring out what each |
+ // of them contains then. |
+ ASSERT(sibling->isRenderMultiColumnSpannerPlaceholder()); |
+ return toRenderMultiColumnSpannerPlaceholder(sibling)->rendererInFlowThread()->nextInPreOrderAfterChildren(multicolSet->flowThread()); |
+} |
+ |
+static RenderObject* lastRendererInSet(RenderMultiColumnSet* multicolSet) |
+{ |
+ RenderBox* sibling = multicolSet->nextSiblingMultiColumnBox(); |
+ if (!sibling) |
+ return 0; // By right we should return lastLeafChild() here, but the caller doesn't care, so just return 0. |
+ // Adjacent column content sets should not occur. We would have no way of figuring out what each |
+ // of them contains then. |
+ ASSERT(sibling->isRenderMultiColumnSpannerPlaceholder()); |
+ return toRenderMultiColumnSpannerPlaceholder(sibling)->rendererInFlowThread()->previousInPreOrder(multicolSet->flowThread()); |
+} |
+ |
+RenderMultiColumnSet* RenderMultiColumnFlowThread::findSetRendering(RenderObject* renderer) const |
+{ |
+ ASSERT(!containingColumnSpannerPlaceholder(renderer)); // should not be used for spanners or content inside them. |
+ ASSERT(renderer != this); |
+ ASSERT(renderer->isDescendantOf(this)); |
+ RenderMultiColumnSet* multicolSet = firstMultiColumnSet(); |
+ if (!multicolSet) |
+ return 0; |
+ if (!multicolSet->nextSiblingMultiColumnSet()) |
+ return multicolSet; |
+ |
+ // This is potentially SLOW! But luckily very uncommon. You would have to dynamically insert a |
+ // spanner into the middle of column contents to need this. |
+ for (; multicolSet; multicolSet = multicolSet->nextSiblingMultiColumnSet()) { |
+ RenderObject* firstRenderer = firstRendererInSet(multicolSet); |
+ RenderObject* lastRenderer = lastRendererInSet(multicolSet); |
+ ASSERT(firstRenderer); |
+ |
+ for (RenderObject* walker = firstRenderer; walker; walker = walker->nextInPreOrder(this)) { |
+ if (walker == renderer) |
+ return multicolSet; |
+ if (walker == lastRenderer) |
+ break; |
+ } |
+ } |
+ |
+ return 0; |
+} |
+ |
RenderMultiColumnSpannerPlaceholder* RenderMultiColumnFlowThread::containingColumnSpannerPlaceholder(const RenderObject* descendant) const |
{ |
ASSERT(descendant->isDescendantOf(this)); |