Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* Any copyright is dedicated to the Public Domain.
"use strict";
const RELATIVE_DIR = "toolkit/components/pdfjs/test/";
var MockFilePicker = SpecialPowers.MockFilePicker;
Services.scriptloader.loadSubScript(
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
*/
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);
downloadLastDir.setFile(url, destDir);
await TestUtils.waitForTick();
}
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);
}
);
});