LayoutUnit MultiColumnFragmentainerGroup::calculateMaxColumnHeight() const { LayoutMultiColumnFlowThread* flowThread = m_columnSet.multiColumnFlowThread(); LayoutUnit maxColumnHeight = flowThread->maxColumnLogicalHeight(); LayoutUnit maxHeight = heightAdjustedForRowOffset(maxColumnHeight); if (FragmentationContext* enclosingFragmentationContext = flowThread->enclosingFragmentationContext()) { if (enclosingFragmentationContext->isFragmentainerLogicalHeightKnown()) { // We're nested inside another fragmentation context whose fragmentainer heights are // known. This constrains the max height. LayoutUnit remainingOuterLogicalHeight = enclosingFragmentationContext->remainingLogicalHeightAt(blockOffsetInEnclosingFragmentationContext()); ASSERT(remainingOuterLogicalHeight > 0); if (maxHeight > remainingOuterLogicalHeight) maxHeight = remainingOuterLogicalHeight; } } return maxHeight; }
void MultiColumnFragmentainerGroup::resetColumnHeight() { m_maxColumnHeight = calculateMaxColumnHeight(); LayoutMultiColumnFlowThread* flowThread = m_columnSet.multiColumnFlowThread(); if (m_columnSet.heightIsAuto()) { FragmentationContext* enclosingFragmentationContext = flowThread->enclosingFragmentationContext(); if (enclosingFragmentationContext && enclosingFragmentationContext->isFragmentainerLogicalHeightKnown()) { // Even if height is auto, we set an initial height, in order to tell how much content // this MultiColumnFragmentainerGroup can hold, and when we need to append a new one. m_columnHeight = m_maxColumnHeight; } else { m_columnHeight = LayoutUnit(); } } else { setAndConstrainColumnHeight(heightAdjustedForRowOffset(flowThread->columnHeightAvailable())); } }