Chromium Code Reviews| Index: Source/core/rendering/RenderTableSection.cpp | 
| diff --git a/Source/core/rendering/RenderTableSection.cpp b/Source/core/rendering/RenderTableSection.cpp | 
| index d8f632d00e89217501a10365948b4e98496c3d98..54468a596e9291270f29bc57d2f689bb1d3e953f 100644 | 
| --- a/Source/core/rendering/RenderTableSection.cpp | 
| +++ b/Source/core/rendering/RenderTableSection.cpp | 
| @@ -375,50 +375,67 @@ void RenderTableSection::distributeRowSpanHeightToRows(SpanningRenderTableCells& | 
| { | 
| ASSERT(rowSpanCells.size()); | 
| - // FIXME: For now, we handle the first rowspan cell in the table but this is wrong. | 
| - RenderTableCell* cell = rowSpanCells[0]; | 
| + unsigned changedHeight = 0; | 
| 
 
Julien - ping for review
2013/07/23 00:13:43
Trying to find better naming for this one:
- extra
 
a.suchit
2013/07/23 12:19:56
Done.
 
 | 
| + unsigned lastRowIndex = 0; | 
| + unsigned lastRowSpan = 0; | 
| - unsigned rowSpan = cell->rowSpan(); | 
| + for (unsigned i = 0; i < rowSpanCells.size(); i++) { | 
| + RenderTableCell* cell = rowSpanCells[i]; | 
| - struct SpanningRowsHeight spanningRowsHeight; | 
| + unsigned rowIndex = cell->rowIndex(); | 
| - populateSpanningRowsHeightFromCell(cell, spanningRowsHeight); | 
| + // FIXME: For now, we are handling only rowspan cells those are not overlapping with other | 
| + // rowspan cells but this is wrong. | 
| + if (rowIndex < lastRowIndex + lastRowSpan) | 
| + continue; | 
| - if (!spanningRowsHeight.totalRowsHeight || spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing <= spanningRowsHeight.totalRowsHeight) | 
| - return; | 
| + unsigned rowSpan = cell->rowSpan(); | 
| + int initialPos = m_rowPos[rowIndex + rowSpan]; | 
| 
 
Julien - ping for review
2013/07/23 00:13:43
Let's not abbreviate variables: |initialPosition|
 
a.suchit
2013/07/23 12:19:56
Done.
 
 | 
| - unsigned rowIndex = cell->rowIndex(); | 
| - int totalPercent = 0; | 
| - int totalAutoRowsHeight = 0; | 
| - int totalRemainingRowsHeight = spanningRowsHeight.totalRowsHeight; | 
| - | 
| - // Calculate total percentage, total auto rows height and total rows height except percent rows. | 
| - for (unsigned row = rowIndex; row < (rowIndex + rowSpan); row++) { | 
| - if (m_grid[row].logicalHeight.isPercent()) { | 
| - totalPercent += m_grid[row].logicalHeight.percent(); | 
| - totalRemainingRowsHeight -= spanningRowsHeight.rowHeight[row - rowIndex]; | 
| - } else if (m_grid[row].logicalHeight.isAuto()) { | 
| - totalAutoRowsHeight += spanningRowsHeight.rowHeight[row - rowIndex]; | 
| + if (changedHeight) { | 
| + for (unsigned row = lastRowIndex + lastRowSpan + 1; row <= rowIndex + rowSpan; row++) | 
| + m_rowPos[row] += changedHeight; | 
| } | 
| - } | 
| - int initialPos = m_rowPos[rowIndex + rowSpan]; | 
| - int extraRowSpanningHeight = spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing - spanningRowsHeight.totalRowsHeight; | 
| + lastRowIndex = rowIndex; | 
| + lastRowSpan = rowSpan; | 
| - distributeExtraRowSpanHeightToPercentRows(cell, totalPercent, extraRowSpanningHeight, spanningRowsHeight.rowHeight); | 
| - distributeExtraRowSpanHeightToAutoRows(cell, totalAutoRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight); | 
| - distributeExtraRowSpanHeightToRemainingRows(cell, totalRemainingRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight); | 
| + struct SpanningRowsHeight spanningRowsHeight; | 
| - ASSERT(!extraRowSpanningHeight); | 
| + populateSpanningRowsHeightFromCell(cell, spanningRowsHeight); | 
| - // Getting total changed height in the table | 
| - unsigned changedHeight = m_rowPos[rowIndex + rowSpan] - initialPos; | 
| + if (spanningRowsHeight.totalRowsHeight && spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing > spanningRowsHeight.totalRowsHeight) { | 
| - if (changedHeight) { | 
| - unsigned totalRows = m_grid.size(); | 
| + int totalPercent = 0; | 
| + int totalAutoRowsHeight = 0; | 
| + int totalRemainingRowsHeight = spanningRowsHeight.totalRowsHeight; | 
| + // Calculate total percentage, total auto rows height and total rows height except percent rows. | 
| + for (unsigned row = rowIndex; row < (rowIndex + rowSpan); row++) { | 
| + if (m_grid[row].logicalHeight.isPercent()) { | 
| + totalPercent += m_grid[row].logicalHeight.percent(); | 
| + totalRemainingRowsHeight -= spanningRowsHeight.rowHeight[row - rowIndex]; | 
| + } else if (m_grid[row].logicalHeight.isAuto()) { | 
| + totalAutoRowsHeight += spanningRowsHeight.rowHeight[row - rowIndex]; | 
| + } | 
| + } | 
| + | 
| + int extraRowSpanningHeight = spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing - spanningRowsHeight.totalRowsHeight; | 
| + | 
| + distributeExtraRowSpanHeightToPercentRows(cell, totalPercent, extraRowSpanningHeight, spanningRowsHeight.rowHeight); | 
| + distributeExtraRowSpanHeightToAutoRows(cell, totalAutoRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight); | 
| + distributeExtraRowSpanHeightToRemainingRows(cell, totalRemainingRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight); | 
| + | 
| + ASSERT(!extraRowSpanningHeight); | 
| + | 
| + // Getting total changed height in the table | 
| + changedHeight = m_rowPos[rowIndex + rowSpan] - initialPos; | 
| + } | 
| + } | 
| + | 
| + if (changedHeight) { | 
| // Apply changed height by rowSpan cells to rows present at the end of the table | 
| - for (unsigned row = rowIndex + rowSpan + 1; row <= totalRows; row++) | 
| + for (unsigned row = lastRowIndex + lastRowSpan + 1; row <= m_grid.size(); row++) | 
| m_rowPos[row] += changedHeight; | 
| } | 
| } |