From e60fe84ab36690ddc2463d1bf53d1c919a6ac0bf Mon Sep 17 00:00:00 2001 From: "jst%mozilla.jstenback.com" Date: Thu, 27 Jul 2006 22:36:36 +0000 Subject: [PATCH] Fixing bug 335058. Increase the default for the time we wait (from 5 to 10 seconds) before alerting the user about a possibly infinitely looping script, and give chrome an independent limit (20 seconds). r=bzbarsky@mit.edu, sr=brendan@mozilla.org git-svn-id: svn://10.0.0.236/trunk@205000 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/dom/src/base/nsJSEnvironment.cpp | 40 ++++++++++++++++++------ mozilla/dom/src/base/nsJSEnvironment.h | 1 + mozilla/modules/libpref/src/init/all.js | 3 +- 3 files changed, 33 insertions(+), 11 deletions(-) diff --git a/mozilla/dom/src/base/nsJSEnvironment.cpp b/mozilla/dom/src/base/nsJSEnvironment.cpp index 07b7a0cedc8..4414c454aa5 100644 --- a/mozilla/dom/src/base/nsJSEnvironment.cpp +++ b/mozilla/dom/src/base/nsJSEnvironment.cpp @@ -168,6 +168,7 @@ static PRBool sDidShutdown; static PRInt32 sContextCount; static PRTime sMaxScriptRunTime; +static PRTime sMaxChromeScriptRunTime; static nsIScriptSecurityManager *sSecurityManager; @@ -667,6 +668,9 @@ nsJSContext::DOMBranchCallback(JSContext *cx, JSScript *script) // script has run ctx->mBranchCallbackTime = PR_Now(); + ctx->mIsTrackingChromeCodeTime = + ::JS_IsSystemObject(cx, ::JS_GetGlobalObject(cx)); + return JS_TRUE; } @@ -694,7 +698,8 @@ nsJSContext::DOMBranchCallback(JSContext *cx, JSScript *script) // Check the amount of time this script has been running, or if the // dialog is disabled. - if (LL_CMP(duration, <, sMaxScriptRunTime)) { + if (duration < (ctx->mIsTrackingChromeCodeTime ? + sMaxChromeScriptRunTime : sMaxScriptRunTime)) { return JS_TRUE; } @@ -806,7 +811,9 @@ nsJSContext::DOMBranchCallback(JSContext *cx, JSScript *script) nsIPrefBranch *prefBranch = nsContentUtils::GetPrefBranch(); if (prefBranch) { - prefBranch->SetIntPref("dom.max_script_run_time", 0); + prefBranch->SetIntPref(ctx->mIsTrackingChromeCodeTime ? + "dom.max_chrome_script_run_time" : + "dom.max_script_run_time", 0); } } @@ -955,7 +962,8 @@ nsJSContext::nsJSContext(JSRuntime *aRuntime) : mGCOnDestruction(PR_TRUE) mScriptsEnabled = PR_TRUE; mBranchCallbackCount = 0; mBranchCallbackTime = LL_ZERO; - mProcessingScriptTag=PR_FALSE; + mProcessingScriptTag = PR_FALSE; + mIsTrackingChromeCodeTime = PR_FALSE; InvalidateContextAndWrapperCache(); } @@ -3224,18 +3232,24 @@ nsJSRuntime::Startup() static int PR_CALLBACK MaxScriptRunTimePrefChangedCallback(const char *aPrefName, void *aClosure) { - // Default limit on script run time to 5 seconds. 0 means let + // Default limit on script run time to 10 seconds. 0 means let // scripts run forever. - PRInt32 time = nsContentUtils::GetIntPref(aPrefName, 5); + PRBool isChromePref = + strcmp(aPrefName, "dom.max_chrome_script_run_time") == 0; + PRInt32 time = nsContentUtils::GetIntPref(aPrefName, isChromePref ? 20 : 10); + PRTime t; if (time <= 0) { // Let scripts run for a really, really long time. - sMaxScriptRunTime = LL_INIT(0x40000000, 0); + t = 0x4000000000000000LL; } else { - PRTime usec_per_sec; - LL_I2L(usec_per_sec, PR_USEC_PER_SEC); - LL_I2L(sMaxScriptRunTime, time); - LL_MUL(sMaxScriptRunTime, sMaxScriptRunTime, usec_per_sec); + t = time * PR_USEC_PER_SEC; + } + + if (isChromePref) { + sMaxChromeScriptRunTime = t; + } else { + sMaxScriptRunTime = t; } return 0; @@ -3328,6 +3342,12 @@ nsJSRuntime::Init() nsnull); MaxScriptRunTimePrefChangedCallback("dom.max_script_run_time", nsnull); + nsContentUtils::RegisterPrefCallback("dom.max_chrome_script_run_time", + MaxScriptRunTimePrefChangedCallback, + nsnull); + MaxScriptRunTimePrefChangedCallback("dom.max_chrome_script_run_time", + nsnull); + rv = CallGetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &sSecurityManager); sIsInitialized = NS_SUCCEEDED(rv); diff --git a/mozilla/dom/src/base/nsJSEnvironment.h b/mozilla/dom/src/base/nsJSEnvironment.h index 286db165c6c..81f891f2673 100644 --- a/mozilla/dom/src/base/nsJSEnvironment.h +++ b/mozilla/dom/src/base/nsJSEnvironment.h @@ -253,6 +253,7 @@ private: PRPackedBool mScriptsEnabled; PRPackedBool mGCOnDestruction; PRPackedBool mProcessingScriptTag; + PRPackedBool mIsTrackingChromeCodeTime; PRUint32 mBranchCallbackCount; PRTime mBranchCallbackTime; diff --git a/mozilla/modules/libpref/src/init/all.js b/mozilla/modules/libpref/src/init/all.js index fd0ac883d2c..83b3c941f90 100644 --- a/mozilla/modules/libpref/src/init/all.js +++ b/mozilla/modules/libpref/src/init/all.js @@ -1051,7 +1051,8 @@ pref("config.use_system_prefs.accessibility", false); pref("editor.resizing.preserve_ratio", true); pref("editor.positioning.offset", 0); -pref("dom.max_script_run_time", 5); +pref("dom.max_chrome_script_run_time", 20); +pref("dom.max_script_run_time", 10); pref("svg.enabled", true);