diff --git a/mozilla/layout/html/table/src/nsTableFrame.cpp b/mozilla/layout/html/table/src/nsTableFrame.cpp index 32a4ee9b471..b361052abb0 100644 --- a/mozilla/layout/html/table/src/nsTableFrame.cpp +++ b/mozilla/layout/html/table/src/nsTableFrame.cpp @@ -5679,7 +5679,8 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) BCCellBorder lastTopBorder, lastBottomBorder; // horizontal borders indexed in x-direction (cols) BCCellBorders lastBottomBorders(damageArea.width + 1, damageArea.x); if (!lastBottomBorders.borders) ABORT0(); - PRBool startSeg, gotRowBorder; + PRBool startSeg; + PRBool gotRowBorder = PR_FALSE; BCMapCellInfo info, ajaInfo; BCBorderOwner owner, ajaOwner; @@ -5757,31 +5758,35 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) propData->mTopBorderWidth = LimitBorderWidth(PR_MAX(propData->mTopBorderWidth, (PRUint8)ownerWidth)); //calculate column continuous borders //we only need to do this once, so we'll do it only on the first row - CalcDominantBorder(this, cgFrame, colFrame, info.rg, info.topRow, - nsnull, PR_TRUE, NS_SIDE_TOP, PR_FALSE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - ((nsTableColFrame*)colFrame)->SetContinuousBCBorderWidth(NS_SIDE_TOP, - ownerWidth); - if (numCols == cellEndColIndex + 1) { - CalcDominantBorder(this, cgFrame, colFrame, nsnull, nsnull, - nsnull, PR_TRUE, NS_SIDE_RIGHT, PR_FALSE, t2p, + if (colFrame) { + CalcDominantBorder(this, cgFrame, colFrame, info.rg, info.topRow, + nsnull, PR_TRUE, NS_SIDE_TOP, PR_FALSE, t2p, owner, ownerBStyle, ownerWidth, ownerColor); + ((nsTableColFrame*)colFrame)->SetContinuousBCBorderWidth(NS_SIDE_TOP, + ownerWidth); + if (numCols == cellEndColIndex + 1) { + CalcDominantBorder(this, cgFrame, colFrame, nsnull, nsnull, + nsnull, PR_TRUE, NS_SIDE_RIGHT, PR_FALSE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + } + else { + CalcDominantBorder(nsnull, cgFrame, colFrame, nsnull, nsnull, + nsnull, PR_FALSE, NS_SIDE_RIGHT, PR_FALSE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + } + ((nsTableColFrame*)colFrame)->SetContinuousBCBorderWidth(NS_SIDE_RIGHT, + ownerWidth); } - else { - CalcDominantBorder(nsnull, cgFrame, colFrame, nsnull, nsnull, - nsnull, PR_FALSE, NS_SIDE_RIGHT, PR_FALSE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - } - ((nsTableColFrame*)colFrame)->SetContinuousBCBorderWidth(NS_SIDE_RIGHT, - ownerWidth); } //calculate continuous top first row & rowgroup border: special case //because it must include the table in the collapse - CalcDominantBorder(this, nsnull, nsnull, info.rg, info.topRow, - nsnull, PR_TRUE, NS_SIDE_TOP, PR_FALSE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - info.topRow->SetContinuousBCBorderWidth(NS_SIDE_TOP, ownerWidth); - if (info.cgRight) { + if (info.topRow) { + CalcDominantBorder(this, nsnull, nsnull, info.rg, info.topRow, + nsnull, PR_TRUE, NS_SIDE_TOP, PR_FALSE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + info.topRow->SetContinuousBCBorderWidth(NS_SIDE_TOP, ownerWidth); + } + if (info.cgRight && info.cg) { //calculate continuous top colgroup border once per colgroup CalcDominantBorder(this, info.cg, nsnull, info.rg, info.topRow, nsnull, PR_TRUE, NS_SIDE_TOP, PR_FALSE, t2p, @@ -5842,12 +5847,14 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) } propData->mLeftBorderWidth = LimitBorderWidth(PR_MAX(propData->mLeftBorderWidth, ownerWidth)); //get row continuous borders - CalcDominantBorder(this, info.cg, info.leftCol, info.rg, rowFrame, nsnull, PR_TRUE, NS_SIDE_LEFT, - PR_FALSE, t2p, owner, ownerBStyle, ownerWidth, ownerColor); - rowFrame->SetContinuousBCBorderWidth(NS_SIDE_LEFT, ownerWidth); + if (rowFrame) { + CalcDominantBorder(this, info.cg, info.leftCol, info.rg, rowFrame, nsnull, PR_TRUE, NS_SIDE_LEFT, + PR_FALSE, t2p, owner, ownerBStyle, ownerWidth, ownerColor); + rowFrame->SetContinuousBCBorderWidth(NS_SIDE_LEFT, ownerWidth); + } } //get row group continuous borders - if (info.rgBottom) { //once per row group, so check for bottom + if (info.rgBottom && info.rg) { //once per row group, so check for bottom CalcDominantBorder(this, info.cg, info.leftCol, info.rg, nsnull, nsnull, PR_TRUE, NS_SIDE_LEFT, PR_FALSE, t2p, owner, ownerBStyle, ownerWidth, ownerColor); @@ -5890,13 +5897,15 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) } propData->mRightBorderWidth = LimitBorderWidth(PR_MAX(propData->mRightBorderWidth, ownerWidth)); //get row continuous borders - CalcDominantBorder(this, info.cg, info.rightCol, info.rg, rowFrame, - nsnull, PR_TRUE, NS_SIDE_RIGHT, PR_TRUE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - rowFrame->SetContinuousBCBorderWidth(NS_SIDE_RIGHT, ownerWidth); + if (rowFrame) { + CalcDominantBorder(this, info.cg, info.rightCol, info.rg, rowFrame, + nsnull, PR_TRUE, NS_SIDE_RIGHT, PR_TRUE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + rowFrame->SetContinuousBCBorderWidth(NS_SIDE_RIGHT, ownerWidth); + } } //get row group continuous borders - if (info.rgBottom) { //once per rg, so check for bottom + if (info.rgBottom && info.rg) { //once per rg, so check for bottom CalcDominantBorder(this, info.cg, info.rightCol, info.rg, nsnull, nsnull, PR_TRUE, NS_SIDE_RIGHT, PR_TRUE, t2p, owner, ownerBStyle, ownerWidth, ownerColor); @@ -6028,21 +6037,27 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) lastBottomBorder.span = info.rowSpan; lastBottomBorders[colX] = lastBottomBorder; //get col continuous border - CalcDominantBorder(this, cgFrame, colFrame, info.rg, info.bottomRow, - nsnull, PR_TRUE, NS_SIDE_BOTTOM, PR_TRUE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - ((nsTableColFrame*)colFrame)->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, - ownerWidth); + if (colFrame) { + CalcDominantBorder(this, cgFrame, colFrame, info.rg, info.bottomRow, + nsnull, PR_TRUE, NS_SIDE_BOTTOM, PR_TRUE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + ((nsTableColFrame*)colFrame)->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, + ownerWidth); + } } //get row group/col group continuous border - CalcDominantBorder(this, nsnull, nsnull, info.rg, info.bottomRow, - nsnull, PR_TRUE, NS_SIDE_BOTTOM, PR_TRUE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - info.rg->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, ownerWidth); - CalcDominantBorder(this, info.cg, nsnull, info.rg, info.bottomRow, - nsnull, PR_TRUE, NS_SIDE_BOTTOM, PR_TRUE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - info.cg->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, ownerWidth); + if (info.rg) { + CalcDominantBorder(this, nsnull, nsnull, info.rg, info.bottomRow, + nsnull, PR_TRUE, NS_SIDE_BOTTOM, PR_TRUE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + info.rg->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, ownerWidth); + } + if (info.cg) { + CalcDominantBorder(this, info.cg, nsnull, info.rg, info.bottomRow, + nsnull, PR_TRUE, NS_SIDE_BOTTOM, PR_TRUE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + info.cg->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, ownerWidth); + } } else { PRInt32 segLength = 0; @@ -6127,7 +6142,7 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) BCCornerInfo& brCorner = bottomCorners[colX + segLength]; brCorner.Update(NS_SIDE_LEFT, owner, ownerBStyle, ownerWidth, ownerColor); } - if (!gotRowBorder && 1 == info.rowSpan) { + if (!gotRowBorder && 1 == info.rowSpan && (ajaInfo.topRow || info.rgBottom)) { //get continuous row/row group border //we need to check the row group's bottom border if this is //the last row in the row group, but only a cell with rowspan=1 @@ -6144,8 +6159,10 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) ownerColor, ajaOwner, ajaBStyle, ajaWidth, ajaColor, owner, ownerBStyle, ownerWidth, ownerColor, PR_TRUE); - ajaInfo.topRow->SetContinuousBCBorderWidth(NS_SIDE_TOP, ownerWidth); - if (info.rgBottom) { + if (ajaInfo.topRow) { + ajaInfo.topRow->SetContinuousBCBorderWidth(NS_SIDE_TOP, ownerWidth); + } + if (info.rgBottom && info.rg) { info.rg->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, ownerWidth); } gotRowBorder = PR_TRUE; diff --git a/mozilla/layout/tables/nsTableFrame.cpp b/mozilla/layout/tables/nsTableFrame.cpp index 32a4ee9b471..b361052abb0 100644 --- a/mozilla/layout/tables/nsTableFrame.cpp +++ b/mozilla/layout/tables/nsTableFrame.cpp @@ -5679,7 +5679,8 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) BCCellBorder lastTopBorder, lastBottomBorder; // horizontal borders indexed in x-direction (cols) BCCellBorders lastBottomBorders(damageArea.width + 1, damageArea.x); if (!lastBottomBorders.borders) ABORT0(); - PRBool startSeg, gotRowBorder; + PRBool startSeg; + PRBool gotRowBorder = PR_FALSE; BCMapCellInfo info, ajaInfo; BCBorderOwner owner, ajaOwner; @@ -5757,31 +5758,35 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) propData->mTopBorderWidth = LimitBorderWidth(PR_MAX(propData->mTopBorderWidth, (PRUint8)ownerWidth)); //calculate column continuous borders //we only need to do this once, so we'll do it only on the first row - CalcDominantBorder(this, cgFrame, colFrame, info.rg, info.topRow, - nsnull, PR_TRUE, NS_SIDE_TOP, PR_FALSE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - ((nsTableColFrame*)colFrame)->SetContinuousBCBorderWidth(NS_SIDE_TOP, - ownerWidth); - if (numCols == cellEndColIndex + 1) { - CalcDominantBorder(this, cgFrame, colFrame, nsnull, nsnull, - nsnull, PR_TRUE, NS_SIDE_RIGHT, PR_FALSE, t2p, + if (colFrame) { + CalcDominantBorder(this, cgFrame, colFrame, info.rg, info.topRow, + nsnull, PR_TRUE, NS_SIDE_TOP, PR_FALSE, t2p, owner, ownerBStyle, ownerWidth, ownerColor); + ((nsTableColFrame*)colFrame)->SetContinuousBCBorderWidth(NS_SIDE_TOP, + ownerWidth); + if (numCols == cellEndColIndex + 1) { + CalcDominantBorder(this, cgFrame, colFrame, nsnull, nsnull, + nsnull, PR_TRUE, NS_SIDE_RIGHT, PR_FALSE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + } + else { + CalcDominantBorder(nsnull, cgFrame, colFrame, nsnull, nsnull, + nsnull, PR_FALSE, NS_SIDE_RIGHT, PR_FALSE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + } + ((nsTableColFrame*)colFrame)->SetContinuousBCBorderWidth(NS_SIDE_RIGHT, + ownerWidth); } - else { - CalcDominantBorder(nsnull, cgFrame, colFrame, nsnull, nsnull, - nsnull, PR_FALSE, NS_SIDE_RIGHT, PR_FALSE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - } - ((nsTableColFrame*)colFrame)->SetContinuousBCBorderWidth(NS_SIDE_RIGHT, - ownerWidth); } //calculate continuous top first row & rowgroup border: special case //because it must include the table in the collapse - CalcDominantBorder(this, nsnull, nsnull, info.rg, info.topRow, - nsnull, PR_TRUE, NS_SIDE_TOP, PR_FALSE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - info.topRow->SetContinuousBCBorderWidth(NS_SIDE_TOP, ownerWidth); - if (info.cgRight) { + if (info.topRow) { + CalcDominantBorder(this, nsnull, nsnull, info.rg, info.topRow, + nsnull, PR_TRUE, NS_SIDE_TOP, PR_FALSE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + info.topRow->SetContinuousBCBorderWidth(NS_SIDE_TOP, ownerWidth); + } + if (info.cgRight && info.cg) { //calculate continuous top colgroup border once per colgroup CalcDominantBorder(this, info.cg, nsnull, info.rg, info.topRow, nsnull, PR_TRUE, NS_SIDE_TOP, PR_FALSE, t2p, @@ -5842,12 +5847,14 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) } propData->mLeftBorderWidth = LimitBorderWidth(PR_MAX(propData->mLeftBorderWidth, ownerWidth)); //get row continuous borders - CalcDominantBorder(this, info.cg, info.leftCol, info.rg, rowFrame, nsnull, PR_TRUE, NS_SIDE_LEFT, - PR_FALSE, t2p, owner, ownerBStyle, ownerWidth, ownerColor); - rowFrame->SetContinuousBCBorderWidth(NS_SIDE_LEFT, ownerWidth); + if (rowFrame) { + CalcDominantBorder(this, info.cg, info.leftCol, info.rg, rowFrame, nsnull, PR_TRUE, NS_SIDE_LEFT, + PR_FALSE, t2p, owner, ownerBStyle, ownerWidth, ownerColor); + rowFrame->SetContinuousBCBorderWidth(NS_SIDE_LEFT, ownerWidth); + } } //get row group continuous borders - if (info.rgBottom) { //once per row group, so check for bottom + if (info.rgBottom && info.rg) { //once per row group, so check for bottom CalcDominantBorder(this, info.cg, info.leftCol, info.rg, nsnull, nsnull, PR_TRUE, NS_SIDE_LEFT, PR_FALSE, t2p, owner, ownerBStyle, ownerWidth, ownerColor); @@ -5890,13 +5897,15 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) } propData->mRightBorderWidth = LimitBorderWidth(PR_MAX(propData->mRightBorderWidth, ownerWidth)); //get row continuous borders - CalcDominantBorder(this, info.cg, info.rightCol, info.rg, rowFrame, - nsnull, PR_TRUE, NS_SIDE_RIGHT, PR_TRUE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - rowFrame->SetContinuousBCBorderWidth(NS_SIDE_RIGHT, ownerWidth); + if (rowFrame) { + CalcDominantBorder(this, info.cg, info.rightCol, info.rg, rowFrame, + nsnull, PR_TRUE, NS_SIDE_RIGHT, PR_TRUE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + rowFrame->SetContinuousBCBorderWidth(NS_SIDE_RIGHT, ownerWidth); + } } //get row group continuous borders - if (info.rgBottom) { //once per rg, so check for bottom + if (info.rgBottom && info.rg) { //once per rg, so check for bottom CalcDominantBorder(this, info.cg, info.rightCol, info.rg, nsnull, nsnull, PR_TRUE, NS_SIDE_RIGHT, PR_TRUE, t2p, owner, ownerBStyle, ownerWidth, ownerColor); @@ -6028,21 +6037,27 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) lastBottomBorder.span = info.rowSpan; lastBottomBorders[colX] = lastBottomBorder; //get col continuous border - CalcDominantBorder(this, cgFrame, colFrame, info.rg, info.bottomRow, - nsnull, PR_TRUE, NS_SIDE_BOTTOM, PR_TRUE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - ((nsTableColFrame*)colFrame)->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, - ownerWidth); + if (colFrame) { + CalcDominantBorder(this, cgFrame, colFrame, info.rg, info.bottomRow, + nsnull, PR_TRUE, NS_SIDE_BOTTOM, PR_TRUE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + ((nsTableColFrame*)colFrame)->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, + ownerWidth); + } } //get row group/col group continuous border - CalcDominantBorder(this, nsnull, nsnull, info.rg, info.bottomRow, - nsnull, PR_TRUE, NS_SIDE_BOTTOM, PR_TRUE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - info.rg->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, ownerWidth); - CalcDominantBorder(this, info.cg, nsnull, info.rg, info.bottomRow, - nsnull, PR_TRUE, NS_SIDE_BOTTOM, PR_TRUE, t2p, - owner, ownerBStyle, ownerWidth, ownerColor); - info.cg->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, ownerWidth); + if (info.rg) { + CalcDominantBorder(this, nsnull, nsnull, info.rg, info.bottomRow, + nsnull, PR_TRUE, NS_SIDE_BOTTOM, PR_TRUE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + info.rg->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, ownerWidth); + } + if (info.cg) { + CalcDominantBorder(this, info.cg, nsnull, info.rg, info.bottomRow, + nsnull, PR_TRUE, NS_SIDE_BOTTOM, PR_TRUE, t2p, + owner, ownerBStyle, ownerWidth, ownerColor); + info.cg->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, ownerWidth); + } } else { PRInt32 segLength = 0; @@ -6127,7 +6142,7 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) BCCornerInfo& brCorner = bottomCorners[colX + segLength]; brCorner.Update(NS_SIDE_LEFT, owner, ownerBStyle, ownerWidth, ownerColor); } - if (!gotRowBorder && 1 == info.rowSpan) { + if (!gotRowBorder && 1 == info.rowSpan && (ajaInfo.topRow || info.rgBottom)) { //get continuous row/row group border //we need to check the row group's bottom border if this is //the last row in the row group, but only a cell with rowspan=1 @@ -6144,8 +6159,10 @@ nsTableFrame::CalcBCBorders(nsIPresContext& aPresContext) ownerColor, ajaOwner, ajaBStyle, ajaWidth, ajaColor, owner, ownerBStyle, ownerWidth, ownerColor, PR_TRUE); - ajaInfo.topRow->SetContinuousBCBorderWidth(NS_SIDE_TOP, ownerWidth); - if (info.rgBottom) { + if (ajaInfo.topRow) { + ajaInfo.topRow->SetContinuousBCBorderWidth(NS_SIDE_TOP, ownerWidth); + } + if (info.rgBottom && info.rg) { info.rg->SetContinuousBCBorderWidth(NS_SIDE_BOTTOM, ownerWidth); } gotRowBorder = PR_TRUE;