diff --git a/mozilla/layout/html/table/src/BasicTableLayoutStrategy.cpp b/mozilla/layout/html/table/src/BasicTableLayoutStrategy.cpp
index 06f8baa2a28..c81a769afa3 100644
--- a/mozilla/layout/html/table/src/BasicTableLayoutStrategy.cpp
+++ b/mozilla/layout/html/table/src/BasicTableLayoutStrategy.cpp
@@ -197,6 +197,7 @@ BasicTableLayoutStrategy::BalanceColumnWidths(nsIPresContext* aPresCont
PRInt32 colX;
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
colFrame->SetWidth(PCT, WIDTH_NOT_SET);
colFrame->SetWidth(PCT_ADJ, WIDTH_NOT_SET);
}
@@ -216,9 +217,10 @@ BasicTableLayoutStrategy::BalanceColumnWidths(nsIPresContext* aPresCont
// set the table's columns to the min width
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord colMinWidth = colFrame->GetMinWidth();
mTableFrame->SetColumnWidth(colX, colMinWidth);
- }
+ }
// if the max width available is less than the min content width for fixed table, we're done
nscoord minTableWidth = GetTableMinWidth();
@@ -365,6 +367,7 @@ void BasicTableLayoutStrategy::AllocateFully(nscoord& aTotalAllocated,
PRInt32 numCols = mTableFrame->GetColCount();
for (PRInt32 colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord oldWidth = mTableFrame->GetColumnWidth(colX);
nscoord newWidth = colFrame->GetWidth(aWidthType);
@@ -414,7 +417,7 @@ void BasicTableLayoutStrategy::AllocateUnconstrained(PRInt32 aAllocAmount,
if (-1 != aAllocTypes[colX]) {
if (aSkip0Proportional) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
- if (e0ProportionConstraint == colFrame->GetConstraint()) {
+ if (colFrame && (e0ProportionConstraint == colFrame->GetConstraint())) {
continue;
}
}
@@ -463,6 +466,7 @@ BasicTableLayoutStrategy::ComputeNonPctColspanWidths(const nsHTMLReflowState& aR
PRInt32 colX;
for (colX = numCols - 1; colX >= 0; colX--) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
colFrame->SetWidth(MIN_ADJ, WIDTH_NOT_SET);
colFrame->SetWidth(FIX_ADJ, WIDTH_NOT_SET);
colFrame->SetWidth(DES_ADJ, WIDTH_NOT_SET);
@@ -557,6 +561,7 @@ BasicTableLayoutStrategy::ComputeNonPctColspanWidths(PRInt32 aWidthInd
// accumulate the various divisors to be used later
for (spanX = 0; spanX < aColSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(aColIndex + spanX);
+ if (!colFrame) continue;
nscoord colWidth = PR_MAX(colFrame->GetWidth(aWidthIndex),
colFrame->GetWidth(aWidthIndex + NUM_MAJOR_WIDTHS));
colWidth = PR_MAX(colWidth, 0);
@@ -645,6 +650,7 @@ BasicTableLayoutStrategy::ComputeNonPctColspanWidths(PRInt32 aWidthInd
// get the correct numerator in a similar fashion to getting the divisor
for (spanX = 0; spanX < aColSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(aColIndex + spanX);
+ if (!colFrame) continue;
nscoord colWidth = PR_MAX(colFrame->GetWidth(aWidthIndex),
colFrame->GetWidth(aWidthIndex + NUM_MAJOR_WIDTHS));
nscoord minWidth = colFrame->GetMinWidth();
@@ -787,6 +793,7 @@ BasicTableLayoutStrategy::AssignNonPctColumnWidths(nsIPresContext* aPre
// Get column frame and reset it
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
NS_ASSERTION(nsnull != colFrame, "bad col frame");
colFrame->ResetSizingInfo();
@@ -895,6 +902,7 @@ BasicTableLayoutStrategy::AssignNonPctColumnWidths(nsIPresContext* aPre
// figure the totals of all proportional cols which support every min and desired width
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord colProp = colFrame->GetWidth(MIN_PRO);
if (colProp > 0) {
nscoord minWidth = colFrame->GetWidth(MIN_CON);
@@ -910,6 +918,7 @@ BasicTableLayoutStrategy::AssignNonPctColumnWidths(nsIPresContext* aPre
// figure the cols proportional min width based on the new totals
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord colProp = colFrame->GetWidth(MIN_PRO);
if (colProp > 0) {
nscoord minProp = NSToCoordRound(((float)colProp * minPropTotal) / (float)propTotal);
@@ -925,6 +934,7 @@ BasicTableLayoutStrategy::AssignNonPctColumnWidths(nsIPresContext* aPre
// Set the table col width for each col to the content min.
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord fixColWidth = colFrame->GetWidth(FIX);
// use the style width of a col only if the col hasn't gotten a fixed width from any cell
if (fixColWidth <= 0) {
@@ -950,6 +960,7 @@ BasicTableLayoutStrategy::ReduceOverSpecifiedPctCols(nscoord aExcess)
nscoord numCols = mTableFrame->GetColCount();
for (PRInt32 colX = numCols - 1; (colX >= 0) && (aExcess > 0); colX--) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord pctWidth = colFrame->GetWidth(PCT);
nscoord reduction = 0;
if (pctWidth > 0) {
@@ -999,6 +1010,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
nscoord prefWidthTotal = 0;// total of des/fix widths of cols that don't have percentage constraints
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord colBasis = -1;
// Scan the cells in the col
for (rowX = 0; rowX < numRows; rowX++) {
@@ -1019,6 +1031,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
nscoord cellDesWidth = 0;
for (PRInt32 spanX = 0; spanX < colSpan; spanX++) {
nsTableColFrame* spanFrame = mTableFrame->GetColFrame(colX + spanX);
+ if (!spanFrame) continue;
cellDesWidth += spanFrame->GetDesWidth();
}
// figure the basis using the cell's desired width and percent
@@ -1078,6 +1091,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
// Iterate backwards, similarly to the reasoning in AssignNonPctColumnWidths
for (colX = numCols - 1; colX >= 0; colX--) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord maxColPctWidth = WIDTH_NOT_SET;
float maxColPct = 0.0f;
@@ -1147,6 +1161,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
// determine if the cell spans cols which have a pct value
for (PRInt32 spanX = 0; spanX < colSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX + spanX);
+ if (!colFrame) continue;
if (colFrame->GetWidth(PCT) > 0) {
mTableFrame->SetHasCellSpanningPctCol(PR_TRUE);
// recompute the MIN_ADJ, FIX_ADJ, and DES_ADJ values
@@ -1189,6 +1204,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
PRInt32 spanX;
for (spanX = 0; spanX < colSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX + spanX);
+ if (!colFrame) continue;
nscoord colPctWidth = colFrame->GetWidth(PCT);
if (colPctWidth > 0) { // skip pct cols
colPctWidthTotal += colPctWidth;
@@ -1210,6 +1226,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
// record the percent contributions for the spanned cols
for (spanX = 0; spanX < colSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX + spanX);
+ if (!colFrame) continue;
if (colFrame->GetWidth(PCT) > 0) { // skip pct cols
continue;
}
@@ -1236,6 +1253,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
}
} // end for (rowX ..
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
colPctTotal += NSToCoordRound(100.0f * (float)colFrame->GetWidth(PCT_ADJ) / (float)basis);
} // end for (colX ..
@@ -1254,6 +1272,7 @@ nscoord BasicTableLayoutStrategy::GetTableMinWidth() const
PRInt32 numCols = mTableFrame->GetColCount();
for (PRInt32 colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
minWidth += PR_MAX(colFrame->GetMinWidth(), colFrame->GetWidth(MIN_ADJ));
if (mTableFrame->GetNumCellsOriginatingInCol(colX) > 0) {
minWidth += spacingX;
@@ -1266,31 +1285,39 @@ nscoord BasicTableLayoutStrategy::GetTableMinWidth() const
return minWidth;
}
-nscoord BasicTableLayoutStrategy::GetTableMaxWidth() const
+nscoord BasicTableLayoutStrategy::GetTableMaxWidth(const nsHTMLReflowState& aReflowState) const
{
- nscoord spacingX = mTableFrame->GetCellSpacingX();
- PRInt32 numCols = mTableFrame->GetColCount();
+ PRBool isAutoWidth = mTableFrame->IsAutoWidth();
nscoord maxWidth = 0;
- for (PRInt32 colX = 0; colX < numCols; colX++) {
- nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
- nscoord width = colFrame->GetPctWidth();
- if (width <= 0) {
- width = colFrame->GetFixWidth();
+
+ if (isAutoWidth) {
+ nscoord spacingX = mTableFrame->GetCellSpacingX();
+ PRInt32 numCols = mTableFrame->GetColCount();
+ for (PRInt32 colX = 0; colX < numCols; colX++) {
+ nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
+ nscoord width = colFrame->GetPctWidth();
if (width <= 0) {
- width = colFrame->GetWidth(MIN_PRO);
+ width = colFrame->GetFixWidth();
if (width <= 0) {
- width = colFrame->GetDesWidth();
+ width = colFrame->GetWidth(MIN_PRO);
+ if (width <= 0) {
+ width = colFrame->GetDesWidth();
+ }
}
}
+ maxWidth += width;
+ if (mTableFrame->GetNumCellsOriginatingInCol(colX) > 0) {
+ maxWidth += spacingX;
+ }
}
- maxWidth += width;
- if (mTableFrame->GetNumCellsOriginatingInCol(colX) > 0) {
+ // if it is not a degenerate table, add the last spacing on the right
+ if (maxWidth > 0) {
maxWidth += spacingX;
}
}
- // if it is not a degenerate table, add the last spacing on the right
- if (maxWidth > 0) {
- maxWidth += spacingX;
+ else {
+ maxWidth = PR_MAX(GetTableMinWidth(), aReflowState.mComputedWidth);
}
return maxWidth;
}
@@ -1320,6 +1347,7 @@ void BasicTableLayoutStrategy::CalculateTotals(PRInt32& aCellSpacing,
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
if (mTableFrame->GetNumCellsOriginatingInCol(colX) > 0) {
aCellSpacing += spacingX;
}
@@ -1530,6 +1558,7 @@ void BasicTableLayoutStrategy::AllocateConstrained(PRInt32 aAvailWidth,
// find out how many constrained cols there are
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
if (!CanAllocate(aWidthType, aAllocTypes[colX], colFrame, mIsNavQuirksMode, useAdj)) {
if (-1 != aAllocTypes[colX]) {
continue;
@@ -1555,6 +1584,7 @@ void BasicTableLayoutStrategy::AllocateConstrained(PRInt32 aAvailWidth,
// set the col info entries for each constrained col
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
if (!CanAllocate(aWidthType, aAllocTypes[colX], colFrame, mIsNavQuirksMode, useAdj)) {
if (-1 != aAllocTypes[colX]) {
continue;
@@ -1656,12 +1686,14 @@ PRBool BasicTableLayoutStrategy::ColumnsCanBeInvalidatedBy(nsStyleCoord*
PRInt32 colIndex;
aCellFrame.GetColIndex(colIndex);
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colIndex);
+ if (!colFrame) return PR_FALSE;
nscoord colSpan = mTableFrame->GetEffectiveColSpan(aCellFrame);
if (aPrevStyleWidth) {
nsTableColFrame* colSpanFrame = colFrame;
// see if this cell is responsible for setting a fixed or percentage based col
for (PRInt32 span = 1; span <= colSpan; span++) {
+ if (!colSpanFrame) continue;
if (&aCellFrame == colSpanFrame->GetConstrainingCell())
return PR_TRUE; // assume that the style change will affect cols
if (span < colSpan)
@@ -1724,11 +1756,13 @@ PRBool BasicTableLayoutStrategy::ColumnsCanBeInvalidatedBy(const nsTableCellFram
PRInt32 colIndex;
aCellFrame.GetColIndex(colIndex);
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colIndex);
+ if (!colFrame) return PR_FALSE;
nscoord colSpan = mTableFrame->GetEffectiveColSpan(aCellFrame);
// check to see if DES_CON can affect columns
nsTableColFrame* spanFrame = colFrame;
for (PRInt32 span = 0; span < colSpan; span++) {
+ if (!spanFrame) return PR_FALSE;
// see if the column width is constrained
if ((spanFrame->GetPctWidth() > 0) || (spanFrame->GetFixWidth() > 0) ||
(spanFrame->GetWidth(MIN_PRO) > 0)) {
@@ -1755,6 +1789,7 @@ PRBool BasicTableLayoutStrategy::ColumnsAreValidFor(const nsTableCellFrame& aCel
PRInt32 colIndex;
aCellFrame.GetColIndex(colIndex);
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colIndex);
+ if (!colFrame) return PR_TRUE;
nscoord colSpan = mTableFrame->GetEffectiveColSpan(aCellFrame);
nscoord cellMin = aCellFrame.GetPass1MaxElementSize().width;
diff --git a/mozilla/layout/html/table/src/BasicTableLayoutStrategy.h b/mozilla/layout/html/table/src/BasicTableLayoutStrategy.h
index b0dfcffcc3f..8a5e4a3b1fa 100644
--- a/mozilla/layout/html/table/src/BasicTableLayoutStrategy.h
+++ b/mozilla/layout/html/table/src/BasicTableLayoutStrategy.h
@@ -83,7 +83,7 @@ public:
// these accessors are mostly for debugging purposes
nscoord GetTableMinWidth() const;
- nscoord GetTableMaxWidth() const;
+ nscoord GetTableMaxWidth(const nsHTMLReflowState& aReflowState) const;
nscoord GetCOLSAttribute() const;
void Dump(PRInt32 aIndent);
diff --git a/mozilla/layout/html/table/src/nsITableLayoutStrategy.h b/mozilla/layout/html/table/src/nsITableLayoutStrategy.h
index 0b56eafbc88..ab51b227a24 100644
--- a/mozilla/layout/html/table/src/nsITableLayoutStrategy.h
+++ b/mozilla/layout/html/table/src/nsITableLayoutStrategy.h
@@ -72,7 +72,7 @@ public:
* the actual table width in a given situation will depend on the available size
* provided by the parent (especially for percent-width tables.)
*/
- virtual nscoord GetTableMaxWidth() const = 0;
+ virtual nscoord GetTableMaxWidth(const nsHTMLReflowState& aReflowState) const = 0;
/** return the computed minimum possible size of the table.
* this is the sum of the minimum sizes of the content taking into account table
diff --git a/mozilla/layout/html/table/src/nsTableFrame.cpp b/mozilla/layout/html/table/src/nsTableFrame.cpp
index fb4d6d0b3be..f98cf95053f 100644
--- a/mozilla/layout/html/table/src/nsTableFrame.cpp
+++ b/mozilla/layout/html/table/src/nsTableFrame.cpp
@@ -1760,7 +1760,7 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext* aPresContext,
mTableLayoutStrategy->Initialize(aPresContext, nsnull, NS_UNCONSTRAINEDSIZE, aReflowState);
// Ask the strategy for the natural width of the content area
- aDesiredSize.mMaximumWidth = mTableLayoutStrategy->GetTableMaxWidth();
+ aDesiredSize.mMaximumWidth = mTableLayoutStrategy->GetTableMaxWidth(aReflowState);
// Add in space for border
nsMargin border;
@@ -2908,7 +2908,7 @@ nscoord nsTableFrame::ComputeDesiredWidth(const nsHTMLReflowState& aReflowState)
nsTableFrame* table = (nsTableFrame*)GetFirstInFlow();
tableLayoutStrategy = table->mTableLayoutStrategy;
}
- desiredWidth = tableLayoutStrategy->GetTableMaxWidth();
+ desiredWidth = tableLayoutStrategy->GetTableMaxWidth(aReflowState);
}
return desiredWidth;
}
@@ -4240,7 +4240,7 @@ nscoord nsTableFrame::GetMaxTableWidth(const nsHTMLReflowState& aState)
result = PR_MAX(aState.mComputedWidth, mTableLayoutStrategy->GetTableMinWidth());
}
else {
- result = mTableLayoutStrategy->GetTableMaxWidth();
+ result = mTableLayoutStrategy->GetTableMaxWidth(aState);
}
}
return result;
diff --git a/mozilla/layout/tables/BasicTableLayoutStrategy.cpp b/mozilla/layout/tables/BasicTableLayoutStrategy.cpp
index 06f8baa2a28..c81a769afa3 100644
--- a/mozilla/layout/tables/BasicTableLayoutStrategy.cpp
+++ b/mozilla/layout/tables/BasicTableLayoutStrategy.cpp
@@ -197,6 +197,7 @@ BasicTableLayoutStrategy::BalanceColumnWidths(nsIPresContext* aPresCont
PRInt32 colX;
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
colFrame->SetWidth(PCT, WIDTH_NOT_SET);
colFrame->SetWidth(PCT_ADJ, WIDTH_NOT_SET);
}
@@ -216,9 +217,10 @@ BasicTableLayoutStrategy::BalanceColumnWidths(nsIPresContext* aPresCont
// set the table's columns to the min width
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord colMinWidth = colFrame->GetMinWidth();
mTableFrame->SetColumnWidth(colX, colMinWidth);
- }
+ }
// if the max width available is less than the min content width for fixed table, we're done
nscoord minTableWidth = GetTableMinWidth();
@@ -365,6 +367,7 @@ void BasicTableLayoutStrategy::AllocateFully(nscoord& aTotalAllocated,
PRInt32 numCols = mTableFrame->GetColCount();
for (PRInt32 colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord oldWidth = mTableFrame->GetColumnWidth(colX);
nscoord newWidth = colFrame->GetWidth(aWidthType);
@@ -414,7 +417,7 @@ void BasicTableLayoutStrategy::AllocateUnconstrained(PRInt32 aAllocAmount,
if (-1 != aAllocTypes[colX]) {
if (aSkip0Proportional) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
- if (e0ProportionConstraint == colFrame->GetConstraint()) {
+ if (colFrame && (e0ProportionConstraint == colFrame->GetConstraint())) {
continue;
}
}
@@ -463,6 +466,7 @@ BasicTableLayoutStrategy::ComputeNonPctColspanWidths(const nsHTMLReflowState& aR
PRInt32 colX;
for (colX = numCols - 1; colX >= 0; colX--) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
colFrame->SetWidth(MIN_ADJ, WIDTH_NOT_SET);
colFrame->SetWidth(FIX_ADJ, WIDTH_NOT_SET);
colFrame->SetWidth(DES_ADJ, WIDTH_NOT_SET);
@@ -557,6 +561,7 @@ BasicTableLayoutStrategy::ComputeNonPctColspanWidths(PRInt32 aWidthInd
// accumulate the various divisors to be used later
for (spanX = 0; spanX < aColSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(aColIndex + spanX);
+ if (!colFrame) continue;
nscoord colWidth = PR_MAX(colFrame->GetWidth(aWidthIndex),
colFrame->GetWidth(aWidthIndex + NUM_MAJOR_WIDTHS));
colWidth = PR_MAX(colWidth, 0);
@@ -645,6 +650,7 @@ BasicTableLayoutStrategy::ComputeNonPctColspanWidths(PRInt32 aWidthInd
// get the correct numerator in a similar fashion to getting the divisor
for (spanX = 0; spanX < aColSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(aColIndex + spanX);
+ if (!colFrame) continue;
nscoord colWidth = PR_MAX(colFrame->GetWidth(aWidthIndex),
colFrame->GetWidth(aWidthIndex + NUM_MAJOR_WIDTHS));
nscoord minWidth = colFrame->GetMinWidth();
@@ -787,6 +793,7 @@ BasicTableLayoutStrategy::AssignNonPctColumnWidths(nsIPresContext* aPre
// Get column frame and reset it
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
NS_ASSERTION(nsnull != colFrame, "bad col frame");
colFrame->ResetSizingInfo();
@@ -895,6 +902,7 @@ BasicTableLayoutStrategy::AssignNonPctColumnWidths(nsIPresContext* aPre
// figure the totals of all proportional cols which support every min and desired width
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord colProp = colFrame->GetWidth(MIN_PRO);
if (colProp > 0) {
nscoord minWidth = colFrame->GetWidth(MIN_CON);
@@ -910,6 +918,7 @@ BasicTableLayoutStrategy::AssignNonPctColumnWidths(nsIPresContext* aPre
// figure the cols proportional min width based on the new totals
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord colProp = colFrame->GetWidth(MIN_PRO);
if (colProp > 0) {
nscoord minProp = NSToCoordRound(((float)colProp * minPropTotal) / (float)propTotal);
@@ -925,6 +934,7 @@ BasicTableLayoutStrategy::AssignNonPctColumnWidths(nsIPresContext* aPre
// Set the table col width for each col to the content min.
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord fixColWidth = colFrame->GetWidth(FIX);
// use the style width of a col only if the col hasn't gotten a fixed width from any cell
if (fixColWidth <= 0) {
@@ -950,6 +960,7 @@ BasicTableLayoutStrategy::ReduceOverSpecifiedPctCols(nscoord aExcess)
nscoord numCols = mTableFrame->GetColCount();
for (PRInt32 colX = numCols - 1; (colX >= 0) && (aExcess > 0); colX--) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord pctWidth = colFrame->GetWidth(PCT);
nscoord reduction = 0;
if (pctWidth > 0) {
@@ -999,6 +1010,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
nscoord prefWidthTotal = 0;// total of des/fix widths of cols that don't have percentage constraints
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord colBasis = -1;
// Scan the cells in the col
for (rowX = 0; rowX < numRows; rowX++) {
@@ -1019,6 +1031,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
nscoord cellDesWidth = 0;
for (PRInt32 spanX = 0; spanX < colSpan; spanX++) {
nsTableColFrame* spanFrame = mTableFrame->GetColFrame(colX + spanX);
+ if (!spanFrame) continue;
cellDesWidth += spanFrame->GetDesWidth();
}
// figure the basis using the cell's desired width and percent
@@ -1078,6 +1091,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
// Iterate backwards, similarly to the reasoning in AssignNonPctColumnWidths
for (colX = numCols - 1; colX >= 0; colX--) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
nscoord maxColPctWidth = WIDTH_NOT_SET;
float maxColPct = 0.0f;
@@ -1147,6 +1161,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
// determine if the cell spans cols which have a pct value
for (PRInt32 spanX = 0; spanX < colSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX + spanX);
+ if (!colFrame) continue;
if (colFrame->GetWidth(PCT) > 0) {
mTableFrame->SetHasCellSpanningPctCol(PR_TRUE);
// recompute the MIN_ADJ, FIX_ADJ, and DES_ADJ values
@@ -1189,6 +1204,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
PRInt32 spanX;
for (spanX = 0; spanX < colSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX + spanX);
+ if (!colFrame) continue;
nscoord colPctWidth = colFrame->GetWidth(PCT);
if (colPctWidth > 0) { // skip pct cols
colPctWidthTotal += colPctWidth;
@@ -1210,6 +1226,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
// record the percent contributions for the spanned cols
for (spanX = 0; spanX < colSpan; spanX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX + spanX);
+ if (!colFrame) continue;
if (colFrame->GetWidth(PCT) > 0) { // skip pct cols
continue;
}
@@ -1236,6 +1253,7 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
}
} // end for (rowX ..
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
colPctTotal += NSToCoordRound(100.0f * (float)colFrame->GetWidth(PCT_ADJ) / (float)basis);
} // end for (colX ..
@@ -1254,6 +1272,7 @@ nscoord BasicTableLayoutStrategy::GetTableMinWidth() const
PRInt32 numCols = mTableFrame->GetColCount();
for (PRInt32 colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
minWidth += PR_MAX(colFrame->GetMinWidth(), colFrame->GetWidth(MIN_ADJ));
if (mTableFrame->GetNumCellsOriginatingInCol(colX) > 0) {
minWidth += spacingX;
@@ -1266,31 +1285,39 @@ nscoord BasicTableLayoutStrategy::GetTableMinWidth() const
return minWidth;
}
-nscoord BasicTableLayoutStrategy::GetTableMaxWidth() const
+nscoord BasicTableLayoutStrategy::GetTableMaxWidth(const nsHTMLReflowState& aReflowState) const
{
- nscoord spacingX = mTableFrame->GetCellSpacingX();
- PRInt32 numCols = mTableFrame->GetColCount();
+ PRBool isAutoWidth = mTableFrame->IsAutoWidth();
nscoord maxWidth = 0;
- for (PRInt32 colX = 0; colX < numCols; colX++) {
- nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
- nscoord width = colFrame->GetPctWidth();
- if (width <= 0) {
- width = colFrame->GetFixWidth();
+
+ if (isAutoWidth) {
+ nscoord spacingX = mTableFrame->GetCellSpacingX();
+ PRInt32 numCols = mTableFrame->GetColCount();
+ for (PRInt32 colX = 0; colX < numCols; colX++) {
+ nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
+ nscoord width = colFrame->GetPctWidth();
if (width <= 0) {
- width = colFrame->GetWidth(MIN_PRO);
+ width = colFrame->GetFixWidth();
if (width <= 0) {
- width = colFrame->GetDesWidth();
+ width = colFrame->GetWidth(MIN_PRO);
+ if (width <= 0) {
+ width = colFrame->GetDesWidth();
+ }
}
}
+ maxWidth += width;
+ if (mTableFrame->GetNumCellsOriginatingInCol(colX) > 0) {
+ maxWidth += spacingX;
+ }
}
- maxWidth += width;
- if (mTableFrame->GetNumCellsOriginatingInCol(colX) > 0) {
+ // if it is not a degenerate table, add the last spacing on the right
+ if (maxWidth > 0) {
maxWidth += spacingX;
}
}
- // if it is not a degenerate table, add the last spacing on the right
- if (maxWidth > 0) {
- maxWidth += spacingX;
+ else {
+ maxWidth = PR_MAX(GetTableMinWidth(), aReflowState.mComputedWidth);
}
return maxWidth;
}
@@ -1320,6 +1347,7 @@ void BasicTableLayoutStrategy::CalculateTotals(PRInt32& aCellSpacing,
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
if (mTableFrame->GetNumCellsOriginatingInCol(colX) > 0) {
aCellSpacing += spacingX;
}
@@ -1530,6 +1558,7 @@ void BasicTableLayoutStrategy::AllocateConstrained(PRInt32 aAvailWidth,
// find out how many constrained cols there are
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
if (!CanAllocate(aWidthType, aAllocTypes[colX], colFrame, mIsNavQuirksMode, useAdj)) {
if (-1 != aAllocTypes[colX]) {
continue;
@@ -1555,6 +1584,7 @@ void BasicTableLayoutStrategy::AllocateConstrained(PRInt32 aAvailWidth,
// set the col info entries for each constrained col
for (colX = 0; colX < numCols; colX++) {
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colX);
+ if (!colFrame) continue;
if (!CanAllocate(aWidthType, aAllocTypes[colX], colFrame, mIsNavQuirksMode, useAdj)) {
if (-1 != aAllocTypes[colX]) {
continue;
@@ -1656,12 +1686,14 @@ PRBool BasicTableLayoutStrategy::ColumnsCanBeInvalidatedBy(nsStyleCoord*
PRInt32 colIndex;
aCellFrame.GetColIndex(colIndex);
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colIndex);
+ if (!colFrame) return PR_FALSE;
nscoord colSpan = mTableFrame->GetEffectiveColSpan(aCellFrame);
if (aPrevStyleWidth) {
nsTableColFrame* colSpanFrame = colFrame;
// see if this cell is responsible for setting a fixed or percentage based col
for (PRInt32 span = 1; span <= colSpan; span++) {
+ if (!colSpanFrame) continue;
if (&aCellFrame == colSpanFrame->GetConstrainingCell())
return PR_TRUE; // assume that the style change will affect cols
if (span < colSpan)
@@ -1724,11 +1756,13 @@ PRBool BasicTableLayoutStrategy::ColumnsCanBeInvalidatedBy(const nsTableCellFram
PRInt32 colIndex;
aCellFrame.GetColIndex(colIndex);
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colIndex);
+ if (!colFrame) return PR_FALSE;
nscoord colSpan = mTableFrame->GetEffectiveColSpan(aCellFrame);
// check to see if DES_CON can affect columns
nsTableColFrame* spanFrame = colFrame;
for (PRInt32 span = 0; span < colSpan; span++) {
+ if (!spanFrame) return PR_FALSE;
// see if the column width is constrained
if ((spanFrame->GetPctWidth() > 0) || (spanFrame->GetFixWidth() > 0) ||
(spanFrame->GetWidth(MIN_PRO) > 0)) {
@@ -1755,6 +1789,7 @@ PRBool BasicTableLayoutStrategy::ColumnsAreValidFor(const nsTableCellFrame& aCel
PRInt32 colIndex;
aCellFrame.GetColIndex(colIndex);
nsTableColFrame* colFrame = mTableFrame->GetColFrame(colIndex);
+ if (!colFrame) return PR_TRUE;
nscoord colSpan = mTableFrame->GetEffectiveColSpan(aCellFrame);
nscoord cellMin = aCellFrame.GetPass1MaxElementSize().width;
diff --git a/mozilla/layout/tables/BasicTableLayoutStrategy.h b/mozilla/layout/tables/BasicTableLayoutStrategy.h
index b0dfcffcc3f..8a5e4a3b1fa 100644
--- a/mozilla/layout/tables/BasicTableLayoutStrategy.h
+++ b/mozilla/layout/tables/BasicTableLayoutStrategy.h
@@ -83,7 +83,7 @@ public:
// these accessors are mostly for debugging purposes
nscoord GetTableMinWidth() const;
- nscoord GetTableMaxWidth() const;
+ nscoord GetTableMaxWidth(const nsHTMLReflowState& aReflowState) const;
nscoord GetCOLSAttribute() const;
void Dump(PRInt32 aIndent);
diff --git a/mozilla/layout/tables/nsITableLayoutStrategy.h b/mozilla/layout/tables/nsITableLayoutStrategy.h
index 0b56eafbc88..ab51b227a24 100644
--- a/mozilla/layout/tables/nsITableLayoutStrategy.h
+++ b/mozilla/layout/tables/nsITableLayoutStrategy.h
@@ -72,7 +72,7 @@ public:
* the actual table width in a given situation will depend on the available size
* provided by the parent (especially for percent-width tables.)
*/
- virtual nscoord GetTableMaxWidth() const = 0;
+ virtual nscoord GetTableMaxWidth(const nsHTMLReflowState& aReflowState) const = 0;
/** return the computed minimum possible size of the table.
* this is the sum of the minimum sizes of the content taking into account table
diff --git a/mozilla/layout/tables/nsTableFrame.cpp b/mozilla/layout/tables/nsTableFrame.cpp
index fb4d6d0b3be..f98cf95053f 100644
--- a/mozilla/layout/tables/nsTableFrame.cpp
+++ b/mozilla/layout/tables/nsTableFrame.cpp
@@ -1760,7 +1760,7 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext* aPresContext,
mTableLayoutStrategy->Initialize(aPresContext, nsnull, NS_UNCONSTRAINEDSIZE, aReflowState);
// Ask the strategy for the natural width of the content area
- aDesiredSize.mMaximumWidth = mTableLayoutStrategy->GetTableMaxWidth();
+ aDesiredSize.mMaximumWidth = mTableLayoutStrategy->GetTableMaxWidth(aReflowState);
// Add in space for border
nsMargin border;
@@ -2908,7 +2908,7 @@ nscoord nsTableFrame::ComputeDesiredWidth(const nsHTMLReflowState& aReflowState)
nsTableFrame* table = (nsTableFrame*)GetFirstInFlow();
tableLayoutStrategy = table->mTableLayoutStrategy;
}
- desiredWidth = tableLayoutStrategy->GetTableMaxWidth();
+ desiredWidth = tableLayoutStrategy->GetTableMaxWidth(aReflowState);
}
return desiredWidth;
}
@@ -4240,7 +4240,7 @@ nscoord nsTableFrame::GetMaxTableWidth(const nsHTMLReflowState& aState)
result = PR_MAX(aState.mComputedWidth, mTableLayoutStrategy->GetTableMinWidth());
}
else {
- result = mTableLayoutStrategy->GetTableMaxWidth();
+ result = mTableLayoutStrategy->GetTableMaxWidth(aState);
}
}
return result;