Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'win' && socketprocess_networking && fission OR os == 'mac' && socketprocess_networking && fission OR os == 'mac' && debug OR os == 'linux' && socketprocess_networking OR os == 'android'
- Manifest: toolkit/components/extensions/test/xpcshell/xpcshell-remote.toml includes toolkit/components/extensions/test/xpcshell/xpcshell-common.toml
- Manifest: toolkit/components/extensions/test/xpcshell/xpcshell.toml includes toolkit/components/extensions/test/xpcshell/xpcshell-common.toml
"use strict";
AddonTestUtils.init(this);
AddonTestUtils.overrideCertDB();
AddonTestUtils.createAppInfo(
"xpcshell@tests.mozilla.org",
"XPCShell",
"42",
"42"
);
const server = createHttpServer();
server.registerDirectory("/data/", do_get_file("data"));
const TXT_FILE = "file_download.txt";
const TXT_URL = BASE + "/" + TXT_FILE;
add_task(function setup() {
let downloadDir = FileUtils.getDir("TmpD", ["downloads"]);
downloadDir.createUnique(
Ci.nsIFile.DIRECTORY_TYPE,
FileUtils.PERMS_DIRECTORY
);
info(`Using download directory ${downloadDir.path}`);
Services.prefs.setIntPref("browser.download.folderList", 2);
Services.prefs.setComplexValue(
"browser.download.dir",
Ci.nsIFile,
downloadDir
);
registerCleanupFunction(() => {
Services.prefs.clearUserPref("browser.download.folderList");
Services.prefs.clearUserPref("browser.download.dir");
let entries = downloadDir.directoryEntries;
while (entries.hasMoreElements()) {
let entry = entries.nextFile;
ok(false, `Leftover file ${entry.path} in download directory`);
entry.remove(false);
}
downloadDir.remove(false);
});
});
add_task(
{ pref_set: [["extensions.eventPages.enabled", true]] },
async function test_downloads_event_page() {
await AddonTestUtils.promiseStartupManager();
// A simple download driving extension
let dl_extension = ExtensionTestUtils.loadExtension({
manifest: {
browser_specific_settings: { gecko: { id: "downloader@mochitest" } },
permissions: ["downloads"],
background: { persistent: false },
},
background() {
let downloadId;
browser.downloads.onChanged.addListener(async info => {
if (info.state && info.state.current === "complete") {
browser.test.sendMessage("downloadComplete");
}
});
browser.test.onMessage.addListener(async (msg, opts) => {
if (msg == "download") {
downloadId = await browser.downloads.download(opts);
}
if (msg == "erase") {
await browser.downloads.removeFile(downloadId);
await browser.downloads.erase({ id: downloadId });
}
});
},
});
await dl_extension.startup();
let extension = ExtensionTestUtils.loadExtension({
useAddonManager: "permanent",
manifest: {
permissions: ["downloads"],
background: { persistent: false },
},
background() {
browser.downloads.onChanged.addListener(() => {
browser.test.sendMessage("onChanged");
});
browser.downloads.onCreated.addListener(() => {
browser.test.sendMessage("onCreated");
});
browser.downloads.onErased.addListener(() => {
browser.test.sendMessage("onErased");
});
browser.test.sendMessage("ready");
},
});
// onDeterminingFilename is never persisted, it is an empty event handler.
const EVENTS = ["onChanged", "onCreated", "onErased"];
await extension.startup();
await extension.awaitMessage("ready");
for (let event of EVENTS) {
assertPersistentListeners(extension, "downloads", event, {
primed: false,
});
}
await extension.terminateBackground({ disableResetIdleForTest: true });
ok(
!extension.extension.backgroundContext,
"Background Extension context should have been destroyed"
);
for (let event of EVENTS) {
assertPersistentListeners(extension, "downloads", event, {
primed: true,
});
}
// test download events waken background
dl_extension.sendMessage("download", {
url: TXT_URL,
filename: TXT_FILE,
});
await extension.awaitMessage("ready");
await extension.awaitMessage("onCreated");
for (let event of EVENTS) {
assertPersistentListeners(extension, "downloads", event, {
primed: false,
});
}
await extension.awaitMessage("onChanged");
await extension.terminateBackground({ disableResetIdleForTest: true });
ok(
!extension.extension.backgroundContext,
"Background Extension context should have been destroyed"
);
await dl_extension.awaitMessage("downloadComplete");
dl_extension.sendMessage("erase");
await extension.awaitMessage("ready");
await extension.awaitMessage("onErased");
await dl_extension.unload();
// check primed listeners after startup
await AddonTestUtils.promiseRestartManager();
await extension.awaitStartup();
for (let event of EVENTS) {
assertPersistentListeners(extension, "downloads", event, {
primed: true,
});
}
await extension.unload();
}
);