Backed out 2 changesets (bug 1722925) for causing reftest failures in color_quads. CLOSED TREE

Backed out changeset 95a6eacbef27 (bug 1722925)
Backed out changeset 2e2a98aeca5c (bug 1722925)
This commit is contained in:
Iulian Moraru 2021-08-12 12:22:34 +03:00
parent c4ff1ff63e
commit 32090542c0
17 changed files with 122 additions and 89 deletions

View File

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

View File

@ -468,8 +468,8 @@ nsresult DragDataProducer::GetImageData(imgIContainer* aImage,
mimeInfo->GetPrimaryExtension(primaryExtension);
if (!primaryExtension.IsEmpty()) {
rv = NS_MutateURI(imgUrl)
.Apply(&nsIURLMutator::SetFileExtension, primaryExtension,
nullptr)
.Apply(NS_MutatorMethod(&nsIURLMutator::SetFileExtension,
primaryExtension, nullptr))
.Finalize(imgUrl);
NS_ENSURE_SUCCESS(rv, rv);
}

View File

@ -646,8 +646,8 @@ static nsresult AppendImagePromise(nsITransferable* aTransferable,
mimeInfo->GetPrimaryExtension(primaryExtension);
if (!primaryExtension.IsEmpty()) {
rv = NS_MutateURI(imgUri)
.Apply(&nsIURLMutator::SetFileExtension, primaryExtension,
nullptr)
.Apply(NS_MutatorMethod(&nsIURLMutator::SetFileExtension,
primaryExtension, nullptr))
.Finalize(imgUrl);
NS_ENSURE_SUCCESS(rv, rv);
}

View File

@ -868,7 +868,7 @@ BlobURLProtocolHandler::GetFlagsForURI(nsIURI* aURI, uint32_t* aResult) {
return NS_MutateURI(new BlobURL::Mutator())
.SetSpec(aSpec)
.Apply(&nsIBlobURLMutator::SetRevoked, revoked)
.Apply(NS_MutatorMethod(&nsIBlobURLMutator::SetRevoked, revoked))
.Finalize(aResult);
}

View File

@ -1150,7 +1150,7 @@ nsJSProtocolHandler::GetProtocolFlags(uint32_t* result) {
NS_MutateURI mutator(new nsJSURI::Mutator());
nsCOMPtr<nsIURI> base(aBaseURI);
mutator.Apply(&nsIJSURIMutator::SetBase, base);
mutator.Apply(NS_MutatorMethod(&nsIJSURIMutator::SetBase, base));
if (!aCharset || !nsCRT::strcasecmp("UTF-8", aCharset)) {
mutator.SetSpec(aSpec);
} else {

View File

@ -2064,11 +2064,11 @@ nsresult nsWebBrowserPersist::CalculateUniqueFilename(
// Resync the URI with the file after the extension has been appended
return NS_MutateURI(aURI)
.Apply(&nsIFileURLMutator::SetFile, localFile)
.Apply(NS_MutatorMethod(&nsIFileURLMutator::SetFile, localFile))
.Finalize(aOutURI);
}
return NS_MutateURI(url)
.Apply(&nsIURLMutator::SetFileName, filename, nullptr)
.Apply(NS_MutatorMethod(&nsIURLMutator::SetFileName, filename, nullptr))
.Finalize(aOutURI);
}
@ -2217,11 +2217,12 @@ nsresult nsWebBrowserPersist::CalculateAndAppendFileExt(
// Resync the URI with the file after the extension has been appended
return NS_MutateURI(url)
.Apply(&nsIFileURLMutator::SetFile, localFile)
.Apply(NS_MutatorMethod(&nsIFileURLMutator::SetFile, localFile))
.Finalize(aOutURI);
}
return NS_MutateURI(url)
.Apply(&nsIURLMutator::SetFileName, newFileName, nullptr)
.Apply(NS_MutatorMethod(&nsIURLMutator::SetFileName, newFileName,
nullptr))
.Finalize(aOutURI);
}
}

View File

@ -84,8 +84,9 @@ nsresult nsJARURI::CreateEntryURL(const nsACString& entryFilename,
// Flatten the concatenation, just in case. See bug 128288
nsAutoCString spec(NS_BOGUS_ENTRY_SCHEME + entryFilename);
return NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID)
.Apply(&nsIStandardURLMutator::Init, nsIStandardURL::URLTYPE_NO_AUTHORITY,
-1, spec, charset, nullptr, nullptr)
.Apply(NS_MutatorMethod(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_NO_AUTHORITY, -1, spec,
charset, nullptr, nullptr))
.Finalize(url);
}
@ -251,9 +252,10 @@ nsresult nsJARURI::SetSpecWithBase(const nsACString& aSpec, nsIURI* aBaseURL) {
nsCOMPtr<nsIURI> entry;
rv = NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID)
.Apply(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_NO_AUTHORITY, -1, aSpec,
mCharsetHint.get(), otherJAR->mJAREntry, nullptr)
.Apply(NS_MutatorMethod(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_NO_AUTHORITY, -1,
nsCString(aSpec), mCharsetHint.get(),
otherJAR->mJAREntry, nullptr))
.Finalize(entry);
if (NS_FAILED(rv)) {
return rv;
@ -513,7 +515,8 @@ nsJARURI::GetFileName(nsACString& fileName) {
nsresult nsJARURI::SetFileNameInternal(const nsACString& fileName) {
return NS_MutateURI(mJAREntry)
.Apply(&nsIURLMutator::SetFileName, fileName, nullptr)
.Apply(NS_MutatorMethod(&nsIURLMutator::SetFileName, nsCString(fileName),
nullptr))
.Finalize(mJAREntry);
}
@ -524,7 +527,8 @@ nsJARURI::GetFileBaseName(nsACString& fileBaseName) {
nsresult nsJARURI::SetFileBaseNameInternal(const nsACString& fileBaseName) {
return NS_MutateURI(mJAREntry)
.Apply(&nsIURLMutator::SetFileBaseName, fileBaseName, nullptr)
.Apply(NS_MutatorMethod(&nsIURLMutator::SetFileBaseName,
nsCString(fileBaseName), nullptr))
.Finalize(mJAREntry);
}
@ -535,7 +539,8 @@ nsJARURI::GetFileExtension(nsACString& fileExtension) {
nsresult nsJARURI::SetFileExtensionInternal(const nsACString& fileExtension) {
return NS_MutateURI(mJAREntry)
.Apply(&nsIURLMutator::SetFileExtension, fileExtension, nullptr)
.Apply(NS_MutatorMethod(&nsIURLMutator::SetFileExtension,
nsCString(fileExtension), nullptr))
.Finalize(mJAREntry);
}

View File

@ -11,7 +11,7 @@ interface nsIURIMutator;
%{C++
#include "nsString.h"
#include "nsCOMPtr.h"
#include <utility>
#include <functional>
#undef SetPort // XXX Windows!
@ -301,6 +301,7 @@ interface nsIURIMutator : nsIURISetters
%{C++
// This templated struct is used to extract the class type of the method
// passed to NS_MutatorMethod.
template <typename Method>
struct nsMethodTypeTraits;
@ -318,6 +319,25 @@ struct nsMethodTypeTraits<R(__stdcall C::*)(As...)>
};
#endif
// This helper returns a std::function that will be applied on the
// nsIURIMutator. The type of `Interface` will be deduced from the method type.
// aMethod will be called on the target object if it successfully QIs to
// `Interface`, and the arguments will be passed to the call.
template <typename Method, typename... Args>
const std::function<nsresult(nsIURIMutator*)>
NS_MutatorMethod(Method aMethod, Args ...aArgs)
{
// Capture arguments by value, otherwise we crash.
return [=](nsIURIMutator* aMutator) {
typedef typename nsMethodTypeTraits<Method>::class_type Interface;
nsresult rv;
nsCOMPtr<Interface> target = do_QueryInterface(aMutator, &rv);
NS_ENSURE_SUCCESS(rv, rv);
rv = (target->*aMethod)(aArgs...);
if (NS_FAILED(rv)) return rv;
return NS_OK;
};
}
// This class provides a useful helper that allows chaining of setter operations
class MOZ_STACK_CLASS NS_MutateURI
@ -457,7 +477,7 @@ public:
* nsCOMPtr<nsIURI> uri;
* nsresult rv = NS_MutateURI(new URIClass::Mutator())
* .SetSpec(aSpec)
* .Apply(&SomeInterface::Method, arg1, arg2)
* .Apply(NS_MutatorMethod(&SomeInterface::Method, arg1, arg2))
* .Finalize(uri);
*
* If mMutator does not implement SomeInterface, do_QueryInterface will fail
@ -465,15 +485,12 @@ public:
* If aMethod does not exist, or if there is a mismatch between argument
* types, or the number of arguments, then there will be a compile error.
*/
template <typename Method, typename... Args>
NS_MutateURI& Apply(Method aMethod, Args&&... aArgs)
NS_MutateURI& Apply(const std::function<nsresult(nsIURIMutator*)>& aFunction)
{
typedef typename nsMethodTypeTraits<Method>::class_type Interface;
NS_ENSURE_SUCCESS(mStatus, *this);
nsCOMPtr<Interface> target = do_QueryInterface(mMutator, &mStatus);
MOZ_ASSERT(NS_SUCCEEDED(mStatus), "URL object must implement interface");
NS_ENSURE_SUCCESS(mStatus, *this);
mStatus = (target->*aMethod)(std::forward<Args>(aArgs)...);
if (NS_FAILED(mStatus)) {
return *this;
}
mStatus = aFunction(mMutator);
return *this;
}

View File

@ -1730,9 +1730,11 @@ 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, aSpec, aCharset, aBaseURI, nullptr)
.Apply(NS_MutatorMethod(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_AUTHORITY, aDefaultPort,
nsCString(aSpec), aCharset, base, nullptr))
.Finalize(aURI);
}
@ -1815,11 +1817,12 @@ 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,
aBaseURI, nullptr)
.Apply(NS_MutatorMethod(&nsIFileURLMutator::MarkFileURL))
.Apply(NS_MutatorMethod(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_NO_AUTHORITY, -1, buf,
aCharset, base, nullptr))
.Finalize(aURI);
}
@ -1863,9 +1866,11 @@ 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, aSpec, aCharset, aBaseURI, nullptr)
.Apply(NS_MutatorMethod(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_AUTHORITY, 0,
nsCString(aSpec), aCharset, base, nullptr))
.Finalize(aURI);
}
@ -1900,8 +1905,10 @@ 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, aSpec, aBaseURI, aCharset)
.Apply(NS_MutatorMethod(&nsIJARURIMutator::SetSpecBaseCharset,
nsCString(aSpec), base, aCharset))
.Finalize(aURI);
}
@ -1913,17 +1920,21 @@ 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, aSpec, aCharset, aBaseURI, nullptr)
.Apply(NS_MutatorMethod(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_STANDARD, -1,
nsCString(aSpec), aCharset, base, 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, aSpec, aCharset, aBaseURI, nullptr)
.Apply(NS_MutatorMethod(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_STANDARD, -1,
nsCString(aSpec), aCharset, base, nullptr))
.Finalize(aURI);
}
@ -3028,7 +3039,8 @@ nsresult NS_GetSecureUpgradedURI(nsIURI* aURI, nsIURI** aUpgradedURI) {
// Change the default port to 443:
nsCOMPtr<nsIStandardURL> stdURL = do_QueryInterface(aURI);
if (stdURL) {
mutator.Apply(&nsIStandardURLMutator::SetDefaultPort, 443, nullptr);
mutator.Apply(
NS_MutatorMethod(&nsIStandardURLMutator::SetDefaultPort, 443, nullptr));
} else {
// If we don't have a nsStandardURL, fall back to using GetPort/SetPort.
// XXXdholbert Is this function even called with a non-nsStandardURL arg,

View File

@ -311,11 +311,12 @@ bool TRRService::MaybeSetPrivateURI(const nsACString& aURI) {
}
nsCOMPtr<nsIURI> url;
nsresult rv = NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID)
.Apply(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_STANDARD, 443, newURI,
nullptr, nullptr, nullptr)
.Finalize(url);
nsresult rv =
NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID)
.Apply(NS_MutatorMethod(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_STANDARD, 443,
newURI, nullptr, nullptr, nullptr))
.Finalize(url);
if (NS_FAILED(rv)) {
LOG(("TRRService::MaybeSetPrivateURI failed to create URI!\n"));
return false;
@ -864,8 +865,9 @@ bool TRRService::MaybeBootstrap(const nsACString& aPossible,
nsCOMPtr<nsIURI> url;
nsresult rv =
NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID)
.Apply(&nsIStandardURLMutator::Init, nsIStandardURL::URLTYPE_STANDARD,
443, mPrivateURI, nullptr, nullptr, nullptr)
.Apply(NS_MutatorMethod(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_STANDARD, 443,
mPrivateURI, nullptr, nullptr, nullptr))
.Finalize(url);
if (NS_FAILED(rv)) {
LOG(("TRRService::MaybeBootstrap failed to create URI!\n"));

View File

@ -149,8 +149,10 @@ nsresult nsAboutProtocolHandler::CreateNewURI(const nsACString& aSpec,
rv = NS_NewURI(getter_AddRefs(inner), spec);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIURI> base(aBaseURI);
rv = NS_MutateURI(new nsNestedAboutURI::Mutator())
.Apply(&nsINestedAboutURIMutator::InitWithBase, inner, aBaseURI)
.Apply(NS_MutatorMethod(&nsINestedAboutURIMutator::InitWithBase,
inner, base))
.SetSpec(aSpec)
.Finalize(url);
NS_ENSURE_SUCCESS(rv, rv);

View File

@ -54,15 +54,17 @@ nsDataHandler::GetProtocolFlags(uint32_t* result) {
nsresult rv;
nsCOMPtr<nsIURI> uri;
if (aBaseURI && !aSpec.IsEmpty() && aSpec[0] == '#') {
const nsPromiseFlatCString& spec = PromiseFlatCString(aSpec);
if (aBaseURI && !spec.IsEmpty() && spec[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(aSpec).Finalize(uri);
rv = NS_MutateURI(aBaseURI).SetRef(spec).Finalize(uri);
} else {
// Otherwise, we'll assume |aSpec| is a fully-specified data URI
// Otherwise, we'll assume |spec| is a fully-specified data URI
nsAutoCString contentType;
bool base64;
rv = ParseURI(aSpec, contentType, /* contentCharset = */ nullptr, base64,
rv = ParseURI(spec, contentType, /* contentCharset = */ nullptr, base64,
/* dataBuffer = */ nullptr);
if (NS_FAILED(rv)) return rv;
@ -72,12 +74,13 @@ 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, aSpec,
nullptr)
.Apply(NS_MutatorMethod(
&nsISimpleURIMutator::SetSpecAndFilterWhitespace, spec,
nullptr))
.Finalize(uri);
} else {
rv = NS_MutateURI(new mozilla::net::nsSimpleURI::Mutator())
.SetSpec(aSpec)
.SetSpec(spec)
.Finalize(uri);
}
}
@ -228,28 +231,18 @@ nsresult nsDataHandler::ParsePathWithoutRef(
return NS_OK;
}
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,
nsresult nsDataHandler::ParseURI(const nsCString& spec, nsCString& contentType,
nsCString* contentCharset, bool& isBase64,
nsCString* dataBuffer) {
static constexpr auto kDataScheme = "data:"_ns;
// move past "data:"
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()) {
int32_t scheme = spec.Find(kDataScheme, /* aIgnoreCase = */ true);
if (scheme == kNotFound) {
// malformed uri
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 nsACString& spec,
[[nodiscard]] static nsresult ParseURI(const nsCString& spec,
nsCString& contentType,
nsCString* contentCharset,
bool& isBase64, nsCString* dataBuffer);

View File

@ -225,7 +225,7 @@ nsFileProtocolHandler::NewFileURI(nsIFile* aFile, nsIURI** aResult) {
// NOTE: the origin charset is assigned the value of the platform
// charset by the SetFile method.
return NS_MutateURI(new nsStandardURL::Mutator())
.Apply(&nsIFileURLMutator::SetFile, file)
.Apply(NS_MutatorMethod(&nsIFileURLMutator::SetFile, file))
.Finalize(aResult);
}

View File

@ -359,10 +359,11 @@ nsresult Http2Stream::MakeOriginURL(const nsACString& scheme,
const nsACString& origin,
nsCOMPtr<nsIURI>& url) {
return NS_MutateURI(new nsStandardURL::Mutator())
.Apply(&nsIStandardURLMutator::Init, nsIStandardURL::URLTYPE_AUTHORITY,
scheme.EqualsLiteral("http") ? NS_HTTP_DEFAULT_PORT
: NS_HTTPS_DEFAULT_PORT,
origin, nullptr, nullptr, nullptr)
.Apply(NS_MutatorMethod(
&nsIStandardURLMutator::Init, nsIStandardURL::URLTYPE_AUTHORITY,
scheme.EqualsLiteral("http") ? NS_HTTP_DEFAULT_PORT
: NS_HTTPS_DEFAULT_PORT,
nsCString(origin), nullptr, nullptr, nullptr))
.Finalize(url);
}

View File

@ -351,11 +351,11 @@ nsresult SubstitutingProtocolHandler::NewURI(const nsACString& aSpec,
nsCOMPtr<nsIURI> base(aBaseURI);
nsCOMPtr<nsIURL> uri;
rv =
NS_MutateURI(new SubstitutingURL::Mutator())
.Apply(&nsIStandardURLMutator::Init, nsIStandardURL::URLTYPE_STANDARD,
-1, spec, aCharset, base, nullptr)
.Finalize(uri);
rv = NS_MutateURI(new SubstitutingURL::Mutator())
.Apply(NS_MutatorMethod(&nsIStandardURLMutator::Init,
nsIStandardURL::URLTYPE_STANDARD, -1, spec,
aCharset, base, nullptr))
.Finalize(uri);
if (NS_FAILED(rv)) return rv;
nsAutoCString host;

View File

@ -91,7 +91,7 @@ nsresult nsViewSourceHandler::CreateNewURI(const nsACString& aSpec,
nsCOMPtr<nsIURI> uri;
rv = NS_MutateURI(new nsSimpleNestedURI::Mutator())
.Apply(&nsINestedURIMutator::Init, innerURI)
.Apply(NS_MutatorMethod(&nsINestedURIMutator::Init, innerURI))
.SetSpec(asciiSpec)
.Finalize(uri);
if (NS_FAILED(rv)) {