Index: third_party/WebKit/Source/core/layout/LayoutTable.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutTable.cpp b/third_party/WebKit/Source/core/layout/LayoutTable.cpp |
index cb63f2ce4c19a644549fe31cf549e17cdc7e5c95..55423926bcf79a6fe4f08a1a8bacd659ccde60d9 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutTable.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutTable.cpp |
@@ -99,7 +99,8 @@ void LayoutTable::styleDidChange(StyleDifference diff, |
// If border was changed, invalidate collapsed borders cache. |
if (!needsLayout() && oldStyle && oldStyle->border() != style()->border()) |
- invalidateCollapsedBorders(); |
+ invalidateCollapsedBorders(PaintInvalidationStyleChange); |
+ |
if (LayoutTableBoxComponent::doCellsHaveDirtyWidth(*this, *this, diff, |
*oldStyle)) |
markAllCellsWidthsDirtyAndOrNeedsLayout(MarkDirtyAndNeedsLayout); |
@@ -732,7 +733,7 @@ void LayoutTable::layout() { |
updateLayerTransformAfterLayout(); |
// Layout was changed, so probably borders too. |
- invalidateCollapsedBorders(); |
+ invalidateCollapsedBorders(PaintInvalidationForcedByLayout); |
computeOverflow(clientLogicalBottom()); |
updateAfterLayout(); |
@@ -751,13 +752,19 @@ void LayoutTable::layout() { |
clearNeedsLayout(); |
} |
-void LayoutTable::invalidateCollapsedBorders() { |
- m_collapsedBorders.clear(); |
+void LayoutTable::invalidateCollapsedBorders(PaintInvalidationReason reason) { |
+ DCHECK(reason == PaintInvalidationStyleChange || |
+ reason == PaintInvalidationForcedByLayout); |
+ |
+ m_collapsedBordersInfo = nullptr; |
if (!collapseBorders()) |
return; |
m_collapsedBordersValid = false; |
- setMayNeedPaintInvalidation(); |
+ if (reason == PaintInvalidationForcedByLayout) |
+ setShouldDoFullPaintInvalidation(reason); |
+ else |
+ setMayNeedPaintInvalidation(); |
} |
// Collect all the unique border values that we want to paint in a sorted list. |
@@ -765,10 +772,15 @@ void LayoutTable::invalidateCollapsedBorders() { |
// cache of its containing section, and invalidates itself if any border |
// changes. This method doesn't affect layout. |
void LayoutTable::recalcCollapsedBordersIfNeeded() { |
- if (m_collapsedBordersValid || !collapseBorders()) |
+ if (m_collapsedBordersValid) |
return; |
m_collapsedBordersValid = true; |
- m_collapsedBorders.clear(); |
+ m_collapsedBordersInfo = nullptr; |
+ if (!collapseBorders()) |
+ return; |
+ |
+ LayoutRect boundsOfChangedCells; |
+ Vector<CollapsedBorderValue> values; |
for (LayoutObject* section = firstChild(); section; |
section = section->nextSibling()) { |
if (!section->isTableSection()) |
@@ -777,12 +789,23 @@ void LayoutTable::recalcCollapsedBordersIfNeeded() { |
row = row->nextRow()) { |
for (LayoutTableCell* cell = row->firstCell(); cell; |
cell = cell->nextCell()) { |
- ASSERT(cell->table() == this); |
- cell->collectBorderValues(m_collapsedBorders); |
+ DCHECK(cell->table() == this); |
+ bool cellChanged = cell->collectBorderValues(values); |
+ if (cellChanged && !shouldDoFullPaintInvalidation()) { |
+ LayoutRect cellRect = cell->localVisualRect(); |
+ cell->mapToVisualRectInAncestorSpace(this, cellRect); |
+ boundsOfChangedCells.unite(cellRect); |
+ } |
} |
} |
} |
- LayoutTableCell::sortBorderValues(m_collapsedBorders); |
+ if (!values.isEmpty()) { |
+ LayoutTableCell::sortBorderValues(values); |
+ m_collapsedBordersInfo = |
+ wrapUnique(new CollapsedBordersInfo(std::move(values))); |
+ } |
+ |
+ invalidatePaintRectangle(boundsOfChangedCells); |
} |
void LayoutTable::addOverflowFromChildren() { |
@@ -1662,10 +1685,10 @@ void LayoutTable::ensureIsReadyForPaintInvalidation() { |
PaintInvalidationReason LayoutTable::invalidatePaintIfNeeded( |
const PaintInvalidationState& paintInvalidationState) { |
- if (collapseBorders() && !m_collapsedBorders.isEmpty()) |
+ if (hasCollapsedBorders()) { |
paintInvalidationState.paintingLayer() |
.setNeedsPaintPhaseDescendantBlockBackgrounds(); |
- |
+ } |
return LayoutBlock::invalidatePaintIfNeeded(paintInvalidationState); |
} |