Bug 1432320 - (Part 2) Change calls to nsIURL.{fileName,fileBaseName,fileExtension} setters to use nsIURLMutator r=mayhemer

MozReview-Commit-ID: D5aTl1i14gI

--HG--
extra : rebase_source : 6d4a8606da971426c554c31d188567cf1e6c8741
This commit is contained in:
Valentin Gosu 2018-01-31 02:33:06 +01:00
parent d4c640e9f7
commit 7183e543b2
5 changed files with 69 additions and 26 deletions

View File

@ -39,6 +39,7 @@
#include "nsITextControlElement.h"
#include "nsUnicharUtils.h"
#include "nsIURL.h"
#include "nsIURIMutator.h"
#include "nsIDocument.h"
#include "nsIScriptSecurityManager.h"
#include "nsIPrincipal.h"
@ -597,15 +598,15 @@ DragDataProducer::Produce(DataTransfer* aDataTransfer,
&validExtension)) ||
!validExtension) {
// Fix the file extension in the URL
nsresult rv = imgUrl->Clone(getter_AddRefs(imgUri));
NS_ENSURE_SUCCESS(rv, rv);
imgUrl = do_QueryInterface(imgUri);
nsAutoCString primaryExtension;
mimeInfo->GetPrimaryExtension(primaryExtension);
imgUrl->SetFileExtension(primaryExtension);
rv = NS_MutateURI(imgUrl)
.Apply<nsIURLMutator>(&nsIURLMutator::SetFileExtension,
primaryExtension,
nullptr)
.Finalize(imgUrl);
NS_ENSURE_SUCCESS(rv, rv);
}
nsAutoCString fileName;

View File

@ -40,6 +40,7 @@
#include "nsGkAtoms.h"
#include "nsIFrame.h"
#include "nsIURI.h"
#include "nsIURIMutator.h"
#include "nsISimpleEnumerator.h"
// image copy stuff
@ -651,15 +652,15 @@ static nsresult AppendImagePromise(nsITransferable* aTransferable,
&validExtension)) ||
!validExtension) {
// Fix the file extension in the URL
rv = imgUrl->Clone(getter_AddRefs(imgUri));
NS_ENSURE_SUCCESS(rv, rv);
imgUrl = do_QueryInterface(imgUri);
nsAutoCString primaryExtension;
mimeInfo->GetPrimaryExtension(primaryExtension);
imgUrl->SetFileExtension(primaryExtension);
rv = NS_MutateURI(imgUri)
.Apply<nsIURLMutator>(&nsIURLMutator::SetFileExtension,
primaryExtension,
nullptr)
.Finalize(imgUrl);
NS_ENSURE_SUCCESS(rv, rv);
}
nsAutoCString fileName;

View File

@ -38,6 +38,7 @@
#include "nsIURL.h"
#include "nsIFileURL.h"
#include "nsIURIMutator.h"
#include "nsIWebProgressListener.h"
#include "nsIAuthPrompt.h"
#include "nsIPrompt.h"
@ -855,11 +856,19 @@ NS_IMETHODIMP nsWebBrowserPersist::OnStartRequest(
if (data->mCalcFileExt && !(mPersistFlags & PERSIST_FLAGS_DONT_CHANGE_FILENAMES))
{
nsCOMPtr<nsIURI> uriWithExt;
// this is the first point at which the server can tell us the mimetype
CalculateAndAppendFileExt(data->mFile, channel, data->mOriginalLocation);
nsresult rv = CalculateAndAppendFileExt(data->mFile, channel, data->mOriginalLocation, uriWithExt);
if (NS_SUCCEEDED(rv)) {
data->mFile = uriWithExt;
}
// now make filename conformant and unique
CalculateUniqueFilename(data->mFile);
nsCOMPtr<nsIURI> uniqueFilenameURI;
rv = CalculateUniqueFilename(data->mFile, uniqueFilenameURI);
if (NS_SUCCEEDED(rv)) {
data->mFile = uniqueFilenameURI;
}
}
// compare uris and bail before we add to output map if they are equal
@ -1959,7 +1968,7 @@ void nsWebBrowserPersist::CleanupLocalFiles()
}
nsresult
nsWebBrowserPersist::CalculateUniqueFilename(nsIURI *aURI)
nsWebBrowserPersist::CalculateUniqueFilename(nsIURI *aURI, nsCOMPtr<nsIURI>& aOutURI)
{
nsCOMPtr<nsIURL> url(do_QueryInterface(aURI));
NS_ENSURE_TRUE(url, NS_ERROR_FAILURE);
@ -2111,10 +2120,16 @@ nsWebBrowserPersist::CalculateUniqueFilename(nsIURI *aURI)
}
else
{
url->SetFileName(filename);
return NS_MutateURI(url)
.Apply<nsIURLMutator>(&nsIURLMutator::SetFileName,
filename,
nullptr)
.Finalize(aOutURI);
}
}
// TODO (:valentin) This method should always clone aURI
aOutURI = aURI;
return NS_OK;
}
@ -2183,9 +2198,12 @@ nsWebBrowserPersist::MakeFilenameFromURI(nsIURI *aURI, nsString &aFilename)
nsresult
nsWebBrowserPersist::CalculateAndAppendFileExt(nsIURI *aURI, nsIChannel *aChannel, nsIURI *aOriginalURIWithExtension)
nsWebBrowserPersist::CalculateAndAppendFileExt(nsIURI *aURI,
nsIChannel *aChannel,
nsIURI *aOriginalURIWithExtension,
nsCOMPtr<nsIURI>& aOutURI)
{
nsresult rv;
nsresult rv = NS_OK;
if (!mMIMEService)
{
@ -2280,13 +2298,19 @@ nsWebBrowserPersist::CalculateAndAppendFileExt(nsIURI *aURI, nsIChannel *aChanne
}
else
{
url->SetFileName(newFileName);
return NS_MutateURI(url)
.Apply<nsIURLMutator>(&nsIURLMutator::SetFileName,
newFileName,
nullptr)
.Finalize(aOutURI);
}
}
}
}
// TODO (:valentin) This method should always clone aURI
aOutURI = aURI;
return NS_OK;
}
@ -2683,10 +2707,14 @@ nsWebBrowserPersist::SaveSubframeContent(
NS_ENSURE_SUCCESS(rv, rv);
// Make frame document & data path conformant and unique
rv = CalculateUniqueFilename(frameURI);
nsCOMPtr<nsIURI> out;
rv = CalculateUniqueFilename(frameURI, out);
NS_ENSURE_SUCCESS(rv, rv);
rv = CalculateUniqueFilename(frameDataURI);
frameURI = out;
rv = CalculateUniqueFilename(frameDataURI, out);
NS_ENSURE_SUCCESS(rv, rv);
frameDataURI = out;
mCurrentThingsToPersist++;

View File

@ -105,8 +105,9 @@ private:
nsresult StartUpload(nsIInputStream *aInputStream, nsIURI *aDestinationURI,
const nsACString &aContentType);
nsresult CalculateAndAppendFileExt(nsIURI *aURI, nsIChannel *aChannel,
nsIURI *aOriginalURIWithExtension);
nsresult CalculateUniqueFilename(nsIURI *aURI);
nsIURI *aOriginalURIWithExtension,
nsCOMPtr<nsIURI>& aOutURI);
nsresult CalculateUniqueFilename(nsIURI *aURI, nsCOMPtr<nsIURI>& aOutURI);
nsresult MakeFilenameFromURI(
nsIURI *aURI, nsString &aFilename);
nsresult StoreURI(

View File

@ -303,7 +303,7 @@ add_test(function test_hugeStringThrows()
let hugeString = new Array(maxLen + 1).fill("a").join("");
let properties = ["scheme", "userPass", "username",
"password", "hostPort", "host", "pathQueryRef", "ref",
"query", "fileName", "filePath", "fileBaseName", "fileExtension"];
"query", "filePath"];
for (let prop of properties) {
Assert.throws(() => url[prop] = hugeString,
/NS_ERROR_MALFORMED_URI/,
@ -314,6 +314,18 @@ add_test(function test_hugeStringThrows()
/NS_ERROR_MALFORMED_URI/,
"Passing a huge string to setSpec should throw");
let setters = [
{ method: "setFileName", qi: Ci.nsIURLMutator },
{ method: "setFileExtension", qi: Ci.nsIURLMutator },
{ method: "setFileBaseName", qi: Ci.nsIURLMutator },
];
for (let prop of setters) {
Assert.throws(() => url = url.mutate().QueryInterface(prop.qi)[prop.method](hugeString).finalize(),
/NS_ERROR_MALFORMED_URI/,
`Passing a huge string to "${prop.method}" should throw`);
}
run_next_test();
});
@ -330,7 +342,7 @@ add_test(function test_filterWhitespace()
Assert.equal(url.spec, "http://test.com/pa%0D%0A%09th?qu%0D%0A%09ery#hash");
url.ref = "ha\r\n\tsh";
Assert.equal(url.spec, "http://test.com/pa%0D%0A%09th?qu%0D%0A%09ery#ha%0D%0A%09sh");
url.fileName = "fi\r\n\tle.name";
url = url.mutate().QueryInterface(Ci.nsIURLMutator).setFileName("fi\r\n\tle.name").finalize();
Assert.equal(url.spec, "http://test.com/fi%0D%0A%09le.name?qu%0D%0A%09ery#ha%0D%0A%09sh");
run_next_test();
@ -399,7 +411,7 @@ add_test(function test_encode_C0_and_space()
Assert.equal(url.spec, "http://example.com/pa%00th?qu%00ery#hash");
url.ref = "ha\0sh";
Assert.equal(url.spec, "http://example.com/pa%00th?qu%00ery#ha%00sh");
url.fileName = "fi\0le.name";
url = url.mutate().QueryInterface(Ci.nsIURLMutator).setFileName("fi\0le.name").finalize();
Assert.equal(url.spec, "http://example.com/fi%00le.name?qu%00ery#ha%00sh");
run_next_test();