Bug 1425318 - Allow calling NS_MutateURI.Finalize(nsIURI**) r=mayhemer draft
authorValentin Gosu <valentin.gosu@gmail.com>
Tue, 19 Dec 2017 02:04:40 +0100
changeset 712890 2e67a8763cd286b81f903490f959d491d2e3010b
parent 711965 c6b71032e0831ddd09b67391e62024bc729a1d0d
child 712891 c63e014b862e7c2726c940934b06de33c6d45a2c
push id93467
push uservalentin.gosu@gmail.com
push dateTue, 19 Dec 2017 01:17:25 +0000
reviewersmayhemer
bugs1425318
milestone59.0a1
Bug 1425318 - Allow calling NS_MutateURI.Finalize(nsIURI**) r=mayhemer MozReview-Commit-ID: Hz4CfDDS1FI
netwerk/base/nsIURIMutator.idl
netwerk/test/gtest/TestStandardURL.cpp
netwerk/test/gtest/TestURIMutator.cpp
netwerk/test/gtest/moz.build
--- a/netwerk/base/nsIURIMutator.idl
+++ b/netwerk/base/nsIURIMutator.idl
@@ -303,15 +303,33 @@ public:
   // 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;
   }
 
+  template <class C>
+  nsresult Finalize(C** aURI)
+  {
+    NS_ENSURE_SUCCESS(mStatus, mStatus);
+    nsCOMPtr<nsIURI> uri;
+    mStatus = mMutator->Finalize(getter_AddRefs(uri));
+    nsCOMPtr<C> result = do_QueryInterface(uri, &mStatus);
+    result.forget(aURI);
+    return mStatus;
+  }
+
+  nsresult Finalize(nsIURI** aURI)
+  {
+    NS_ENSURE_SUCCESS(mStatus, mStatus);
+    mStatus = mMutator->Finalize(aURI);
+    return mStatus;
+  }
+
   nsresult GetStatus() { return mStatus; }
 private:
   nsresult mStatus;
   nsCOMPtr<nsIURIMutator> mMutator;
 };
 
 %}
--- a/netwerk/test/gtest/TestStandardURL.cpp
+++ b/netwerk/test/gtest/TestStandardURL.cpp
@@ -231,17 +231,16 @@ MOZ_GTEST_BENCH(TestStandardURL, Normali
       nsAutoCString encHost4("111.159.notonmywatch.220");
       ASSERT_EQ(NS_ERROR_FAILURE, Test_NormalizeIPv4(encHost4, result));
       nsAutoCString encHost5("1.160.204.20f");
       ASSERT_EQ(NS_ERROR_FAILURE, Test_NormalizeIPv4(encHost5, result));
     }
 });
 #endif
 
-
 TEST(TestStandardURL, Mutator)
 {
   nsAutoCString out;
   nsCOMPtr<nsIURI> uri;
   nsresult rv = NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID)
                   .SetSpec(NS_LITERAL_CSTRING("http://example.com"))
                   .Finalize(uri);
   ASSERT_EQ(rv, NS_OK);
new file mode 100644
--- /dev/null
+++ b/netwerk/test/gtest/TestURIMutator.cpp
@@ -0,0 +1,89 @@
+#include "gtest/gtest.h"
+#include "nsCOMPtr.h"
+#include "nsNetCID.h"
+#include "nsIURL.h"
+#include "nsIURIMutator.h"
+
+TEST(TestURIMutator, Mutator)
+{
+  nsAutoCString out;
+
+  // This test instantiates a new nsStandardURL::Mutator (via contractID)
+  // and uses it to create a new URI.
+  nsCOMPtr<nsIURI> uri;
+  nsresult rv = NS_MutateURI(NS_STANDARDURLMUTATOR_CONTRACTID)
+                  .SetSpec(NS_LITERAL_CSTRING("http://example.com"))
+                  .Finalize(uri);
+  ASSERT_EQ(rv, NS_OK);
+  ASSERT_EQ(uri->GetSpec(out), NS_OK);
+  ASSERT_TRUE(out == NS_LITERAL_CSTRING("http://example.com/"));
+
+  // This test verifies that we can use NS_MutateURI to change a URI
+  rv = NS_MutateURI(uri)
+         .SetScheme(NS_LITERAL_CSTRING("ftp"))
+         .SetHost(NS_LITERAL_CSTRING("mozilla.org"))
+         .SetPathQueryRef(NS_LITERAL_CSTRING("/path?query#ref"))
+         .Finalize(uri);
+  ASSERT_EQ(rv, NS_OK);
+  ASSERT_EQ(uri->GetSpec(out), NS_OK);
+  ASSERT_TRUE(out == NS_LITERAL_CSTRING("ftp://mozilla.org/path?query#ref"));
+
+  // This test verifies that we can pass nsIURL to Finalize, and
+  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"));
+
+  // This test verifies that we can pass nsIURL** to Finalize.
+  // We need to use the explicit template because it's actually passing getter_AddRefs
+  nsCOMPtr<nsIURL> url2;
+  rv = NS_MutateURI(url)
+         .SetRef(NS_LITERAL_CSTRING("newref"))
+         .Finalize<nsIURL>(getter_AddRefs(url2));
+  ASSERT_EQ(rv, NS_OK);
+  ASSERT_EQ(url2->GetSpec(out), NS_OK);
+  ASSERT_TRUE(out == NS_LITERAL_CSTRING("https://mozilla.org/path?query#newref"));
+
+  // This test verifies that we can pass nsIURI** to Finalize.
+  // No need to be explicit.
+  auto functionSetRef = [](nsIURI* aURI, nsIURI** aResult) -> nsresult
+  {
+    return NS_MutateURI(aURI)
+             .SetRef(NS_LITERAL_CSTRING("originalRef"))
+             .Finalize(aResult);
+  };
+
+  nsCOMPtr<nsIURI> newURI;
+  rv = functionSetRef(url2, getter_AddRefs(newURI));
+  ASSERT_EQ(rv, NS_OK);
+  ASSERT_EQ(newURI->GetSpec(out), NS_OK);
+  ASSERT_TRUE(out == NS_LITERAL_CSTRING("https://mozilla.org/path?query#originalRef"));
+
+  // This test verifies that we can pass nsIURI** to Finalize.
+  // We need to use the explicit template because it's actually passing getter_AddRefs
+  nsCOMPtr<nsIURI> uri2;
+  rv = NS_MutateURI(url2)
+         .SetQuery(NS_LITERAL_CSTRING("newquery"))
+         .Finalize<nsIURI>(getter_AddRefs(uri2));
+  ASSERT_EQ(rv, NS_OK);
+  ASSERT_EQ(uri2->GetSpec(out), NS_OK);
+  ASSERT_TRUE(out == NS_LITERAL_CSTRING("https://mozilla.org/path?newquery#newref"));
+
+  // This test verifies that we can pass nsIURI** to Finalize.
+  // No need to be explicit.
+  auto functionSetQuery = [](nsIURI* aURI, nsIURL** aResult) -> nsresult
+  {
+    return NS_MutateURI(aURI)
+             .SetQuery(NS_LITERAL_CSTRING("originalQuery"))
+             .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"));
+}
--- a/netwerk/test/gtest/moz.build
+++ b/netwerk/test/gtest/moz.build
@@ -8,16 +8,17 @@ UNIFIED_SOURCES += [
     'TestBufferedInputStream.cpp',
     'TestHeaders.cpp',
     'TestHttpAuthUtils.cpp',
     'TestMozURL.cpp',
     'TestPartiallySeekableInputStream.cpp',
     'TestProtocolProxyService.cpp',
     'TestReadStreamToString.cpp',
     'TestStandardURL.cpp',
+    'TestURIMutator.cpp',
 ]
 
 TEST_DIRS += [
     'parse-ftp',
 ]
 
 LOCAL_INCLUDES += [
     '/netwerk/base',