summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_searchMode_no_results.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_searchMode_no_results.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_searchMode_no_results.js290
1 files changed, 290 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_searchMode_no_results.js b/browser/components/urlbar/tests/browser/browser_searchMode_no_results.js
new file mode 100644
index 0000000000..9ecc5573fc
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_searchMode_no_results.js
@@ -0,0 +1,290 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Tests entering search mode and there are no results in the view.
+ */
+
+"use strict";
+
+const TEST_ENGINE_BASENAME = "searchSuggestionEngine.xml";
+
+add_setup(async function () {
+ // In order to open the view without any results, we need to be in search mode
+ // with an empty search string so that no heuristic result is shown, and the
+ // empty search must yield zero additional results. We'll enter search mode
+ // using the bookmarks one-off, and first we'll delete all bookmarks so that
+ // there are no results.
+ await PlacesUtils.bookmarks.eraseEverything();
+
+ // Also clear history so that using the alias of our test engine doesn't
+ // inadvertently return any history results due to bug 1658646.
+ await PlacesUtils.history.clear();
+
+ // Add a top site so we're guaranteed the view has at least one result to
+ // show initially with an empty search. Otherwise the view won't even open.
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ [
+ "browser.newtabpage.activity-stream.default.sites",
+ "http://example.com/",
+ ],
+ ],
+ });
+ await updateTopSites(sites => sites.length);
+});
+
+// Basic test for entering search mode with no results.
+add_task(async function basic() {
+ await withNewWindow(async win => {
+ // Do an empty search.
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window: win,
+ value: "",
+ });
+
+ // Initially there should be at least the top site we added above.
+ Assert.greater(
+ UrlbarTestUtils.getResultCount(win),
+ 0,
+ "Top sites should be present initially"
+ );
+ Assert.ok(
+ !win.gURLBar.panel.hasAttribute("noresults"),
+ "Panel has results, therefore should not have noresults attribute"
+ );
+
+ // Enter search mode by clicking the bookmarks one-off.
+ await UrlbarTestUtils.enterSearchMode(win, {
+ source: UrlbarUtils.RESULT_SOURCE.BOOKMARKS,
+ });
+
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(win),
+ 0,
+ "Zero results since no bookmarks exist"
+ );
+ Assert.equal(
+ win.gURLBar.panel.getAttribute("noresults"),
+ "true",
+ "Panel has no results, therefore should have noresults attribute"
+ );
+
+ // Exit search mode by backspacing. The top sites should be shown again.
+ await UrlbarTestUtils.exitSearchMode(win, { backspace: true });
+ Assert.greater(
+ UrlbarTestUtils.getResultCount(win),
+ 0,
+ "Top sites should be present again"
+ );
+ Assert.ok(
+ !win.gURLBar.panel.hasAttribute("noresults"),
+ "noresults attribute should be absent again"
+ );
+
+ await UrlbarTestUtils.promisePopupClose(win);
+ });
+});
+
+// When the urlbar is in search mode, has no results, and is not focused,
+// focusing it should auto-open the view.
+add_task(async function autoOpen() {
+ await withNewWindow(async win => {
+ // Do an empty search.
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window: win,
+ value: "",
+ });
+
+ // Initially there should be at least the top site we added above.
+ Assert.greater(
+ UrlbarTestUtils.getResultCount(win),
+ 0,
+ "Top sites should be present initially"
+ );
+ Assert.ok(
+ !win.gURLBar.panel.hasAttribute("noresults"),
+ "Panel has results, therefore should not have noresults attribute"
+ );
+
+ // Enter search mode by clicking the bookmarks one-off.
+ await UrlbarTestUtils.enterSearchMode(win, {
+ source: UrlbarUtils.RESULT_SOURCE.BOOKMARKS,
+ });
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(win),
+ 0,
+ "Zero results since no bookmarks exist"
+ );
+ Assert.equal(
+ win.gURLBar.panel.getAttribute("noresults"),
+ "true",
+ "Panel has no results, therefore should have noresults attribute"
+ );
+
+ // Blur the urlbar.
+ win.gURLBar.blur();
+ await UrlbarTestUtils.assertSearchMode(win, {
+ source: UrlbarUtils.RESULT_SOURCE.BOOKMARKS,
+ entry: "oneoff",
+ });
+
+ // Click the urlbar.
+ await UrlbarTestUtils.promisePopupOpen(win, () => {
+ EventUtils.synthesizeMouseAtCenter(win.gURLBar.inputField, {}, win);
+ });
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(win),
+ 0,
+ "Still zero results since no bookmarks exist"
+ );
+ Assert.equal(
+ win.gURLBar.panel.getAttribute("noresults"),
+ "true",
+ "Panel still has no results, therefore should have noresults attribute"
+ );
+
+ // Exit search mode by backspacing. The top sites should be shown again.
+ await UrlbarTestUtils.exitSearchMode(win, { backspace: true });
+ Assert.greater(
+ UrlbarTestUtils.getResultCount(win),
+ 0,
+ "Top sites should be present again"
+ );
+ Assert.ok(
+ !win.gURLBar.panel.hasAttribute("noresults"),
+ "noresults attribute should be absent again"
+ );
+
+ await UrlbarTestUtils.promisePopupClose(win);
+ });
+});
+
+// When the urlbar is in search mode, the user backspaces over the final char
+// (but remains in search mode), and there are no results, the view should
+// remain open.
+add_task(async function backspaceRemainOpen() {
+ await withNewWindow(async win => {
+ // Do a one-char search.
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window: win,
+ value: "x",
+ });
+ Assert.greater(
+ UrlbarTestUtils.getResultCount(win),
+ 0,
+ "At least the heuristic result should be shown"
+ );
+ Assert.ok(
+ !win.gURLBar.panel.hasAttribute("noresults"),
+ "Panel has results, therefore should not have noresults attribute"
+ );
+
+ // Enter search mode by clicking the bookmarks one-off.
+ await UrlbarTestUtils.enterSearchMode(win, {
+ source: UrlbarUtils.RESULT_SOURCE.BOOKMARKS,
+ });
+
+ // The heursitic should not be shown since we don't show it in local search
+ // modes.
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(win),
+ 0,
+ "No results should be present"
+ );
+ Assert.ok(
+ win.gURLBar.panel.hasAttribute("noresults"),
+ "Panel has no results, therefore should have noresults attribute"
+ );
+
+ // Backspace. The search string will now be empty.
+ let searchPromise = UrlbarTestUtils.promiseSearchComplete(win);
+ EventUtils.synthesizeKey("KEY_Backspace", {}, win);
+ await searchPromise;
+ Assert.ok(UrlbarTestUtils.isPopupOpen(win), "View remains open");
+ await UrlbarTestUtils.assertSearchMode(win, {
+ source: UrlbarUtils.RESULT_SOURCE.BOOKMARKS,
+ entry: "oneoff",
+ });
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(win),
+ 0,
+ "Zero results since no bookmarks exist"
+ );
+ Assert.equal(
+ win.gURLBar.panel.getAttribute("noresults"),
+ "true",
+ "Panel has no results, therefore should have noresults attribute"
+ );
+
+ // Exit search mode by backspacing. The top sites should be shown.
+ await UrlbarTestUtils.exitSearchMode(win, { backspace: true });
+ Assert.greater(
+ UrlbarTestUtils.getResultCount(win),
+ 0,
+ "Top sites should be present again"
+ );
+ Assert.ok(
+ !win.gURLBar.panel.hasAttribute("noresults"),
+ "noresults attribute should be absent again"
+ );
+
+ await UrlbarTestUtils.promisePopupClose(win);
+ });
+});
+
+// Types a search alias and then a space to enter search mode, with no results.
+// The one-offs should be shown.
+add_task(async function spaceToEnterSearchMode() {
+ let engine = await SearchTestUtils.promiseNewSearchEngine({
+ url: getRootDirectory(gTestPath) + TEST_ENGINE_BASENAME,
+ });
+ engine.alias = "@test";
+
+ await withNewWindow(async win => {
+ await UrlbarTestUtils.promiseAutocompleteResultPopup({
+ window: win,
+ value: engine.alias,
+ });
+
+ // We need to wait for two searches: The first enters search mode, the
+ // second does the search in search mode.
+ let searchPromise = UrlbarTestUtils.promiseSearchComplete(win);
+ EventUtils.synthesizeKey(" ", {}, win);
+ await searchPromise;
+
+ Assert.equal(UrlbarTestUtils.getResultCount(win), 0, "Zero results");
+ Assert.equal(
+ win.gURLBar.panel.getAttribute("noresults"),
+ "true",
+ "Panel has no results, therefore should have noresults attribute"
+ );
+ await UrlbarTestUtils.assertSearchMode(win, {
+ engineName: engine.name,
+ entry: "typed",
+ });
+ this.Assert.equal(
+ UrlbarTestUtils.getOneOffSearchButtonsVisible(window),
+ true,
+ "One-offs are visible"
+ );
+
+ await UrlbarTestUtils.exitSearchMode(win, { backspace: true });
+ await UrlbarTestUtils.promisePopupClose(win);
+ });
+});
+
+/**
+ * Opens a new window, waits for it to load, calls a callback, and closes the
+ * window. We use a new window in each task so that the view starts with a
+ * blank slate each time.
+ *
+ * @param {Function} callback
+ * Will be called as: callback(newWindow)
+ */
+async function withNewWindow(callback) {
+ // Start in a new window so we have a blank slate.
+ let win = await BrowserTestUtils.openNewBrowserWindow();
+ await callback(win);
+ await BrowserTestUtils.closeWindow(win);
+}