We will remove the user and pass from the URL for Histories and Favicons using nsIOService::CreateExposableURI()[1], then store them to the database. And, for Favicons. And, for Favicons, we will also read them. Therefore, as the frequency calling CreateExposableURI() will be higher, we want to optimize it. Currently, CreateExposableURI() gets/copies the String of UserPass to check whether there is a user pass info in the URL[2]. Its copying will be waste. To prevent it, implement hasUserPass in nsIURI, and refer to it instead. [1] https://searchfox.org/mozilla-central/rev/90dce6b0223b4dc17bb10f1125b44f70951585f9/netwerk/base/nsIOService.cpp#1031 [2] https://searchfox.org/mozilla-central/rev/90dce6b0223b4dc17bb10f1125b44f70951585f9/netwerk/base/nsIOService.cpp#1017 Differential Revision: https://phabricator.services.mozilla.com/D193623
187 lines
5.6 KiB
JavaScript
187 lines
5.6 KiB
JavaScript
"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.hasUserPass, true);
|
|
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
|
|
);
|
|
});
|