Index: third_party/WebKit/Source/core/layout/LayoutTableCell.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutTableCell.cpp b/third_party/WebKit/Source/core/layout/LayoutTableCell.cpp |
index b842de0d1adf12959601e2381e614de54c9f9d27..ffe9eae5de16e3672934304e5d278ef58a7ac8e7 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutTableCell.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutTableCell.cpp |
@@ -46,7 +46,11 @@ using namespace HTMLNames; |
struct SameSizeAsLayoutTableCell : public LayoutBlockFlow { |
unsigned bitfields; |
int paddings[2]; |
- void* pointer; |
+ void* pointer1; |
+ void* pointer2; |
+ void* pointer3; |
+ void* pointer4; |
+ void* pointer5; |
}; |
static_assert(sizeof(LayoutTableCell) == sizeof(SameSizeAsLayoutTableCell), |
@@ -463,6 +467,44 @@ int LayoutTableCell::cellBaselinePosition() const { |
return (borderBefore() + paddingBefore() + contentLogicalHeight()).toInt(); |
} |
+void LayoutTableCell::createCompositedCellDisplayItemClients() { |
+ if (!usesCompositedCellDisplayItemClients()) |
+ return; |
+ |
+ if (row()->styleRef().hasBackground() && !m_rowBackgroundDisplayItemClient) { |
+ m_rowBackgroundDisplayItemClient = |
+ wrapUnique(new LayoutTableCell::RowBackgroundDisplayItemClient(*row())); |
+ } |
+ |
+ LayoutTable::ColAndColGroup colAndColGroup = |
+ table()->colElementAtAbsoluteColumn(absoluteColumnIndex()); |
+ LayoutTableCol* column = colAndColGroup.col; |
+ LayoutTableCol* columnGroup = colAndColGroup.colgroup; |
+ if (column && column->styleRef().hasBackground() && |
+ !m_colBackgroundDisplayItemClient) { |
+ m_colBackgroundDisplayItemClient = wrapUnique( |
+ new LayoutTableCell::ColBackgroundDisplayItemClient(*column)); |
+ } |
+ if (columnGroup && columnGroup->styleRef().hasBackground() && |
+ !m_colGroupBackgroundDisplayItemClient) { |
+ m_colGroupBackgroundDisplayItemClient = wrapUnique( |
+ new LayoutTableCell::ColBackgroundDisplayItemClient(*columnGroup)); |
+ } |
+ if (section()->styleRef().hasBackground() && |
+ !m_sectionBackgroundDisplayItemClient) { |
+ m_sectionBackgroundDisplayItemClient = wrapUnique( |
+ new LayoutTableCell::SectionBackgroundDisplayItemClient(*section())); |
+ } |
+} |
+ |
+void LayoutTableCell::ensureIsReadyForPaintInvalidation() { |
+ LayoutBlockFlow::ensureIsReadyForPaintInvalidation(); |
+ // Below handles the case where a page starts out in a state where the table |
wkorman
2016/11/15 01:05:33
I ended up keeping this as it handles one case (de
|
+ // cell compositing state and its container styling is such that one or more |
+ // special display item clients are needed. |
+ createCompositedCellDisplayItemClients(); |
+} |
+ |
void LayoutTableCell::styleDidChange(StyleDifference diff, |
const ComputedStyle* oldStyle) { |
DCHECK_EQ(style()->display(), EDisplay::TableCell); |
@@ -1416,21 +1458,84 @@ bool LayoutTableCell::backgroundIsKnownToBeOpaqueInRect( |
return LayoutBlockFlow::backgroundIsKnownToBeOpaqueInRect(localRect); |
} |
-bool LayoutTableCell::usesTableAsAdditionalDisplayItemClient() const { |
- // In certain cases such as collapsed borders for composited table cells we |
- // paint content for the cell into the table graphics layer backing and so |
- // must use the table's visual rect. |
+LayoutTableCell::RowBackgroundDisplayItemClient::RowBackgroundDisplayItemClient( |
+ const LayoutTableRow& layoutTableRow) |
+ : m_layoutTableRow(layoutTableRow) {} |
+ |
+String LayoutTableCell::RowBackgroundDisplayItemClient::debugName() const { |
+ return "RowBackground"; |
+} |
+ |
+LayoutRect LayoutTableCell::RowBackgroundDisplayItemClient::visualRect() const { |
+ return m_layoutTableRow.visualRect(); |
+} |
+ |
+LayoutTableCell::ColBackgroundDisplayItemClient::ColBackgroundDisplayItemClient( |
+ const LayoutTableCol& layoutTableCol) |
+ : m_layoutTableCol(layoutTableCol) {} |
+ |
+String LayoutTableCell::ColBackgroundDisplayItemClient::debugName() const { |
+ return "ColBackground"; |
+} |
+ |
+LayoutRect LayoutTableCell::ColBackgroundDisplayItemClient::visualRect() const { |
+ return m_layoutTableCol.visualRect(); |
+} |
+ |
+LayoutTableCell::SectionBackgroundDisplayItemClient:: |
+ SectionBackgroundDisplayItemClient( |
+ const LayoutTableSection& layoutTableSection) |
+ : m_layoutTableSection(layoutTableSection) {} |
+ |
+String LayoutTableCell::SectionBackgroundDisplayItemClient::debugName() const { |
+ return "SectionBackground"; |
+} |
+ |
+LayoutRect LayoutTableCell::SectionBackgroundDisplayItemClient::visualRect() |
+ const { |
+ return m_layoutTableSection.visualRect(); |
+} |
+ |
+bool LayoutTableCell::usesCompositedCellDisplayItemClients() const { |
+ // Composited table cells are painted in special ways that require the use of |
+ // custom display item clients: |
+ // |
+ // 1. When painting row background we paint content for the cell into the |
+ // table row graphics layer backing and so must use the row's visual rect. |
+ // |
+ // 2. When painting section, column or column group backgrounds we paint |
+ // content for the cell into the table section graphics layer backing and must |
+ // use the visual rect for the respective background object |
return (hasLayer() && layer()->compositingState() != NotComposited) || |
RuntimeEnabledFeatures::slimmingPaintV2Enabled(); |
Xianzhu
2016/11/15 02:58:23
This misses the case that the row is composited bu
wkorman
2016/11/15 19:46:02
Ah. I will look at adding tests for these cases (e
Xianzhu
2016/11/15 20:16:58
Sorry, "DisplayItemClients" should be "LayoutTable
|
} |
void LayoutTableCell::invalidateDisplayItemClients( |
PaintInvalidationReason reason) const { |
- if (m_collapsedBorderValues && usesTableAsAdditionalDisplayItemClient()) { |
- ObjectPaintInvalidator(*this).invalidateDisplayItemClient( |
- *m_collapsedBorderValues, reason); |
- } |
LayoutBlockFlow::invalidateDisplayItemClients(reason); |
+ |
+ if (!usesCompositedCellDisplayItemClients()) |
+ return; |
+ |
+ ObjectPaintInvalidator invalidator(*this); |
+ if (m_collapsedBorderValues) |
+ invalidator.invalidateDisplayItemClient(*m_collapsedBorderValues, reason); |
+ if (m_rowBackgroundDisplayItemClient) { |
+ invalidator.invalidateDisplayItemClient(*m_rowBackgroundDisplayItemClient, |
+ reason); |
+ } |
+ if (m_colBackgroundDisplayItemClient) { |
+ invalidator.invalidateDisplayItemClient(*m_colBackgroundDisplayItemClient, |
+ reason); |
+ } |
+ if (m_colGroupBackgroundDisplayItemClient) { |
+ invalidator.invalidateDisplayItemClient( |
+ *m_colGroupBackgroundDisplayItemClient, reason); |
+ } |
+ if (m_sectionBackgroundDisplayItemClient) { |
+ invalidator.invalidateDisplayItemClient( |
+ *m_sectionBackgroundDisplayItemClient, reason); |
+ } |
} |
// TODO(lunalu): Deliberately dump the "inner" box of table cells, since that |