diff options
Diffstat (limited to 'toolkit/components/printing/tests/browser_destination_change.js')
-rw-r--r-- | toolkit/components/printing/tests/browser_destination_change.js | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/toolkit/components/printing/tests/browser_destination_change.js b/toolkit/components/printing/tests/browser_destination_change.js new file mode 100644 index 0000000000..34d435e6df --- /dev/null +++ b/toolkit/components/printing/tests/browser_destination_change.js @@ -0,0 +1,155 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +let pdfPrinterName = "Mozilla Save to PDF"; +let fastPrinterName = "Fast"; +let slowPrinterName = "Slow"; + +async function setupPrinters(helper) { + helper.addMockPrinter(fastPrinterName); + + let resolvePrinterInfo; + helper.addMockPrinter({ + name: slowPrinterName, + printerInfoPromise: new Promise(resolve => { + resolvePrinterInfo = resolve; + }), + }); + + await SpecialPowers.pushPrefEnv({ + set: [["print.printer_Slow.print_orientation", 1]], + }); + + return resolvePrinterInfo; +} + +async function changeDestination(helper, dir) { + let picker = helper.get("printer-picker"); + let changed = BrowserTestUtils.waitForEvent(picker, "change"); + + let pickerOpened = BrowserTestUtils.waitForSelectPopupShown(window); + picker.focus(); + EventUtils.sendKey("space", helper.win); + await pickerOpened; + EventUtils.sendKey(dir, window); + EventUtils.sendKey("return", window); + await changed; +} + +function assertFormEnabled(form) { + for (let element of form.elements) { + if (element.hasAttribute("disallowed")) { + ok(element.disabled, `${element.id} is disallowed`); + } else { + ok(!element.disabled, `${element.id} is enabled`); + } + } +} + +function assertFormDisabled(form) { + for (let element of form.elements) { + if (element.id == "printer-picker" || element.id == "cancel-button") { + ok(!element.disabled, `${element.id} is enabled`); + } else { + ok(element.disabled, `${element.id} is disabled`); + } + } +} + +add_task(async function testSlowDestinationChange() { + await PrintHelper.withTestPage(async helper => { + let resolvePrinterInfo = await setupPrinters(helper); + await helper.startPrint(); + + let destinationPicker = helper.get("printer-picker"); + let printForm = helper.get("print"); + + info("Changing to fast printer should change settings"); + await helper.assertSettingsChanged( + { printerName: pdfPrinterName, orientation: 0 }, + { printerName: fastPrinterName, orientation: 0 }, + async () => { + await changeDestination(helper, "down"); + is(destinationPicker.value, fastPrinterName, "Fast printer selected"); + // Wait one frame so the print settings promises resolve. + await helper.awaitAnimationFrame(); + assertFormEnabled(printForm); + } + ); + + info("Changing to slow printer should not change settings yet"); + await helper.assertSettingsNotChanged( + { printerName: fastPrinterName, orientation: 0 }, + async () => { + await changeDestination(helper, "down"); + is(destinationPicker.value, slowPrinterName, "Slow printer selected"); + // Wait one frame, since the settings are blocked on resolvePrinterInfo + // the settings shouldn't change. + await helper.awaitAnimationFrame(); + assertFormDisabled(printForm); + } + ); + + await helper.assertSettingsChanged( + { printerName: fastPrinterName, orientation: 0 }, + { printerName: slowPrinterName, orientation: 1 }, + async () => { + resolvePrinterInfo(); + await helper.waitForSettingsEvent(); + assertFormEnabled(printForm); + } + ); + + await helper.closeDialog(); + }); +}); + +add_task(async function testSwitchAwayFromSlowDestination() { + await PrintHelper.withTestPage(async helper => { + let resolvePrinterInfo = await setupPrinters(helper); + await helper.startPrint(); + + let destinationPicker = helper.get("printer-picker"); + let printForm = helper.get("print"); + + // Load the fast printer. + await helper.waitForSettingsEvent(async () => { + await changeDestination(helper, "down"); + }); + await helper.awaitAnimationFrame(); + assertFormEnabled(printForm); + + // "Load" the slow printer. + await changeDestination(helper, "down"); + is(destinationPicker.value, slowPrinterName, "Slow printer selected"); + // Wait an animation frame, since there's no settings event. + await helper.awaitAnimationFrame(); + assertFormDisabled(printForm); + + // Switch back to the fast printer. + await helper.waitForSettingsEvent(async () => { + await changeDestination(helper, "up"); + }); + helper.assertSettingsMatch({ + printerName: fastPrinterName, + orientation: 0, + }); + + await helper.awaitAnimationFrame(); + assertFormEnabled(printForm); + + // Let the slow printer settings resolve, the orientation shouldn't change. + resolvePrinterInfo(); + // Wait so the settings event can trigger, if this case isn't handled. + await helper.awaitAnimationFrame(); + helper.assertSettingsMatch({ + printerName: fastPrinterName, + orientation: 0, + }); + assertFormEnabled(printForm); + + await helper.closeDialog(); + }); +}); |