From 26a029d407be480d791972afb5975cf62c9360a6 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Fri, 19 Apr 2024 02:47:55 +0200 Subject: Adding upstream version 124.0.1. Signed-off-by: Daniel Baumann --- .../components/pdfjs/test/browser_pdfjs_saveas.js | 216 +++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 toolkit/components/pdfjs/test/browser_pdfjs_saveas.js (limited to 'toolkit/components/pdfjs/test/browser_pdfjs_saveas.js') diff --git a/toolkit/components/pdfjs/test/browser_pdfjs_saveas.js b/toolkit/components/pdfjs/test/browser_pdfjs_saveas.js new file mode 100644 index 0000000000..a1bfc18a91 --- /dev/null +++ b/toolkit/components/pdfjs/test/browser_pdfjs_saveas.js @@ -0,0 +1,216 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const RELATIVE_DIR = "toolkit/components/pdfjs/test/"; +const TESTROOT = "http://example.com/browser/" + RELATIVE_DIR; + +var MockFilePicker = SpecialPowers.MockFilePicker; +MockFilePicker.init(window); + +Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/toolkit/content/tests/browser/common/mockTransfer.js", + this +); + +function createPromiseForTransferComplete(expectedFileName, destFile) { + return new Promise(resolve => { + MockFilePicker.showCallback = fp => { + info("Filepicker shown, checking filename"); + is(fp.defaultString, expectedFileName, "Filename should be correct."); + let fileName = fp.defaultString; + destFile.append(fileName); + + MockFilePicker.setFiles([destFile]); + MockFilePicker.filterIndex = 0; // kSaveAsType_Complete + + MockFilePicker.showCallback = null; + mockTransferCallback = function (downloadSuccess) { + ok(downloadSuccess, "File should have been downloaded successfully"); + mockTransferCallback = () => {}; + resolve(); + }; + }; + }); +} + +let tempDir = createTemporarySaveDirectory(); + +add_setup(async function () { + mockTransferRegisterer.register(); + registerCleanupFunction(function () { + mockTransferRegisterer.unregister(); + MockFilePicker.cleanup(); + tempDir.remove(true); + }); +}); + +/** + * Check triggering "Save Page As" on a non-forms PDF opens the "Save As" dialog + * and successfully saves the file. + */ +add_task(async function test_pdf_saveas() { + await BrowserTestUtils.withNewTab( + { gBrowser, url: "about:blank" }, + async function (browser) { + await waitForPdfJS(browser, TESTROOT + "file_pdfjs_test.pdf"); + let destFile = tempDir.clone(); + MockFilePicker.displayDirectory = tempDir; + let fileSavedPromise = createPromiseForTransferComplete( + "file_pdfjs_test.pdf", + destFile + ); + saveBrowser(browser); + await fileSavedPromise; + } + ); +}); + +/** + * Check triggering "Save Page As" on a PDF with forms that has been modified + * does the following: + * 1) opens the "Save As" dialog + * 2) successfully saves the file + * 3) the new file contains the new form data + */ +add_task(async function test_pdf_saveas_forms() { + await SpecialPowers.pushPrefEnv({ + set: [["pdfjs.renderInteractiveForms", true]], + }); + let destFile = tempDir.clone(); + await BrowserTestUtils.withNewTab( + { gBrowser, url: "about:blank" }, + async function (browser) { + await waitForPdfJSAnnotationLayer( + browser, + TESTROOT + "file_pdfjs_form.pdf" + ); + // Fill in the form input field. + await SpecialPowers.spawn(browser, [], async function () { + let formInput = content.document.querySelector( + "#viewerContainer input" + ); + ok(formInput, "PDF contains text field."); + is(formInput.value, "", "Text field is empty to start."); + formInput.value = "test"; + formInput.dispatchEvent(new content.window.Event("input")); + }); + + MockFilePicker.displayDirectory = tempDir; + let fileSavedPromise = createPromiseForTransferComplete( + "file_pdfjs_form.pdf", + destFile + ); + saveBrowser(browser); + await fileSavedPromise; + } + ); + + // Now that the file has been modified and saved, load it to verify the form + // data persisted. + await BrowserTestUtils.withNewTab( + { gBrowser, url: "about:blank" }, + async function (browser) { + await waitForPdfJSAnnotationLayer(browser, NetUtil.newURI(destFile).spec); + await SpecialPowers.spawn(browser, [], async function () { + let formInput = content.document.querySelector( + "#viewerContainer input" + ); + ok(formInput, "PDF contains text field."); + is(formInput.value, "test", "Text field is filled in."); + }); + } + ); +}); + +/** + * Check triggering "Save Page As" on a PDF which was loaded with a custom + * content disposition filename defaults to using the provided filename. + */ +add_task(async function test_pdf_saveas_customname() { + await SpecialPowers.pushPrefEnv({ + set: [ + ["browser.helperApps.showOpenOptionForPdfJS", true], + ["browser.helperApps.showOpenOptionForViewableInternally", true], + ["browser.download.always_ask_before_handling_new_types", false], + ["browser.download.open_pdf_attachments_inline", true], + ], + }); + await BrowserTestUtils.withNewTab( + { gBrowser, url: TESTROOT + "file_pdf_download_link.html" }, + async function (browser) { + // Click on the download link in the loaded file. This will create a new + // tab with the PDF loaded in it. + BrowserTestUtils.synthesizeMouseAtCenter("#custom_filename", {}, browser); + let tab = await BrowserTestUtils.waitForNewTab(gBrowser); + info("tab created"); + + // Wait for the PDF's metadata to be fully loaded before downloading, as + // otherwise it won't be aware of the content disposition filename yet. + await BrowserTestUtils.waitForContentEvent( + tab.linkedBrowser, + "metadataloaded", + false, + null, + true + ); + info("metadata loaded"); + + let destFile = tempDir.clone(); + MockFilePicker.displayDirectory = tempDir; + let fileSavedPromise = createPromiseForTransferComplete( + "custom_filename.pdf", + destFile + ); + saveBrowser(tab.linkedBrowser); + await fileSavedPromise; + BrowserTestUtils.removeTab(tab); + } + ); + await SpecialPowers.popPrefEnv(); +}); + +/** + * Check if the directory where the pdfs are saved is based on the original + * domain (see bug 1768383). + */ +add_task(async function () { + await BrowserTestUtils.withNewTab( + { gBrowser, url: "about:blank" }, + async function (browser) { + const downloadLastDir = new DownloadLastDir(null); + const destDirs = []; + for (let i = 1; i <= 2; i++) { + const destDir = createTemporarySaveDirectory(i); + destDirs.push(destDir); + const url = `http://test${i}.example.com/browser/${RELATIVE_DIR}file_pdfjs_test.pdf`; + downloadLastDir.setFile(url, destDir); + await TestUtils.waitForTick(); + } + + const url = `http://test1.example.com/browser/${RELATIVE_DIR}file_pdfjs_hcm.pdf`; + await waitForPdfJS(browser, url); + + const fileSavedPromise = new Promise(resolve => { + MockFilePicker.showCallback = fp => { + MockFilePicker.setFiles([]); + MockFilePicker.showCallback = null; + resolve(fp.displayDirectory.path); + }; + }); + registerCleanupFunction(() => { + for (const destDir of destDirs) { + destDir.remove(true); + } + }); + saveBrowser(browser); + const dirPath = await fileSavedPromise; + is( + dirPath, + destDirs[0].path, + "Proposed directory must be based on the domain" + ); + } + ); +}); -- cgit v1.2.3