void RenderRubyBase::moveBlockChildren(RenderRubyBase* toBase, RenderObject* beforeChild) { ASSERT(!childrenInline()); ASSERT_ARG(toBase, toBase); 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(); if (firstChildHere->isAnonymousBlock() && firstChildHere->childrenInline() && lastChildThere && lastChildThere->isAnonymousBlock() && lastChildThere->childrenInline()) { RenderBlock* anonBlockHere = toRenderBlock(firstChildHere); RenderBlock* anonBlockThere = toRenderBlock(lastChildThere); anonBlockHere->moveAllChildrenTo(anonBlockThere, true); anonBlockHere->deleteLines(); anonBlockHere->destroy(); } // Move all remaining children normally. moveChildrenTo(toBase, firstChild(), beforeChild); }
RenderFullScreen* RenderFullScreen::wrapRenderer(RenderObject* object, RenderElement* parent, Document& document) { RenderFullScreen* fullscreenRenderer = new RenderFullScreen(document, createFullScreenStyle()); fullscreenRenderer->initializeStyle(); if (parent && !parent->isChildAllowed(*fullscreenRenderer, fullscreenRenderer->style())) { fullscreenRenderer->destroy(); return 0; } if (object) { // |object->parent()| can be null if the object is not yet attached // to |parent|. if (RenderElement* parent = object->parent()) { RenderBlock* containingBlock = object->containingBlock(); ASSERT(containingBlock); // Since we are moving the |object| to a new parent |fullscreenRenderer|, // the line box tree underneath our |containingBlock| is not longer valid. containingBlock->deleteLines(); parent->addChild(fullscreenRenderer, object); object->removeFromParent(); // Always just do a full layout to ensure that line boxes get deleted properly. // Because objects moved from |parent| to |fullscreenRenderer|, we want to // make new line boxes instead of leaving the old ones around. parent->setNeedsLayoutAndPrefWidthsRecalc(); containingBlock->setNeedsLayoutAndPrefWidthsRecalc(); } fullscreenRenderer->addChild(object); fullscreenRenderer->setNeedsLayoutAndPrefWidthsRecalc(); } document.setFullScreenRenderer(fullscreenRenderer); return fullscreenRenderer; }
RenderObject* RenderRubyRun::removeChild(RenderObject& child) { // If the child is a ruby text, then merge the ruby base with the base of // the right sibling run, if possible. if (!beingDestroyed() && !documentBeingDestroyed() && child.isRubyText()) { RenderRubyBase* base = rubyBase(); RenderObject* rightNeighbour = nextSibling(); if (base && rightNeighbour && rightNeighbour->isRubyRun()) { // Ruby run without a base can happen only at the first run. RenderRubyRun* rightRun = toRenderRubyRun(rightNeighbour); if (rightRun->hasRubyBase()) { RenderRubyBase* rightBase = rightRun->rubyBaseSafe(); // Collect all children in a single base, then swap the bases. rightBase->mergeChildrenWithBase(base); moveChildTo(rightRun, base); rightRun->moveChildTo(this, rightBase); // The now empty ruby base will be removed below. ASSERT(!rubyBase()->firstChild()); } } } RenderObject* next = RenderBlockFlow::removeChild(child); if (!beingDestroyed() && !documentBeingDestroyed()) { // Check if our base (if any) is now empty. If so, destroy it. RenderBlock* base = rubyBase(); if (base && !base->firstChild()) { next = RenderBlockFlow::removeChild(*base); base->deleteLines(); base->destroy(); } // If any of the above leaves the run empty, destroy it as well. if (isEmpty()) { parent()->removeChild(*this); deleteLines(); destroy(); next = nullptr; } } return next; }