1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
const StandardURL = Components.Constructor("@mozilla.org/network/standard-url;1",
"nsIStandardURL",
"init");
// 1.percent-encoded IDN that contains blacklisted character should be converted
// to punycode, not UTF-8 string
// 2.only hostname-valid percent encoded ASCII characters should be decoded
// 3.IDN convertion must not bypassed by %00
let reference = [
["www.example.com%e2%88%95www.mozill%d0%b0.com%e2%81%84www.mozilla.org",
"www.example.xn--comwww-re3c.xn--mozill-8nf.xn--comwww-rq0c.mozilla.org"],
["www.mozill%61%2f.org", "www.mozilla%2f.org"], // a slash is not valid in the hostname
["www.e%00xample.com%e2%88%95www.mozill%d0%b0.com%e2%81%84www.mozill%61.org",
"www.e%00xample.xn--comwww-re3c.xn--mozill-8nf.xn--comwww-rq0c.mozilla.org"],
];
let prefData =
[
{
name: "network.enableIDN",
newVal: true
},
{
name: "network.IDN_show_punycode",
newVal: false
},
{
name: "network.IDN.whitelist.org",
newVal: true
}
];
let prefIdnBlackList = {
name: "network.IDN.blacklist_chars",
minimumList: "\u2215\u0430\u2044",
};
function stringToURL(str) {
return (new StandardURL(Ci.nsIStandardURL.URLTYPE_AUTHORITY, 80,
str, "UTF-8", null))
.QueryInterface(Ci.nsIURL);
}
function run_test() {
// Make sure our prefs are set such that this test actually means something
let prefs = Cc["@mozilla.org/preferences-service;1"].
getService(Ci.nsIPrefBranch);
for (let pref of prefData) {
prefs.setBoolPref(pref.name, pref.newVal);
}
prefIdnBlackList.set = false;
try {
prefIdnBlackList.oldVal = prefs.getComplexValue(prefIdnBlackList.name,
Ci.nsIPrefLocalizedString).data;
prefs.getComplexValue(prefIdnBlackList.name,
Ci.nsIPrefLocalizedString).data=prefIdnBlackList.minimumList;
prefIdnBlackList.set = true;
} catch (e) {
}
do_register_cleanup(function() {
for (let pref of prefData) {
prefs.clearUserPref(pref.name);
}
if (prefIdnBlackList.set) {
prefs.getComplexValue(prefIdnBlackList.name,
Ci.nsIPrefLocalizedString).data = prefIdnBlackList.oldVal;
}
});
for (let i = 0; i < reference.length; ++i) {
try {
let result = stringToURL("http://" + reference[i][0]).host;
equal(result, reference[i][1]);
} catch (e) {
ok(false, "Error testing "+reference[i][0]);
}
}
}
|