From 0574e1fdc09bf2a0b817844208752852c82dfd1c Mon Sep 17 00:00:00 2001 From: Valentin Gosu Date: Sat, 2 Dec 2017 23:09:34 +0100 Subject: [PATCH] Bug 1420954 - Make nsIURIMutator setters return nsIURIMutator so we can chain setters r=bagder MozReview-Commit-ID: 53BD91hB2yi --- caps/NullPrincipalURI.h | 5 +- dom/file/nsHostObjectURI.h | 2 +- dom/jsurl/nsJSProtocolHandler.h | 2 +- image/decoders/icon/nsIconURI.h | 5 +- modules/libjar/nsJARURI.h | 2 +- netwerk/base/nsIURIMutator.idl | 77 +++++++++++++++---- netwerk/base/nsSimpleNestedURI.h | 2 +- netwerk/base/nsSimpleURI.h | 2 +- netwerk/base/nsStandardURL.h | 2 +- .../protocol/about/nsAboutProtocolHandler.h | 2 +- netwerk/test/unit/test_uri_mutator.js | 23 ++++++ netwerk/test/unit/xpcshell.ini | 1 + 12 files changed, 97 insertions(+), 28 deletions(-) create mode 100644 netwerk/test/unit/test_uri_mutator.js diff --git a/caps/NullPrincipalURI.h b/caps/NullPrincipalURI.h index 6d0b30e7861d8..caaff50705550 100644 --- a/caps/NullPrincipalURI.h +++ b/caps/NullPrincipalURI.h @@ -58,7 +58,7 @@ class NullPrincipalURI final : public nsIURI , public BaseURIMutator { NS_DECL_ISUPPORTS - NS_FORWARD_SAFE_NSIURISETTERS(mURI) + NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI) NS_IMETHOD Deserialize(const mozilla::ipc::URIParams& aParams) override { @@ -76,8 +76,9 @@ class NullPrincipalURI final : public nsIURI return NS_OK; } - NS_IMETHOD SetSpec(const nsACString & aSpec) override + NS_IMETHOD SetSpec(const nsACString & aSpec, nsIURIMutator** aMutator) override { + NS_ADDREF(*aMutator = this); return NS_ERROR_NOT_IMPLEMENTED; } diff --git a/dom/file/nsHostObjectURI.h b/dom/file/nsHostObjectURI.h index 5925d7617fff7..3a9a7b63aa47f 100644 --- a/dom/file/nsHostObjectURI.h +++ b/dom/file/nsHostObjectURI.h @@ -83,7 +83,7 @@ class nsHostObjectURI : public mozilla::net::nsSimpleURI , public BaseURIMutator { NS_DECL_ISUPPORTS - NS_FORWARD_SAFE_NSIURISETTERS(mURI) + NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI) NS_DEFINE_NSIMUTATOR_COMMON explicit Mutator() { } diff --git a/dom/jsurl/nsJSProtocolHandler.h b/dom/jsurl/nsJSProtocolHandler.h index c83300050b447..d9500acb24a25 100644 --- a/dom/jsurl/nsJSProtocolHandler.h +++ b/dom/jsurl/nsJSProtocolHandler.h @@ -110,7 +110,7 @@ class nsJSURI : public mozilla::net::nsSimpleURI , public BaseURIMutator { NS_DECL_ISUPPORTS - NS_FORWARD_SAFE_NSIURISETTERS(mURI) + NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI) NS_DEFINE_NSIMUTATOR_COMMON explicit Mutator() { } diff --git a/image/decoders/icon/nsIconURI.h b/image/decoders/icon/nsIconURI.h index 5e01b11fb2d49..7da500ed11a75 100644 --- a/image/decoders/icon/nsIconURI.h +++ b/image/decoders/icon/nsIconURI.h @@ -51,7 +51,7 @@ class nsMozIconURI final , public BaseURIMutator { NS_DECL_ISUPPORTS - NS_FORWARD_SAFE_NSIURISETTERS(mURI) + NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI) NS_IMETHOD Deserialize(const mozilla::ipc::URIParams& aParams) override { @@ -69,7 +69,8 @@ class nsMozIconURI final return NS_OK; } - NS_IMETHOD SetSpec(const nsACString & aSpec) override { + NS_IMETHOD SetSpec(const nsACString & aSpec, nsIURIMutator** aMutator) override { + NS_ADDREF(*aMutator = this); return InitFromSpec(aSpec); } diff --git a/modules/libjar/nsJARURI.h b/modules/libjar/nsJARURI.h index f62adb34a89fb..45b232e7556d6 100644 --- a/modules/libjar/nsJARURI.h +++ b/modules/libjar/nsJARURI.h @@ -104,7 +104,7 @@ class nsJARURI final : public nsIJARURI, , public BaseURIMutator { NS_DECL_ISUPPORTS - NS_FORWARD_SAFE_NSIURISETTERS(mURI) + NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI) NS_DEFINE_NSIMUTATOR_COMMON explicit Mutator() { } diff --git a/netwerk/base/nsIURIMutator.idl b/netwerk/base/nsIURIMutator.idl index 88abed405ea76..d02f24a8e6055 100644 --- a/netwerk/base/nsIURIMutator.idl +++ b/netwerk/base/nsIURIMutator.idl @@ -6,6 +6,7 @@ #include "nsISupports.idl" interface nsIURI; interface nsIObjectInputStream; +interface nsIURIMutator; %{C++ #include "nsStringGlue.h" @@ -87,9 +88,8 @@ protected: { return InitFromInputStream(aStream); } \ NS_IMETHOD Finalize(nsIURI** aURI) override \ { mURI.forget(aURI); return NS_OK; } \ - NS_IMETHOD SetSpec(const nsACString & aSpec) override \ - { return InitFromSpec(aSpec); } - + NS_IMETHOD SetSpec(const nsACString & aSpec, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return InitFromSpec(aSpec); } %} [ptr] native Encoding(const mozilla::Encoding); @@ -104,27 +104,70 @@ interface nsIURISetSpec : nsISupports * to define it separately, while the rest of the setters may be simply * forwarded to the mutable URI. */ - void setSpec(in AUTF8String aSpec); + nsIURIMutator setSpec(in AUTF8String aSpec); }; +/** + * These methods allow the mutator to change various parts of the URI. + * They return the same nsIURIMutator so that we may chain setter operations: + * Example: + * let newURI = uri.mutate() + * .setSpec("http://example.com") + * .setQuery("hello") + * .finalize(); + */ [scriptable, builtinclass, uuid(5403a6ec-99d7-405e-8b45-9f805bbdfcef)] interface nsIURISetters : nsIURISetSpec { - void setScheme(in AUTF8String aScheme); - void setUserPass(in AUTF8String aUserPass); - void setUsername(in AUTF8String aUsername); - void setPassword(in AUTF8String aPassword); - void setHostPort(in AUTF8String aHostPort); - void setHostAndPort(in AUTF8String aHostAndPort); - void setHost(in AUTF8String aHost); - void setPort(in long aPort); - void setPathQueryRef(in AUTF8String aPathQueryRef); - void setRef(in AUTF8String aRef); - void setFilePath(in AUTF8String aFilePath); - void setQuery(in AUTF8String aQuery); - [noscript] void setQueryWithEncoding(in AUTF8String query, in Encoding encoding); + nsIURIMutator setScheme(in AUTF8String aScheme); + nsIURIMutator setUserPass(in AUTF8String aUserPass); + nsIURIMutator setUsername(in AUTF8String aUsername); + nsIURIMutator setPassword(in AUTF8String aPassword); + nsIURIMutator setHostPort(in AUTF8String aHostPort); + nsIURIMutator setHostAndPort(in AUTF8String aHostAndPort); + nsIURIMutator setHost(in AUTF8String aHost); + nsIURIMutator setPort(in long aPort); + nsIURIMutator setPathQueryRef(in AUTF8String aPathQueryRef); + nsIURIMutator setRef(in AUTF8String aRef); + nsIURIMutator setFilePath(in AUTF8String aFilePath); + nsIURIMutator setQuery(in AUTF8String aQuery); + [noscript] nsIURIMutator setQueryWithEncoding(in AUTF8String query, in Encoding encoding); }; +%{C++ + +// Using this macro instead of NS_FORWARD_SAFE_NSIURISETTERS makes chaining +// setter operations possible. +#define NS_FORWARD_SAFE_NSIURISETTERS_RET(_to) \ + NS_IMETHOD SetScheme(const nsACString & aScheme, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetScheme(aScheme); } \ + NS_IMETHOD SetUserPass(const nsACString & aUserPass, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetUserPass(aUserPass); } \ + NS_IMETHOD SetUsername(const nsACString & aUsername, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetUsername(aUsername); } \ + NS_IMETHOD SetPassword(const nsACString & aPassword, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetPassword(aPassword); } \ + NS_IMETHOD SetHostPort(const nsACString & aHostPort, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetHostPort(aHostPort); } \ + NS_IMETHOD SetHostAndPort(const nsACString & aHostAndPort, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetHostAndPort(aHostAndPort); } \ + NS_IMETHOD SetHost(const nsACString & aHost, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetHost(aHost); } \ + NS_IMETHOD SetPort(int32_t aPort, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetPort(aPort); } \ + NS_IMETHOD SetPathQueryRef(const nsACString & aPathQueryRef, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetPathQueryRef(aPathQueryRef); } \ + NS_IMETHOD SetRef(const nsACString & aRef, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetRef(aRef); } \ + NS_IMETHOD SetFilePath(const nsACString & aFilePath, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetFilePath(aFilePath); } \ + NS_IMETHOD SetQuery(const nsACString & aQuery, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetQuery(aQuery); } \ + NS_IMETHOD SetQueryWithEncoding(const nsACString & query, const mozilla::Encoding *encoding, nsIURIMutator** aMutator) override \ + { NS_ADDREF(*aMutator = this); return !_to ? NS_ERROR_NULL_POINTER : _to->SetQueryWithEncoding(query, encoding); } + +%} + [scriptable, builtinclass, uuid(4d1f3103-1c44-4dcd-b717-5d22a697a7d9)] interface nsIURIMutator : nsIURISetters { diff --git a/netwerk/base/nsSimpleNestedURI.h b/netwerk/base/nsSimpleNestedURI.h index f54810b13c712..330179de09ea0 100644 --- a/netwerk/base/nsSimpleNestedURI.h +++ b/netwerk/base/nsSimpleNestedURI.h @@ -77,8 +77,8 @@ class nsSimpleNestedURI : public nsSimpleURI, , public BaseURIMutator { NS_DECL_ISUPPORTS - NS_FORWARD_SAFE_NSIURISETTERS(mURI) NS_DEFINE_NSIMUTATOR_COMMON + NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI) explicit Mutator() { } private: diff --git a/netwerk/base/nsSimpleURI.h b/netwerk/base/nsSimpleURI.h index 5096223035424..56d3e923873d7 100644 --- a/netwerk/base/nsSimpleURI.h +++ b/netwerk/base/nsSimpleURI.h @@ -118,7 +118,7 @@ class nsSimpleURI , public BaseURIMutator { NS_DECL_ISUPPORTS - NS_FORWARD_SAFE_NSIURISETTERS(mURI) + NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI) NS_DEFINE_NSIMUTATOR_COMMON explicit Mutator() { } diff --git a/netwerk/base/nsStandardURL.h b/netwerk/base/nsStandardURL.h index 974d08b2abe8d..9e42fd472a8fb 100644 --- a/netwerk/base/nsStandardURL.h +++ b/netwerk/base/nsStandardURL.h @@ -318,7 +318,7 @@ class nsStandardURL : public nsIFileURL , public BaseURIMutator { NS_DECL_ISUPPORTS - NS_FORWARD_SAFE_NSIURISETTERS(mURI) + NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI) NS_DEFINE_NSIMUTATOR_COMMON explicit Mutator() { } diff --git a/netwerk/protocol/about/nsAboutProtocolHandler.h b/netwerk/protocol/about/nsAboutProtocolHandler.h index 739dece2865eb..f041a8854741f 100644 --- a/netwerk/protocol/about/nsAboutProtocolHandler.h +++ b/netwerk/protocol/about/nsAboutProtocolHandler.h @@ -92,7 +92,7 @@ class nsNestedAboutURI : public nsSimpleNestedURI { , public BaseURIMutator { NS_DECL_ISUPPORTS - NS_FORWARD_SAFE_NSIURISETTERS(mURI) + NS_FORWARD_SAFE_NSIURISETTERS_RET(mURI) NS_DEFINE_NSIMUTATOR_COMMON explicit Mutator() { } diff --git a/netwerk/test/unit/test_uri_mutator.js b/netwerk/test/unit/test_uri_mutator.js new file mode 100644 index 0000000000000..bfadb4c6e7672 --- /dev/null +++ b/netwerk/test/unit/test_uri_mutator.js @@ -0,0 +1,23 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; +Cu.import("resource://gre/modules/NetUtil.jsm"); + +function standardMutator() +{ + return Cc['@mozilla.org/network/standard-url-mutator;1'] + .createInstance(Ci.nsIURIMutator); +} + +add_task(async function test_simple_setter_chaining() { + let uri = standardMutator() + .setSpec("http://example.com/") + .setQuery("hello") + .setRef("bla") + .setScheme("ftp") + .finalize(); + equal(uri.spec, "ftp://example.com/?hello#bla"); +}); diff --git a/netwerk/test/unit/xpcshell.ini b/netwerk/test/unit/xpcshell.ini index d15c4228834ef..1901da2d26cfe 100644 --- a/netwerk/test/unit/xpcshell.ini +++ b/netwerk/test/unit/xpcshell.ini @@ -405,3 +405,4 @@ skip-if = os == "android" [test_bug1378385_http1.js] [test_tls_flags_separate_connections.js] [test_tls_flags.js] +[test_uri_mutator.js]