Chromium Code Reviews| Index: third_party/WebKit/Source/core/layout/LayoutTableSection.cpp |
| diff --git a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp |
| index 275532bb4fd737759e67a6f72a4a27292d04d4dc..95e23171d63f1989c118bbb03d7ecf3d351c3ba7 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp |
| @@ -1238,7 +1238,7 @@ void LayoutTableSection::LayoutRows() { |
| SetLogicalHeight(LayoutUnit(row_pos_[total_rows])); |
| - ComputeOverflowFromCells(total_rows, Table()->NumEffectiveColumns()); |
| + ComputeOverflowFromDescendants(); |
| } |
| int LayoutTableSection::PaginationStrutForRow(LayoutTableRow* row, |
| @@ -1272,15 +1272,8 @@ int LayoutTableSection::PaginationStrutForRow(LayoutTableRow* row, |
| return pagination_strut.Ceil(); |
| } |
| -void LayoutTableSection::ComputeOverflowFromCells() { |
| - unsigned total_rows = grid_.size(); |
| - unsigned n_eff_cols = Table()->NumEffectiveColumns(); |
| - ComputeOverflowFromCells(total_rows, n_eff_cols); |
| -} |
| - |
| -void LayoutTableSection::ComputeOverflowFromCells(unsigned total_rows, |
| - unsigned n_eff_cols) { |
| - unsigned total_cells_count = n_eff_cols * total_rows; |
| +void LayoutTableSection::ComputeOverflowFromDescendants() { |
| + unsigned total_cells_count = NumRows() * Table()->NumEffectiveColumns(); |
| unsigned max_allowed_overflowing_cells_count = |
| total_cells_count < |
| g_min_table_size_to_use_fast_paint_path_with_overflowing_cell |
| @@ -1294,29 +1287,42 @@ void LayoutTableSection::ComputeOverflowFromCells(unsigned total_rows, |
| #if DCHECK_IS_ON() |
| bool has_overflowing_cell = false; |
| #endif |
| - // Now that our height has been determined, add in overflow from cells. |
| - for (unsigned r = 0; r < total_rows; r++) { |
| - unsigned n_cols = NumCols(r); |
| - for (unsigned c = 0; c < n_cols; c++) { |
| - const auto* cell = OriginatingCellAt(r, c); |
| - if (!cell) |
| + |
| + for (auto* row = FirstRow(); row; row = row->NextRow()) { |
| + AddOverflowFromChild(*row); |
| + |
| + for (auto* cell = row->FirstCell(); cell; cell = cell->NextCell()) { |
| + // Let the section's self visual overflow cover the cell's whole collapsed |
| + // borders. This ensures correct raster invalidation on section border |
| + // style change. |
| + // TODO(wangxianzhu): When implementing row as DisplayItemClient of |
| + // collapsed borders, the following logic should be replaced by |
| + // invalidation of rows on section border style change. crbug.com/663208. |
| + if (const auto* collapsed_borders = cell->GetCollapsedBorderValues()) { |
| + LayoutRect rect = cell->RectForOverflowPropagation( |
| + collapsed_borders->LocalVisualRect()); |
| + rect.MoveBy(cell->Location()); |
| + AddSelfVisualOverflow(rect); |
| + } |
| + |
| + if (force_slow_paint_path_with_overflowing_cell_ || |
| + !cell->HasVisualOverflow()) |
| continue; |
| - AddOverflowFromChild(*cell); |
| + |
| #if DCHECK_IS_ON() |
| - has_overflowing_cell |= cell->HasVisualOverflow(); |
| + has_overflowing_cell = true; |
| #endif |
| - if (cell->HasVisualOverflow() && |
| - !force_slow_paint_path_with_overflowing_cell_) { |
| - overflowing_cells_.insert(cell); |
| - if (overflowing_cells_.size() > max_allowed_overflowing_cells_count) { |
| - // We need to set m_forcesSlowPaintPath only if there is a least one |
| - // overflowing cells as the hit testing code rely on this information. |
| - force_slow_paint_path_with_overflowing_cell_ = true; |
| - // The slow path does not make any use of the overflowing cells info, |
| - // don't hold on to the memory. |
| - overflowing_cells_.clear(); |
| - } |
| + if (overflowing_cells_.size() >= max_allowed_overflowing_cells_count) { |
| + // We need to set m_forcesSlowPaintPath only if there is a least one |
|
wkorman
2017/05/08 17:51:23
a least -> at least
Xianzhu
2017/05/09 03:55:43
Done.
Xianzhu
2017/05/09 03:55:43
Done.
|
| + // overflowing cells as the hit testing code rely on this information. |
|
wkorman
2017/05/08 17:51:23
cells -> cell, rely -> relies
Xianzhu
2017/05/09 03:55:43
Done.
|
| + force_slow_paint_path_with_overflowing_cell_ = true; |
| + // The slow path does not make any use of the overflowing cells info, |
| + // don't hold on to the memory. |
| + overflowing_cells_.clear(); |
| + continue; |
| } |
| + |
| + overflowing_cells_.insert(cell); |
| } |
| } |
| @@ -1348,9 +1354,8 @@ bool LayoutTableSection::RecalcChildOverflowAfterStyleChange() { |
| row_layouter->ComputeOverflow(); |
| children_overflow_changed |= row_children_overflow_changed; |
| } |
| - // TODO(crbug.com/604136): Add visual overflow from rows too. |
| if (children_overflow_changed) |
| - ComputeOverflowFromCells(total_rows, Table()->NumEffectiveColumns()); |
| + ComputeOverflowFromDescendants(); |
| return children_overflow_changed; |
| } |