summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_oneOffs_keyModifiers.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_oneOffs_keyModifiers.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_oneOffs_keyModifiers.js392
1 files changed, 392 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_oneOffs_keyModifiers.js b/browser/components/urlbar/tests/browser/browser_oneOffs_keyModifiers.js
new file mode 100644
index 0000000000..30b241b3b3
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_oneOffs_keyModifiers.js
@@ -0,0 +1,392 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Tests that one-offs behave differently with key modifiers.
+ */
+
+"use strict";
+
+const TEST_ENGINE_BASENAME = "searchSuggestionEngine.xml";
+const SEARCH_STRING = "foo.bar";
+
+XPCOMUtils.defineLazyGetter(this, "oneOffSearchButtons", () => {
+ return UrlbarTestUtils.getOneOffSearchButtons(window);
+});
+
+let engine;
+
+async function searchAndOpenPopup(value) {
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value,
+ fireInputEvent: true,
+ });
+ await TestUtils.waitForCondition(
+ () => !oneOffSearchButtons._rebuilding,
+ "Waiting for one-offs to finish rebuilding"
+ );
+}
+
+add_setup(async function () {
+ // Add a search suggestion engine and move it to the front so that it appears
+ // as the first one-off.
+ engine = await SearchTestUtils.promiseNewSearchEngine({
+ url: getRootDirectory(gTestPath) + TEST_ENGINE_BASENAME,
+ });
+ await Services.search.moveEngine(engine, 0);
+
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.search.separatePrivateDefault.ui.enabled", false],
+ ["browser.urlbar.suggest.quickactions", false],
+ ],
+ });
+
+ registerCleanupFunction(async function () {
+ await PlacesUtils.history.clear();
+ await UrlbarTestUtils.formHistory.clear();
+ });
+
+ // Initialize history with enough visits to fill up the view.
+ await PlacesUtils.history.clear();
+ await UrlbarTestUtils.formHistory.clear();
+ let maxResults = Services.prefs.getIntPref("browser.urlbar.maxRichResults");
+ for (let i = 0; i < maxResults; i++) {
+ await PlacesTestUtils.addVisits(
+ "http://mochi.test:8888/browser_urlbarOneOffs.js/?" + i
+ );
+ }
+
+ // Add some more visits to the last URL added above so that the top-sites view
+ // will be non-empty.
+ for (let i = 0; i < 5; i++) {
+ await PlacesTestUtils.addVisits(
+ "http://mochi.test:8888/browser_urlbarOneOffs.js/?" + (maxResults - 1)
+ );
+ }
+ await updateTopSites(sites => {
+ return (
+ sites && sites[0] && sites[0].url.startsWith("http://mochi.test:8888/")
+ );
+ });
+
+ // Move the mouse away from the view so that a result or one-off isn't
+ // inadvertently highlighted. See bug 1659011.
+ EventUtils.synthesizeMouse(
+ gURLBar.inputField,
+ 0,
+ 0,
+ { type: "mousemove" },
+ window
+ );
+});
+
+// Shift clicking with no search string should open search mode, like an
+// unmodified click.
+add_task(async function shift_click_empty() {
+ await searchAndOpenPopup("");
+ let oneOffs = oneOffSearchButtons.getSelectableButtons(true);
+ let searchPromise = UrlbarTestUtils.promiseSearchComplete(window);
+ EventUtils.synthesizeMouseAtCenter(oneOffs[0], { shiftKey: true });
+ await searchPromise;
+ await UrlbarTestUtils.assertSearchMode(window, {
+ engineName: oneOffs[0].engine.name,
+ entry: "oneoff",
+ });
+ await UrlbarTestUtils.exitSearchMode(window);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+// Shift clicking with a search string should perform a search in the current
+// tab.
+add_task(async function shift_click_search() {
+ await searchAndOpenPopup(SEARCH_STRING);
+ let resultsPromise = BrowserTestUtils.browserLoaded(
+ gBrowser.selectedBrowser,
+ false,
+ "http://mochi.test:8888/?terms=foo.bar"
+ );
+ let oneOffs = oneOffSearchButtons.getSelectableButtons(true);
+ EventUtils.synthesizeMouseAtCenter(oneOffs[0], { shiftKey: true });
+ await resultsPromise;
+ await UrlbarTestUtils.assertSearchMode(window, null);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+// Pressing Shift+Enter on a one-off with no search string should open search
+// mode, like an unmodified click.
+add_task(async function shift_enter_empty() {
+ await searchAndOpenPopup("");
+ // Alt+Down to select the first one-off.
+ let oneOffs = oneOffSearchButtons.getSelectableButtons(true);
+ EventUtils.synthesizeKey("KEY_ArrowDown", { altKey: true });
+ let searchPromise = UrlbarTestUtils.promiseSearchComplete(window);
+ EventUtils.synthesizeKey("KEY_Enter", { shiftKey: true });
+ await searchPromise;
+ await UrlbarTestUtils.assertSearchMode(window, {
+ engineName: oneOffs[0].engine.name,
+ entry: "oneoff",
+ });
+ await UrlbarTestUtils.exitSearchMode(window);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+// Pressing Shift+Enter on a one-off with a search string should perform a
+// search in the current tab.
+add_task(async function shift_enter_search() {
+ await searchAndOpenPopup(SEARCH_STRING);
+ let resultsPromise = BrowserTestUtils.browserLoaded(
+ gBrowser.selectedBrowser,
+ false,
+ "http://mochi.test:8888/?terms=foo.bar"
+ );
+ EventUtils.synthesizeKey("KEY_ArrowDown", { altKey: true });
+ EventUtils.synthesizeKey("KEY_Enter", { shiftKey: true });
+ await resultsPromise;
+ await UrlbarTestUtils.assertSearchMode(window, null);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+// Pressing Alt+Enter on a one-off on an "empty" page (e.g. new tab) should open
+// search mode in the current tab.
+add_task(async function alt_enter_emptypage() {
+ await BrowserTestUtils.withNewTab("about:home", async function (browser) {
+ await searchAndOpenPopup(SEARCH_STRING);
+ let oneOffs = oneOffSearchButtons.getSelectableButtons(true);
+ // Alt+Down to select the first one-off.
+ EventUtils.synthesizeKey("KEY_ArrowDown", { altKey: true });
+ let searchPromise = UrlbarTestUtils.promiseSearchComplete(window);
+ EventUtils.synthesizeKey("KEY_Enter", { altKey: true });
+ await searchPromise;
+ Assert.equal(
+ browser,
+ gBrowser.selectedBrowser,
+ "The foreground tab hasn't changed."
+ );
+ await UrlbarTestUtils.assertSearchMode(window, {
+ engineName: oneOffs[0].engine.name,
+ entry: "oneoff",
+ });
+ await UrlbarTestUtils.exitSearchMode(window);
+ await UrlbarTestUtils.promisePopupClose(window);
+ });
+});
+
+// Pressing Alt+Enter on a one-off with no search string and on a "non-empty"
+// page should open search mode in a new foreground tab.
+add_task(async function alt_enter_empty() {
+ await BrowserTestUtils.withNewTab("about:robots", async function (browser) {
+ await searchAndOpenPopup("");
+ let oneOffs = oneOffSearchButtons.getSelectableButtons(true);
+ // Alt+Down to select the first one-off.
+ EventUtils.synthesizeKey("KEY_ArrowDown", { altKey: true });
+ let tabOpenPromise = BrowserTestUtils.waitForEvent(
+ gBrowser.tabContainer,
+ "TabOpen"
+ );
+ EventUtils.synthesizeKey("KEY_Enter", { altKey: true });
+ await tabOpenPromise;
+ Assert.notEqual(
+ browser,
+ gBrowser.selectedBrowser,
+ "The current foreground tab is new."
+ );
+ await UrlbarTestUtils.assertSearchMode(window, {
+ engineName: oneOffs[0].engine.name,
+ entry: "oneoff",
+ });
+ BrowserTestUtils.removeTab(gBrowser.selectedTab);
+ Assert.equal(
+ browser,
+ gBrowser.selectedBrowser,
+ "We're back in the original tab."
+ );
+ await UrlbarTestUtils.assertSearchMode(window, null);
+ await UrlbarTestUtils.promisePopupClose(window);
+ });
+});
+
+// Pressing Alt+Enter on a remote one-off with a search string and on a
+// "non-empty" page should perform a search in a new foreground tab.
+add_task(async function alt_enter_search_remote() {
+ await BrowserTestUtils.withNewTab("about:robots", async function (browser) {
+ await searchAndOpenPopup(SEARCH_STRING);
+ // Alt+Down to select the first one-off.
+ EventUtils.synthesizeKey("KEY_ArrowDown", { altKey: true });
+ let tabOpenPromise = BrowserTestUtils.waitForNewTab(
+ gBrowser,
+ "http://mochi.test:8888/?terms=foo.bar",
+ true
+ );
+ EventUtils.synthesizeKey("KEY_Enter", { altKey: true });
+ // This implictly checks the correct page is loaded.
+ let newTab = await tabOpenPromise;
+ Assert.equal(
+ newTab,
+ gBrowser.selectedTab,
+ "The current foreground tab is new."
+ );
+ // Check search mode is not activated in the new tab.
+ await UrlbarTestUtils.assertSearchMode(window, null);
+ BrowserTestUtils.removeTab(newTab);
+ Assert.equal(
+ browser,
+ gBrowser.selectedBrowser,
+ "We're back in the original tab."
+ );
+ await UrlbarTestUtils.assertSearchMode(window, null);
+ await UrlbarTestUtils.promisePopupClose(window);
+ });
+});
+
+// Pressing Alt+Enter on a local one-off with a search string and on a
+// "non-empty" page should open search mode in a new foreground tab with the
+// search string already populated.
+add_task(async function alt_enter_search_local() {
+ await BrowserTestUtils.withNewTab("about:robots", async function (browser) {
+ await searchAndOpenPopup(SEARCH_STRING);
+ // Alt+Down to select the first local one-off.
+ EventUtils.synthesizeKey("KEY_ArrowDown", { altKey: true });
+ while (
+ oneOffSearchButtons.selectedButton.id !=
+ "urlbar-engine-one-off-item-bookmarks"
+ ) {
+ EventUtils.synthesizeKey("KEY_ArrowDown", { altKey: true });
+ }
+ let tabOpenPromise = BrowserTestUtils.waitForEvent(
+ gBrowser.tabContainer,
+ "TabOpen"
+ );
+ EventUtils.synthesizeKey("KEY_Enter", { altKey: true });
+ await tabOpenPromise;
+ Assert.notEqual(
+ browser,
+ gBrowser.selectedBrowser,
+ "The current foreground tab is new."
+ );
+ await UrlbarTestUtils.assertSearchMode(window, {
+ source: UrlbarUtils.RESULT_SOURCE.BOOKMARKS,
+ entry: "oneoff",
+ });
+ Assert.equal(
+ gURLBar.value,
+ SEARCH_STRING,
+ "The search term was duplicated to the new tab."
+ );
+ BrowserTestUtils.removeTab(gBrowser.selectedTab);
+ Assert.equal(
+ browser,
+ gBrowser.selectedBrowser,
+ "We're back in the original tab."
+ );
+ await UrlbarTestUtils.assertSearchMode(window, null);
+ await UrlbarTestUtils.promisePopupClose(window);
+ });
+});
+
+// Accel+Clicking a one-off with an empty search string should open search mode
+// in a new background tab.
+add_task(async function accel_click_empty() {
+ await searchAndOpenPopup("");
+ let oneOffs = oneOffSearchButtons.getSelectableButtons(true);
+
+ // We have to listen for the new tab using this brute force method.
+ // about:newtab is preloaded in the background. When about:newtab is opened,
+ // the cached version is shown. Since the page is already loaded,
+ // waitForNewTab does not detect it. It also doesn't fire the TabOpen event.
+ let tabCount = gBrowser.tabs.length;
+ let tabOpenPromise = TestUtils.waitForCondition(
+ () =>
+ gBrowser.tabs.length == tabCount + 1
+ ? gBrowser.tabs[gBrowser.tabs.length - 1]
+ : false,
+ "Waiting for background about:newtab to open."
+ );
+ EventUtils.synthesizeMouseAtCenter(oneOffs[0], { accelKey: true });
+ let newTab = await tabOpenPromise;
+ Assert.notEqual(
+ newTab.linkedBrowser,
+ gBrowser.selectedBrowser,
+ "The foreground tab hasn't changed."
+ );
+ await UrlbarTestUtils.assertSearchMode(window, null);
+ BrowserTestUtils.switchTab(gBrowser, newTab);
+ // Check the new background tab is already in search mode.
+ await UrlbarTestUtils.assertSearchMode(window, {
+ engineName: oneOffs[0].engine.name,
+ entry: "oneoff",
+ });
+ BrowserTestUtils.removeTab(newTab);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+// Accel+Clicking a remote one-off with a search string should execute a search
+// in a new background tab.
+add_task(async function accel_click_search_remote() {
+ await searchAndOpenPopup(SEARCH_STRING);
+ let oneOffs = oneOffSearchButtons.getSelectableButtons(true);
+ let tabOpenPromise = BrowserTestUtils.waitForNewTab(
+ gBrowser,
+ "http://mochi.test:8888/?terms=foo.bar",
+ true
+ );
+ EventUtils.synthesizeMouseAtCenter(oneOffs[0], { accelKey: true });
+ // This implictly checks the correct page is loaded.
+ let newTab = await tabOpenPromise;
+ Assert.notEqual(
+ gBrowser.selectedTab,
+ newTab,
+ "The foreground tab hasn't changed."
+ );
+ await UrlbarTestUtils.assertSearchMode(window, null);
+ // Switch to the background tab, which is the last tab in gBrowser.tabs.
+ BrowserTestUtils.switchTab(gBrowser, newTab);
+ // Check the new background tab is not search mode.
+ await UrlbarTestUtils.assertSearchMode(window, null);
+ BrowserTestUtils.removeTab(newTab);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+// Accel+Clicking a local one-off with a search string should open search mode
+// in a new background tab with the search string already populated.
+add_task(async function accel_click_search_local() {
+ await searchAndOpenPopup(SEARCH_STRING);
+ let oneOffs = oneOffSearchButtons.getSelectableButtons(true);
+ let oneOff;
+ for (oneOff of oneOffs) {
+ if (oneOff.id == "urlbar-engine-one-off-item-bookmarks") {
+ break;
+ }
+ }
+ let tabCount = gBrowser.tabs.length;
+ let tabOpenPromise = TestUtils.waitForCondition(
+ () =>
+ gBrowser.tabs.length == tabCount + 1
+ ? gBrowser.tabs[gBrowser.tabs.length - 1]
+ : false,
+ "Waiting for background about:newtab to open."
+ );
+ EventUtils.synthesizeMouseAtCenter(oneOff, { accelKey: true });
+ let newTab = await tabOpenPromise;
+ Assert.notEqual(
+ newTab.linkedBrowser,
+ gBrowser.selectedBrowser,
+ "The foreground tab hasn't changed."
+ );
+ await UrlbarTestUtils.assertSearchMode(window, null);
+ BrowserTestUtils.switchTab(gBrowser, newTab);
+ // Check the new background tab is already in search mode.
+ await UrlbarTestUtils.assertSearchMode(window, {
+ source: UrlbarUtils.RESULT_SOURCE.BOOKMARKS,
+ entry: "oneoff",
+ });
+ // Check the search string is already populated.
+ Assert.equal(
+ gURLBar.value,
+ SEARCH_STRING,
+ "The search term was duplicated to the new tab."
+ );
+ BrowserTestUtils.removeTab(newTab);
+ await UrlbarTestUtils.promisePopupClose(window);
+});