Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
/**
* Tests that one-offs behave differently with key modifiers.
*/
"use strict";
const TEST_ENGINE_BASENAME = "searchSuggestionEngine.xml";
const SEARCH_STRING = "foo.bar";
ChromeUtils.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(
);
}
// 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(
);
}
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,
);
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,
);
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,
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,
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);
});