| Index: third_party/WebKit/Source/core/paint/TablePaintInvalidator.cpp
|
| diff --git a/third_party/WebKit/Source/core/paint/TablePaintInvalidator.cpp b/third_party/WebKit/Source/core/paint/TablePaintInvalidator.cpp
|
| index f76452aa5ec361e5e0a9ec28ca27b3c851cfdbd1..01897fa73fbcd6d1541e89eb4b99f5cf5932d545 100644
|
| --- a/third_party/WebKit/Source/core/paint/TablePaintInvalidator.cpp
|
| +++ b/third_party/WebKit/Source/core/paint/TablePaintInvalidator.cpp
|
| @@ -18,81 +18,37 @@ PaintInvalidationReason TablePaintInvalidator::invalidatePaintIfNeeded() {
|
| PaintInvalidationReason reason =
|
| BoxPaintInvalidator(m_table, m_context).invalidatePaintIfNeeded();
|
|
|
| - // Table cells paint background from the containing column group, column,
|
| - // section and row. If background of any of them changed, we need to
|
| - // invalidate all affected cells. Here use shouldDoFullPaintInvalidation() as
|
| - // a broader condition of background change.
|
| -
|
| - // If any col changed background, we'll check all cells for background
|
| - // changes.
|
| + // If any col changed background, we need to invalidate all sections because
|
| + // col background paints into section's background display item.
|
| bool hasColChangedBackground = false;
|
| - bool visualRectChanged = m_context.oldVisualRect != m_table.visualRect();
|
| - for (LayoutTableCol* col = m_table.firstColumn(); col;
|
| - col = col->nextColumn()) {
|
| - // LayoutTableCol uses the table's localVisualRect(). Should check column
|
| - // for paint invalidation when table's visual rect changed.
|
| - if (visualRectChanged)
|
| - col->setMayNeedPaintInvalidation();
|
| - // This ensures that the backgroundChangedSinceLastPaintInvalidation flag
|
| - // is up-to-date.
|
| - col->ensureIsReadyForPaintInvalidation();
|
| - if (col->backgroundChangedSinceLastPaintInvalidation()) {
|
| - hasColChangedBackground = true;
|
| - break;
|
| + if (m_table.hasColElements()) {
|
| + bool visualRectChanged = m_context.oldVisualRect != m_table.visualRect();
|
| + for (LayoutTableCol* col = m_table.firstColumn(); col;
|
| + col = col->nextColumn()) {
|
| + // LayoutTableCol uses the table's localVisualRect(). Should check column
|
| + // for paint invalidation when table's visual rect changed.
|
| + if (visualRectChanged)
|
| + col->setMayNeedPaintInvalidation();
|
| + // This ensures that the backgroundChangedSinceLastPaintInvalidation flag
|
| + // is up-to-date.
|
| + col->ensureIsReadyForPaintInvalidation();
|
| + if (col->backgroundChangedSinceLastPaintInvalidation()) {
|
| + hasColChangedBackground = true;
|
| + break;
|
| + }
|
| }
|
| }
|
| - for (LayoutObject* child = m_table.firstChild(); child;
|
| - child = child->nextSibling()) {
|
| - if (!child->isTableSection())
|
| - continue;
|
| - LayoutTableSection* section = toLayoutTableSection(child);
|
| - section->ensureIsReadyForPaintInvalidation();
|
| - ObjectPaintInvalidator sectionInvalidator(*section);
|
| - if (!hasColChangedBackground && !section->shouldCheckForPaintInvalidation())
|
| - continue;
|
| - for (LayoutTableRow* row = section->firstRow(); row; row = row->nextRow()) {
|
| - row->ensureIsReadyForPaintInvalidation();
|
| - if (!hasColChangedBackground &&
|
| - !section->backgroundChangedSinceLastPaintInvalidation() &&
|
| - !row->backgroundChangedSinceLastPaintInvalidation())
|
| +
|
| + if (hasColChangedBackground) {
|
| + for (LayoutObject* child = m_table.firstChild(); child;
|
| + child = child->nextSibling()) {
|
| + if (!child->isTableSection())
|
| continue;
|
| - for (LayoutTableCell* cell = row->firstCell(); cell;
|
| - cell = cell->nextCell()) {
|
| - cell->ensureIsReadyForPaintInvalidation();
|
| - bool invalidated = false;
|
| - // Table cells paint container's background on the container's backing
|
| - // instead of its own (if any), so we must invalidate it by the
|
| - // containers.
|
| - if (section->backgroundChangedSinceLastPaintInvalidation()) {
|
| - sectionInvalidator
|
| - .slowSetPaintingLayerNeedsRepaintAndInvalidateDisplayItemClient(
|
| - cell->backgroundDisplayItemClient(),
|
| - PaintInvalidationStyleChange);
|
| - invalidated = true;
|
| - } else if (hasColChangedBackground) {
|
| - LayoutTable::ColAndColGroup colAndColGroup =
|
| - m_table.colElementAtAbsoluteColumn(cell->absoluteColumnIndex());
|
| - LayoutTableCol* column = colAndColGroup.col;
|
| - LayoutTableCol* columnGroup = colAndColGroup.colgroup;
|
| - if ((columnGroup &&
|
| - columnGroup->backgroundChangedSinceLastPaintInvalidation()) ||
|
| - (column &&
|
| - column->backgroundChangedSinceLastPaintInvalidation())) {
|
| - sectionInvalidator
|
| - .slowSetPaintingLayerNeedsRepaintAndInvalidateDisplayItemClient(
|
| - cell->backgroundDisplayItemClient(),
|
| - PaintInvalidationStyleChange);
|
| - invalidated = true;
|
| - }
|
| - }
|
| - if ((!invalidated || row->hasSelfPaintingLayer()) &&
|
| - row->backgroundChangedSinceLastPaintInvalidation()) {
|
| - ObjectPaintInvalidator(*row)
|
| - .slowSetPaintingLayerNeedsRepaintAndInvalidateDisplayItemClient(
|
| - cell->backgroundDisplayItemClient(),
|
| - PaintInvalidationStyleChange);
|
| - }
|
| - }
|
| + LayoutTableSection* section = toLayoutTableSection(child);
|
| + section->ensureIsReadyForPaintInvalidation();
|
| + ObjectPaintInvalidator(*section)
|
| + .slowSetPaintingLayerNeedsRepaintAndInvalidateDisplayItemClient(
|
| + *section, PaintInvalidationStyleChange);
|
| }
|
| }
|
|
|
|
|