tor-browser

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

test_OnboardingMessageProvider.js (7790B)


      1 /* Any copyright is dedicated to the Public Domain.
      2   http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 const { OnboardingMessageProvider } = ChromeUtils.importESModule(
      5  "resource:///modules/asrouter/OnboardingMessageProvider.sys.mjs"
      6 );
      7 
      8 function getOnboardingScreenById(screens, screenId) {
      9  return screens.find(screen => {
     10    return screen?.id === screenId;
     11  });
     12 }
     13 
     14 add_task(
     15  async function test_OnboardingMessageProvider_getUpgradeMessage_no_pin() {
     16    let sandbox = sinon.createSandbox();
     17    sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin").resolves(true);
     18    const message = await OnboardingMessageProvider.getUpgradeMessage();
     19    // If Firefox is not pinned, the screen should have "pin" content
     20    equal(
     21      message.content.screens[0].id,
     22      "UPGRADE_PIN_FIREFOX",
     23      "Screen has pin screen id"
     24    );
     25    // PIN_FIREFOX_TO_TASKBAR is contained within a MULTI_ACTION
     26    // which also applies PIN_FIREFOX_TO_START_MENU where applicable.
     27    equal(
     28      message.content.screens[0].content.primary_button.action.type,
     29      "MULTI_ACTION",
     30      "Primary button has multi-action type"
     31    );
     32    sandbox.restore();
     33  }
     34 );
     35 
     36 add_task(
     37  async function test_OnboardingMessageProvider_getUpgradeMessage_pin_no_default() {
     38    let sandbox = sinon.createSandbox();
     39    sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin").resolves(false);
     40    sandbox
     41      .stub(OnboardingMessageProvider, "_doesAppNeedDefault")
     42      .resolves(true);
     43    const message = await OnboardingMessageProvider.getUpgradeMessage();
     44    // If Firefox is pinned, but not the default, the screen should have "make default" content
     45    equal(
     46      message.content.screens[0].id,
     47      "UPGRADE_ONLY_DEFAULT",
     48      "Screen has make default screen id"
     49    );
     50    equal(
     51      message.content.screens[0].content.primary_button.action.type,
     52      "SET_DEFAULT_BROWSER",
     53      "Primary button has make default action"
     54    );
     55    sandbox.restore();
     56  }
     57 );
     58 
     59 add_task(
     60  async function test_OnboardingMessageProvider_getUpgradeMessage_pin_and_default() {
     61    let sandbox = sinon.createSandbox();
     62    sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin").resolves(false);
     63    sandbox
     64      .stub(OnboardingMessageProvider, "_doesAppNeedDefault")
     65      .resolves(false);
     66    const message = await OnboardingMessageProvider.getUpgradeMessage();
     67    // If Firefox is pinned and the default, the screen should have "get started" content
     68    equal(
     69      message.content.screens[0].id,
     70      "UPGRADE_GET_STARTED",
     71      "Screen has get started screen id"
     72    );
     73    ok(
     74      !message.content.screens[0].content.primary_button.action.type,
     75      "Primary button has no action type"
     76    );
     77    sandbox.restore();
     78  }
     79 );
     80 
     81 add_task(async function test_OnboardingMessageProvider_getNoImport_default() {
     82  let sandbox = sinon.createSandbox();
     83  sandbox
     84    .stub(OnboardingMessageProvider, "_doesAppNeedDefault")
     85    .resolves(false);
     86  const message = await OnboardingMessageProvider.getUpgradeMessage();
     87 
     88  // No import screen is shown when user has Firefox both pinned and default
     89  Assert.notEqual(
     90    message.content.screens[1]?.id,
     91    "UPGRADE_IMPORT_SETTINGS_EMBEDDED",
     92    "Screen has no import screen id"
     93  );
     94  sandbox.restore();
     95 });
     96 
     97 add_task(async function test_OnboardingMessageProvider_getImport_nodefault() {
     98  Services.prefs.setBoolPref("browser.shell.checkDefaultBrowser", true);
     99  registerCleanupFunction(() => {
    100    Services.prefs.clearUserPref("browser.shell.checkDefaultBrowser");
    101  });
    102 
    103  let sandbox = sinon.createSandbox();
    104  sandbox.stub(OnboardingMessageProvider, "_doesAppNeedDefault").resolves(true);
    105  sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin").resolves(false);
    106  const message = await OnboardingMessageProvider.getUpgradeMessage();
    107 
    108  // Import screen is shown when user doesn't have Firefox pinned and default
    109  Assert.equal(
    110    message.content.screens[1]?.id,
    111    "UPGRADE_IMPORT_SETTINGS_EMBEDDED",
    112    "Screen has import screen id"
    113  );
    114  sandbox.restore();
    115 });
    116 
    117 add_task(
    118  async function test_OnboardingMessageProvider_getPinPrivateWindow_noPrivatePin() {
    119    Services.prefs.setBoolPref("browser.shell.checkDefaultBrowser", true);
    120    registerCleanupFunction(() => {
    121      Services.prefs.clearUserPref("browser.shell.checkDefaultBrowser");
    122    });
    123    let sandbox = sinon.createSandbox();
    124    // User needs default to ensure Pin Private window shows as third screen after import
    125    sandbox
    126      .stub(OnboardingMessageProvider, "_doesAppNeedDefault")
    127      .resolves(true);
    128 
    129    let pinStub = sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin");
    130    pinStub.resolves(false);
    131    pinStub.withArgs(true).resolves(true);
    132    const message = await OnboardingMessageProvider.getUpgradeMessage();
    133 
    134    // Pin Private screen is shown when user doesn't have Firefox private pinned but has Firefox pinned
    135    Assert.ok(
    136      getOnboardingScreenById(
    137        message.content.screens,
    138        "UPGRADE_PIN_PRIVATE_WINDOW"
    139      )
    140    );
    141    sandbox.restore();
    142  }
    143 );
    144 
    145 add_task(
    146  async function test_OnboardingMessageProvider_getNoPinPrivateWindow_noPin() {
    147    Services.prefs.setBoolPref("browser.shell.checkDefaultBrowser", true);
    148    registerCleanupFunction(() => {
    149      Services.prefs.clearUserPref("browser.shell.checkDefaultBrowser");
    150    });
    151    let sandbox = sinon.createSandbox();
    152    // User needs default to ensure Pin Private window shows as third screen after import
    153    sandbox
    154      .stub(OnboardingMessageProvider, "_doesAppNeedDefault")
    155      .resolves(true);
    156 
    157    let pinStub = sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin");
    158    pinStub.resolves(true);
    159    const message = await OnboardingMessageProvider.getUpgradeMessage();
    160 
    161    // Pin Private screen is not shown when user doesn't have Firefox pinned
    162    Assert.ok(
    163      !getOnboardingScreenById(
    164        message.content.screens,
    165        "UPGRADE_PIN_PRIVATE_WINDOW"
    166      )
    167    );
    168    sandbox.restore();
    169  }
    170 );
    171 
    172 add_task(async function test_schemaValidation() {
    173  const { experimentValidator, messageValidators } = await makeValidators();
    174 
    175  const messages = await OnboardingMessageProvider.getMessages();
    176  for (const message of messages) {
    177    const validator = messageValidators[message.template];
    178 
    179    Assert.notStrictEqual(
    180      typeof validator,
    181      "undefined",
    182      typeof validator !== "undefined"
    183        ? `Schema validator found for ${message.template}.`
    184        : `No schema validator found for template ${message.template}. Please update this test to add one.`
    185    );
    186    assertValidates(
    187      validator,
    188      message,
    189      `Message ${message.id} validates as template ${message.template}`
    190    );
    191    assertValidates(
    192      experimentValidator,
    193      message,
    194      `Message ${message.id} validates as MessagingExperiment`
    195    );
    196  }
    197 });
    198 
    199 add_task(
    200  async function test_OnboardingMessageProvider_getPinPrivateWindow_pinPBMPrefDisabled() {
    201    Services.prefs.setBoolPref(
    202      "browser.startup.upgradeDialog.pinPBM.disabled",
    203      true
    204    );
    205    registerCleanupFunction(() => {
    206      Services.prefs.clearUserPref(
    207        "browser.startup.upgradeDialog.pinPBM.disabled"
    208      );
    209    });
    210    let sandbox = sinon.createSandbox();
    211    // User needs default to ensure Pin Private window shows as third screen after import
    212    sandbox
    213      .stub(OnboardingMessageProvider, "_doesAppNeedDefault")
    214      .resolves(true);
    215 
    216    let pinStub = sandbox.stub(OnboardingMessageProvider, "_doesAppNeedPin");
    217    pinStub.resolves(true);
    218 
    219    const message = await OnboardingMessageProvider.getUpgradeMessage();
    220    // Pin Private screen is not shown when pref is turned on
    221    Assert.ok(
    222      !getOnboardingScreenById(
    223        message.content.screens,
    224        "UPGRADE_PIN_PRIVATE_WINDOW"
    225      )
    226    );
    227    sandbox.restore();
    228  }
    229 );