diff --git a/layout/html/table/src/BasicTableLayoutStrategy.cpp b/layout/html/table/src/BasicTableLayoutStrategy.cpp
index 0cd30ba96565..9bbc695cd08d 100644
--- a/layout/html/table/src/BasicTableLayoutStrategy.cpp
+++ b/layout/html/table/src/BasicTableLayoutStrategy.cpp
@@ -135,7 +135,7 @@ BasicTableLayoutStrategy::BalanceColumnWidths(nsIStyleContext* aTableSty
const nsHTMLReflowState& aReflowState,
nscoord aMaxWidthIn)
{
- //mTableFrame->Dump(PR_TRUE, PR_TRUE);
+ //mTableFrame->Dump(PR_TRUE, PR_FALSE);
ContinuingFrameCheck();
if (!aTableStyle) {
NS_ASSERTION(aTableStyle, "bad style arg");
@@ -548,18 +548,19 @@ PRBool BasicTableLayoutStrategy::AssignPreliminaryColumnWidths(nscoord aMaxWidth
cellWidths[FIX] = PR_MAX(cellWidths[FIX], cellWidths[MIN_CON]);
}
- // set MIN_ADJ, DES_ADJ
+ // set MIN_ADJ, DES_ADJ, FIX_ADJ
nscoord spanCellSpacing = 0;
for (widthX = 0; widthX < NUM_MAJOR_WIDTHS; widthX++) {
// skip des if there is a fix
if ((DES_CON == widthX) && (cellWidths[FIX] > 0))
- continue;
+ continue; // FIX will take into account DES_CON
nscoord spanTotal = 0;
nscoord divisor = 0;
PRInt32 spanX;
for (spanX = 0; spanX < colSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX + spanX);
- nscoord colWidth = colFrame->GetWidth(widthX);
+ nscoord colWidth = PR_MAX(colFrame->GetWidth(widthX),
+ colFrame->GetWidth(widthX + NUM_MAJOR_WIDTHS));
// need to get a contribution for every cell
colWidth = PR_MAX(colWidth, colFrame->GetMinWidth());
spanTotal += colWidth;
@@ -587,7 +588,8 @@ PRBool BasicTableLayoutStrategy::AssignPreliminaryColumnWidths(nscoord aMaxWidth
if ((cellWidth > 0) && !((widthX == MIN_CON) && (cellWidth <= spanTotal))) {
for (PRInt32 spanX = 0; spanX < colSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX + spanX);
- nscoord colWidth = colFrame->GetWidth(widthX);
+ nscoord colWidth = PR_MAX(colFrame->GetWidth(widthX),
+ colFrame->GetWidth(widthX + NUM_MAJOR_WIDTHS));
nscoord minWidth = colFrame->GetMinWidth();
// accumulate numerator similarly to divisor
colWidth = PR_MAX(colWidth, colFrame->GetMinWidth());
@@ -612,14 +614,16 @@ PRBool BasicTableLayoutStrategy::AssignPreliminaryColumnWidths(nscoord aMaxWidth
newColAdjWidth = PR_MAX(newColAdjWidth, minWidth);
if (FIX != widthX)
colFrame->SetWidth(widthX + NUM_MAJOR_WIDTHS, newColAdjWidth);
- // the following ensures that a spanned cell will reach its full desired width
- // in an auto table, since allocations are done on fixed cols before auto cols
+ // The next two conditions allows BalanceColumnWidths to assume that
+ // fixed allocations are a stopping point.
+ // if new DES_CON exceeds FIX, set FIX_ADJ to DES_CON.
if (DES_CON == widthX) {
nscoord fixWidth = colFrame->GetFixWidth();
if ((fixWidth > 0) && (newColAdjWidth > fixWidth) && (newColAdjWidth > 0)) {
colFrame->SetWidth(FIX_ADJ, newColAdjWidth);
}
}
+ // if new FIX_ADJ exceeds desired, set DES_ADJ to FIX_ADJ.
else if (FIX == widthX) {
nscoord desWidth = colFrame->GetDesWidth();
if ((newColAdjWidth > desWidth) && (newColAdjWidth > 0)) {
@@ -632,6 +636,8 @@ PRBool BasicTableLayoutStrategy::AssignPreliminaryColumnWidths(nscoord aMaxWidth
}
}
}
+ // if DES_ADJ exceeds FIX, pretend that FIX is not set. This allows
+ // BalanceColumnWidths to assume that fixed allocations are a stopping point.
for (colX = 0; colX < mNumCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
nscoord desAdjWidth = colFrame->GetWidth(DES_ADJ);
diff --git a/layout/tables/BasicTableLayoutStrategy.cpp b/layout/tables/BasicTableLayoutStrategy.cpp
index 0cd30ba96565..9bbc695cd08d 100644
--- a/layout/tables/BasicTableLayoutStrategy.cpp
+++ b/layout/tables/BasicTableLayoutStrategy.cpp
@@ -135,7 +135,7 @@ BasicTableLayoutStrategy::BalanceColumnWidths(nsIStyleContext* aTableSty
const nsHTMLReflowState& aReflowState,
nscoord aMaxWidthIn)
{
- //mTableFrame->Dump(PR_TRUE, PR_TRUE);
+ //mTableFrame->Dump(PR_TRUE, PR_FALSE);
ContinuingFrameCheck();
if (!aTableStyle) {
NS_ASSERTION(aTableStyle, "bad style arg");
@@ -548,18 +548,19 @@ PRBool BasicTableLayoutStrategy::AssignPreliminaryColumnWidths(nscoord aMaxWidth
cellWidths[FIX] = PR_MAX(cellWidths[FIX], cellWidths[MIN_CON]);
}
- // set MIN_ADJ, DES_ADJ
+ // set MIN_ADJ, DES_ADJ, FIX_ADJ
nscoord spanCellSpacing = 0;
for (widthX = 0; widthX < NUM_MAJOR_WIDTHS; widthX++) {
// skip des if there is a fix
if ((DES_CON == widthX) && (cellWidths[FIX] > 0))
- continue;
+ continue; // FIX will take into account DES_CON
nscoord spanTotal = 0;
nscoord divisor = 0;
PRInt32 spanX;
for (spanX = 0; spanX < colSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX + spanX);
- nscoord colWidth = colFrame->GetWidth(widthX);
+ nscoord colWidth = PR_MAX(colFrame->GetWidth(widthX),
+ colFrame->GetWidth(widthX + NUM_MAJOR_WIDTHS));
// need to get a contribution for every cell
colWidth = PR_MAX(colWidth, colFrame->GetMinWidth());
spanTotal += colWidth;
@@ -587,7 +588,8 @@ PRBool BasicTableLayoutStrategy::AssignPreliminaryColumnWidths(nscoord aMaxWidth
if ((cellWidth > 0) && !((widthX == MIN_CON) && (cellWidth <= spanTotal))) {
for (PRInt32 spanX = 0; spanX < colSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX + spanX);
- nscoord colWidth = colFrame->GetWidth(widthX);
+ nscoord colWidth = PR_MAX(colFrame->GetWidth(widthX),
+ colFrame->GetWidth(widthX + NUM_MAJOR_WIDTHS));
nscoord minWidth = colFrame->GetMinWidth();
// accumulate numerator similarly to divisor
colWidth = PR_MAX(colWidth, colFrame->GetMinWidth());
@@ -612,14 +614,16 @@ PRBool BasicTableLayoutStrategy::AssignPreliminaryColumnWidths(nscoord aMaxWidth
newColAdjWidth = PR_MAX(newColAdjWidth, minWidth);
if (FIX != widthX)
colFrame->SetWidth(widthX + NUM_MAJOR_WIDTHS, newColAdjWidth);
- // the following ensures that a spanned cell will reach its full desired width
- // in an auto table, since allocations are done on fixed cols before auto cols
+ // The next two conditions allows BalanceColumnWidths to assume that
+ // fixed allocations are a stopping point.
+ // if new DES_CON exceeds FIX, set FIX_ADJ to DES_CON.
if (DES_CON == widthX) {
nscoord fixWidth = colFrame->GetFixWidth();
if ((fixWidth > 0) && (newColAdjWidth > fixWidth) && (newColAdjWidth > 0)) {
colFrame->SetWidth(FIX_ADJ, newColAdjWidth);
}
}
+ // if new FIX_ADJ exceeds desired, set DES_ADJ to FIX_ADJ.
else if (FIX == widthX) {
nscoord desWidth = colFrame->GetDesWidth();
if ((newColAdjWidth > desWidth) && (newColAdjWidth > 0)) {
@@ -632,6 +636,8 @@ PRBool BasicTableLayoutStrategy::AssignPreliminaryColumnWidths(nscoord aMaxWidth
}
}
}
+ // if DES_ADJ exceeds FIX, pretend that FIX is not set. This allows
+ // BalanceColumnWidths to assume that fixed allocations are a stopping point.
for (colX = 0; colX < mNumCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
nscoord desAdjWidth = colFrame->GetWidth(DES_ADJ);