summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_locationBarCommand.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_locationBarCommand.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_locationBarCommand.js291
1 files changed, 291 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_locationBarCommand.js b/browser/components/urlbar/tests/browser/browser_locationBarCommand.js
new file mode 100644
index 0000000000..f0077c3334
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_locationBarCommand.js
@@ -0,0 +1,291 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * This test is designed to ensure that the correct command/operation happens
+ * when pressing enter with various key combinations in the urlbar.
+ */
+
+const TEST_VALUE = "example.com";
+const START_VALUE = "example.org";
+
+add_setup(async function () {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.altClickSave", true],
+ ["browser.urlbar.autoFill", false],
+ ],
+ });
+});
+
+add_task(async function alt_left_click_test() {
+ info("Running test: Alt left click");
+
+ // Monkey patch saveURL() to avoid dealing with file save code paths.
+ let oldSaveURL = saveURL;
+ let saveURLPromise = new Promise(resolve => {
+ saveURL = () => {
+ // Restore old saveURL() value.
+ saveURL = oldSaveURL;
+ resolve();
+ };
+ });
+
+ await triggerCommand("click", { altKey: true });
+
+ await saveURLPromise;
+ ok(true, "SaveURL was called");
+ is(gURLBar.value, "", "Urlbar reverted to original value");
+});
+
+add_task(async function shift_left_click_test() {
+ info("Running test: Shift left click");
+
+ let destinationURL = "http://" + TEST_VALUE + "/";
+ let newWindowPromise = BrowserTestUtils.waitForNewWindow({
+ url: destinationURL,
+ });
+ await triggerCommand("click", { shiftKey: true });
+ let win = await newWindowPromise;
+
+ info("URL should be loaded in a new window");
+ is(gURLBar.value, "", "Urlbar reverted to original value");
+ await promiseCheckChildNoFocusedElement(gBrowser.selectedBrowser);
+ is(
+ document.activeElement,
+ gBrowser.selectedBrowser,
+ "Content window should be focused"
+ );
+ is(win.gURLBar.value, TEST_VALUE, "New URL is loaded in new window");
+
+ // Cleanup.
+ let ourWindowRefocusedPromise = Promise.all([
+ BrowserTestUtils.waitForEvent(window, "activate"),
+ BrowserTestUtils.waitForEvent(window, "focus", true),
+ ]);
+ await BrowserTestUtils.closeWindow(win);
+ await ourWindowRefocusedPromise;
+});
+
+add_task(async function right_click_test() {
+ info("Running test: Right click on go button");
+
+ // Add a new tab.
+ await promiseOpenNewTab();
+
+ await triggerCommand("click", { button: 2 });
+
+ // Right click should do nothing (context menu will be shown).
+ is(gURLBar.value, TEST_VALUE, "Urlbar still has the value we entered");
+
+ // Cleanup.
+ gBrowser.removeCurrentTab();
+});
+
+add_task(async function shift_accel_left_click_test() {
+ info("Running test: Shift+Ctrl/Cmd left click on go button");
+
+ // Add a new tab.
+ let tab = await promiseOpenNewTab();
+
+ let loadStartedPromise = promiseLoadStarted();
+ await triggerCommand("click", { accelKey: true, shiftKey: true });
+ await loadStartedPromise;
+
+ // Check the load occurred in a new background tab.
+ info("URL should be loaded in a new background tab");
+ is(gURLBar.value, "", "Urlbar reverted to original value");
+ ok(!gURLBar.focused, "Urlbar is no longer focused after urlbar command");
+ is(gBrowser.selectedTab, tab, "Focus did not change to the new tab");
+
+ // Select the new background tab
+ gBrowser.selectedTab = gBrowser.selectedTab.nextElementSibling;
+ is(gURLBar.value, TEST_VALUE, "New URL is loaded in new tab");
+
+ // Cleanup.
+ gBrowser.removeCurrentTab();
+ gBrowser.removeCurrentTab();
+});
+
+add_task(async function load_in_current_tab_test() {
+ let tests = [
+ {
+ desc: "Simple return keypress",
+ type: "keypress",
+ },
+ {
+ desc: "Left click on go button",
+ type: "click",
+ },
+ {
+ desc: "Ctrl/Cmd+Return keypress",
+ type: "keypress",
+ details: { accelKey: true },
+ },
+ {
+ desc: "Alt+Return keypress in a blank tab",
+ type: "keypress",
+ details: { altKey: true },
+ },
+ {
+ desc: "AltGr+Return keypress in a blank tab",
+ type: "keypress",
+ details: { altGraphKey: true },
+ },
+ ];
+
+ for (let { desc, type, details } of tests) {
+ info(`Running test: ${desc}`);
+
+ // Add a new tab.
+ let tab = await promiseOpenNewTab();
+
+ // Trigger a load and check it occurs in the current tab.
+ let loadStartedPromise = promiseLoadStarted();
+ await triggerCommand(type, details);
+ await loadStartedPromise;
+
+ info("URL should be loaded in the current tab");
+ is(gURLBar.value, TEST_VALUE, "Urlbar still has the value we entered");
+ await promiseCheckChildNoFocusedElement(gBrowser.selectedBrowser);
+ is(
+ document.activeElement,
+ gBrowser.selectedBrowser,
+ "Content window should be focused"
+ );
+ is(gBrowser.selectedTab, tab, "New URL was loaded in the current tab");
+
+ // Cleanup.
+ gBrowser.removeCurrentTab();
+ }
+});
+
+add_task(async function load_in_new_tab_test() {
+ let tests = [
+ {
+ desc: "Ctrl/Cmd left click on go button",
+ type: "click",
+ details: { accelKey: true },
+ url: "about:blank",
+ },
+ {
+ desc: "Alt+Return keypress in a dirty tab",
+ type: "keypress",
+ details: { altKey: true },
+ url: START_VALUE,
+ },
+ {
+ desc: "AltGr+Return keypress in a dirty tab",
+ type: "keypress",
+ details: { altGraphKey: true },
+ url: START_VALUE,
+ },
+ ];
+
+ for (let { desc, type, details, url } of tests) {
+ info(`Running test: ${desc}`);
+
+ // Add a new tab.
+ let tab = await promiseOpenNewTab(url);
+
+ // Trigger a load and check it occurs in a new tab.
+ let tabSwitchedPromise = promiseNewTabSwitched();
+ await triggerCommand(type, details);
+ await tabSwitchedPromise;
+
+ // Check the load occurred in a new tab.
+ info("URL should be loaded in a new focused tab");
+ is(gURLBar.value, TEST_VALUE, "Urlbar still has the value we entered");
+ await promiseCheckChildNoFocusedElement(gBrowser.selectedBrowser);
+ is(
+ document.activeElement,
+ gBrowser.selectedBrowser,
+ "Content window should be focused"
+ );
+ isnot(gBrowser.selectedTab, tab, "New URL was loaded in a new tab");
+
+ // Cleanup.
+ gBrowser.removeCurrentTab();
+ gBrowser.removeCurrentTab();
+ }
+});
+
+async function triggerCommand(type, details = {}) {
+ gURLBar.focus();
+ gURLBar.value = "";
+ EventUtils.sendString(TEST_VALUE);
+
+ Assert.equal(
+ await UrlbarTestUtils.promiseUserContextId(window),
+ gBrowser.selectedTab.getAttribute("usercontextid"),
+ "userContextId must be the same as the originating tab"
+ );
+
+ if (type == "click") {
+ ok(
+ gURLBar.hasAttribute("usertyping"),
+ "usertyping attribute must be set for the go button to be visible"
+ );
+ EventUtils.synthesizeMouseAtCenter(gURLBar.goButton, details);
+ } else if (type == "keypress") {
+ EventUtils.synthesizeKey("KEY_Enter", details);
+ } else {
+ throw new Error("Unsupported event type");
+ }
+}
+
+function promiseLoadStarted() {
+ return new Promise(resolve => {
+ gBrowser.addTabsProgressListener({
+ onStateChange(browser, webProgress, req, flags, status) {
+ if (flags & Ci.nsIWebProgressListener.STATE_START) {
+ gBrowser.removeTabsProgressListener(this);
+ resolve();
+ }
+ },
+ });
+ });
+}
+
+let gUserContextIdSerial = 1;
+async function promiseOpenNewTab(url = "about:blank") {
+ let tab = BrowserTestUtils.addTab(gBrowser, url, {
+ userContextId: gUserContextIdSerial++,
+ });
+ let tabSwitchPromise = promiseNewTabSwitched(tab);
+ gBrowser.selectedTab = tab;
+ await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser);
+ await tabSwitchPromise;
+ return tab;
+}
+
+function promiseNewTabSwitched() {
+ return new Promise(resolve => {
+ gBrowser.addEventListener(
+ "TabSwitchDone",
+ function () {
+ executeSoon(resolve);
+ },
+ { once: true }
+ );
+ });
+}
+
+function promiseCheckChildNoFocusedElement(browser) {
+ if (!gMultiProcessBrowser) {
+ Assert.equal(
+ Services.focus.focusedElement,
+ null,
+ "There should be no focused element"
+ );
+ return null;
+ }
+
+ return ContentTask.spawn(browser, null, async function () {
+ Assert.equal(
+ Services.focus.focusedElement,
+ null,
+ "There should be no focused element"
+ );
+ });
+}