r=karnaze@netscape.com Performance improvement for tables. During the initial

reflow we skip the pass2 reflow if it's an unconstrained reflow
This commit is contained in:
troy%netscape.com 2000-02-11 03:55:33 +00:00
parent 4e716fb265
commit d6fafd305f
4 changed files with 284 additions and 182 deletions

View File

@ -1559,36 +1559,47 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext* aPresContext,
SetTableWidth(aPresContext);
}
// Constrain our reflow width to the computed table width. Note: this is based
// on the width of the first-in-flow
nsHTMLReflowState reflowState(aReflowState);
PRInt32 pass1Width = mRect.width;
if (mPrevInFlow) {
nsTableFrame* table = (nsTableFrame*)GetFirstInFlow();
pass1Width = table->mRect.width;
}
reflowState.availableWidth = pass1Width;
if (pass1MaxElementSize) {
// we already have the max element size, so don't request it during pass2
aDesiredSize.maxElementSize = nsnull;
}
rv = ResizeReflowPass2(aPresContext, aDesiredSize, reflowState, aStatus);
if (NS_FAILED(rv)) {
return rv;
}
aDesiredSize.width = PR_MIN(aDesiredSize.width, pass1Width);
if ((eReflowReason_Initial == aReflowState.reason) &&
(NS_UNCONSTRAINEDSIZE == aReflowState.availableWidth)) {
// Don't bother doing a pass2 reflow. Use our pass1 width as our
// desired width
aDesiredSize.width = mRect.width;
// If this is an incremental reflow and we're here that means we had to
// reflow all the rows, e.g., the column widths changed. We need to make
// sure that any damaged areas are repainted
if (eReflowReason_Incremental == aReflowState.reason) {
nsRect damageRect;
} else {
nscoord pass1Height = aDesiredSize.height;
damageRect.x = 0;
damageRect.y = 0;
damageRect.width = mRect.width;
damageRect.height = mRect.height;
Invalidate(aPresContext, damageRect);
// Constrain our reflow width to the computed table width. Note: this is based
// on the width of the first-in-flow
nsHTMLReflowState reflowState(aReflowState);
PRInt32 pass1Width = mRect.width;
if (mPrevInFlow) {
nsTableFrame* table = (nsTableFrame*)GetFirstInFlow();
pass1Width = table->mRect.width;
}
reflowState.availableWidth = pass1Width;
if (pass1MaxElementSize) {
// we already have the max element size, so don't request it during pass2
aDesiredSize.maxElementSize = nsnull;
}
rv = ResizeReflowPass2(aPresContext, aDesiredSize, reflowState, aStatus);
if (NS_FAILED(rv)) {
return rv;
}
aDesiredSize.width = PR_MIN(aDesiredSize.width, pass1Width);
// If this is an incremental reflow and we're here that means we had to
// reflow all the rows, e.g., the column widths changed. We need to make
// sure that any damaged areas are repainted
if (eReflowReason_Incremental == aReflowState.reason) {
nsRect damageRect;
damageRect.x = 0;
damageRect.y = 0;
damageRect.width = mRect.width;
damageRect.height = mRect.height;
Invalidate(aPresContext, damageRect);
}
}
}
else {
@ -1703,16 +1714,31 @@ NS_METHOD nsTableFrame::ResizeReflowPass1(nsIPresContext* aPresContext,
kidFrame->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
continue;
}
// Get the row group's border padding
nsMargin borderPadding;
GetTableBorderForRowGroup(GetRowGroupFrameFor(kidFrame, childDisplay), borderPadding);
const nsStyleSpacing* tableSpacing;
GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)tableSpacing));
nsMargin padding;
tableSpacing->GetPadding(padding);
borderPadding += padding;
// Reflow the child
nsHTMLReflowState kidReflowState(aPresContext, aReflowState, kidFrame,
availSize, aReason);
// Note: we don't bother checking here for whether we should clear the
// isTopOfPage reflow state flag, because we're dealing with an unconstrained
// height and it isn't an issue...
ReflowChild(kidFrame, aPresContext, kidSize, kidReflowState, 0, 0, 0, aStatus);
ReflowChild(kidFrame, aPresContext, kidSize, kidReflowState, borderPadding.left,
borderPadding.top + y, 0, aStatus);
// Place the child since some of its content fit in us.
FinishReflowChild(kidFrame, aPresContext, kidSize, 0, 0, 0);
FinishReflowChild(kidFrame, aPresContext, kidSize, borderPadding.left,
borderPadding.top + y, 0);
if (NS_UNCONSTRAINEDSIZE==kidSize.height)
// XXX This is very suspicious. Why would a row group frame want
// such a large height?
y = NS_UNCONSTRAINEDSIZE;
else
y += kidSize.height;
@ -1746,7 +1772,18 @@ NS_METHOD nsTableFrame::ResizeReflowPass1(nsIPresContext* aPresContext,
}
}
// Get the table's border/padding
const nsStyleSpacing* mySpacing = (const nsStyleSpacing*)
mStyleContext->GetStyleData(eStyleStruct_Spacing);
nsMargin tableBorderPadding;
GetTableBorder (tableBorderPadding); // this gets the max border thickness at each edge
nsMargin tablePadding;
mySpacing->GetPadding(tablePadding);
tableBorderPadding += tablePadding;
aDesiredSize.width = kidSize.width;
nscoord defaultHeight = y + tableBorderPadding.top + tableBorderPadding.bottom;
aDesiredSize.height = ComputeDesiredHeight(aPresContext, aReflowState, defaultHeight);
mBits.mFirstPassValid = PR_TRUE;
return rv;
@ -3447,66 +3484,70 @@ nscoord nsTableFrame::ComputeDesiredHeight(nsIPresContext* aPresContext
nscoord tableSpecifiedHeight = CalcBorderBoxHeight(aReflowState, PR_TRUE);
if ((tableSpecifiedHeight > 0) && (tableSpecifiedHeight != NS_UNCONSTRAINEDSIZE)) {
if (tableSpecifiedHeight > aDefaultHeight) {
// proportionately distribute the excess height to each row
if (tableSpecifiedHeight > aDefaultHeight) {
result = tableSpecifiedHeight;
nscoord excess = tableSpecifiedHeight - aDefaultHeight;
nscoord sumOfRowHeights = 0;
nscoord rowGroupYPos = 0;
nsIFrame* childFrame = mFrames.FirstChild();
nsIFrame* firstRowGroupFrame = nsnull;
while (nsnull != childFrame) {
const nsStyleDisplay* childDisplay;
childFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)childDisplay));
if (IsRowGroup(childDisplay->mDisplay)) {
if (((nsTableRowGroupFrame*)childFrame)->RowGroupReceivesExcessSpace()) {
((nsTableRowGroupFrame*)childFrame)->GetHeightOfRows(aPresContext, sumOfRowHeights);
}
if (!firstRowGroupFrame) {
// the first row group's y position starts inside our padding
const nsStyleSpacing* spacing =
(const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing);
nsMargin margin(0,0,0,0);
if (spacing->GetBorder(margin)) { // XXX see bug 10636 and handle percentages
rowGroupYPos = margin.top;
}
if (spacing->GetPadding(margin)) { // XXX see bug 10636 and handle percentages
rowGroupYPos += margin.top;
}
firstRowGroupFrame = childFrame;
}
}
childFrame->GetNextSibling(&childFrame);
}
childFrame = mFrames.FirstChild();
while (childFrame) {
const nsStyleDisplay* childDisplay;
childFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)childDisplay));
if (IsRowGroup(childDisplay->mDisplay)) {
if (((nsTableRowGroupFrame*)childFrame)->RowGroupReceivesExcessSpace()) {
nscoord excessForGroup = 0;
const nsStyleTable* tableStyle;
GetStyleData(eStyleStruct_Table, (const nsStyleStruct *&)tableStyle);
DistributeSpaceToRows(aPresContext, aReflowState, childFrame, sumOfRowHeights,
excess, tableStyle, excessForGroup, rowGroupYPos);
// Make sure child views are properly positioned
nsIView* view;
childFrame->GetView(aPresContext, &view);
if (view) {
nsContainerFrame::PositionFrameView(aPresContext, childFrame, view);
} else {
nsContainerFrame::PositionChildViews(aPresContext, childFrame);
if (NS_UNCONSTRAINEDSIZE != aReflowState.availableWidth) {
// proportionately distribute the excess height to each row. Note that we
// don't need to do this if it's an unconstrained reflow
nscoord excess = tableSpecifiedHeight - aDefaultHeight;
nscoord sumOfRowHeights = 0;
nscoord rowGroupYPos = 0;
nsIFrame* childFrame = mFrames.FirstChild();
nsIFrame* firstRowGroupFrame = nsnull;
while (nsnull != childFrame) {
const nsStyleDisplay* childDisplay;
childFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)childDisplay));
if (IsRowGroup(childDisplay->mDisplay)) {
if (((nsTableRowGroupFrame*)childFrame)->RowGroupReceivesExcessSpace()) {
((nsTableRowGroupFrame*)childFrame)->GetHeightOfRows(aPresContext, sumOfRowHeights);
}
if (!firstRowGroupFrame) {
// the first row group's y position starts inside our padding
const nsStyleSpacing* spacing =
(const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing);
nsMargin margin(0,0,0,0);
if (spacing->GetBorder(margin)) { // XXX see bug 10636 and handle percentages
rowGroupYPos = margin.top;
}
if (spacing->GetPadding(margin)) { // XXX see bug 10636 and handle percentages
rowGroupYPos += margin.top;
}
firstRowGroupFrame = childFrame;
}
}
else {
nsRect rowGroupRect;
childFrame->GetRect(rowGroupRect);
rowGroupYPos += rowGroupRect.height;
}
childFrame->GetNextSibling(&childFrame);
}
childFrame = mFrames.FirstChild();
while (childFrame) {
const nsStyleDisplay* childDisplay;
childFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)childDisplay));
if (IsRowGroup(childDisplay->mDisplay)) {
if (((nsTableRowGroupFrame*)childFrame)->RowGroupReceivesExcessSpace()) {
nscoord excessForGroup = 0;
const nsStyleTable* tableStyle;
GetStyleData(eStyleStruct_Table, (const nsStyleStruct *&)tableStyle);
DistributeSpaceToRows(aPresContext, aReflowState, childFrame, sumOfRowHeights,
excess, tableStyle, excessForGroup, rowGroupYPos);
// Make sure child views are properly positioned
nsIView* view;
childFrame->GetView(aPresContext, &view);
if (view) {
nsContainerFrame::PositionFrameView(aPresContext, childFrame, view);
} else {
nsContainerFrame::PositionChildViews(aPresContext, childFrame);
}
}
else {
nsRect rowGroupRect;
childFrame->GetRect(rowGroupRect);
rowGroupYPos += rowGroupRect.height;
}
}
childFrame->GetNextSibling(&childFrame);
}
childFrame->GetNextSibling(&childFrame);
}
}
}

View File

@ -817,11 +817,13 @@ void nsTableRowGroupFrame::CalculateRowHeights(nsIPresContext* aPresContext,
rowFrame = GetFirstFrame();
rowIndex = 0;
while (rowFrame) {
nsCOMPtr<nsIAtom> rowType;
rowFrame->GetFrameType(getter_AddRefs(rowType));
if (nsLayoutAtoms::tableRowFrame == rowType.get()) {
// Notify the row of the new size
((nsTableRowFrame *)rowFrame)->DidResize(aPresContext, aReflowState);
if (NS_UNCONSTRAINEDSIZE != aReflowState.availableWidth) {
nsCOMPtr<nsIAtom> rowType;
rowFrame->GetFrameType(getter_AddRefs(rowType));
if (nsLayoutAtoms::tableRowFrame == rowType.get()) {
// Notify the row of the new size
((nsTableRowFrame *)rowFrame)->DidResize(aPresContext, aReflowState);
}
}
// Update the running row group height. The height includes frames that
@ -1121,7 +1123,15 @@ nsTableRowGroupFrame::Reflow(nsIPresContext* aPresContext,
}
// shrink wrap rows to height of tallest cell in that row
if (eReflowReason_Initial != aReflowState.reason) {
PRBool isTableUnconstrainedReflow = NS_UNCONSTRAINEDSIZE ==
aReflowState.parentReflowState->availableWidth;
// Skip this step if possible. We can skip it if the table is going to be
// doing a pass 2 reflow. In the case where the table is getting an unconstrained
// reflow, then we need to do this because the table will skip the pass 2 reflow,
// but we need to correctly calculate the row group height and we can't if there
// are row spans unless we do this step
if ((eReflowReason_Initial != aReflowState.reason) || isTableUnconstrainedReflow) {
CalculateRowHeights(aPresContext, aDesiredSize, aReflowState);
}

View File

@ -1559,36 +1559,47 @@ NS_METHOD nsTableFrame::Reflow(nsIPresContext* aPresContext,
SetTableWidth(aPresContext);
}
// Constrain our reflow width to the computed table width. Note: this is based
// on the width of the first-in-flow
nsHTMLReflowState reflowState(aReflowState);
PRInt32 pass1Width = mRect.width;
if (mPrevInFlow) {
nsTableFrame* table = (nsTableFrame*)GetFirstInFlow();
pass1Width = table->mRect.width;
}
reflowState.availableWidth = pass1Width;
if (pass1MaxElementSize) {
// we already have the max element size, so don't request it during pass2
aDesiredSize.maxElementSize = nsnull;
}
rv = ResizeReflowPass2(aPresContext, aDesiredSize, reflowState, aStatus);
if (NS_FAILED(rv)) {
return rv;
}
aDesiredSize.width = PR_MIN(aDesiredSize.width, pass1Width);
if ((eReflowReason_Initial == aReflowState.reason) &&
(NS_UNCONSTRAINEDSIZE == aReflowState.availableWidth)) {
// Don't bother doing a pass2 reflow. Use our pass1 width as our
// desired width
aDesiredSize.width = mRect.width;
// If this is an incremental reflow and we're here that means we had to
// reflow all the rows, e.g., the column widths changed. We need to make
// sure that any damaged areas are repainted
if (eReflowReason_Incremental == aReflowState.reason) {
nsRect damageRect;
} else {
nscoord pass1Height = aDesiredSize.height;
damageRect.x = 0;
damageRect.y = 0;
damageRect.width = mRect.width;
damageRect.height = mRect.height;
Invalidate(aPresContext, damageRect);
// Constrain our reflow width to the computed table width. Note: this is based
// on the width of the first-in-flow
nsHTMLReflowState reflowState(aReflowState);
PRInt32 pass1Width = mRect.width;
if (mPrevInFlow) {
nsTableFrame* table = (nsTableFrame*)GetFirstInFlow();
pass1Width = table->mRect.width;
}
reflowState.availableWidth = pass1Width;
if (pass1MaxElementSize) {
// we already have the max element size, so don't request it during pass2
aDesiredSize.maxElementSize = nsnull;
}
rv = ResizeReflowPass2(aPresContext, aDesiredSize, reflowState, aStatus);
if (NS_FAILED(rv)) {
return rv;
}
aDesiredSize.width = PR_MIN(aDesiredSize.width, pass1Width);
// If this is an incremental reflow and we're here that means we had to
// reflow all the rows, e.g., the column widths changed. We need to make
// sure that any damaged areas are repainted
if (eReflowReason_Incremental == aReflowState.reason) {
nsRect damageRect;
damageRect.x = 0;
damageRect.y = 0;
damageRect.width = mRect.width;
damageRect.height = mRect.height;
Invalidate(aPresContext, damageRect);
}
}
}
else {
@ -1703,16 +1714,31 @@ NS_METHOD nsTableFrame::ResizeReflowPass1(nsIPresContext* aPresContext,
kidFrame->DidReflow(aPresContext, NS_FRAME_REFLOW_FINISHED);
continue;
}
// Get the row group's border padding
nsMargin borderPadding;
GetTableBorderForRowGroup(GetRowGroupFrameFor(kidFrame, childDisplay), borderPadding);
const nsStyleSpacing* tableSpacing;
GetStyleData(eStyleStruct_Spacing, ((const nsStyleStruct *&)tableSpacing));
nsMargin padding;
tableSpacing->GetPadding(padding);
borderPadding += padding;
// Reflow the child
nsHTMLReflowState kidReflowState(aPresContext, aReflowState, kidFrame,
availSize, aReason);
// Note: we don't bother checking here for whether we should clear the
// isTopOfPage reflow state flag, because we're dealing with an unconstrained
// height and it isn't an issue...
ReflowChild(kidFrame, aPresContext, kidSize, kidReflowState, 0, 0, 0, aStatus);
ReflowChild(kidFrame, aPresContext, kidSize, kidReflowState, borderPadding.left,
borderPadding.top + y, 0, aStatus);
// Place the child since some of its content fit in us.
FinishReflowChild(kidFrame, aPresContext, kidSize, 0, 0, 0);
FinishReflowChild(kidFrame, aPresContext, kidSize, borderPadding.left,
borderPadding.top + y, 0);
if (NS_UNCONSTRAINEDSIZE==kidSize.height)
// XXX This is very suspicious. Why would a row group frame want
// such a large height?
y = NS_UNCONSTRAINEDSIZE;
else
y += kidSize.height;
@ -1746,7 +1772,18 @@ NS_METHOD nsTableFrame::ResizeReflowPass1(nsIPresContext* aPresContext,
}
}
// Get the table's border/padding
const nsStyleSpacing* mySpacing = (const nsStyleSpacing*)
mStyleContext->GetStyleData(eStyleStruct_Spacing);
nsMargin tableBorderPadding;
GetTableBorder (tableBorderPadding); // this gets the max border thickness at each edge
nsMargin tablePadding;
mySpacing->GetPadding(tablePadding);
tableBorderPadding += tablePadding;
aDesiredSize.width = kidSize.width;
nscoord defaultHeight = y + tableBorderPadding.top + tableBorderPadding.bottom;
aDesiredSize.height = ComputeDesiredHeight(aPresContext, aReflowState, defaultHeight);
mBits.mFirstPassValid = PR_TRUE;
return rv;
@ -3447,66 +3484,70 @@ nscoord nsTableFrame::ComputeDesiredHeight(nsIPresContext* aPresContext
nscoord tableSpecifiedHeight = CalcBorderBoxHeight(aReflowState, PR_TRUE);
if ((tableSpecifiedHeight > 0) && (tableSpecifiedHeight != NS_UNCONSTRAINEDSIZE)) {
if (tableSpecifiedHeight > aDefaultHeight) {
// proportionately distribute the excess height to each row
if (tableSpecifiedHeight > aDefaultHeight) {
result = tableSpecifiedHeight;
nscoord excess = tableSpecifiedHeight - aDefaultHeight;
nscoord sumOfRowHeights = 0;
nscoord rowGroupYPos = 0;
nsIFrame* childFrame = mFrames.FirstChild();
nsIFrame* firstRowGroupFrame = nsnull;
while (nsnull != childFrame) {
const nsStyleDisplay* childDisplay;
childFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)childDisplay));
if (IsRowGroup(childDisplay->mDisplay)) {
if (((nsTableRowGroupFrame*)childFrame)->RowGroupReceivesExcessSpace()) {
((nsTableRowGroupFrame*)childFrame)->GetHeightOfRows(aPresContext, sumOfRowHeights);
}
if (!firstRowGroupFrame) {
// the first row group's y position starts inside our padding
const nsStyleSpacing* spacing =
(const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing);
nsMargin margin(0,0,0,0);
if (spacing->GetBorder(margin)) { // XXX see bug 10636 and handle percentages
rowGroupYPos = margin.top;
}
if (spacing->GetPadding(margin)) { // XXX see bug 10636 and handle percentages
rowGroupYPos += margin.top;
}
firstRowGroupFrame = childFrame;
}
}
childFrame->GetNextSibling(&childFrame);
}
childFrame = mFrames.FirstChild();
while (childFrame) {
const nsStyleDisplay* childDisplay;
childFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)childDisplay));
if (IsRowGroup(childDisplay->mDisplay)) {
if (((nsTableRowGroupFrame*)childFrame)->RowGroupReceivesExcessSpace()) {
nscoord excessForGroup = 0;
const nsStyleTable* tableStyle;
GetStyleData(eStyleStruct_Table, (const nsStyleStruct *&)tableStyle);
DistributeSpaceToRows(aPresContext, aReflowState, childFrame, sumOfRowHeights,
excess, tableStyle, excessForGroup, rowGroupYPos);
// Make sure child views are properly positioned
nsIView* view;
childFrame->GetView(aPresContext, &view);
if (view) {
nsContainerFrame::PositionFrameView(aPresContext, childFrame, view);
} else {
nsContainerFrame::PositionChildViews(aPresContext, childFrame);
if (NS_UNCONSTRAINEDSIZE != aReflowState.availableWidth) {
// proportionately distribute the excess height to each row. Note that we
// don't need to do this if it's an unconstrained reflow
nscoord excess = tableSpecifiedHeight - aDefaultHeight;
nscoord sumOfRowHeights = 0;
nscoord rowGroupYPos = 0;
nsIFrame* childFrame = mFrames.FirstChild();
nsIFrame* firstRowGroupFrame = nsnull;
while (nsnull != childFrame) {
const nsStyleDisplay* childDisplay;
childFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)childDisplay));
if (IsRowGroup(childDisplay->mDisplay)) {
if (((nsTableRowGroupFrame*)childFrame)->RowGroupReceivesExcessSpace()) {
((nsTableRowGroupFrame*)childFrame)->GetHeightOfRows(aPresContext, sumOfRowHeights);
}
if (!firstRowGroupFrame) {
// the first row group's y position starts inside our padding
const nsStyleSpacing* spacing =
(const nsStyleSpacing*)mStyleContext->GetStyleData(eStyleStruct_Spacing);
nsMargin margin(0,0,0,0);
if (spacing->GetBorder(margin)) { // XXX see bug 10636 and handle percentages
rowGroupYPos = margin.top;
}
if (spacing->GetPadding(margin)) { // XXX see bug 10636 and handle percentages
rowGroupYPos += margin.top;
}
firstRowGroupFrame = childFrame;
}
}
else {
nsRect rowGroupRect;
childFrame->GetRect(rowGroupRect);
rowGroupYPos += rowGroupRect.height;
}
childFrame->GetNextSibling(&childFrame);
}
childFrame = mFrames.FirstChild();
while (childFrame) {
const nsStyleDisplay* childDisplay;
childFrame->GetStyleData(eStyleStruct_Display, ((const nsStyleStruct *&)childDisplay));
if (IsRowGroup(childDisplay->mDisplay)) {
if (((nsTableRowGroupFrame*)childFrame)->RowGroupReceivesExcessSpace()) {
nscoord excessForGroup = 0;
const nsStyleTable* tableStyle;
GetStyleData(eStyleStruct_Table, (const nsStyleStruct *&)tableStyle);
DistributeSpaceToRows(aPresContext, aReflowState, childFrame, sumOfRowHeights,
excess, tableStyle, excessForGroup, rowGroupYPos);
// Make sure child views are properly positioned
nsIView* view;
childFrame->GetView(aPresContext, &view);
if (view) {
nsContainerFrame::PositionFrameView(aPresContext, childFrame, view);
} else {
nsContainerFrame::PositionChildViews(aPresContext, childFrame);
}
}
else {
nsRect rowGroupRect;
childFrame->GetRect(rowGroupRect);
rowGroupYPos += rowGroupRect.height;
}
}
childFrame->GetNextSibling(&childFrame);
}
childFrame->GetNextSibling(&childFrame);
}
}
}

View File

@ -817,11 +817,13 @@ void nsTableRowGroupFrame::CalculateRowHeights(nsIPresContext* aPresContext,
rowFrame = GetFirstFrame();
rowIndex = 0;
while (rowFrame) {
nsCOMPtr<nsIAtom> rowType;
rowFrame->GetFrameType(getter_AddRefs(rowType));
if (nsLayoutAtoms::tableRowFrame == rowType.get()) {
// Notify the row of the new size
((nsTableRowFrame *)rowFrame)->DidResize(aPresContext, aReflowState);
if (NS_UNCONSTRAINEDSIZE != aReflowState.availableWidth) {
nsCOMPtr<nsIAtom> rowType;
rowFrame->GetFrameType(getter_AddRefs(rowType));
if (nsLayoutAtoms::tableRowFrame == rowType.get()) {
// Notify the row of the new size
((nsTableRowFrame *)rowFrame)->DidResize(aPresContext, aReflowState);
}
}
// Update the running row group height. The height includes frames that
@ -1121,7 +1123,15 @@ nsTableRowGroupFrame::Reflow(nsIPresContext* aPresContext,
}
// shrink wrap rows to height of tallest cell in that row
if (eReflowReason_Initial != aReflowState.reason) {
PRBool isTableUnconstrainedReflow = NS_UNCONSTRAINEDSIZE ==
aReflowState.parentReflowState->availableWidth;
// Skip this step if possible. We can skip it if the table is going to be
// doing a pass 2 reflow. In the case where the table is getting an unconstrained
// reflow, then we need to do this because the table will skip the pass 2 reflow,
// but we need to correctly calculate the row group height and we can't if there
// are row spans unless we do this step
if ((eReflowReason_Initial != aReflowState.reason) || isTableUnconstrainedReflow) {
CalculateRowHeights(aPresContext, aDesiredSize, aReflowState);
}