diff --git a/mozilla/content/base/public/nsContentUtils.h b/mozilla/content/base/public/nsContentUtils.h index c8c633efd34..8911e042c93 100644 --- a/mozilla/content/base/public/nsContentUtils.h +++ b/mozilla/content/base/public/nsContentUtils.h @@ -109,6 +109,10 @@ public: static PRBool IsCallerChrome(); + static PRBool IsCallerTrustedForRead(); + + static PRBool IsCallerTrustedForWrite(); + /* * Returns true if the nodes are both in the same document or * if neither is in a document. diff --git a/mozilla/content/base/src/nsContentUtils.cpp b/mozilla/content/base/src/nsContentUtils.cpp index 474c3658aae..d29c86e5eb9 100644 --- a/mozilla/content/base/src/nsContentUtils.cpp +++ b/mozilla/content/base/src/nsContentUtils.cpp @@ -1018,6 +1018,37 @@ nsContentUtils::IsCallerChrome() return is_caller_chrome; } +static PRBool IsCallerTrustedForCapability(const char* aCapability) +{ + if (nsContentUtils::IsCallerChrome()) + return PR_TRUE; + + // The secman really should handle UniversalXPConnect case, since that + // should include UniversalBrowserRead... doesn't right now, though. + PRBool hasCap; + nsIScriptSecurityManager* ssm = nsContentUtils::GetSecurityManager(); + if (NS_FAILED(ssm->IsCapabilityEnabled(aCapability, &hasCap))) + return PR_FALSE; + if (hasCap) + return PR_TRUE; + + if (NS_FAILED(ssm->IsCapabilityEnabled("UniversalXPConnect", &hasCap))) + return PR_FALSE; + return hasCap; +} + +PRBool +nsContentUtils::IsCallerTrustedForRead() +{ + return IsCallerTrustedForCapability("UniversalBrowserRead"); +} + +PRBool +nsContentUtils::IsCallerTrustedForWrite() +{ + return IsCallerTrustedForCapability("UniversalBrowserWrite"); +} + // static PRBool nsContentUtils::InSameDoc(nsIDOMNode* aNode, nsIDOMNode* aOther)