"use strict"; function stringToDefaultURI(str) { return Cc["@mozilla.org/network/default-uri-mutator;1"] .createInstance(Ci.nsIURIMutator) .setSpec(str) .finalize(); } add_task(function test_getters() { let uri = stringToDefaultURI( "proto://user:password@hostname:123/path/to/file?query#hash" ); equal(uri.spec, "proto://user:password@hostname:123/path/to/file?query#hash"); equal(uri.prePath, "proto://user:password@hostname:123"); equal(uri.scheme, "proto"); equal(uri.userPass, "user:password"); equal(uri.username, "user"); equal(uri.password, "password"); equal(uri.hostPort, "hostname:123"); equal(uri.host, "hostname"); equal(uri.port, 123); equal(uri.pathQueryRef, "/path/to/file?query#hash"); equal(uri.asciiSpec, uri.spec); equal(uri.asciiHostPort, uri.hostPort); equal(uri.asciiHost, uri.host); equal(uri.ref, "hash"); equal( uri.specIgnoringRef, "proto://user:password@hostname:123/path/to/file?query" ); equal(uri.hasRef, true); equal(uri.filePath, "/path/to/file"); equal(uri.query, "query"); equal(uri.displayHost, uri.host); equal(uri.displayHostPort, uri.hostPort); equal(uri.displaySpec, uri.spec); equal(uri.displayPrePath, uri.prePath); }); add_task(function test_methods() { let uri = stringToDefaultURI( "proto://user:password@hostname:123/path/to/file?query#hash" ); let uri_same = stringToDefaultURI( "proto://user:password@hostname:123/path/to/file?query#hash" ); let uri_different = stringToDefaultURI( "proto://user:password@hostname:123/path/to/file?query" ); let uri_very_different = stringToDefaultURI( "proto://user:password@hostname:123/path/to/file?query1#hash" ); ok(uri.equals(uri_same)); ok(!uri.equals(uri_different)); ok(uri.schemeIs("proto")); ok(!uri.schemeIs("proto2")); ok(!uri.schemeIs("proto ")); ok(!uri.schemeIs("proto\n")); equal(uri.resolve("/hello"), "proto://user:password@hostname:123/hello"); equal( uri.resolve("hello"), "proto://user:password@hostname:123/path/to/hello" ); equal(uri.resolve("proto2:otherhost"), "proto2:otherhost"); ok(uri.equalsExceptRef(uri_same)); ok(uri.equalsExceptRef(uri_different)); ok(!uri.equalsExceptRef(uri_very_different)); }); add_task(function test_mutator() { let uri = stringToDefaultURI( "proto://user:pass@host:123/path/to/file?query#hash" ); let check = (callSetters, verify) => { let m = uri.mutate(); callSetters(m); verify(m.finalize()); }; check( m => m.setSpec("test:bla"), u => equal(u.spec, "test:bla") ); check( m => m.setSpec("test:bla"), u => equal(u.spec, "test:bla") ); check( m => m.setScheme("some"), u => equal(u.spec, "some://user:pass@host:123/path/to/file?query#hash") ); check( m => m.setUserPass("u"), u => equal(u.spec, "proto://u@host:123/path/to/file?query#hash") ); check( m => m.setUserPass("u:p"), u => equal(u.spec, "proto://u:p@host:123/path/to/file?query#hash") ); check( m => m.setUserPass(":p"), u => equal(u.spec, "proto://:p@host:123/path/to/file?query#hash") ); check( m => m.setUserPass(""), u => equal(u.spec, "proto://host:123/path/to/file?query#hash") ); check( m => m.setUsername("u"), u => equal(u.spec, "proto://u:pass@host:123/path/to/file?query#hash") ); check( m => m.setPassword("p"), u => equal(u.spec, "proto://user:p@host:123/path/to/file?query#hash") ); check( m => m.setHostPort("h"), u => equal(u.spec, "proto://user:pass@h:123/path/to/file?query#hash") ); check( m => m.setHostPort("h:456"), u => equal(u.spec, "proto://user:pass@h:456/path/to/file?query#hash") ); check( m => m.setHost("bla"), u => equal(u.spec, "proto://user:pass@bla:123/path/to/file?query#hash") ); check( m => m.setPort(987), u => equal(u.spec, "proto://user:pass@host:987/path/to/file?query#hash") ); check( m => m.setPathQueryRef("/p?q#r"), u => equal(u.spec, "proto://user:pass@host:123/p?q#r") ); check( m => m.setRef("r"), u => equal(u.spec, "proto://user:pass@host:123/path/to/file?query#r") ); check( m => m.setFilePath("/my/path"), u => equal(u.spec, "proto://user:pass@host:123/my/path?query#hash") ); check( m => m.setQuery("q"), u => equal(u.spec, "proto://user:pass@host:123/path/to/file?q#hash") ); }); add_task(function test_ipv6() { let uri = stringToDefaultURI("non-special://[2001::1]/"); equal(uri.hostPort, "[2001::1]"); // Hopefully this will change after bug 1603199. equal(uri.host, "2001::1"); }); add_task(function test_serialization() { let uri = stringToDefaultURI("http://example.org/path"); let str = serialize_to_escaped_string(uri); let other = deserialize_from_escaped_string(str).QueryInterface(Ci.nsIURI); equal(other.spec, uri.spec); }); // This test assumes the serialization never changes, which might not be true. // It's OK to change the test if we ever make changes to the serialization // code and this starts failing. add_task(function test_deserialize_from_string() { let payload = "%04DZ%A0%FD%27L%99%BDAk%E61%8A%E9%2C%00%00%00%00%00%00%00" + "%00%C0%00%00%00%00%00%00F%00%00%00%13scheme%3Astuff/to/say"; equal( deserialize_from_escaped_string(payload).QueryInterface(Ci.nsIURI).spec, stringToDefaultURI("scheme:stuff/to/say").spec ); let payload2 = "%04DZ%A0%FD%27L%99%BDAk%E61%8A%E9%2C%00%00%00%00%00%00%00" + "%00%C0%00%00%00%00%00%00F%00%00%00%17http%3A//example.org/path"; equal( deserialize_from_escaped_string(payload2).QueryInterface(Ci.nsIURI).spec, stringToDefaultURI("http://example.org/path").spec ); });