fune/browser/components/shell/test/browser_setDefaultPDFHandler.js

291 lines
8.3 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
ChromeUtils.defineESModuleGetters(this, {
ExperimentAPI: "resource://nimbus/ExperimentAPI.sys.mjs",
ExperimentFakes: "resource://testing-common/NimbusTestUtils.sys.mjs",
NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs",
sinon: "resource://testing-common/Sinon.sys.mjs",
});
XPCOMUtils.defineLazyServiceGetter(
this,
"XreDirProvider",
"@mozilla.org/xre/directory-provider;1",
"nsIXREDirProvider"
);
const _callExternalDefaultBrowserAgentStub = sinon
.stub(ShellService, "_callExternalDefaultBrowserAgent")
.callsFake(async () => ({
async wait() {
return { exitCode: 0 };
},
}));
const _userChoiceImpossibleTelemetryResultStub = sinon
.stub(ShellService, "_userChoiceImpossibleTelemetryResult")
.callsFake(() => null);
// Ensure we don't fall back to a real implementation.
const setDefaultStub = sinon.stub();
// We'll dynamically update this as needed during the tests.
const queryCurrentDefaultHandlerForStub = sinon.stub();
const shellStub = sinon.stub(ShellService, "shellService").value({
setDefaultBrowser: setDefaultStub,
queryCurrentDefaultHandlerFor: queryCurrentDefaultHandlerForStub,
});
registerCleanupFunction(() => {
_callExternalDefaultBrowserAgentStub.restore();
_userChoiceImpossibleTelemetryResultStub.restore();
shellStub.restore();
ExperimentAPI._store._deleteForTests("shellService");
});
add_task(async function ready() {
await ExperimentAPI.ready();
});
// Everything here is Windows 10+.
Assert.ok(
AppConstants.isPlatformAndVersionAtLeast("win", "10"),
"Windows version 10+"
);
add_task(async function remoteEnableWithPDF() {
let doCleanup = await ExperimentFakes.enrollWithRollout({
featureId: NimbusFeatures.shellService.featureId,
value: {
setDefaultBrowserUserChoice: true,
setDefaultPDFHandlerOnlyReplaceBrowsers: false,
setDefaultPDFHandler: true,
enabled: true,
},
});
Assert.equal(
NimbusFeatures.shellService.getVariable("setDefaultBrowserUserChoice"),
true
);
Assert.equal(
NimbusFeatures.shellService.getVariable("setDefaultPDFHandler"),
true
);
_callExternalDefaultBrowserAgentStub.resetHistory();
ShellService.setDefaultBrowser();
const aumi = XreDirProvider.getInstallHash();
Assert.ok(_callExternalDefaultBrowserAgentStub.called);
Assert.deepEqual(_callExternalDefaultBrowserAgentStub.firstCall.args, [
{
arguments: [
"set-default-browser-user-choice",
aumi,
".pdf",
"FirefoxPDF",
],
},
]);
await doCleanup();
});
add_task(async function remoteEnableWithPDF_testOnlyReplaceBrowsers() {
let doCleanup = await ExperimentFakes.enrollWithRollout({
featureId: NimbusFeatures.shellService.featureId,
value: {
setDefaultBrowserUserChoice: true,
setDefaultPDFHandlerOnlyReplaceBrowsers: true,
setDefaultPDFHandler: true,
enabled: true,
},
});
Assert.equal(
NimbusFeatures.shellService.getVariable("setDefaultBrowserUserChoice"),
true
);
Assert.equal(
NimbusFeatures.shellService.getVariable("setDefaultPDFHandler"),
true
);
Assert.equal(
NimbusFeatures.shellService.getVariable(
"setDefaultPDFHandlerOnlyReplaceBrowsers"
),
true
);
const aumi = XreDirProvider.getInstallHash();
// We'll take the default from a missing association or a known browser.
for (let progId of ["", "MSEdgePDF"]) {
queryCurrentDefaultHandlerForStub.callsFake(() => progId);
_callExternalDefaultBrowserAgentStub.resetHistory();
ShellService.setDefaultBrowser();
Assert.ok(_callExternalDefaultBrowserAgentStub.called);
Assert.deepEqual(
_callExternalDefaultBrowserAgentStub.firstCall.args,
[
{
arguments: [
"set-default-browser-user-choice",
aumi,
".pdf",
"FirefoxPDF",
],
},
],
`Will take default from missing association or known browser with ProgID '${progId}'`
);
}
// But not from a non-browser.
queryCurrentDefaultHandlerForStub.callsFake(() => "Acrobat.Document.DC");
_callExternalDefaultBrowserAgentStub.resetHistory();
ShellService.setDefaultBrowser();
Assert.ok(_callExternalDefaultBrowserAgentStub.called);
Assert.deepEqual(
_callExternalDefaultBrowserAgentStub.firstCall.args,
[{ arguments: ["set-default-browser-user-choice", aumi] }],
`Will not take default from non-browser`
);
await doCleanup();
});
add_task(async function remoteEnableWithoutPDF() {
let doCleanup = await ExperimentFakes.enrollWithRollout({
featureId: NimbusFeatures.shellService.featureId,
value: {
setDefaultBrowserUserChoice: true,
setDefaultPDFHandler: false,
enabled: true,
},
});
Assert.equal(
NimbusFeatures.shellService.getVariable("setDefaultBrowserUserChoice"),
true
);
Assert.equal(
NimbusFeatures.shellService.getVariable("setDefaultPDFHandler"),
false
);
_callExternalDefaultBrowserAgentStub.resetHistory();
ShellService.setDefaultBrowser();
const aumi = XreDirProvider.getInstallHash();
Assert.ok(_callExternalDefaultBrowserAgentStub.called);
Assert.deepEqual(_callExternalDefaultBrowserAgentStub.firstCall.args, [
{ arguments: ["set-default-browser-user-choice", aumi] },
]);
await doCleanup();
});
add_task(async function remoteDisable() {
let doCleanup = await ExperimentFakes.enrollWithRollout({
featureId: NimbusFeatures.shellService.featureId,
value: {
setDefaultBrowserUserChoice: false,
setDefaultPDFHandler: true,
enabled: false,
},
});
Assert.equal(
NimbusFeatures.shellService.getVariable("setDefaultBrowserUserChoice"),
false
);
Assert.equal(
NimbusFeatures.shellService.getVariable("setDefaultPDFHandler"),
true
);
_callExternalDefaultBrowserAgentStub.resetHistory();
ShellService.setDefaultBrowser();
Assert.ok(_callExternalDefaultBrowserAgentStub.notCalled);
Assert.ok(setDefaultStub.called);
await doCleanup();
});
add_task(async function test_setAsDefaultPDFHandler_knownBrowser() {
const sandbox = sinon.createSandbox();
const aumi = XreDirProvider.getInstallHash();
const expectedArguments = [
"set-default-extension-handlers-user-choice",
aumi,
".pdf",
"FirefoxPDF",
];
try {
const pdfHandlerResult = { registered: true, knownBrowser: true };
sandbox
.stub(ShellService, "getDefaultPDFHandler")
.returns(pdfHandlerResult);
info("Testing setAsDefaultPDFHandler(true) when knownBrowser = true");
ShellService.setAsDefaultPDFHandler(true);
Assert.ok(
_callExternalDefaultBrowserAgentStub.called,
"Called default browser agent"
);
Assert.deepEqual(
_callExternalDefaultBrowserAgentStub.firstCall.args,
[{ arguments: expectedArguments }],
"Called default browser agent with expected arguments"
);
_callExternalDefaultBrowserAgentStub.resetHistory();
info("Testing setAsDefaultPDFHandler(false) when knownBrowser = true");
ShellService.setAsDefaultPDFHandler(false);
Assert.ok(
_callExternalDefaultBrowserAgentStub.called,
"Called default browser agent"
);
Assert.deepEqual(
_callExternalDefaultBrowserAgentStub.firstCall.args,
[{ arguments: expectedArguments }],
"Called default browser agent with expected arguments"
);
_callExternalDefaultBrowserAgentStub.resetHistory();
pdfHandlerResult.knownBrowser = false;
info("Testing setAsDefaultPDFHandler(true) when knownBrowser = false");
ShellService.setAsDefaultPDFHandler(true);
Assert.ok(
_callExternalDefaultBrowserAgentStub.notCalled,
"Did not call default browser agent"
);
_callExternalDefaultBrowserAgentStub.resetHistory();
info("Testing setAsDefaultPDFHandler(false) when knownBrowser = false");
ShellService.setAsDefaultPDFHandler(false);
Assert.ok(
_callExternalDefaultBrowserAgentStub.called,
"Called default browser agent"
);
Assert.deepEqual(
_callExternalDefaultBrowserAgentStub.firstCall.args,
[{ arguments: expectedArguments }],
"Called default browser agent with expected arguments"
);
_callExternalDefaultBrowserAgentStub.resetHistory();
} finally {
sandbox.restore();
}
});