Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Errors

/* Any copyright is dedicated to the Public Domain.
"use strict";
const TEST_URI = "https://example.com";
const TEST_PATH = getRootDirectory(gTestPath).replace(
TEST_URI
);
add_setup(async function () {
await SpecialPowers.pushPrefEnv({
set: [
["browser.download.alwaysOpenPanel", true],
["browser.download.always_ask_before_handling_new_types", false],
["security.dialog_enable_delay", 1000],
],
});
// Remove download files from previous tests
await task_resetState();
let downloadList = await Downloads.getList(Downloads.ALL);
let downloadCount = (await downloadList.getAll()).length;
is(downloadCount, 0, "At the start of the test, there should be 0 downloads");
});
/**
* Tests that the download items remain enabled when we manually open
* the downloads panel by clicking the downloads button.
*/
add_task(async function test_downloads_panel_downloads_button() {
let panelOpenedPromise = promisePanelOpened();
await task_addDownloads([{ state: DownloadsCommon.DOWNLOAD_FINISHED }]);
await panelOpenedPromise;
// The downloads panel will open automatically after task_addDownloads
// creates a download file. Let's close the panel and reopen it again
// (but this time manually) to ensure the download items are not disabled.
DownloadsPanel.hidePanel();
ok(!DownloadsPanel.isPanelShowing, "Downloads Panel should not be visible");
info("Manually open the download panel to view list of downloads");
let downloadsButton = document.getElementById("downloads-button");
EventUtils.synthesizeMouseAtCenter(downloadsButton, {});
let downloadsListBox = document.getElementById("downloadsListBox");
ok(downloadsListBox, "downloadsListBox richlistitem should be visible");
is(
downloadsListBox.childElementCount,
1,
"downloadsListBox should have 1 download"
);
ok(
!downloadsListBox.getAttribute("disabled"),
"All download items in the downloads panel should not be disabled"
);
info("Cleaning up downloads");
await task_resetState();
});
/**
* Tests that the download items are disabled when the downloads panel is
* automatically opened as a result of a new download.
*/
add_task(async function test_downloads_panel_new_download() {
// Overwrite DownloadsCommon.openDownload to prevent file from opening during tests
const originalOpenDownload = DownloadsCommon.openDownload;
DownloadsCommon.openDownload = async () => {
ok(false, "openDownload was called when it was not expected");
};
let newTabPromise = BrowserTestUtils.openNewForegroundTab({
gBrowser,
opening: TEST_PATH + "foo.txt",
waitForLoad: false,
waitForStateStop: true,
});
await promisePanelOpened();
let downloadsListBox = document.getElementById("downloadsListBox");
ok(downloadsListBox, "downloadsListBox richlistitem should be visible");
await BrowserTestUtils.waitForMutationCondition(
downloadsListBox,
{ childList: true },
() => downloadsListBox.childElementCount == 1
);
info("downloadsListBox should have 1 download");
ok(
downloadsListBox.getAttribute("disabled"),
"All download items in the downloads panel should first be disabled"
);
let newTab = await newTabPromise;
// Press enter 6 times at 100ms intervals.
EventUtils.synthesizeKey("KEY_Enter", {}, window);
for (let i = 0; i < 5; i++) {
// There's no other way to allow some time to pass and ensure we're
// genuinely testing that these keypresses postpone the enabling of
// the items, so disable this check for this line:
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
await new Promise(r => setTimeout(r, 100));
EventUtils.synthesizeKey("KEY_Enter", {}, window);
}
// Measure when we finished.
let keyTime = Date.now();
await BrowserTestUtils.waitForMutationCondition(
downloadsListBox,
{ attributeFilter: ["disabled"] },
() => !downloadsListBox.hasAttribute("disabled")
);
Assert.greater(
Date.now(),
keyTime + 750,
"Should have waited at least another 750ms after this keypress."
);
let openedDownload = new Promise(resolve => {
DownloadsCommon.openDownload = async () => {
ok(true, "openDownload should have been called");
resolve();
};
});
info("All download items in the download panel should now be enabled");
EventUtils.synthesizeKey("KEY_Enter", {}, window);
await openedDownload;
await task_resetState();
DownloadsCommon.openDownload = originalOpenDownload;
BrowserTestUtils.removeTab(newTab);
});
/**
* Tests that the disabled attribute does not exist when we close the
* downloads panel before the disabled state timeout resolves.
*/
add_task(async function test_downloads_panel_close_panel_early() {
info("Creating mock completed downloads");
await task_addDownloads([{ state: DownloadsCommon.DOWNLOAD_FINISHED }]);
// The downloads panel may open automatically after task_addDownloads
// creates a download file. Let's close the panel and reopen it again
// (but this time manually).
DownloadsPanel.hidePanel();
ok(!DownloadsPanel.isPanelShowing, "Downloads Panel should not be visible");
info("Manually open the download panel to view list of downloads");
let downloadsButton = document.getElementById("downloads-button");
EventUtils.synthesizeMouseAtCenter(downloadsButton, {});
let downloadsListBox = document.getElementById("downloadsListBox");
ok(downloadsListBox, "downloadsListBox richlistitem should be visible");
is(
downloadsListBox.childElementCount,
1,
"downloadsListBox should have 1 download"
);
DownloadsPanel.hidePanel();
await BrowserTestUtils.waitForCondition(
() => !downloadsListBox.getAttribute("disabled")
);
info("downloadsListBox 'disabled' attribute should not exist");
info("Cleaning up downloads");
await task_resetState();
});