Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* Any copyright is dedicated to the Public Domain.
"use strict";
add_task(async function testSheetCount() {
await PrintHelper.withTestPage(async helper => {
await helper.startPrint();
let sheetCountElement = helper.get("sheet-count");
let { id } = helper.doc.l10n.getAttributes(sheetCountElement);
is(id, "printui-sheets-count", "The l10n id is correct");
let initialSheetCount = helper.sheetCount;
Assert.greaterOrEqual(
initialSheetCount,
1,
"There is an initial sheet count"
);
await helper.openMoreSettings();
let scaleRadio = helper.get("percent-scale-choice");
await helper.waitForPreview(() => helper.click(scaleRadio));
let percentScale = helper.get("percent-scale");
await helper.waitForPreview(() => helper.text(percentScale, "200"));
let zoomedSheetCount = helper.sheetCount;
Assert.greater(
zoomedSheetCount,
initialSheetCount,
"The sheet count increased"
);
// Since we're using the Save to PDF printer, the numCopies element should
// be hidden and its value ignored.
let numCopies = helper.get("copies-count");
ok(BrowserTestUtils.isHidden(numCopies), "numCopies element is hidden");
helper.dispatchSettingsChange({
numCopies: 4,
});
is(
helper.sheetCount,
zoomedSheetCount,
"numCopies is ignored for Save to PDF printer"
);
is(helper.viewSettings.numCopies, 1, "numCopies is 1 in viewSettings");
// We don't have any "real" printers set up for testing yet, so insert a modified
// copy of the PDF printer which pretends to be real, and switch to that
// to triggers the component to update.
let realPrinterName = "My real printer";
let pdfPrinterInfo =
helper.win.PrintSettingsViewProxy.availablePrinters[
PrintUtils.SAVE_TO_PDF_PRINTER
];
let mockPrinterInfo = Object.assign({}, pdfPrinterInfo, {});
mockPrinterInfo.settings = pdfPrinterInfo.settings.clone();
mockPrinterInfo.settings.outputFormat =
Ci.nsIPrintSettings.kOutputFormatNative;
mockPrinterInfo.settings.printerName = realPrinterName;
helper.win.PrintSettingsViewProxy.availablePrinters[realPrinterName] =
mockPrinterInfo;
await helper.dispatchSettingsChange({
printerName: realPrinterName,
});
await helper.awaitAnimationFrame();
let { settings, viewSettings } = helper;
is(
settings.printerName,
realPrinterName,
"Sanity check the current settings have the new printerName"
);
is(
settings.outputFormat,
Ci.nsIPrintSettings.kOutputFormatNative,
"The new printer has the correct outputFormat"
);
is(viewSettings.numCopies, 4, "numCopies is 4 in viewSettings");
// numCopies is now visible and sheetCount is multiplied by numCopies.
ok(BrowserTestUtils.isVisible(numCopies), "numCopies element is visible");
is(numCopies.value, "4", "numCopies displays the correct value");
is(
helper.sheetCount,
zoomedSheetCount * 4,
"numCopies is used when using a non-PDF printer"
);
await helper.closeDialog();
});
});
add_task(async function testSheetCountPageRange() {
await PrintHelper.withTestPage(async helper => {
await helper.startPrint();
await helper.waitForPreview(() =>
helper.dispatchSettingsChange({
shrinkToFit: false,
scaling: 2,
})
);
await BrowserTestUtils.waitForCondition(
() => helper.sheetCount != 1,
"Wait for sheet count to update"
);
let sheets = helper.sheetCount;
Assert.greaterOrEqual(sheets, 3, "There are at least 3 pages");
// Set page range to 2-3, sheet count should be 2.
await helper.waitForPreview(() =>
helper.dispatchSettingsChange({
pageRanges: [2, 3],
})
);
sheets = helper.sheetCount;
is(sheets, 2, "There are now only 2 pages shown");
});
});
// Test that enabling duplex printing updates the sheet count accordingly.
add_task(async function testSheetCountDuplex() {
await PrintHelper.withTestPage(async helper => {
const mockPrinterName = "DuplexCapablePrinter";
const printer = helper.addMockPrinter(mockPrinterName);
printer.supportsDuplex = Promise.resolve(true);
await helper.startPrint();
await helper.dispatchSettingsChange({ printerName: mockPrinterName });
// Set scale and shinkToFit to make the document
// bigger so that it spans multiple pages.
await helper.waitForPreview(() =>
helper.dispatchSettingsChange({
shrinkToFit: false,
scaling: 4,
duplex: Ci.nsIPrintSettings.kDuplexNone,
})
);
await BrowserTestUtils.waitForCondition(
() => helper.sheetCount != 1,
"Wait for sheet count to update"
);
let singleSidedSheets = helper.sheetCount;
Assert.greaterOrEqual(singleSidedSheets, 2, "There are at least 2 pages");
// Turn on long-edge duplex printing and ensure the sheet count is halved.
await helper.waitForSettingsEvent(() =>
helper.dispatchSettingsChange({
duplex: Ci.nsIPrintSettings.kDuplexFlipOnLongEdge,
})
);
await BrowserTestUtils.waitForCondition(
() => helper.sheetCount != singleSidedSheets,
"Wait for sheet count to update"
);
let duplexLongEdgeSheets = helper.sheetCount;
is(
duplexLongEdgeSheets,
Math.ceil(singleSidedSheets / 2),
"Long-edge duplex printing halved the sheet count"
);
// Turn off duplex printing
await helper.waitForSettingsEvent(() =>
helper.dispatchSettingsChange({
duplex: Ci.nsIPrintSettings.kDuplexNone,
})
);
await BrowserTestUtils.waitForCondition(
() => helper.sheetCount == singleSidedSheets,
"Wait for sheet count to update"
);
// Turn on short-edge duplex printing and ensure the
// sheet count matches the long-edge duplex sheet count.
await helper.waitForSettingsEvent(() =>
helper.dispatchSettingsChange({
duplex: Ci.nsIPrintSettings.kDuplexFlipOnShortEdge,
})
);
await BrowserTestUtils.waitForCondition(
() => helper.sheetCount != singleSidedSheets,
"Wait for sheet count to update"
);
let duplexShortEdgeSheets = helper.sheetCount;
is(
duplexShortEdgeSheets,
duplexLongEdgeSheets,
"Short-edge duplex printing halved the sheet count"
);
});
});
// Test that enabling duplex printing with multiple copies updates the
// sheet count accordingly.
add_task(async function testSheetCountDuplexWithCopies() {
// Use different scale values to exercise printing of different page counts
for (let scale of [2, 3, 4, 5]) {
await TestDuplexNumCopiesAtScale(scale);
}
});
// Enable duplex and numCopies=2 with the provided scale value and check
// that the sheet count is correct.
async function TestDuplexNumCopiesAtScale(scale) {
await PrintHelper.withTestPage(async helper => {
const mockPrinterName = "DuplexCapablePrinter";
const printer = helper.addMockPrinter(mockPrinterName);
printer.supportsDuplex = Promise.resolve(true);
await helper.startPrint();
await helper.dispatchSettingsChange({ printerName: mockPrinterName });
// Set scale and shinkToFit to make the document
// bigger so that it spans multiple pages.
await helper.waitForPreview(() =>
helper.dispatchSettingsChange({
shrinkToFit: false,
scaling: scale,
duplex: Ci.nsIPrintSettings.kDuplexNone,
})
);
await BrowserTestUtils.waitForCondition(
() => helper.sheetCount != 1,
"Wait for sheet count to update"
);
let singleSidedSheets = helper.sheetCount;
// Chnage to two copies
await helper.waitForSettingsEvent(() =>
helper.dispatchSettingsChange({
numCopies: 2,
})
);
await BrowserTestUtils.waitForCondition(
() => helper.sheetCount != singleSidedSheets,
"Wait for sheet count to update"
);
let twoCopiesSheetCount = helper.sheetCount;
// Turn on duplex printing.
await helper.waitForSettingsEvent(() =>
helper.dispatchSettingsChange({
duplex: Ci.nsIPrintSettings.kDuplexFlipOnLongEdge,
})
);
await BrowserTestUtils.waitForCondition(
() => helper.sheetCount != twoCopiesSheetCount,
"Wait for sheet count to update"
);
let duplexTwoCopiesSheetCount = helper.sheetCount;
// Check sheet count accounts for duplex and numCopies.
is(
duplexTwoCopiesSheetCount,
Math.ceil(singleSidedSheets / 2) * 2,
"Duplex with 2 copies sheet count is correct"
);
await helper.closeDialog();
});
}
add_task(async function testPagesPerSheetCount() {
await PrintHelper.withTestPage(async helper => {
let mockPrinterName = "A real printer!";
helper.addMockPrinter(mockPrinterName);
await SpecialPowers.pushPrefEnv({
set: [["print_printer", mockPrinterName]],
});
await helper.startPrint();
await helper.waitForPreview(() =>
helper.dispatchSettingsChange({
shrinkToFit: false,
scaling: 2,
})
);
await BrowserTestUtils.waitForCondition(
() => helper.sheetCount != 1,
"Wait for sheet count to update"
);
let sheets = helper.sheetCount;
Assert.greater(sheets, 1, "There are multiple pages");
await helper.openMoreSettings();
let pagesPerSheet = helper.get("pages-per-sheet-picker");
ok(BrowserTestUtils.isVisible(pagesPerSheet), "Pages per sheet is shown");
pagesPerSheet.focus();
let popupOpen = BrowserTestUtils.waitForSelectPopupShown(window);
EventUtils.sendKey("space", helper.win);
await popupOpen;
let numberMove =
[...pagesPerSheet.options].map(o => o.value).indexOf("16") -
pagesPerSheet.selectedIndex;
for (let i = 0; i < numberMove; i++) {
EventUtils.sendKey("down", window);
if (document.activeElement.value == 16) {
break;
}
}
await helper.waitForPreview(() => EventUtils.sendKey("return", window));
sheets = helper.sheetCount;
is(sheets, 1, "There's only one sheet now");
await helper.waitForSettingsEvent(() =>
helper.dispatchSettingsChange({ numCopies: 5 })
);
sheets = helper.sheetCount;
is(sheets, 5, "Copies are handled with pages per sheet correctly");
await helper.closeDialog();
});
});
add_task(async function testUpdateCopiesNoPreviewUpdate() {
const mockPrinterName = "Fake Printer";
await PrintHelper.withTestPage(async helper => {
helper.addMockPrinter(mockPrinterName);
await helper.startPrint();
await helper.waitForSettingsEvent(() =>
helper.dispatchSettingsChange({ numCopies: 5 })
);
ok(
!helper.win.PrintEventHandler._updatePrintPreviewTask.isArmed,
"Preview Task is not armed"
);
await helper.waitForPreview(() =>
helper.dispatchSettingsChange({ printerName: mockPrinterName })
);
await helper.waitForSettingsEvent(() =>
helper.dispatchSettingsChange({ numCopies: 2 })
);
ok(
!helper.win.PrintEventHandler._updatePrintPreviewTask.isArmed,
"Preview Task is not armed"
);
await helper.closeDialog();
});
});