Source code
Revision control
Copy as Markdown
Other Tools
Test Info:
/* Any copyright is dedicated to the Public Domain.
const RELATIVE_DIR = "toolkit/components/pdfjs/test/";
const MockFilePicker = SpecialPowers.MockFilePicker;
Services.scriptloader.loadSubScript(
this
);
async function createPromiseForTransferComplete(expectedFileName, destFile) {
await 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();
};
};
});
}
const tempDir = createTemporarySaveDirectory();
add_setup(async function () {
MockFilePicker.init(window.browsingContext);
mockTransferRegisterer.register();
registerCleanupFunction(function () {
mockTransferRegisterer.unregister();
MockFilePicker.cleanup();
tempDir.remove(true);
});
});
function getDialogObserver(buttonN) {
const onCommonDialogLoaded = async ({
Dialog: {
ui: { button0, button1, button2, infoBody, infoTitle },
},
}) => {
Services.obs.removeObserver(onCommonDialogLoaded, "common-dialog-loaded");
ok(infoTitle.textContent, "Save PDF before leaving?");
ok(
infoBody.textContent,
"Save this document to avoid losing your changes."
);
[button0, button1, button2][buttonN].click();
};
return onCommonDialogLoaded;
}
async function setUp(browser) {
await waitForPdfJSAnnotationLayer(browser, TESTROOT + "file_pdfjs_form.pdf");
await clickOn(browser, "#pdfjs_internal_id_7R");
await write(browser, "hello world");
await clickOn(browser, ".textLayer span");
await SpecialPowers.spawn(browser, [], async () => {
const { annotationStorage } =
content.wrappedJSObject.PDFViewerApplication.pdfDocument;
ok(
annotationStorage.has("7R"),
"Annotation storage should have the annotation"
);
});
const tab = gBrowser.getTabForBrowser(browser);
tab.closeButton.click();
return tab;
}
add_task(async function test_dontsave_dialog_when_leaving_unsaved_form() {
Services.obs.addObserver(getDialogObserver(2), "common-dialog-loaded");
await BrowserTestUtils.withNewTab(
{ gBrowser, url: "about:blank" },
async function (browser) {
const tab = await setUp(browser);
ok(tab.closing, "Tab should be closing");
}
);
});
add_task(async function test_save_dialog_when_leaving_unsaved_form() {
Services.obs.addObserver(getDialogObserver(0), "common-dialog-loaded");
await BrowserTestUtils.withNewTab(
{ gBrowser, url: "about:blank" },
async function (browser) {
const tab = gBrowser.getTabForBrowser(browser);
const destFile = tempDir.clone();
MockFilePicker.displayDirectory = tempDir;
const fileSavedPromise = createPromiseForTransferComplete(
"file_pdfjs_form.pdf",
destFile
);
await setUp(browser);
await fileSavedPromise;
ok(tab.closing, "Tab should be closing");
}
);
});
add_task(async function test_cancel_dialog_when_leaving_unsaved_form() {
Services.obs.addObserver(getDialogObserver(1), "common-dialog-loaded");
await BrowserTestUtils.withNewTab(
{ gBrowser, url: "about:blank" },
async function (browser) {
const tab = await setUp(browser);
ok(!tab.closing, "Tab should not be closing");
await waitForPdfJSClose(browser);
}
);
});