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 0ee9463712e56fe04781164d14512946d553a762..d9b2c22b8bf05f0e7595498cd34114ca806b89a2 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutTableCell.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutTableCell.cpp |
@@ -45,7 +45,8 @@ using namespace HTMLNames; |
struct SameSizeAsLayoutTableCell : public LayoutBlockFlow { |
unsigned bitfields; |
int paddings[2]; |
- void* pointer; |
+ void* pointer1; |
+ void* pointer2; |
}; |
static_assert(sizeof(LayoutTableCell) == sizeof(SameSizeAsLayoutTableCell), |
@@ -443,6 +444,16 @@ int LayoutTableCell::cellBaselinePosition() const { |
return (borderBefore() + paddingBefore() + contentLogicalHeight()).toInt(); |
} |
+void LayoutTableCell::ensureIsReadyForPaintInvalidation() { |
+ LayoutBlockFlow::ensureIsReadyForPaintInvalidation(); |
+ if (!usesCompositedCellDisplayItemClients()) |
+ return; |
+ if (!m_rowBackgroundDisplayItemClient) { |
+ m_rowBackgroundDisplayItemClient = |
+ wrapUnique(new LayoutTableCell::RowBackgroundDisplayItemClient(*row())); |
+ } |
+} |
+ |
void LayoutTableCell::styleDidChange(StyleDifference diff, |
const ComputedStyle* oldStyle) { |
DCHECK_EQ(style()->display(), EDisplay::TableCell); |
@@ -484,19 +495,36 @@ void LayoutTableCell::styleDidChange(StyleDifference diff, |
} |
} |
-// The following rules apply for resolving conflicts and figuring out which border |
-// to use. |
-// (1) Borders with the 'border-style' of 'hidden' take precedence over all other conflicting |
-// borders. Any border with this value suppresses all borders at this location. |
-// (2) Borders with a style of 'none' have the lowest priority. Only if the border properties of all |
-// the elements meeting at this edge are 'none' will the border be omitted (but note that 'none' is |
-// the default value for the border style.) |
-// (3) If none of the styles are 'hidden' and at least one of them is not 'none', then narrow borders |
-// are discarded in favor of wider ones. If several have the same 'border-width' then styles are preferred |
-// in this order: 'double', 'solid', 'dashed', 'dotted', 'ridge', 'outset', 'groove', and the lowest: 'inset'. |
-// (4) If border styles differ only in color, then a style set on a cell wins over one on a row, |
-// which wins over a row group, column, column group and, lastly, table. It is undefined which color |
-// is used when two elements of the same type disagree. |
+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(); |
+} |
+ |
+// The following rules apply for resolving conflicts and figuring out which |
+// border to use. |
+// (1) Borders with the 'border-style' of 'hidden' take precedence over all |
+// other conflicting borders. Any border with this value suppresses all |
+// borders at this location. |
+// (2) Borders with a style of 'none' have the lowest priority. Only if the |
+// border properties of all the elements meeting at this edge are 'none' |
+// will the border be omitted (but note that 'none' is the default value for |
+// the border style.) |
+// (3) If none of the styles are 'hidden' and at least one of them is not |
+// 'none', then narrow borders are discarded in favor of wider ones. If |
+// several have the same 'border-width' then styles are preferred in this |
+// order: 'double', 'solid', 'dashed', 'dotted', 'ridge', 'outset', |
+// 'groove', and the lowest: 'inset'. |
+// (4) If border styles differ only in color, then a style set on a cell wins |
+// over one on a row, which wins over a row group, column, column group and, |
+// lastly, table. It is undefined which color is used when two elements of |
+// the same type disagree. |
static bool compareBorders(const CollapsedBorderValue& border1, |
const CollapsedBorderValue& border2) { |
// Sanity check the values passed in. The null border have lowest priority. |
@@ -1375,7 +1403,7 @@ bool LayoutTableCell::backgroundIsKnownToBeOpaqueInRect( |
return LayoutBlockFlow::backgroundIsKnownToBeOpaqueInRect(localRect); |
} |
-bool LayoutTableCell::usesTableAsAdditionalDisplayItemClient() const { |
+bool LayoutTableCell::usesCompositedCellDisplayItemClients() 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. |
@@ -1385,11 +1413,18 @@ bool LayoutTableCell::usesTableAsAdditionalDisplayItemClient() const { |
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); |
+ } |
} |
// TODO(lunalu): Deliberately dump the "inner" box of table cells, since that |