browser_moreFromMozilla.js (12988B)
1 /* Any copyright is dedicated to the Public Domain. 2 * http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 const { EnterprisePolicyTesting } = ChromeUtils.importESModule( 7 "resource://testing-common/EnterprisePolicyTesting.sys.mjs" 8 ); 9 10 let { TelemetryTestUtils } = ChromeUtils.importESModule( 11 "resource://testing-common/TelemetryTestUtils.sys.mjs" 12 ); 13 14 const TOTAL_PROMO_CARDS_COUNT = 6; 15 16 async function clearPolicies() { 17 // Ensure no active policies are set 18 await EnterprisePolicyTesting.setupPolicyEngineWithJson(""); 19 } 20 21 // The Relay promo is only shown if the default FxA instance is detected, and 22 // tests override it to a dummy address, so we need to make the dummy address 23 // appear like it's the default (using the actual default instance might cause a 24 // remote connection, crashing the test harness). 25 add_setup(mockDefaultFxAInstance); 26 27 add_task(async function testDefaultUIWithoutTemplatePref() { 28 await clearPolicies(); 29 await openPreferencesViaOpenPreferencesAPI("paneGeneral", { 30 leaveOpen: true, 31 }); 32 let doc = gBrowser.contentDocument; 33 let tab = gBrowser.selectedTab; 34 35 let moreFromMozillaCategory = doc.getElementById( 36 "category-more-from-mozilla" 37 ); 38 ok(moreFromMozillaCategory, "The category exists"); 39 ok(!moreFromMozillaCategory.hidden, "The category is not hidden"); 40 41 moreFromMozillaCategory.click(); 42 43 let productCards = doc.querySelectorAll(".mozilla-product-item.simple"); 44 Assert.ok(productCards, "Default UI uses simple template"); 45 Assert.equal( 46 productCards.length, 47 TOTAL_PROMO_CARDS_COUNT, 48 "All product cards displayed" 49 ); 50 51 const expectedUrl = "https://www.mozilla.org/firefox/browsers/mobile/"; 52 let tabOpened = BrowserTestUtils.waitForNewTab(gBrowser, url => 53 url.startsWith(expectedUrl) 54 ); 55 let mobileLink = doc.getElementById("default-fxMobile"); 56 mobileLink.click(); 57 let openedTab = await tabOpened; 58 Assert.ok(gBrowser.selectedBrowser.documentURI.spec.startsWith(expectedUrl)); 59 60 let searchParams = new URL(gBrowser.selectedBrowser.documentURI.spec) 61 .searchParams; 62 Assert.equal( 63 searchParams.get("utm_source"), 64 "about-prefs", 65 "expected utm_source sent" 66 ); 67 Assert.equal( 68 searchParams.get("utm_campaign"), 69 "morefrommozilla", 70 "utm_campaign set" 71 ); 72 Assert.equal( 73 searchParams.get("utm_medium"), 74 "firefox-desktop", 75 "utm_medium set" 76 ); 77 Assert.equal( 78 searchParams.get("utm_content"), 79 "default-global", 80 "default utm_content set" 81 ); 82 Assert.ok( 83 !searchParams.has("entrypoint_variation"), 84 "entrypoint_variation should not be set" 85 ); 86 Assert.ok( 87 !searchParams.has("entrypoint_experiment"), 88 "entrypoint_experiment should not be set" 89 ); 90 BrowserTestUtils.removeTab(openedTab); 91 BrowserTestUtils.removeTab(tab); 92 }); 93 94 add_task(async function testDefaulEmailClick() { 95 await clearPolicies(); 96 await openPreferencesViaOpenPreferencesAPI("paneGeneral", { 97 leaveOpen: true, 98 }); 99 let doc = gBrowser.contentDocument; 100 let tab = gBrowser.selectedTab; 101 102 let moreFromMozillaCategory = doc.getElementById( 103 "category-more-from-mozilla" 104 ); 105 moreFromMozillaCategory.click(); 106 107 const expectedUrl = "https://www.mozilla.org/firefox/mobile/get-app/?v=mfm"; 108 let sendEmailLink = doc.getElementById("default-qr-code-send-email"); 109 110 Assert.ok( 111 sendEmailLink.href.startsWith(expectedUrl), 112 `Expected URL ${sendEmailLink.href}` 113 ); 114 115 let searchParams = new URL(sendEmailLink.href).searchParams; 116 Assert.equal(searchParams.get("v"), "mfm", "expected send email param set"); 117 BrowserTestUtils.removeTab(tab); 118 }); 119 120 /** 121 * Test that we don't show moreFromMozilla pane when it's disabled. 122 */ 123 add_task(async function testwhenPrefDisabled() { 124 await SpecialPowers.pushPrefEnv({ 125 set: [["browser.preferences.moreFromMozilla", false]], 126 }); 127 128 await openPreferencesViaOpenPreferencesAPI("paneGeneral", { 129 leaveOpen: true, 130 }); 131 let doc = gBrowser.contentDocument; 132 133 let moreFromMozillaCategory = doc.getElementById( 134 "category-more-from-mozilla" 135 ); 136 ok(moreFromMozillaCategory, "The category exists"); 137 ok(moreFromMozillaCategory.hidden, "The category is hidden"); 138 139 BrowserTestUtils.removeTab(gBrowser.selectedTab); 140 }); 141 142 add_task(async function test_aboutpreferences_event_telemetry() { 143 Services.telemetry.clearEvents(); 144 145 await SpecialPowers.pushPrefEnv({ 146 set: [["browser.preferences.moreFromMozilla", true]], 147 }); 148 await openPreferencesViaOpenPreferencesAPI("paneGeneral", { 149 leaveOpen: true, 150 }); 151 152 let doc = gBrowser.contentDocument; 153 let moreFromMozillaCategory = doc.getElementById( 154 "category-more-from-mozilla" 155 ); 156 157 let clickedPromise = BrowserTestUtils.waitForEvent( 158 moreFromMozillaCategory, 159 "click" 160 ); 161 moreFromMozillaCategory.click(); 162 await clickedPromise; 163 164 TelemetryTestUtils.assertEvents( 165 [["aboutpreferences", "show", "initial", "paneGeneral"]], 166 { category: "aboutpreferences", method: "show", object: "initial" }, 167 { clear: false } 168 ); 169 TelemetryTestUtils.assertEvents( 170 [["aboutpreferences", "show", "click", "paneMoreFromMozilla"]], 171 { category: "aboutpreferences", method: "show", object: "click" }, 172 { clear: false } 173 ); 174 TelemetryTestUtils.assertNumberOfEvents(2, { category: "aboutpreferences" }); 175 BrowserTestUtils.removeTab(gBrowser.selectedTab); 176 }); 177 178 add_task(async function test_aboutpreferences_simple_template() { 179 await clearPolicies(); 180 await SpecialPowers.pushPrefEnv({ 181 set: [ 182 ["browser.preferences.moreFromMozilla", true], 183 ["browser.preferences.moreFromMozilla.template", "simple"], 184 ], 185 }); 186 await openPreferencesViaOpenPreferencesAPI("paneGeneral", { 187 leaveOpen: true, 188 }); 189 190 let doc = gBrowser.contentDocument; 191 let moreFromMozillaCategory = doc.getElementById( 192 "category-more-from-mozilla" 193 ); 194 195 moreFromMozillaCategory.click(); 196 197 let productCards = doc.querySelectorAll(".mozilla-product-item"); 198 Assert.ok(productCards, "The product cards from simple template found"); 199 Assert.equal( 200 productCards.length, 201 TOTAL_PROMO_CARDS_COUNT, 202 "All product cards displayed" 203 ); 204 205 let qrCodeButtons = doc.querySelectorAll('.qr-code-box[hidden="false"]'); 206 Assert.equal(qrCodeButtons.length, 1, "1 qr-code box displayed"); 207 208 BrowserTestUtils.removeTab(gBrowser.selectedTab); 209 }); 210 211 add_task(async function test_aboutpreferences_clickBtnVPN() { 212 await clearPolicies(); 213 await SpecialPowers.pushPrefEnv({ 214 set: [ 215 ["browser.preferences.moreFromMozilla", true], 216 ["browser.preferences.moreFromMozilla.template", "simple"], 217 ], 218 }); 219 await openPreferencesViaOpenPreferencesAPI("paneMoreFromMozilla", { 220 leaveOpen: true, 221 }); 222 223 let doc = gBrowser.contentDocument; 224 let tab = gBrowser.selectedTab; 225 226 let productCards = doc.querySelectorAll(".mozilla-product-item.simple"); 227 Assert.ok(productCards, "Simple template loaded"); 228 229 const expectedUrl = "https://www.mozilla.org/products/vpn/"; 230 let tabOpened = BrowserTestUtils.waitForNewTab(gBrowser, url => 231 url.startsWith(expectedUrl) 232 ); 233 234 let vpnButton = doc.getElementById("simple-mozillaVPN"); 235 vpnButton.click(); 236 237 let openedTab = await tabOpened; 238 Assert.ok(gBrowser.selectedBrowser.documentURI.spec.startsWith(expectedUrl)); 239 240 let searchParams = new URL(gBrowser.selectedBrowser.documentURI.spec) 241 .searchParams; 242 Assert.equal( 243 searchParams.get("utm_source"), 244 "about-prefs", 245 "expected utm_source sent" 246 ); 247 Assert.equal( 248 searchParams.get("utm_campaign"), 249 "morefrommozilla", 250 "utm_campaign set" 251 ); 252 Assert.equal( 253 searchParams.get("utm_medium"), 254 "firefox-desktop", 255 "utm_medium set" 256 ); 257 Assert.equal( 258 searchParams.get("utm_content"), 259 "fxvt-113-a-global", 260 "utm_content set" 261 ); 262 Assert.equal( 263 searchParams.get("entrypoint_experiment"), 264 "morefrommozilla-experiment-1846", 265 "entrypoint_experiment set" 266 ); 267 Assert.equal( 268 searchParams.get("entrypoint_variation"), 269 "treatment-simple", 270 "entrypoint_variation set" 271 ); 272 BrowserTestUtils.removeTab(openedTab); 273 BrowserTestUtils.removeTab(tab); 274 }); 275 276 add_task(async function test_aboutpreferences_clickBtnMobile() { 277 await SpecialPowers.pushPrefEnv({ 278 set: [ 279 ["browser.preferences.moreFromMozilla", true], 280 ["browser.preferences.moreFromMozilla.template", "simple"], 281 ], 282 }); 283 await openPreferencesViaOpenPreferencesAPI("paneMoreFromMozilla", { 284 leaveOpen: true, 285 }); 286 287 let doc = gBrowser.contentDocument; 288 let tab = gBrowser.selectedTab; 289 290 let productCards = doc.querySelectorAll("vbox.simple"); 291 Assert.ok(productCards, "Simple template loaded"); 292 293 const expectedUrl = "https://www.mozilla.org/firefox/browsers/mobile/"; 294 295 let mobileUrl = new URL(doc.getElementById("simple-fxMobile").href); 296 297 Assert.ok(mobileUrl.href.startsWith(expectedUrl)); 298 299 let searchParams = mobileUrl.searchParams; 300 Assert.equal( 301 searchParams.get("utm_source"), 302 "about-prefs", 303 "expected utm_source sent" 304 ); 305 Assert.equal( 306 searchParams.get("utm_campaign"), 307 "morefrommozilla", 308 "utm_campaign set" 309 ); 310 Assert.equal( 311 searchParams.get("utm_medium"), 312 "firefox-desktop", 313 "utm_medium set" 314 ); 315 Assert.equal( 316 searchParams.get("utm_content"), 317 "fxvt-113-a-global", 318 "default-global", 319 "utm_content set" 320 ); 321 322 BrowserTestUtils.removeTab(tab); 323 }); 324 325 add_task(async function test_aboutpreferences_search() { 326 await clearPolicies(); 327 await SpecialPowers.pushPrefEnv({ 328 set: [["browser.preferences.moreFromMozilla", true]], 329 }); 330 331 await openPreferencesViaOpenPreferencesAPI(null, { 332 leaveOpen: true, 333 }); 334 335 await runSearchInput("Relay"); 336 337 let doc = gBrowser.contentDocument; 338 let tab = gBrowser.selectedTab; 339 340 let productCards = doc.querySelectorAll(".mozilla-product-item"); 341 Assert.equal( 342 productCards.length, 343 TOTAL_PROMO_CARDS_COUNT, 344 "All products in the group are found" 345 ); 346 let [mobile, monitor, vpn, relay] = productCards; 347 Assert.ok(BrowserTestUtils.isHidden(mobile), "Mobile hidden"); 348 Assert.ok(BrowserTestUtils.isHidden(monitor), "Monitor hidden"); 349 Assert.ok(BrowserTestUtils.isHidden(vpn), "VPN hidden"); 350 Assert.ok(BrowserTestUtils.isVisible(relay), "Relay shown"); 351 352 BrowserTestUtils.removeTab(tab); 353 }); 354 355 add_task(async function test_aboutpreferences_clickBtnRelay() { 356 await SpecialPowers.pushPrefEnv({ 357 set: [["browser.preferences.moreFromMozilla", true]], 358 }); 359 await openPreferencesViaOpenPreferencesAPI("paneMoreFromMozilla", { 360 leaveOpen: true, 361 }); 362 363 let doc = gBrowser.contentDocument; 364 let tab = gBrowser.selectedTab; 365 366 let expectedUrl = new URL("https://relay.firefox.com"); 367 expectedUrl.searchParams.set("utm_source", "about-prefs"); 368 expectedUrl.searchParams.set("utm_campaign", "morefrommozilla"); 369 expectedUrl.searchParams.set("utm_medium", "firefox-desktop"); 370 expectedUrl.searchParams.set("utm_content", "fxvt-113-a-global"); 371 expectedUrl.searchParams.set( 372 "entrypoint_experiment", 373 "morefrommozilla-experiment-1846" 374 ); 375 expectedUrl.searchParams.set("entrypoint_variation", "treatment-simple"); 376 377 let tabOpened = BrowserTestUtils.waitForDocLoadAndStopIt( 378 expectedUrl.toString(), 379 gBrowser, 380 channel => { 381 Assert.equal( 382 channel.originalURI.spec, 383 expectedUrl.toString(), 384 "URL matched" 385 ); 386 return true; 387 } 388 ); 389 doc.getElementById("simple-firefoxRelay").click(); 390 391 await tabOpened; 392 BrowserTestUtils.removeTab(gBrowser.selectedTab); 393 BrowserTestUtils.removeTab(tab); 394 }); 395 396 add_task(async function show_solo_more_from_mozilla() { 397 await clearPolicies(); 398 await SpecialPowers.pushPrefEnv({ 399 set: [ 400 ["browser.preferences.moreFromMozilla", true], 401 ["browser.preferences.moreFromMozilla.template", "simple"], 402 ], 403 }); 404 await openPreferencesViaOpenPreferencesAPI("paneMoreFromMozilla", { 405 leaveOpen: true, 406 }); 407 408 let doc = gBrowser.contentDocument; 409 let tab = gBrowser.selectedTab; 410 411 const soloCard = doc.getElementById("solo-ai"); 412 let soloBtn = doc.getElementById("simple-soloAI"); 413 414 Assert.ok(BrowserTestUtils.isVisible(soloCard), "Solo card is shown"); 415 Assert.ok( 416 BrowserTestUtils.isVisible(soloBtn), 417 "Solo button rendered on page" 418 ); 419 420 BrowserTestUtils.removeTab(tab); 421 }); 422 423 add_task(async function show_mdn_more_from_mozilla() { 424 await clearPolicies(); 425 await SpecialPowers.pushPrefEnv({ 426 set: [ 427 ["browser.preferences.moreFromMozilla", true], 428 ["browser.preferences.moreFromMozilla.template", "simple"], 429 ], 430 }); 431 await openPreferencesViaOpenPreferencesAPI("paneMoreFromMozilla", { 432 leaveOpen: true, 433 }); 434 435 let doc = gBrowser.contentDocument; 436 let tab = gBrowser.selectedTab; 437 438 const mdnCard = doc.getElementById("mdn"); 439 let mdnBtn = doc.getElementById("simple-mdn"); 440 441 Assert.ok(BrowserTestUtils.isVisible(mdnCard), "MDN card is shown"); 442 Assert.ok(BrowserTestUtils.isVisible(mdnBtn), "MDN button rendered on page"); 443 444 BrowserTestUtils.removeTab(tab); 445 });