Bug 1433958 - Change code that sets nsIURI.port to use nsIURIMutator draft
authorValentin Gosu <valentin.gosu@gmail.com>
Mon, 26 Feb 2018 20:43:46 +0100
changeset 759896 5fa03cdaac29c772964ee1a8aa2ae4550a7d7bed
parent 759895 bb2938bdaa42a1d9331e80edd48289e020cceff0
child 759897 f03ec78a8e79a6212fd73828d75d69aae8163beb
push id100504
push uservalentin.gosu@gmail.com
push dateMon, 26 Feb 2018 19:44:44 +0000
bugs1433958
milestone60.0a1
Bug 1433958 - Change code that sets nsIURI.port to use nsIURIMutator MozReview-Commit-ID: 7Lu7JJvDUGF
dom/base/Link.cpp
dom/base/Location.cpp
dom/url/URLMainThread.cpp
dom/url/URLWorker.cpp
netwerk/test/unit/test_URIs.js
netwerk/test/unit/test_URIs2.js
netwerk/test/unit/test_bug1195415.js
netwerk/test/unit/test_bug388281.js
netwerk/test/unit/test_standardurl_port.js
security/manager/pki/resources/content/exceptionDialog.js
--- a/dom/base/Link.cpp
+++ b/dom/base/Link.cpp
@@ -548,17 +548,17 @@ Link::SetSearch(const nsAString& aSearch
     return;
   }
   SetHrefAttribute(uri);
 }
 
 void
 Link::SetPort(const nsAString &aPort)
 {
-  nsCOMPtr<nsIURI> uri(GetURIToMutate());
+  nsCOMPtr<nsIURI> uri(GetURI());
   if (!uri) {
     // Ignore failures to be compatible with NS4.
     return;
   }
 
   nsresult rv;
   nsAutoString portStr(aPort);
 
@@ -566,17 +566,22 @@ Link::SetPort(const nsAString &aPort)
   int32_t port = -1;
   if (!aPort.IsEmpty()) {
     port = portStr.ToInteger(&rv);
     if (NS_FAILED(rv)) {
       return;
     }
   }
 
-  (void)uri->SetPort(port);
+  rv = NS_MutateURI(uri)
+         .SetPort(port)
+         .Finalize(uri);
+  if (NS_FAILED(rv)) {
+    return;
+  }
   SetHrefAttribute(uri);
 }
 
 void
 Link::SetHash(const nsAString &aHash)
 {
   nsCOMPtr<nsIURI> uri(GetURI());
   if (!uri) {
--- a/dom/base/Location.cpp
+++ b/dom/base/Location.cpp
@@ -650,17 +650,17 @@ Location::SetPort(const nsAString& aPort
                   ErrorResult& aRv)
 {
   if (!CallerSubsumes(&aSubjectPrincipal)) {
     aRv.Throw(NS_ERROR_DOM_SECURITY_ERR);
     return;
   }
 
   nsCOMPtr<nsIURI> uri;
-  aRv = GetWritableURI(getter_AddRefs(uri));
+  aRv = GetURI(getter_AddRefs(uri));
   if (NS_WARN_IF(aRv.Failed() || !uri)) {
     return;
   }
 
   // perhaps use nsReadingIterators at some point?
   NS_ConvertUTF16toUTF8 portStr(aPort);
   const char *buf = portStr.get();
   int32_t port = -1;
@@ -669,17 +669,19 @@ Location::SetPort(const nsAString& aPort
     if (*buf == ':') {
       port = atol(buf+1);
     }
     else {
       port = atol(buf);
     }
   }
 
-  aRv = uri->SetPort(port);
+  aRv = NS_MutateURI(uri)
+          .SetPort(port)
+          .Finalize(uri);
   if (NS_WARN_IF(aRv.Failed())) {
     return;
   }
 
   aRv = SetURI(uri);
 }
 
 void
--- a/dom/url/URLMainThread.cpp
+++ b/dom/url/URLMainThread.cpp
@@ -380,17 +380,19 @@ URLMainThread::SetPort(const nsAString& 
   // nsIURI uses -1 as default value.
   if (!portStr.IsEmpty()) {
     port = portStr.ToInteger(&rv);
     if (NS_FAILED(rv)) {
       return;
     }
   }
 
-  mURI->SetPort(port);
+  Unused << NS_MutateURI(mURI)
+              .SetPort(port)
+              .Finalize(mURI);
 }
 
 void
 URLMainThread::GetPathname(nsAString& aPathname, ErrorResult& aRv) const
 {
   aPathname.Truncate();
 
   // Do not throw!  Not having a valid URI or URL should result in an empty
--- a/dom/url/URLWorker.cpp
+++ b/dom/url/URLWorker.cpp
@@ -1038,17 +1038,19 @@ URLWorker::SetPort(const nsAString& aPor
     // nsIURI uses -1 as default value.
     if (!portStr.IsEmpty()) {
       port = portStr.ToInteger(&rv);
       if (NS_FAILED(rv)) {
         return;
       }
     }
 
-    mStdURL->SetPort(port);
+    Unused << NS_MutateURI(mStdURL)
+                .SetPort(port)
+                .Finalize(mStdURL);
     return;
   }
 
   MOZ_ASSERT(mURLProxy);
   RefPtr<SetterRunnable> runnable =
     new SetterRunnable(mWorkerPrivate, SetterRunnable::SetterPort,
                        aPort, mURLProxy);
 
--- a/netwerk/test/unit/test_URIs.js
+++ b/netwerk/test/unit/test_URIs.js
@@ -522,17 +522,17 @@ function do_test_mutate_ref(aTest, aSuff
 // Tests that normally-mutable properties can't be modified on
 // special URIs that are known to be immutable.
 function do_test_immutable(aTest) {
   Assert.ok(aTest.immutable);
 
   var URI = NetUtil.newURI(aTest.spec);
   // All the non-readonly attributes on nsIURI.idl:
   var propertiesToCheck = ["spec", "scheme",
-                           "host", "port"];
+                           "host"];
 
   propertiesToCheck.forEach(function(aProperty) {
     var threw = false;
     try {
       URI[aProperty] = "anothervalue";
     } catch(e) {
       threw = true;
     }
--- a/netwerk/test/unit/test_URIs2.js
+++ b/netwerk/test/unit/test_URIs2.js
@@ -623,17 +623,17 @@ function do_test_mutate_ref(aTest, aSuff
 // Tests that normally-mutable properties can't be modified on
 // special URIs that are known to be immutable.
 function do_test_immutable(aTest) {
   Assert.ok(aTest.immutable);
 
   var URI = NetUtil.newURI(aTest.spec);
   // All the non-readonly attributes on nsIURI.idl:
   var propertiesToCheck = ["scheme",
-                           "host", "port"];
+                           "host"];
 
   propertiesToCheck.forEach(function(aProperty) {
     var threw = false;
     try {
       URI[aProperty] = "anothervalue";
     } catch(e) {
       threw = true;
     }
--- a/netwerk/test/unit/test_bug1195415.js
+++ b/netwerk/test/unit/test_bug1195415.js
@@ -4,113 +4,113 @@ function run_test() {
   var ios = Cc["@mozilla.org/network/io-service;1"].
         getService(Ci.nsIIOService);
   var ssm = Cc["@mozilla.org/scriptsecuritymanager;1"].
         getService(Ci.nsIScriptSecurityManager);
 
   // NON-UNICODE
   var uri = ios.newURI("http://foo.com/file.txt");
   Assert.equal(uri.asciiHostPort, "foo.com");
-  uri.port = 90;
+  uri = uri.mutate().setPort(90).finalize();
   var prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "foo.com:90");
   Assert.equal(prin.origin, "http://foo.com:90");
 
   uri = ios.newURI("http://foo.com:10/file.txt");
   Assert.equal(uri.asciiHostPort, "foo.com:10");
-  uri.port = 500;
+  uri = uri.mutate().setPort(500).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "foo.com:500");
   Assert.equal(prin.origin, "http://foo.com:500");
 
   uri = ios.newURI("http://foo.com:5000/file.txt");
   Assert.equal(uri.asciiHostPort, "foo.com:5000");
-  uri.port = 20;
+  uri = uri.mutate().setPort(20).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "foo.com:20");
   Assert.equal(prin.origin, "http://foo.com:20");
 
   uri = ios.newURI("http://foo.com:5000/file.txt");
   Assert.equal(uri.asciiHostPort, "foo.com:5000");
-  uri.port = -1;
+  uri = uri.mutate().setPort(-1).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "foo.com");
   Assert.equal(prin.origin, "http://foo.com");
 
   uri = ios.newURI("http://foo.com:5000/file.txt");
   Assert.equal(uri.asciiHostPort, "foo.com:5000");
-  uri.port = 80;
+  uri = uri.mutate().setPort(80).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "foo.com");
   Assert.equal(prin.origin, "http://foo.com");
 
   // UNICODE
   uri = ios.newURI("http://jos\u00e9.example.net.ch/file.txt");
   Assert.equal(uri.asciiHostPort, "xn--jos-dma.example.net.ch");
-  uri.port = 90;
+  uri = uri.mutate().setPort(90).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "xn--jos-dma.example.net.ch:90");
   Assert.equal(prin.origin, "http://xn--jos-dma.example.net.ch:90");
 
   uri = ios.newURI("http://jos\u00e9.example.net.ch:10/file.txt");
   Assert.equal(uri.asciiHostPort, "xn--jos-dma.example.net.ch:10");
-  uri.port = 500;
+  uri = uri.mutate().setPort(500).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "xn--jos-dma.example.net.ch:500");
   Assert.equal(prin.origin, "http://xn--jos-dma.example.net.ch:500");
 
   uri = ios.newURI("http://jos\u00e9.example.net.ch:5000/file.txt");
   Assert.equal(uri.asciiHostPort, "xn--jos-dma.example.net.ch:5000");
-  uri.port = 20;
+  uri = uri.mutate().setPort(20).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "xn--jos-dma.example.net.ch:20");
   Assert.equal(prin.origin, "http://xn--jos-dma.example.net.ch:20");
 
   uri = ios.newURI("http://jos\u00e9.example.net.ch:5000/file.txt");
   Assert.equal(uri.asciiHostPort, "xn--jos-dma.example.net.ch:5000");
-  uri.port = -1;
+  uri = uri.mutate().setPort(-1).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "xn--jos-dma.example.net.ch");
   Assert.equal(prin.origin, "http://xn--jos-dma.example.net.ch");
 
   uri = ios.newURI("http://jos\u00e9.example.net.ch:5000/file.txt");
   Assert.equal(uri.asciiHostPort, "xn--jos-dma.example.net.ch:5000");
-  uri.port = 80;
+  uri = uri.mutate().setPort(80).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "xn--jos-dma.example.net.ch");
   Assert.equal(prin.origin, "http://xn--jos-dma.example.net.ch");
 
   // ipv6
   uri = ios.newURI("http://[123:45::678]/file.txt");
   Assert.equal(uri.asciiHostPort, "[123:45::678]");
-  uri.port = 90;
+  uri = uri.mutate().setPort(90).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "[123:45::678]:90");
   Assert.equal(prin.origin, "http://[123:45::678]:90");
 
   uri = ios.newURI("http://[123:45::678]:10/file.txt");
   Assert.equal(uri.asciiHostPort, "[123:45::678]:10");
-  uri.port = 500;
+  uri = uri.mutate().setPort(500).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "[123:45::678]:500");
   Assert.equal(prin.origin, "http://[123:45::678]:500");
 
   uri = ios.newURI("http://[123:45::678]:5000/file.txt");
   Assert.equal(uri.asciiHostPort, "[123:45::678]:5000");
-  uri.port = 20;
+  uri = uri.mutate().setPort(20).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "[123:45::678]:20");
   Assert.equal(prin.origin, "http://[123:45::678]:20");
 
   uri = ios.newURI("http://[123:45::678]:5000/file.txt");
   Assert.equal(uri.asciiHostPort, "[123:45::678]:5000");
-  uri.port = -1;
+  uri = uri.mutate().setPort(-1).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "[123:45::678]");
   Assert.equal(prin.origin, "http://[123:45::678]");
 
   uri = ios.newURI("http://[123:45::678]:5000/file.txt");
   Assert.equal(uri.asciiHostPort, "[123:45::678]:5000");
-  uri.port = 80;
+  uri = uri.mutate().setPort(80).finalize();
   prin = ssm.createCodebasePrincipal(uri, {});
   Assert.equal(uri.asciiHostPort, "[123:45::678]");
   Assert.equal(prin.origin, "http://[123:45::678]");
 }
--- a/netwerk/test/unit/test_bug388281.js
+++ b/netwerk/test/unit/test_bug388281.js
@@ -1,24 +1,24 @@
 function run_test() {
   const ios = Cc["@mozilla.org/network/io-service;1"].
     getService(Ci.nsIIOService);
 
   var uri = ios.newURI("http://foo.com/file.txt");
-  uri.port = 90;
+  uri = uri.mutate().setPort(90).finalize();
   Assert.equal(uri.hostPort, "foo.com:90");
 
   uri = ios.newURI("http://foo.com:10/file.txt");
-  uri.port = 500;
+  uri = uri.mutate().setPort(500).finalize();
   Assert.equal(uri.hostPort, "foo.com:500");
-  
+
   uri = ios.newURI("http://foo.com:5000/file.txt");
-  uri.port = 20;
+  uri = uri.mutate().setPort(20).finalize();
   Assert.equal(uri.hostPort, "foo.com:20");
 
   uri = ios.newURI("http://foo.com:5000/file.txt");
-  uri.port = -1;
+  uri = uri.mutate().setPort(-1).finalize();
   Assert.equal(uri.hostPort, "foo.com");
 
   uri = ios.newURI("http://foo.com:5000/file.txt");
-  uri.port = 80;
+  uri = uri.mutate().setPort(80).finalize();
   Assert.equal(uri.hostPort, "foo.com");
 }
--- a/netwerk/test/unit/test_standardurl_port.js
+++ b/netwerk/test/unit/test_standardurl_port.js
@@ -4,23 +4,23 @@ function run_test() {
               getService(Ci.nsIIOService);
     return ios.newURI(aURLSpec, aCharset);
   }
 
   var httpURI = makeURI("http://foo.com");
   Assert.equal(-1, httpURI.port);
 
   // Setting to default shouldn't cause a change
-  httpURI.port = 80;
+  httpURI = httpURI.mutate().setPort(80).finalize();
   Assert.equal(-1, httpURI.port);
-  
+
   // Setting to default after setting to non-default shouldn't cause a change (bug 403480)
-  httpURI.port = 123;
+  httpURI = httpURI.mutate().setPort(123).finalize();
   Assert.equal(123, httpURI.port);
-  httpURI.port = 80;
+  httpURI = httpURI.mutate().setPort(80).finalize();
   Assert.equal(-1, httpURI.port);
   Assert.ok(!/80/.test(httpURI.spec));
 
   // URL parsers shouldn't set ports to default value (bug 407538)
   httpURI = httpURI.mutate().setSpec("http://foo.com:81").finalize();
   Assert.equal(81, httpURI.port);
   httpURI = httpURI.mutate().setSpec("http://foo.com:80").finalize();
   Assert.equal(-1, httpURI.port);
--- a/security/manager/pki/resources/content/exceptionDialog.js
+++ b/security/manager/pki/resources/content/exceptionDialog.js
@@ -127,17 +127,17 @@ function getURI() {
     return null;
   }
 
   if (uri.scheme == "http") {
     uri.scheme = "https";
   }
 
   if (uri.port == -1) {
-    uri.port = 443;
+    uri = uri.mutate().setPort(443).finalize();
   }
 
   return uri;
 }
 
 function resetDialog() {
   document.getElementById("viewCertButton").disabled = true;
   document.getElementById("permanent").disabled = true;