Bug 1425318 - The second call to NS_MutateURI.Finalize should fail r=mayhemer draft
authorValentin Gosu <valentin.gosu@gmail.com>
Tue, 19 Dec 2017 02:06:45 +0100
changeset 712891 c63e014b862e7c2726c940934b06de33c6d45a2c
parent 712890 2e67a8763cd286b81f903490f959d491d2e3010b
child 712892 df3b1120ba71a83adb41852e9003ef08af98b662
push id93467
push uservalentin.gosu@gmail.com
push dateTue, 19 Dec 2017 01:17:25 +0000
reviewersmayhemer
bugs1425318
milestone59.0a1
Bug 1425318 - The second call to NS_MutateURI.Finalize should fail r=mayhemer MozReview-Commit-ID: 4U2XsftU2sy
netwerk/base/nsIURIMutator.idl
netwerk/test/gtest/TestURIMutator.cpp
--- a/netwerk/base/nsIURIMutator.idl
+++ b/netwerk/base/nsIURIMutator.idl
@@ -292,43 +292,56 @@ public:
 
     nsCOMPtr<nsIURI> uri;
     mStatus = mMutator->Finalize(getter_AddRefs(uri));
     NS_ENSURE_SUCCESS(mStatus, mStatus);
 
     aURI = do_QueryInterface(uri, &mStatus);
     NS_ENSURE_SUCCESS(mStatus, mStatus);
 
+    mStatus = NS_ERROR_NOT_AVAILABLE; // Second call to Finalize should fail.
     return NS_OK;
   }
 
   // Overload for nsIURI to avoid query interface.
   nsresult Finalize(nsCOMPtr<nsIURI>& aURI)
   {
     NS_ENSURE_SUCCESS(mStatus, mStatus);
     mStatus = mMutator->Finalize(getter_AddRefs(aURI));
-    return mStatus;
+    NS_ENSURE_SUCCESS(mStatus, mStatus);
+
+    mStatus = NS_ERROR_NOT_AVAILABLE; // Second call to Finalize should fail.
+    return NS_OK;
   }
 
   template <class C>
   nsresult Finalize(C** aURI)
   {
     NS_ENSURE_SUCCESS(mStatus, mStatus);
+
     nsCOMPtr<nsIURI> uri;
     mStatus = mMutator->Finalize(getter_AddRefs(uri));
+    NS_ENSURE_SUCCESS(mStatus, mStatus);
+
     nsCOMPtr<C> result = do_QueryInterface(uri, &mStatus);
+    NS_ENSURE_SUCCESS(mStatus, mStatus);
+
     result.forget(aURI);
-    return mStatus;
+    mStatus = NS_ERROR_NOT_AVAILABLE; // Second call to Finalize should fail.
+    return NS_OK;
   }
 
   nsresult Finalize(nsIURI** aURI)
   {
     NS_ENSURE_SUCCESS(mStatus, mStatus);
     mStatus = mMutator->Finalize(aURI);
-    return mStatus;
+    NS_ENSURE_SUCCESS(mStatus, mStatus);
+
+    mStatus = NS_ERROR_NOT_AVAILABLE; // Second call to Finalize should fail.
+    return NS_OK;
   }
 
   nsresult GetStatus() { return mStatus; }
 private:
   nsresult mStatus;
   nsCOMPtr<nsIURIMutator> mMutator;
 };
 
--- a/netwerk/test/gtest/TestURIMutator.cpp
+++ b/netwerk/test/gtest/TestURIMutator.cpp
@@ -81,9 +81,20 @@ TEST(TestURIMutator, Mutator)
              .Finalize(aResult);
   };
 
   nsCOMPtr<nsIURL> newURL;
   rv = functionSetQuery(uri2, getter_AddRefs(newURL));
   ASSERT_EQ(rv, NS_OK);
   ASSERT_EQ(newURL->GetSpec(out), NS_OK);
   ASSERT_TRUE(out == NS_LITERAL_CSTRING("https://mozilla.org/path?originalQuery#newref"));
+
+  // Check that calling Finalize twice will fail.
+  NS_MutateURI mutator(newURL);
+  rv = mutator.SetQuery(EmptyCString()).Finalize(uri2);
+  ASSERT_EQ(rv, NS_OK);
+  ASSERT_EQ(uri2->GetSpec(out), NS_OK);
+  ASSERT_TRUE(out == NS_LITERAL_CSTRING("https://mozilla.org/path#newref"));
+  nsCOMPtr<nsIURI> uri3;
+  rv = mutator.Finalize(uri3);
+  ASSERT_EQ(rv, NS_ERROR_NOT_AVAILABLE);
+  ASSERT_TRUE(uri3 == nullptr);
 }