From 895596ab7bff65de3e1312b97a1c325a000864e4 Mon Sep 17 00:00:00 2001 From: Jonas Sicking Date: Thu, 19 Aug 2010 16:06:06 -0700 Subject: [PATCH] Bug 546857 Part 1: Fix nsDOMParser to make it useful from xpcshell tests. r=bz a=blocker --- content/base/public/nsIDOMParser.idl | 6 ++-- content/base/src/nsDOMParser.cpp | 41 +++++++++++++++++++++------- content/test/unit/head_content.js | 4 ++- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/content/base/public/nsIDOMParser.idl b/content/base/public/nsIDOMParser.idl index 6fc9fd5cc004..27e8f3a834e7 100644 --- a/content/base/public/nsIDOMParser.idl +++ b/content/base/public/nsIDOMParser.idl @@ -134,9 +134,9 @@ interface nsIDOMParserJS : nsISupports /** * Just like nsIDOMParser.init, but callable from JS. */ - void init(in nsIPrincipal principal, - in nsIURI documentURI, - in nsIURI baseURI); + void init([optional] in nsIPrincipal principal, + [optional] in nsIURI documentURI, + [optional] in nsIURI baseURI); }; %{ C++ diff --git a/content/base/src/nsDOMParser.cpp b/content/base/src/nsDOMParser.cpp index f8e724ed8e55..ec639198a821 100644 --- a/content/base/src/nsDOMParser.cpp +++ b/content/base/src/nsDOMParser.cpp @@ -335,33 +335,40 @@ nsDOMParser::Init(nsIPrincipal* principal, nsIURI* documentURI, NS_ENSURE_ARG(principal || documentURI); mDocumentURI = documentURI; + if (!mDocumentURI) { principal->GetURI(getter_AddRefs(mDocumentURI)); - if (!mDocumentURI) { + // If we have the system principal, then we'll just use the null principals + // uri. + if (!mDocumentURI && !nsContentUtils::IsSystemPrincipal(principal)) { return NS_ERROR_INVALID_ARG; } } mScriptHandlingObject = do_GetWeakReference(aScriptObject); mPrincipal = principal; - nsIScriptSecurityManager* secMan = nsContentUtils::GetSecurityManager(); - NS_ENSURE_TRUE(secMan, NS_ERROR_NOT_AVAILABLE); nsresult rv; if (!mPrincipal) { + nsIScriptSecurityManager* secMan = nsContentUtils::GetSecurityManager(); + NS_ENSURE_TRUE(secMan, NS_ERROR_NOT_AVAILABLE); rv = secMan->GetCodebasePrincipal(mDocumentURI, getter_AddRefs(mPrincipal)); + NS_ENSURE_SUCCESS(rv, rv); mOriginalPrincipal = mPrincipal; } else { - mOriginalPrincipal = principal; - PRBool isSystem; - rv = secMan->IsSystemPrincipal(mPrincipal, &isSystem); - if (NS_FAILED(rv) || isSystem) { + mOriginalPrincipal = mPrincipal; + if (nsContentUtils::IsSystemPrincipal(mPrincipal)) { // Don't give DOMParsers the system principal. Use a null // principal instead. mPrincipal = do_CreateInstance("@mozilla.org/nullprincipal;1", &rv); + NS_ENSURE_SUCCESS(rv, rv); + + if (!mDocumentURI) { + rv = mPrincipal->GetURI(getter_AddRefs(mDocumentURI)); + NS_ENSURE_SUCCESS(rv, rv); + } } } - NS_ENSURE_SUCCESS(rv, rv); mBaseURI = baseURI; // Note: if mBaseURI is null, fine. Leave it like that; that will use the @@ -507,7 +514,8 @@ nsDOMParser::Initialize(nsISupports* aOwner, JSContext* cx, JSObject* obj, } NS_IMETHODIMP -nsDOMParser::Init(nsIPrincipal *principal, nsIURI *documentURI, nsIURI *baseURI) +nsDOMParser::Init(nsIPrincipal *aPrincipal, nsIURI *aDocumentURI, + nsIURI *aBaseURI) { AttemptedInitMarker marker(&mAttemptedInit); @@ -515,6 +523,19 @@ nsDOMParser::Init(nsIPrincipal *principal, nsIURI *documentURI, nsIURI *baseURI) NS_ENSURE_TRUE(cx, NS_ERROR_UNEXPECTED); nsIScriptContext* scriptContext = GetScriptContextFromJSContext(cx); - return Init(principal, documentURI, baseURI, + + nsCOMPtr principal = aPrincipal; + + if (!principal && !aDocumentURI) { + nsIScriptSecurityManager* secMan = nsContentUtils::GetSecurityManager(); + NS_ENSURE_TRUE(secMan, NS_ERROR_UNEXPECTED); + + secMan->GetSubjectPrincipal(getter_AddRefs(principal)); + + // We're called from JS; there better be a subject principal, really. + NS_ENSURE_TRUE(principal, NS_ERROR_UNEXPECTED); + } + + return Init(principal, aDocumentURI, aBaseURI, scriptContext ? scriptContext->GetGlobalObject() : nsnull); } diff --git a/content/test/unit/head_content.js b/content/test/unit/head_content.js index 9eaf08b45067..e133da4116db 100644 --- a/content/test/unit/head_content.js +++ b/content/test/unit/head_content.js @@ -58,7 +58,9 @@ const nsIDOMXULElement = I.nsIDOMXULElement; const nsIDOMProcessingInstruction = I.nsIDOMProcessingInstruction; function DOMParser() { - return C["@mozilla.org/xmlextras/domparser;1"].createInstance(nsIDOMParser); + var parser = C["@mozilla.org/xmlextras/domparser;1"].createInstance(nsIDOMParser); + parser.init(); + return parser; } var __testsDirectory = null;