RenderRubyRun* RenderRubyBase::rubyRun() const { ASSERT(parent()); ASSERT(parent()->isRubyRun()); return &toRenderRubyRun(*parent()); }
static RenderRubyRun* lastRubyRun(const RenderObject* ruby) { RenderObject* child = ruby->lastChild(); if (child && !child->isRubyRun()) child = child->previousSibling(); ASSERT(!child || child->isRubyRun() || child->isBeforeContent() || child == rubyBeforeBlock(ruby)); return child && child->isRubyRun() ? toRenderRubyRun(child) : 0; }
static inline RenderRubyRun& findRubyRunParent(RenderObject& child) { RenderObject* ancestor = &child; while (ancestor && !ancestor->isRubyRun()) ancestor = ancestor->parent(); ASSERT(ancestor); return toRenderRubyRun(*ancestor); }
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; }
static inline RenderRubyRun* findRubyRunParent(RenderObject* child) { while (child && !child->isRubyRun()) child = child->parent(); return toRenderRubyRun(child); }