Bug 1722925 - Avoid unnecessary string copies by nsCString constructor r=necko-reviewers,kershaw

Since the Find method does not exist on nsACString, I had to use std::search
to find the "data:" substring in the spec.

Differential Revision: https://phabricator.services.mozilla.com/D122082
This commit is contained in:
Valentin Gosu 2021-08-12 07:40:58 +00:00
parent c6b1fa7e03
commit 32b251ca35
6 changed files with 34 additions and 35 deletions

View File

@ -67,11 +67,10 @@ nsChromeProtocolHandler::GetProtocolFlags(uint32_t* result) {
// by standard URLs, so there is no "outer" given to CreateInstance
nsresult rv;
nsCOMPtr<nsIURI> surl;
nsCOMPtr<nsIURI> base(aBaseURI);
rv =
NS_MutateURI(new mozilla::net::nsStandardURL::Mutator())
.Apply(&nsIStandardURLMutator::Init, nsIStandardURL::URLTYPE_STANDARD,
-1, nsCString(aSpec), aCharset, aBaseURI, nullptr)
-1, aSpec, aCharset, aBaseURI, nullptr)
.Finalize(surl);
if (NS_FAILED(rv)) {

View File

@ -252,7 +252,7 @@ nsresult nsJARURI::SetSpecWithBase(const nsACString& aSpec, nsIURI* aBaseURL) {
rv = NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID)
.Apply(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_NO_AUTHORITY, -1, nsCString(aSpec),
nsIStandardURL::URLTYPE_NO_AUTHORITY, -1, aSpec,
mCharsetHint.get(), otherJAR->mJAREntry, nullptr)
.Finalize(entry);
if (NS_FAILED(rv)) {
@ -513,7 +513,7 @@ nsJARURI::GetFileName(nsACString& fileName) {
nsresult nsJARURI::SetFileNameInternal(const nsACString& fileName) {
return NS_MutateURI(mJAREntry)
.Apply(&nsIURLMutator::SetFileName, nsCString(fileName), nullptr)
.Apply(&nsIURLMutator::SetFileName, fileName, nullptr)
.Finalize(mJAREntry);
}
@ -524,7 +524,7 @@ nsJARURI::GetFileBaseName(nsACString& fileBaseName) {
nsresult nsJARURI::SetFileBaseNameInternal(const nsACString& fileBaseName) {
return NS_MutateURI(mJAREntry)
.Apply(&nsIURLMutator::SetFileBaseName, nsCString(fileBaseName), nullptr)
.Apply(&nsIURLMutator::SetFileBaseName, fileBaseName, nullptr)
.Finalize(mJAREntry);
}
@ -535,8 +535,7 @@ nsJARURI::GetFileExtension(nsACString& fileExtension) {
nsresult nsJARURI::SetFileExtensionInternal(const nsACString& fileExtension) {
return NS_MutateURI(mJAREntry)
.Apply(&nsIURLMutator::SetFileExtension, nsCString(fileExtension),
nullptr)
.Apply(&nsIURLMutator::SetFileExtension, fileExtension, nullptr)
.Finalize(mJAREntry);
}

View File

@ -1730,10 +1730,9 @@ nsresult NS_NewURI(nsIURI** result, const char* spec,
static nsresult NewStandardURI(const nsACString& aSpec, const char* aCharset,
nsIURI* aBaseURI, int32_t aDefaultPort,
nsIURI** aURI) {
nsCOMPtr<nsIURI> base(aBaseURI);
return NS_MutateURI(new nsStandardURL::Mutator())
.Apply(&nsIStandardURLMutator::Init, nsIStandardURL::URLTYPE_AUTHORITY,
aDefaultPort, nsCString(aSpec), aCharset, base, nullptr)
aDefaultPort, aSpec, aCharset, aBaseURI, nullptr)
.Finalize(aURI);
}
@ -1816,12 +1815,11 @@ nsresult NS_NewURI(nsIURI** aURI, const nsACString& aSpec,
}
#endif
nsCOMPtr<nsIURI> base(aBaseURI);
return NS_MutateURI(new nsStandardURL::Mutator())
.Apply(&nsIFileURLMutator::MarkFileURL)
.Apply(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_NO_AUTHORITY, -1, buf, aCharset, base,
nullptr)
nsIStandardURL::URLTYPE_NO_AUTHORITY, -1, buf, aCharset,
aBaseURI, nullptr)
.Finalize(aURI);
}
@ -1865,10 +1863,9 @@ nsresult NS_NewURI(nsIURI** aURI, const nsACString& aSpec,
}
if (scheme.EqualsLiteral("indexeddb")) {
nsCOMPtr<nsIURI> base(aBaseURI);
return NS_MutateURI(new nsStandardURL::Mutator())
.Apply(&nsIStandardURLMutator::Init, nsIStandardURL::URLTYPE_AUTHORITY,
0, nsCString(aSpec), aCharset, base, nullptr)
0, aSpec, aCharset, aBaseURI, nullptr)
.Finalize(aURI);
}
@ -1903,10 +1900,8 @@ nsresult NS_NewURI(nsIURI** aURI, const nsACString& aSpec,
}
if (scheme.EqualsLiteral("jar")) {
nsCOMPtr<nsIURI> base(aBaseURI);
return NS_MutateURI(new nsJARURI::Mutator())
.Apply(&nsIJARURIMutator::SetSpecBaseCharset, nsCString(aSpec), base,
aCharset)
.Apply(&nsIJARURIMutator::SetSpecBaseCharset, aSpec, aBaseURI, aCharset)
.Finalize(aURI);
}
@ -1918,19 +1913,17 @@ nsresult NS_NewURI(nsIURI** aURI, const nsACString& aSpec,
#ifdef MOZ_WIDGET_GTK
if (scheme.EqualsLiteral("smb") || scheme.EqualsLiteral("sftp")) {
nsCOMPtr<nsIURI> base(aBaseURI);
return NS_MutateURI(new nsStandardURL::Mutator())
.Apply(&nsIStandardURLMutator::Init, nsIStandardURL::URLTYPE_STANDARD,
-1, nsCString(aSpec), aCharset, base, nullptr)
-1, aSpec, aCharset, aBaseURI, nullptr)
.Finalize(aURI);
}
#endif
if (scheme.EqualsLiteral("android")) {
nsCOMPtr<nsIURI> base(aBaseURI);
return NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID)
.Apply(&nsIStandardURLMutator::Init, nsIStandardURL::URLTYPE_STANDARD,
-1, nsCString(aSpec), aCharset, base, nullptr)
-1, aSpec, aCharset, aBaseURI, nullptr)
.Finalize(aURI);
}

View File

@ -54,17 +54,15 @@ nsDataHandler::GetProtocolFlags(uint32_t* result) {
nsresult rv;
nsCOMPtr<nsIURI> uri;
const nsPromiseFlatCString& spec = PromiseFlatCString(aSpec);
if (aBaseURI && !spec.IsEmpty() && spec[0] == '#') {
if (aBaseURI && !aSpec.IsEmpty() && aSpec[0] == '#') {
// Looks like a reference instead of a fully-specified URI.
// --> initialize |uri| as a clone of |aBaseURI|, with ref appended.
rv = NS_MutateURI(aBaseURI).SetRef(spec).Finalize(uri);
rv = NS_MutateURI(aBaseURI).SetRef(aSpec).Finalize(uri);
} else {
// Otherwise, we'll assume |spec| is a fully-specified data URI
// Otherwise, we'll assume |aSpec| is a fully-specified data URI
nsAutoCString contentType;
bool base64;
rv = ParseURI(spec, contentType, /* contentCharset = */ nullptr, base64,
rv = ParseURI(aSpec, contentType, /* contentCharset = */ nullptr, base64,
/* dataBuffer = */ nullptr);
if (NS_FAILED(rv)) return rv;
@ -74,12 +72,12 @@ nsDataHandler::GetProtocolFlags(uint32_t* result) {
contentType.Find("xml") == kNotFound)) {
// it's ascii encoded binary, don't let any spaces in
rv = NS_MutateURI(new mozilla::net::nsSimpleURI::Mutator())
.Apply(&nsISimpleURIMutator::SetSpecAndFilterWhitespace, spec,
.Apply(&nsISimpleURIMutator::SetSpecAndFilterWhitespace, aSpec,
nullptr)
.Finalize(uri);
} else {
rv = NS_MutateURI(new mozilla::net::nsSimpleURI::Mutator())
.SetSpec(spec)
.SetSpec(aSpec)
.Finalize(uri);
}
}
@ -230,18 +228,28 @@ nsresult nsDataHandler::ParsePathWithoutRef(
return NS_OK;
}
nsresult nsDataHandler::ParseURI(const nsCString& spec, nsCString& contentType,
static inline char ToLower(const char c) {
if (c >= 'A' && c <= 'Z') {
return char(c + ('a' - 'A'));
}
return c;
}
nsresult nsDataHandler::ParseURI(const nsACString& spec, nsCString& contentType,
nsCString* contentCharset, bool& isBase64,
nsCString* dataBuffer) {
static constexpr auto kDataScheme = "data:"_ns;
// move past "data:"
int32_t scheme = spec.Find(kDataScheme, /* aIgnoreCase = */ true);
if (scheme == kNotFound) {
// malformed uri
const char* pos = std::search(
spec.BeginReading(), spec.EndReading(), kDataScheme.BeginReading(),
kDataScheme.EndReading(),
[](const char a, const char b) { return ToLower(a) == ToLower(b); });
if (pos == spec.EndReading()) {
return NS_ERROR_MALFORMED_URI;
}
uint32_t scheme = pos - spec.BeginReading();
scheme += kDataScheme.Length();
// Find the start of the hash ref if present.

View File

@ -33,7 +33,7 @@ class nsDataHandler : public nsIProtocolHandler,
// (the given spec will temporarily be modified but will be returned
// to the original before returning)
// contentCharset and dataBuffer can be nullptr if they are not needed.
[[nodiscard]] static nsresult ParseURI(const nsCString& spec,
[[nodiscard]] static nsresult ParseURI(const nsACString& spec,
nsCString& contentType,
nsCString* contentCharset,
bool& isBase64, nsCString* dataBuffer);

View File

@ -362,7 +362,7 @@ nsresult Http2Stream::MakeOriginURL(const nsACString& scheme,
.Apply(&nsIStandardURLMutator::Init, nsIStandardURL::URLTYPE_AUTHORITY,
scheme.EqualsLiteral("http") ? NS_HTTP_DEFAULT_PORT
: NS_HTTPS_DEFAULT_PORT,
nsCString(origin), nullptr, nullptr, nullptr)
origin, nullptr, nullptr, nullptr)
.Finalize(url);
}