Index: Source/WebCore/rendering/RenderRubyBase.cpp |
=================================================================== |
--- Source/WebCore/rendering/RenderRubyBase.cpp (revision 96017) |
+++ Source/WebCore/rendering/RenderRubyBase.cpp (working copy) |
@@ -53,23 +53,11 @@ |
return child->isInline(); |
} |
-bool RenderRubyBase::hasOnlyWrappedInlineChildren(RenderObject* beforeChild) const |
-{ |
- // Tests whether all children in the base before beforeChild are either floated/positioned, |
- // or inline objects wrapped in anonymous blocks. |
- // Note that beforeChild may be 0, in which case all children are looked at. |
- for (RenderObject* child = firstChild(); child != beforeChild; child = child->nextSibling()) { |
- if (!child->isFloatingOrPositioned() && !(child->isAnonymousBlock() && child->childrenInline())) |
- return false; |
- } |
- return true; |
-} |
- |
void RenderRubyBase::moveChildren(RenderRubyBase* toBase, RenderObject* beforeChild) |
{ |
// This function removes all children that are before (!) beforeChild |
// and appends them to toBase. |
- ASSERT(toBase); |
+ ASSERT_ARG(toBase, toBase); |
// First make sure that beforeChild (if set) is indeed a direct child of this. |
// Inline children might be wrapped in an anonymous block if there's a continuation. |
@@ -89,8 +77,13 @@ |
void RenderRubyBase::moveInlineChildren(RenderRubyBase* toBase, RenderObject* beforeChild) |
{ |
- RenderBlock* toBlock; |
+ ASSERT(childrenInline()); |
+ ASSERT_ARG(toBase, toBase); |
+ if (!firstChild()) |
+ return; |
+ |
+ RenderBlock* toBlock; |
if (toBase->childrenInline()) { |
// The standard and easy case: move the children into the target base |
toBlock = toBase; |
@@ -111,66 +104,15 @@ |
void RenderRubyBase::moveBlockChildren(RenderRubyBase* toBase, RenderObject* beforeChild) |
{ |
- if (toBase->childrenInline()) { |
- // First check whether we move only wrapped inline objects. |
- if (hasOnlyWrappedInlineChildren(beforeChild)) { |
- // The reason why the base is in block flow must be after beforeChild. |
- // We therefore can extract the inline objects and move them to toBase. |
- for (RenderObject* child = firstChild(); child != beforeChild; child = firstChild()) { |
- if (child->isAnonymousBlock()) { |
- RenderBlock* anonBlock = toRenderBlock(child); |
- ASSERT(anonBlock->childrenInline()); |
- ASSERT(!anonBlock->inlineElementContinuation()); |
- anonBlock->moveAllChildrenTo(toBase, toBase->children()); |
- anonBlock->deleteLineBoxTree(); |
- anonBlock->destroy(); |
- } else { |
- ASSERT(child->isFloatingOrPositioned()); |
- moveChildTo(toBase, child); |
- } |
- } |
- } else { |
- // Moving block children -> have to set toBase as block flow |
- toBase->makeChildrenNonInline(); |
- // Move children, potentially collapsing anonymous block wrappers. |
- mergeBlockChildren(toBase, beforeChild); |
- |
- // Now we need to check if the leftover children are all inline. |
- // If so, make this base inline again. |
- if (hasOnlyWrappedInlineChildren()) { |
- RenderObject* next = 0; |
- for (RenderObject* child = firstChild(); child; child = next) { |
- next = child->nextSibling(); |
- if (child->isFloatingOrPositioned()) |
- continue; |
- ASSERT(child->isAnonymousBlock()); |
- |
- RenderBlock* anonBlock = toRenderBlock(child); |
- ASSERT(anonBlock->childrenInline()); |
- ASSERT(!anonBlock->inlineElementContinuation()); |
- // Move inline children out of anonymous block. |
- anonBlock->moveAllChildrenTo(this, anonBlock); |
- anonBlock->deleteLineBoxTree(); |
- anonBlock->destroy(); |
- } |
- setChildrenInline(true); |
- } |
- } |
- } else |
- mergeBlockChildren(toBase, beforeChild); |
-} |
- |
-void RenderRubyBase::mergeBlockChildren(RenderRubyBase* toBase, RenderObject* beforeChild) |
-{ |
- // This function removes all children that are before beforeChild and appends them to toBase. |
ASSERT(!childrenInline()); |
- ASSERT(toBase); |
- ASSERT(!toBase->childrenInline()); |
+ ASSERT_ARG(toBase, toBase); |
- // Quick check whether we have anything to do, to simplify the following code. |
if (!firstChild()) |
return; |
+ if (toBase->childrenInline()) |
+ toBase->makeChildrenNonInline(); |
+ |
// If an anonymous block would be put next to another such block, then merge those. |
RenderObject* firstChildHere = firstChild(); |
RenderObject* lastChildThere = toBase->lastChild(); |