summaryrefslogtreecommitdiffstats
path: root/browser/components/downloads/test/browser/browser_downloads_panel_block.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/downloads/test/browser/browser_downloads_panel_block.js')
-rw-r--r--browser/components/downloads/test/browser/browser_downloads_panel_block.js130
1 files changed, 130 insertions, 0 deletions
diff --git a/browser/components/downloads/test/browser/browser_downloads_panel_block.js b/browser/components/downloads/test/browser/browser_downloads_panel_block.js
new file mode 100644
index 0000000000..d1035db08d
--- /dev/null
+++ b/browser/components/downloads/test/browser/browser_downloads_panel_block.js
@@ -0,0 +1,130 @@
+/* Any copyright is dedicated to the Public Domain.
+ * https://creativecommons.org/publicdomain/zero/1.0/ */
+
+/* eslint-disable mozilla/no-arbitrary-setTimeout */
+"use strict";
+
+add_task(async function mainTest() {
+ await task_resetState();
+
+ let verdicts = [
+ Downloads.Error.BLOCK_VERDICT_UNCOMMON,
+ Downloads.Error.BLOCK_VERDICT_MALWARE,
+ Downloads.Error.BLOCK_VERDICT_POTENTIALLY_UNWANTED,
+ Downloads.Error.BLOCK_VERDICT_INSECURE,
+ ];
+ await task_addDownloads(verdicts.map(v => makeDownload(v)));
+
+ // Check that the richlistitem for each download is correct.
+ for (let i = 0; i < verdicts.length; i++) {
+ await task_openPanel();
+
+ // Handle items backwards, using lastElementChild, to ensure there's no
+ // code wrongly resetting the selection to the first item during the process.
+ let item = DownloadsView.richListBox.lastElementChild;
+
+ info("Open the panel and click the item to show the subview.");
+ let viewPromise = promiseViewShown(DownloadsBlockedSubview.subview);
+ EventUtils.synthesizeMouseAtCenter(item, {});
+ await viewPromise;
+
+ // Items are listed in newest-to-oldest order, so e.g. the first item's
+ // verdict is the last element in the verdicts array.
+ Assert.ok(
+ DownloadsBlockedSubview.subview.getAttribute("verdict"),
+ verdicts[verdicts.count - i - 1]
+ );
+
+ info("Go back to the main view.");
+ viewPromise = promiseViewShown(DownloadsBlockedSubview.mainView);
+ DownloadsBlockedSubview.panelMultiView.goBack();
+ await viewPromise;
+
+ info("Show the subview again.");
+ viewPromise = promiseViewShown(DownloadsBlockedSubview.subview);
+ EventUtils.synthesizeMouseAtCenter(item, {});
+ await viewPromise;
+
+ info("Click the Open button.");
+ // The download should be unblocked and then opened,
+ // i.e., unblockAndOpenDownload() should be called on the item. The panel
+ // should also be closed as a result, so wait for that too.
+ let unblockPromise = promiseUnblockAndSaveCalled(item);
+ let hidePromise = promisePanelHidden();
+ // Simulate a mousemove to ensure it's not wrongly being handled by the
+ // panel as the user changing download selection.
+ EventUtils.synthesizeMouseAtCenter(
+ DownloadsBlockedSubview.elements.unblockButton,
+ { type: "mousemove" }
+ );
+ EventUtils.synthesizeMouseAtCenter(
+ DownloadsBlockedSubview.elements.unblockButton,
+ {}
+ );
+ info("waiting for unblockOpen");
+ await unblockPromise;
+ info("waiting for hide panel");
+ await hidePromise;
+
+ window.focus();
+ await SimpleTest.promiseFocus(window);
+
+ info("Reopen the panel and show the subview again.");
+ await task_openPanel();
+ viewPromise = promiseViewShown(DownloadsBlockedSubview.subview);
+ EventUtils.synthesizeMouseAtCenter(item, {});
+ await viewPromise;
+
+ info("Click the Remove button.");
+ // The panel should close and the item should be removed from it.
+ hidePromise = promisePanelHidden();
+ EventUtils.synthesizeMouseAtCenter(
+ DownloadsBlockedSubview.elements.deleteButton,
+ {}
+ );
+ info("Waiting for hide panel");
+ await hidePromise;
+
+ info("Open the panel again and check the item is gone.");
+ await task_openPanel();
+ Assert.ok(!item.parentNode);
+
+ hidePromise = promisePanelHidden();
+ DownloadsPanel.hidePanel();
+ await hidePromise;
+ }
+
+ await task_resetState();
+});
+
+function promisePanelHidden() {
+ return BrowserTestUtils.waitForEvent(DownloadsPanel.panel, "popuphidden");
+}
+
+function makeDownload(verdict) {
+ return {
+ state: DownloadsCommon.DOWNLOAD_DIRTY,
+ hasBlockedData: true,
+ errorObj: {
+ result: Cr.NS_ERROR_FAILURE,
+ message: "Download blocked.",
+ becauseBlocked: true,
+ becauseBlockedByReputationCheck: true,
+ reputationCheckVerdict: verdict,
+ },
+ };
+}
+
+function promiseViewShown(view) {
+ return BrowserTestUtils.waitForEvent(view, "ViewShown");
+}
+
+function promiseUnblockAndSaveCalled(item) {
+ return new Promise(resolve => {
+ let realFn = item._shell.unblockAndSave;
+ item._shell.unblockAndSave = async () => {
+ item._shell.unblockAndSave = realFn;
+ resolve();
+ };
+ });
+}