diff options
Diffstat (limited to 'toolkit/components/printing/tests/browser_print_page_range.js')
-rw-r--r-- | toolkit/components/printing/tests/browser_print_page_range.js | 540 |
1 files changed, 540 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..c19a09f820 --- /dev/null +++ b/toolkit/components/printing/tests/browser_print_page_range.js @@ -0,0 +1,540 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +async function changeRangeTo(helper, destination) { + info(`changeRangeTo(${destination})`); + let rangeSelect = helper.get("range-picker"); + let options = getRangeOptions(helper); + let numberMove = + options.indexOf(destination) - options.indexOf(rangeSelect.value); + let direction = numberMove > 0 ? "down" : "up"; + if (!numberMove) { + return; + } + + let input = BrowserTestUtils.waitForEvent(rangeSelect, "input"); + + let popupOpen = BrowserTestUtils.waitForSelectPopupShown(window); + + rangeSelect.focus(); + rangeSelect.scrollIntoView({ block: "center" }); + EventUtils.sendKey("space", helper.win); + + await popupOpen; + for (let i = Math.abs(numberMove); i > 0; i--) { + EventUtils.sendKey(direction, window); + } + EventUtils.sendKey("return", window); + + await input; +} + +function getRangeOptions(helper) { + let rangeSelect = helper.get("range-picker"); + let options = []; + for (let el of rangeSelect.options) { + if (!el.disabled) { + options.push(el.value); + } + } + return options; +} + +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"); + await changeRangeTo(helper, "custom"); + + 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"); + await changeRangeTo(helper, "custom"); + 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 () => { + await changeRangeTo(helper, "custom"); + }); + 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"); + + await changeRangeTo(helper, "custom"); + await BrowserTestUtils.waitForAttributeRemoval("hidden", customRange); + + ok(!customRange.hidden, "Custom range is showing"); + is(helper.doc.activeElement, customRange, "Custom range field is focused"); + + // 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, 50], + "-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(); + ok( + expected.length == pageRanges.length && + expected.every((page, index) => page === pageRanges[index]), + `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 testPageRangeSelect() { + await PrintHelper.withTestPage(async helper => { + await helper.startPrint(); + + let pageRangeInput = helper.get("page-range-input"); + + await changeRangeTo(helper, "all"); + let pageRanges = pageRangeInput.formatPageRange(); + ok(!pageRanges.length, "Page range for all should be []"); + + await changeRangeTo(helper, "current"); + pageRanges = pageRangeInput.formatPageRange(); + ok( + pageRanges.length == 2 && + [1, 1].every((page, index) => page === pageRanges[index]), + "The first page should be the current page" + ); + + pageRangeInput._validateRangeInput("9", 50); + pageRanges = pageRangeInput.formatPageRange(); + ok( + pageRanges.length == 2 && + [9, 9].every((page, index) => page === pageRanges[index]), + `Expected page range for "${pageRanges}" matches [9, 9]"` + ); + + await changeRangeTo(helper, "odd"); + pageRanges = pageRangeInput.formatPageRange(); + ok( + pageRanges.length == 4 && + [1, 1, 3, 3].every((page, index) => page === pageRanges[index]), + "Page range for odd should be [1, 1, 3, 3]" + ); + + await changeRangeTo(helper, "even"); + pageRanges = pageRangeInput.formatPageRange(); + ok( + pageRanges.length == 2 && + [2, 2].every((page, index) => page === pageRanges[index]), + "Page range for even should be [2, 2]" + ); + }, "longerArticle.html"); +}); + +add_task(async function testRangeError() { + await PrintHelper.withTestPage(async helper => { + await helper.startPrint(); + + await changeRangeTo(helper, "custom"); + + 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(); + + await changeRangeTo(helper, "custom"); + + 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(); + + await changeRangeTo(helper, "custom"); + + 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"); + + await changeRangeTo(helper, "all"); + + await BrowserTestUtils.waitForCondition( + () => rangeError.hidden, + "Wait for range error to be hidden" + ); + ok(customRange.hidden, "Custom range is hidden"); + is( + helper.doc.activeElement, + helper.get("range-picker"), + "Range picker remains focused" + ); + 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 () => { + await changeRangeTo(helper, "custom"); + 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 () => { + await changeRangeTo(helper, "custom"); + 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(); + }); +}); |