/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ // Tests the Search Tips feature, which displays a prompt to use the Urlbar on // the newtab page and on the user's default search engine's homepage. // Specifically, it tests that the Tips appear when they should be appearing. // This doesn't test the max-shown-count limit or the restriction on tips when // we show the default browser prompt because those require restarting the // browser. "use strict"; ChromeUtils.defineESModuleGetters(this, { AppMenuNotifications: "resource://gre/modules/AppMenuNotifications.sys.mjs", HttpServer: "resource://testing-common/httpd.sys.mjs", UrlbarPrefs: "resource:///modules/UrlbarPrefs.sys.mjs", UrlbarProviderSearchTips: "resource:///modules/UrlbarProviderSearchTips.sys.mjs", }); // These should match the same consts in UrlbarProviderSearchTips.sys.mjs. const MAX_SHOWN_COUNT = 4; const LAST_UPDATE_THRESHOLD_MS = 24 * 60 * 60 * 1000; // We test some of the bigger Google domains. const GOOGLE_DOMAINS = [ "www.google.com", "www.google.ca", "www.google.co.uk", "www.google.com.au", "www.google.co.nz", ]; add_setup(async function () { await PlacesUtils.history.clear(); await PlacesUtils.bookmarks.eraseEverything(); await SpecialPowers.pushPrefEnv({ set: [ [ `browser.urlbar.tipShownCount.${UrlbarProviderSearchTips.TIP_TYPE.ONBOARD}`, 0, ], [ `browser.urlbar.tipShownCount.${UrlbarProviderSearchTips.TIP_TYPE.REDIRECT}`, 0, ], // Set following prefs so tips are actually shown. ["browser.laterrun.bookkeeping.profileCreationTime", 0], ["browser.laterrun.bookkeeping.updateAppliedTime", 0], ["browser.urlbar.scotchBonnet.enableOverride", false], ], }); // Remove update history and the current active update so tips are shown. let updateRootDir = Services.dirsvc.get("UpdRootD", Ci.nsIFile); let updatesFile = updateRootDir.clone(); updatesFile.append("updates.xml"); let activeUpdateFile = updateRootDir.clone(); activeUpdateFile.append("active-update.xml"); try { updatesFile.remove(false); } catch (e) {} try { activeUpdateFile.remove(false); } catch (e) {} let defaultEngine = await Services.search.getDefault(); let defaultEngineName = defaultEngine.name; Assert.equal(defaultEngineName, "Google", "Default engine should be Google."); // Add a mock engine so we don't hit the network loading the SERP. await SearchTestUtils.installSearchExtension(); registerCleanupFunction(async () => { await setDefaultEngine(defaultEngineName); resetSearchTipsProvider(); }); }); // The onboarding tip should be shown on about:newtab. add_task(async function newtab() { await checkTab( window, "about:newtab", UrlbarProviderSearchTips.TIP_TYPE.ONBOARD ); }); // The onboarding tip should be shown on about:home. add_task(async function home() { await checkTab( window, "about:home", UrlbarProviderSearchTips.TIP_TYPE.ONBOARD ); }); // The redirect tip should be shown for www.google.com when it's the default // engine. add_task(async function google() { await setDefaultEngine("Google"); for (let domain of GOOGLE_DOMAINS) { await withDNSRedirect(domain, "/", async url => { await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.REDIRECT); }); } }); // The redirect tip should be shown for www.google.com/webhp when it's the // default engine. add_task(async function googleWebhp() { await setDefaultEngine("Google"); for (let domain of GOOGLE_DOMAINS) { await withDNSRedirect(domain, "/webhp", async url => { await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.REDIRECT); }); } }); // The redirect tip should be shown for the Google homepage when query strings // are appended. add_task(async function googleQueryString() { await setDefaultEngine("Google"); for (let domain of GOOGLE_DOMAINS) { await withDNSRedirect(domain, "/webhp", async url => { await checkTab( window, `${url}?hl=en`, UrlbarProviderSearchTips.TIP_TYPE.REDIRECT ); }); } }); // The redirect tip should not be shown on Google results pages. add_task(async function googleResults() { await setDefaultEngine("Google"); for (let domain of GOOGLE_DOMAINS) { await withDNSRedirect(domain, "/search", async url => { await checkTab( window, `${url}?q=firefox`, UrlbarProviderSearchTips.TIP_TYPE.NONE ); }); } }); // The redirect tip should not be shown for www.google.com when it's not the // default engine. add_task(async function googleNotDefault() { await setDefaultEngine("Bing"); for (let domain of GOOGLE_DOMAINS) { await withDNSRedirect(domain, "/", async url => { await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.NONE); }); } }); // The redirect tip should not be shown for www.google.com/webhp when it's not // the default engine. add_task(async function googleWebhpNotDefault() { await setDefaultEngine("Bing"); for (let domain of GOOGLE_DOMAINS) { await withDNSRedirect(domain, "/webhp", async url => { await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.NONE); }); } }); // The redirect tip should be shown for www.bing.com when it's the default // engine. add_task(async function bing() { await setDefaultEngine("Bing"); await withDNSRedirect("www.bing.com", "/", async url => { await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.REDIRECT); }); }); // The redirect tip should be shown on the Bing homepage even when Bing appends // query strings. add_task(async function bingQueryString() { await setDefaultEngine("Bing"); await withDNSRedirect("www.bing.com", "/", async url => { await checkTab( window, `${url}?toWww=1`, UrlbarProviderSearchTips.TIP_TYPE.REDIRECT ); }); }); // The redirect tip should not be shown on Bing results pages. add_task(async function bingResults() { await setDefaultEngine("Bing"); await withDNSRedirect("www.bing.com", "/search", async url => { await checkTab( window, `${url}?q=firefox`, UrlbarProviderSearchTips.TIP_TYPE.NONE ); }); }); // The redirect tip should not be shown for www.bing.com when it's not the // default engine. add_task(async function bingNotDefault() { await setDefaultEngine("Google"); await withDNSRedirect("www.bing.com", "/", async url => { await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.NONE); }); }); // The redirect tip should be shown for duckduckgo.com when it's the default // engine. add_task(async function ddg() { await setDefaultEngine("DuckDuckGo"); await withDNSRedirect("duckduckgo.com", "/", async url => { await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.REDIRECT); }); }); // The redirect tip should be shown for start.duckduckgo.com when it's the // default engine. add_task(async function ddgStart() { await setDefaultEngine("DuckDuckGo"); await withDNSRedirect("start.duckduckgo.com", "/", async url => { await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.REDIRECT); }); }); // The redirect tip should not be shown for duckduckgo.com when it's not the // default engine. add_task(async function ddgNotDefault() { await setDefaultEngine("Google"); await withDNSRedirect("duckduckgo.com", "/", async url => { await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.NONE); }); }); // The redirect tip should not be shown for start.duckduckgo.com when it's not // the default engine. add_task(async function ddgStartNotDefault() { await setDefaultEngine("Google"); await withDNSRedirect("start.duckduckgo.com", "/", async url => { await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.NONE); }); }); // The redirect tip should not be shown for duckduckgo.com/?q=foo, the search // results page, which happens to have the same domain and path as the home // page. add_task(async function ddgSearchResultsPage() { await setDefaultEngine("DuckDuckGo"); await withDNSRedirect("duckduckgo.com", "/", async url => { await checkTab( window, `${url}?q=test`, UrlbarProviderSearchTips.TIP_TYPE.NONE ); }); }); // The redirect tip should not be shown on a non-engine page. add_task(async function nonEnginePage() { await checkTab( window, "http://example.com/", UrlbarProviderSearchTips.TIP_TYPE.NONE ); }); // Tips should be shown at most once per session regardless of their type. add_task(async function oncePerSession() { await setDefaultEngine("Google"); await checkTab( window, "about:newtab", UrlbarProviderSearchTips.TIP_TYPE.ONBOARD, false ); await checkTab( window, "about:newtab", UrlbarProviderSearchTips.TIP_TYPE.NONE, false ); await withDNSRedirect("www.google.com", "/", async url => { await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.NONE); }); }); // The one-off search buttons should not be shown when // a search tip is shown even though the search string is empty. add_task(async function shortcut_buttons_with_tip() { await checkTab( window, "about:newtab", UrlbarProviderSearchTips.TIP_TYPE.ONBOARD ); }); function waitForBrowserWindowActive(win) { return new Promise(resolve => { if (Services.focus.activeWindow == win) { resolve(); } else { win.addEventListener( "activate", () => { resolve(); }, { once: true } ); } }); }