217 lines
6.9 KiB
JavaScript
217 lines
6.9 KiB
JavaScript
/* 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;
|
|
|
|
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 () {
|
|
MockFilePicker.init(window.browsingContext);
|
|
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;
|
|
await waitForPdfJSClose(browser);
|
|
}
|
|
);
|
|
});
|
|
|
|
/**
|
|
* 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() {
|
|
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;
|
|
await waitForPdfJSClose(browser);
|
|
}
|
|
);
|
|
|
|
// 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.");
|
|
});
|
|
await waitForPdfJSClose(browser);
|
|
}
|
|
);
|
|
});
|
|
|
|
/**
|
|
* 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 filfename 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;
|
|
await waitForPdfJSClose(tab.linkedBrowser, /* closeTab = */ true);
|
|
}
|
|
);
|
|
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"
|
|
);
|
|
await waitForPdfJSClose(browser);
|
|
}
|
|
);
|
|
});
|