Bug 1433958 - Make NS_MutateURI methods warn immediately after calling method that fails
Calling NS_ENSURE_SUCCESS at the begining of the methods shows the error in the console, but what we really care about is where the error code comes from. So it is best to use if (NS_FAILED(mStatus) {} at the begining of the methods, and NS_ENSURE_SUCCESS right after calling the appropriate method on mMutator.
MozReview-Commit-ID: 5vVuHk3N4FU
--- a/netwerk/base/nsIURIMutator.idl
+++ b/netwerk/base/nsIURIMutator.idl
@@ -310,94 +310,134 @@ class MOZ_STACK_CLASS NS_MutateURI
public:
explicit NS_MutateURI(nsIURI* aURI);
explicit NS_MutateURI(const char * aContractID);
explicit NS_MutateURI(nsIURIMutator* m)
{
mStatus = m ? NS_OK : NS_ERROR_NULL_POINTER;
mMutator = m;
+ NS_ENSURE_SUCCESS_VOID(mStatus);
}
NS_MutateURI& SetSpec(const nsACString& aSpec)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetSpec(aSpec, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetSpec(aSpec, nullptr);
return *this;
}
NS_MutateURI& SetScheme(const nsACString& aScheme)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetScheme(aScheme, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetScheme(aScheme, nullptr);
return *this;
}
NS_MutateURI& SetUserPass(const nsACString& aUserPass)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetUserPass(aUserPass, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetUserPass(aUserPass, nullptr);
return *this;
}
NS_MutateURI& SetUsername(const nsACString& aUsername)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetUsername(aUsername, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetUsername(aUsername, nullptr);
return *this;
}
NS_MutateURI& SetPassword(const nsACString& aPassword)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetPassword(aPassword, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetPassword(aPassword, nullptr);
return *this;
}
NS_MutateURI& SetHostPort(const nsACString& aHostPort)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetHostPort(aHostPort, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetHostPort(aHostPort, nullptr);
return *this;
}
NS_MutateURI& SetHost(const nsACString& aHost)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetHost(aHost, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetHost(aHost, nullptr);
return *this;
}
NS_MutateURI& SetPort(int32_t aPort)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetPort(aPort, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetPort(aPort, nullptr);
return *this;
}
NS_MutateURI& SetPathQueryRef(const nsACString& aPathQueryRef)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetPathQueryRef(aPathQueryRef, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetPathQueryRef(aPathQueryRef, nullptr);
return *this;
}
NS_MutateURI& SetRef(const nsACString& aRef)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetRef(aRef, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetRef(aRef, nullptr);
return *this;
}
NS_MutateURI& SetFilePath(const nsACString& aFilePath)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetFilePath(aFilePath, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetFilePath(aFilePath, nullptr);
return *this;
}
NS_MutateURI& SetQuery(const nsACString& aQuery)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetQuery(aQuery, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetQuery(aQuery, nullptr);
return *this;
}
NS_MutateURI& SetQueryWithEncoding(const nsACString& query, const mozilla::Encoding *encoding)
{
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
+ mStatus = mMutator->SetQueryWithEncoding(query, encoding, nullptr);
NS_ENSURE_SUCCESS(mStatus, *this);
- mStatus = mMutator->SetQueryWithEncoding(query, encoding, nullptr);
return *this;
}
/**
* This method allows consumers to call the methods declared in other
* interfaces implemented by the mutator object.
*
* Example:
@@ -409,17 +449,19 @@ public:
*
* If mMutator does not implement SomeInterface, do_QueryInterface will fail
* and the method will not be called.
* 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.
*/
NS_MutateURI& Apply(const std::function<nsresult(nsIURIMutator*)>& aFunction)
{
- NS_ENSURE_SUCCESS(mStatus, *this);
+ if (NS_FAILED(mStatus)) {
+ return *this;
+ }
mStatus = aFunction(mMutator);
NS_ENSURE_SUCCESS(mStatus, *this);
return *this;
}
template <class C>
MOZ_MUST_USE nsresult Finalize(nsCOMPtr<C>& aURI)
{
--- a/netwerk/base/nsIURIMutatorUtils.cpp
+++ b/netwerk/base/nsIURIMutatorUtils.cpp
@@ -9,15 +9,16 @@ GetURIMutator(nsIURI* aURI, nsIURIMutato
return NS_ERROR_INVALID_ARG;
}
return aURI->Mutate(aMutator);
}
NS_MutateURI::NS_MutateURI(nsIURI* aURI)
{
mStatus = GetURIMutator(aURI, getter_AddRefs(mMutator));
+ NS_ENSURE_SUCCESS_VOID(mStatus);
}
NS_MutateURI::NS_MutateURI(const char * aContractID)
{
mMutator = do_CreateInstance(aContractID, &mStatus);
MOZ_ASSERT(NS_SUCCEEDED(mStatus), "Called with wrong aContractID");
}