From f44103de55db585a1e376df8601ac4349cacdd9b Mon Sep 17 00:00:00 2001 From: "varga%netscape.com" Date: Thu, 20 Apr 2006 03:38:27 +0000 Subject: [PATCH] Fix for bug 208912. DOMParser produces documents with about:blank uri. r=heikki, sr=peterv --- content/base/src/nsDOMParser.cpp | 49 +++++++++++++++++++-------- content/base/src/nsXMLHttpRequest.cpp | 5 ++- 2 files changed, 38 insertions(+), 16 deletions(-) diff --git a/content/base/src/nsDOMParser.cpp b/content/base/src/nsDOMParser.cpp index 11462eef3db..d20810a2f8c 100644 --- a/content/base/src/nsDOMParser.cpp +++ b/content/base/src/nsDOMParser.cpp @@ -36,6 +36,7 @@ * * ***** END LICENSE BLOCK ***** */ +#include "jsapi.h" #include "nsDOMParser.h" #include "nsIURI.h" #include "nsIChannel.h" @@ -51,10 +52,13 @@ #include "nsIDocument.h" #include "nsIDOMDocument.h" #include "nsIDOMDOMImplementation.h" +#include "nsIDOMWindow.h" #include "nsIPrivateDOMImplementation.h" #include "nsIJSContextStack.h" #include "nsIScriptSecurityManager.h" -#include "nsICodebasePrincipal.h" +#include "nsIPrincipal.h" +#include "nsIScriptContext.h" +#include "nsIScriptGlobalObject.h" #include "nsIDOMClassInfo.h" #include "nsReadableUtils.h" #include "nsCRT.h" @@ -438,10 +442,6 @@ nsDOMParser::ParseFromStream(nsIInputStream *stream, NS_ENSURE_ARG_POINTER(_retval); *_retval = nsnull; - nsresult rv; - nsCOMPtr baseURI; - nsCOMPtr principal; - // For now, we can only create XML documents. if (nsCRT::strcmp(contentType, "text/xml") != 0 && nsCRT::strcmp(contentType, "application/xml") != 0 && @@ -449,7 +449,17 @@ nsDOMParser::ParseFromStream(nsIInputStream *stream, return NS_ERROR_NOT_IMPLEMENTED; } - // First try to find a base URI for the document we're creating + nsresult rv; + nsCOMPtr principal; + nsCOMPtr secMan = + do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv); + if (NS_SUCCEEDED(rv)) { + secMan->GetSubjectPrincipal(getter_AddRefs(principal)); + } + + // Try to find a base URI for the document we're creating. + nsCOMPtr baseURI; + nsCOMPtr cc; nsCOMPtr xpc(do_GetService(nsIXPConnect::GetCID(), &rv)); if(NS_SUCCEEDED(rv)) { @@ -460,15 +470,24 @@ nsDOMParser::ParseFromStream(nsIInputStream *stream, JSContext* cx; rv = cc->GetJSContext(&cx); if (NS_FAILED(rv)) return NS_ERROR_FAILURE; - - nsCOMPtr secMan = - do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv); - if (NS_SUCCEEDED(rv)) { - rv = secMan->GetSubjectPrincipal(getter_AddRefs(principal)); - if (NS_SUCCEEDED(rv)) { - nsCOMPtr codebase(do_QueryInterface(principal)); - if (codebase) { - codebase->GetURI(getter_AddRefs(baseURI)); + + nsISupports *supports = + (::JS_GetOptions(cx) & JSOPTION_PRIVATE_IS_NSISUPPORTS) + ? NS_STATIC_CAST(nsISupports*, ::JS_GetContextPrivate(cx)) + : nsnull; + nsCOMPtr scriptContext = do_QueryInterface(supports); + if (scriptContext) { + nsCOMPtr globalObject; + scriptContext->GetGlobalObject(getter_AddRefs(globalObject)); + + nsCOMPtr window = do_QueryInterface(globalObject); + if (window) { + nsCOMPtr domdoc; + window->GetDocument(getter_AddRefs(domdoc)); + + nsCOMPtr doc = do_QueryInterface(domdoc); + if (doc) { + doc->GetBaseURL(*getter_AddRefs(baseURI)); } } } diff --git a/content/base/src/nsXMLHttpRequest.cpp b/content/base/src/nsXMLHttpRequest.cpp index 6a415788889..b4fd0485a2e 100644 --- a/content/base/src/nsXMLHttpRequest.cpp +++ b/content/base/src/nsXMLHttpRequest.cpp @@ -135,7 +135,10 @@ GetCurrentContext(nsIScriptContext **aScriptContext) return; } - nsISupports *priv = (nsISupports *)::JS_GetContextPrivate(cx); + nsISupports *priv = + (::JS_GetOptions(cx) & JSOPTION_PRIVATE_IS_NSISUPPORTS) + ? NS_STATIC_CAST(nsISupports*, ::JS_GetContextPrivate(cx)) + : nsnull; if (!priv) { return;