static bool isValidColumnSpanner(RenderMultiColumnFlowThread* flowThread, RenderObject* descendant) { // We assume that we're inside the flow thread. This function is not to be called otherwise. ASSERT(descendant->isDescendantOf(flowThread)); // First make sure that the renderer itself has the right properties for becoming a spanner. RenderStyle& style = descendant->style(); if (style.columnSpan() != ColumnSpanAll || !descendant->isBox() || descendant->isFloatingOrOutOfFlowPositioned()) return false; RenderBlock* container = descendant->containingBlock(); if (!container->isRenderBlockFlow() || container->childrenInline()) { // Needs to be block-level. return false; } // This looks like a spanner, but if we're inside something unbreakable, it's not to be treated as one. for (RenderBox* ancestor = toRenderBox(descendant)->parentBox(); ancestor; ancestor = ancestor->parentBox()) { if (ancestor->isRenderFlowThread()) { // Don't allow any intervening non-multicol fragmentation contexts. The spec doesn't say // anything about disallowing this, but it's just going to be too complicated to // implement (not to mention specify behavior). return ancestor == flowThread; } ASSERT(ancestor->style().columnSpan() != ColumnSpanAll || !isValidColumnSpanner(flowThread, ancestor)); if (ancestor->isUnsplittableForPagination()) return false; } ASSERT_NOT_REACHED(); return false; }
void RenderBoxModelObject::moveChildrenTo(RenderBoxModelObject* toBoxModelObject, RenderObject* startChild, RenderObject* endChild, RenderObject* beforeChild, bool fullRemoveInsert) { // This condition is rarely hit since this function is usually called on // anonymous blocks which can no longer carry positioned objects (see r120761) // or when fullRemoveInsert is false. if (fullRemoveInsert && isRenderBlock()) { RenderBlock* block = toRenderBlock(this); block->removePositionedObjects(0); if (block->isRenderBlockFlow()) toRenderBlockFlow(block)->removeFloatingObjects(); } ASSERT(!beforeChild || toBoxModelObject == beforeChild->parent()); for (RenderObject* child = startChild; child && child != endChild; ) { // Save our next sibling as moveChildTo will clear it. RenderObject* nextSibling = child->nextSibling(); moveChildTo(toBoxModelObject, child, beforeChild, fullRemoveInsert); child = nextSibling; } }