Chromium Code Reviews| 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 ae42aec7653bb485b37f094488470f9829c2f779..d6c6df4d4954fcd76652bd3f0e02685ebb4bfad1 100644 |
| --- a/third_party/WebKit/Source/core/paint/TablePaintInvalidator.cpp |
| +++ b/third_party/WebKit/Source/core/paint/TablePaintInvalidator.cpp |
| @@ -23,6 +23,19 @@ PaintInvalidationReason TablePaintInvalidator::invalidatePaintIfNeeded() { |
| // invalidate all affected cells. Here use shouldDoFullPaintInvalidation() as |
| // a broader condition of background change. |
| + // Note there are explicit calls to |
|
wkorman
2016/11/15 01:05:33
This documents the explicit calls to create the cl
|
| + // LayoutTableCell::createCompositedCellDisplayItemClients() for all |
| + // composited table cell cases below so as to only lazily create the special |
| + // display item clients. Composited table cells are an uncommon case. The |
| + // logic below handles the case where a cell's row, column, column group, or |
| + // section style changes and it moves to a new state where it does not require |
| + // these clients. |
| + // |
| + // We could move the lazy client creation to the specific accessor methods in |
| + // LayoutTableCell, but those are const, TableCellPainter's LayoutTableCell is |
| + // also const, and TableCellPainter uses those same client accessor methods, |
| + // which would fail const-ness. |
|
Xianzhu
2016/11/15 02:58:23
We can use mutable keyword or the LayoutObject::ge
|
| + |
| // If any col changed background, we'll check all cells for background |
| // changes. |
| bool hasColChangedBackground = false; |
| @@ -58,27 +71,57 @@ PaintInvalidationReason TablePaintInvalidator::invalidatePaintIfNeeded() { |
| sectionInvalidator |
| .slowSetPaintingLayerNeedsRepaintAndInvalidateDisplayItemClient( |
| *cell, PaintInvalidationStyleChange); |
| + if (cell->usesCompositedCellDisplayItemClients()) { |
| + cell->createCompositedCellDisplayItemClients(); |
| + sectionInvalidator.invalidateDisplayItemClient( |
| + *cell->sectionBackgroundDisplayItemClient(), |
| + 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())) { |
| + bool colGroupBackgroundChanged = |
| + columnGroup && |
| + columnGroup->backgroundChangedSinceLastPaintInvalidation(); |
| + bool colBackgroundChanged = |
| + column && column->backgroundChangedSinceLastPaintInvalidation(); |
| + if (colGroupBackgroundChanged || colBackgroundChanged) { |
| sectionInvalidator |
| .slowSetPaintingLayerNeedsRepaintAndInvalidateDisplayItemClient( |
| *cell, PaintInvalidationStyleChange); |
| + if (colBackgroundChanged && |
| + cell->usesCompositedCellDisplayItemClients()) { |
| + cell->createCompositedCellDisplayItemClients(); |
| + sectionInvalidator.invalidateDisplayItemClient( |
| + *cell->colBackgroundDisplayItemClient(), |
| + PaintInvalidationStyleChange); |
| + } |
| + if (colGroupBackgroundChanged && |
| + cell->usesCompositedCellDisplayItemClients()) { |
| + cell->createCompositedCellDisplayItemClients(); |
| + sectionInvalidator.invalidateDisplayItemClient( |
| + *cell->colGroupBackgroundDisplayItemClient(), |
| + PaintInvalidationStyleChange); |
| + } |
| invalidated = true; |
| } |
| } |
| if ((!invalidated || row->hasSelfPaintingLayer()) && |
| - row->backgroundChangedSinceLastPaintInvalidation()) |
| - ObjectPaintInvalidator(*row) |
| + row->backgroundChangedSinceLastPaintInvalidation()) { |
| + ObjectPaintInvalidator invalidator = ObjectPaintInvalidator(*row); |
| + invalidator |
| .slowSetPaintingLayerNeedsRepaintAndInvalidateDisplayItemClient( |
| *cell, PaintInvalidationStyleChange); |
| + if (cell->usesCompositedCellDisplayItemClients()) { |
| + cell->createCompositedCellDisplayItemClients(); |
| + invalidator.invalidateDisplayItemClient( |
| + *cell->rowBackgroundDisplayItemClient(), |
| + PaintInvalidationStyleChange); |
| + } |
| + } |
| } |
| } |
| } |