tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

browser_searchTips.js (9712B)


      1 /* Any copyright is dedicated to the Public Domain.
      2 * http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 // Tests the Search Tips feature, which displays a prompt to use the Urlbar on
      5 // the newtab page and on the user's default search engine's homepage.
      6 // Specifically, it tests that the Tips appear when they should be appearing.
      7 // This doesn't test the max-shown-count limit or the restriction on tips when
      8 // we show the default browser prompt because those require restarting the
      9 // browser.
     10 
     11 "use strict";
     12 
     13 ChromeUtils.defineESModuleGetters(this, {
     14  AppMenuNotifications: "resource://gre/modules/AppMenuNotifications.sys.mjs",
     15  HttpServer: "resource://testing-common/httpd.sys.mjs",
     16  UrlbarPrefs: "moz-src:///browser/components/urlbar/UrlbarPrefs.sys.mjs",
     17  UrlbarProviderSearchTips:
     18    "moz-src:///browser/components/urlbar/UrlbarProviderSearchTips.sys.mjs",
     19 });
     20 
     21 // These should match the same consts in UrlbarProviderSearchTips.sys.mjs.
     22 const MAX_SHOWN_COUNT = 4;
     23 const LAST_UPDATE_THRESHOLD_MS = 24 * 60 * 60 * 1000;
     24 
     25 // We test some of the bigger Google domains.
     26 const GOOGLE_DOMAINS = [
     27  "www.google.com",
     28  "www.google.ca",
     29  "www.google.co.uk",
     30  "www.google.com.au",
     31  "www.google.co.nz",
     32 ];
     33 
     34 add_setup(async function () {
     35  await PlacesUtils.history.clear();
     36  await PlacesUtils.bookmarks.eraseEverything();
     37 
     38  await SpecialPowers.pushPrefEnv({
     39    set: [
     40      [
     41        `browser.urlbar.tipShownCount.${UrlbarProviderSearchTips.TIP_TYPE.ONBOARD}`,
     42        0,
     43      ],
     44      [
     45        `browser.urlbar.tipShownCount.${UrlbarProviderSearchTips.TIP_TYPE.REDIRECT}`,
     46        0,
     47      ],
     48      // Set following prefs so tips are actually shown.
     49      ["browser.laterrun.bookkeeping.profileCreationTime", 0],
     50      ["browser.laterrun.bookkeeping.updateAppliedTime", 0],
     51      ["browser.urlbar.scotchBonnet.enableOverride", false],
     52    ],
     53  });
     54 
     55  // Remove update history and the current active update so tips are shown.
     56  let updateRootDir = Services.dirsvc.get("UpdRootD", Ci.nsIFile);
     57  let updatesFile = updateRootDir.clone();
     58  updatesFile.append("updates.xml");
     59  let activeUpdateFile = updateRootDir.clone();
     60  activeUpdateFile.append("active-update.xml");
     61  try {
     62    updatesFile.remove(false);
     63  } catch (e) {}
     64  try {
     65    activeUpdateFile.remove(false);
     66  } catch (e) {}
     67 
     68  let defaultEngine = await Services.search.getDefault();
     69  let defaultEngineName = defaultEngine.name;
     70  Assert.equal(defaultEngineName, "Google", "Default engine should be Google.");
     71 
     72  // Add a mock engine so we don't hit the network loading the SERP.
     73  await SearchTestUtils.installSearchExtension();
     74 
     75  registerCleanupFunction(async () => {
     76    await setDefaultEngine(defaultEngineName);
     77    resetSearchTipsProvider();
     78  });
     79 });
     80 
     81 // The onboarding tip should be shown on about:newtab.
     82 add_task(async function newtab() {
     83  await checkTab(
     84    window,
     85    "about:newtab",
     86    UrlbarProviderSearchTips.TIP_TYPE.ONBOARD
     87  );
     88 });
     89 
     90 // The onboarding tip should be shown on about:home.
     91 add_task(async function home() {
     92  await checkTab(
     93    window,
     94    "about:home",
     95    UrlbarProviderSearchTips.TIP_TYPE.ONBOARD
     96  );
     97 });
     98 
     99 // The redirect tip should be shown for www.google.com when it's the default
    100 // engine.
    101 add_task(async function google() {
    102  await setDefaultEngine("Google");
    103  for (let domain of GOOGLE_DOMAINS) {
    104    await withDNSRedirect(domain, "/", async url => {
    105      await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.REDIRECT);
    106    });
    107  }
    108 });
    109 
    110 // The redirect tip should be shown for www.google.com/webhp when it's the
    111 // default engine.
    112 add_task(async function googleWebhp() {
    113  await setDefaultEngine("Google");
    114  for (let domain of GOOGLE_DOMAINS) {
    115    await withDNSRedirect(domain, "/webhp", async url => {
    116      await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.REDIRECT);
    117    });
    118  }
    119 });
    120 
    121 // The redirect tip should be shown for the Google homepage when query strings
    122 // are appended.
    123 add_task(async function googleQueryString() {
    124  await setDefaultEngine("Google");
    125  for (let domain of GOOGLE_DOMAINS) {
    126    await withDNSRedirect(domain, "/webhp", async url => {
    127      await checkTab(
    128        window,
    129        `${url}?hl=en`,
    130        UrlbarProviderSearchTips.TIP_TYPE.REDIRECT
    131      );
    132    });
    133  }
    134 });
    135 
    136 // The redirect tip should not be shown on Google results pages.
    137 add_task(async function googleResults() {
    138  await setDefaultEngine("Google");
    139  for (let domain of GOOGLE_DOMAINS) {
    140    await withDNSRedirect(domain, "/search", async url => {
    141      await checkTab(
    142        window,
    143        `${url}?q=firefox`,
    144        UrlbarProviderSearchTips.TIP_TYPE.NONE
    145      );
    146    });
    147  }
    148 });
    149 
    150 // The redirect tip should not be shown for www.google.com when it's not the
    151 // default engine.
    152 add_task(async function googleNotDefault() {
    153  await setDefaultEngine("Bing");
    154  for (let domain of GOOGLE_DOMAINS) {
    155    await withDNSRedirect(domain, "/", async url => {
    156      await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.NONE);
    157    });
    158  }
    159 });
    160 
    161 // The redirect tip should not be shown for www.google.com/webhp when it's not
    162 // the default engine.
    163 add_task(async function googleWebhpNotDefault() {
    164  await setDefaultEngine("Bing");
    165  for (let domain of GOOGLE_DOMAINS) {
    166    await withDNSRedirect(domain, "/webhp", async url => {
    167      await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.NONE);
    168    });
    169  }
    170 });
    171 
    172 // The redirect tip should be shown for www.bing.com when it's the default
    173 // engine.
    174 add_task(async function bing() {
    175  await setDefaultEngine("Bing");
    176  await withDNSRedirect("www.bing.com", "/", async url => {
    177    await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.REDIRECT);
    178  });
    179 });
    180 
    181 // The redirect tip should be shown on the Bing homepage even when Bing appends
    182 // query strings.
    183 add_task(async function bingQueryString() {
    184  await setDefaultEngine("Bing");
    185  await withDNSRedirect("www.bing.com", "/", async url => {
    186    await checkTab(
    187      window,
    188      `${url}?toWww=1`,
    189      UrlbarProviderSearchTips.TIP_TYPE.REDIRECT
    190    );
    191  });
    192 });
    193 
    194 // The redirect tip should not be shown on Bing results pages.
    195 add_task(async function bingResults() {
    196  await setDefaultEngine("Bing");
    197  await withDNSRedirect("www.bing.com", "/search", async url => {
    198    await checkTab(
    199      window,
    200      `${url}?q=firefox`,
    201      UrlbarProviderSearchTips.TIP_TYPE.NONE
    202    );
    203  });
    204 });
    205 
    206 // The redirect tip should not be shown for www.bing.com when it's not the
    207 // default engine.
    208 add_task(async function bingNotDefault() {
    209  await setDefaultEngine("Google");
    210  await withDNSRedirect("www.bing.com", "/", async url => {
    211    await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.NONE);
    212  });
    213 });
    214 
    215 // The redirect tip should be shown for duckduckgo.com when it's the default
    216 // engine.
    217 add_task(async function ddg() {
    218  await setDefaultEngine("DuckDuckGo");
    219  await withDNSRedirect("duckduckgo.com", "/", async url => {
    220    await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.REDIRECT);
    221  });
    222 });
    223 
    224 // The redirect tip should be shown for start.duckduckgo.com when it's the
    225 // default engine.
    226 add_task(async function ddgStart() {
    227  await setDefaultEngine("DuckDuckGo");
    228  await withDNSRedirect("start.duckduckgo.com", "/", async url => {
    229    await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.REDIRECT);
    230  });
    231 });
    232 
    233 // The redirect tip should not be shown for duckduckgo.com when it's not the
    234 // default engine.
    235 add_task(async function ddgNotDefault() {
    236  await setDefaultEngine("Google");
    237  await withDNSRedirect("duckduckgo.com", "/", async url => {
    238    await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.NONE);
    239  });
    240 });
    241 
    242 // The redirect tip should not be shown for start.duckduckgo.com when it's not
    243 // the default engine.
    244 add_task(async function ddgStartNotDefault() {
    245  await setDefaultEngine("Google");
    246  await withDNSRedirect("start.duckduckgo.com", "/", async url => {
    247    await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.NONE);
    248  });
    249 });
    250 
    251 // The redirect tip should not be shown for duckduckgo.com/?q=foo, the search
    252 // results page, which happens to have the same domain and path as the home
    253 // page.
    254 add_task(async function ddgSearchResultsPage() {
    255  await setDefaultEngine("DuckDuckGo");
    256  await withDNSRedirect("duckduckgo.com", "/", async url => {
    257    await checkTab(
    258      window,
    259      `${url}?q=test`,
    260      UrlbarProviderSearchTips.TIP_TYPE.NONE
    261    );
    262  });
    263 });
    264 
    265 // The redirect tip should not be shown on a non-engine page.
    266 add_task(async function nonEnginePage() {
    267  await checkTab(
    268    window,
    269    "http://example.com/",
    270    UrlbarProviderSearchTips.TIP_TYPE.NONE
    271  );
    272 });
    273 
    274 // Tips should be shown at most once per session regardless of their type.
    275 add_task(async function oncePerSession() {
    276  await setDefaultEngine("Google");
    277  await checkTab(
    278    window,
    279    "about:newtab",
    280    UrlbarProviderSearchTips.TIP_TYPE.ONBOARD,
    281    false
    282  );
    283  await checkTab(
    284    window,
    285    "about:newtab",
    286    UrlbarProviderSearchTips.TIP_TYPE.NONE,
    287    false
    288  );
    289  await withDNSRedirect("www.google.com", "/", async url => {
    290    await checkTab(window, url, UrlbarProviderSearchTips.TIP_TYPE.NONE);
    291  });
    292 });
    293 
    294 // The one-off search buttons should not be shown when
    295 // a search tip is shown even though the search string is empty.
    296 add_task(async function shortcut_buttons_with_tip() {
    297  await checkTab(
    298    window,
    299    "about:newtab",
    300    UrlbarProviderSearchTips.TIP_TYPE.ONBOARD
    301  );
    302 });
    303 
    304 function waitForBrowserWindowActive(win) {
    305  return new Promise(resolve => {
    306    if (Services.focus.activeWindow == win) {
    307      resolve();
    308    } else {
    309      win.addEventListener(
    310        "activate",
    311        () => {
    312          resolve();
    313        },
    314        { once: true }
    315      );
    316    }
    317  });
    318 }