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

Unified Diff: Source/WebCore/rendering/RenderBox.cpp

Issue 10261009: Merge 113581 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1084/
Patch Set: Created 8 years, 8 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/WebCore/rendering/RenderBox.h ('k') | Source/WebCore/rendering/RenderObject.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « Source/WebCore/rendering/RenderBox.h ('k') | Source/WebCore/rendering/RenderObject.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698