void LayoutTableRow::layout() { ASSERT(needsLayout()); LayoutAnalyzer::Scope analyzer(*this); // Table rows do not add translation. LayoutState state(*this, LayoutSize()); for (LayoutTableCell* cell = firstCell(); cell; cell = cell->nextCell()) { SubtreeLayoutScope layouter(*cell); if (!cell->needsLayout()) cell->markForPaginationRelayoutIfNeeded(layouter); if (cell->needsLayout()) cell->layout(); } m_overflow.clear(); addVisualEffectOverflow(); // We do not call addOverflowFromCell here. The cell are laid out to be // measured above and will be sized correctly in a follow-up phase. // We only ever need to issue paint invalidations if our cells didn't, which means that they didn't need // layout, so we know that our bounds didn't change. This code is just making up for // the fact that we did not invalidate paints in setStyle() because we had a layout hint. if (selfNeedsLayout()) { for (LayoutTableCell* cell = firstCell(); cell; cell = cell->nextCell()) { // FIXME: Is this needed when issuing paint invalidations after layout? cell->setShouldDoFullPaintInvalidation(); } } // LayoutTableSection::layoutRows will set our logical height and width later, so it calls updateLayerTransform(). clearNeedsLayout(); }
void TextAutosizer::inflateAutoTable(LayoutTable* table) { ASSERT(table); ASSERT(!table->style()->isFixedTableLayout()); ASSERT(table->containingBlock()); Cluster* cluster = currentCluster(); if (cluster->m_root != table) return; // Pre-inflate cells that have enough text so that their inflated preferred widths will be used // for column sizing. for (LayoutObject* section = table->firstChild(); section; section = section->nextSibling()) { if (!section->isTableSection()) continue; for (LayoutTableRow* row = toLayoutTableSection(section)->firstRow(); row; row = row->nextRow()) { for (LayoutTableCell* cell = row->firstCell(); cell; cell = cell->nextCell()) { if (!cell->needsLayout()) continue; beginLayout(cell); inflate(cell, DescendToInnerBlocks); endLayout(cell); } } } }