forked from mirrors/gecko-dev
MozReview-Commit-ID: 6tv0Z06CO4a --HG-- extra : rebase_source : 014c0b04d8538dc5f15bc6dd4ed6bd220c55c5d4
97 lines
3.3 KiB
JavaScript
97 lines
3.3 KiB
JavaScript
"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");
|
|
}
|