summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_top_sites.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_top_sites.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_top_sites.js481
1 files changed, 481 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_top_sites.js b/browser/components/urlbar/tests/browser/browser_top_sites.js
new file mode 100644
index 0000000000..cb6502d2b2
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_top_sites.js
@@ -0,0 +1,481 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+ChromeUtils.defineESModuleGetters(this, {
+ NewTabUtils: "resource://gre/modules/NewTabUtils.sys.mjs",
+});
+
+XPCOMUtils.defineLazyModuleGetters(this, {
+ AboutNewTab: "resource:///modules/AboutNewTab.jsm",
+});
+
+const EN_US_TOPSITES =
+ "https://www.youtube.com/,https://www.facebook.com/,https://www.amazon.com/,https://www.reddit.com/,https://www.wikipedia.org/,https://twitter.com/";
+
+async function addTestVisits() {
+ // Add some visits to a URL.
+ for (let i = 0; i < 5; i++) {
+ await PlacesTestUtils.addVisits("http://example.com/");
+ }
+
+ // Wait for example.com to be listed first.
+ await updateTopSites(sites => {
+ return sites && sites[0] && sites[0].url == "http://example.com/";
+ });
+
+ await PlacesUtils.bookmarks.insert({
+ parentGuid: PlacesUtils.bookmarks.unfiledGuid,
+ url: "https://www.youtube.com/",
+ title: "YouTube",
+ });
+}
+
+async function checkDoesNotOpenOnFocus(win = window) {
+ // The view should not open when the input is focused programmatically.
+ win.gURLBar.blur();
+ win.gURLBar.focus();
+ Assert.ok(!win.gURLBar.view.isOpen, "check urlbar panel is not open");
+ win.gURLBar.blur();
+
+ // Check the keyboard shortcut.
+ win.document.getElementById("Browser:OpenLocation").doCommand();
+ // Because the panel opening may not be immediate, we must wait a bit.
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, 500));
+ Assert.ok(!win.gURLBar.view.isOpen, "check urlbar panel is not open");
+ win.gURLBar.blur();
+
+ // Focus with the mouse.
+ EventUtils.synthesizeMouseAtCenter(win.gURLBar.inputField, {}, win);
+ // Because the panel opening may not be immediate, we must wait a bit.
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, 500));
+ Assert.ok(!win.gURLBar.view.isOpen, "check urlbar panel is not open");
+ win.gURLBar.blur();
+}
+
+add_setup(async function () {
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.urlbar.suggest.topsites", true],
+ ["browser.urlbar.suggest.quickactions", false],
+ ["browser.newtabpage.activity-stream.default.sites", EN_US_TOPSITES],
+ ],
+ });
+
+ await updateTopSites(
+ sites => sites && sites.length == EN_US_TOPSITES.split(",").length
+ );
+
+ let tab = await BrowserTestUtils.openNewForegroundTab(
+ gBrowser,
+ "http://example.com/"
+ );
+
+ registerCleanupFunction(() => {
+ BrowserTestUtils.removeTab(tab);
+ });
+});
+
+add_task(async function topSitesShown() {
+ let sites = AboutNewTab.getTopSites();
+
+ for (let prefVal of [true, false]) {
+ // This test should work regardless of whether Top Sites are enabled on
+ // about:newtab.
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.newtabpage.activity-stream.feeds.topsites", prefVal]],
+ });
+ // We don't expect this to change, but we run updateTopSites just in case
+ // feeds.topsites were to have an effect on the composition of Top Sites.
+ await updateTopSites(siteList => siteList.length == 6);
+
+ await UrlbarTestUtils.promisePopupOpen(window, () => {
+ if (gURLBar.getAttribute("pageproxystate") == "invalid") {
+ gURLBar.handleRevert();
+ }
+ EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, {});
+ });
+ Assert.ok(gURLBar.view.isOpen, "UrlbarView should be open.");
+ await UrlbarTestUtils.promiseSearchComplete(window);
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(window),
+ sites.length,
+ "The number of results should be the same as the number of Top Sites (6)."
+ );
+
+ for (let i = 0; i < sites.length; i++) {
+ let site = sites[i];
+ let result = await UrlbarTestUtils.getDetailsOfResultAt(window, i);
+ if (site.searchTopSite) {
+ Assert.equal(
+ result.searchParams.keyword,
+ site.label,
+ "The search Top Site should have an alias."
+ );
+ continue;
+ }
+
+ Assert.equal(
+ site.url,
+ result.url,
+ "The Top Site URL and the result URL shoud match."
+ );
+ Assert.equal(
+ site.label || site.title || site.hostname,
+ result.title,
+ "The Top Site title and the result title shoud match."
+ );
+ }
+ await UrlbarTestUtils.promisePopupClose(window, () => {
+ gURLBar.blur();
+ });
+ // This pops updateTopSites changes.
+ await SpecialPowers.popPrefEnv();
+ await SpecialPowers.popPrefEnv();
+ }
+});
+
+add_task(async function selectSearchTopSite() {
+ await updateTopSites(
+ sites => sites && sites[0] && sites[0].searchTopSite,
+ true
+ );
+ await UrlbarTestUtils.promisePopupOpen(window, () => {
+ if (gURLBar.getAttribute("pageproxystate") == "invalid") {
+ gURLBar.handleRevert();
+ }
+ EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, {});
+ });
+ await UrlbarTestUtils.promiseSearchComplete(window);
+
+ let amazonSearch = await UrlbarTestUtils.waitForAutocompleteResultAt(
+ window,
+ 0
+ );
+
+ Assert.equal(
+ amazonSearch.result.type,
+ UrlbarUtils.RESULT_TYPE.SEARCH,
+ "First result should have SEARCH type."
+ );
+
+ Assert.equal(
+ amazonSearch.result.payload.keyword,
+ "@amazon",
+ "First result should have the Amazon keyword."
+ );
+
+ let searchPromise = UrlbarTestUtils.promiseSearchComplete(window);
+ EventUtils.synthesizeMouseAtCenter(amazonSearch, {});
+ await searchPromise;
+ await UrlbarTestUtils.assertSearchMode(window, {
+ engineName: amazonSearch.result.payload.engine,
+ entry: "topsites_urlbar",
+ });
+ await UrlbarTestUtils.exitSearchMode(window, { backspace: true });
+
+ await UrlbarTestUtils.promisePopupClose(window, () => {
+ gURLBar.blur();
+ });
+});
+
+add_task(async function topSitesBookmarksAndTabs() {
+ await addTestVisits();
+ let sites = AboutNewTab.getTopSites();
+ Assert.equal(
+ sites.length,
+ 7,
+ "The test suite browser should have 7 Top Sites."
+ );
+
+ await UrlbarTestUtils.promisePopupOpen(window, () => {
+ if (gURLBar.getAttribute("pageproxystate") == "invalid") {
+ gURLBar.handleRevert();
+ }
+ EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, {});
+ });
+ Assert.ok(gURLBar.view.isOpen, "UrlbarView should be open.");
+ await UrlbarTestUtils.promiseSearchComplete(window);
+
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(window),
+ 7,
+ "The number of results should be the same as the number of Top Sites (7)."
+ );
+
+ let exampleResult = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
+ Assert.equal(
+ exampleResult.url,
+ "http://example.com/",
+ "The example.com Top Site should be the first result."
+ );
+ Assert.equal(
+ exampleResult.source,
+ UrlbarUtils.RESULT_SOURCE.TABS,
+ "The example.com Top Site should appear in the view as an open tab result."
+ );
+
+ let youtubeResult = await UrlbarTestUtils.getDetailsOfResultAt(window, 1);
+ Assert.equal(
+ youtubeResult.url,
+ "https://www.youtube.com/",
+ "The YouTube Top Site should be the second result."
+ );
+ Assert.equal(
+ youtubeResult.source,
+ UrlbarUtils.RESULT_SOURCE.BOOKMARKS,
+ "The YouTube Top Site should appear in the view as a bookmark result."
+ );
+ await UrlbarTestUtils.promisePopupClose(window, () => {
+ gURLBar.blur();
+ });
+
+ await PlacesUtils.bookmarks.eraseEverything();
+ await PlacesUtils.history.clear();
+});
+
+add_task(async function topSitesKeywordNavigationPageproxystate() {
+ await addTestVisits();
+ Assert.equal(
+ gURLBar.getAttribute("pageproxystate"),
+ "valid",
+ "Sanity check initial state"
+ );
+
+ await UrlbarTestUtils.promisePopupOpen(window, () => {
+ if (gURLBar.getAttribute("pageproxystate") == "invalid") {
+ gURLBar.handleRevert();
+ }
+ EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, {});
+ });
+ Assert.ok(gURLBar.view.isOpen, "UrlbarView should be open.");
+ await UrlbarTestUtils.promiseSearchComplete(window);
+
+ let count = UrlbarTestUtils.getResultCount(window);
+ Assert.equal(count, 7, "The number of results should be the expected one.");
+
+ for (let i = 0; i < count; ++i) {
+ EventUtils.synthesizeKey("KEY_ArrowDown");
+ Assert.equal(
+ gURLBar.getAttribute("pageproxystate"),
+ "invalid",
+ "Moving through results"
+ );
+ }
+ for (let i = 0; i < count; ++i) {
+ EventUtils.synthesizeKey("KEY_ArrowUp");
+ Assert.equal(
+ gURLBar.getAttribute("pageproxystate"),
+ "invalid",
+ "Moving through results"
+ );
+ }
+
+ // Double ESC should restore state.
+ await UrlbarTestUtils.promisePopupClose(window, () => {
+ EventUtils.synthesizeKey("KEY_Escape");
+ });
+ EventUtils.synthesizeKey("KEY_Escape");
+ Assert.equal(
+ gURLBar.getAttribute("pageproxystate"),
+ "valid",
+ "Double ESC should restore state"
+ );
+ await PlacesUtils.bookmarks.eraseEverything();
+ await PlacesUtils.history.clear();
+});
+
+add_task(async function topSitesPinned() {
+ await addTestVisits();
+ let info = { url: "http://example.com/" };
+ NewTabUtils.pinnedLinks.pin(info, 0);
+
+ await updateTopSites(sites => sites && sites[0] && sites[0].isPinned);
+
+ let sites = AboutNewTab.getTopSites();
+ Assert.equal(
+ sites.length,
+ 7,
+ "The test suite browser should have 7 Top Sites."
+ );
+
+ await UrlbarTestUtils.promisePopupOpen(window, () => {
+ EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, {});
+ });
+ Assert.ok(gURLBar.view.isOpen, "UrlbarView should be open.");
+ await UrlbarTestUtils.promiseSearchComplete(window);
+
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(window),
+ 7,
+ "The number of results should be the same as the number of Top Sites (7)."
+ );
+
+ let exampleResult = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
+ Assert.equal(
+ exampleResult.url,
+ "http://example.com/",
+ "The example.com Top Site should be the first result."
+ );
+
+ Assert.equal(
+ exampleResult.source,
+ UrlbarUtils.RESULT_SOURCE.TABS,
+ "The example.com Top Site should be an open tab result."
+ );
+
+ Assert.ok(
+ exampleResult.element.row.hasAttribute("pinned"),
+ "The example.com Top Site should have the pinned property."
+ );
+
+ await UrlbarTestUtils.promisePopupClose(window, () => {
+ gURLBar.blur();
+ });
+ NewTabUtils.pinnedLinks.unpin(info);
+
+ await PlacesUtils.bookmarks.eraseEverything();
+ await PlacesUtils.history.clear();
+});
+
+add_task(async function topSitesBookmarksAndTabsDisabled() {
+ await addTestVisits();
+ await SpecialPowers.pushPrefEnv({
+ set: [
+ ["browser.urlbar.suggest.openpage", false],
+ ["browser.urlbar.suggest.bookmark", false],
+ ],
+ });
+
+ let sites = AboutNewTab.getTopSites();
+ Assert.equal(
+ sites.length,
+ 7,
+ "The test suite browser should have 7 Top Sites."
+ );
+
+ await UrlbarTestUtils.promisePopupOpen(window, () => {
+ if (gURLBar.getAttribute("pageproxystate") == "invalid") {
+ gURLBar.handleRevert();
+ }
+ EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, {});
+ });
+ Assert.ok(gURLBar.view.isOpen, "UrlbarView should be open.");
+ await UrlbarTestUtils.promiseSearchComplete(window);
+
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(window),
+ 7,
+ "The number of results should be the same as the number of Top Sites (7)."
+ );
+
+ let exampleResult = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
+ Assert.equal(
+ exampleResult.url,
+ "http://example.com/",
+ "The example.com Top Site should be the second result."
+ );
+ Assert.equal(
+ exampleResult.source,
+ UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
+ "The example.com Top Site should appear as a normal result even though it's open in a tab."
+ );
+
+ let youtubeResult = await UrlbarTestUtils.getDetailsOfResultAt(window, 1);
+ Assert.equal(
+ youtubeResult.url,
+ "https://www.youtube.com/",
+ "The YouTube Top Site should be the third result."
+ );
+ Assert.equal(
+ youtubeResult.source,
+ UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL,
+ "The YouTube Top Site should appear as a normal result even though it's bookmarked."
+ );
+ await UrlbarTestUtils.promisePopupClose(window, () => {
+ gURLBar.blur();
+ });
+
+ await PlacesUtils.bookmarks.eraseEverything();
+ await PlacesUtils.history.clear();
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function topSitesDisabled() {
+ // Disable Top Sites feed.
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.newtabpage.activity-stream.feeds.system.topsites", false]],
+ });
+ await checkDoesNotOpenOnFocus();
+ await SpecialPowers.popPrefEnv();
+
+ // Top Sites should also not be shown when Urlbar Top Sites are disabled.
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.urlbar.suggest.topsites", false]],
+ });
+ await checkDoesNotOpenOnFocus();
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function topSitesNumber() {
+ // Add some visits
+ for (let i = 0; i < 5; i++) {
+ await PlacesTestUtils.addVisits([
+ "http://example-a.com/",
+ "http://example-b.com/",
+ "http://example-c.com/",
+ "http://example-d.com/",
+ "http://example-e.com/",
+ ]);
+ }
+
+ // Wait for the expected number of Top sites.
+ await updateTopSites(sites => sites && sites.length == 8);
+ Assert.equal(
+ AboutNewTab.getTopSites().length,
+ 8,
+ "The test suite browser should have 8 Top Sites."
+ );
+
+ await UrlbarTestUtils.promisePopupOpen(window, () => {
+ EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, {});
+ });
+ Assert.ok(gURLBar.view.isOpen, "UrlbarView should be open.");
+ await UrlbarTestUtils.promiseSearchComplete(window);
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(window),
+ 8,
+ "The number of results should be the default (8)."
+ );
+ await UrlbarTestUtils.promisePopupClose(window);
+
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.newtabpage.activity-stream.topSitesRows", 2]],
+ });
+ // Wait for the expected number of Top sites.
+ await updateTopSites(sites => sites && sites.length == 11);
+ Assert.equal(
+ AboutNewTab.getTopSites().length,
+ 11,
+ "The test suite browser should have 11 Top Sites."
+ );
+
+ await UrlbarTestUtils.promisePopupOpen(window, () => {
+ EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, {});
+ });
+ Assert.ok(gURLBar.view.isOpen, "UrlbarView should be open.");
+ await UrlbarTestUtils.promiseSearchComplete(window);
+
+ Assert.equal(
+ UrlbarTestUtils.getResultCount(window),
+ 10,
+ "The number of results should be maxRichResults (10)."
+ );
+ await UrlbarTestUtils.promisePopupClose(window);
+
+ await SpecialPowers.popPrefEnv();
+ await PlacesUtils.history.clear();
+});