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