364 lines
11 KiB
JavaScript
364 lines
11 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"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();
|
|
});
|
|
});
|