Index: Source/WebCore/rendering/RenderBox.cpp |
=================================================================== |
--- Source/WebCore/rendering/RenderBox.cpp (revision 115616) |
+++ Source/WebCore/rendering/RenderBox.cpp (working copy) |
@@ -4061,4 +4061,71 @@ |
|| style()->logicalMaxHeight().isPercent(); |
} |
+void RenderBox::moveChildTo(RenderBox* toBox, RenderObject* child, RenderObject* beforeChild, bool fullRemoveInsert) |
+{ |
+ ASSERT(this == child->parent()); |
+ ASSERT(!beforeChild || toBox == beforeChild->parent()); |
+ if (fullRemoveInsert && toBox->isRenderBlock()) { |
+ // Takes care of adding the new child correctly if toBlock and fromBlock |
+ // have different kind of children (block vs inline). |
+ toBox->addChild(virtualChildren()->removeChildNode(this, child), beforeChild); |
+ } else |
+ toBox->virtualChildren()->insertChildNode(toBox, virtualChildren()->removeChildNode(this, child, fullRemoveInsert), beforeChild, fullRemoveInsert); |
+} |
+ |
+void RenderBox::moveChildrenTo(RenderBox* toBox, RenderObject* startChild, RenderObject* endChild, RenderObject* beforeChild, bool fullRemoveInsert) |
+{ |
+ ASSERT(!beforeChild || toBox == beforeChild->parent()); |
+ for (RenderObject* child = startChild; child && child != endChild; ) { |
+ // Save our next sibling as moveChildTo will clear it. |
+ RenderObject* nextSibling = child->nextSibling(); |
+ moveChildTo(toBox, child, beforeChild, fullRemoveInsert); |
+ child = nextSibling; |
+ } |
+} |
+ |
+static void markBoxForRelayoutAfterSplit(RenderBox* box) |
+{ |
+ // FIXME: The table code should handle that automatically. If not, |
+ // we should fix it and remove the table part checks. |
+ if (box->isTable()) |
+ toRenderTable(box)->setNeedsSectionRecalc(); |
+ else if (box->isTableSection()) |
+ toRenderTableSection(box)->setNeedsCellRecalc(); |
+ |
+ box->setNeedsLayoutAndPrefWidthsRecalc(); |
+} |
+ |
+RenderObject* RenderBox::splitAnonymousBoxesAroundChild(RenderObject* beforeChild) |
+{ |
+ bool didSplitParentAnonymousBoxes = false; |
+ |
+ while (beforeChild->parent() != this) { |
+ RenderBox* boxToSplit = toRenderBox(beforeChild->parent()); |
+ if (boxToSplit->firstChild() != beforeChild && boxToSplit->isAnonymous()) { |
+ didSplitParentAnonymousBoxes = true; |
+ |
+ // We have to split the parent box into two boxes and move children |
+ // from |beforeChild| to end into the new post box. |
+ RenderBox* postBox = boxToSplit->createAnonymousBoxWithSameTypeAs(this); |
+ postBox->setChildrenInline(boxToSplit->childrenInline()); |
+ RenderBox* parentBox = toRenderBox(boxToSplit->parent()); |
+ parentBox->virtualChildren()->insertChildNode(parentBox, postBox, boxToSplit->nextSibling()); |
+ boxToSplit->moveChildrenTo(postBox, beforeChild, 0, boxToSplit->hasLayer()); |
+ |
+ markBoxForRelayoutAfterSplit(boxToSplit); |
+ markBoxForRelayoutAfterSplit(postBox); |
+ |
+ beforeChild = postBox; |
+ } else |
+ beforeChild = boxToSplit; |
+ } |
+ |
+ if (didSplitParentAnonymousBoxes) |
+ markBoxForRelayoutAfterSplit(this); |
+ |
+ ASSERT(beforeChild->parent() == this); |
+ return beforeChild; |
+} |
+ |
} // namespace WebCore |