summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_canonizeURL.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_canonizeURL.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_canonizeURL.js277
1 files changed, 277 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_canonizeURL.js b/browser/components/urlbar/tests/browser/browser_canonizeURL.js
new file mode 100644
index 0000000000..04f153e7d2
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_canonizeURL.js
@@ -0,0 +1,277 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Tests turning non-url-looking values typed in the input field into proper URLs.
+ */
+
+const TEST_ENGINE_BASENAME = "searchSuggestionEngine.xml";
+
+add_task(async function checkCtrlWorks() {
+ registerCleanupFunction(async function () {
+ await PlacesUtils.history.clear();
+ await UrlbarTestUtils.formHistory.clear();
+ });
+
+ let defaultEngine = await Services.search.getDefault();
+ let testcases = [
+ ["example", "https://www.example.com/", { ctrlKey: true }],
+ // Check that a direct load is not overwritten by a previous canonization.
+ ["http://example.com/test/", "http://example.com/test/", {}],
+ ["ex-ample", "https://www.ex-ample.com/", { ctrlKey: true }],
+ [" example ", "https://www.example.com/", { ctrlKey: true }],
+ [" example/foo ", "https://www.example.com/foo", { ctrlKey: true }],
+ [
+ " example/foo bar ",
+ "https://www.example.com/foo%20bar",
+ { ctrlKey: true },
+ ],
+ ["example.net", "http://example.net/", { ctrlKey: true }],
+ ["http://example", "http://example/", { ctrlKey: true }],
+ ["example:8080", "http://example:8080/", { ctrlKey: true }],
+ ["ex-ample.foo", "http://ex-ample.foo/", { ctrlKey: true }],
+ ["example.foo/bar ", "http://example.foo/bar", { ctrlKey: true }],
+ ["1.1.1.1", "http://1.1.1.1/", { ctrlKey: true }],
+ ["ftp.example.bar", "http://ftp.example.bar/", { ctrlKey: true }],
+ [
+ "ex ample",
+ defaultEngine.getSubmission("ex ample", null, "keyword").uri.spec,
+ { ctrlKey: true },
+ ],
+ ];
+
+ // Disable autoFill for this test, since it could mess up the results.
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.urlbar.autoFill", false],
+ ["browser.urlbar.ctrlCanonizesURLs", true],
+ ],
+ });
+
+ const win = await BrowserTestUtils.openNewBrowserWindow();
+
+ for (let [inputValue, expectedURL, options] of testcases) {
+ info(`Testing input string: "${inputValue}" - expected: "${expectedURL}"`);
+ let promiseLoad = BrowserTestUtils.waitForDocLoadAndStopIt(
+ expectedURL,
+ win.gBrowser.selectedBrowser
+ );
+ let promiseStopped = BrowserTestUtils.browserStopped(
+ win.gBrowser.selectedBrowser,
+ undefined,
+ true
+ );
+ win.gURLBar.focus();
+ win.gURLBar.inputField.value = inputValue.slice(0, -1);
+ EventUtils.sendString(inputValue.slice(-1), win);
+ EventUtils.synthesizeKey("KEY_Enter", options, win);
+ await Promise.all([promiseLoad, promiseStopped]);
+ }
+
+ await BrowserTestUtils.closeWindow(win);
+});
+
+add_task(async function checkPrefTurnsOffCanonize() {
+ // Add a dummy search engine to avoid hitting the network.
+ await SearchTestUtils.promiseNewSearchEngine({
+ url: getRootDirectory(gTestPath) + TEST_ENGINE_BASENAME,
+ setAsDefault: true,
+ });
+
+ const win = await BrowserTestUtils.openNewBrowserWindow();
+
+ // Ensure we don't end up loading something in the current tab becuase it's empty:
+ let initialTab = await BrowserTestUtils.openNewForegroundTab({
+ gBrowser: win.gBrowser,
+ opening: "about:mozilla",
+ });
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.urlbar.ctrlCanonizesURLs", false]],
+ });
+
+ let newURL = "http://mochi.test:8888/?terms=example";
+ // On MacOS CTRL+Enter is not supposed to open in a new tab, because it uses
+ // CMD+Enter for that.
+ let promiseLoaded =
+ AppConstants.platform == "macosx"
+ ? BrowserTestUtils.browserLoaded(
+ win.gBrowser.selectedBrowser,
+ false,
+ newURL
+ )
+ : BrowserTestUtils.waitForNewTab(win.gBrowser);
+
+ win.gURLBar.focus();
+ win.gURLBar.selectionStart = win.gURLBar.selectionEnd =
+ win.gURLBar.inputField.value.length;
+ win.gURLBar.inputField.value = "exampl";
+ EventUtils.sendString("e", win);
+ EventUtils.synthesizeKey("KEY_Enter", { ctrlKey: true }, win);
+
+ await promiseLoaded;
+ if (AppConstants.platform == "macosx") {
+ Assert.equal(
+ initialTab.linkedBrowser.currentURI.spec,
+ newURL,
+ "Original tab should have navigated"
+ );
+ } else {
+ Assert.equal(
+ initialTab.linkedBrowser.currentURI.spec,
+ "about:mozilla",
+ "Original tab shouldn't have navigated"
+ );
+ Assert.equal(
+ win.gBrowser.selectedBrowser.currentURI.spec,
+ newURL,
+ "New tab should have navigated"
+ );
+ }
+ while (win.gBrowser.tabs.length > 1) {
+ win.gBrowser.removeTab(win.gBrowser.selectedTab, { animate: false });
+ }
+
+ await BrowserTestUtils.closeWindow(win);
+});
+
+add_task(async function autofill() {
+ // Re-enable autofill and canonization.
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.urlbar.autoFill", true],
+ ["browser.urlbar.ctrlCanonizesURLs", true],
+ ],
+ });
+
+ const win = await BrowserTestUtils.openNewBrowserWindow();
+
+ // Quantumbar automatically disables autofill when the old search string
+ // starts with the new search string, so to make sure that doesn't happen and
+ // that earlier tests don't conflict with this one, start a new search for
+ // some other string.
+ win.gURLBar.select();
+ EventUtils.sendString("blah", win);
+
+ // Add a visit that will be autofilled.
+ await PlacesUtils.history.clear();
+ await PlacesTestUtils.addVisits([
+ {
+ uri: "http://example.com/",
+ transition: PlacesUtils.history.TRANSITIONS.TYPED,
+ },
+ ]);
+
+ let testcases = [
+ ["ex", "https://www.ex.com/", { ctrlKey: true }],
+ // Check that a direct load is not overwritten by a previous canonization.
+ ["ex", "http://example.com/", {}],
+ // search alias
+ ["@goo", "https://www.goo.com/", { ctrlKey: true }],
+ ];
+
+ function promiseAutofill() {
+ return BrowserTestUtils.waitForEvent(win.gURLBar.inputField, "select");
+ }
+
+ for (let [inputValue, expectedURL, options] of testcases) {
+ let promiseLoad = BrowserTestUtils.waitForDocLoadAndStopIt(
+ expectedURL,
+ win.gBrowser.selectedBrowser
+ );
+ win.gURLBar.select();
+ let autofillPromise = promiseAutofill();
+ EventUtils.sendString(inputValue, win);
+ await autofillPromise;
+ EventUtils.synthesizeKey("KEY_Enter", options, win);
+ await promiseLoad;
+
+ // Here again, make sure autofill isn't disabled for the next search. See
+ // the comment above.
+ win.gURLBar.select();
+ EventUtils.sendString("blah", win);
+ }
+
+ await PlacesUtils.history.clear();
+
+ await BrowserTestUtils.closeWindow(win);
+});
+
+add_task(async function () {
+ info(
+ "Test whether canonization is disabled until the ctrl key is releasing if the key was used to paste text into urlbar"
+ );
+
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.urlbar.ctrlCanonizesURLs", true]],
+ });
+
+ const win = await BrowserTestUtils.openNewBrowserWindow();
+
+ info("Paste the word to the urlbar");
+ const testWord = "example";
+ simulatePastingToUrlbar(testWord, win);
+ is(win.gURLBar.value, testWord, "Paste the test word correctly");
+
+ info("Send enter key while pressing the ctrl key");
+ EventUtils.synthesizeKey("VK_RETURN", { ctrlKey: true }, win);
+ await BrowserTestUtils.browserLoaded(win.gBrowser.selectedBrowser);
+ is(
+ win.gBrowser.selectedBrowser.documentURI.spec,
+ `http://mochi.test:8888/?terms=${testWord}`,
+ "The loaded url is not canonized"
+ );
+ EventUtils.synthesizeKey("VK_CONTROL", { type: "keyup" }, win);
+
+ await BrowserTestUtils.closeWindow(win);
+});
+
+add_task(async function () {
+ info("Test whether canonization is enabled again after releasing the ctrl");
+
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.urlbar.ctrlCanonizesURLs", true]],
+ });
+
+ const win = await BrowserTestUtils.openNewBrowserWindow();
+
+ info("Paste the word to the urlbar");
+ const testWord = "example";
+ simulatePastingToUrlbar(testWord, win);
+ is(win.gURLBar.value, testWord, "Paste the test word correctly");
+
+ info("Release the ctrl key befoer typing Enter key");
+ EventUtils.synthesizeKey("VK_CONTROL", { type: "keyup" }, win);
+
+ info("Send enter key with the ctrl");
+ const onLoad = BrowserTestUtils.waitForDocLoadAndStopIt(
+ `https://www.${testWord}.com/`,
+ win.gBrowser.selectedBrowser
+ );
+ const onStop = BrowserTestUtils.browserStopped(
+ win.gBrowser.selectedBrowser,
+ undefined,
+ true
+ );
+ EventUtils.synthesizeKey("VK_RETURN", { ctrlKey: true }, win);
+ await Promise.all([onLoad, onStop]);
+ info("The loaded url is canonized");
+
+ await BrowserTestUtils.closeWindow(win);
+});
+
+function simulatePastingToUrlbar(text, win) {
+ win.gURLBar.focus();
+
+ const keyForPaste = win.document
+ .getElementById("key_paste")
+ .getAttribute("key")
+ .toLowerCase();
+ EventUtils.synthesizeKey(
+ keyForPaste,
+ { type: "keydown", ctrlKey: true },
+ win
+ );
+
+ win.gURLBar.select();
+ EventUtils.sendString(text, win);
+}