| Index: Source/WebCore/rendering/RenderBlock.cpp
|
| ===================================================================
|
| --- Source/WebCore/rendering/RenderBlock.cpp (revision 118863)
|
| +++ Source/WebCore/rendering/RenderBlock.cpp (working copy)
|
| @@ -852,6 +852,10 @@
|
| }
|
| }
|
|
|
| + // Nothing goes before the intruded run-in.
|
| + if (beforeChild && beforeChild->isRunIn() && runInIsPlacedIntoSiblingBlock(beforeChild))
|
| + beforeChild = beforeChild->nextSibling();
|
| +
|
| // Check for a spanning element in columns.
|
| RenderBlock* columnsBlockAncestor = columnsBlockForSpanningElement(newChild);
|
| if (columnsBlockAncestor) {
|
| @@ -933,13 +937,8 @@
|
|
|
| RenderBox::addChild(newChild, beforeChild);
|
|
|
| - // Handle positioning of run-ins.
|
| - if (newChild->isRunIn())
|
| - moveRunInUnderSiblingBlockIfNeeded(newChild);
|
| - else if (RenderObject* prevSibling = newChild->previousSibling()) {
|
| - if (prevSibling->isRunIn())
|
| - moveRunInUnderSiblingBlockIfNeeded(prevSibling);
|
| - }
|
| + // Handle placement of run-ins.
|
| + placeRunInIfNeeded(newChild, DoNotPlaceGeneratedRunIn);
|
|
|
| if (madeBoxesNonInline && parent() && isAnonymousBlock() && parent()->isRenderBlock())
|
| toRenderBlock(parent())->removeLeftoverAnonymousBlock(this);
|
| @@ -1046,6 +1045,8 @@
|
| if (!child)
|
| return;
|
|
|
| + deleteLineBoxTree();
|
| +
|
| // Since we are going to have block children, we have to move
|
| // back the run-in to its original place.
|
| if (child->isRunIn()) {
|
| @@ -1053,8 +1054,6 @@
|
| child = firstChild();
|
| }
|
|
|
| - deleteLineBoxTree();
|
| -
|
| while (child) {
|
| RenderObject *inlineRunStart, *inlineRunEnd;
|
| getInlineRun(child, insertionPoint, inlineRunStart, inlineRunEnd);
|
| @@ -1768,13 +1767,28 @@
|
| ASSERT(runIn->isRunIn());
|
| ASSERT(!runIn->firstChild());
|
|
|
| - // If it is a block run-in, delete its line box tree as well. This is needed as our
|
| - // children got moved and our line box tree is no longer valid.
|
| + // Delete our line box tree. This is needed as our children got moved
|
| + // and our line box tree is no longer valid.
|
| if (runIn->isRenderBlock())
|
| toRenderBlock(runIn)->deleteLineBoxTree();
|
| + else if (runIn->isRenderInline())
|
| + toRenderInline(runIn)->deleteLineBoxTree();
|
| + else
|
| + ASSERT_NOT_REACHED();
|
| +
|
| runIn->destroy();
|
| }
|
|
|
| +void RenderBlock::placeRunInIfNeeded(RenderObject* newChild, PlaceGeneratedRunInFlag flag)
|
| +{
|
| + if (newChild->isRunIn() && (flag == PlaceGeneratedRunIn || !newChild->isBeforeOrAfterContent()))
|
| + moveRunInUnderSiblingBlockIfNeeded(newChild);
|
| + else if (RenderObject* prevSibling = newChild->previousSibling()) {
|
| + if (prevSibling->isRunIn() && (flag == PlaceGeneratedRunIn || !newChild->isBeforeOrAfterContent()))
|
| + moveRunInUnderSiblingBlockIfNeeded(prevSibling);
|
| + }
|
| +}
|
| +
|
| RenderBoxModelObject* RenderBlock::createReplacementRunIn(RenderBoxModelObject* runIn)
|
| {
|
| ASSERT(runIn->isRunIn());
|
| @@ -1851,19 +1865,31 @@
|
| // since it handles correct placement of the children, especially where we cannot insert
|
| // anything before the first child. e.g. details tag. See https://bugs.webkit.org/show_bug.cgi?id=58228.
|
| curr->addChild(newRunIn, curr->firstChild());
|
| +
|
| + // Make sure that |this| get a layout since its run-in child moved.
|
| + curr->setNeedsLayoutAndPrefWidthsRecalc();
|
| }
|
|
|
| -void RenderBlock::moveRunInToOriginalPosition(RenderObject* runIn)
|
| +bool RenderBlock::runInIsPlacedIntoSiblingBlock(RenderObject* runIn)
|
| {
|
| ASSERT(runIn->isRunIn());
|
|
|
| - // If we don't have a parent, there is nothing to move. This might
|
| - // happen if |this| got detached from parent after |runIn| run into |this|.
|
| + // If we don't have a parent, we can't be moved into our sibling block.
|
| if (!parent())
|
| - return;
|
| + return false;
|
|
|
| // An intruded run-in needs to be an inline.
|
| if (!runIn->isRenderInline())
|
| + return false;
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void RenderBlock::moveRunInToOriginalPosition(RenderObject* runIn)
|
| +{
|
| + ASSERT(runIn->isRunIn());
|
| +
|
| + if (!runInIsPlacedIntoSiblingBlock(runIn))
|
| return;
|
|
|
| RenderBoxModelObject* oldRunIn = toRenderBoxModelObject(runIn);
|
| @@ -1872,6 +1898,9 @@
|
|
|
| // Add the run-in block as our previous sibling.
|
| parent()->addChild(newRunIn, this);
|
| +
|
| + // Make sure that the parent holding the new run-in gets layout.
|
| + parent()->setNeedsLayoutAndPrefWidthsRecalc();
|
| }
|
|
|
| LayoutUnit RenderBlock::collapseMargins(RenderBox* child, MarginInfo& marginInfo)
|
|
|