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 }