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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
"use strict";
// This test makes sure (1) you can't break the urlbar by typing particular JSON
// or JS fragments into it, (2) urlbar.textValue shows URLs unescaped, and (3)
// the urlbar also shows the URLs embedded in action URIs unescaped. See bug
// 1233672.
add_task(function* injectJSON() {
let inputStrs = [
'http://example.com/ ", "url": "bar',
'http://example.com/\\',
'http://example.com/"',
'http://example.com/","url":"evil.com',
'http://mozilla.org/\\u0020',
'http://www.mozilla.org/","url":1e6,"some-key":"foo',
'http://www.mozilla.org/","url":null,"some-key":"foo',
'http://www.mozilla.org/","url":["foo","bar"],"some-key":"foo',
];
for (let inputStr of inputStrs) {
yield checkInput(inputStr);
}
gURLBar.value = "";
gURLBar.handleRevert();
gURLBar.blur();
});
add_task(function losslessDecode() {
let urlNoScheme = "example.com/\u30a2\u30a4\u30a6\u30a8\u30aa";
let url = "http://" + urlNoScheme;
gURLBar.textValue = url;
// Since this is directly setting textValue, it is expected to be trimmed.
Assert.equal(gURLBar.inputField.value, urlNoScheme,
"The string displayed in the textbox should not be escaped");
gURLBar.value = "";
gURLBar.handleRevert();
gURLBar.blur();
});
add_task(function* actionURILosslessDecode() {
let urlNoScheme = "example.com/\u30a2\u30a4\u30a6\u30a8\u30aa";
let url = "http://" + urlNoScheme;
yield promiseAutocompleteResultPopup(url);
// At this point the heuristic result is selected but the urlbar's value is
// simply `url`. Key down and back around until the heuristic result is
// selected again, and at that point the urlbar's value should be a visiturl
// moz-action.
do {
gURLBar.controller.handleKeyNavigation(KeyEvent.DOM_VK_DOWN);
} while (gURLBar.popup.selectedIndex != 0);
let [, type, ] = gURLBar.value.match(/^moz-action:([^,]+),(.*)$/);
Assert.equal(type, "visiturl",
"visiturl action URI should be in the urlbar");
Assert.equal(gURLBar.inputField.value, urlNoScheme,
"The string displayed in the textbox should not be escaped");
gURLBar.value = "";
gURLBar.handleRevert();
gURLBar.blur();
});
function* checkInput(inputStr) {
yield promiseAutocompleteResultPopup(inputStr);
let item = gURLBar.popup.richlistbox.firstChild;
Assert.ok(item, "Should have a result");
// visiturl matches have their param.urls fixed up.
let fixupInfo = Services.uriFixup.getFixupURIInfo(inputStr,
Ci.nsIURIFixup.FIXUP_FLAG_FIX_SCHEME_TYPOS |
Ci.nsIURIFixup.FIXUP_FLAG_ALLOW_KEYWORD_LOOKUP
);
let expectedVisitURL = fixupInfo.fixedURI.spec;
let type = "visiturl";
let params = {
url: expectedVisitURL,
input: inputStr,
};
for (let key in params) {
params[key] = encodeURIComponent(params[key]);
}
let expectedURL = "moz-action:" + type + "," + JSON.stringify(params);
Assert.equal(item.getAttribute("url"), expectedURL, "url");
Assert.equal(item.getAttribute("title"), inputStr.replace("\\", "/"), "title");
Assert.equal(item.getAttribute("text"), inputStr, "text");
let itemType = item.getAttribute("type");
Assert.equal(itemType, "visiturl");
Assert.equal(item._titleText.textContent, inputStr.replace("\\", "/"), "Visible title");
Assert.equal(item._actionText.textContent, "Visit", "Visible action");
}
|