Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(129)

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutTableSection.cpp

Issue 2884573002: Replace LayoutTableCell::AbsoluteColumnIndex() with EffectiveColumnIndex()
Patch Set: - Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org)
3 * (C) 1997 Torben Weis (weis@kde.org) 3 * (C) 1997 Torben Weis (weis@kde.org)
4 * (C) 1998 Waldo Bastian (bastian@kde.org) 4 * (C) 1998 Waldo Bastian (bastian@kde.org)
5 * (C) 1999 Lars Knoll (knoll@kde.org) 5 * (C) 1999 Lars Knoll (knoll@kde.org)
6 * (C) 1999 Antti Koivisto (koivisto@kde.org) 6 * (C) 1999 Antti Koivisto (koivisto@kde.org)
7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc. 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc.
8 * All rights reserved. 8 * All rights reserved.
9 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) 9 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
10 * 10 *
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 Table()->EffectiveColumns(); 245 Table()->EffectiveColumns();
246 unsigned insertion_row = row->RowIndex(); 246 unsigned insertion_row = row->RowIndex();
247 247
248 // ### mozilla still seems to do the old HTML way, even for strict DTD 248 // ### mozilla still seems to do the old HTML way, even for strict DTD
249 // (see the annotation on table cell layouting in the CSS specs and the 249 // (see the annotation on table cell layouting in the CSS specs and the
250 // testcase below: 250 // testcase below:
251 // <TABLE border> 251 // <TABLE border>
252 // <TR><TD>1 <TD rowspan="2">2 <TD>3 <TD>4 252 // <TR><TD>1 <TD rowspan="2">2 <TD>3 <TD>4
253 // <TR><TD colspan="2">5 253 // <TR><TD colspan="2">5
254 // </TABLE> 254 // </TABLE>
255 unsigned n_cols = NumCols(insertion_row); 255 unsigned n_cols = NumEffectiveColumns(insertion_row);
256 while (c_col_ < n_cols && (GridCellAt(insertion_row, c_col_).HasCells() || 256 while (c_col_ < n_cols && (GridCellAt(insertion_row, c_col_).HasCells() ||
257 GridCellAt(insertion_row, c_col_).InColSpan())) 257 GridCellAt(insertion_row, c_col_).InColSpan()))
258 c_col_++; 258 c_col_++;
259 259
260 grid_[insertion_row].UpdateLogicalHeightForCell(cell); 260 grid_[insertion_row].UpdateLogicalHeightForCell(cell);
261 261
262 EnsureRows(insertion_row + r_span); 262 EnsureRows(insertion_row + r_span);
263 263
264 grid_[insertion_row].row = row; 264 grid_[insertion_row].row = row;
265 265
(...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 } 1134 }
1135 row->SetLogicalHeight(row_logical_height); 1135 row->SetLogicalHeight(row_logical_height);
1136 row->UpdateAfterLayout(); 1136 row->UpdateAfterLayout();
1137 } 1137 }
1138 } 1138 }
1139 1139
1140 // Vertically align and flex the cells in each row. 1140 // Vertically align and flex the cells in each row.
1141 for (unsigned r = 0; r < total_rows; r++) { 1141 for (unsigned r = 0; r < total_rows; r++) {
1142 LayoutTableRow* row = grid_[r].row; 1142 LayoutTableRow* row = grid_[r].row;
1143 1143
1144 unsigned n_cols = NumCols(r); 1144 unsigned n_cols = NumEffectiveColumns(r);
1145 for (unsigned c = 0; c < n_cols; c++) { 1145 for (unsigned c = 0; c < n_cols; c++) {
1146 LayoutTableCell* cell = OriginatingCellAt(r, c); 1146 LayoutTableCell* cell = OriginatingCellAt(r, c);
1147 if (!cell) 1147 if (!cell)
1148 continue; 1148 continue;
1149 1149
1150 int r_height; 1150 int r_height;
1151 int row_logical_top; 1151 int row_logical_top;
1152 unsigned row_span = std::max(1U, cell->RowSpan()); 1152 unsigned row_span = std::max(1U, cell->RowSpan());
1153 unsigned end_row_index = std::min(r + row_span, total_rows) - 1; 1153 unsigned end_row_index = std::min(r + row_span, total_rows) - 1;
1154 LayoutTableRow* last_row_object = grid_[end_row_index].row; 1154 LayoutTableRow* last_row_object = grid_[end_row_index].row;
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
1308 ClearChildNeedsOverflowRecalcAfterStyleChange(); 1308 ClearChildNeedsOverflowRecalcAfterStyleChange();
1309 unsigned total_rows = grid_.size(); 1309 unsigned total_rows = grid_.size();
1310 bool children_overflow_changed = false; 1310 bool children_overflow_changed = false;
1311 for (unsigned r = 0; r < total_rows; r++) { 1311 for (unsigned r = 0; r < total_rows; r++) {
1312 LayoutTableRow* row_layouter = RowLayoutObjectAt(r); 1312 LayoutTableRow* row_layouter = RowLayoutObjectAt(r);
1313 if (!row_layouter || 1313 if (!row_layouter ||
1314 !row_layouter->ChildNeedsOverflowRecalcAfterStyleChange()) 1314 !row_layouter->ChildNeedsOverflowRecalcAfterStyleChange())
1315 continue; 1315 continue;
1316 row_layouter->ClearChildNeedsOverflowRecalcAfterStyleChange(); 1316 row_layouter->ClearChildNeedsOverflowRecalcAfterStyleChange();
1317 bool row_children_overflow_changed = false; 1317 bool row_children_overflow_changed = false;
1318 unsigned n_cols = NumCols(r); 1318 unsigned n_cols = NumEffectiveColumns(r);
1319 for (unsigned c = 0; c < n_cols; c++) { 1319 for (unsigned c = 0; c < n_cols; c++) {
1320 auto* cell = OriginatingCellAt(r, c); 1320 auto* cell = OriginatingCellAt(r, c);
1321 if (!cell || !cell->NeedsOverflowRecalcAfterStyleChange()) 1321 if (!cell || !cell->NeedsOverflowRecalcAfterStyleChange())
1322 continue; 1322 continue;
1323 row_children_overflow_changed |= cell->RecalcOverflowAfterStyleChange(); 1323 row_children_overflow_changed |= cell->RecalcOverflowAfterStyleChange();
1324 } 1324 }
1325 if (row_children_overflow_changed) 1325 if (row_children_overflow_changed)
1326 row_layouter->ComputeOverflow(); 1326 row_layouter->ComputeOverflow();
1327 children_overflow_changed |= row_children_overflow_changed; 1327 children_overflow_changed |= row_children_overflow_changed;
1328 } 1328 }
1329 if (children_overflow_changed) 1329 if (children_overflow_changed)
1330 ComputeOverflowFromDescendants(); 1330 ComputeOverflowFromDescendants();
1331 return children_overflow_changed; 1331 return children_overflow_changed;
1332 } 1332 }
1333 1333
1334 void LayoutTableSection::MarkAllCellsWidthsDirtyAndOrNeedsLayout( 1334 void LayoutTableSection::MarkAllCellsWidthsDirtyAndOrNeedsLayout(
1335 LayoutTable::WhatToMarkAllCells what_to_mark) { 1335 LayoutTable::WhatToMarkAllCells what_to_mark) {
1336 for (LayoutTableRow* row = FirstRow(); row; row = row->NextRow()) { 1336 for (LayoutTableRow* row = FirstRow(); row; row = row->NextRow()) {
1337 for (LayoutTableCell* cell = row->FirstCell(); cell; 1337 for (LayoutTableCell* cell = row->FirstCell(); cell;
1338 cell = cell->NextCell()) { 1338 cell = cell->NextCell()) {
1339 cell->SetPreferredLogicalWidthsDirty(); 1339 cell->SetPreferredLogicalWidthsDirty();
1340 if (what_to_mark == LayoutTable::kMarkDirtyAndNeedsLayout) 1340 if (what_to_mark == LayoutTable::kMarkDirtyAndNeedsLayout)
1341 cell->SetChildNeedsLayout(); 1341 cell->SetChildNeedsLayout();
1342 } 1342 }
1343 } 1343 }
1344 } 1344 }
1345 1345
1346 int LayoutTableSection::CalcBlockDirectionOuterBorder( 1346 int LayoutTableSection::CalcBlockDirectionOuterBorder(
1347 BlockBorderSide side) const { 1347 BlockBorderSide side) const {
1348 // TODO(wangxianzhu): There are several issues in this function:
1349 // 1. Row borders are not respected;
1350 // 2. Column borders should be ignored if this section is not at the top or
1351 // the bottom.
1352 // 3. It's unnecessarily complex.
1353 // I think we should just use cell's calculated collapsed border values to
1354 // avoid all of the problems.
1348 if (!grid_.size() || !Table()->NumEffectiveColumns()) 1355 if (!grid_.size() || !Table()->NumEffectiveColumns())
1349 return 0; 1356 return 0;
1350 1357
1351 int border_width = 0; 1358 int border_width = 0;
1352 1359
1353 const BorderValue& sb = 1360 const BorderValue& sb =
1354 side == kBorderBefore ? Style()->BorderBefore() : Style()->BorderAfter(); 1361 side == kBorderBefore ? Style()->BorderBefore() : Style()->BorderAfter();
1355 if (sb.Style() == EBorderStyle::kHidden) 1362 if (sb.Style() == EBorderStyle::kHidden)
1356 return -1; 1363 return -1;
1357 if (sb.Style() > EBorderStyle::kHidden) 1364 if (sb.Style() > EBorderStyle::kHidden)
1358 border_width = sb.Width(); 1365 border_width = sb.Width();
1359 1366
1360 const BorderValue& rb = side == kBorderBefore 1367 const BorderValue& rb = side == kBorderBefore
1361 ? FirstRow()->Style()->BorderBefore() 1368 ? FirstRow()->Style()->BorderBefore()
1362 : LastRow()->Style()->BorderAfter(); 1369 : LastRow()->Style()->BorderAfter();
1363 if (rb.Style() == EBorderStyle::kHidden) 1370 if (rb.Style() == EBorderStyle::kHidden)
1364 return -1; 1371 return -1;
1365 if (rb.Style() > EBorderStyle::kHidden && rb.Width() > border_width) 1372 if (rb.Style() > EBorderStyle::kHidden && rb.Width() > border_width)
1366 border_width = rb.Width(); 1373 border_width = rb.Width();
1367 1374
1368 bool all_hidden = true; 1375 bool all_hidden = true;
1369 unsigned r = side == kBorderBefore ? 0 : grid_.size() - 1; 1376 unsigned r = side == kBorderBefore ? 0 : grid_.size() - 1;
1370 unsigned n_cols = NumCols(r); 1377 unsigned n_cols = NumEffectiveColumns(r);
1371 for (unsigned c = 0; c < n_cols; c++) { 1378 for (unsigned c = 0; c < n_cols; c++) {
1372 const auto& grid_cell = GridCellAt(r, c); 1379 const auto& grid_cell = GridCellAt(r, c);
1373 if (grid_cell.InColSpan() || !grid_cell.HasCells()) 1380 if (grid_cell.InColSpan() || !grid_cell.HasCells())
1374 continue; 1381 continue;
1375 const ComputedStyle& primary_cell_style = 1382 const ComputedStyle& primary_cell_style =
1376 grid_cell.PrimaryCell()->StyleRef(); 1383 grid_cell.PrimaryCell()->StyleRef();
1377 // FIXME: Make this work with perpendicular and flipped cells. 1384 // FIXME: Make this work with perpendicular and flipped cells.
1378 const BorderValue& cb = side == kBorderBefore 1385 const BorderValue& cb = side == kBorderBefore
1379 ? primary_cell_style.BorderBefore() 1386 ? primary_cell_style.BorderBefore()
1380 : primary_cell_style.BorderAfter(); 1387 : primary_cell_style.BorderAfter();
1381 // FIXME: Don't repeat for the same col group 1388 // FIXME: Don't repeat for the same col group
1382 LayoutTableCol* col = 1389 LayoutTableCol* col =
1383 Table()->ColElementAtAbsoluteColumn(c).InnermostColOrColGroup(); 1390 Table()->ColAndColGroupAtEffectiveColumn(c).InnermostColOrColGroup();
1384 if (col) { 1391 if (col) {
1385 const BorderValue& gb = side == kBorderBefore 1392 const BorderValue& gb = side == kBorderBefore
1386 ? col->Style()->BorderBefore() 1393 ? col->Style()->BorderBefore()
1387 : col->Style()->BorderAfter(); 1394 : col->Style()->BorderAfter();
1388 if (gb.Style() == EBorderStyle::kHidden || 1395 if (gb.Style() == EBorderStyle::kHidden ||
1389 cb.Style() == EBorderStyle::kHidden) 1396 cb.Style() == EBorderStyle::kHidden)
1390 continue; 1397 continue;
1391 all_hidden = false; 1398 all_hidden = false;
1392 if (gb.Style() > EBorderStyle::kHidden && gb.Width() > border_width) 1399 if (gb.Style() > EBorderStyle::kHidden && gb.Width() > border_width)
1393 border_width = gb.Width(); 1400 border_width = gb.Width();
(...skipping 25 matching lines...) Expand all
1419 int border_width = 0; 1426 int border_width = 0;
1420 1427
1421 const BorderValue& sb = 1428 const BorderValue& sb =
1422 side == kBorderStart ? Style()->BorderStart() : Style()->BorderEnd(); 1429 side == kBorderStart ? Style()->BorderStart() : Style()->BorderEnd();
1423 if (sb.Style() == EBorderStyle::kHidden) 1430 if (sb.Style() == EBorderStyle::kHidden)
1424 return -1; 1431 return -1;
1425 if (sb.Style() > EBorderStyle::kHidden) 1432 if (sb.Style() > EBorderStyle::kHidden)
1426 border_width = sb.Width(); 1433 border_width = sb.Width();
1427 1434
1428 if (LayoutTableCol* col = Table() 1435 if (LayoutTableCol* col = Table()
1429 ->ColElementAtAbsoluteColumn(col_index) 1436 ->ColAndColGroupAtEffectiveColumn(col_index)
1430 .InnermostColOrColGroup()) { 1437 .InnermostColOrColGroup()) {
1431 const BorderValue& gb = side == kBorderStart ? col->Style()->BorderStart() 1438 const BorderValue& gb = side == kBorderStart ? col->Style()->BorderStart()
1432 : col->Style()->BorderEnd(); 1439 : col->Style()->BorderEnd();
1433 if (gb.Style() == EBorderStyle::kHidden) 1440 if (gb.Style() == EBorderStyle::kHidden)
1434 return -1; 1441 return -1;
1435 if (gb.Style() > EBorderStyle::kHidden && gb.Width() > border_width) 1442 if (gb.Style() > EBorderStyle::kHidden && gb.Width() > border_width)
1436 border_width = gb.Width(); 1443 border_width = gb.Width();
1437 } 1444 }
1438 1445
1439 bool all_hidden = true; 1446 bool all_hidden = true;
1440 for (unsigned r = 0; r < grid_.size(); r++) { 1447 for (unsigned r = 0; r < grid_.size(); r++) {
1441 if (col_index >= NumCols(r)) 1448 if (col_index >= NumEffectiveColumns(r))
1442 continue; 1449 continue;
1443 const auto& grid_cell = GridCellAt(r, col_index); 1450 const auto& grid_cell = GridCellAt(r, col_index);
1444 if (!grid_cell.HasCells()) 1451 if (!grid_cell.HasCells())
1445 continue; 1452 continue;
1446 // FIXME: Don't repeat for the same cell 1453 // FIXME: Don't repeat for the same cell
1447 const ComputedStyle& primary_cell_style = 1454 const ComputedStyle& primary_cell_style =
1448 grid_cell.PrimaryCell()->StyleRef(); 1455 grid_cell.PrimaryCell()->StyleRef();
1449 const ComputedStyle& primary_cell_parent_style = 1456 const ComputedStyle& primary_cell_parent_style =
1450 grid_cell.PrimaryCell()->Parent()->StyleRef(); 1457 grid_cell.PrimaryCell()->Parent()->StyleRef();
1451 // FIXME: Make this work with perpendicular and flipped cells. 1458 // FIXME: Make this work with perpendicular and flipped cells.
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1556 1563
1557 rows.EnsureConsistency(grid_.size()); 1564 rows.EnsureConsistency(grid_.size());
1558 columns.EnsureConsistency(Table()->NumEffectiveColumns()); 1565 columns.EnsureConsistency(Table()->NumEffectiveColumns());
1559 1566
1560 if (!has_spanning_cells_) 1567 if (!has_spanning_cells_)
1561 return; 1568 return;
1562 1569
1563 if (rows.Start() > 0 && rows.Start() < grid_.size()) { 1570 if (rows.Start() > 0 && rows.Start() < grid_.size()) {
1564 // If there are any cells spanning into the first row, expand |rows| to 1571 // If there are any cells spanning into the first row, expand |rows| to
1565 // cover the cells. 1572 // cover the cells.
1566 unsigned n_cols = NumCols(rows.Start()); 1573 unsigned n_cols = NumEffectiveColumns(rows.Start());
1567 unsigned smallest_row = rows.Start(); 1574 unsigned smallest_row = rows.Start();
1568 for (unsigned c = columns.Start(); c < std::min(columns.End(), n_cols); 1575 for (unsigned c = columns.Start(); c < std::min(columns.End(), n_cols);
1569 ++c) { 1576 ++c) {
1570 for (const auto* cell : GridCellAt(rows.Start(), c).Cells()) { 1577 for (const auto* cell : GridCellAt(rows.Start(), c).Cells()) {
1571 smallest_row = std::min(smallest_row, cell->RowIndex()); 1578 smallest_row = std::min(smallest_row, cell->RowIndex());
1572 if (!smallest_row) 1579 if (!smallest_row)
1573 break; 1580 break;
1574 } 1581 }
1575 } 1582 }
1576 rows = CellSpan(smallest_row, rows.End()); 1583 rows = CellSpan(smallest_row, rows.End());
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1699 cell = cell->NextCell()) 1706 cell = cell->NextCell())
1700 grid_[row_index].UpdateLogicalHeightForCell(cell); 1707 grid_[row_index].UpdateLogicalHeightForCell(cell);
1701 } 1708 }
1702 1709
1703 void LayoutTableSection::SetNeedsCellRecalc() { 1710 void LayoutTableSection::SetNeedsCellRecalc() {
1704 needs_cell_recalc_ = true; 1711 needs_cell_recalc_ = true;
1705 if (LayoutTable* t = Table()) 1712 if (LayoutTable* t = Table())
1706 t->SetNeedsSectionRecalc(); 1713 t->SetNeedsSectionRecalc();
1707 } 1714 }
1708 1715
1709 unsigned LayoutTableSection::NumEffectiveColumns() const { 1716 unsigned LayoutTableSection::MaxNumEffectiveColumnsOfRows() const {
1710 unsigned result = 0; 1717 unsigned result = 0;
1711 1718
1712 for (unsigned r = 0; r < grid_.size(); ++r) { 1719 for (unsigned r = 0; r < grid_.size(); ++r) {
1713 unsigned n_cols = NumCols(r); 1720 unsigned n_cols = NumEffectiveColumns(r);
1714 for (unsigned c = result; c < n_cols; ++c) { 1721 for (unsigned c = result; c < n_cols; ++c) {
1715 const auto& grid_cell = GridCellAt(r, c); 1722 const auto& grid_cell = GridCellAt(r, c);
1716 if (grid_cell.HasCells() || grid_cell.InColSpan()) 1723 if (grid_cell.HasCells() || grid_cell.InColSpan())
1717 result = c; 1724 result = c;
1718 } 1725 }
1719 } 1726 }
1720 1727
1721 return result + 1; 1728 return result + 1;
1722 } 1729 }
1723 1730
(...skipping 25 matching lines...) Expand all
1749 const LayoutTableCell* LayoutTableSection::FirstRowCellAdjoiningTableEnd() 1756 const LayoutTableCell* LayoutTableSection::FirstRowCellAdjoiningTableEnd()
1750 const { 1757 const {
1751 unsigned adjoining_end_cell_column_index = 1758 unsigned adjoining_end_cell_column_index =
1752 HasSameDirectionAs(Table()) ? Table()->LastEffectiveColumnIndex() : 0; 1759 HasSameDirectionAs(Table()) ? Table()->LastEffectiveColumnIndex() : 0;
1753 return PrimaryCellAt(0, adjoining_end_cell_column_index); 1760 return PrimaryCellAt(0, adjoining_end_cell_column_index);
1754 } 1761 }
1755 1762
1756 LayoutTableCell* LayoutTableSection::OriginatingCellAt( 1763 LayoutTableCell* LayoutTableSection::OriginatingCellAt(
1757 unsigned row, 1764 unsigned row,
1758 unsigned effective_column) { 1765 unsigned effective_column) {
1759 if (effective_column >= NumCols(row)) 1766 if (effective_column >= NumEffectiveColumns(row))
1760 return nullptr; 1767 return nullptr;
1761 auto& grid_cell = GridCellAt(row, effective_column); 1768 auto& grid_cell = GridCellAt(row, effective_column);
1762 if (grid_cell.InColSpan()) 1769 if (grid_cell.InColSpan())
1763 return nullptr; 1770 return nullptr;
1764 if (auto* cell = grid_cell.PrimaryCell()) { 1771 if (auto* cell = grid_cell.PrimaryCell()) {
1765 if (cell->RowIndex() == row) 1772 if (cell->RowIndex() == row)
1766 return cell; 1773 return cell;
1767 } 1774 }
1768 return nullptr; 1775 return nullptr;
1769 } 1776 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
1845 hit_test_rect.MoveBy(-adjusted_location); 1852 hit_test_rect.MoveBy(-adjusted_location);
1846 1853
1847 LayoutRect table_aligned_rect = 1854 LayoutRect table_aligned_rect =
1848 LogicalRectForWritingModeAndDirection(hit_test_rect); 1855 LogicalRectForWritingModeAndDirection(hit_test_rect);
1849 CellSpan row_span = SpannedRows(table_aligned_rect); 1856 CellSpan row_span = SpannedRows(table_aligned_rect);
1850 CellSpan column_span = SpannedEffectiveColumns(table_aligned_rect); 1857 CellSpan column_span = SpannedEffectiveColumns(table_aligned_rect);
1851 1858
1852 // Now iterate over the spanned rows and columns. 1859 // Now iterate over the spanned rows and columns.
1853 for (unsigned hit_row = row_span.Start(); hit_row < row_span.End(); 1860 for (unsigned hit_row = row_span.Start(); hit_row < row_span.End();
1854 ++hit_row) { 1861 ++hit_row) {
1855 unsigned n_cols = NumCols(hit_row); 1862 unsigned n_cols = NumEffectiveColumns(hit_row);
1856 for (unsigned hit_column = column_span.Start(); 1863 for (unsigned hit_column = column_span.Start();
1857 hit_column < n_cols && hit_column < column_span.End(); ++hit_column) { 1864 hit_column < n_cols && hit_column < column_span.End(); ++hit_column) {
1858 auto& grid_cell = GridCellAt(hit_row, hit_column); 1865 auto& grid_cell = GridCellAt(hit_row, hit_column);
1859 1866
1860 // If the cell is empty, there's nothing to do 1867 // If the cell is empty, there's nothing to do
1861 if (!grid_cell.HasCells()) 1868 if (!grid_cell.HasCells())
1862 continue; 1869 continue;
1863 1870
1864 for (unsigned i = grid_cell.Cells().size(); i;) { 1871 for (unsigned i = grid_cell.Cells().size(); i;) {
1865 --i; 1872 --i;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1899 unsigned effective_column) const { 1906 unsigned effective_column) const {
1900 LayoutPoint cell_location(0, row_pos_[cell->RowIndex()]); 1907 LayoutPoint cell_location(0, row_pos_[cell->RowIndex()]);
1901 int horizontal_border_spacing = Table()->HBorderSpacing(); 1908 int horizontal_border_spacing = Table()->HBorderSpacing();
1902 1909
1903 // FIXME: The table's direction should determine our row's direction, not the 1910 // FIXME: The table's direction should determine our row's direction, not the
1904 // section's (see bug 96691). 1911 // section's (see bug 96691).
1905 if (!Style()->IsLeftToRightDirection()) 1912 if (!Style()->IsLeftToRightDirection())
1906 cell_location.SetX(LayoutUnit( 1913 cell_location.SetX(LayoutUnit(
1907 Table()->EffectiveColumnPositions()[Table()->NumEffectiveColumns()] - 1914 Table()->EffectiveColumnPositions()[Table()->NumEffectiveColumns()] -
1908 Table()->EffectiveColumnPositions() 1915 Table()->EffectiveColumnPositions()
1909 [Table()->AbsoluteColumnToEffectiveColumn( 1916 [cell->EffectiveColumnIndexOfCellAfter()] +
1910 cell->AbsoluteColumnIndex() + cell->ColSpan())] +
1911 horizontal_border_spacing)); 1917 horizontal_border_spacing));
1912 else 1918 else
1913 cell_location.SetX( 1919 cell_location.SetX(
1914 LayoutUnit(Table()->EffectiveColumnPositions()[effective_column] + 1920 LayoutUnit(Table()->EffectiveColumnPositions()[effective_column] +
1915 horizontal_border_spacing)); 1921 horizontal_border_spacing));
1916 1922
1917 cell->SetLogicalLocation(cell_location); 1923 cell->SetLogicalLocation(cell_location);
1918 } 1924 }
1919 1925
1920 void LayoutTableSection::RelayoutCellIfFlexed(LayoutTableCell& cell, 1926 void LayoutTableSection::RelayoutCellIfFlexed(LayoutTableCell& cell,
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
2120 rect.SetHeight(Table()->LogicalHeight()); 2126 rect.SetHeight(Table()->LogicalHeight());
2121 transform_state.SetQuad(FloatQuad(rect)); 2127 transform_state.SetQuad(FloatQuad(rect));
2122 } 2128 }
2123 return LayoutTableBoxComponent::MapToVisualRectInAncestorSpaceInternal( 2129 return LayoutTableBoxComponent::MapToVisualRectInAncestorSpaceInternal(
2124 ancestor, transform_state, flags); 2130 ancestor, transform_state, flags);
2125 } 2131 }
2126 2132
2127 bool LayoutTableSection::PaintedOutputOfObjectHasNoEffectRegardlessOfSize() 2133 bool LayoutTableSection::PaintedOutputOfObjectHasNoEffectRegardlessOfSize()
2128 const { 2134 const {
2129 // LayoutTableSection paints background from columns. 2135 // LayoutTableSection paints background from columns.
2130 if (Table()->HasColElements()) 2136 if (Table()->HasColOrColGroups())
2131 return false; 2137 return false;
2132 return LayoutTableBoxComponent:: 2138 return LayoutTableBoxComponent::
2133 PaintedOutputOfObjectHasNoEffectRegardlessOfSize(); 2139 PaintedOutputOfObjectHasNoEffectRegardlessOfSize();
2134 } 2140 }
2135 2141
2136 } // namespace blink 2142 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutTableSection.h ('k') | third_party/WebKit/Source/core/layout/LayoutTableTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698