Bug 1423961 - Improve NS_MutateURI.Finalize by passing reference to nsCOMPtr instead nsIURI** r=mayhemer draft
authorValentin Gosu <valentin.gosu@gmail.com>
Fri, 08 Dec 2017 17:37:41 +0100
changeset 709714 01bf82ace5cfbf81fdf095cd76c5d98a2ce03245
parent 708706 4b94da21a9e6171f9911ffad171af23c26e6227b
child 743492 e57963d520bff9e59d07a67fcf3c793ba79a534b
push id92726
push uservalentin.gosu@gmail.com
push dateFri, 08 Dec 2017 16:38:45 +0000
reviewersmayhemer
bugs1423961
milestone59.0a1
Bug 1423961 - Improve NS_MutateURI.Finalize by passing reference to nsCOMPtr instead nsIURI** r=mayhemer MozReview-Commit-ID: 6VRhNJF3f0U
netwerk/base/nsIURIMutator.idl
netwerk/test/gtest/TestStandardURL.cpp
--- a/netwerk/base/nsIURIMutator.idl
+++ b/netwerk/base/nsIURIMutator.idl
@@ -279,21 +279,39 @@ public:
     return *this;
   }
   NS_MutateURI& SetQueryWithEncoding(const nsACString& query, const mozilla::Encoding *encoding)
   {
     NS_ENSURE_SUCCESS(mStatus, *this);
     mStatus = mMutator->SetQueryWithEncoding(query, encoding, nullptr);
     return *this;
   }
-  nsresult Finalize(nsIURI** aURI)
+
+  template <class C>
+  nsresult Finalize(nsCOMPtr<C>& aURI)
   {
     NS_ENSURE_SUCCESS(mStatus, mStatus);
-    mStatus = mMutator->Finalize(aURI);
+
+    nsCOMPtr<nsIURI> uri;
+    mStatus = mMutator->Finalize(getter_AddRefs(uri));
+    NS_ENSURE_SUCCESS(mStatus, mStatus);
+
+    aURI = do_QueryInterface(uri, &mStatus);
+    NS_ENSURE_SUCCESS(mStatus, mStatus);
+
+    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;
   }
+
   nsresult GetStatus() { return mStatus; }
 private:
   nsresult mStatus;
-  RefPtr<nsIURIMutator> mMutator;
+  nsCOMPtr<nsIURIMutator> mMutator;
 };
 
 %}
--- a/netwerk/test/gtest/TestStandardURL.cpp
+++ b/netwerk/test/gtest/TestStandardURL.cpp
@@ -238,24 +238,31 @@ MOZ_GTEST_BENCH(TestStandardURL, Normali
 
 
 TEST(TestStandardURL, Mutator)
 {
   nsAutoCString out;
   nsCOMPtr<nsIURI> uri;
   nsresult rv = NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID)
                   .SetSpec(NS_LITERAL_CSTRING("http://example.com"))
-                  .Finalize(getter_AddRefs(uri));
+                  .Finalize(uri);
   ASSERT_EQ(rv, NS_OK);
 
   ASSERT_EQ(uri->GetSpec(out), NS_OK);
   ASSERT_TRUE(out == NS_LITERAL_CSTRING("http://example.com/"));
 
-  nsCOMPtr<nsIURI> uri2;
   rv = NS_MutateURI(uri)
          .SetScheme(NS_LITERAL_CSTRING("ftp"))
          .SetHost(NS_LITERAL_CSTRING("mozilla.org"))
          .SetPathQueryRef(NS_LITERAL_CSTRING("/path?query#ref"))
-         .Finalize(getter_AddRefs(uri2));
+         .Finalize(uri);
   ASSERT_EQ(rv, NS_OK);
-  ASSERT_EQ(uri2->GetSpec(out), NS_OK);
+  ASSERT_EQ(uri->GetSpec(out), NS_OK);
   ASSERT_TRUE(out == NS_LITERAL_CSTRING("ftp://mozilla.org/path?query#ref"));
+
+  nsCOMPtr<nsIURL> url;
+  rv = NS_MutateURI(uri)
+         .SetScheme(NS_LITERAL_CSTRING("https"))
+         .Finalize(url);
+  ASSERT_EQ(rv, NS_OK);
+  ASSERT_EQ(url->GetSpec(out), NS_OK);
+  ASSERT_TRUE(out == NS_LITERAL_CSTRING("https://mozilla.org/path?query#ref"));
 }