diff --git a/mozilla/caps/include/nsScriptSecurityManager.h b/mozilla/caps/include/nsScriptSecurityManager.h index 74264a2e5e4..d938d4bb492 100644 --- a/mozilla/caps/include/nsScriptSecurityManager.h +++ b/mozilla/caps/include/nsScriptSecurityManager.h @@ -47,6 +47,8 @@ #include "nsIPref.h" #include "nsISecurityPref.h" +#include "nsIJSContextStack.h" + ///////////////////// // nsIPrincipalKey // ///////////////////// @@ -101,7 +103,8 @@ public: static nsScriptSecurityManager * GetScriptSecurityManager(); - + + JSContext * GetCurrentContextQuick(); private: NS_IMETHOD @@ -172,6 +175,7 @@ private: PRBool mIsMailJavaScriptEnabled; PRBool mIsWritingPrefs; unsigned char hasDomainPolicyVector[(NS_DOM_PROP_MAX >> 3) + 1]; + nsCOMPtr mThreadJSContextStack; }; #endif /*_NS_SCRIPT_SECURITY_MANAGER_H_*/ diff --git a/mozilla/caps/src/nsScriptSecurityManager.cpp b/mozilla/caps/src/nsScriptSecurityManager.cpp index 5f3d5097c54..092cfd2f177 100644 --- a/mozilla/caps/src/nsScriptSecurityManager.cpp +++ b/mozilla/caps/src/nsScriptSecurityManager.cpp @@ -81,8 +81,7 @@ static JSContext * GetCurrentContext() { // Get JSContext from stack. nsresult rv; - NS_WITH_SERVICE(nsIJSContextStack, stack, "nsThreadJSContextStack", - &rv); + nsCOMPtr stack = do_GetService("nsThreadJSContextStack", &rv); if (NS_FAILED(rv)) return nsnull; JSContext *cx; @@ -91,6 +90,25 @@ GetCurrentContext() { return cx; } +// Convinience method to get the current js context stack. +// Uses cached JSContextStack service instead of calling through +// to the service manager. +JSContext * +nsScriptSecurityManager::GetCurrentContextQuick() { + // Get JSContext from stack. + nsresult rv; + if (!mThreadJSContextStack) { + mThreadJSContextStack = do_GetService("nsThreadJSContextStack", &rv); + } + if (!mThreadJSContextStack) + return nsnull; + JSContext *cx; + if (NS_FAILED(mThreadJSContextStack->Peek(&cx))) + return nsnull; + return cx; +} + + #if 0 // unused. static JSContext * @@ -632,7 +650,7 @@ nsScriptSecurityManager::CheckFunctionAccess(JSContext *aCx, void *aFunObj, NS_IMETHODIMP nsScriptSecurityManager::GetSubjectPrincipal(nsIPrincipal **result) { - JSContext *cx = GetCurrentContext(); + JSContext *cx = GetCurrentContextQuick(); if (!cx) { *result = nsnull; return NS_OK; @@ -836,7 +854,7 @@ nsScriptSecurityManager::IsCapabilityEnabled(const char *capability, { nsresult rv; JSStackFrame *fp = nsnull; - JSContext *cx = GetCurrentContext(); + JSContext *cx = GetCurrentContextQuick(); fp = cx ? JS_FrameIterator(cx, &fp) : nsnull; if (!fp) { // No script code on stack. Allow execution. @@ -1058,7 +1076,7 @@ nsScriptSecurityManager::GetPrincipalAndFrame(JSContext *cx, NS_IMETHODIMP nsScriptSecurityManager::EnableCapability(const char *capability) { - JSContext *cx = GetCurrentContext(); + JSContext *cx = GetCurrentContextQuick(); JSStackFrame *fp; //Error checks for capability string length (200) @@ -1102,7 +1120,7 @@ nsScriptSecurityManager::EnableCapability(const char *capability) NS_IMETHODIMP nsScriptSecurityManager::RevertCapability(const char *capability) { - JSContext *cx = GetCurrentContext(); + JSContext *cx = GetCurrentContextQuick(); JSStackFrame *fp; nsCOMPtr principal; if (NS_FAILED(GetPrincipalAndFrame(cx, getter_AddRefs(principal), @@ -1119,7 +1137,7 @@ nsScriptSecurityManager::RevertCapability(const char *capability) NS_IMETHODIMP nsScriptSecurityManager::DisableCapability(const char *capability) { - JSContext *cx = GetCurrentContext(); + JSContext *cx = GetCurrentContextQuick(); JSStackFrame *fp; nsCOMPtr principal; if (NS_FAILED(GetPrincipalAndFrame(cx, getter_AddRefs(principal), @@ -1183,7 +1201,7 @@ nsScriptSecurityManager::SetCanEnableCapability(const char* certificateID, } if (!isEqual) { - JSContext* cx = GetCurrentContext(); + JSContext* cx = GetCurrentContextQuick(); if (!cx) return NS_ERROR_FAILURE; static const char msg1[] = "Only code signed by the system certificate may call SetCanEnableCapability or Invalidate"; static const char msg2[] = "Attempt to call SetCanEnableCapability or Invalidate when no system certificate has been established"; @@ -1395,6 +1413,7 @@ nsScriptSecurityManager::nsScriptSecurityManager(void) NS_INIT_REFCNT(); memset(hasDomainPolicyVector, 0, sizeof(hasDomainPolicyVector)); InitPrefs(); + mThreadJSContextStack = do_GetService("nsThreadJSContextStack"); } nsScriptSecurityManager::~nsScriptSecurityManager(void)