fune/toolkit/components/printing/tests/browser_print_duplex.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

212 lines
6.4 KiB
JavaScript

/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function changeToOption(helper, index) {
return helper.waitForSettingsEvent(async function() {
let select = helper.get("duplex-select");
select.focus();
select.scrollIntoView({ block: "center" });
let popupOpen = BrowserTestUtils.waitForSelectPopupShown(window);
EventUtils.sendKey("space", helper.win);
await popupOpen;
let selectedIndex = select.selectedIndex;
info(`Looking for ${index} from ${selectedIndex}`);
while (selectedIndex != index) {
if (index > selectedIndex) {
EventUtils.sendKey("down", window);
selectedIndex++;
} else {
EventUtils.sendKey("up", window);
selectedIndex--;
}
}
EventUtils.sendKey("return", window);
});
}
add_task(async function testPDFPrinterIsNonDuplex() {
await PrintHelper.withTestPage(async helper => {
await helper.startPrint();
await helper.openMoreSettings();
is(
helper.settings.printerName,
"Mozilla Save to PDF",
"Mozilla Save to PDF is the current printer."
);
const duplexSection = helper.get("two-sided-printing");
ok(
duplexSection.hidden,
"The two-sided printing section should be hidden when the printer does not support duplex."
);
helper.assertSettingsMatch({ duplex: Ci.nsIPrintSettings.kDuplexNone });
await helper.closeDialog();
});
});
add_task(async function testToggleDuplexWithPortraitOrientation() {
const mockPrinterName = "DuplexWithPortrait";
await PrintHelper.withTestPage(async helper => {
const printer = helper.addMockPrinter(mockPrinterName);
printer.supportsDuplex = Promise.resolve(true);
await helper.startPrint();
await helper.dispatchSettingsChange({ printerName: mockPrinterName });
await helper.awaitAnimationFrame();
await helper.openMoreSettings();
is(
helper.settings.printerName,
mockPrinterName,
"The Fake Printer is current printer"
);
const duplexSection = helper.get("two-sided-printing");
ok(
!duplexSection.hidden,
"The two-sided printing section should not be hidden when the printer supports duplex."
);
helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kPortraitOrientation,
duplex: Ci.nsIPrintSettings.kDuplexNone,
});
await changeToOption(helper, 1);
helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kPortraitOrientation,
duplex: Ci.nsIPrintSettings.kDuplexFlipOnLongEdge,
});
await changeToOption(helper, 2);
helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kPortraitOrientation,
duplex: Ci.nsIPrintSettings.kDuplexFlipOnShortEdge,
});
await changeToOption(helper, 0);
helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kPortraitOrientation,
duplex: Ci.nsIPrintSettings.kDuplexNone,
});
await helper.closeDialog();
});
});
add_task(async function testToggleDuplexWithLandscapeOrientation() {
const mockPrinterName = "DuplexWithLandscape";
await PrintHelper.withTestPage(async helper => {
const printer = helper.addMockPrinter(mockPrinterName);
printer.supportsDuplex = Promise.resolve(true);
await helper.startPrint();
await helper.dispatchSettingsChange({ printerName: mockPrinterName });
await helper.awaitAnimationFrame();
await helper.openMoreSettings();
is(
helper.settings.printerName,
mockPrinterName,
"The Fake Printer is current printer"
);
const duplexSection = helper.get("two-sided-printing");
ok(
!duplexSection.hidden,
"The two-sided printing section should not be hidden when the printer supports duplex."
);
await helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kPortraitOrientation,
duplex: Ci.nsIPrintSettings.kDuplexNone,
});
await helper.dispatchSettingsChange({ orientation: 1 });
await helper.awaitAnimationFrame();
await helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kLandscapeOrientation,
duplex: Ci.nsIPrintSettings.kDuplexNone,
});
await changeToOption(helper, 1);
helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kLandscapeOrientation,
duplex: Ci.nsIPrintSettings.kDuplexFlipOnLongEdge,
});
await changeToOption(helper, 2);
helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kLandscapeOrientation,
duplex: Ci.nsIPrintSettings.kDuplexFlipOnShortEdge,
});
await changeToOption(helper, 0);
helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kLandscapeOrientation,
duplex: Ci.nsIPrintSettings.kDuplexNone,
});
await helper.closeDialog();
});
});
add_task(async function testSwitchOrientationWithDuplexEnabled() {
const mockPrinterName = "ToggleOrientationPrinter";
await PrintHelper.withTestPage(async helper => {
const printer = helper.addMockPrinter(mockPrinterName);
printer.supportsDuplex = Promise.resolve(true);
await helper.startPrint();
await helper.dispatchSettingsChange({ printerName: mockPrinterName });
await helper.awaitAnimationFrame();
await helper.openMoreSettings();
is(
helper.settings.printerName,
mockPrinterName,
"The Fake Printer is current printer"
);
const duplexSection = helper.get("two-sided-printing");
ok(
!duplexSection.hidden,
"The two-sided printing section should not be hidden when the printer supports duplex."
);
await helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kPortraitOrientation,
duplex: Ci.nsIPrintSettings.kDuplexNone,
});
await changeToOption(helper, 1);
await helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kPortraitOrientation,
duplex: Ci.nsIPrintSettings.kDuplexFlipOnLongEdge,
});
await helper.dispatchSettingsChange({ orientation: 1 });
await helper.awaitAnimationFrame();
await helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kLandscapeOrientation,
duplex: Ci.nsIPrintSettings.kDuplexFlipOnLongEdge,
});
await helper.dispatchSettingsChange({ orientation: 0 });
await helper.awaitAnimationFrame();
await helper.assertSettingsMatch({
orientation: Ci.nsIPrintSettings.kPortraitOrientation,
duplex: Ci.nsIPrintSettings.kDuplexFlipOnLongEdge,
});
await helper.closeDialog();
});
});