mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-07 18:04:46 +00:00
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:
parent
c6b1fa7e03
commit
32b251ca35
@ -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)) {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user