diff --git a/mozilla/layout/html/table/src/BasicTableLayoutStrategy.cpp b/mozilla/layout/html/table/src/BasicTableLayoutStrategy.cpp
index b79d4379a67..8c253cd9c00 100644
--- a/mozilla/layout/html/table/src/BasicTableLayoutStrategy.cpp
+++ b/mozilla/layout/html/table/src/BasicTableLayoutStrategy.cpp
@@ -1686,12 +1686,12 @@ void BasicTableLayoutStrategy::CalculateTotals(PRInt32* aTotalCounts,
}
-struct nsColInfo {
- nsColInfo(nsTableColFrame* aFrame,
- PRInt32 aIndex,
- PRInt32 aMinWidth,
- PRInt32 aWidth,
- PRInt32 aMaxWidth)
+struct ColInfo {
+ ColInfo(nsTableColFrame* aFrame,
+ PRInt32 aIndex,
+ PRInt32 aMinWidth,
+ PRInt32 aWidth,
+ PRInt32 aMaxWidth)
: mFrame(aFrame), mIndex(aIndex), mMinWidth(aMinWidth),
mWidth(aWidth), mMaxWidth(aMaxWidth), mWeight(0)
{}
@@ -1706,7 +1706,7 @@ struct nsColInfo {
void
AC_Wrapup(nsTableFrame* aTableFrame,
PRInt32 aNumItems,
- nsColInfo** aColInfo,
+ ColInfo** aColInfo,
PRBool aAbort = PR_FALSE)
{
if (aColInfo) {
@@ -1724,7 +1724,7 @@ AC_Wrapup(nsTableFrame* aTableFrame,
void
AC_Increase(PRInt32 aNumAutoCols,
- nsColInfo** aColInfo,
+ ColInfo** aColInfo,
PRInt32 aDivisor,
PRInt32& aAvailWidth,
float aPixelToTwips)
@@ -1753,7 +1753,7 @@ AC_Increase(PRInt32 aNumAutoCols,
void
AC_Decrease(PRInt32 aNumAutoCols,
- nsColInfo** aColInfo,
+ ColInfo** aColInfo,
PRInt32 aDivisor,
PRInt32& aExcess,
float aPixelToTwips)
@@ -1779,15 +1779,15 @@ AC_Decrease(PRInt32 aNumAutoCols,
}
void
-AC_Sort(nsColInfo** aColInfo, PRInt32 aNumCols)
+AC_Sort(ColInfo** aColInfo, PRInt32 aNumCols)
{
// sort the cols based on the Weight
for (PRInt32 j = aNumCols - 1; j > 0; j--) {
for (PRInt32 i = 0; i < j; i++) {
if (aColInfo[i]->mWeight < aColInfo[i+1]->mWeight) { // swap them
- nsColInfo* save = aColInfo[i];
- aColInfo[i] = aColInfo[i+1];
- aColInfo[i+1] = save;
+ ColInfo* save = aColInfo[i];
+ aColInfo[i] = aColInfo[i+1];
+ aColInfo[i+1] = save;
}
}
}
@@ -1840,9 +1840,9 @@ void BasicTableLayoutStrategy::AllocateConstrained(PRInt32 aAvailWidth,
}
// allocate storage for the constrained cols. Only they get adjusted.
- nsColInfo** colInfo = new nsColInfo*[numConstrainedCols];
+ ColInfo** colInfo = new ColInfo*[numConstrainedCols];
if (!colInfo) return;
- memset(colInfo, 0, numConstrainedCols * sizeof(nsColInfo *));
+ memset(colInfo, 0, numConstrainedCols * sizeof(ColInfo *));
PRInt32 maxMinDiff = 0;
PRInt32 constrColX = 0;
@@ -1873,7 +1873,7 @@ void BasicTableLayoutStrategy::AllocateConstrained(PRInt32 aAvailWidth,
maxWidth = PR_MAX(maxWidth, minWidth);
maxMinDiff += maxWidth - minWidth;
nscoord startWidth = (aStartAtMin) ? minWidth : maxWidth;
- colInfo[constrColX] = new nsColInfo(colFrame, colX, minWidth, startWidth, maxWidth);
+ colInfo[constrColX] = new ColInfo(colFrame, colX, minWidth, startWidth, maxWidth);
if (!colInfo[constrColX]) {
AC_Wrapup(mTableFrame, numConstrainedCols, colInfo, PR_TRUE);
return;
diff --git a/mozilla/layout/html/table/src/nsCellMap.cpp b/mozilla/layout/html/table/src/nsCellMap.cpp
index 3b6a835cfe8..15704a74974 100644
--- a/mozilla/layout/html/table/src/nsCellMap.cpp
+++ b/mozilla/layout/html/table/src/nsCellMap.cpp
@@ -1741,8 +1741,9 @@ void nsCellMap::ShrinkWithoutCell(nsTableCellMap& aMap,
// update the row and col info due to shifting
for (rowX = aRowIndex; rowX <= endRowIndex; rowX++) {
nsVoidArray* row = (nsVoidArray *)mRows.ElementAt(rowX);
+ PRInt32 rowCount = row->Count();
for (colX = aColIndex; colX < numCols - colSpan; colX++) {
- CellData* data = (CellData*) row->ElementAt(colX);
+ CellData* data = (colX < rowCount) ? (CellData*)row->ElementAt(colX) : nsnull;
if (data) {
if (data->IsOrig()) {
// a cell that gets moved to the left needs adjustment in its new location
diff --git a/mozilla/layout/html/table/src/nsTableFrame.cpp b/mozilla/layout/html/table/src/nsTableFrame.cpp
index 39c2bab3f35..f088694b17c 100644
--- a/mozilla/layout/html/table/src/nsTableFrame.cpp
+++ b/mozilla/layout/html/table/src/nsTableFrame.cpp
@@ -4978,26 +4978,14 @@ BCMapCellIterator::First(BCMapCellInfo& aMapInfo)
while (!mAtEnd) {
if ((mAreaStart.y >= mRowGroupStart) && (mAreaStart.y <= mRowGroupEnd)) {
CellData* cellData = mCellMap->GetDataAt(*mTableCellMap, mAreaStart.y - mRowGroupStart, mAreaStart.x, PR_FALSE);
- if (cellData) {
- if (!cellData->IsOrig()) {
- // if the start data does not have an originating cell, adjust it to have one
- if (cellData->IsRowSpan()) {
- mAreaStart.y -= cellData->GetRowSpanOffset();
- NS_ASSERTION(mAreaStart.y >= 0, "program error");
- }
- if (cellData->IsColSpan()) {
- mAreaStart.x -= cellData->GetColSpanOffset();
- NS_ASSERTION(mAreaStart.x >= 0, "program error");
- }
- cellData = mCellMap->GetDataAt(*mTableCellMap, mAreaStart.y - mRowGroupStart, mAreaStart.x, PR_FALSE);
- }
- if (cellData && cellData->IsOrig()) {
- SetInfo(mRow, mAreaStart.x, cellData, aMapInfo);
- break;
- }
- else mAtEnd = PR_TRUE;
+ if (cellData && cellData->IsOrig()) {
+ SetInfo(mRow, mAreaStart.x, cellData, aMapInfo);
+ break;
+ }
+ else {
+ NS_ASSERTION(PR_FALSE, "damage area expanded incorrectly");
+ mAtEnd = PR_TRUE;
}
- else mAtEnd = PR_TRUE;
}
SetNewRowGroup(); // could set mAtEnd
}
@@ -5610,9 +5598,9 @@ nsTableFrame::ExpandBCDamageArea(nsRect& aRect) const
// to rebuild versus expand. This could be optimized to expand to the smallest area that contains
// no spanners, but it may not be worth the effort in general, and it would need to be done in the
// cell map as well.
+ PRBool haveSpanner = PR_FALSE;
if ((dStartX > 0) || (dEndX < (numCols - 1)) || (dStartY > 0) || (dEndY < (numRows - 1))) {
nsTableCellMap* tableCellMap = GetCellMap(); if (!tableCellMap) ABORT0();
- PRBool haveSpanner = PR_FALSE;
// Get the ordered row groups
PRUint32 numRowGroups;
nsVoidArray rowGroups;
@@ -5683,10 +5671,19 @@ nsTableFrame::ExpandBCDamageArea(nsRect& aRect) const
}
}
}
- aRect.x = dStartX;
- aRect.y = dStartY;
- aRect.width = 1 + dEndX - dStartX;
- aRect.height = 1 + dEndY - dStartY;
+ if (haveSpanner) {
+ // make the damage area the whole table
+ aRect.x = 0;
+ aRect.y = 0;
+ aRect.width = numCols;
+ aRect.height = numRows;
+ }
+ else {
+ aRect.x = dStartX;
+ aRect.y = dStartY;
+ aRect.width = 1 + dEndX - dStartX;
+ aRect.height = 1 + dEndY - dStartY;
+ }
}
#define MAX_TABLE_BORDER_WIDTH 256
diff --git a/mozilla/layout/tables/BasicTableLayoutStrategy.cpp b/mozilla/layout/tables/BasicTableLayoutStrategy.cpp
index b79d4379a67..8c253cd9c00 100644
--- a/mozilla/layout/tables/BasicTableLayoutStrategy.cpp
+++ b/mozilla/layout/tables/BasicTableLayoutStrategy.cpp
@@ -1686,12 +1686,12 @@ void BasicTableLayoutStrategy::CalculateTotals(PRInt32* aTotalCounts,
}
-struct nsColInfo {
- nsColInfo(nsTableColFrame* aFrame,
- PRInt32 aIndex,
- PRInt32 aMinWidth,
- PRInt32 aWidth,
- PRInt32 aMaxWidth)
+struct ColInfo {
+ ColInfo(nsTableColFrame* aFrame,
+ PRInt32 aIndex,
+ PRInt32 aMinWidth,
+ PRInt32 aWidth,
+ PRInt32 aMaxWidth)
: mFrame(aFrame), mIndex(aIndex), mMinWidth(aMinWidth),
mWidth(aWidth), mMaxWidth(aMaxWidth), mWeight(0)
{}
@@ -1706,7 +1706,7 @@ struct nsColInfo {
void
AC_Wrapup(nsTableFrame* aTableFrame,
PRInt32 aNumItems,
- nsColInfo** aColInfo,
+ ColInfo** aColInfo,
PRBool aAbort = PR_FALSE)
{
if (aColInfo) {
@@ -1724,7 +1724,7 @@ AC_Wrapup(nsTableFrame* aTableFrame,
void
AC_Increase(PRInt32 aNumAutoCols,
- nsColInfo** aColInfo,
+ ColInfo** aColInfo,
PRInt32 aDivisor,
PRInt32& aAvailWidth,
float aPixelToTwips)
@@ -1753,7 +1753,7 @@ AC_Increase(PRInt32 aNumAutoCols,
void
AC_Decrease(PRInt32 aNumAutoCols,
- nsColInfo** aColInfo,
+ ColInfo** aColInfo,
PRInt32 aDivisor,
PRInt32& aExcess,
float aPixelToTwips)
@@ -1779,15 +1779,15 @@ AC_Decrease(PRInt32 aNumAutoCols,
}
void
-AC_Sort(nsColInfo** aColInfo, PRInt32 aNumCols)
+AC_Sort(ColInfo** aColInfo, PRInt32 aNumCols)
{
// sort the cols based on the Weight
for (PRInt32 j = aNumCols - 1; j > 0; j--) {
for (PRInt32 i = 0; i < j; i++) {
if (aColInfo[i]->mWeight < aColInfo[i+1]->mWeight) { // swap them
- nsColInfo* save = aColInfo[i];
- aColInfo[i] = aColInfo[i+1];
- aColInfo[i+1] = save;
+ ColInfo* save = aColInfo[i];
+ aColInfo[i] = aColInfo[i+1];
+ aColInfo[i+1] = save;
}
}
}
@@ -1840,9 +1840,9 @@ void BasicTableLayoutStrategy::AllocateConstrained(PRInt32 aAvailWidth,
}
// allocate storage for the constrained cols. Only they get adjusted.
- nsColInfo** colInfo = new nsColInfo*[numConstrainedCols];
+ ColInfo** colInfo = new ColInfo*[numConstrainedCols];
if (!colInfo) return;
- memset(colInfo, 0, numConstrainedCols * sizeof(nsColInfo *));
+ memset(colInfo, 0, numConstrainedCols * sizeof(ColInfo *));
PRInt32 maxMinDiff = 0;
PRInt32 constrColX = 0;
@@ -1873,7 +1873,7 @@ void BasicTableLayoutStrategy::AllocateConstrained(PRInt32 aAvailWidth,
maxWidth = PR_MAX(maxWidth, minWidth);
maxMinDiff += maxWidth - minWidth;
nscoord startWidth = (aStartAtMin) ? minWidth : maxWidth;
- colInfo[constrColX] = new nsColInfo(colFrame, colX, minWidth, startWidth, maxWidth);
+ colInfo[constrColX] = new ColInfo(colFrame, colX, minWidth, startWidth, maxWidth);
if (!colInfo[constrColX]) {
AC_Wrapup(mTableFrame, numConstrainedCols, colInfo, PR_TRUE);
return;
diff --git a/mozilla/layout/tables/nsCellMap.cpp b/mozilla/layout/tables/nsCellMap.cpp
index 3b6a835cfe8..15704a74974 100644
--- a/mozilla/layout/tables/nsCellMap.cpp
+++ b/mozilla/layout/tables/nsCellMap.cpp
@@ -1741,8 +1741,9 @@ void nsCellMap::ShrinkWithoutCell(nsTableCellMap& aMap,
// update the row and col info due to shifting
for (rowX = aRowIndex; rowX <= endRowIndex; rowX++) {
nsVoidArray* row = (nsVoidArray *)mRows.ElementAt(rowX);
+ PRInt32 rowCount = row->Count();
for (colX = aColIndex; colX < numCols - colSpan; colX++) {
- CellData* data = (CellData*) row->ElementAt(colX);
+ CellData* data = (colX < rowCount) ? (CellData*)row->ElementAt(colX) : nsnull;
if (data) {
if (data->IsOrig()) {
// a cell that gets moved to the left needs adjustment in its new location
diff --git a/mozilla/layout/tables/nsTableFrame.cpp b/mozilla/layout/tables/nsTableFrame.cpp
index 39c2bab3f35..f088694b17c 100644
--- a/mozilla/layout/tables/nsTableFrame.cpp
+++ b/mozilla/layout/tables/nsTableFrame.cpp
@@ -4978,26 +4978,14 @@ BCMapCellIterator::First(BCMapCellInfo& aMapInfo)
while (!mAtEnd) {
if ((mAreaStart.y >= mRowGroupStart) && (mAreaStart.y <= mRowGroupEnd)) {
CellData* cellData = mCellMap->GetDataAt(*mTableCellMap, mAreaStart.y - mRowGroupStart, mAreaStart.x, PR_FALSE);
- if (cellData) {
- if (!cellData->IsOrig()) {
- // if the start data does not have an originating cell, adjust it to have one
- if (cellData->IsRowSpan()) {
- mAreaStart.y -= cellData->GetRowSpanOffset();
- NS_ASSERTION(mAreaStart.y >= 0, "program error");
- }
- if (cellData->IsColSpan()) {
- mAreaStart.x -= cellData->GetColSpanOffset();
- NS_ASSERTION(mAreaStart.x >= 0, "program error");
- }
- cellData = mCellMap->GetDataAt(*mTableCellMap, mAreaStart.y - mRowGroupStart, mAreaStart.x, PR_FALSE);
- }
- if (cellData && cellData->IsOrig()) {
- SetInfo(mRow, mAreaStart.x, cellData, aMapInfo);
- break;
- }
- else mAtEnd = PR_TRUE;
+ if (cellData && cellData->IsOrig()) {
+ SetInfo(mRow, mAreaStart.x, cellData, aMapInfo);
+ break;
+ }
+ else {
+ NS_ASSERTION(PR_FALSE, "damage area expanded incorrectly");
+ mAtEnd = PR_TRUE;
}
- else mAtEnd = PR_TRUE;
}
SetNewRowGroup(); // could set mAtEnd
}
@@ -5610,9 +5598,9 @@ nsTableFrame::ExpandBCDamageArea(nsRect& aRect) const
// to rebuild versus expand. This could be optimized to expand to the smallest area that contains
// no spanners, but it may not be worth the effort in general, and it would need to be done in the
// cell map as well.
+ PRBool haveSpanner = PR_FALSE;
if ((dStartX > 0) || (dEndX < (numCols - 1)) || (dStartY > 0) || (dEndY < (numRows - 1))) {
nsTableCellMap* tableCellMap = GetCellMap(); if (!tableCellMap) ABORT0();
- PRBool haveSpanner = PR_FALSE;
// Get the ordered row groups
PRUint32 numRowGroups;
nsVoidArray rowGroups;
@@ -5683,10 +5671,19 @@ nsTableFrame::ExpandBCDamageArea(nsRect& aRect) const
}
}
}
- aRect.x = dStartX;
- aRect.y = dStartY;
- aRect.width = 1 + dEndX - dStartX;
- aRect.height = 1 + dEndY - dStartY;
+ if (haveSpanner) {
+ // make the damage area the whole table
+ aRect.x = 0;
+ aRect.y = 0;
+ aRect.width = numCols;
+ aRect.height = numRows;
+ }
+ else {
+ aRect.x = dStartX;
+ aRect.y = dStartY;
+ aRect.width = 1 + dEndX - dStartX;
+ aRect.height = 1 + dEndY - dStartY;
+ }
}
#define MAX_TABLE_BORDER_WIDTH 256