Bug 1425318 - The second call to NS_MutateURI.Finalize should fail r=mayhemer
MozReview-Commit-ID: 4U2XsftU2sy
--- 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);
}