fune/toolkit/components/printing/tests/browser_destination_change.js
Emilio Cobos Álvarez 7829e5aab5 Bug 1774378 - Make select code harder to mess up. r=Gijs
Right now we rely on the menulist to be injected by hand in all the
relevant windows. Instead create it lazily, making the select code more
standalone.

The DevTools window was missing it, for example.

Differential Revision: https://phabricator.services.mozilla.com/D149620
2022-06-21 21:42:58 +00:00

155 lines
4.7 KiB
JavaScript

/* 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();
});
});