summaryrefslogtreecommitdiffstats
path: root/toolkit/components/printing/tests/browser_print_page_range.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/printing/tests/browser_print_page_range.js')
-rw-r--r--toolkit/components/printing/tests/browser_print_page_range.js471
1 files changed, 471 insertions, 0 deletions
diff --git a/toolkit/components/printing/tests/browser_print_page_range.js b/toolkit/components/printing/tests/browser_print_page_range.js
new file mode 100644
index 0000000000..d5d64262c0
--- /dev/null
+++ b/toolkit/components/printing/tests/browser_print_page_range.js
@@ -0,0 +1,471 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+function changeAllToCustom(helper) {
+ let rangeSelect = helper.get("range-picker");
+ rangeSelect.focus();
+ rangeSelect.scrollIntoView({ block: "center" });
+ EventUtils.sendKey("space", helper.win);
+ EventUtils.sendKey("down", helper.win);
+ EventUtils.sendKey("return", helper.win);
+}
+
+function changeCustomToAll(helper) {
+ let rangeSelect = helper.get("range-picker");
+ rangeSelect.focus();
+ rangeSelect.scrollIntoView({ block: "center" });
+ EventUtils.sendKey("space", helper.win);
+ EventUtils.sendKey("up", helper.win);
+ EventUtils.sendKey("return", helper.win);
+}
+
+function getSheetCount(helper) {
+ return helper.doc.l10n.getAttributes(helper.get("sheet-count")).args
+ .sheetCount;
+}
+
+add_task(async function testRangeResetAfterScale() {
+ const mockPrinterName = "Fake Printer";
+ await PrintHelper.withTestPage(async helper => {
+ helper.addMockPrinter(mockPrinterName);
+ await helper.startPrint();
+ await helper.setupMockPrint();
+
+ helper.mockFilePicker("changeRangeFromScale.pdf");
+ changeAllToCustom(helper);
+
+ 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 customRange = helper.get("custom-range");
+ let rangeError = helper.get("error-invalid-range");
+ await helper.waitForPreview(() => {
+ helper.text(customRange, "3");
+ });
+
+ ok(rangeError.hidden, "Range error is hidden");
+
+ await helper.text(percentScale, "10");
+ EventUtils.sendKey("return", helper.win);
+
+ await BrowserTestUtils.waitForAttributeRemoval("hidden", rangeError);
+ ok(!rangeError.hidden, "Range error is showing");
+ await helper.closeDialog();
+ });
+});
+
+add_task(async function testRangeResetAfterPaperSize() {
+ await PrintHelper.withTestPage(async helper => {
+ await helper.startPrint();
+ await helper.waitForPreview(() =>
+ helper.dispatchSettingsChange({ paperId: "iso_a5" })
+ );
+ await helper.setupMockPrint();
+
+ 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 customRange = helper.get("custom-range");
+ changeAllToCustom(helper);
+ await BrowserTestUtils.waitForAttributeRemoval("hidden", customRange);
+
+ let rangeError = helper.get("error-invalid-range");
+ await helper.waitForPreview(() => {
+ helper.text(customRange, "6");
+ });
+
+ ok(rangeError.hidden, "Range error is hidden");
+
+ helper.dispatchSettingsChange({ paperId: "iso_a3" });
+ await BrowserTestUtils.waitForCondition(
+ () => helper.get("paper-size-picker").value == "iso_a3",
+ "Wait for paper size select to update"
+ );
+ EventUtils.sendKey("return", helper.win);
+
+ await BrowserTestUtils.waitForAttributeRemoval("hidden", rangeError);
+ ok(!rangeError.hidden, "Range error is showing");
+ await helper.closeDialog();
+ });
+});
+
+add_task(async function testInvalidRangeResetAfterDestinationChange() {
+ const mockPrinterName = "Fake Printer";
+ await PrintHelper.withTestPage(async helper => {
+ helper.addMockPrinter(mockPrinterName);
+ await helper.startPrint();
+
+ let destinationPicker = helper.get("printer-picker");
+ let customPageRange = helper.get("custom-range");
+
+ await helper.assertSettingsNotChanged({ pageRanges: [] }, async () => {
+ changeAllToCustom(helper);
+ });
+ let rangeError = helper.get("error-invalid-range");
+
+ await helper.assertSettingsNotChanged({ pageRanges: [] }, async () => {
+ ok(rangeError.hidden, "Range error is hidden");
+ await helper.text(customPageRange, "9");
+ await BrowserTestUtils.waitForAttributeRemoval("hidden", rangeError);
+ ok(!rangeError.hidden, "Range error is showing");
+ });
+
+ is(destinationPicker.disabled, false, "Destination picker is enabled");
+
+ // Select a new printer
+ helper.dispatchSettingsChange({ printerName: mockPrinterName });
+ await BrowserTestUtils.waitForCondition(
+ () => rangeError.hidden,
+ "Wait for range error to be hidden"
+ );
+ is(customPageRange.value, "", "Page range has reset");
+ await helper.closeDialog();
+ });
+});
+
+add_task(async function testPageRangeSets() {
+ await PrintHelper.withTestPage(async helper => {
+ await helper.startPrint();
+
+ let customRange = helper.get("custom-range");
+ let pageRangeInput = helper.get("page-range-input");
+ let invalidError = helper.get("error-invalid-range");
+ let invalidOverflowError = helper.get("error-invalid-start-range-overflow");
+
+ ok(customRange.hidden, "Custom range input is hidden");
+
+ changeAllToCustom(helper);
+ await BrowserTestUtils.waitForAttributeRemoval("hidden", customRange);
+
+ ok(!customRange.hidden, "Custom range is showing");
+
+ // We need to set the input to something to ensure we do not return early
+ // out of our validation function
+ helper.text(helper.get("custom-range"), ",");
+
+ let validStrings = {
+ "1": [1, 1],
+ "1,": [1, 1],
+ "2": [2, 2],
+ "1-2": [1, 2],
+ "1,2": [1, 2],
+ "1,2,": [1, 2],
+ "2,1": [1, 2],
+ "1,3": [1, 1, 3, 3],
+ "1-1,3": [1, 1, 3, 3],
+ "1,3-3": [1, 1, 3, 3],
+ "10-33": [10, 33],
+ "1-": [1, 50],
+ "-": [],
+ "-20": [1, 20],
+ "-,1": [],
+ "-1,1-": [],
+ "-1,1-2": [1, 2],
+ ",9": [9, 9],
+ ",": [],
+ "1,2,1,20,5": [1, 2, 5, 5, 20, 20],
+ "1-17,4,12-19": [1, 19],
+ "43-46,42,47-": [42, 50],
+ };
+
+ for (let [str, expected] of Object.entries(validStrings)) {
+ pageRangeInput._validateRangeInput(str, 50);
+ let pageRanges = pageRangeInput.formatPageRange();
+
+ is(
+ expected.every((page, index) => page === pageRanges[index]),
+ true,
+ `Expected page range for "${str}" matches "${expected}"`
+ );
+
+ ok(invalidError.hidden, "Generic error message is hidden");
+ ok(invalidOverflowError.hidden, "Start overflow error message is hidden");
+ }
+
+ let invalidStrings = ["51", "1,51", "1-51", "4-1", "--", "0", "-90"];
+
+ for (let str of invalidStrings) {
+ pageRangeInput._validateRangeInput(str, 50);
+ is(pageRangeInput._pagesSet.size, 0, `There are no pages in the set`);
+ ok(!pageRangeInput.validity, "Input is invalid");
+ }
+
+ await helper.closeDialog();
+ });
+});
+
+add_task(async function testRangeError() {
+ await PrintHelper.withTestPage(async helper => {
+ await helper.startPrint();
+
+ changeAllToCustom(helper);
+
+ let invalidError = helper.get("error-invalid-range");
+ let invalidOverflowError = helper.get("error-invalid-start-range-overflow");
+
+ ok(invalidError.hidden, "Generic error message is hidden");
+ ok(invalidOverflowError.hidden, "Start overflow error message is hidden");
+
+ helper.text(helper.get("custom-range"), "4");
+
+ await BrowserTestUtils.waitForAttributeRemoval("hidden", invalidError);
+
+ ok(!invalidError.hidden, "Generic error message is showing");
+ ok(invalidOverflowError.hidden, "Start overflow error message is hidden");
+
+ await helper.closeDialog();
+ });
+});
+
+add_task(async function testStartOverflowRangeError() {
+ await PrintHelper.withTestPage(async helper => {
+ await helper.startPrint();
+
+ changeAllToCustom(helper);
+
+ 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 invalidError = helper.get("error-invalid-range");
+ let invalidOverflowError = helper.get("error-invalid-start-range-overflow");
+
+ ok(invalidError.hidden, "Generic error message is hidden");
+ ok(invalidOverflowError.hidden, "Start overflow error message is hidden");
+
+ helper.text(helper.get("custom-range"), "2-1");
+
+ await BrowserTestUtils.waitForAttributeRemoval(
+ "hidden",
+ invalidOverflowError
+ );
+
+ ok(invalidError.hidden, "Generic error message is hidden");
+ ok(!invalidOverflowError.hidden, "Start overflow error message is showing");
+
+ await helper.closeDialog();
+ });
+});
+
+add_task(async function testErrorClearedAfterSwitchingToAll() {
+ await PrintHelper.withTestPage(async helper => {
+ await helper.startPrint();
+
+ changeAllToCustom(helper);
+
+ let customRange = helper.get("custom-range");
+ let rangeError = helper.get("error-invalid-range");
+ ok(rangeError.hidden, "Generic error message is hidden");
+
+ helper.text(customRange, "3");
+
+ await BrowserTestUtils.waitForAttributeRemoval("hidden", rangeError);
+ ok(!rangeError.hidden, "Generic error message is showing");
+
+ changeCustomToAll(helper);
+
+ await BrowserTestUtils.waitForCondition(
+ () => rangeError.hidden,
+ "Wait for range error to be hidden"
+ );
+ ok(customRange.hidden, "Custom range is hidden");
+ await helper.closeDialog();
+ });
+});
+
+add_task(async function testPageCountChangeNoRangeNoRerender() {
+ await PrintHelper.withTestPage(async helper => {
+ let customPrinter = "A printer";
+ helper.addMockPrinter(customPrinter);
+
+ await helper.startPrint();
+
+ await helper.assertSettingsChanged(
+ { printerName: "Mozilla Save to PDF" },
+ { printerName: customPrinter },
+ async () => {
+ let destinationPicker = helper.get("printer-picker");
+ destinationPicker.focus();
+ await Promise.all([
+ helper.waitForPreview(() =>
+ helper.dispatchSettingsChange({ printerName: customPrinter })
+ ),
+ helper.waitForSettingsEvent(),
+ ]);
+ }
+ );
+
+ // Change a setting that will change the number of pages. Since pageRanges
+ // is set to "all" then there shouldn't be a re-render because of it.
+ let previewUpdateCount = 0;
+ ok(!helper.hasPendingPreview, "No preview is pending");
+ helper.doc.addEventListener("preview-updated", () => previewUpdateCount++);
+
+ // Ensure the sheet count will change.
+ let initialSheetCount = getSheetCount(helper);
+
+ await helper.assertSettingsChanged(
+ { marginLeft: 0.5, marginRight: 0.5 },
+ { marginLeft: 3, marginRight: 3 },
+ async () => {
+ await Promise.all([
+ helper.waitForPreview(() =>
+ helper.dispatchSettingsChange({ marginLeft: 3, marginRight: 3 })
+ ),
+ BrowserTestUtils.waitForEvent(helper.doc, "page-count"),
+ helper.waitForSettingsEvent(),
+ ]);
+ }
+ );
+
+ let newSheetCount = getSheetCount(helper);
+ ok(
+ initialSheetCount < newSheetCount,
+ `There are more sheets now ${initialSheetCount} < ${newSheetCount}`
+ );
+
+ ok(!helper.hasPendingPreview, "No preview is pending");
+ is(previewUpdateCount, 1, "Only one preview update fired");
+
+ await helper.closeDialog();
+ });
+});
+
+add_task(async function testPageCountChangeRangeNoRerender() {
+ await PrintHelper.withTestPage(async helper => {
+ let customPrinter = "A printer";
+ helper.addMockPrinter(customPrinter);
+
+ await helper.startPrint();
+
+ await helper.assertSettingsChanged(
+ { printerName: "Mozilla Save to PDF", pageRanges: [] },
+ { printerName: customPrinter, pageRanges: [1, 1] },
+ async () => {
+ let destinationPicker = helper.get("printer-picker");
+ destinationPicker.focus();
+ await Promise.all([
+ helper.waitForPreview(() =>
+ helper.dispatchSettingsChange({ printerName: customPrinter })
+ ),
+ helper.waitForSettingsEvent(),
+ ]);
+
+ await helper.waitForPreview(async () => {
+ changeAllToCustom(helper);
+ helper.text(helper.get("custom-range"), "1");
+ });
+ }
+ );
+
+ // Change a setting that will change the number of pages. Since pageRanges
+ // is set to a page that is in the new range, there shouldn't be a re-render.
+ let previewUpdateCount = 0;
+ ok(!helper.hasPendingPreview, "No preview is pending");
+ helper.doc.addEventListener("preview-updated", () => previewUpdateCount++);
+
+ await helper.assertSettingsChanged(
+ { marginLeft: 0.5, marginRight: 0.5 },
+ { marginLeft: 3, marginRight: 3 },
+ async () => {
+ await Promise.all([
+ helper.waitForPreview(() =>
+ helper.dispatchSettingsChange({ marginLeft: 3, marginRight: 3 })
+ ),
+ BrowserTestUtils.waitForEvent(helper.doc, "page-count"),
+ helper.waitForSettingsEvent(),
+ ]);
+ }
+ );
+
+ let newSheetCount = getSheetCount(helper);
+ is(newSheetCount, 1, "There's still only one sheet");
+
+ ok(!helper.hasPendingPreview, "No preview is pending");
+ is(previewUpdateCount, 1, "Only one preview update fired");
+
+ await helper.closeDialog();
+ });
+});
+
+add_task(async function testPageCountChangeRangeRerender() {
+ await PrintHelper.withTestPage(async helper => {
+ let customPrinter = "A printer";
+ helper.addMockPrinter(customPrinter);
+
+ await helper.startPrint();
+
+ await helper.assertSettingsChanged(
+ { printerName: "Mozilla Save to PDF", pageRanges: [] },
+ { printerName: customPrinter, pageRanges: [1, 1] },
+ async () => {
+ let destinationPicker = helper.get("printer-picker");
+ destinationPicker.focus();
+ await Promise.all([
+ helper.waitForPreview(() =>
+ helper.dispatchSettingsChange({ printerName: customPrinter })
+ ),
+ helper.waitForSettingsEvent(),
+ ]);
+
+ await helper.waitForPreview(async () => {
+ changeAllToCustom(helper);
+ helper.text(helper.get("custom-range"), "1-");
+ });
+ }
+ );
+
+ // Change a setting that will change the number of pages. Since pageRanges
+ // is from 1-N the calculated page range will need to be updated.
+ let previewUpdateCount = 0;
+ ok(!helper.hasPendingPreview, "No preview is pending");
+ helper.doc.addEventListener("preview-updated", () => previewUpdateCount++);
+ let renderedTwice = BrowserTestUtils.waitForCondition(
+ () => previewUpdateCount == 2
+ );
+
+ // Ensure the sheet count will change.
+ let initialSheetCount = getSheetCount(helper);
+
+ await helper.assertSettingsChanged(
+ { marginLeft: 0.5, marginRight: 0.5 },
+ { marginLeft: 3, marginRight: 3 },
+ async () => {
+ await Promise.all([
+ helper.waitForPreview(() =>
+ helper.dispatchSettingsChange({ marginLeft: 3, marginRight: 3 })
+ ),
+ BrowserTestUtils.waitForEvent(helper.doc, "page-count"),
+ helper.waitForSettingsEvent(),
+ ]);
+ await renderedTwice;
+ }
+ );
+
+ let newSheetCount = getSheetCount(helper);
+ ok(
+ initialSheetCount < newSheetCount,
+ `There are more sheets now ${initialSheetCount} < ${newSheetCount}`
+ );
+ Assert.deepEqual(
+ helper.viewSettings.pageRanges,
+ [1, newSheetCount],
+ "The new range is the updated full page range"
+ );
+
+ ok(!helper.hasPendingPreview, "No preview is pending");
+ is(previewUpdateCount, 2, "Preview updated again to show new page range");
+
+ await helper.closeDialog();
+ });
+});