tor-browser

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

browser_setDefaultPDFHandler.js (8321B)


      1 /* Any copyright is dedicated to the Public Domain.
      2 * http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 ChromeUtils.defineESModuleGetters(this, {
      5  ExperimentAPI: "resource://nimbus/ExperimentAPI.sys.mjs",
      6  NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs",
      7  NimbusTestUtils: "resource://testing-common/NimbusTestUtils.sys.mjs",
      8  sinon: "resource://testing-common/Sinon.sys.mjs",
      9 });
     10 
     11 const setDefaultBrowserUserChoiceStub = sinon.stub();
     12 const setDefaultExtensionHandlersUserChoiceStub = sinon
     13  .stub()
     14  .callsFake(() => Promise.resolve());
     15 
     16 const defaultAgentStub = sinon.stub(ShellService, "defaultAgent").value({
     17  setDefaultBrowserUserChoiceAsync: setDefaultBrowserUserChoiceStub,
     18  setDefaultExtensionHandlersUserChoice:
     19    setDefaultExtensionHandlersUserChoiceStub,
     20 });
     21 
     22 XPCOMUtils.defineLazyServiceGetter(
     23  this,
     24  "XreDirProvider",
     25  "@mozilla.org/xre/directory-provider;1",
     26  Ci.nsIXREDirProvider
     27 );
     28 
     29 const _userChoiceImpossibleTelemetryResultStub = sinon
     30  .stub(ShellService, "_userChoiceImpossibleTelemetryResult")
     31  .callsFake(() => null);
     32 
     33 // Ensure we don't fall back to a real implementation.
     34 const setDefaultStub = sinon.stub();
     35 // We'll dynamically update this as needed during the tests.
     36 const queryCurrentDefaultHandlerForStub = sinon.stub();
     37 const shellStub = sinon.stub(ShellService, "shellService").value({
     38  setDefaultBrowser: setDefaultStub,
     39  queryCurrentDefaultHandlerFor: queryCurrentDefaultHandlerForStub,
     40 });
     41 
     42 registerCleanupFunction(() => {
     43  defaultAgentStub.restore();
     44  _userChoiceImpossibleTelemetryResultStub.restore();
     45  shellStub.restore();
     46 });
     47 
     48 add_task(async function ready() {
     49  await ExperimentAPI.ready();
     50 });
     51 
     52 // Everything here is Windows.
     53 Assert.equal(AppConstants.platform, "win", "Platform is Windows");
     54 
     55 add_task(async function remoteEnableWithPDF() {
     56  let doCleanup = await NimbusTestUtils.enrollWithFeatureConfig(
     57    {
     58      featureId: NimbusFeatures.shellService.featureId,
     59      value: {
     60        setDefaultBrowserUserChoice: true,
     61        setDefaultPDFHandlerOnlyReplaceBrowsers: false,
     62        setDefaultPDFHandler: true,
     63        enabled: true,
     64      },
     65    },
     66    { isRollout: true }
     67  );
     68 
     69  Assert.equal(
     70    NimbusFeatures.shellService.getVariable("setDefaultBrowserUserChoice"),
     71    true
     72  );
     73  Assert.equal(
     74    NimbusFeatures.shellService.getVariable("setDefaultPDFHandler"),
     75    true
     76  );
     77 
     78  setDefaultBrowserUserChoiceStub.resetHistory();
     79  await ShellService.setDefaultBrowser();
     80 
     81  const aumi = XreDirProvider.getInstallHash();
     82  Assert.ok(setDefaultBrowserUserChoiceStub.called);
     83  Assert.deepEqual(setDefaultBrowserUserChoiceStub.firstCall.args, [
     84    aumi,
     85    [".pdf", "FirefoxPDF"],
     86  ]);
     87 
     88  await doCleanup();
     89 });
     90 
     91 add_task(async function remoteEnableWithPDF_testOnlyReplaceBrowsers() {
     92  let doCleanup = await NimbusTestUtils.enrollWithFeatureConfig(
     93    {
     94      featureId: NimbusFeatures.shellService.featureId,
     95      value: {
     96        setDefaultBrowserUserChoice: true,
     97        setDefaultPDFHandlerOnlyReplaceBrowsers: true,
     98        setDefaultPDFHandler: true,
     99        enabled: true,
    100      },
    101    },
    102    { isRollout: true }
    103  );
    104 
    105  Assert.equal(
    106    NimbusFeatures.shellService.getVariable("setDefaultBrowserUserChoice"),
    107    true
    108  );
    109  Assert.equal(
    110    NimbusFeatures.shellService.getVariable("setDefaultPDFHandler"),
    111    true
    112  );
    113  Assert.equal(
    114    NimbusFeatures.shellService.getVariable(
    115      "setDefaultPDFHandlerOnlyReplaceBrowsers"
    116    ),
    117    true
    118  );
    119 
    120  const aumi = XreDirProvider.getInstallHash();
    121 
    122  // We'll take the default from a missing association or a known browser.
    123  for (let progId of ["", "MSEdgePDF"]) {
    124    queryCurrentDefaultHandlerForStub.callsFake(() => progId);
    125 
    126    setDefaultBrowserUserChoiceStub.resetHistory();
    127    await ShellService.setDefaultBrowser();
    128 
    129    Assert.ok(setDefaultBrowserUserChoiceStub.called);
    130    Assert.deepEqual(
    131      setDefaultBrowserUserChoiceStub.firstCall.args,
    132      [aumi, [".pdf", "FirefoxPDF"]],
    133      `Will take default from missing association or known browser with ProgID '${progId}'`
    134    );
    135  }
    136 
    137  // But not from a non-browser.
    138  queryCurrentDefaultHandlerForStub.callsFake(() => "Acrobat.Document.DC");
    139 
    140  setDefaultBrowserUserChoiceStub.resetHistory();
    141  await ShellService.setDefaultBrowser();
    142 
    143  Assert.ok(setDefaultBrowserUserChoiceStub.called);
    144  Assert.deepEqual(
    145    setDefaultBrowserUserChoiceStub.firstCall.args,
    146    [aumi, []],
    147    `Will not take default from non-browser`
    148  );
    149 
    150  await doCleanup();
    151 });
    152 
    153 add_task(async function remoteEnableWithoutPDF() {
    154  let doCleanup = await NimbusTestUtils.enrollWithFeatureConfig(
    155    {
    156      featureId: NimbusFeatures.shellService.featureId,
    157      value: {
    158        setDefaultBrowserUserChoice: true,
    159        setDefaultPDFHandler: false,
    160        enabled: true,
    161      },
    162    },
    163    { isRollout: true }
    164  );
    165 
    166  Assert.equal(
    167    NimbusFeatures.shellService.getVariable("setDefaultBrowserUserChoice"),
    168    true
    169  );
    170  Assert.equal(
    171    NimbusFeatures.shellService.getVariable("setDefaultPDFHandler"),
    172    false
    173  );
    174 
    175  setDefaultBrowserUserChoiceStub.resetHistory();
    176  await ShellService.setDefaultBrowser();
    177 
    178  const aumi = XreDirProvider.getInstallHash();
    179  Assert.ok(setDefaultBrowserUserChoiceStub.called);
    180  Assert.deepEqual(setDefaultBrowserUserChoiceStub.firstCall.args, [aumi, []]);
    181 
    182  await doCleanup();
    183 });
    184 
    185 add_task(async function remoteDisable() {
    186  let doCleanup = await NimbusTestUtils.enrollWithFeatureConfig(
    187    {
    188      featureId: NimbusFeatures.shellService.featureId,
    189      value: {
    190        setDefaultBrowserUserChoice: false,
    191        setDefaultPDFHandler: true,
    192        enabled: false,
    193      },
    194    },
    195    { isRollout: true }
    196  );
    197 
    198  Assert.equal(
    199    NimbusFeatures.shellService.getVariable("setDefaultBrowserUserChoice"),
    200    false
    201  );
    202  Assert.equal(
    203    NimbusFeatures.shellService.getVariable("setDefaultPDFHandler"),
    204    true
    205  );
    206 
    207  setDefaultBrowserUserChoiceStub.resetHistory();
    208  await ShellService.setDefaultBrowser();
    209 
    210  Assert.ok(setDefaultBrowserUserChoiceStub.notCalled);
    211  Assert.ok(setDefaultStub.called);
    212 
    213  await doCleanup();
    214 });
    215 
    216 add_task(async function test_setAsDefaultPDFHandler_knownBrowser() {
    217  const sandbox = sinon.createSandbox();
    218 
    219  const aumi = XreDirProvider.getInstallHash();
    220  const expectedArguments = [aumi, [".pdf", "FirefoxPDF"]];
    221 
    222  try {
    223    const pdfHandlerResult = { registered: true, knownBrowser: true };
    224    sandbox
    225      .stub(ShellService, "getDefaultPDFHandler")
    226      .returns(pdfHandlerResult);
    227 
    228    info("Testing setAsDefaultPDFHandler(true) when knownBrowser = true");
    229    ShellService.setAsDefaultPDFHandler(true);
    230    Assert.ok(
    231      setDefaultExtensionHandlersUserChoiceStub.called,
    232      "Called default browser agent"
    233    );
    234    Assert.deepEqual(
    235      setDefaultExtensionHandlersUserChoiceStub.firstCall.args,
    236      expectedArguments,
    237      "Called default browser agent with expected arguments"
    238    );
    239    setDefaultExtensionHandlersUserChoiceStub.resetHistory();
    240 
    241    info("Testing setAsDefaultPDFHandler(false) when knownBrowser = true");
    242    ShellService.setAsDefaultPDFHandler(false);
    243    Assert.ok(
    244      setDefaultExtensionHandlersUserChoiceStub.called,
    245      "Called default browser agent"
    246    );
    247    Assert.deepEqual(
    248      setDefaultExtensionHandlersUserChoiceStub.firstCall.args,
    249      expectedArguments,
    250      "Called default browser agent with expected arguments"
    251    );
    252    setDefaultExtensionHandlersUserChoiceStub.resetHistory();
    253 
    254    pdfHandlerResult.knownBrowser = false;
    255 
    256    info("Testing setAsDefaultPDFHandler(true) when knownBrowser = false");
    257    ShellService.setAsDefaultPDFHandler(true);
    258    Assert.ok(
    259      setDefaultExtensionHandlersUserChoiceStub.notCalled,
    260      "Did not call default browser agent"
    261    );
    262    setDefaultExtensionHandlersUserChoiceStub.resetHistory();
    263 
    264    info("Testing setAsDefaultPDFHandler(false) when knownBrowser = false");
    265    ShellService.setAsDefaultPDFHandler(false);
    266    Assert.ok(
    267      setDefaultExtensionHandlersUserChoiceStub.called,
    268      "Called default browser agent"
    269    );
    270    Assert.deepEqual(
    271      setDefaultExtensionHandlersUserChoiceStub.firstCall.args,
    272      expectedArguments,
    273      "Called default browser agent with expected arguments"
    274    );
    275    setDefaultExtensionHandlersUserChoiceStub.resetHistory();
    276  } finally {
    277    sandbox.restore();
    278  }
    279 });