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

Side by Side Diff: Source/core/rendering/RenderTableSection.cpp

Issue 23530044: Row with only spanning cells have a height of 0. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Review comments addressed Created 7 years, 3 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 Apple Inc. All rights reserved. 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010 Apple Inc. All rights reserved.
8 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) 8 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after
246 if (inColSpan) 246 if (inColSpan)
247 c.inColSpan = true; 247 c.inColSpan = true;
248 } 248 }
249 m_cCol++; 249 m_cCol++;
250 cSpan -= currentSpan; 250 cSpan -= currentSpan;
251 inColSpan = true; 251 inColSpan = true;
252 } 252 }
253 cell->setCol(table()->effColToCol(col)); 253 cell->setCol(table()->effColToCol(col));
254 } 254 }
255 255
256 unsigned RenderTableSection::rowHasOnlySpanningCells(unsigned row)
257 {
258 ASSERT(row < m_grid.size());
Julien - ping for review 2013/09/17 16:51:26 This will be caught by Vector::at() (even in relea
a.suchit 2013/09/18 11:40:38 returned if row have more than vector size.
259
260 unsigned totalCols = m_grid[row].row.size();
261
262 if (!totalCols)
263 return false;
264
265 for (unsigned col = 0; col < totalCols; col++) {
266 CellStruct rowSpanCell = cellAt(row, col);
Julien - ping for review 2013/09/17 16:51:26 Let's avoid a copy by using a reference here. Also
a.suchit 2013/09/18 11:40:38 Done.
267 if (rowSpanCell.cells.size()) {
268 if (rowSpanCell.cells[0]->rowSpan() == 1)
269 return false;
270 } else {
271 return false;
272 }
Julien - ping for review 2013/09/17 16:51:26 Let's write this (more readable with the early ret
a.suchit 2013/09/18 11:40:38 Done.
273 }
274
275 return true;
276 }
277
256 void RenderTableSection::populateSpanningRowsHeightFromCell(RenderTableCell* cel l, struct SpanningRowsHeight& spanningRowsHeight) 278 void RenderTableSection::populateSpanningRowsHeightFromCell(RenderTableCell* cel l, struct SpanningRowsHeight& spanningRowsHeight)
257 { 279 {
258 const unsigned rowSpan = cell->rowSpan(); 280 const unsigned rowSpan = cell->rowSpan();
259 const unsigned rowIndex = cell->rowIndex(); 281 const unsigned rowIndex = cell->rowIndex();
260 282
261 spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing = cell->logicalHe ightForRowSizing(); 283 spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing = cell->logicalHe ightForRowSizing();
262 284
263 spanningRowsHeight.rowHeight.resize(rowSpan); 285 spanningRowsHeight.rowHeight.resize(rowSpan);
264 spanningRowsHeight.totalRowsHeight = 0; 286 spanningRowsHeight.totalRowsHeight = 0;
265 for (unsigned row = 0; row < rowSpan; row++) { 287 for (unsigned row = 0; row < rowSpan; row++) {
266 unsigned actualRow = row + rowIndex; 288 unsigned actualRow = row + rowIndex;
267 spanningRowsHeight.rowHeight[row] = m_rowPos[actualRow + 1] - m_rowPos[a ctualRow] - borderSpacingForRow(actualRow); 289 spanningRowsHeight.rowHeight[row] = m_rowPos[actualRow + 1] - m_rowPos[a ctualRow] - borderSpacingForRow(actualRow);
290 if (!spanningRowsHeight.rowHeight[row]) {
291 if (rowHasOnlySpanningCells(actualRow)) {
292 spanningRowsHeight.rowWithOnlySpanningCells = true;
Julien - ping for review 2013/09/17 16:51:26 We can remove the inner branch (yay!): spanningRo
a.suchit 2013/09/18 11:40:38 Done.
293 }
294 }
268 spanningRowsHeight.totalRowsHeight += spanningRowsHeight.rowHeight[row]; 295 spanningRowsHeight.totalRowsHeight += spanningRowsHeight.rowHeight[row];
269 spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing -= borderSpac ingForRow(actualRow); 296 spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing -= borderSpac ingForRow(actualRow);
270 } 297 }
271 // We don't span the following row so its border-spacing (if any) should be included. 298 // We don't span the following row so its border-spacing (if any) should be included.
272 spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing += borderSpacingF orRow(rowIndex + rowSpan - 1); 299 spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing += borderSpacingF orRow(rowIndex + rowSpan - 1);
273 } 300 }
274 301
275 void RenderTableSection::distributeExtraRowSpanHeightToPercentRows(RenderTableCe ll* cell, int totalPercent, int& extraRowSpanningHeight, Vector<int>& rowsHeight ) 302 void RenderTableSection::distributeExtraRowSpanHeightToPercentRows(RenderTableCe ll* cell, int totalPercent, int& extraRowSpanningHeight, Vector<int>& rowsHeight )
276 { 303 {
277 if (!extraRowSpanningHeight || !totalPercent) 304 if (!extraRowSpanningHeight || !totalPercent)
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 if (cellIsFullyIncludedInOtherCell(cell1, cell2)) 415 if (cellIsFullyIncludedInOtherCell(cell1, cell2))
389 return true; 416 return true;
390 // Sorting lower row index first because first we need to apply the extra he ight of spanning cell which 417 // Sorting lower row index first because first we need to apply the extra he ight of spanning cell which
391 // comes first in the table so lower rows's position would increment in sequ ence. 418 // comes first in the table so lower rows's position would increment in sequ ence.
392 if (cellIsFullyIncludedInOtherCell(cell2, cell1)) 419 if (cellIsFullyIncludedInOtherCell(cell2, cell1))
393 return (cell1->rowIndex() < cell2->rowIndex()); 420 return (cell1->rowIndex() < cell2->rowIndex());
394 421
395 return false; 422 return false;
396 } 423 }
397 424
425 unsigned RenderTableSection::calcRowHeightHavingOnlySpanningCells(unsigned row)
Julien - ping for review 2013/09/17 16:51:26 This function is never called.
a.suchit 2013/09/18 11:40:38 It is called by function "updateRowsHeightHavingOn
426 {
427 ASSERT(row < m_grid.size());
Julien - ping for review 2013/09/17 16:51:26 Again, duplicated by Vector::at().
a.suchit 2013/09/18 11:40:38 returned if row have more than vector size.
428 ASSERT(rowHasOnlySpanningCells(row));
429
430 unsigned totalCols = m_grid[row].row.size();
431
432 if (!totalCols)
433 return 0;
434
435 unsigned rowHeight = 0;
436
437 for (unsigned col = 0; col < totalCols; col++) {
438 CellStruct rowSpanCell = cellAt(row, col);
439 if (rowSpanCell.cells.size() && rowSpanCell.cells[0]->rowSpan() > 1)
440 rowHeight = max(rowHeight, rowSpanCell.cells[0]->logicalHeightForRow Sizing() / rowSpanCell.cells[0]->rowSpan());
441 }
442
443 return rowHeight;
444 }
445
446 void RenderTableSection::updateRowsHeightHavingOnlySpanningCells(RenderTableCell * cell, struct SpanningRowsHeight& spanningRowsHeight)
447 {
448 ASSERT(spanningRowsHeight.rowHeight.size());
449
450 int accumulatedPositionIncrease = 0;
451 const unsigned rowSpan = cell->rowSpan();
452 const unsigned rowIndex = cell->rowIndex();
453
454 ASSERT(rowSpan == spanningRowsHeight.rowHeight.size());
Julien - ping for review 2013/09/17 16:51:26 Nice!
455
456 for (unsigned row = 0; row < spanningRowsHeight.rowHeight.size(); row++) {
457 unsigned actualRow = row + rowIndex;
458 if (!spanningRowsHeight.rowHeight[row] && rowHasOnlySpanningCells(actual Row)) {
459 spanningRowsHeight.rowHeight[row] = calcRowHeightHavingOnlySpanningC ells(actualRow);
460 accumulatedPositionIncrease += spanningRowsHeight.rowHeight[row];
461 }
462 m_rowPos[actualRow + 1] += accumulatedPositionIncrease;
463 }
464
465 spanningRowsHeight.totalRowsHeight += accumulatedPositionIncrease;
466 }
467
398 // Distribute rowSpan cell height in rows those comes in rowSpan cell based on t he ratio of row's height if 468 // Distribute rowSpan cell height in rows those comes in rowSpan cell based on t he ratio of row's height if
399 // 1. RowSpan cell height is greater then the total height of rows in rowSpan ce ll 469 // 1. RowSpan cell height is greater then the total height of rows in rowSpan ce ll
400 void RenderTableSection::distributeRowSpanHeightToRows(SpanningRenderTableCells& rowSpanCells) 470 void RenderTableSection::distributeRowSpanHeightToRows(SpanningRenderTableCells& rowSpanCells)
401 { 471 {
402 ASSERT(rowSpanCells.size()); 472 ASSERT(rowSpanCells.size());
403 473
404 // 'rowSpanCells' list is already sorted based on the cells rowIndex in asce nding order 474 // 'rowSpanCells' list is already sorted based on the cells rowIndex in asce nding order
405 // Arrange row spanning cell in the order in which we need to process first. 475 // Arrange row spanning cell in the order in which we need to process first.
406 std::sort(rowSpanCells.begin(), rowSpanCells.end(), compareRowSpanCellsInHei ghtDistributionOrder); 476 std::sort(rowSpanCells.begin(), rowSpanCells.end(), compareRowSpanCellsInHei ghtDistributionOrder);
407 477
(...skipping 29 matching lines...) Expand all
437 m_rowPos[row] += extraHeightToPropagate; 507 m_rowPos[row] += extraHeightToPropagate;
438 } 508 }
439 509
440 lastRowIndex = rowIndex; 510 lastRowIndex = rowIndex;
441 lastRowSpan = rowSpan; 511 lastRowSpan = rowSpan;
442 512
443 struct SpanningRowsHeight spanningRowsHeight; 513 struct SpanningRowsHeight spanningRowsHeight;
444 514
445 populateSpanningRowsHeightFromCell(cell, spanningRowsHeight); 515 populateSpanningRowsHeightFromCell(cell, spanningRowsHeight);
446 516
447 if (!spanningRowsHeight.totalRowsHeight || spanningRowsHeight.spanningCe llHeightIgnoringBorderSpacing <= spanningRowsHeight.totalRowsHeight) 517 if (spanningRowsHeight.rowWithOnlySpanningCells)
518 updateRowsHeightHavingOnlySpanningCells(cell, spanningRowsHeight);
519
520 if (!spanningRowsHeight.totalRowsHeight || spanningRowsHeight.spanningCe llHeightIgnoringBorderSpacing <= spanningRowsHeight.totalRowsHeight) {
521 extraHeightToPropagate = m_rowPos[rowIndex + rowSpan] - originalBefo rePosition;
448 continue; 522 continue;
523 }
449 524
450 int totalPercent = 0; 525 int totalPercent = 0;
451 int totalAutoRowsHeight = 0; 526 int totalAutoRowsHeight = 0;
452 int totalRemainingRowsHeight = spanningRowsHeight.totalRowsHeight; 527 int totalRemainingRowsHeight = spanningRowsHeight.totalRowsHeight;
453 528
454 // FIXME: Inner spanning cell height should not change if it have fixed height when it's parent spanning cell 529 // FIXME: Inner spanning cell height should not change if it have fixed height when it's parent spanning cell
455 // is distributing it's extra height in rows. 530 // is distributing it's extra height in rows.
456 531
457 // Calculate total percentage, total auto rows height and total rows hei ght except percent rows. 532 // Calculate total percentage, total auto rows height and total rows hei ght except percent rows.
458 for (unsigned row = rowIndex; row < spanningCellEndIndex; row++) { 533 for (unsigned row = rowIndex; row < spanningCellEndIndex; row++) {
(...skipping 1238 matching lines...) Expand 10 before | Expand all | Expand 10 after
1697 if (!style()->isLeftToRightDirection()) 1772 if (!style()->isLeftToRightDirection())
1698 cellLocation.setX(table()->columnPositions()[table()->numEffCols()] - ta ble()->columnPositions()[table()->colToEffCol(cell->col() + cell->colSpan())] + horizontalBorderSpacing); 1773 cellLocation.setX(table()->columnPositions()[table()->numEffCols()] - ta ble()->columnPositions()[table()->colToEffCol(cell->col() + cell->colSpan())] + horizontalBorderSpacing);
1699 else 1774 else
1700 cellLocation.setX(table()->columnPositions()[effectiveColumn] + horizont alBorderSpacing); 1775 cellLocation.setX(table()->columnPositions()[effectiveColumn] + horizont alBorderSpacing);
1701 1776
1702 cell->setLogicalLocation(cellLocation); 1777 cell->setLogicalLocation(cellLocation);
1703 view()->addLayoutDelta(oldCellLocation - cell->location()); 1778 view()->addLayoutDelta(oldCellLocation - cell->location());
1704 } 1779 }
1705 1780
1706 } // namespace WebCore 1781 } // namespace WebCore
OLDNEW
« LayoutTests/fast/table/007-expected.txt ('K') | « Source/core/rendering/RenderTableSection.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698