forked from mirrors/gecko-dev
Depends on D200551 Differential Revision: https://phabricator.services.mozilla.com/D200552
197 lines
5.5 KiB
JavaScript
197 lines
5.5 KiB
JavaScript
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
|
/* vim: set sts=2 sw=2 et tw=80: */
|
|
"use strict";
|
|
|
|
async function testReturnStatus(expectedStatus) {
|
|
// Test that tabs.saveAsPDF() returns the correct status
|
|
let tab = await BrowserTestUtils.openNewForegroundTab(
|
|
gBrowser,
|
|
"http://example.net/"
|
|
);
|
|
|
|
let saveDir = FileUtils.getDir("TmpD", [`testSaveDir-${Math.random()}`]);
|
|
saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
|
|
|
|
let saveFile = saveDir.clone();
|
|
saveFile.append("testSaveFile.pdf");
|
|
if (saveFile.exists()) {
|
|
saveFile.remove(false);
|
|
}
|
|
|
|
if (expectedStatus == "replaced") {
|
|
// Create file that can be replaced
|
|
saveFile.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o666);
|
|
} else if (expectedStatus == "not_saved") {
|
|
// Create directory with same name as file - so that file cannot be saved
|
|
saveFile.create(Ci.nsIFile.DIRECTORY_TYPE, 0o666);
|
|
} else if (expectedStatus == "not_replaced") {
|
|
// Create file that cannot be replaced
|
|
saveFile.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o444);
|
|
}
|
|
|
|
let MockFilePicker = SpecialPowers.MockFilePicker;
|
|
MockFilePicker.init(window.browsingContext);
|
|
|
|
if (expectedStatus == "replaced" || expectedStatus == "not_replaced") {
|
|
MockFilePicker.returnValue = MockFilePicker.returnReplace;
|
|
} else if (expectedStatus == "canceled") {
|
|
MockFilePicker.returnValue = MockFilePicker.returnCancel;
|
|
} else {
|
|
MockFilePicker.returnValue = MockFilePicker.returnOK;
|
|
}
|
|
|
|
MockFilePicker.displayDirectory = saveDir;
|
|
|
|
MockFilePicker.showCallback = fp => {
|
|
MockFilePicker.setFiles([saveFile]);
|
|
MockFilePicker.filterIndex = 0; // *.* - all file extensions
|
|
};
|
|
|
|
let manifest = {
|
|
description: expectedStatus,
|
|
};
|
|
|
|
let extension = ExtensionTestUtils.loadExtension({
|
|
manifest: manifest,
|
|
|
|
background: async function () {
|
|
let pageSettings = {};
|
|
|
|
let expected = chrome.runtime.getManifest().description;
|
|
|
|
let status = await browser.tabs.saveAsPDF(pageSettings);
|
|
|
|
browser.test.assertEq(expected, status, "Got expected status");
|
|
|
|
browser.test.notifyPass("tabs.saveAsPDF");
|
|
},
|
|
});
|
|
|
|
await extension.startup();
|
|
await extension.awaitFinish("tabs.saveAsPDF");
|
|
await extension.unload();
|
|
|
|
if (expectedStatus == "saved" || expectedStatus == "replaced") {
|
|
// Check that first four bytes of saved PDF file are "%PDF"
|
|
let text = await IOUtils.read(saveFile.path, { maxBytes: 4 });
|
|
text = new TextDecoder().decode(text);
|
|
is(text, "%PDF", "Got correct magic number - %PDF");
|
|
}
|
|
|
|
MockFilePicker.cleanup();
|
|
|
|
if (expectedStatus == "not_saved" || expectedStatus == "not_replaced") {
|
|
saveFile.permissions = 0o666;
|
|
}
|
|
|
|
saveDir.remove(true);
|
|
|
|
BrowserTestUtils.removeTab(tab);
|
|
}
|
|
|
|
add_task(async function testSaveAsPDF_saved() {
|
|
await testReturnStatus("saved");
|
|
});
|
|
|
|
add_task(async function testSaveAsPDF_replaced() {
|
|
await testReturnStatus("replaced");
|
|
});
|
|
|
|
add_task(async function testSaveAsPDF_canceled() {
|
|
await testReturnStatus("canceled");
|
|
});
|
|
|
|
add_task(async function testSaveAsPDF_not_saved() {
|
|
await testReturnStatus("not_saved");
|
|
});
|
|
|
|
add_task(async function testSaveAsPDF_not_replaced() {
|
|
await testReturnStatus("not_replaced");
|
|
});
|
|
|
|
async function testFileName(expectedFileName) {
|
|
// Test that tabs.saveAsPDF() saves with the correct filename
|
|
let tab = await BrowserTestUtils.openNewForegroundTab(
|
|
gBrowser,
|
|
"http://example.net/"
|
|
);
|
|
|
|
let saveDir = FileUtils.getDir("TmpD", [`testSaveDir-${Math.random()}`]);
|
|
saveDir.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY);
|
|
|
|
let saveFile = saveDir.clone();
|
|
saveFile.append(expectedFileName);
|
|
if (saveFile.exists()) {
|
|
saveFile.remove(false);
|
|
}
|
|
|
|
let MockFilePicker = SpecialPowers.MockFilePicker;
|
|
MockFilePicker.init(window.browsingContext);
|
|
|
|
MockFilePicker.returnValue = MockFilePicker.returnOK;
|
|
|
|
MockFilePicker.displayDirectory = saveDir;
|
|
|
|
MockFilePicker.showCallback = fp => {
|
|
is(
|
|
fp.defaultString,
|
|
expectedFileName,
|
|
"Got expected FilePicker defaultString"
|
|
);
|
|
|
|
is(fp.defaultExtension, "pdf", "Got expected FilePicker defaultExtension");
|
|
|
|
let file = saveDir.clone();
|
|
file.append(fp.defaultString);
|
|
MockFilePicker.setFiles([file]);
|
|
};
|
|
|
|
let manifest = {
|
|
description: expectedFileName,
|
|
};
|
|
|
|
let extension = ExtensionTestUtils.loadExtension({
|
|
manifest: manifest,
|
|
|
|
background: async function () {
|
|
let pageSettings = {};
|
|
|
|
let expected = chrome.runtime.getManifest().description;
|
|
|
|
if (expected == "definedFileName") {
|
|
pageSettings.toFileName = expected;
|
|
}
|
|
|
|
let status = await browser.tabs.saveAsPDF(pageSettings);
|
|
|
|
browser.test.assertEq("saved", status, "Got expected status");
|
|
|
|
browser.test.notifyPass("tabs.saveAsPDF");
|
|
},
|
|
});
|
|
|
|
await extension.startup();
|
|
await extension.awaitFinish("tabs.saveAsPDF");
|
|
await extension.unload();
|
|
|
|
// Check that first four bytes of saved PDF file are "%PDF"
|
|
let text = await IOUtils.read(saveFile.path, { maxBytes: 4 });
|
|
text = new TextDecoder().decode(text);
|
|
is(text, "%PDF", "Got correct magic number - %PDF");
|
|
|
|
MockFilePicker.cleanup();
|
|
|
|
saveDir.remove(true);
|
|
|
|
BrowserTestUtils.removeTab(tab);
|
|
}
|
|
|
|
add_task(async function testSaveAsPDF_defined_filename() {
|
|
await testFileName("definedFileName");
|
|
});
|
|
|
|
add_task(async function testSaveAsPDF_undefined_filename() {
|
|
// If pageSettings.toFileName is undefined, the expected filename will be
|
|
// the test page title "mochitest index /" with the "/" replaced by "_".
|
|
await testFileName("mochitest index _");
|
|
});
|