nsSimpleNestedURI::nsSimpleNestedURI(nsIURI* innerURI) : nsSimpleURI(nsnull), mInnerURI(innerURI) { NS_ASSERTION(innerURI, "Must have inner URI"); NS_TryToSetImmutable(innerURI); }
NS_IMETHODIMP nsAboutProtocolHandler::NewURI(const nsACString &aSpec, const char *aCharset, // ignore charset info nsIURI *aBaseURI, nsIURI **result) { *result = nullptr; nsresult rv; // Use a simple URI to parse out some stuff first nsCOMPtr<nsIURI> url = do_CreateInstance(kSimpleURICID, &rv); if (NS_FAILED(rv)) return rv; rv = url->SetSpec(aSpec); if (NS_FAILED(rv)) { return rv; } // Unfortunately, people create random about: URIs that don't correspond to // about: modules... Since those URIs will never open a channel, might as // well consider them unsafe for better perf, and just in case. bool isSafe = false; nsCOMPtr<nsIAboutModule> aboutMod; rv = NS_GetAboutModule(url, getter_AddRefs(aboutMod)); if (NS_SUCCEEDED(rv)) { isSafe = IsSafeForUntrustedContent(aboutMod, url); } if (isSafe) { // We need to indicate that this baby is safe. Use an inner URI that // no one but the security manager will see. Make sure to preserve our // path, in case someone decides to hardcode checks for particular // about: URIs somewhere. nsAutoCString spec; rv = url->GetPath(spec); NS_ENSURE_SUCCESS(rv, rv); spec.Insert("moz-safe-about:", 0); nsCOMPtr<nsIURI> inner; rv = NS_NewURI(getter_AddRefs(inner), spec); NS_ENSURE_SUCCESS(rv, rv); nsSimpleNestedURI* outer = new nsNestedAboutURI(inner, aBaseURI); NS_ENSURE_TRUE(outer, NS_ERROR_OUT_OF_MEMORY); // Take a ref to it in the COMPtr we plan to return url = outer; rv = outer->SetSpec(aSpec); NS_ENSURE_SUCCESS(rv, rv); } // We don't want to allow mutation, since it would allow safe and // unsafe URIs to change into each other... NS_TryToSetImmutable(url); url.swap(*result); return NS_OK; }
NS_IMETHODIMP nsChromeProtocolHandler::NewURI(const nsACString &aSpec, const char *aCharset, nsIURI *aBaseURI, nsIURI **result) { // Chrome: URLs (currently) have no additional structure beyond that provided // by standard URLs, so there is no "outer" given to CreateInstance nsresult rv; nsCOMPtr<nsIURL> surl; rv = NS_MutateURI(new mozilla::net::nsStandardURL::Mutator()) .Apply<nsIStandardURLMutator>(&nsIStandardURLMutator::Init, nsIStandardURL::URLTYPE_STANDARD, -1, nsCString(aSpec), aCharset, aBaseURI, nullptr) .Finalize(surl); 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". rv = nsChromeRegistry::Canonify(surl); if (NS_FAILED(rv)) return rv; NS_TryToSetImmutable(surl); surl.forget(result); return NS_OK; }
NS_IMETHODIMP nsIOService::ToImmutableURI(nsIURI* uri, nsIURI** result) { if (!uri) { *result = nullptr; return NS_OK; } nsresult rv = NS_EnsureSafeToReturn(uri, result); NS_ENSURE_SUCCESS(rv, rv); NS_TryToSetImmutable(*result); return NS_OK; }
NS_IMETHODIMP nsSimpleNestedURI::Read(nsIObjectInputStream* aStream) { nsresult rv = nsSimpleURI::Read(aStream); if (NS_FAILED(rv)) return rv; NS_ASSERTION(!mMutable, "How did that happen?"); rv = aStream->ReadObject(PR_TRUE, getter_AddRefs(mInnerURI)); if (NS_FAILED(rv)) return rv; NS_TryToSetImmutable(mInnerURI); return rv; }
NS_IMETHODIMP nsSimpleNestedURI::Read(nsIObjectInputStream* aStream) { nsresult rv = nsSimpleURI::Read(aStream); if (NS_FAILED(rv)) return rv; NS_ASSERTION(!mMutable, "How did that happen?"); nsCOMPtr<nsISupports> supports; rv = aStream->ReadObject(true, getter_AddRefs(supports)); if (NS_FAILED(rv)) return rv; mInnerURI = do_QueryInterface(supports, &rv); if (NS_FAILED(rv)) return rv; NS_TryToSetImmutable(mInnerURI); return rv; }
NS_IMETHODIMP nsSafeAboutProtocolHandler::NewURI(const nsACString &aSpec, const char *aCharset, // ignore charset info nsIURI *aBaseURI, nsIURI **result) { nsresult rv; nsCOMPtr<nsIURI> url = do_CreateInstance(kSimpleURICID, &rv); if (NS_FAILED(rv)) return rv; rv = url->SetSpec(aSpec); if (NS_FAILED(rv)) { return rv; } NS_TryToSetImmutable(url); *result = nullptr; url.swap(*result); return rv; }
nsresult nsImageLoadingContent::LoadImage(const nsAString& aNewURI, PRBool aForce, PRBool aNotify) { // First, get a document (needed for security checks and the like) nsIDocument* doc = GetOurDocument(); if (!doc) { // No reason to bother, I think... return NS_OK; } nsCOMPtr<nsIURI> imageURI; nsresult rv = StringToURI(aNewURI, doc, getter_AddRefs(imageURI)); NS_ENSURE_SUCCESS(rv, rv); // XXXbiesi fire onerror if that failed? PRBool equal; if (aNewURI.IsEmpty() && doc->GetDocumentURI() && NS_SUCCEEDED(doc->GetDocumentURI()->Equals(imageURI, &equal)) && equal) { // Loading an embedded img from the same URI as the document URI will not work // as a resource cannot recursively embed itself. Attempting to do so generally // results in having to pre-emptively close down an in-flight HTTP transaction // and then incurring the significant cost of establishing a new TCP channel. // This is generally triggered from <img src=""> // In light of that, just skip loading it.. // Do make sure to drop our existing image, if any CancelImageRequests(aNotify); return NS_OK; } NS_TryToSetImmutable(imageURI); return LoadImage(imageURI, aForce, aNotify, doc); }
NS_IMETHODIMP nsHostObjectProtocolHandler::NewURI(const nsACString& aSpec, const char *aCharset, nsIURI *aBaseURI, nsIURI **aResult) { *aResult = nullptr; nsresult rv; DataInfo* info = GetDataInfo(aSpec); nsRefPtr<nsHostObjectURI> uri = new nsHostObjectURI(info ? info->mPrincipal.get() : nullptr); rv = uri->SetSpec(aSpec); NS_ENSURE_SUCCESS(rv, rv); NS_TryToSetImmutable(uri); uri.forget(aResult); return NS_OK; }