"use strict";
const kTestPath = getRootDirectory(gTestPath).replace(
"chrome://mochitests/content",
"http://example.com"
);
const kTestURI = kTestPath +
"file_data_text_csv.html";
function addWindowListener(aURL) {
return new Promise(resolve => {
Services.wm.addListener({
onOpenWindow(aXULWindow) {
info(
"window opened, waiting for focus");
Services.wm.removeListener(
this);
var domwindow = aXULWindow.docShell.domWindow;
waitForFocus(
function () {
is(
domwindow.document.location.href,
aURL,
"should have seen the right window open"
);
resolve(domwindow);
}, domwindow);
},
onCloseWindow() {},
});
});
}
function promisePanelOpened() {
if (DownloadsPanel.panel && DownloadsPanel.panel.state ==
"open") {
return Promise.resolve();
}
return BrowserTestUtils.waitForEvent(DownloadsPanel.panel,
"popupshown");
}
add_task(async
function test_with_pref_enabled() {
await SpecialPowers.pushPrefEnv({
set: [
[
"security.data_uri.block_toplevel_data_uri_navigations",
true],
[
"browser.download.always_ask_before_handling_new_types",
true],
],
});
let windowPromise = addWindowListener(
"chrome://mozapps/content/downloads/unknownContentType.xhtml"
);
BrowserTestUtils.startLoadingURIString(gBrowser, kTestURI);
let win = await windowPromise;
let expectedValue =
"Untitled.csv";
is(
win.document.getElementById(
"location").value,
expectedValue,
"file name of download should match"
);
let mainWindowActivated = BrowserTestUtils.waitForEvent(window,
"activate");
await BrowserTestUtils.closeWindow(win);
await mainWindowActivated;
});
add_task(async
function test_with_pref_disabled() {
await SpecialPowers.pushPrefEnv({
set: [
[
"security.data_uri.block_toplevel_data_uri_navigations",
true],
[
"browser.download.always_ask_before_handling_new_types",
false],
],
});
let downloadsPanelPromise = promisePanelOpened();
let downloadsPromise = Downloads.getList(Downloads.
PUBLIC);
let sourceURLBit =
"text/csv;foo,bar,foobar";
info(
"Loading URI for pref enabled");
BrowserTestUtils.startLoadingURIString(gBrowser, kTestURI);
info(
"Waiting for downloads panel to open");
await downloadsPanelPromise;
info(
"Getting downloads info after opening downloads panel");
let downloadList = await downloadsPromise;
is(DownloadsPanel.isPanelShowing,
true,
"DownloadsPanel should be open.");
is(
downloadList._downloads.length,
1,
"File should be successfully downloaded."
);
let [download] = downloadList._downloads;
is(download.contentType,
"text/csv",
"File contentType should be correct.");
is(
download.source.url,
`data:${sourceURLBit}`,
"File name should be correct."
);
info(
"Cleaning up downloads");
try {
if (Services.appinfo.OS ===
"WINNT") {
// We need to make the file writable to delete it on Windows.
await IOUtils.setPermissions(download.target.path, 0o600);
}
await IOUtils.remove(download.target.path);
}
catch (ex) {
info(
"The file " + download.target.path +
" is not removed, " + ex);
}
await downloadList.remove(download);
await download.finalize();
});