bool LayoutListItem::updateMarkerLocation() { ASSERT(m_marker); LayoutObject* markerParent = m_marker->parent(); LayoutObject* lineBoxParent = getParentOfFirstLineBox(this, m_marker); if (!lineBoxParent) { // If the marker is currently contained inside an anonymous box, then we // are the only item in that anonymous box (since no line box parent was // found). It's ok to just leave the marker where it is in this case. if (markerParent && markerParent->isAnonymousBlock()) lineBoxParent = markerParent; else lineBoxParent = this; } if (markerParent != lineBoxParent) { m_marker->remove(); lineBoxParent->addChild(m_marker, firstNonMarkerChild(lineBoxParent)); m_marker->updateMarginsAndContent(); // If markerParent is an anonymous block with no children, destroy it. if (markerParent && markerParent->isAnonymousBlock() && !toLayoutBlock(markerParent)->firstChild() && !toLayoutBlock(markerParent)->continuation()) markerParent->destroy(); return true; } return false; }
void LayoutRubyBase::moveBlockChildren(LayoutRubyBase* toBase, LayoutObject* 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. LayoutObject* firstChildHere = firstChild(); LayoutObject* lastChildThere = toBase->lastChild(); if (firstChildHere->isAnonymousBlock() && firstChildHere->childrenInline() && lastChildThere && lastChildThere->isAnonymousBlock() && lastChildThere->childrenInline()) { LayoutBlock* anonBlockHere = toLayoutBlock(firstChildHere); LayoutBlock* anonBlockThere = toLayoutBlock(lastChildThere); anonBlockHere->moveAllChildrenTo(anonBlockThere, anonBlockThere->children()); anonBlockHere->deleteLineBoxTree(); anonBlockHere->destroy(); } // Move all remaining children normally. moveChildrenTo(toBase, firstChild(), beforeChild); }
void LayoutRubyBase::moveInlineChildren(LayoutRubyBase* toBase, LayoutObject* beforeChild) { ASSERT(childrenInline()); ASSERT_ARG(toBase, toBase); if (!firstChild()) return; LayoutBlock* toBlock; if (toBase->childrenInline()) { // The standard and easy case: move the children into the target base toBlock = toBase; } else { // We need to wrap the inline objects into an anonymous block. // If toBase has a suitable block, we re-use it, otherwise create a new one. LayoutObject* lastChild = toBase->lastChild(); if (lastChild && lastChild->isAnonymousBlock() && lastChild->childrenInline()) { toBlock = toLayoutBlock(lastChild); } else { toBlock = toBase->createAnonymousBlock(); toBase->children()->appendChildNode(toBase, toBlock); } } // Move our inline children into the target block we determined above. moveChildrenTo(toBlock, firstChild(), beforeChild); }
bool LayoutListItem::updateMarkerLocation() { ASSERT(m_marker); LayoutObject* markerParent = m_marker->parent(); // list-style-position:inside makes the ::marker pseudo an ordinary // position:static element that should be attached to LayoutListItem block. LayoutObject* lineBoxParent = m_marker->isInside() ? this : getParentOfFirstLineBox(this, m_marker); if (!lineBoxParent) { // If the marker is currently contained inside an anonymous box, then we // are the only item in that anonymous box (since no line box parent was // found). It's ok to just leave the marker where it is in this case. if (markerParent && markerParent->isAnonymousBlock()) lineBoxParent = markerParent; else lineBoxParent = this; } if (markerParent != lineBoxParent) { m_marker->remove(); lineBoxParent->addChild(m_marker, firstNonMarkerChild(lineBoxParent)); // TODO(rhogan): lineBoxParent and markerParent may be deleted by addChild, // so they are not safe to reference here. // Once we have a safe way of referencing them delete markerParent if it is // an empty anonymous block. m_marker->updateMarginsAndContent(); return true; } return false; }