Index: WebCore/rendering/RenderBlock.cpp |
=================================================================== |
--- WebCore/rendering/RenderBlock.cpp (revision 73302) |
+++ WebCore/rendering/RenderBlock.cpp (working copy) |
@@ -400,8 +400,13 @@ |
RenderObject* beforeChild, RenderBoxModelObject* oldCont) |
{ |
// Create a clone of this inline. |
- RenderBlock* cloneBlock = clone(); |
- cloneBlock->setContinuation(oldCont); |
+ RenderBlock* cloneBlock; |
+ if (isAnonymousBlock()) |
+ cloneBlock = createAnonymousBlock(); |
+ else { |
+ cloneBlock = clone(); |
+ cloneBlock->setContinuation(oldCont); |
+ } |
// Now take all of the children from beforeChild to the end and remove |
// them from |this| and place them in the clone. |
@@ -410,7 +415,8 @@ |
moveChildrenTo(cloneBlock, beforeChild, 0); |
// Hook |clone| up as the continuation of the middle block. |
- middleBlock->setContinuation(cloneBlock); |
+ if (!cloneBlock->isAnonymousBlock()) |
+ middleBlock->setContinuation(cloneBlock); |
// We have been reparented and are now under the fromBlock. We need |
// to walk up our block parent chain until we hit the containing anonymous columns block. |
@@ -419,13 +425,13 @@ |
RenderBoxModelObject* currChild = this; |
while (curr && curr != fromBlock) { |
- ASSERT(curr->isRenderBlock() && !curr->isAnonymousBlock()); |
+ ASSERT(curr->isRenderBlock()); |
RenderBlock* blockCurr = toRenderBlock(curr); |
// Create a new clone. |
RenderBlock* cloneChild = cloneBlock; |
- cloneBlock = blockCurr->clone(); |
+ cloneBlock = blockCurr->isAnonymousBlock() ? blockCurr->createAnonymousBlock() : blockCurr->clone(); |
// Insert our child clone as the first child. |
cloneBlock->children()->appendChildNode(cloneBlock, cloneChild); |
@@ -623,6 +629,41 @@ |
beforeChild = lastRenderer->lastChild(); |
} |
+ // If the requested beforeChild is not one of our children, then this is because |
+ // there is an anonymous container within this object that contains the beforeChild. |
+ if (beforeChild && beforeChild->parent() != this) { |
+ RenderObject* anonymousChild = beforeChild->parent(); |
+ ASSERT(anonymousChild); |
+ |
+ while (anonymousChild->parent() != this) |
+ anonymousChild = anonymousChild->parent(); |
+ |
+ ASSERT(anonymousChild->isAnonymous()); |
+ |
+ if (anonymousChild->isAnonymousBlock()) { |
+ // Insert the child into the anonymous block box instead of here. |
+ if (newChild->isInline() || beforeChild->parent()->firstChild() != beforeChild) |
+ beforeChild->parent()->addChild(newChild, beforeChild); |
+ else |
+ addChild(newChild, beforeChild->parent()); |
+ return; |
+ } |
+ |
+ ASSERT(anonymousChild->isTable()); |
+ if ((newChild->isTableCol() && newChild->style()->display() == TABLE_COLUMN_GROUP) |
+ || (newChild->isRenderBlock() && newChild->style()->display() == TABLE_CAPTION) |
+ || newChild->isTableSection() |
+ || newChild->isTableRow() |
+ || newChild->isTableCell()) { |
+ // Insert into the anonymous table. |
+ anonymousChild->addChild(newChild, beforeChild); |
+ return; |
+ } |
+ |
+ // Go on to insert before the anonymous table. |
+ beforeChild = anonymousChild; |
+ } |
+ |
// Check for a spanning element in columns. |
RenderBlock* columnsBlockAncestor = columnsBlockForSpanningElement(newChild); |
if (columnsBlockAncestor) { |
@@ -658,41 +699,6 @@ |
bool madeBoxesNonInline = false; |
- // If the requested beforeChild is not one of our children, then this is because |
- // there is an anonymous container within this object that contains the beforeChild. |
- if (beforeChild && beforeChild->parent() != this) { |
- RenderObject* anonymousChild = beforeChild->parent(); |
- ASSERT(anonymousChild); |
- |
- while (anonymousChild->parent() != this) |
- anonymousChild = anonymousChild->parent(); |
- |
- ASSERT(anonymousChild->isAnonymous()); |
- |
- if (anonymousChild->isAnonymousBlock()) { |
- // Insert the child into the anonymous block box instead of here. |
- if (newChild->isInline() || beforeChild->parent()->firstChild() != beforeChild) |
- beforeChild->parent()->addChild(newChild, beforeChild); |
- else |
- addChild(newChild, beforeChild->parent()); |
- return; |
- } |
- |
- ASSERT(anonymousChild->isTable()); |
- if ((newChild->isTableCol() && newChild->style()->display() == TABLE_COLUMN_GROUP) |
- || (newChild->isRenderBlock() && newChild->style()->display() == TABLE_CAPTION) |
- || newChild->isTableSection() |
- || newChild->isTableRow() |
- || newChild->isTableCell()) { |
- // Insert into the anonymous table. |
- anonymousChild->addChild(newChild, beforeChild); |
- return; |
- } |
- |
- // Go on to insert before the anonymous table. |
- beforeChild = anonymousChild; |
- } |
- |
// A block has to either have all of its children inline, or all of its children as blocks. |
// So, if our children are currently inline and a block child has to be inserted, we move all our |
// inline children into anonymous block boxes. |