diff options
Diffstat (limited to 'toolkit/components/printing/tests/browser_print_selection.js')
-rw-r--r-- | toolkit/components/printing/tests/browser_print_selection.js | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/toolkit/components/printing/tests/browser_print_selection.js b/toolkit/components/printing/tests/browser_print_selection.js new file mode 100644 index 0000000000..fddc599788 --- /dev/null +++ b/toolkit/components/printing/tests/browser_print_selection.js @@ -0,0 +1,160 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +const frameSource = + "<a href='about:mozilla'>some text</a><a id='other' href='about:about'>other text</a>"; +const sources = [ + `<html><iframe id="f" srcdoc="${frameSource}"></iframe></html>`, + `<html><iframe id="f" src="https://example.com/document-builder.sjs?html=${frameSource}"></iframe></html>`, +]; + +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) { + // Testing the native print dialog is much harder. + // Note we need to do this from here since resetPrintPrefs() below clears + // out the pref. + await SpecialPowers.pushPrefEnv({ + set: [["print.tab_modal.enabled", true]], + }); + + 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("tests", frameBC, { + printSelectionOnly: true, + }); + + await BrowserTestUtils.waitForCondition( + () => !!document.querySelector(".printPreviewBrowser") + ); + + 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("#print-selection-enabled"); + ok(!printSelect.hidden, "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 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("print-selection-container"); + ok(printSelect.hidden, "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 printSelect = helper.get("print-selection-container"); + ok(!printSelect.checked, "Print selection checkbox is not checked"); + + let selectionBrowser = document.querySelector( + ".printPreviewBrowser[previewtype='selection']" + ); + let primaryBrowser = document.querySelector( + ".printPreviewBrowser[previewtype='primary']" + ); + + let selectedText = "Article title"; + let fullText = await getPreviewText(primaryBrowser); + + function getCurrentBrowser(previewType) { + let browser = + previewType == "selection" ? selectionBrowser : primaryBrowser; + is( + browser.parentElement.getAttribute("previewtype"), + previewType, + "Expected browser is showing" + ); + return browser; + } + + helper.assertSettingsMatch({ + printSelectionOnly: false, + }); + + is( + selectionBrowser.parentElement.getAttribute("previewtype"), + "primary", + "Print selection browser is not shown" + ); + + 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(printSelect)); + let previewType = selectionBrowser.parentElement.getAttribute( + "previewtype" + ); + is(previewType, "primary", "Print selection browser is not shown"); + let text = await getPreviewText(getCurrentBrowser(previewType)); + is(text, fullText, "Correct content loaded"); + } + ); + + await helper.closeDialog(); + }); +}); |