NS_IMETHODIMP nsChromeProtocolHandler::NewChannel(nsIURI* aURI, nsIChannel* *aResult) { nsresult rv; 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<nsIURI> debugClone; debug_rv = aURI->Clone(getter_AddRefs(debugClone)); if (NS_SUCCEEDED(debug_rv)) { nsCOMPtr<nsIURL> debugURL (do_QueryInterface(debugClone)); debug_rv = nsChromeRegistry::Canonify(debugURL); if (NS_SUCCEEDED(debug_rv)) { bool same; debug_rv = aURI->Equals(debugURL, &same); if (NS_SUCCEEDED(debug_rv)) { NS_ASSERTION(same, "Non-canonified chrome uri passed to nsChromeProtocolHandler::NewChannel!"); } } } #endif nsCOMPtr<nsIChannel> result; if (!nsChromeRegistry::gChromeRegistry) { // We don't actually want this ref, we just want the service to // initialize if it hasn't already. nsCOMPtr<nsIChromeRegistry> reg = mozilla::services::GetChromeRegistryService(); NS_ENSURE_TRUE(nsChromeRegistry::gChromeRegistry, NS_ERROR_FAILURE); } nsCOMPtr<nsIURI> resolvedURI; rv = nsChromeRegistry::gChromeRegistry->ConvertChromeURL(aURI, getter_AddRefs(resolvedURI)); if (NS_FAILED(rv)) { #ifdef DEBUG nsAutoCString spec; aURI->GetSpec(spec); printf("Couldn't convert chrome URL: %s\n", spec.get()); #endif return rv; } nsCOMPtr<nsIIOService> ioServ(do_GetIOService(&rv)); NS_ENSURE_SUCCESS(rv, rv); rv = ioServ->NewChannelFromURI(resolvedURI, getter_AddRefs(result)); if (NS_FAILED(rv)) return rv; #ifdef DEBUG nsCOMPtr<nsIFileChannel> fileChan(do_QueryInterface(result)); if (fileChan) { nsCOMPtr<nsIFile> file; fileChan->GetFile(getter_AddRefs(file)); bool exists = false; file->Exists(&exists); if (!exists) { nsAutoCString path; file->GetNativePath(path); printf("Chrome file doesn't exist: %s\n", path.get()); } } #endif // Make sure that the channel remembers where it was // originally loaded from. nsLoadFlags loadFlags = 0; result->GetLoadFlags(&loadFlags); result->SetLoadFlags(loadFlags & ~nsIChannel::LOAD_REPLACE); rv = result->SetOriginalURI(aURI); if (NS_FAILED(rv)) return rv; // Get a system principal for content files and set the owner // property of the result nsCOMPtr<nsIURL> url = do_QueryInterface(aURI); nsAutoCString path; rv = url->GetPath(path); if (StringBeginsWith(path, NS_LITERAL_CSTRING("/content/"))) { nsCOMPtr<nsIScriptSecurityManager> securityManager = do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID, &rv); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsIPrincipal> principal; rv = securityManager->GetSystemPrincipal(getter_AddRefs(principal)); if (NS_FAILED(rv)) return rv; nsCOMPtr<nsISupports> owner = do_QueryInterface(principal); result->SetOwner(owner); } // XXX Removed dependency-tracking code from here, because we're not // tracking them anyways (with fastload we checked only in DEBUG // and with startupcache not at all), but this is where we would start // if we need to re-add. // See bug 531886, bug 533038. result->SetContentCharset(NS_LITERAL_CSTRING("UTF-8")); *aResult = result; NS_ADDREF(*aResult); return NS_OK; }
NS_IMETHODIMP nsChromeProtocolHandler::NewChannel(nsIURI *aURI, nsILoadInfo *aLoadInfo, nsIChannel **aResult) { nsresult rv; NS_ENSURE_ARG_POINTER(aURI); NS_ENSURE_ARG_POINTER(aLoadInfo); MOZ_ASSERT(aResult, "Null out param"); #ifdef DEBUG // Check that the uri we got is already canonified nsresult debug_rv; nsCOMPtr<nsIURI> debugURL = aURI; debug_rv = nsChromeRegistry::Canonify(debugURL); if (NS_SUCCEEDED(debug_rv)) { bool same; debug_rv = aURI->Equals(debugURL, &same); if (NS_SUCCEEDED(debug_rv)) { NS_ASSERTION(same, "Non-canonified chrome uri passed to " "nsChromeProtocolHandler::NewChannel!"); } } #endif nsCOMPtr<nsIChannel> result; if (!nsChromeRegistry::gChromeRegistry) { // We don't actually want this ref, we just want the service to // initialize if it hasn't already. nsCOMPtr<nsIChromeRegistry> reg = mozilla::services::GetChromeRegistryService(); NS_ENSURE_TRUE(nsChromeRegistry::gChromeRegistry, NS_ERROR_FAILURE); } nsCOMPtr<nsIURI> resolvedURI; rv = nsChromeRegistry::gChromeRegistry->ConvertChromeURL( aURI, getter_AddRefs(resolvedURI)); if (NS_FAILED(rv)) { #ifdef DEBUG printf("Couldn't convert chrome URL: %s\n", aURI->GetSpecOrDefault().get()); #endif return rv; } // We don't want to allow the inner protocol handler modify the result // principal URI since we want either |aURI| or anything pre-set by upper // layers to prevail. nsCOMPtr<nsIURI> savedResultPrincipalURI; rv = aLoadInfo->GetResultPrincipalURI(getter_AddRefs(savedResultPrincipalURI)); NS_ENSURE_SUCCESS(rv, rv); rv = NS_NewChannelInternal(getter_AddRefs(result), resolvedURI, aLoadInfo); NS_ENSURE_SUCCESS(rv, rv); #ifdef DEBUG nsCOMPtr<nsIFileChannel> fileChan(do_QueryInterface(result)); if (fileChan) { nsCOMPtr<nsIFile> file; fileChan->GetFile(getter_AddRefs(file)); bool exists = false; file->Exists(&exists); if (!exists) { printf("Chrome file doesn't exist: %s\n", file->HumanReadablePath().get()); } } #endif // Make sure that the channel remembers where it was // originally loaded from. rv = aLoadInfo->SetResultPrincipalURI(savedResultPrincipalURI); NS_ENSURE_SUCCESS(rv, rv); rv = result->SetOriginalURI(aURI); if (NS_FAILED(rv)) return rv; // Get a system principal for content files and set the owner // property of the result nsCOMPtr<nsIURL> url = do_QueryInterface(aURI); nsAutoCString path; rv = url->GetPathQueryRef(path); if (StringBeginsWith(path, NS_LITERAL_CSTRING("/content/"))) { result->SetOwner(nsContentUtils::GetSystemPrincipal()); } // XXX Removed dependency-tracking code from here, because we're not // tracking them anyways (with fastload we checked only in DEBUG // and with startupcache not at all), but this is where we would start // if we need to re-add. // See bug 531886, bug 533038. result->SetContentCharset(NS_LITERAL_CSTRING("UTF-8")); *aResult = result; NS_ADDREF(*aResult); return NS_OK; }