summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_shortcuts_add_search_engine.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_shortcuts_add_search_engine.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_shortcuts_add_search_engine.js243
1 files changed, 243 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_shortcuts_add_search_engine.js b/browser/components/urlbar/tests/browser/browser_shortcuts_add_search_engine.js
new file mode 100644
index 0000000000..1fef68de30
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_shortcuts_add_search_engine.js
@@ -0,0 +1,243 @@
+/* Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+// Test adding engines through search shortcut buttons.
+// A more complete coverage of the detection of engines is available in
+// browser_add_search_engine.js
+
+const { PromptTestUtils } = ChromeUtils.importESModule(
+ "resource://testing-common/PromptTestUtils.sys.mjs"
+);
+const BASE_URL =
+ "http://mochi.test:8888/browser/browser/components/urlbar/tests/browser/";
+
+add_setup(async function () {
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.urlbar.suggest.searches", false]],
+ });
+ // Ensure initial state.
+ UrlbarTestUtils.getOneOffSearchButtons(window).invalidateCache();
+});
+
+add_task(async function shortcuts_none() {
+ info("Checks the shortcuts with a page that doesn't offer any engines.");
+ let url = "http://mochi.test:8888/";
+ await BrowserTestUtils.withNewTab(url, async () => {
+ let shortcutButtons = UrlbarTestUtils.getOneOffSearchButtons(window);
+ let rebuildPromise = BrowserTestUtils.waitForEvent(
+ shortcutButtons,
+ "rebuild"
+ );
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "test",
+ });
+ await rebuildPromise;
+
+ Assert.ok(
+ !Array.from(shortcutButtons.buttons.children).some(b =>
+ b.classList.contains("searchbar-engine-one-off-add-engine")
+ ),
+ "Check there's no buttons to add engines"
+ );
+ });
+});
+
+add_task(async function test_shortcuts() {
+ await do_test_shortcuts(button => {
+ info("Click on button");
+ EventUtils.synthesizeMouseAtCenter(button, {});
+ });
+ await do_test_shortcuts(button => {
+ info("Enter on button");
+ let shortcuts = UrlbarTestUtils.getOneOffSearchButtons(window);
+ while (shortcuts.selectedButton != button) {
+ EventUtils.synthesizeKey("KEY_ArrowDown", { altKey: true });
+ }
+ EventUtils.synthesizeKey("KEY_Enter");
+ });
+});
+
+/**
+ * Test add engine shortcuts.
+ *
+ * @param {Function} activateTask a function receiveing the shortcut button to
+ * activate as argument. The scope of this function is to activate the
+ * shortcut button.
+ */
+async function do_test_shortcuts(activateTask) {
+ info("Checks the shortcuts with a page that offers two engines.");
+ let url = getRootDirectory(gTestPath) + "add_search_engine_two.html";
+ await BrowserTestUtils.withNewTab(url, async () => {
+ let shortcutButtons = UrlbarTestUtils.getOneOffSearchButtons(window);
+ let rebuildPromise = BrowserTestUtils.waitForEvent(
+ shortcutButtons,
+ "rebuild"
+ );
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "test",
+ });
+ await rebuildPromise;
+
+ let addEngineButtons = Array.from(shortcutButtons.buttons.children).filter(
+ b => b.classList.contains("searchbar-engine-one-off-add-engine")
+ );
+ Assert.equal(
+ addEngineButtons.length,
+ 2,
+ "Check there's two buttons to add engines"
+ );
+
+ for (let button of addEngineButtons) {
+ Assert.ok(BrowserTestUtils.is_visible(button));
+ Assert.ok(button.hasAttribute("image"));
+ await document.l10n.translateElements([button]);
+ Assert.ok(
+ button.getAttribute("tooltiptext").includes("add_search_engine_")
+ );
+ Assert.ok(
+ button.getAttribute("engine-name").startsWith("add_search_engine_")
+ );
+ Assert.ok(
+ button.classList.contains("searchbar-engine-one-off-add-engine")
+ );
+ }
+
+ info("Activate the first button");
+ rebuildPromise = BrowserTestUtils.waitForEvent(shortcutButtons, "rebuild");
+ let enginePromise = promiseEngine("engine-added", "add_search_engine_0");
+ await activateTask(addEngineButtons[0]);
+ info("await engine install");
+ let engine = await enginePromise;
+ info("await rebuild");
+ await rebuildPromise;
+
+ Assert.ok(
+ UrlbarTestUtils.isPopupOpen(window),
+ "Urlbar view is still open."
+ );
+
+ addEngineButtons = Array.from(shortcutButtons.buttons.children).filter(b =>
+ b.classList.contains("searchbar-engine-one-off-add-engine")
+ );
+ Assert.equal(
+ addEngineButtons.length,
+ 1,
+ "Check there's one button to add engines"
+ );
+ Assert.equal(
+ addEngineButtons[0].getAttribute("engine-name"),
+ "add_search_engine_1"
+ );
+ let installedEngineButton = addEngineButtons[0].previousElementSibling;
+ Assert.equal(installedEngineButton.engine.name, "add_search_engine_0");
+
+ info("Remove the added engine");
+ rebuildPromise = BrowserTestUtils.waitForEvent(shortcutButtons, "rebuild");
+ await Services.search.removeEngine(engine);
+ await rebuildPromise;
+ Assert.equal(
+ Array.from(shortcutButtons.buttons.children).filter(b =>
+ b.classList.contains("searchbar-engine-one-off-add-engine")
+ ).length,
+ 2,
+ "Check there's two buttons to add engines"
+ );
+ await UrlbarTestUtils.promisePopupClose(window);
+
+ info("Switch to a new tab and check the buttons are not persisted");
+ await BrowserTestUtils.withNewTab("about:robots", async () => {
+ rebuildPromise = BrowserTestUtils.waitForEvent(
+ shortcutButtons,
+ "rebuild"
+ );
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "test",
+ });
+ await rebuildPromise;
+ Assert.ok(
+ !Array.from(shortcutButtons.buttons.children).some(b =>
+ b.classList.contains("searchbar-engine-one-off-add-engine")
+ ),
+ "Check there's no option to add engines"
+ );
+ });
+ });
+}
+
+add_task(async function shortcuts_many() {
+ info("Checks the shortcuts with a page that offers many engines.");
+ let url = getRootDirectory(gTestPath) + "add_search_engine_many.html";
+ await BrowserTestUtils.withNewTab(url, async () => {
+ let shortcutButtons = UrlbarTestUtils.getOneOffSearchButtons(window);
+ let rebuildPromise = BrowserTestUtils.waitForEvent(
+ shortcutButtons,
+ "rebuild"
+ );
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "test",
+ });
+ await rebuildPromise;
+
+ let addEngineButtons = Array.from(shortcutButtons.buttons.children).filter(
+ b => b.classList.contains("searchbar-engine-one-off-add-engine")
+ );
+ Assert.equal(
+ addEngineButtons.length,
+ gURLBar.addSearchEngineHelper.maxInlineEngines,
+ "Check there's a maximum of `maxInlineEngines` buttons to add engines"
+ );
+ });
+});
+
+function promiseEngine(expectedData, expectedEngineName) {
+ info(`Waiting for engine ${expectedData}`);
+ return TestUtils.topicObserved(
+ "browser-search-engine-modified",
+ (engine, data) => {
+ info(`Got engine ${engine.wrappedJSObject.name} ${data}`);
+ return (
+ expectedData == data &&
+ expectedEngineName == engine.wrappedJSObject.name
+ );
+ }
+ ).then(([engine, data]) => engine);
+}
+
+add_task(async function shortcuts_without_other_engines() {
+ info("Checks the shortcuts without other engines.");
+
+ info("Remove search engines except default");
+ const defaultEngine = Services.search.defaultEngine;
+ const engines = await Services.search.getVisibleEngines();
+ for (const engine of engines) {
+ if (defaultEngine.name !== engine.name) {
+ await Services.search.removeEngine(engine);
+ }
+ }
+
+ info("Remove local engines");
+ for (const { pref } of UrlbarUtils.LOCAL_SEARCH_MODES) {
+ await SpecialPowers.pushPrefEnv({
+ set: [[`browser.urlbar.${pref}`, false]],
+ });
+ }
+
+ const url = getRootDirectory(gTestPath) + "add_search_engine_many.html";
+ await BrowserTestUtils.withNewTab(url, async () => {
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window,
+ value: "test",
+ });
+
+ const shortcutButtons = UrlbarTestUtils.getOneOffSearchButtons(window);
+ Assert.ok(shortcutButtons.container.hidden, "It should be hidden");
+ });
+
+ Services.search.restoreDefaultEngines();
+});