From 65804204b4ec6cfa7c1a0f7da37c10e032b1edb1 Mon Sep 17 00:00:00 2001 From: "waterson%netscape.com" Date: Wed, 27 Jun 2001 04:04:04 +0000 Subject: [PATCH] Bug 87744. Make pres shell print debug information when GECKO_VERIFY_REFLOW_FLAGS is set. r=dbaron, sr=attinasi. git-svn-id: svn://10.0.0.236/trunk@98042 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/layout/base/nsPresShell.cpp | 78 ++++++++++++++++++-- mozilla/layout/html/base/src/nsPresShell.cpp | 78 ++++++++++++++++++-- 2 files changed, 142 insertions(+), 14 deletions(-) diff --git a/mozilla/layout/base/nsPresShell.cpp b/mozilla/layout/base/nsPresShell.cpp index bc80d647419..a5012cac877 100644 --- a/mozilla/layout/base/nsPresShell.cpp +++ b/mozilla/layout/base/nsPresShell.cpp @@ -108,6 +108,7 @@ #ifdef NS_DEBUG #include "nsIFrameDebug.h" #endif +#include "prenv.h" #ifdef MOZ_REFLOW_PERF_DSP #include "nsIRenderingContext.h" @@ -1247,12 +1248,42 @@ VerifyStyleTree(nsIPresContext* aPresContext, nsIFrameManager* aFrameManager) #endif #ifdef NS_DEBUG -/** - * Note: the log module is created during library initialization which - * means that you cannot perform logging before then. - */ -static PRLogModuleInfo* gLogModule; +// Set the environment variable GECKO_VERIFY_REFLOW_FLAGS to one or +// more of the following flags (comma separated) for handy debug +// output. static PRUint32 gVerifyReflowFlags; + +struct VerifyReflowFlags { + char* name; + PRUint32 bit; +}; + +static VerifyReflowFlags gFlags[] = { + { "verify", VERIFY_REFLOW_ON }, + { "reflow", VERIFY_REFLOW_NOISY }, + { "all", VERIFY_REFLOW_ALL }, + { "list-commands", VERIFY_REFLOW_DUMP_COMMANDS }, + { "noisy-commands", VERIFY_REFLOW_NOISY_RC }, + { "really-noisy-commands", VERIFY_REFLOW_REALLY_NOISY_RC }, + { "space-manager", VERIFY_REFLOW_INCLUDE_SPACE_MANAGER }, + { "resize", VERIFY_REFLOW_DURING_RESIZE_REFLOW }, +}; + +#define NUM_VERIFY_REFLOW_FLAGS (sizeof(gFlags) / sizeof(gFlags[0])) + +static void +ShowVerifyReflowFlags() +{ + printf("Here are the available GECKO_VERIFY_REFLOW_FLAGS:\n"); + VerifyReflowFlags* flag = gFlags; + VerifyReflowFlags* limit = gFlags + NUM_VERIFY_REFLOW_FLAGS; + while (flag < limit) { + printf(" %s\n", flag->name); + ++flag; + } + printf("Note: GECKO_VERIFY_REFLOW_FLAGS is a comma separated list of flag\n"); + printf("names (no whitespace)\n"); +} #endif static PRBool gVerifyReflowEnabled; @@ -1264,8 +1295,41 @@ nsIPresShell::GetVerifyReflowEnable() static PRBool firstTime = PR_TRUE; if (firstTime) { firstTime = PR_FALSE; - gLogModule = PR_NewLogModule("verifyreflow"); - gVerifyReflowFlags = gLogModule->level; + char* flags = PR_GetEnv("GECKO_VERIFY_REFLOW_FLAGS"); + if (flags) { + PRBool error = PR_FALSE; + + for (;;) { + char* comma = PL_strchr(flags, ','); + if (comma) + *comma = '\0'; + + PRBool found = PR_FALSE; + VerifyReflowFlags* flag = gFlags; + VerifyReflowFlags* limit = gFlags + NUM_VERIFY_REFLOW_FLAGS; + while (flag < limit) { + if (PL_strcasecmp(flag->name, flags) == 0) { + gVerifyReflowFlags |= flag->bit; + found = PR_TRUE; + break; + } + ++flag; + } + + if (! found) + error = PR_TRUE; + + if (! comma) + break; + + *comma = ','; + flags = comma + 1; + } + + if (error) + ShowVerifyReflowFlags(); + } + if (VERIFY_REFLOW_ON & gVerifyReflowFlags) { gVerifyReflowEnabled = PR_TRUE; } diff --git a/mozilla/layout/html/base/src/nsPresShell.cpp b/mozilla/layout/html/base/src/nsPresShell.cpp index bc80d647419..a5012cac877 100644 --- a/mozilla/layout/html/base/src/nsPresShell.cpp +++ b/mozilla/layout/html/base/src/nsPresShell.cpp @@ -108,6 +108,7 @@ #ifdef NS_DEBUG #include "nsIFrameDebug.h" #endif +#include "prenv.h" #ifdef MOZ_REFLOW_PERF_DSP #include "nsIRenderingContext.h" @@ -1247,12 +1248,42 @@ VerifyStyleTree(nsIPresContext* aPresContext, nsIFrameManager* aFrameManager) #endif #ifdef NS_DEBUG -/** - * Note: the log module is created during library initialization which - * means that you cannot perform logging before then. - */ -static PRLogModuleInfo* gLogModule; +// Set the environment variable GECKO_VERIFY_REFLOW_FLAGS to one or +// more of the following flags (comma separated) for handy debug +// output. static PRUint32 gVerifyReflowFlags; + +struct VerifyReflowFlags { + char* name; + PRUint32 bit; +}; + +static VerifyReflowFlags gFlags[] = { + { "verify", VERIFY_REFLOW_ON }, + { "reflow", VERIFY_REFLOW_NOISY }, + { "all", VERIFY_REFLOW_ALL }, + { "list-commands", VERIFY_REFLOW_DUMP_COMMANDS }, + { "noisy-commands", VERIFY_REFLOW_NOISY_RC }, + { "really-noisy-commands", VERIFY_REFLOW_REALLY_NOISY_RC }, + { "space-manager", VERIFY_REFLOW_INCLUDE_SPACE_MANAGER }, + { "resize", VERIFY_REFLOW_DURING_RESIZE_REFLOW }, +}; + +#define NUM_VERIFY_REFLOW_FLAGS (sizeof(gFlags) / sizeof(gFlags[0])) + +static void +ShowVerifyReflowFlags() +{ + printf("Here are the available GECKO_VERIFY_REFLOW_FLAGS:\n"); + VerifyReflowFlags* flag = gFlags; + VerifyReflowFlags* limit = gFlags + NUM_VERIFY_REFLOW_FLAGS; + while (flag < limit) { + printf(" %s\n", flag->name); + ++flag; + } + printf("Note: GECKO_VERIFY_REFLOW_FLAGS is a comma separated list of flag\n"); + printf("names (no whitespace)\n"); +} #endif static PRBool gVerifyReflowEnabled; @@ -1264,8 +1295,41 @@ nsIPresShell::GetVerifyReflowEnable() static PRBool firstTime = PR_TRUE; if (firstTime) { firstTime = PR_FALSE; - gLogModule = PR_NewLogModule("verifyreflow"); - gVerifyReflowFlags = gLogModule->level; + char* flags = PR_GetEnv("GECKO_VERIFY_REFLOW_FLAGS"); + if (flags) { + PRBool error = PR_FALSE; + + for (;;) { + char* comma = PL_strchr(flags, ','); + if (comma) + *comma = '\0'; + + PRBool found = PR_FALSE; + VerifyReflowFlags* flag = gFlags; + VerifyReflowFlags* limit = gFlags + NUM_VERIFY_REFLOW_FLAGS; + while (flag < limit) { + if (PL_strcasecmp(flag->name, flags) == 0) { + gVerifyReflowFlags |= flag->bit; + found = PR_TRUE; + break; + } + ++flag; + } + + if (! found) + error = PR_TRUE; + + if (! comma) + break; + + *comma = ','; + flags = comma + 1; + } + + if (error) + ShowVerifyReflowFlags(); + } + if (VERIFY_REFLOW_ON & gVerifyReflowFlags) { gVerifyReflowEnabled = PR_TRUE; }