Index: Source/WebCore/rendering/RenderBlock.cpp |
=================================================================== |
--- Source/WebCore/rendering/RenderBlock.cpp (revision 109406) |
+++ Source/WebCore/rendering/RenderBlock.cpp (working copy) |
@@ -766,34 +766,48 @@ |
if (!beforeChild) |
beforeChild = afterPseudoElementRenderer(); |
- // 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* beforeChildAnonymousContainer = anonymousContainer(beforeChild); |
- ASSERT(beforeChildAnonymousContainer); |
- ASSERT(beforeChildAnonymousContainer->isAnonymous()); |
+ RenderObject* beforeChildContainer = beforeChild->parent(); |
+ while (beforeChildContainer->parent() != this) |
+ beforeChildContainer = beforeChildContainer->parent(); |
+ ASSERT(beforeChildContainer); |
- if (beforeChildAnonymousContainer->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; |
- } |
+ if (beforeChildContainer->isAnonymous()) { |
+ // 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. |
+ RenderObject* beforeChildAnonymousContainer = beforeChildContainer; |
+ if (beforeChildAnonymousContainer->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(beforeChildAnonymousContainer->isTable()); |
- if ((newChild->isTableCol() && newChild->style()->display() == TABLE_COLUMN_GROUP) |
- || (newChild->isTableCaption()) |
- || newChild->isTableSection() |
- || newChild->isTableRow() |
- || newChild->isTableCell()) { |
- // Insert into the anonymous table. |
- beforeChildAnonymousContainer->addChild(newChild, beforeChild); |
- return; |
+ ASSERT(beforeChildAnonymousContainer->isTable()); |
+ if (newChild->isTablePart()) { |
+ // Insert into the anonymous table. |
+ beforeChildAnonymousContainer->addChild(newChild, beforeChild); |
+ return; |
+ } |
+ |
+ beforeChild = splitTablePartsAroundChild(beforeChild); |
+ |
+ ASSERT(beforeChild->parent() == this); |
+ if (beforeChild->parent() != this) { |
+ // We should never reach here. If we do, we need to use the |
+ // safe fallback to use the topmost beforeChild container. |
+ beforeChild = beforeChildContainer; |
+ } |
+ } else { |
+ // We will reach here when beforeChild is a run-in element. |
+ // If run-in element precedes a block-level element, it becomes the |
+ // the first inline child of that block level element. The insertion |
+ // point will be before that block-level element. |
+ ASSERT(beforeChild->isRunIn()); |
+ beforeChild = beforeChildContainer; |
} |
- |
- beforeChild = splitTablePartsAroundChild(beforeChild); |
} |
// Check for a spanning element in columns. |