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); |
} |
} |