tor-browser

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

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 });