summaryrefslogtreecommitdiffstats
path: root/browser/components/downloads/test/browser/browser_downloads_context_menu_selection.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/downloads/test/browser/browser_downloads_context_menu_selection.js')
-rw-r--r--browser/components/downloads/test/browser/browser_downloads_context_menu_selection.js139
1 files changed, 139 insertions, 0 deletions
diff --git a/browser/components/downloads/test/browser/browser_downloads_context_menu_selection.js b/browser/components/downloads/test/browser/browser_downloads_context_menu_selection.js
new file mode 100644
index 0000000000..a4a8eacf36
--- /dev/null
+++ b/browser/components/downloads/test/browser/browser_downloads_context_menu_selection.js
@@ -0,0 +1,139 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/**
+ * Test that the context menu refers to the triggering item, even if the
+ * selection was not set preemptively.
+ */
+
+async function createDownloadFiles() {
+ let dir = await setDownloadDir();
+ let downloads = [];
+ downloads.push({
+ state: DownloadsCommon.DOWNLOAD_FAILED,
+ contentType: "text/plain",
+ target: new FileUtils.File(PathUtils.join(dir, "does-not-exist.txt")),
+ });
+ downloads.push({
+ state: DownloadsCommon.DOWNLOAD_FINISHED,
+ contentType: "text/plain",
+ target: await createDownloadedFile(PathUtils.join(dir, "file.txt"), "file"),
+ });
+ return downloads;
+}
+
+add_setup(async function setup() {
+ await PlacesUtils.history.clear();
+ await startServer();
+
+ registerCleanupFunction(async function () {
+ await task_resetState();
+ await PlacesUtils.history.clear();
+ });
+});
+
+add_task(async function test() {
+ // remove download files, empty out collections
+ let downloadList = await Downloads.getList(Downloads.ALL);
+ let downloadCount = (await downloadList.getAll()).length;
+ Assert.equal(downloadCount, 0, "There should be 0 downloads");
+ await task_resetState();
+ let downloads = await createDownloadFiles();
+ await task_addDownloads(downloads);
+ await task_openPanel();
+ let downloadsListBox = document.getElementById("downloadsListBox");
+ await TestUtils.waitForCondition(() => {
+ downloadsListBox.removeAttribute("disabled");
+ return downloadsListBox.childElementCount == downloads.length;
+ });
+
+ // Note we're not doing anything to set the selectedItem here, exactly to
+ // check the context menu doesn't depend on some selection prerequisite.
+
+ let first = downloadsListBox.querySelector("richlistitem");
+ let second = downloadsListBox.querySelector("richlistitem:nth-child(2)");
+
+ info("Check first item");
+ let firstDownload = DownloadsView.itemForElement(first).download;
+ is(
+ DownloadsCommon.stateOfDownload(firstDownload),
+ DownloadsCommon.DOWNLOAD_FINISHED,
+ "Download states match up"
+ );
+ // mousemove to the _other_ download, to ensure it doesn't confuse code.
+ EventUtils.synthesizeMouse(second, -5, -5, { type: "mousemove" });
+ await checkCommandsWithContextMenu(first, {
+ downloadsCmd_show: true,
+ cmd_delete: true,
+ });
+
+ info("Check second item");
+ let secondDownload = DownloadsView.itemForElement(second).download;
+ is(
+ DownloadsCommon.stateOfDownload(secondDownload),
+ DownloadsCommon.DOWNLOAD_FAILED,
+ "Download states match up"
+ );
+ // mousemove to the _other_ download, to ensure it doesn't confuse code.
+ EventUtils.synthesizeMouse(first, -5, -5, { type: "mousemove" });
+ await checkCommandsWithContextMenu(second, {
+ downloadsCmd_show: false,
+ cmd_delete: true,
+ });
+
+ info("Check we don't open a context menu between items.");
+ function listener() {
+ Assert.ok(false, "Should not open a context menu");
+ }
+ document.addEventListener("popupshown", listener);
+ let listRect = downloadsListBox.getBoundingClientRect();
+ let firstRect = first.getBoundingClientRect();
+ let secondRect = second.getBoundingClientRect();
+ let x = parseInt(firstRect.width / 2);
+ Assert.greater(
+ secondRect.y - firstRect.y - firstRect.height,
+ 1,
+ "There should be a gap of at least 1 px for this test"
+ );
+ let y = parseInt(firstRect.y - listRect.y + firstRect.height + 1);
+ info(`Right click at (${x}, ${y})`);
+ EventUtils.synthesizeMouse(downloadsListBox, x, y, {
+ type: "contextmenu",
+ button: 2,
+ });
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(r => setTimeout(r, 100));
+ document.removeEventListener("popupshown", listener);
+
+ let hiddenPromise = BrowserTestUtils.waitForEvent(
+ DownloadsPanel.panel,
+ "popuphidden"
+ );
+ DownloadsPanel.hidePanel();
+ await hiddenPromise;
+});
+
+async function checkCommandsWithContextMenu(element, commands) {
+ let contextMenu = await openContextMenu(element);
+ for (let command in commands) {
+ let enabled = commands[command];
+ let commandStatus = enabled ? "enabled" : "disabled";
+ info(`Checking command ${command} is ${commandStatus}`);
+
+ let commandElt = contextMenu.querySelector(`[command="${command}"]`);
+ Assert.equal(
+ !BrowserTestUtils.is_hidden(commandElt),
+ enabled,
+ `${command} should be ${enabled ? "visible" : "hidden"}`
+ );
+
+ Assert.strictEqual(
+ DownloadsView.richListBox.selectedItem._shell.isCommandEnabled(command),
+ enabled,
+ `${command} should be ${commandStatus}`
+ );
+ }
+ contextMenu.hidePopup();
+}