/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ const frameSource = "some textother text"; const sources = [ ``, ``, ]; async function getPreviewText(previewBrowser) { return SpecialPowers.spawn(previewBrowser, [], function () { return content.document.body.textContent; }); } add_task(async function print_selection() { let i = 0; for (let source of sources) { is( document.querySelector(".printPreviewBrowser"), null, "There shouldn't be any print preview browser" ); await BrowserTestUtils.withNewTab( "data:text/html," + source, async function (browser) { let frameBC = browser.browsingContext.children[0]; await SpecialPowers.spawn(frameBC, [], () => { let element = content.document.getElementById("other"); content.focus(); content.getSelection().selectAllChildren(element); }); let helper = new PrintHelper(browser); // If you change this, change nsContextMenu.printSelection() too. PrintUtils.startPrintWindow(frameBC, { printSelectionOnly: true, }); await waitForPreviewVisible(); let previewBrowser = document.querySelector( ".printPreviewBrowser[previewtype='selection']" ); let previewText = () => getPreviewText(previewBrowser); // The preview process is async, wait for it to not be empty. let textContent = await TestUtils.waitForCondition(previewText); is(textContent, "other text", "Correct content loaded"); let printSelect = document .querySelector(".printSettingsBrowser") .contentDocument.querySelector("#source-version-selection-radio"); ok( BrowserTestUtils.isVisible(printSelect), "Print selection checkbox is shown" ); ok(printSelect.checked, "Print selection checkbox is checked"); let file = helper.mockFilePicker(`browser_print_selection-${i++}.pdf`); await helper.assertPrintToFile(file, () => { helper.click(helper.get("print-button")); }); PrintHelper.resetPrintPrefs(); } ); } }); add_task(async function print_selection_parent_process() { is( document.querySelector(".printPreviewBrowser"), null, "There shouldn't be any print preview browser" ); await BrowserTestUtils.withNewTab("about:support", async function (browser) { ok(!browser.isRemoteBrowser, "Page loaded in parent process"); let selectedText = await SpecialPowers.spawn( browser.browsingContext, [], () => { let element = content.document.querySelector("h1"); content.focus(); content.getSelection().selectAllChildren(element); return element.textContent; } ); ok(selectedText, "There is selected text"); let helper = new PrintHelper(browser); // If you change this, change nsContextMenu.printSelection() too. PrintUtils.startPrintWindow(browser.browsingContext, { printSelectionOnly: true, }); await waitForPreviewVisible(); let previewBrowser = document.querySelector( ".printPreviewBrowser[previewtype='selection']" ); let previewText = () => getPreviewText(previewBrowser); // The preview process is async, wait for it to not be empty. let textContent = await TestUtils.waitForCondition(previewText); is(textContent, selectedText, "Correct content loaded"); let printSelect = document .querySelector(".printSettingsBrowser") .contentDocument.querySelector("#source-version-selection-radio"); ok( BrowserTestUtils.isVisible(printSelect), "Print selection checkbox is shown" ); ok(printSelect.checked, "Print selection checkbox is checked"); let file = helper.mockFilePicker(`browser_print_selection_parent.pdf`); await helper.assertPrintToFile(file, () => { helper.click(helper.get("print-button")); }); PrintHelper.resetPrintPrefs(); }); }); add_task(async function no_print_selection() { // Ensures the print selection checkbox is hidden if nothing is selected await PrintHelper.withTestPage(async helper => { await helper.startPrint(); await helper.openMoreSettings(); let printSelect = helper.get("source-version-selection"); ok( BrowserTestUtils.isHidden(printSelect), "Print selection checkbox is hidden" ); await helper.closeDialog(); }); }); add_task(async function print_selection_switch() { await PrintHelper.withTestPage(async helper => { await SpecialPowers.spawn(helper.sourceBrowser, [], async function () { let element = content.document.querySelector("h1"); content.window.getSelection().selectAllChildren(element); }); await helper.startPrint(); await helper.openMoreSettings(); let printSource = helper.get("source-version-source-radio"); ok(printSource.checked, "Print source radio is checked"); let printSelect = helper.get("source-version-selection-radio"); ok(!printSelect.checked, "Print selection radio is not checked"); function getCurrentBrowser(previewType) { let browser = document.querySelector( `.printPreviewBrowser[previewtype="${previewType}"]` ); is( browser.parentElement.getAttribute("previewtype"), previewType, "Expected browser is showing" ); return browser; } let selectedText = "Article title"; let fullText = await getPreviewText(getCurrentBrowser("source")); helper.assertSettingsMatch({ printSelectionOnly: false, }); await helper.assertSettingsChanged( { printSelectionOnly: false }, { printSelectionOnly: true }, async () => { await helper.waitForPreview(() => helper.click(printSelect)); let text = await getPreviewText(getCurrentBrowser("selection")); is(text, selectedText, "Correct content loaded"); } ); await helper.assertSettingsChanged( { printSelectionOnly: true }, { printSelectionOnly: false }, async () => { await helper.waitForPreview(() => helper.click(printSource)); let text = await getPreviewText(getCurrentBrowser("source")); is(text, fullText, "Correct content loaded"); } ); await helper.closeDialog(); }); }); add_task(async function open_system_print_with_selection_and_pdf() { await BrowserTestUtils.withNewTab( "data:text/html," + sources[0], async function (browser) { let frameBC = browser.browsingContext.children[0]; await SpecialPowers.spawn(frameBC, [], () => { let element = content.document.getElementById("other"); content.focus(); content.getSelection().selectAllChildren(element); }); let helper = new PrintHelper(browser); // Add another printer so the system dialog link is shown on Windows. helper.addMockPrinter("A printer"); PrintUtils.startPrintWindow(frameBC, {}); await waitForPreviewVisible(); // Ensure that the PDF printer is selected since the way settings are // cloned is different in this case. is( helper.settings.printerName, "Mozilla Save to PDF", "Mozilla Save to PDF is the current printer." ); await helper.setupMockPrint(); helper.click(helper.get("open-dialog-link")); await helper.withClosingFn(() => { helper.resolveShowSystemDialog(); helper.resolvePrint(); }); ok( helper.systemDialogOpenedWithSelection, "Expect system print dialog to be notified of selection" ); PrintHelper.resetPrintPrefs(); } ); });