Bug 1433958 - Make NS_MutateURI methods warn immediately after calling method that fails draft
authorValentin Gosu <valentin.gosu@gmail.com>
Mon, 26 Feb 2018 20:43:45 +0100
changeset 759885 f509d807aa236cf502c31953de331943bd01cef5
parent 759884 50793144c7a54310c43795544bb04cbeeb310984
child 759886 1ce650cd2baa2ca3c2e233b49de73c32eb93b617
push id100504
push uservalentin.gosu@gmail.com
push dateMon, 26 Feb 2018 19:44:44 +0000
bugs1433958
milestone60.0a1
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
netwerk/base/nsIURIMutator.idl
netwerk/base/nsIURIMutatorUtils.cpp
--- 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");
 }