void LayoutMultiColumnFlowThread::appendNewFragmentainerGroupIfNeeded(LayoutUnit offsetInFlowThread) { if (!isPageLogicalHeightKnown()) { // If we have no clue about the height of the multicol container, bail. This situation // occurs initially when an auto-height multicol container is nested inside another // auto-height multicol container. We need at least an estimated height of the outer // multicol container before we can check what an inner fragmentainer group has room for. // Its height is indefinite for now. return; } LayoutMultiColumnSet* columnSet = columnSetAtBlockOffset(offsetInFlowThread); if (columnSet->isInitialHeightCalculated()) { // We only insert additional fragmentainer groups in the initial layout pass. We only want // to balance columns in the last fragmentainer group (if we need to balance at all), so we // want that last fragmentainer group to be the same one in all layout passes that follow. return; } if (!columnSet->hasFragmentainerGroupForColumnAt(offsetInFlowThread)) { FragmentationContext* enclosingFragmentationContext = this->enclosingFragmentationContext(); if (!enclosingFragmentationContext) return; // Not nested. We'll never need more rows than the one we already have then. ASSERT(!isLayoutPagedFlowThread()); // We have run out of columns here, so we add another row to hold more columns. When we add // a new row, it implicitly means that we're inserting another column in our enclosing // multicol container. That in turn may mean that we've run out of columns there too. const MultiColumnFragmentainerGroup& newRow = columnSet->appendNewFragmentainerGroup(); if (LayoutMultiColumnFlowThread* enclosingFlowThread = enclosingFragmentationContext->associatedFlowThread()) enclosingFlowThread->appendNewFragmentainerGroupIfNeeded(newRow.blockOffsetInEnclosingFragmentationContext()); } }
void LayoutMultiColumnFlowThread::appendNewFragmentainerGroupIfNeeded(LayoutUnit bottomOffsetInFlowThread) { if (!isPageLogicalHeightKnown()) { // If we have no clue about the height of the multicol container, bail. This situation // occurs initially when an auto-height multicol container is nested inside another // auto-height multicol container. We need at least an estimated height of the outer // multicol container before we can check what an inner fragmentainer group has room for. // Its height is indefinite for now. return; } // TODO(mstensho): bottomOffsetInFlowThread is an endpoint-exclusive offset, i.e. the offset // just after the bottom of some object. So, ideally, columnSetAtBlockOffset() should be // informed about this (i.e. take a PageBoundaryRule argument). This is not the only place with // this issue; see also pageRemainingLogicalHeightForOffset(). LayoutMultiColumnSet* columnSet = columnSetAtBlockOffset(bottomOffsetInFlowThread); if (columnSet->isInitialHeightCalculated()) { // We only insert additional fragmentainer groups in the initial layout pass. We only want // to balance columns in the last fragmentainer group (if we need to balance at all), so we // want that last fragmentainer group to be the same one in all layout passes that follow. return; } if (!columnSet->hasFragmentainerGroupForColumnAt(bottomOffsetInFlowThread)) { FragmentationContext* enclosingFragmentationContext = this->enclosingFragmentationContext(); if (!enclosingFragmentationContext) return; // Not nested. We'll never need more rows than the one we already have then. ASSERT(!isLayoutPagedFlowThread()); // We have run out of columns here, so we add another row to hold more columns. When we add // a new row, it implicitly means that we're inserting another column in our enclosing // multicol container. That in turn may mean that we've run out of columns there too. const MultiColumnFragmentainerGroup& newRow = columnSet->appendNewFragmentainerGroup(); if (LayoutMultiColumnFlowThread* enclosingFlowThread = enclosingFragmentationContext->associatedFlowThread()) enclosingFlowThread->appendNewFragmentainerGroupIfNeeded(newRow.blockOffsetInEnclosingFragmentationContext() + newRow.logicalHeight()); } }