summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_searchFunction.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_searchFunction.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_searchFunction.js278
1 files changed, 278 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_searchFunction.js b/browser/components/urlbar/tests/browser/browser_searchFunction.js
new file mode 100644
index 0000000000..0a272f9f01
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_searchFunction.js
@@ -0,0 +1,278 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+// This test checks the urlbar.search() function.
+
+"use strict";
+
+const ALIAS = "@enginealias";
+let aliasEngine;
+
+add_setup(async function () {
+ // Run this in a new tab, to ensure all the locationchange notifications have
+ // fired.
+ let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
+
+ await SearchTestUtils.installSearchExtension({
+ keyword: ALIAS,
+ });
+ aliasEngine = Services.search.getEngineByName("Example");
+
+ registerCleanupFunction(async function () {
+ BrowserTestUtils.removeTab(tab);
+ gURLBar.handleRevert();
+ });
+});
+
+// Calls search() with a normal, non-"@engine" search-string argument.
+add_task(async function basic() {
+ gURLBar.blur();
+ gURLBar.search("basic");
+ ok(gURLBar.hasAttribute("focused"), "url bar is focused");
+ await assertUrlbarValue("basic");
+
+ assertOneOffButtonsVisible(true);
+
+ await UrlbarTestUtils.promisePopupClose(window, () =>
+ EventUtils.synthesizeKey("KEY_Escape")
+ );
+});
+
+// Calls search() with an invalid "@engine" search engine alias so that the
+// one-off search buttons are disabled.
+add_task(async function searchEngineAlias() {
+ gURLBar.blur();
+ await UrlbarTestUtils.promisePopupOpen(window, () =>
+ gURLBar.search("@example")
+ );
+ ok(gURLBar.hasAttribute("focused"), "url bar is focused");
+ UrlbarTestUtils.assertSearchMode(window, null);
+ await assertUrlbarValue("@example");
+
+ assertOneOffButtonsVisible(false);
+
+ await UrlbarTestUtils.promisePopupClose(window, () =>
+ EventUtils.synthesizeKey("KEY_Escape")
+ );
+
+ // Open the popup again (by doing another search) to make sure the one-off
+ // buttons are shown -- i.e., that we didn't accidentally break them.
+ await UrlbarTestUtils.promisePopupOpen(window, () =>
+ gURLBar.search("not an engine alias")
+ );
+ await assertUrlbarValue("not an engine alias");
+ assertOneOffButtonsVisible(true);
+
+ await UrlbarTestUtils.promisePopupClose(window, () =>
+ EventUtils.synthesizeKey("KEY_Escape")
+ );
+});
+
+add_task(async function searchRestriction() {
+ gURLBar.blur();
+ await UrlbarTestUtils.promisePopupOpen(window, () =>
+ gURLBar.search(UrlbarTokenizer.RESTRICT.SEARCH)
+ );
+ ok(gURLBar.hasAttribute("focused"), "url bar is focused");
+ await UrlbarTestUtils.assertSearchMode(window, {
+ engineName: UrlbarSearchUtils.getDefaultEngine().name,
+ source: UrlbarUtils.RESULT_SOURCE.SEARCH,
+ // Entry is "other" because we didn't pass searchModeEntry to search().
+ entry: "other",
+ });
+ assertOneOffButtonsVisible(true);
+ await UrlbarTestUtils.exitSearchMode(window);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+add_task(async function historyRestriction() {
+ gURLBar.blur();
+ await UrlbarTestUtils.promisePopupOpen(window, () =>
+ gURLBar.search(UrlbarTokenizer.RESTRICT.HISTORY)
+ );
+ ok(gURLBar.hasAttribute("focused"), "url bar is focused");
+ await UrlbarTestUtils.assertSearchMode(window, {
+ source: UrlbarUtils.RESULT_SOURCE.HISTORY,
+ entry: "other",
+ });
+ assertOneOffButtonsVisible(true);
+ Assert.ok(!gURLBar.value, "The Urlbar has no value.");
+ await UrlbarTestUtils.exitSearchMode(window);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+add_task(async function historyRestrictionWithString() {
+ gURLBar.blur();
+ // The leading and trailing spaces are intentional to verify that search()
+ // preserves them.
+ let searchString = " foo bar ";
+ await UrlbarTestUtils.promisePopupOpen(window, () =>
+ gURLBar.search(`${UrlbarTokenizer.RESTRICT.HISTORY} ${searchString}`)
+ );
+ ok(gURLBar.hasAttribute("focused"), "url bar is focused");
+ await UrlbarTestUtils.assertSearchMode(window, {
+ source: UrlbarUtils.RESULT_SOURCE.HISTORY,
+ entry: "other",
+ });
+ // We don't use assertUrlbarValue here since we expect to open a local search
+ // mode. In those modes, we don't show a heuristic search result, which
+ // assertUrlbarValue checks for.
+ await UrlbarTestUtils.promiseSearchComplete(window);
+ Assert.equal(
+ gURLBar.value,
+ searchString,
+ "The Urlbar value should be the search string."
+ );
+ assertOneOffButtonsVisible(true);
+ await UrlbarTestUtils.exitSearchMode(window);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+add_task(async function tagRestriction() {
+ gURLBar.blur();
+ await UrlbarTestUtils.promisePopupOpen(window, () =>
+ gURLBar.search(UrlbarTokenizer.RESTRICT.TAG)
+ );
+ ok(gURLBar.hasAttribute("focused"), "url bar is focused");
+ // Since tags are not a supported search mode, we should just insert the tag
+ // restriction token and not enter search mode.
+ await UrlbarTestUtils.assertSearchMode(window, null);
+ await assertUrlbarValue(`${UrlbarTokenizer.RESTRICT.TAG} `);
+ assertOneOffButtonsVisible(true);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+// Calls search() twice with the same value. The popup should reopen.
+add_task(async function searchTwice() {
+ gURLBar.blur();
+ await UrlbarTestUtils.promisePopupOpen(window, () => gURLBar.search("test"));
+ ok(gURLBar.hasAttribute("focused"), "url bar is focused");
+ await assertUrlbarValue("test");
+ assertOneOffButtonsVisible(true);
+ await UrlbarTestUtils.promisePopupClose(window);
+
+ await UrlbarTestUtils.promisePopupOpen(window, () => gURLBar.search("test"));
+ ok(gURLBar.hasAttribute("focused"), "url bar is focused");
+ await assertUrlbarValue("test");
+ assertOneOffButtonsVisible(true);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+// Calls search() during an IME composition.
+add_task(async function searchIME() {
+ // First run a search.
+ gURLBar.blur();
+ await UrlbarTestUtils.promisePopupOpen(window, () => gURLBar.search("test"));
+ ok(gURLBar.hasAttribute("focused"), "url bar is focused");
+ await assertUrlbarValue("test");
+ // Start composition.
+ await UrlbarTestUtils.promisePopupClose(window, () =>
+ EventUtils.synthesizeComposition({ type: "compositionstart" })
+ );
+
+ gURLBar.search("test");
+ // Unfortunately there's no other way to check we don't open the view than to
+ // wait for it.
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, 1000));
+ ok(!UrlbarTestUtils.isPopupOpen(window), "The panel should still be closed");
+
+ await UrlbarTestUtils.promisePopupOpen(window, () =>
+ EventUtils.synthesizeComposition({ type: "compositioncommitasis" })
+ );
+
+ assertOneOffButtonsVisible(true);
+
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+// Calls search() with an engine alias.
+add_task(async function searchWithAlias() {
+ await UrlbarTestUtils.promisePopupOpen(window, async () =>
+ gURLBar.search(`${ALIAS} test`, {
+ searchEngine: aliasEngine,
+ searchModeEntry: "topsites_urlbar",
+ })
+ );
+ Assert.ok(gURLBar.hasAttribute("focused"), "Urlbar is focused");
+
+ await UrlbarTestUtils.assertSearchMode(window, {
+ engineName: aliasEngine.name,
+ entry: "topsites_urlbar",
+ });
+ await assertUrlbarValue("test");
+ assertOneOffButtonsVisible(true);
+ await UrlbarTestUtils.exitSearchMode(window);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+// Calls search() and passes in a search engine without including a restriction
+// token or engine alias in the search string. Simulates pasting into the newtab
+// handoff field with search suggestions disabled.
+add_task(async function searchEngineWithNoToken() {
+ await UrlbarTestUtils.promisePopupOpen(window, async () =>
+ gURLBar.search("no-alias", {
+ searchEngine: aliasEngine,
+ searchModeEntry: "handoff",
+ })
+ );
+
+ Assert.ok(gURLBar.hasAttribute("focused"), "Urlbar is focused");
+
+ await UrlbarTestUtils.assertSearchMode(window, {
+ engineName: aliasEngine.name,
+ entry: "handoff",
+ });
+ await assertUrlbarValue("no-alias");
+ await UrlbarTestUtils.exitSearchMode(window);
+ await UrlbarTestUtils.promisePopupClose(window);
+});
+
+/**
+ * Asserts that the one-off search buttons are or aren't visible.
+ *
+ * @param {boolean} visible
+ * True if they should be visible, false if not.
+ */
+function assertOneOffButtonsVisible(visible) {
+ Assert.equal(
+ UrlbarTestUtils.getOneOffSearchButtonsVisible(window),
+ visible,
+ "Should show or not the one-off search buttons"
+ );
+}
+
+/**
+ * Asserts that the urlbar's input value is the given value. Also asserts that
+ * the first (heuristic) result in the popup is a search suggestion whose search
+ * query is the given value.
+ *
+ * @param {string} value
+ * The urlbar's expected value.
+ */
+async function assertUrlbarValue(value) {
+ await UrlbarTestUtils.waitForAutocompleteResultAt(window, 0);
+
+ Assert.equal(gURLBar.value, value);
+ Assert.greater(
+ UrlbarTestUtils.getResultCount(window),
+ 0,
+ "Should have at least one result"
+ );
+
+ let result = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
+ Assert.equal(
+ result.type,
+ UrlbarUtils.RESULT_TYPE.SEARCH,
+ "Should have type search for the first result"
+ );
+ // Strip search restriction token from value.
+ if (value[0] == UrlbarTokenizer.RESTRICT.SEARCH) {
+ value = value.substring(1).trim();
+ }
+ Assert.equal(
+ result.searchParams.query,
+ value,
+ "Should have the correct query for the first result"
+ );
+}