diff --git a/mozilla/chrome/src/nsChromeProtocolHandler.cpp b/mozilla/chrome/src/nsChromeProtocolHandler.cpp index a49623e3022..214a1f7079f 100644 --- a/mozilla/chrome/src/nsChromeProtocolHandler.cpp +++ b/mozilla/chrome/src/nsChromeProtocolHandler.cpp @@ -77,6 +77,9 @@ static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID); static NS_DEFINE_CID(kStandardURLCID, NS_STANDARDURL_CID); static NS_DEFINE_CID(kXULPrototypeCacheCID, NS_XULPROTOTYPECACHE_CID); +// This comes from nsChromeRegistry.cpp +extern nsIChromeRegistry* gChromeRegistry; + //---------------------------------------------------------------------- // // A channel that's used for loading cached chrome documents. Since a @@ -566,8 +569,12 @@ nsChromeProtocolHandler::NewURI(const nsACString &aSpec, nsIURI *aBaseURI, nsIURI **result) { + NS_PRECONDITION(result, "Null out param"); + nsresult rv; + *result = nsnull; + // Chrome: URLs (currently) have no additional structure beyond that provided // by standard URLs, so there is no "outer" given to CreateInstance @@ -579,25 +586,67 @@ nsChromeProtocolHandler::NewURI(const nsACString &aSpec, if (NS_FAILED(rv)) return rv; - return CallQueryInterface(url, result); + nsCOMPtr uri(do_QueryInterface(url, &rv)); + if (NS_FAILED(rv)) + return rv; + + // Canonify the "chrome:" URL; e.g., so that we collapse + // "chrome://navigator/content/" and "chrome://navigator/content" + // and "chrome://navigator/content/navigator.xul". + + // Try the global cache first. + nsCOMPtr reg = gChromeRegistry; + + // If that fails, the service has not been instantiated yet; let's + // do that now. + if (!reg) { + reg = do_GetService(NS_CHROMEREGISTRY_CONTRACTID, &rv); + if (NS_FAILED(rv)) + return rv; + } + + NS_ASSERTION(reg, "Must have a chrome registry by now"); + + rv = reg->Canonify(uri); + if (NS_FAILED(rv)) + return rv; + + *result = uri; + NS_ADDREF(*result); + return NS_OK; } NS_IMETHODIMP nsChromeProtocolHandler::NewChannel(nsIURI* aURI, nsIChannel* *aResult) { + NS_ENSURE_ARG_POINTER(aURI); + NS_PRECONDITION(aResult, "Null out param"); + +#ifdef DEBUG + // Check that the uri we got is already canonified + nsresult debug_rv; + nsCOMPtr debugReg(do_GetService(NS_CHROMEREGISTRY_CONTRACTID, &debug_rv)); + if (NS_SUCCEEDED(debug_rv)) { + nsCOMPtr debugClone; + debug_rv = aURI->Clone(getter_AddRefs(debugClone)); + if (NS_SUCCEEDED(debug_rv)) { + debug_rv = debugReg->Canonify(debugClone); + if (NS_SUCCEEDED(debug_rv)) { + PRBool same; + debug_rv = aURI->Equals(debugClone, &same); + if (NS_SUCCEEDED(debug_rv)) { + NS_ASSERTION(same, "Non-canonified chrome uri passed to nsChromeProtocolHandler::NewChannel!"); + } + } + + } + } +#endif + nsresult rv; nsCOMPtr result; - // Canonify the "chrome:" URL; e.g., so that we collapse - // "chrome://navigator/content/navigator.xul" and "chrome://navigator/content" - // and "chrome://navigator/content/navigator.xul". - nsCOMPtr reg(do_GetService(NS_CHROMEREGISTRY_CONTRACTID, &rv)); - if (NS_FAILED(rv)) return rv; - - rv = reg->Canonify(aURI); - if (NS_FAILED(rv)) return rv; - // Check the prototype cache to see if we've already got the // document in the cache. nsCOMPtr cache = @@ -636,6 +685,12 @@ nsChromeProtocolHandler::NewChannel(nsIURI* aURI, //aURI->GetSpec(getter_Copies(oldSpec)); //printf("*************************** %s\n", (const char*)oldSpec); + nsCOMPtr reg = gChromeRegistry; + if (!reg) { + reg = do_GetService(NS_CHROMEREGISTRY_CONTRACTID, &rv); + if (NS_FAILED(rv)) return rv; + } + nsCAutoString spec; rv = reg->ConvertChromeURL(aURI, spec); if (NS_FAILED(rv)) return rv; diff --git a/mozilla/chrome/src/nsChromeRegistry.cpp b/mozilla/chrome/src/nsChromeRegistry.cpp index 71db94f3701..67aecb5f10e 100644 --- a/mozilla/chrome/src/nsChromeRegistry.cpp +++ b/mozilla/chrome/src/nsChromeRegistry.cpp @@ -127,6 +127,8 @@ static NS_DEFINE_CID(kStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID); class nsChromeRegistry; +nsIChromeRegistry* gChromeRegistry = nsnull; + #define CHROME_URI "http://www.mozilla.org/rdf/chrome#" DEFINE_RDF_VOCAB(CHROME_URI, CHROME, selectedSkin); @@ -287,6 +289,8 @@ static PRBool PR_CALLBACK DatasourceEnumerator(nsHashKey *aKey, void *aData, voi nsChromeRegistry::~nsChromeRegistry() { + gChromeRegistry = nsnull; + if (mDataSourceTable) { mDataSourceTable->Enumerate(DatasourceEnumerator, mChromeDataSource); delete mDataSourceTable; @@ -312,6 +316,8 @@ NS_IMPL_THREADSAFE_ISUPPORTS4(nsChromeRegistry, nsIChromeRegistry, nsIXULChromeR nsresult nsChromeRegistry::Init() { + gChromeRegistry = this; + nsresult rv; rv = nsServiceManager::GetService(kRDFServiceCID, NS_GET_IID(nsIRDFService), diff --git a/mozilla/rdf/chrome/src/nsChromeProtocolHandler.cpp b/mozilla/rdf/chrome/src/nsChromeProtocolHandler.cpp index a49623e3022..214a1f7079f 100644 --- a/mozilla/rdf/chrome/src/nsChromeProtocolHandler.cpp +++ b/mozilla/rdf/chrome/src/nsChromeProtocolHandler.cpp @@ -77,6 +77,9 @@ static NS_DEFINE_CID(kIOServiceCID, NS_IOSERVICE_CID); static NS_DEFINE_CID(kStandardURLCID, NS_STANDARDURL_CID); static NS_DEFINE_CID(kXULPrototypeCacheCID, NS_XULPROTOTYPECACHE_CID); +// This comes from nsChromeRegistry.cpp +extern nsIChromeRegistry* gChromeRegistry; + //---------------------------------------------------------------------- // // A channel that's used for loading cached chrome documents. Since a @@ -566,8 +569,12 @@ nsChromeProtocolHandler::NewURI(const nsACString &aSpec, nsIURI *aBaseURI, nsIURI **result) { + NS_PRECONDITION(result, "Null out param"); + nsresult rv; + *result = nsnull; + // Chrome: URLs (currently) have no additional structure beyond that provided // by standard URLs, so there is no "outer" given to CreateInstance @@ -579,25 +586,67 @@ nsChromeProtocolHandler::NewURI(const nsACString &aSpec, if (NS_FAILED(rv)) return rv; - return CallQueryInterface(url, result); + nsCOMPtr uri(do_QueryInterface(url, &rv)); + if (NS_FAILED(rv)) + return rv; + + // Canonify the "chrome:" URL; e.g., so that we collapse + // "chrome://navigator/content/" and "chrome://navigator/content" + // and "chrome://navigator/content/navigator.xul". + + // Try the global cache first. + nsCOMPtr reg = gChromeRegistry; + + // If that fails, the service has not been instantiated yet; let's + // do that now. + if (!reg) { + reg = do_GetService(NS_CHROMEREGISTRY_CONTRACTID, &rv); + if (NS_FAILED(rv)) + return rv; + } + + NS_ASSERTION(reg, "Must have a chrome registry by now"); + + rv = reg->Canonify(uri); + if (NS_FAILED(rv)) + return rv; + + *result = uri; + NS_ADDREF(*result); + return NS_OK; } NS_IMETHODIMP nsChromeProtocolHandler::NewChannel(nsIURI* aURI, nsIChannel* *aResult) { + NS_ENSURE_ARG_POINTER(aURI); + NS_PRECONDITION(aResult, "Null out param"); + +#ifdef DEBUG + // Check that the uri we got is already canonified + nsresult debug_rv; + nsCOMPtr debugReg(do_GetService(NS_CHROMEREGISTRY_CONTRACTID, &debug_rv)); + if (NS_SUCCEEDED(debug_rv)) { + nsCOMPtr debugClone; + debug_rv = aURI->Clone(getter_AddRefs(debugClone)); + if (NS_SUCCEEDED(debug_rv)) { + debug_rv = debugReg->Canonify(debugClone); + if (NS_SUCCEEDED(debug_rv)) { + PRBool same; + debug_rv = aURI->Equals(debugClone, &same); + if (NS_SUCCEEDED(debug_rv)) { + NS_ASSERTION(same, "Non-canonified chrome uri passed to nsChromeProtocolHandler::NewChannel!"); + } + } + + } + } +#endif + nsresult rv; nsCOMPtr result; - // Canonify the "chrome:" URL; e.g., so that we collapse - // "chrome://navigator/content/navigator.xul" and "chrome://navigator/content" - // and "chrome://navigator/content/navigator.xul". - nsCOMPtr reg(do_GetService(NS_CHROMEREGISTRY_CONTRACTID, &rv)); - if (NS_FAILED(rv)) return rv; - - rv = reg->Canonify(aURI); - if (NS_FAILED(rv)) return rv; - // Check the prototype cache to see if we've already got the // document in the cache. nsCOMPtr cache = @@ -636,6 +685,12 @@ nsChromeProtocolHandler::NewChannel(nsIURI* aURI, //aURI->GetSpec(getter_Copies(oldSpec)); //printf("*************************** %s\n", (const char*)oldSpec); + nsCOMPtr reg = gChromeRegistry; + if (!reg) { + reg = do_GetService(NS_CHROMEREGISTRY_CONTRACTID, &rv); + if (NS_FAILED(rv)) return rv; + } + nsCAutoString spec; rv = reg->ConvertChromeURL(aURI, spec); if (NS_FAILED(rv)) return rv; diff --git a/mozilla/rdf/chrome/src/nsChromeRegistry.cpp b/mozilla/rdf/chrome/src/nsChromeRegistry.cpp index 71db94f3701..67aecb5f10e 100644 --- a/mozilla/rdf/chrome/src/nsChromeRegistry.cpp +++ b/mozilla/rdf/chrome/src/nsChromeRegistry.cpp @@ -127,6 +127,8 @@ static NS_DEFINE_CID(kStringBundleServiceCID, NS_STRINGBUNDLESERVICE_CID); class nsChromeRegistry; +nsIChromeRegistry* gChromeRegistry = nsnull; + #define CHROME_URI "http://www.mozilla.org/rdf/chrome#" DEFINE_RDF_VOCAB(CHROME_URI, CHROME, selectedSkin); @@ -287,6 +289,8 @@ static PRBool PR_CALLBACK DatasourceEnumerator(nsHashKey *aKey, void *aData, voi nsChromeRegistry::~nsChromeRegistry() { + gChromeRegistry = nsnull; + if (mDataSourceTable) { mDataSourceTable->Enumerate(DatasourceEnumerator, mChromeDataSource); delete mDataSourceTable; @@ -312,6 +316,8 @@ NS_IMPL_THREADSAFE_ISUPPORTS4(nsChromeRegistry, nsIChromeRegistry, nsIXULChromeR nsresult nsChromeRegistry::Init() { + gChromeRegistry = this; + nsresult rv; rv = nsServiceManager::GetService(kRDFServiceCID, NS_GET_IID(nsIRDFService),