зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
98781a0f2c
Коммит
db74b1ba8a
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче