Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
"use strict";
const TEST_ROOT = getRootDirectory(gTestPath).replace(
);
var MockFilePicker = SpecialPowers.MockFilePicker;
MockFilePicker.init(window.browsingContext);
Services.scriptloader.loadSubScript(
this
);
add_setup(async function () {
// head.js has helpers that write to a nice unique file we can use.
await createDownloadedFile(gTestTargetFile.path, "Hello.\n");
ok(gTestTargetFile.exists(), "We created a test file.");
await SpecialPowers.pushPrefEnv({
set: [
["browser.download.always_ask_before_handling_new_types", false],
["browser.download.useDownloadDir", false],
],
});
// Set up the file picker.
let destDir = gTestTargetFile.parent;
MockFilePicker.displayDirectory = destDir;
MockFilePicker.showCallback = function () {
MockFilePicker.setFiles([gTestTargetFile]);
return MockFilePicker.returnOK;
};
registerCleanupFunction(function () {
MockFilePicker.cleanup();
if (gTestTargetFile.exists()) {
gTestTargetFile.remove(false);
}
});
});
// If we download a file and the user accepts overwriting an existing one,
// we shouldn't first delete that file before moving the .part file into
// place.
add_task(async function test_overwrite_does_not_delete_first() {
let unregisteredTransfer = false;
let transferCompletePromise = new Promise(resolve => {
mockTransferCallback = resolve;
});
mockTransferRegisterer.register();
registerCleanupFunction(function () {
if (!unregisteredTransfer) {
mockTransferRegisterer.unregister();
}
});
// Now try and download a thing to the file:
await BrowserTestUtils.withNewTab(
{
gBrowser,
opening: TEST_ROOT + "foo.txt",
waitForLoad: false,
waitForStateStop: true,
},
async function () {
ok(await transferCompletePromise, "download should succeed");
ok(
gTestTargetFile.exists(),
"File should still exist and not have been deleted."
);
// Note: the download transfer is fake so data won't have been written to
// the file, so we can't verify that the download actually overwrites data
// like this.
mockTransferRegisterer.unregister();
unregisteredTransfer = true;
}
);
});
// If we download a file and the user accepts overwriting an existing one,
// we should successfully overwrite its contents.
add_task(async function test_overwrite_works() {
let publicDownloads = await Downloads.getList(Downloads.PUBLIC);
// First ensure we catch the download finishing.
let downloadFinishedPromise = new Promise(resolve => {
publicDownloads.addView({
onDownloadChanged(download) {
info("Download changed!");
if (download.succeeded || download.error) {
info("Download succeeded or errored");
publicDownloads.removeView(this);
publicDownloads.removeFinished();
resolve(download);
}
},
});
});
// Now try and download a thing to the file:
await BrowserTestUtils.withNewTab(
{
gBrowser,
opening: TEST_ROOT + "foo.txt",
waitForLoad: false,
waitForStateStop: true,
},
async function () {
info("wait for download to finish");
let download = await downloadFinishedPromise;
ok(download.succeeded, "Download should succeed");
ok(
gTestTargetFile.exists(),
"File should still exist and not have been deleted."
);
let contents = new TextDecoder().decode(
await IOUtils.read(gTestTargetFile.path)
);
info("Got: " + contents);
ok(contents.startsWith("Dummy"), "The file was overwritten.");
}
);
});