diff --git a/layout/html/table/src/nsTableFrame.cpp b/layout/html/table/src/nsTableFrame.cpp
index 0fd618be141d..18eb03b82993 100644
--- a/layout/html/table/src/nsTableFrame.cpp
+++ b/layout/html/table/src/nsTableFrame.cpp
@@ -5110,7 +5110,7 @@ BCMapCellIterator::PeekBottom(BCMapCellInfo& aRefInfo,
}
if (cellData->IsColSpan()) {
aColIndex -= cellData->GetColSpanOffset();
- cellData = cellMap->GetDataAt(*mTableCellMap, rowIndex, aColIndex, PR_FALSE);
+ cellData = cellMap->GetDataAt(*mTableCellMap, rgRowIndex, aColIndex, PR_FALSE);
}
SetInfo(nextRow, aColIndex, cellData, aAjaInfo, cellMap);
}
@@ -5805,8 +5805,7 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext)
cellEndRowIndex = info.rowIndex + info.rowSpan - 1;
cellEndColIndex = info.colIndex + info.colSpan - 1;
- PRBool isBottomRight = (info.rowIndex == (numRows - 1)) && (info.colIndex == (numCols - 1));
-
+
PRBool bottomRowSpan = PR_FALSE;
// see if lastTopBorder, lastBottomBorder need to be reset
if (iter.IsNewRow()) {
@@ -5814,12 +5813,12 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext)
lastBottomBorder.Reset(cellEndRowIndex + 1, info.rowSpan);
}
else if (info.colIndex > damageArea.x) {
- BCCellBorder& prevBorder = lastBottomBorders[info.colIndex - 1];
- if (info.rowIndex > prevBorder.index - prevBorder.span) {
+ lastBottomBorder = lastBottomBorders[info.colIndex - 1];
+ if (info.rowIndex > lastBottomBorder.index - lastBottomBorder.span) {
// the top border's left edge butts against the middle of a rowspan
lastTopBorder.Reset(info.rowIndex, info.rowSpan);
}
- if (prevBorder.index > (cellEndRowIndex + 1)) {
+ if (lastBottomBorder.index > (cellEndRowIndex + 1)) {
// the bottom border's left edge butts against the middle of a rowspan
lastBottomBorder.Reset(cellEndRowIndex + 1, info.rowSpan);
bottomRowSpan = PR_TRUE;
@@ -6050,10 +6049,16 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext)
brCorner.Update(NS_SIDE_LEFT, owner, ownerBStyle, ownerWidth, ownerColor);
if (numCols == colX + 1) { // lower right corner of the table
tableCellMap->SetBCBorderCorner(eBottomRight, *info.cellMap, iter.mRowGroupStart, cellEndRowIndex,
- colX, brCorner.ownerSide, brCorner.subWidth, brCorner.bevel, isBottomRight);
+ colX, brCorner.ownerSide, brCorner.subWidth, brCorner.bevel, PR_TRUE);
}
// update lastBottomBorder and see if a new segment starts
startSeg = SetHorBorder(ownerBStyle, ownerWidth, ownerColor, blCorner, lastBottomBorder);
+ if (!startSeg) {
+ // make sure that we did not compare apples to oranges i.e. the current border
+ // should be a continuation of the lastBottomBorder, as it is a bottom border
+ // add 1 to the cellEndRowIndex
+ startSeg = (lastBottomBorder.index != cellEndRowIndex + 1);
+ }
// store the border segment in the cell map and update cellBorders
tableCellMap->SetBCBorderEdge(NS_SIDE_BOTTOM, *info.cellMap, iter.mRowGroupStart, cellEndRowIndex,
colX, 1, owner, ownerWidth, startSeg);
@@ -6096,7 +6101,7 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext)
if (prevRowIndex > cellEndRowIndex + 1) { // hits a rowspan on the right
update = PR_FALSE; // the corner was taken care of during the cell on the left
}
- else if (prevRowIndex < cellEndRowIndex) { // spans below the cell to the left
+ else if (prevRowIndex < cellEndRowIndex + 1) { // spans below the cell to the left
topCorners[colX] = blCorner;
blCorner.Set(NS_SIDE_RIGHT, owner, ownerBStyle, ownerWidth, ownerColor);
update = PR_FALSE;
@@ -6120,6 +6125,12 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext)
}
// update lastBottomBorders and see if a new segment starts
startSeg = SetHorBorder(ownerBStyle, ownerWidth, ownerColor, blCorner, lastBottomBorder);
+ if (!startSeg) {
+ // make sure that we did not compare apples to oranges i.e. the current border
+ // should be a continuation of the lastBottomBorder, as it is a bottom border
+ // add 1 to the cellEndRowIndex
+ startSeg = (lastBottomBorder.index != cellEndRowIndex + 1);
+ }
lastBottomBorder.index = cellEndRowIndex + 1;
lastBottomBorder.span = info.rowSpan;
for (PRInt32 cX = colX; cX < colX + segLength; cX++) {
diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp
index 0fd618be141d..18eb03b82993 100644
--- a/layout/tables/nsTableFrame.cpp
+++ b/layout/tables/nsTableFrame.cpp
@@ -5110,7 +5110,7 @@ BCMapCellIterator::PeekBottom(BCMapCellInfo& aRefInfo,
}
if (cellData->IsColSpan()) {
aColIndex -= cellData->GetColSpanOffset();
- cellData = cellMap->GetDataAt(*mTableCellMap, rowIndex, aColIndex, PR_FALSE);
+ cellData = cellMap->GetDataAt(*mTableCellMap, rgRowIndex, aColIndex, PR_FALSE);
}
SetInfo(nextRow, aColIndex, cellData, aAjaInfo, cellMap);
}
@@ -5805,8 +5805,7 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext)
cellEndRowIndex = info.rowIndex + info.rowSpan - 1;
cellEndColIndex = info.colIndex + info.colSpan - 1;
- PRBool isBottomRight = (info.rowIndex == (numRows - 1)) && (info.colIndex == (numCols - 1));
-
+
PRBool bottomRowSpan = PR_FALSE;
// see if lastTopBorder, lastBottomBorder need to be reset
if (iter.IsNewRow()) {
@@ -5814,12 +5813,12 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext)
lastBottomBorder.Reset(cellEndRowIndex + 1, info.rowSpan);
}
else if (info.colIndex > damageArea.x) {
- BCCellBorder& prevBorder = lastBottomBorders[info.colIndex - 1];
- if (info.rowIndex > prevBorder.index - prevBorder.span) {
+ lastBottomBorder = lastBottomBorders[info.colIndex - 1];
+ if (info.rowIndex > lastBottomBorder.index - lastBottomBorder.span) {
// the top border's left edge butts against the middle of a rowspan
lastTopBorder.Reset(info.rowIndex, info.rowSpan);
}
- if (prevBorder.index > (cellEndRowIndex + 1)) {
+ if (lastBottomBorder.index > (cellEndRowIndex + 1)) {
// the bottom border's left edge butts against the middle of a rowspan
lastBottomBorder.Reset(cellEndRowIndex + 1, info.rowSpan);
bottomRowSpan = PR_TRUE;
@@ -6050,10 +6049,16 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext)
brCorner.Update(NS_SIDE_LEFT, owner, ownerBStyle, ownerWidth, ownerColor);
if (numCols == colX + 1) { // lower right corner of the table
tableCellMap->SetBCBorderCorner(eBottomRight, *info.cellMap, iter.mRowGroupStart, cellEndRowIndex,
- colX, brCorner.ownerSide, brCorner.subWidth, brCorner.bevel, isBottomRight);
+ colX, brCorner.ownerSide, brCorner.subWidth, brCorner.bevel, PR_TRUE);
}
// update lastBottomBorder and see if a new segment starts
startSeg = SetHorBorder(ownerBStyle, ownerWidth, ownerColor, blCorner, lastBottomBorder);
+ if (!startSeg) {
+ // make sure that we did not compare apples to oranges i.e. the current border
+ // should be a continuation of the lastBottomBorder, as it is a bottom border
+ // add 1 to the cellEndRowIndex
+ startSeg = (lastBottomBorder.index != cellEndRowIndex + 1);
+ }
// store the border segment in the cell map and update cellBorders
tableCellMap->SetBCBorderEdge(NS_SIDE_BOTTOM, *info.cellMap, iter.mRowGroupStart, cellEndRowIndex,
colX, 1, owner, ownerWidth, startSeg);
@@ -6096,7 +6101,7 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext)
if (prevRowIndex > cellEndRowIndex + 1) { // hits a rowspan on the right
update = PR_FALSE; // the corner was taken care of during the cell on the left
}
- else if (prevRowIndex < cellEndRowIndex) { // spans below the cell to the left
+ else if (prevRowIndex < cellEndRowIndex + 1) { // spans below the cell to the left
topCorners[colX] = blCorner;
blCorner.Set(NS_SIDE_RIGHT, owner, ownerBStyle, ownerWidth, ownerColor);
update = PR_FALSE;
@@ -6120,6 +6125,12 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext)
}
// update lastBottomBorders and see if a new segment starts
startSeg = SetHorBorder(ownerBStyle, ownerWidth, ownerColor, blCorner, lastBottomBorder);
+ if (!startSeg) {
+ // make sure that we did not compare apples to oranges i.e. the current border
+ // should be a continuation of the lastBottomBorder, as it is a bottom border
+ // add 1 to the cellEndRowIndex
+ startSeg = (lastBottomBorder.index != cellEndRowIndex + 1);
+ }
lastBottomBorder.index = cellEndRowIndex + 1;
lastBottomBorder.span = info.rowSpan;
for (PRInt32 cX = colX; cX < colX + segLength; cX++) {