Index: Source/core/rendering/RenderTableSection.cpp |
diff --git a/Source/core/rendering/RenderTableSection.cpp b/Source/core/rendering/RenderTableSection.cpp |
index ac082fecea58f7162f19913635a2b88298001543..765b35e238ac819d6edba8188fcf0df6bf4c88cc 100644 |
--- a/Source/core/rendering/RenderTableSection.cpp |
+++ b/Source/core/rendering/RenderTableSection.cpp |
@@ -375,51 +375,68 @@ 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 extraHeightToPropagate = 0; |
+ 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); |
- |
- if (!spanningRowsHeight.totalRowsHeight || spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing <= spanningRowsHeight.totalRowsHeight) |
- return; |
+ // 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; |
- unsigned rowIndex = cell->rowIndex(); |
- int totalPercent = 0; |
- int totalAutoRowsHeight = 0; |
- int totalRemainingRowsHeight = spanningRowsHeight.totalRowsHeight; |
+ unsigned rowSpan = cell->rowSpan(); |
+ int originalBeforePosition = m_rowPos[rowIndex + rowSpan]; |
- // 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 (extraHeightToPropagate) { |
+ for (unsigned row = lastRowIndex + lastRowSpan + 1; row <= rowIndex + rowSpan; row++) |
+ m_rowPos[row] += extraHeightToPropagate; |
} |
- } |
- int initialPos = m_rowPos[rowIndex + rowSpan]; |
- int extraRowSpanningHeight = spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing - spanningRowsHeight.totalRowsHeight; |
+ lastRowIndex = rowIndex; |
+ lastRowSpan = rowSpan; |
+ |
+ struct SpanningRowsHeight spanningRowsHeight; |
+ |
+ populateSpanningRowsHeightFromCell(cell, spanningRowsHeight); |
- distributeExtraRowSpanHeightToPercentRows(cell, totalPercent, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
- distributeExtraRowSpanHeightToAutoRows(cell, totalAutoRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
- distributeExtraRowSpanHeightToRemainingRows(cell, totalRemainingRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
+ if (!spanningRowsHeight.totalRowsHeight || spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing <= spanningRowsHeight.totalRowsHeight) |
+ continue; |
+ |
+ 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]; |
+ } |
+ } |
- ASSERT(!extraRowSpanningHeight); |
+ int extraRowSpanningHeight = spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing - spanningRowsHeight.totalRowsHeight; |
- // Getting total changed height in the table |
- unsigned changedHeight = m_rowPos[rowIndex + rowSpan] - initialPos; |
+ distributeExtraRowSpanHeightToPercentRows(cell, totalPercent, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
+ distributeExtraRowSpanHeightToAutoRows(cell, totalAutoRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
+ distributeExtraRowSpanHeightToRemainingRows(cell, totalRemainingRowsHeight, extraRowSpanningHeight, spanningRowsHeight.rowHeight); |
- if (changedHeight) { |
- unsigned totalRows = m_grid.size(); |
+ ASSERT(!extraRowSpanningHeight); |
+ |
+ // Getting total changed height in the table |
+ extraHeightToPropagate = m_rowPos[rowIndex + rowSpan] - originalBeforePosition; |
+ } |
+ if (extraHeightToPropagate) { |
// Apply changed height by rowSpan cells to rows present at the end of the table |
- for (unsigned row = rowIndex + rowSpan + 1; row <= totalRows; row++) |
- m_rowPos[row] += changedHeight; |
+ for (unsigned row = lastRowIndex + lastRowSpan + 1; row <= m_grid.size(); row++) |
+ m_rowPos[row] += extraHeightToPropagate; |
} |
} |