summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/attachment/browser_attachmentEvents.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/test/browser/attachment/browser_attachmentEvents.js')
-rw-r--r--comm/mail/test/browser/attachment/browser_attachmentEvents.js494
1 files changed, 494 insertions, 0 deletions
diff --git a/comm/mail/test/browser/attachment/browser_attachmentEvents.js b/comm/mail/test/browser/attachment/browser_attachmentEvents.js
new file mode 100644
index 0000000000..beb7034a86
--- /dev/null
+++ b/comm/mail/test/browser/attachment/browser_attachmentEvents.js
@@ -0,0 +1,494 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+/**
+ * Ensures that attachment events are fired properly
+ */
+
+/* eslint-disable @microsoft/sdl/no-insecure-url */
+
+"use strict";
+
+var { select_attachments } = ChromeUtils.import(
+ "resource://testing-common/mozmill/AttachmentHelpers.jsm"
+);
+var { mc } = ChromeUtils.import(
+ "resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
+);
+var utils = ChromeUtils.import("resource://testing-common/mozmill/utils.jsm");
+var { add_attachments, close_compose_window, open_compose_new_mail } =
+ ChromeUtils.import("resource://testing-common/mozmill/ComposeHelpers.jsm");
+var { gMockPromptService } = ChromeUtils.import(
+ "resource://testing-common/mozmill/PromptHelpers.jsm"
+);
+
+var kAttachmentsAdded = "attachments-added";
+var kAttachmentsRemoved = "attachments-removed";
+var kAttachmentRenamed = "attachment-renamed";
+
+/**
+ * Test that the attachments-added event is fired when we add a single
+ * attachment.
+ */
+add_task(function test_attachments_added_on_single() {
+ // Prepare to listen for attachments-added
+ let eventCount = 0;
+ let lastEvent;
+ let listener = function (event) {
+ eventCount++;
+ lastEvent = event;
+ };
+
+ // Open up the compose window
+ let cw = open_compose_new_mail(mc);
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .addEventListener(kAttachmentsAdded, listener);
+
+ // Attach a single file
+ add_attachments(cw, "http://www.example.com/1", 0, false);
+
+ // Make sure we only saw the event once
+ Assert.equal(1, eventCount);
+
+ // Make sure that we were passed the right subject
+ let subjects = lastEvent.detail;
+ Assert.equal(1, subjects.length);
+ Assert.equal("http://www.example.com/1", subjects[0].url);
+
+ // Make sure that we can get that event again if we
+ // attach more files.
+ add_attachments(cw, "http://www.example.com/2", 0, false);
+ Assert.equal(2, eventCount);
+ subjects = lastEvent.detail;
+ Assert.equal("http://www.example.com/2", subjects[0].url);
+
+ // And check that we don't receive the event if we try to attach a file
+ // that's already attached.
+ add_attachments(cw, "http://www.example.com/2", null, false);
+ Assert.equal(2, eventCount);
+
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .removeEventListener(kAttachmentsAdded, listener);
+ close_compose_window(cw);
+});
+
+/**
+ * Test that the attachments-added event is fired when we add a series
+ * of files all at once.
+ */
+add_task(function test_attachments_added_on_multiple() {
+ // Prepare to listen for attachments-added
+ let eventCount = 0;
+ let lastEvent;
+ let listener = function (event) {
+ eventCount++;
+ lastEvent = event;
+ };
+
+ // Prepare the attachments - we store the names in attachmentNames to
+ // make sure that we observed the right event subjects later on.
+ let attachmentUrls = ["http://www.example.com/1", "http://www.example.com/2"];
+
+ // Open the compose window and add the attachments
+ let cw = open_compose_new_mail(mc);
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .addEventListener(kAttachmentsAdded, listener);
+
+ add_attachments(cw, attachmentUrls, null, false);
+
+ // Make sure we only saw a single attachments-added for this group
+ // of files.
+ Assert.equal(1, eventCount);
+
+ // Now make sure we got passed the right subjects for the event
+ let subjects = lastEvent.detail;
+ Assert.equal(2, subjects.length);
+
+ for (let attachment of subjects) {
+ Assert.ok(attachmentUrls.includes(attachment.url));
+ }
+
+ // Close the compose window - let's try again with 3 attachments.
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .removeEventListener(kAttachmentsAdded, listener);
+ close_compose_window(cw);
+
+ attachmentUrls = [
+ "http://www.example.com/1",
+ "http://www.example.com/2",
+ "http://www.example.com/3",
+ ];
+
+ // Open the compose window and attach the files, and ensure that we saw
+ // the attachments-added event
+ cw = open_compose_new_mail(mc);
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .addEventListener(kAttachmentsAdded, listener);
+
+ add_attachments(cw, attachmentUrls, null, false);
+ Assert.equal(2, eventCount);
+
+ // Make sure that we got the right subjects back
+ subjects = lastEvent.detail;
+ Assert.equal(3, subjects.length);
+
+ for (let attachment of subjects) {
+ Assert.ok(attachmentUrls.includes(attachment.url));
+ }
+
+ // Make sure we don't fire the event again if we try to attach the same
+ // files.
+ add_attachments(cw, attachmentUrls, null, false);
+ Assert.equal(2, eventCount);
+
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .removeEventListener(kAttachmentsAdded, listener);
+ close_compose_window(cw);
+});
+
+/**
+ * Test that the attachments-removed event is fired when removing a
+ * single file.
+ */
+add_task(function test_attachments_removed_on_single() {
+ // Prepare to listen for attachments-removed
+ let eventCount = 0;
+ let lastEvent;
+ let listener = function (event) {
+ eventCount++;
+ lastEvent = event;
+ };
+
+ // Open up the compose window, attach a file...
+ let cw = open_compose_new_mail(mc);
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .addEventListener(kAttachmentsRemoved, listener);
+
+ add_attachments(cw, "http://www.example.com/1");
+
+ // Now select that attachment and delete it
+ select_attachments(cw, 0);
+ // We need to hold a reference to removedAttachment here because
+ // the delete routine nulls it out from the attachmentitem.
+ cw.window.goDoCommand("cmd_delete");
+ // Make sure we saw the event
+ Assert.equal(1, eventCount);
+ // And make sure we were passed the right attachment item as the
+ // subject.
+ let subjects = lastEvent.detail;
+ Assert.equal(1, subjects.length);
+ Assert.equal(subjects[0].url, "http://www.example.com/1");
+
+ // Ok, let's attach it again, and remove it again to ensure that
+ // we still see the event.
+ add_attachments(cw, "http://www.example.com/2");
+ select_attachments(cw, 0);
+ cw.window.goDoCommand("cmd_delete");
+
+ Assert.equal(2, eventCount);
+ subjects = lastEvent.detail;
+ Assert.equal(1, subjects.length);
+ Assert.equal(subjects[0].url, "http://www.example.com/2");
+
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .removeEventListener(kAttachmentsRemoved, listener);
+ close_compose_window(cw);
+});
+
+/**
+ * Test that the attachments-removed event is fired when removing multiple
+ * files all at once.
+ */
+add_task(function test_attachments_removed_on_multiple() {
+ // Prepare to listen for attachments-removed
+ let eventCount = 0;
+ let lastEvent;
+ let listener = function (event) {
+ eventCount++;
+ lastEvent = event;
+ };
+
+ // Open up the compose window and attach some files...
+ let cw = open_compose_new_mail(mc);
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .addEventListener(kAttachmentsRemoved, listener);
+
+ add_attachments(cw, [
+ "http://www.example.com/1",
+ "http://www.example.com/2",
+ "http://www.example.com/3",
+ ]);
+
+ // Select all three attachments, and remove them.
+ let removedAttachmentItems = select_attachments(cw, 0, 2);
+
+ let removedAttachmentUrls = removedAttachmentItems.map(
+ aAttachment => aAttachment.attachment.url
+ );
+
+ cw.window.goDoCommand("cmd_delete");
+
+ // We should have seen the attachments-removed event exactly once.
+ Assert.equal(1, eventCount);
+
+ // Now let's make sure we got passed back the right attachment items
+ // as the event subject
+ let subjects = lastEvent.detail;
+ Assert.equal(3, subjects.length);
+
+ for (let attachment of subjects) {
+ Assert.ok(removedAttachmentUrls.includes(attachment.url));
+ }
+
+ // Ok, let's attach and remove some again to ensure that we still see the event.
+ add_attachments(cw, ["http://www.example.com/1", "http://www.example.com/2"]);
+
+ select_attachments(cw, 0, 1);
+ cw.window.goDoCommand("cmd_delete");
+ Assert.equal(2, eventCount);
+
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .removeEventListener(kAttachmentsRemoved, listener);
+ close_compose_window(cw);
+});
+
+/**
+ * Test that we don't see the attachments-removed event if no attachments
+ * are selected when hitting "Delete"
+ */
+add_task(function test_no_attachments_removed_on_none() {
+ // Prepare to listen for attachments-removed
+ let eventCount = 0;
+ let listener = function (event) {
+ eventCount++;
+ };
+
+ // Open the compose window and add some attachments.
+ let cw = open_compose_new_mail(mc);
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .addEventListener(kAttachmentsRemoved, listener);
+
+ add_attachments(cw, [
+ "http://www.example.com/1",
+ "http://www.example.com/2",
+ "http://www.example.com/3",
+ ]);
+
+ // Choose no attachments
+ cw.window.document.getElementById("attachmentBucket").clearSelection();
+ // Run the delete command
+ cw.window.goDoCommand("cmd_delete");
+ // Make sure we didn't see the attachments_removed event.
+ Assert.equal(0, eventCount);
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .removeEventListener(kAttachmentsRemoved, listener);
+
+ close_compose_window(cw);
+});
+
+/**
+ * Test that we see the attachment-renamed event when an attachments
+ * name is changed.
+ */
+add_task(function test_attachment_renamed() {
+ // Here's what we'll rename some files to.
+ const kRenameTo1 = "Renamed-1";
+ const kRenameTo2 = "Renamed-2";
+ const kRenameTo3 = "Renamed-3";
+
+ // Prepare to listen for attachment-renamed
+ let eventCount = 0;
+ let lastEvent;
+ let listener = function (event) {
+ eventCount++;
+ lastEvent = event;
+ };
+
+ // Renaming a file brings up a Prompt, so we'll mock the Prompt Service
+ gMockPromptService.reset();
+ gMockPromptService.register();
+ // The inoutValue is used to set the attachment name
+ gMockPromptService.inoutValue = kRenameTo1;
+ gMockPromptService.returnValue = true;
+
+ // Open up the compose window, attach some files, choose the first
+ // attachment, and choose to rename it.
+ let cw = open_compose_new_mail(mc);
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .addEventListener(kAttachmentRenamed, listener);
+
+ add_attachments(cw, [
+ "http://www.example.com/1",
+ "http://www.example.com/2",
+ "http://www.example.com/3",
+ ]);
+
+ select_attachments(cw, 0);
+ Assert.equal(0, eventCount);
+ cw.window.goDoCommand("cmd_renameAttachment");
+
+ // Wait until we saw the attachment-renamed event.
+ utils.waitFor(function () {
+ return eventCount == 1;
+ });
+
+ // Ensure that the event mentions the right attachment
+ let renamedAttachment1 = lastEvent.target.attachment;
+ let originalAttachment1 = lastEvent.detail;
+ Assert.ok(renamedAttachment1 instanceof Ci.nsIMsgAttachment);
+ Assert.equal(kRenameTo1, renamedAttachment1.name);
+ Assert.ok(renamedAttachment1.url.includes("http://www.example.com/1"));
+ Assert.equal("www.example.com/1", originalAttachment1.name);
+
+ // Ok, let's try renaming the same attachment.
+ gMockPromptService.reset();
+ gMockPromptService.inoutValue = kRenameTo2;
+ gMockPromptService.returnValue = true;
+
+ select_attachments(cw, 0);
+ Assert.equal(1, eventCount);
+ cw.window.goDoCommand("cmd_renameAttachment");
+
+ // Wait until we saw the attachment-renamed event.
+ utils.waitFor(function () {
+ return eventCount == 2;
+ });
+
+ let renamedAttachment2 = lastEvent.target.attachment;
+ let originalAttachment2 = lastEvent.detail;
+ Assert.ok(renamedAttachment2 instanceof Ci.nsIMsgAttachment);
+ Assert.equal(kRenameTo2, renamedAttachment2.name);
+ Assert.ok(renamedAttachment2.url.includes("http://www.example.com/1"));
+ Assert.equal(kRenameTo1, originalAttachment2.name);
+
+ // Ok, let's rename another attachment
+ gMockPromptService.reset();
+ gMockPromptService.inoutValue = kRenameTo3;
+ gMockPromptService.returnValue = true;
+
+ // We'll select the second attachment this time.
+ select_attachments(cw, 1);
+ Assert.equal(2, eventCount);
+ cw.window.goDoCommand("cmd_renameAttachment");
+
+ // Wait until we saw the attachment-renamed event.
+ utils.waitFor(function () {
+ return eventCount == 3;
+ });
+
+ // Ensure that the event mentions the right attachment
+ let renamedAttachment3 = lastEvent.target.attachment;
+ let originalAttachment3 = lastEvent.detail;
+ Assert.ok(renamedAttachment3 instanceof Ci.nsIMsgAttachment);
+ Assert.equal(kRenameTo3, renamedAttachment3.name);
+ Assert.ok(renamedAttachment3.url.includes("http://www.example.com/2"));
+ Assert.equal("www.example.com/2", originalAttachment3.name);
+
+ // Unregister the Mock Prompt service, and remove our observer.
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .removeEventListener(kAttachmentRenamed, listener);
+
+ close_compose_window(cw);
+ gMockPromptService.unregister();
+});
+
+/**
+ * Test that the attachment-renamed event is not fired if we set the
+ * filename to be blank.
+ */
+add_task(function test_no_attachment_renamed_on_blank() {
+ // Prepare to listen for attachment-renamed
+ let eventCount = 0;
+ let listener = function (event) {
+ eventCount++;
+ };
+
+ // Register the Mock Prompt Service to return the empty string when
+ // prompted.
+ gMockPromptService.reset();
+ gMockPromptService.register();
+ gMockPromptService.inoutValue = "";
+ gMockPromptService.returnValue = true;
+
+ // Open the compose window, attach some files, select one, and chooes to
+ // rename it.
+ let cw = open_compose_new_mail(mc);
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .addEventListener(kAttachmentRenamed, listener);
+
+ add_attachments(cw, [
+ "http://www.example.com/1",
+ "http://www.example.com/2",
+ "http://www.example.com/3",
+ ]);
+
+ select_attachments(cw, 0);
+ cw.window.goDoCommand("cmd_renameAttachment");
+
+ // Ensure that we didn't see the attachment-renamed event.
+ Assert.equal(0, eventCount);
+ cw.window.document
+ .getElementById("attachmentBucket")
+ .removeEventListener(kAttachmentRenamed, listener);
+ close_compose_window(cw);
+ gMockPromptService.unregister();
+});
+
+/**
+ * Test that toggling attachments pane works.
+ */
+add_task(function test_attachments_pane_toggle() {
+ // Open the compose window.
+ let cw = open_compose_new_mail(mc);
+
+ // Use the hotkey to try to toggle attachmentsArea open.
+ let opts =
+ AppConstants.platform == "macosx"
+ ? { metaKey: true, shiftKey: true }
+ : { ctrlKey: true, shiftKey: true };
+ EventUtils.synthesizeKey("m", opts, cw.window);
+ let attachmentArea = cw.window.document.getElementById("attachmentArea");
+
+ // Since we don't have any uploaded attachment, assert that the box remains
+ // closed.
+ utils.waitFor(() => !attachmentArea.open);
+ Assert.ok(!attachmentArea.open);
+
+ // Add an attachment. This should automatically open the box.
+ add_attachments(cw, ["http://www.example.com/1"]);
+ Assert.ok(attachmentArea.open);
+
+ // Press again, should toggle to closed.
+ EventUtils.synthesizeKey("m", opts, cw.window);
+ utils.waitFor(() => !attachmentArea.open);
+ Assert.ok(!attachmentArea.open);
+
+ // Press again, should toggle to open.
+ EventUtils.synthesizeKey("m", opts, cw.window);
+ utils.waitFor(() => attachmentArea.open);
+ Assert.ok(attachmentArea.open);
+
+ close_compose_window(cw);
+});
+
+registerCleanupFunction(() => {
+ // Some tests that open new windows don't return focus to the main window
+ // in a way that satisfies mochitest, and the test times out.
+ Services.focus.focusedWindow = window;
+});