Bug 1425318 - Allow calling NS_MutateURI.Finalize(nsIURI**) r=mayhemer
MozReview-Commit-ID: Hz4CfDDS1FI
--- 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',