more peformance work on test case of bug 60494. Removed redundant calls to recompute colspan widths. Added more debug reflow timing code. r=peterl.

This commit is contained in:
karnaze%netscape.com 2001-02-01 02:29:14 +00:00
Родитель 98781a0f2c
Коммит db74b1ba8a
6 изменённых файлов: 266 добавлений и 40 удалений

Просмотреть файл

@ -484,6 +484,9 @@ BasicTableLayoutStrategy::ComputeNonPctColspanWidths(const nsHTMLReflowState& aR
PRBool aConsiderPct,
float aPixelToTwips)
{
#ifdef DEBUG_TABLE_REFLOW_TIMING
nsTableFrame::DebugTimeNonPctColspans(*mTableFrame, (nsHTMLReflowState&)aReflowState, PR_TRUE);
#endif
PRInt32 numCols = mTableFrame->GetColCount();
// zero out prior ADJ values
@ -549,6 +552,9 @@ BasicTableLayoutStrategy::ComputeNonPctColspanWidths(const nsHTMLReflowState& aR
}
}
}
#ifdef DEBUG_TABLE_REFLOW_TIMING
nsTableFrame::DebugTimeNonPctColspans(*mTableFrame, (nsHTMLReflowState&)aReflowState, PR_FALSE);
#endif
}
#ifdef DEBUG
@ -843,6 +849,9 @@ BasicTableLayoutStrategy::AssignNonPctColumnWidths(nsIPresContext* aPre
const nsHTMLReflowState& aReflowState,
float aPixelToTwips)
{
#ifdef DEBUG_TABLE_REFLOW_TIMING
nsTableFrame::DebugTimeNonPctCols(*mTableFrame, (nsHTMLReflowState&)aReflowState, PR_TRUE);
#endif
if (gsDebugAssign) {printf("AssignNonPctColWidths en max=%d count=%d \n", aMaxWidth, gsDebugCount++); mTableFrame->Dump(aPresContext, PR_FALSE, PR_TRUE, PR_FALSE);}
PRBool rv = PR_FALSE;
PRInt32 numRows = mTableFrame->GetRowCount();
@ -1028,6 +1037,9 @@ BasicTableLayoutStrategy::AssignNonPctColumnWidths(nsIPresContext* aPre
}
if (gsDebugAssign) {printf("AssignNonPctColWidths ex\n"); mTableFrame->Dump(aPresContext, PR_FALSE, PR_TRUE, PR_FALSE);}
#ifdef DEBUG_TABLE_REFLOW_TIMING
nsTableFrame::DebugTimeNonPctCols(*mTableFrame, (nsHTMLReflowState&)aReflowState, PR_FALSE);
#endif
return rv;
}
@ -1064,6 +1076,9 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
PRBool aTableIsAutoWidth,
float aPixelToTwips)
{
#ifdef DEBUG_TABLE_REFLOW_TIMING
nsTableFrame::DebugTimePctCols(*mTableFrame, (nsHTMLReflowState&)aReflowState, PR_TRUE);
#endif
mTableFrame->SetHasCellSpanningPctCol(PR_FALSE); // this gets refigured below
PRInt32 numRows = mTableFrame->GetRowCount();
PRInt32 numCols = mTableFrame->GetColCount(); // consider cols at end without orig cells
@ -1250,8 +1265,9 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
// check to see if a cell spans a percentage col. This will cause the MIN_ADJ,
// FIX_ADJ, and DES_ADJ values to be recomputed
for (colX = 0; colX < numCols; colX++) {
for (rowX = 0; rowX < numRows; rowX++) {
PRBool done = PR_FALSE;
for (colX = 0; (colX < numCols) && !done; colX++) {
for (rowX = 0; (rowX < numRows) && !done; rowX++) {
PRBool originates;
PRInt32 colSpan;
nsTableCellFrame* cellFrame = mTableFrame->GetCellInfoAt(rowX, colX, &originates, &colSpan);
@ -1259,13 +1275,14 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
continue;
}
// determine if the cell spans cols which have a pct value
for (PRInt32 spanX = 0; spanX < colSpan; spanX++) {
for (PRInt32 spanX = 0; (spanX < colSpan) && !done; 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
ComputeNonPctColspanWidths(aReflowState, PR_TRUE, aPixelToTwips);
done = PR_TRUE;
break;
}
}
@ -1362,6 +1379,9 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
ReduceOverSpecifiedPctCols(NSToCoordRound(((float)(colPctTotal - 100)) * 0.01f * (float)basis));
}
#ifdef DEBUG_TABLE_REFLOW_TIMING
nsTableFrame::DebugTimePctCols(*mTableFrame, (nsHTMLReflowState&)aReflowState, PR_FALSE);
#endif
return basis;
}

Просмотреть файл

@ -170,6 +170,12 @@ nsTableFrame::nsTableFrame()
#endif
#ifdef DEBUG_TABLE_REFLOW_TIMING
mTimer = new nsReflowTimer(this);
nsReflowTimer* timer = new nsReflowTimer(this);
mTimer->mNextSibling = timer;
timer = new nsReflowTimer(this);
mTimer->mNextSibling->mNextSibling = timer;
timer = new nsReflowTimer(this);
mTimer->mNextSibling->mNextSibling->mNextSibling = timer;
#endif
}
@ -4625,13 +4631,16 @@ void PrettyUC(nscoord aSize,
}
}
void GetFrameTypeName(nsIAtom* aFrameType,
char* aName)
PRBool GetFrameTypeName(nsIAtom* aFrameType,
char* aName)
{
PRBool isTable = PR_FALSE;
if (nsLayoutAtoms::tableOuterFrame == aFrameType)
strcpy(aName, "Tbl");
else if (nsLayoutAtoms::tableFrame == aFrameType)
else if (nsLayoutAtoms::tableFrame == aFrameType) {
strcpy(aName, "Tbl");
isTable = PR_TRUE;
}
else if (nsLayoutAtoms::tableRowGroupFrame == aFrameType)
strcpy(aName, "RowG");
else if (nsLayoutAtoms::tableRowFrame == aFrameType)
@ -4642,6 +4651,8 @@ void GetFrameTypeName(nsIAtom* aFrameType,
strcpy(aName, "Block");
else
NS_ASSERTION(PR_FALSE, "invalid call to GetFrameTypeName");
return isTable;
}
#ifdef DEBUG_TABLE_REFLOW
@ -4750,6 +4761,15 @@ nsReflowTimer* GetFrameTimer(nsIFrame* aFrame,
return nsnull;
}
void DebugReflowPrintAuxTimer(char* aMes,
nsReflowTimer* aTimer)
{
printf("%s %dms", aMes, aTimer->Elapsed());
if (aTimer->mNumStarts > 1) {
printf(" times=%d", aTimer->mNumStarts);
}
}
void DebugReflowPrint(nsReflowTimer& aTimer,
PRUint32 aLevel,
PRBool aSummary)
@ -4762,12 +4782,18 @@ void DebugReflowPrint(nsReflowTimer& aTimer,
// get the frame type
char fName[128];
GetFrameTypeName(aTimer.mFrameType, fName);
PRBool isTable = GetFrameTypeName(aTimer.mFrameType, fName);
// print the timer
printf("\n%s%s %dms %p", indentChar, fName, aTimer.Elapsed(), aTimer.mFrame);
if (aSummary) {
printf(" times=%d", aTimer.mNumStarts);
if (isTable) {
printf("\n%s", indentChar);
DebugReflowPrintAuxTimer("nonPctCols", aTimer.mNextSibling);
DebugReflowPrintAuxTimer(" nonPctColspans", aTimer.mNextSibling->mNextSibling);
DebugReflowPrintAuxTimer(" pctCols", aTimer.mNextSibling->mNextSibling->mNextSibling);
}
}
else {
char avWidth[16];
@ -4794,6 +4820,12 @@ void DebugReflowPrint(nsReflowTimer& aTimer,
printf(" status=%d", aTimer.mStatus);
}
printf(" cnt=%d", aTimer.mCount);
if (isTable) {
printf("\n%s", indentChar);
DebugReflowPrintAuxTimer("nonPctCols", aTimer.mNextSibling);
DebugReflowPrintAuxTimer(" nonPctColspans", aTimer.mNextSibling->mNextSibling);
DebugReflowPrintAuxTimer(" pctCols", aTimer.mNextSibling->mNextSibling->mNextSibling);
}
}
// print the timer's children
nsVoidArray& children = aTimer.mChildren;
@ -4824,16 +4856,15 @@ void nsTableFrame::DebugReflow(nsIFrame* aFrame,
nsCOMPtr<nsIAtom> frameType = nsnull;
aFrame->GetFrameType(getter_AddRefs(frameType));
nsReflowTimer* frameTimer = GetFrameTimer(aFrame, frameType.get());
if (!frameTimer) {
NS_ASSERTION(PR_FALSE, "no frame timer");
return;
}
if (!frameTimer) {NS_ASSERTION(PR_FALSE, "no frame timer");return;}
if (!aMetrics) { // start
// create the reflow timer
nsReflowTimer* timer = new nsReflowTimer(aFrame);
if (!timer) {
NS_ASSERTION(PR_FALSE, "could not create timer");
return;
// create the aux table timers if they don't exist
if ((nsLayoutAtoms::tableFrame == frameType.get()) && !timer->mNextSibling) {
timer->mNextSibling = new nsReflowTimer(aFrame);
timer->mNextSibling->mNextSibling = new nsReflowTimer(aFrame);
timer->mNextSibling->mNextSibling->mNextSibling = new nsReflowTimer(aFrame);
}
timer->mReason = aState.reason;
timer->mAvailWidth = aState.availableWidth;
@ -4861,17 +4892,59 @@ void nsTableFrame::DebugReflow(nsIFrame* aFrame,
? aMetrics->mMaximumWidth : -1;
timer->mStatus = aStatus;
}
else {
NS_ASSERTION(PR_FALSE, "bad DebugTimeReflow");
return;
}
else {NS_ASSERTION(PR_FALSE, "bad DebugTimeReflow");return;}
// stop the frame summary timer
frameTimer->Stop();
if (!parentTimer) {
// print out all of the reflow timers
DebugReflowPrint(*timer, 0, PR_FALSE);
timer->Destroy();
}
// stop the frame summary timer
frameTimer->Stop();
}
}
void nsTableFrame::DebugTimeNonPctCols(nsTableFrame& aFrame,
nsHTMLReflowState& aState,
PRBool aStart)
{
nsReflowTimer* timer = (nsReflowTimer*)aState.mDebugHook;
if (aStart) {
timer->mNextSibling->Start();
aFrame.mTimer->mNextSibling->Start();
}
else {
timer->mNextSibling->Stop();
aFrame.mTimer->mNextSibling->Stop();
}
}
void nsTableFrame::DebugTimeNonPctColspans(nsTableFrame& aFrame,
nsHTMLReflowState& aState,
PRBool aStart)
{
nsReflowTimer* timer = (nsReflowTimer*)aState.mDebugHook;
if (aStart) {
timer->mNextSibling->mNextSibling->Start();
aFrame.mTimer->mNextSibling->mNextSibling->Start();
}
else {
timer->mNextSibling->mNextSibling->Stop();
aFrame.mTimer->mNextSibling->mNextSibling->Stop();
}
}
void nsTableFrame::DebugTimePctCols(nsTableFrame& aFrame,
nsHTMLReflowState& aState,
PRBool aStart)
{
nsReflowTimer* timer = (nsReflowTimer*)aState.mDebugHook;
if (aStart) {
timer->mNextSibling->mNextSibling->mNextSibling->Start();
aFrame.mTimer->mNextSibling->mNextSibling->mNextSibling->Start();
}
else {
timer->mNextSibling->mNextSibling->mNextSibling->Stop();
aFrame.mTimer->mNextSibling->mNextSibling->mNextSibling->Stop();
}
}

Просмотреть файл

@ -55,6 +55,7 @@ class nsReflowTimer
public:
nsReflowTimer(nsIFrame* aFrame) {
mFrame = aFrame;
mNextSibling = nsnull;
aFrame->GetFrameType(&mFrameType);
Reset();
}
@ -65,6 +66,11 @@ public:
((nsReflowTimer*)mChildren.ElementAt(childX))->Destroy();
}
NS_IF_RELEASE(mFrameType);
if (mNextSibling) { // table frames have 3 auxillary timers
delete mNextSibling->mNextSibling->mNextSibling;
delete mNextSibling->mNextSibling;
delete mNextSibling;
}
delete this;
}
@ -119,6 +125,7 @@ public:
nscoord mDesiredWidth;
nscoord mDesiredHeight;
nsReflowStatus mStatus;
nsReflowTimer* mNextSibling;
private:
~nsReflowTimer() {}
@ -943,9 +950,22 @@ public:
nsHTMLReflowState& aReflowState,
nsHTMLReflowMetrics* aMetrics = nsnull,
nsReflowStatus aStatus = NS_FRAME_COMPLETE);
#ifdef DEBUG_TABLE_REFLOW_TIMING
static void DebugReflowDone(nsIFrame* aFrame);
static void DebugTimePctCols(nsTableFrame& aFrame,
nsHTMLReflowState& aReflowState,
PRBool aStart);
static void DebugTimeNonPctCols(nsTableFrame& aFrame,
nsHTMLReflowState& aReflowState,
PRBool aStart);
static void DebugTimeNonPctColspans(nsTableFrame& aFrame,
nsHTMLReflowState& aReflowState,
PRBool aStart);
nsReflowTimer* mTimer;
#endif
#endif

Просмотреть файл

@ -484,6 +484,9 @@ BasicTableLayoutStrategy::ComputeNonPctColspanWidths(const nsHTMLReflowState& aR
PRBool aConsiderPct,
float aPixelToTwips)
{
#ifdef DEBUG_TABLE_REFLOW_TIMING
nsTableFrame::DebugTimeNonPctColspans(*mTableFrame, (nsHTMLReflowState&)aReflowState, PR_TRUE);
#endif
PRInt32 numCols = mTableFrame->GetColCount();
// zero out prior ADJ values
@ -549,6 +552,9 @@ BasicTableLayoutStrategy::ComputeNonPctColspanWidths(const nsHTMLReflowState& aR
}
}
}
#ifdef DEBUG_TABLE_REFLOW_TIMING
nsTableFrame::DebugTimeNonPctColspans(*mTableFrame, (nsHTMLReflowState&)aReflowState, PR_FALSE);
#endif
}
#ifdef DEBUG
@ -843,6 +849,9 @@ BasicTableLayoutStrategy::AssignNonPctColumnWidths(nsIPresContext* aPre
const nsHTMLReflowState& aReflowState,
float aPixelToTwips)
{
#ifdef DEBUG_TABLE_REFLOW_TIMING
nsTableFrame::DebugTimeNonPctCols(*mTableFrame, (nsHTMLReflowState&)aReflowState, PR_TRUE);
#endif
if (gsDebugAssign) {printf("AssignNonPctColWidths en max=%d count=%d \n", aMaxWidth, gsDebugCount++); mTableFrame->Dump(aPresContext, PR_FALSE, PR_TRUE, PR_FALSE);}
PRBool rv = PR_FALSE;
PRInt32 numRows = mTableFrame->GetRowCount();
@ -1028,6 +1037,9 @@ BasicTableLayoutStrategy::AssignNonPctColumnWidths(nsIPresContext* aPre
}
if (gsDebugAssign) {printf("AssignNonPctColWidths ex\n"); mTableFrame->Dump(aPresContext, PR_FALSE, PR_TRUE, PR_FALSE);}
#ifdef DEBUG_TABLE_REFLOW_TIMING
nsTableFrame::DebugTimeNonPctCols(*mTableFrame, (nsHTMLReflowState&)aReflowState, PR_FALSE);
#endif
return rv;
}
@ -1064,6 +1076,9 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
PRBool aTableIsAutoWidth,
float aPixelToTwips)
{
#ifdef DEBUG_TABLE_REFLOW_TIMING
nsTableFrame::DebugTimePctCols(*mTableFrame, (nsHTMLReflowState&)aReflowState, PR_TRUE);
#endif
mTableFrame->SetHasCellSpanningPctCol(PR_FALSE); // this gets refigured below
PRInt32 numRows = mTableFrame->GetRowCount();
PRInt32 numCols = mTableFrame->GetColCount(); // consider cols at end without orig cells
@ -1250,8 +1265,9 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
// check to see if a cell spans a percentage col. This will cause the MIN_ADJ,
// FIX_ADJ, and DES_ADJ values to be recomputed
for (colX = 0; colX < numCols; colX++) {
for (rowX = 0; rowX < numRows; rowX++) {
PRBool done = PR_FALSE;
for (colX = 0; (colX < numCols) && !done; colX++) {
for (rowX = 0; (rowX < numRows) && !done; rowX++) {
PRBool originates;
PRInt32 colSpan;
nsTableCellFrame* cellFrame = mTableFrame->GetCellInfoAt(rowX, colX, &originates, &colSpan);
@ -1259,13 +1275,14 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
continue;
}
// determine if the cell spans cols which have a pct value
for (PRInt32 spanX = 0; spanX < colSpan; spanX++) {
for (PRInt32 spanX = 0; (spanX < colSpan) && !done; 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
ComputeNonPctColspanWidths(aReflowState, PR_TRUE, aPixelToTwips);
done = PR_TRUE;
break;
}
}
@ -1362,6 +1379,9 @@ BasicTableLayoutStrategy::AssignPctColumnWidths(const nsHTMLReflowState aReflowS
ReduceOverSpecifiedPctCols(NSToCoordRound(((float)(colPctTotal - 100)) * 0.01f * (float)basis));
}
#ifdef DEBUG_TABLE_REFLOW_TIMING
nsTableFrame::DebugTimePctCols(*mTableFrame, (nsHTMLReflowState&)aReflowState, PR_FALSE);
#endif
return basis;
}

Просмотреть файл

@ -170,6 +170,12 @@ nsTableFrame::nsTableFrame()
#endif
#ifdef DEBUG_TABLE_REFLOW_TIMING
mTimer = new nsReflowTimer(this);
nsReflowTimer* timer = new nsReflowTimer(this);
mTimer->mNextSibling = timer;
timer = new nsReflowTimer(this);
mTimer->mNextSibling->mNextSibling = timer;
timer = new nsReflowTimer(this);
mTimer->mNextSibling->mNextSibling->mNextSibling = timer;
#endif
}
@ -4625,13 +4631,16 @@ void PrettyUC(nscoord aSize,
}
}
void GetFrameTypeName(nsIAtom* aFrameType,
char* aName)
PRBool GetFrameTypeName(nsIAtom* aFrameType,
char* aName)
{
PRBool isTable = PR_FALSE;
if (nsLayoutAtoms::tableOuterFrame == aFrameType)
strcpy(aName, "Tbl");
else if (nsLayoutAtoms::tableFrame == aFrameType)
else if (nsLayoutAtoms::tableFrame == aFrameType) {
strcpy(aName, "Tbl");
isTable = PR_TRUE;
}
else if (nsLayoutAtoms::tableRowGroupFrame == aFrameType)
strcpy(aName, "RowG");
else if (nsLayoutAtoms::tableRowFrame == aFrameType)
@ -4642,6 +4651,8 @@ void GetFrameTypeName(nsIAtom* aFrameType,
strcpy(aName, "Block");
else
NS_ASSERTION(PR_FALSE, "invalid call to GetFrameTypeName");
return isTable;
}
#ifdef DEBUG_TABLE_REFLOW
@ -4750,6 +4761,15 @@ nsReflowTimer* GetFrameTimer(nsIFrame* aFrame,
return nsnull;
}
void DebugReflowPrintAuxTimer(char* aMes,
nsReflowTimer* aTimer)
{
printf("%s %dms", aMes, aTimer->Elapsed());
if (aTimer->mNumStarts > 1) {
printf(" times=%d", aTimer->mNumStarts);
}
}
void DebugReflowPrint(nsReflowTimer& aTimer,
PRUint32 aLevel,
PRBool aSummary)
@ -4762,12 +4782,18 @@ void DebugReflowPrint(nsReflowTimer& aTimer,
// get the frame type
char fName[128];
GetFrameTypeName(aTimer.mFrameType, fName);
PRBool isTable = GetFrameTypeName(aTimer.mFrameType, fName);
// print the timer
printf("\n%s%s %dms %p", indentChar, fName, aTimer.Elapsed(), aTimer.mFrame);
if (aSummary) {
printf(" times=%d", aTimer.mNumStarts);
if (isTable) {
printf("\n%s", indentChar);
DebugReflowPrintAuxTimer("nonPctCols", aTimer.mNextSibling);
DebugReflowPrintAuxTimer(" nonPctColspans", aTimer.mNextSibling->mNextSibling);
DebugReflowPrintAuxTimer(" pctCols", aTimer.mNextSibling->mNextSibling->mNextSibling);
}
}
else {
char avWidth[16];
@ -4794,6 +4820,12 @@ void DebugReflowPrint(nsReflowTimer& aTimer,
printf(" status=%d", aTimer.mStatus);
}
printf(" cnt=%d", aTimer.mCount);
if (isTable) {
printf("\n%s", indentChar);
DebugReflowPrintAuxTimer("nonPctCols", aTimer.mNextSibling);
DebugReflowPrintAuxTimer(" nonPctColspans", aTimer.mNextSibling->mNextSibling);
DebugReflowPrintAuxTimer(" pctCols", aTimer.mNextSibling->mNextSibling->mNextSibling);
}
}
// print the timer's children
nsVoidArray& children = aTimer.mChildren;
@ -4824,16 +4856,15 @@ void nsTableFrame::DebugReflow(nsIFrame* aFrame,
nsCOMPtr<nsIAtom> frameType = nsnull;
aFrame->GetFrameType(getter_AddRefs(frameType));
nsReflowTimer* frameTimer = GetFrameTimer(aFrame, frameType.get());
if (!frameTimer) {
NS_ASSERTION(PR_FALSE, "no frame timer");
return;
}
if (!frameTimer) {NS_ASSERTION(PR_FALSE, "no frame timer");return;}
if (!aMetrics) { // start
// create the reflow timer
nsReflowTimer* timer = new nsReflowTimer(aFrame);
if (!timer) {
NS_ASSERTION(PR_FALSE, "could not create timer");
return;
// create the aux table timers if they don't exist
if ((nsLayoutAtoms::tableFrame == frameType.get()) && !timer->mNextSibling) {
timer->mNextSibling = new nsReflowTimer(aFrame);
timer->mNextSibling->mNextSibling = new nsReflowTimer(aFrame);
timer->mNextSibling->mNextSibling->mNextSibling = new nsReflowTimer(aFrame);
}
timer->mReason = aState.reason;
timer->mAvailWidth = aState.availableWidth;
@ -4861,17 +4892,59 @@ void nsTableFrame::DebugReflow(nsIFrame* aFrame,
? aMetrics->mMaximumWidth : -1;
timer->mStatus = aStatus;
}
else {
NS_ASSERTION(PR_FALSE, "bad DebugTimeReflow");
return;
}
else {NS_ASSERTION(PR_FALSE, "bad DebugTimeReflow");return;}
// stop the frame summary timer
frameTimer->Stop();
if (!parentTimer) {
// print out all of the reflow timers
DebugReflowPrint(*timer, 0, PR_FALSE);
timer->Destroy();
}
// stop the frame summary timer
frameTimer->Stop();
}
}
void nsTableFrame::DebugTimeNonPctCols(nsTableFrame& aFrame,
nsHTMLReflowState& aState,
PRBool aStart)
{
nsReflowTimer* timer = (nsReflowTimer*)aState.mDebugHook;
if (aStart) {
timer->mNextSibling->Start();
aFrame.mTimer->mNextSibling->Start();
}
else {
timer->mNextSibling->Stop();
aFrame.mTimer->mNextSibling->Stop();
}
}
void nsTableFrame::DebugTimeNonPctColspans(nsTableFrame& aFrame,
nsHTMLReflowState& aState,
PRBool aStart)
{
nsReflowTimer* timer = (nsReflowTimer*)aState.mDebugHook;
if (aStart) {
timer->mNextSibling->mNextSibling->Start();
aFrame.mTimer->mNextSibling->mNextSibling->Start();
}
else {
timer->mNextSibling->mNextSibling->Stop();
aFrame.mTimer->mNextSibling->mNextSibling->Stop();
}
}
void nsTableFrame::DebugTimePctCols(nsTableFrame& aFrame,
nsHTMLReflowState& aState,
PRBool aStart)
{
nsReflowTimer* timer = (nsReflowTimer*)aState.mDebugHook;
if (aStart) {
timer->mNextSibling->mNextSibling->mNextSibling->Start();
aFrame.mTimer->mNextSibling->mNextSibling->mNextSibling->Start();
}
else {
timer->mNextSibling->mNextSibling->mNextSibling->Stop();
aFrame.mTimer->mNextSibling->mNextSibling->mNextSibling->Stop();
}
}

Просмотреть файл

@ -55,6 +55,7 @@ class nsReflowTimer
public:
nsReflowTimer(nsIFrame* aFrame) {
mFrame = aFrame;
mNextSibling = nsnull;
aFrame->GetFrameType(&mFrameType);
Reset();
}
@ -65,6 +66,11 @@ public:
((nsReflowTimer*)mChildren.ElementAt(childX))->Destroy();
}
NS_IF_RELEASE(mFrameType);
if (mNextSibling) { // table frames have 3 auxillary timers
delete mNextSibling->mNextSibling->mNextSibling;
delete mNextSibling->mNextSibling;
delete mNextSibling;
}
delete this;
}
@ -119,6 +125,7 @@ public:
nscoord mDesiredWidth;
nscoord mDesiredHeight;
nsReflowStatus mStatus;
nsReflowTimer* mNextSibling;
private:
~nsReflowTimer() {}
@ -943,9 +950,22 @@ public:
nsHTMLReflowState& aReflowState,
nsHTMLReflowMetrics* aMetrics = nsnull,
nsReflowStatus aStatus = NS_FRAME_COMPLETE);
#ifdef DEBUG_TABLE_REFLOW_TIMING
static void DebugReflowDone(nsIFrame* aFrame);
static void DebugTimePctCols(nsTableFrame& aFrame,
nsHTMLReflowState& aReflowState,
PRBool aStart);
static void DebugTimeNonPctCols(nsTableFrame& aFrame,
nsHTMLReflowState& aReflowState,
PRBool aStart);
static void DebugTimeNonPctColspans(nsTableFrame& aFrame,
nsHTMLReflowState& aReflowState,
PRBool aStart);
nsReflowTimer* mTimer;
#endif
#endif