void RenderTableRow::layout() { StackStats::LayoutCheckPoint layoutCheckPoint; ASSERT(needsLayout()); // Table rows do not add translation. LayoutStateMaintainer statePusher(view(), *this, LayoutSize(), hasTransform() || hasReflection() || style().isFlippedBlocksWritingMode()); bool paginated = view().layoutState()->isPaginated(); for (RenderTableCell* cell = firstCell(); cell; cell = cell->nextCell()) { if (!cell->needsLayout() && paginated && (view().layoutState()->pageLogicalHeightChanged() || (view().layoutState()->pageLogicalHeight() && view().layoutState()->pageLogicalOffset(cell, cell->logicalTop()) != cell->pageLogicalOffset()))) cell->setChildNeedsLayout(MarkOnlyThis); if (cell->needsLayout()) { cell->computeAndSetBlockDirectionMargins(table()); cell->layout(); } } // We only ever need to repaint if our cells didn't, which menas 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 repaint in setStyle() because we had a layout hint. // We cannot call repaint() because our clippedOverflowRectForRepaint() is taken from the // parent table, and being mid-layout, that is invalid. Instead, we repaint our cells. if (selfNeedsLayout() && checkForRepaintDuringLayout()) { for (RenderTableCell* cell = firstCell(); cell; cell = cell->nextCell()) cell->repaint(); } statePusher.pop(); // RenderTableSection::layoutRows will set our logical height and width later, so it calls updateLayerTransform(). clearNeedsLayout(); }
void RenderTableRow::layout() { ASSERT(needsLayout()); // Table rows do not add translation. LayoutStateMaintainer statePusher(view(), this, IntSize(), style()->isFlippedBlocksWritingMode()); bool paginated = view()->layoutState()->isPaginated(); for (RenderObject* child = firstChild(); child; child = child->nextSibling()) { if (child->isTableCell()) { RenderTableCell* cell = toRenderTableCell(child); if (!cell->needsLayout() && paginated && view()->layoutState()->pageLogicalHeight() && view()->layoutState()->pageLogicalOffset(cell->logicalTop()) != cell->pageLogicalOffset()) cell->setChildNeedsLayout(true, false); if (child->needsLayout()) { cell->computeBlockDirectionMargins(table()); cell->layout(); } } } // We only ever need to repaint if our cells didn't, which menas 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 repaint in setStyle() because we had a layout hint. // We cannot call repaint() because our clippedOverflowRectForRepaint() is taken from the // parent table, and being mid-layout, that is invalid. Instead, we repaint our cells. if (selfNeedsLayout() && checkForRepaintDuringLayout()) { for (RenderObject* child = firstChild(); child; child = child->nextSibling()) { if (child->isTableCell()) child->repaint(); } } statePusher.pop(); // RenderTableSection::layoutRows will set our logical height and width later, so it calls updateLayerTransform(). setNeedsLayout(false); }
void RenderTableRow::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) { ASSERT(style().display() == TABLE_ROW); RenderBox::styleDidChange(diff, oldStyle); propagateStyleToAnonymousChildren(PropagateToAllChildren); if (section() && oldStyle && style().logicalHeight() != oldStyle->logicalHeight()) section()->rowLogicalHeightChanged(rowIndex()); // If border was changed, notify table. if (RenderTable* table = this->table()) { if (oldStyle && oldStyle->border() != style().border()) table->invalidateCollapsedBorders(); if (oldStyle && diff == StyleDifferenceLayout && needsLayout() && table->collapseBorders() && borderWidthChanged(oldStyle, &style())) { // If the border width changes on a row, we need to make sure the cells in the row know to lay out again. // This only happens when borders are collapsed, since they end up affecting the border sides of the cell // itself. for (RenderTableCell* cell = firstCell(); cell; cell = cell->nextCell()) cell->setChildNeedsLayout(MarkOnlyThis); } } }