summaryrefslogtreecommitdiffstats
path: root/browser/components/downloads/test/browser/browser_downloads_context_menu_always_open_similar_files.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/downloads/test/browser/browser_downloads_context_menu_always_open_similar_files.js')
-rw-r--r--browser/components/downloads/test/browser/browser_downloads_context_menu_always_open_similar_files.js236
1 files changed, 236 insertions, 0 deletions
diff --git a/browser/components/downloads/test/browser/browser_downloads_context_menu_always_open_similar_files.js b/browser/components/downloads/test/browser/browser_downloads_context_menu_always_open_similar_files.js
new file mode 100644
index 0000000000..6030d126c7
--- /dev/null
+++ b/browser/components/downloads/test/browser/browser_downloads_context_menu_always_open_similar_files.js
@@ -0,0 +1,236 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+let gMimeSvc = Cc["@mozilla.org/mime;1"].getService(Ci.nsIMIMEService);
+let gHandlerSvc = Cc["@mozilla.org/uriloader/handler-service;1"].getService(
+ Ci.nsIHandlerService
+);
+
+let gDownloadDir;
+const TestFiles = {};
+let downloads = [];
+const { handleInternally, saveToDisk, useSystemDefault, alwaysAsk } =
+ Ci.nsIHandlerInfo;
+
+function ensureMIMEState({ preferredAction, alwaysAskBeforeHandling = false }) {
+ const mimeInfo = gMimeSvc.getFromTypeAndExtension("text/plain", "txt");
+ mimeInfo.preferredAction = preferredAction;
+ mimeInfo.alwaysAskBeforeHandling = alwaysAskBeforeHandling;
+ gHandlerSvc.store(mimeInfo);
+}
+
+async function createDownloadFile() {
+ if (!gDownloadDir) {
+ gDownloadDir = await setDownloadDir();
+ }
+ info("Created download directory: " + gDownloadDir);
+ TestFiles.txt = await createDownloadedFile(
+ PathUtils.join(gDownloadDir, "downloaded.txt"),
+ "Test file"
+ );
+ info("Created downloaded text file at:" + TestFiles.txt.path);
+
+ info("Setting path for download file");
+ // Set target for download file. Otherwise, file will default to .file instead of txt
+ // when we prepare our downloads - particularly in task_addDownloads().
+ let targetPath = PathUtils.join(PathUtils.tempDir, "downloaded.txt");
+ let target = new FileUtils.File(targetPath);
+ target.createUnique(Ci.nsIFile.NORMAL_FILE_TYPE, FileUtils.PERMS_FILE);
+ downloads.push({
+ state: DownloadsCommon.DOWNLOAD_FINISHED,
+ contentType: "text/plain",
+ target,
+ });
+}
+
+async function prepareDownloadFiles(downloadList) {
+ // prepare downloads
+ await task_addDownloads(downloads);
+ let [download] = await downloadList.getAll();
+ info("Download succeeded? " + download.succeeded);
+ info("Download target exists? " + download.target.exists);
+}
+
+add_setup(async function () {
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.download.always_ask_before_handling_new_types", false]],
+ });
+ const originalOpenDownload = DownloadsCommon.openDownload;
+ // overwrite DownloadsCommon.openDownload to prevent file from opening during tests
+ DownloadsCommon.openDownload = async () => {
+ info("Overwriting openDownload for tests");
+ };
+
+ registerCleanupFunction(async () => {
+ DownloadsCommon.openDownload = originalOpenDownload;
+ info("Resetting downloads and closing downloads panel");
+ await task_resetState();
+ });
+
+ // remove download files, empty out collections
+ 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");
+
+ await createDownloadFile();
+ await prepareDownloadFiles(downloadList);
+});
+
+add_task(async function test_checkbox_useSystemDefault() {
+ // force mimetype pref
+ ensureMIMEState({ preferredAction: useSystemDefault });
+
+ await task_openPanel();
+ await TestUtils.waitForCondition(() => {
+ let downloadsListBox = document.getElementById("downloadsListBox");
+ downloadsListBox.removeAttribute("disabled");
+ return downloadsListBox.childElementCount == downloads.length;
+ });
+
+ info("trigger the context menu");
+ let itemTarget = document.querySelector(
+ "#downloadsListBox richlistitem .downloadMainArea"
+ );
+
+ let contextMenu = await openContextMenu(itemTarget);
+ let alwaysOpenSimilarFilesItem = contextMenu.querySelector(
+ ".downloadAlwaysOpenSimilarFilesMenuItem"
+ );
+
+ ok(
+ !BrowserTestUtils.is_hidden(alwaysOpenSimilarFilesItem),
+ "alwaysOpenSimilarFiles should be visible"
+ );
+ ok(
+ alwaysOpenSimilarFilesItem.hasAttribute("checked"),
+ "alwaysOpenSimilarFiles should have checkbox attribute"
+ );
+
+ contextMenu.hidePopup();
+ let hiddenPromise = BrowserTestUtils.waitForEvent(
+ DownloadsPanel.panel,
+ "popuphidden"
+ );
+ DownloadsPanel.hidePanel();
+ await hiddenPromise;
+});
+
+add_task(async function test_checkbox_saveToDisk() {
+ // force mimetype pref
+ ensureMIMEState({ preferredAction: saveToDisk });
+
+ await task_openPanel();
+ await TestUtils.waitForCondition(() => {
+ let downloadsListBox = document.getElementById("downloadsListBox");
+ downloadsListBox.removeAttribute("disabled");
+ return downloadsListBox.childElementCount == downloads.length;
+ });
+
+ info("trigger the context menu");
+ let itemTarget = document.querySelector(
+ "#downloadsListBox richlistitem .downloadMainArea"
+ );
+
+ let contextMenu = await openContextMenu(itemTarget);
+ let alwaysOpenSimilarFilesItem = contextMenu.querySelector(
+ ".downloadAlwaysOpenSimilarFilesMenuItem"
+ );
+
+ ok(
+ !BrowserTestUtils.is_hidden(alwaysOpenSimilarFilesItem),
+ "alwaysOpenSimilarFiles should be visible"
+ );
+ ok(
+ !alwaysOpenSimilarFilesItem.hasAttribute("checked"),
+ "alwaysOpenSimilarFiles should not have checkbox attribute"
+ );
+
+ contextMenu.hidePopup();
+ let hiddenPromise = BrowserTestUtils.waitForEvent(
+ DownloadsPanel.panel,
+ "popuphidden"
+ );
+ DownloadsPanel.hidePanel();
+ await hiddenPromise;
+});
+
+add_task(async function test_preferences_enable_alwaysOpenSimilarFiles() {
+ // Force mimetype pref
+ ensureMIMEState({ preferredAction: saveToDisk });
+
+ // open panel
+ await task_openPanel();
+ await TestUtils.waitForCondition(() => {
+ let downloadsListBox = document.getElementById("downloadsListBox");
+ downloadsListBox.removeAttribute("disabled");
+ return downloadsListBox.childElementCount == downloads.length;
+ });
+
+ info("trigger the context menu");
+ let itemTarget = document.querySelector(
+ "#downloadsListBox richlistitem .downloadMainArea"
+ );
+
+ let contextMenu = await openContextMenu(itemTarget);
+ let alwaysOpenSimilarFilesItem = contextMenu.querySelector(
+ ".downloadAlwaysOpenSimilarFilesMenuItem"
+ );
+
+ alwaysOpenSimilarFilesItem.click();
+
+ await TestUtils.waitForCondition(() => {
+ let mimeInfo = gMimeSvc.getFromTypeAndExtension("text/plain", "txt");
+ return mimeInfo.preferredAction === useSystemDefault;
+ });
+ let mimeInfo = gMimeSvc.getFromTypeAndExtension("text/plain", "txt");
+
+ is(
+ mimeInfo.preferredAction,
+ useSystemDefault,
+ "Preference should switch to useSystemDefault"
+ );
+
+ contextMenu.hidePopup();
+ DownloadsPanel.hidePanel();
+});
+
+add_task(async function test_preferences_disable_alwaysOpenSimilarFiles() {
+ // Force mimetype pref
+ ensureMIMEState({ preferredAction: useSystemDefault });
+
+ await task_openPanel();
+ await TestUtils.waitForCondition(() => {
+ let downloadsListBox = document.getElementById("downloadsListBox");
+ downloadsListBox.removeAttribute("disabled");
+ return downloadsListBox.childElementCount == downloads.length;
+ });
+
+ info("trigger the context menu");
+ let itemTarget = document.querySelector(
+ "#downloadsListBox richlistitem .downloadMainArea"
+ );
+
+ let contextMenu = await openContextMenu(itemTarget);
+ let alwaysOpenSimilarFilesItem = contextMenu.querySelector(
+ ".downloadAlwaysOpenSimilarFilesMenuItem"
+ );
+
+ alwaysOpenSimilarFilesItem.click();
+
+ await TestUtils.waitForCondition(() => {
+ let mimeInfo = gMimeSvc.getFromTypeAndExtension("text/plain", "txt");
+ return mimeInfo.preferredAction === saveToDisk;
+ });
+ let mimeInfo = gMimeSvc.getFromTypeAndExtension("text/plain", "txt");
+
+ is(
+ mimeInfo.preferredAction,
+ saveToDisk,
+ "Preference should switch to saveToDisk"
+ );
+
+ contextMenu.hidePopup();
+ DownloadsPanel.hidePanel();
+});