summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/composition/browser_attachmentReminder.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/test/browser/composition/browser_attachmentReminder.js')
-rw-r--r--comm/mail/test/browser/composition/browser_attachmentReminder.js892
1 files changed, 892 insertions, 0 deletions
diff --git a/comm/mail/test/browser/composition/browser_attachmentReminder.js b/comm/mail/test/browser/composition/browser_attachmentReminder.js
new file mode 100644
index 0000000000..8566f9b4cf
--- /dev/null
+++ b/comm/mail/test/browser/composition/browser_attachmentReminder.js
@@ -0,0 +1,892 @@
+/* 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/. */
+
+/**
+ * Tests that the attachment reminder works properly.
+ */
+
+"use strict";
+
+var {
+ add_attachments,
+ close_compose_window,
+ open_compose_new_mail,
+ save_compose_message,
+ setup_msg_contents,
+ wait_for_compose_window,
+} = ChromeUtils.import("resource://testing-common/mozmill/ComposeHelpers.jsm");
+var {
+ be_in_folder,
+ get_special_folder,
+ get_about_message,
+ mc,
+ press_delete,
+ select_click_row,
+} = ChromeUtils.import(
+ "resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
+);
+var { delete_all_existing } = ChromeUtils.import(
+ "resource://testing-common/mozmill/KeyboardHelpers.jsm"
+);
+var {
+ assert_notification_displayed,
+ check_notification_displayed,
+ get_notification_button,
+ get_notification,
+ wait_for_notification_to_show,
+ wait_for_notification_to_stop,
+} = ChromeUtils.import(
+ "resource://testing-common/mozmill/NotificationBoxHelpers.jsm"
+);
+var {
+ click_menus_in_sequence,
+ plan_for_modal_dialog,
+ plan_for_new_window,
+ plan_for_window_close,
+ wait_for_modal_dialog,
+ wait_for_window_close,
+ wait_for_window_focused,
+} = ChromeUtils.import("resource://testing-common/mozmill/WindowHelpers.jsm");
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+
+let aboutMessage = get_about_message();
+
+var kBoxId = "compose-notification-bottom";
+var kNotificationId = "attachmentReminder";
+var kReminderPref = "mail.compose.attachment_reminder";
+var gDrafts;
+var gOutbox;
+
+add_setup(async function () {
+ requestLongerTimeout(4);
+
+ gDrafts = await get_special_folder(Ci.nsMsgFolderFlags.Drafts, true);
+ gOutbox = await get_special_folder(Ci.nsMsgFolderFlags.Queue);
+
+ Assert.ok(Services.prefs.getBoolPref(kReminderPref));
+});
+
+/**
+ * Check if the attachment reminder bar is in the wished state.
+ *
+ * @param aCwc A compose window controller.
+ * @param aShown True for expecting the bar to be shown, false otherwise.
+ *
+ * @returns If the bar is shown, return the notification object.
+ */
+function assert_automatic_reminder_state(aCwc, aShown) {
+ return assert_notification_displayed(
+ aCwc.window,
+ kBoxId,
+ kNotificationId,
+ aShown
+ );
+}
+
+/**
+ * Waits for the attachment reminder bar to change into the wished state.
+ *
+ * @param aCwc A compose window controller.
+ * @param aShown True for waiting for the bar to be shown,
+ * false for waiting for it to be hidden.
+ * @param aDelay Set to true to sleep a while to give the notification time
+ * to change. This is used if the state is already what we want
+ * but we expect it could change in a short while.
+ */
+async function wait_for_reminder_state(aCwc, aShown, aDelay = false) {
+ const notificationSlackTime = 5000;
+
+ if (aShown) {
+ if (aDelay) {
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, notificationSlackTime));
+ }
+ // This waits up to 30 seconds for the notification to appear.
+ wait_for_notification_to_show(aCwc.window, kBoxId, kNotificationId);
+ } else if (
+ check_notification_displayed(aCwc.window, kBoxId, kNotificationId)
+ ) {
+ // This waits up to 30 seconds for the notification to disappear.
+ wait_for_notification_to_stop(aCwc.window, kBoxId, kNotificationId);
+ } else {
+ // This waits 5 seconds during which the notification must not appear.
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, notificationSlackTime));
+ assert_automatic_reminder_state(aCwc, false);
+ }
+}
+
+/**
+ * Check whether the manual reminder is in the proper state.
+ *
+ * @param aCwc A compose window controller.
+ * @param aChecked Whether the reminder should be enabled.
+ */
+function assert_manual_reminder_state(aCwc, aChecked) {
+ const remindCommand = "cmd_remindLater";
+ Assert.equal(
+ aCwc.window.document
+ .getElementById("button-attachPopup_remindLaterItem")
+ .getAttribute("command"),
+ remindCommand
+ );
+
+ let checkedValue = aChecked ? "true" : "false";
+ Assert.equal(
+ aCwc.window.document.getElementById(remindCommand).getAttribute("checked"),
+ checkedValue
+ );
+}
+
+/**
+ * Returns the keywords string currently shown in the notification message.
+ *
+ * @param {MozMillController} cwc - The compose window controller.
+ */
+function get_reminder_keywords(cwc) {
+ assert_automatic_reminder_state(cwc, true);
+ let box = get_notification(cwc.window, kBoxId, kNotificationId);
+ return box.messageText.querySelector("#attachmentKeywords").textContent;
+}
+
+/**
+ * Test that the attachment reminder works, in general.
+ */
+add_task(async function test_attachment_reminder_appears_properly() {
+ let cwc = open_compose_new_mail();
+
+ // There should be no notification yet.
+ assert_automatic_reminder_state(cwc, false);
+
+ setup_msg_contents(
+ cwc,
+ "test@example.org",
+ "Testing automatic reminder!",
+ "Hello! "
+ );
+
+ // Give the notification time to appear. It shouldn't.
+ await wait_for_reminder_state(cwc, false);
+
+ cwc.window.document.getElementById("messageEditor").focus();
+ EventUtils.sendString("Seen this cool attachment?", cwc.window);
+
+ // Give the notification time to appear. It should now.
+ await wait_for_reminder_state(cwc, true);
+
+ // The manual reminder should be disabled yet.
+ assert_manual_reminder_state(cwc, false);
+
+ let box = get_notification(cwc.window, kBoxId, kNotificationId);
+ // Click ok to be notified on send if no attachments are attached.
+ EventUtils.synthesizeMouseAtCenter(
+ box.buttonContainer.lastElementChild,
+ {},
+ cwc.window
+ );
+ await wait_for_reminder_state(cwc, false);
+
+ // The manual reminder should be enabled now.
+ assert_manual_reminder_state(cwc, true);
+
+ // Now try to send, make sure we get the alert.
+ // Click the "Oh, I Did!" button in the attachment reminder dialog.
+ let dialogPromise = BrowserTestUtils.promiseAlertDialog("extra1");
+ let buttonSend = cwc.window.document.getElementById("button-send");
+ EventUtils.synthesizeMouseAtCenter(buttonSend, {}, buttonSend.ownerGlobal);
+ await dialogPromise;
+ await new Promise(resolve => setTimeout(resolve));
+
+ // After confirming the reminder the menuitem should get disabled.
+ assert_manual_reminder_state(cwc, false);
+
+ close_compose_window(cwc);
+});
+
+/**
+ * Test that the alert appears normally, but not after closing the
+ * notification.
+ */
+add_task(async function test_attachment_reminder_dismissal() {
+ let cwc = open_compose_new_mail();
+
+ // There should be no notification yet.
+ assert_automatic_reminder_state(cwc, false);
+
+ setup_msg_contents(
+ cwc,
+ "test@example.org",
+ "popping up, eh?",
+ "Hi there, remember the attachment! " +
+ "Yes, there is a file test.doc attached! " +
+ "Do check it, test.doc is a nice attachment."
+ );
+
+ // Give the notification time to appear.
+ await wait_for_reminder_state(cwc, true);
+
+ Assert.equal(get_reminder_keywords(cwc), "test.doc, attachment, attached");
+
+ // We didn't click the "Remind Me Later" - the alert should pop up
+ // on send anyway.
+ // Click the "Oh, I Did!" button in the attachment reminder dialog.
+ let dialogPromise = BrowserTestUtils.promiseAlertDialog("extra1");
+ let buttonSend = cwc.window.document.getElementById("button-send");
+ EventUtils.synthesizeMouseAtCenter(buttonSend, {}, buttonSend.ownerGlobal);
+ await dialogPromise;
+ await new Promise(resolve => setTimeout(resolve));
+
+ let notification = assert_automatic_reminder_state(cwc, true);
+
+ notification.close();
+ assert_automatic_reminder_state(cwc, false);
+
+ click_send_and_handle_send_error(cwc);
+
+ close_compose_window(cwc);
+});
+
+/**
+ * Bug 938829
+ * Check that adding an attachment actually hides the notification.
+ */
+add_task(async function test_attachment_reminder_with_attachment() {
+ let cwc = open_compose_new_mail();
+
+ // There should be no notification yet.
+ assert_automatic_reminder_state(cwc, false);
+
+ setup_msg_contents(
+ cwc,
+ "test@example.org",
+ "Testing automatic reminder!",
+ "Hello! We will have a real attachment here."
+ );
+
+ // Give the notification time to appear. It should.
+ await wait_for_reminder_state(cwc, true);
+
+ // Add an attachment.
+ let file = Services.dirsvc.get("ProfD", Ci.nsIFile);
+ file.append("prefs.js");
+ Assert.ok(
+ file.exists(),
+ "The required file prefs.js was not found in the profile."
+ );
+ let attachments = [cwc.window.FileToAttachment(file)];
+ cwc.window.AddAttachments(attachments);
+
+ // The notification should hide.
+ await wait_for_reminder_state(cwc, false);
+
+ // Add some more text with keyword so the automatic notification
+ // could potentially show up.
+ setup_msg_contents(cwc, "", "", " Yes, there is a file attached!");
+ // Give the notification time to appear. It shouldn't.
+ await wait_for_reminder_state(cwc, false);
+
+ cwc.window.RemoveAllAttachments();
+
+ // After removing the attachment, notification should come back
+ // with all the keywords, even those input while having an attachment.
+ await wait_for_reminder_state(cwc, true);
+ Assert.equal(get_reminder_keywords(cwc), "attachment, attached");
+
+ close_compose_window(cwc);
+});
+
+/**
+ * Test that the mail.compose.attachment_reminder_aggressive pref works.
+ */
+add_task(async function test_attachment_reminder_aggressive_pref() {
+ const kPref = "mail.compose.attachment_reminder_aggressive";
+ Services.prefs.setBoolPref(kPref, false);
+
+ let cwc = open_compose_new_mail();
+
+ // There should be no notification yet.
+ assert_automatic_reminder_state(cwc, false);
+
+ setup_msg_contents(
+ cwc,
+ "test@example.org",
+ "aggressive?",
+ "Check this attachment!"
+ );
+
+ await wait_for_reminder_state(cwc, true);
+ click_send_and_handle_send_error(cwc);
+
+ close_compose_window(cwc);
+
+ // Now reset the pref back to original value.
+ if (Services.prefs.prefHasUserValue(kPref)) {
+ Services.prefs.clearUserPref(kPref);
+ }
+});
+
+/**
+ * Test that clicking "No, Send Now" in the attachment reminder alert
+ * works.
+ */
+add_task(async function test_no_send_now_sends() {
+ let cwc = open_compose_new_mail();
+
+ setup_msg_contents(
+ cwc,
+ "test@example.org",
+ "will the 'No, Send Now' button work?",
+ "Hello, I got your attachment!"
+ );
+
+ await wait_for_reminder_state(cwc, true);
+
+ // Click the send button again, this time choose "No, Send Now".
+ let dialogPromise = BrowserTestUtils.promiseAlertDialog("accept");
+ let buttonSend = cwc.window.document.getElementById("button-send");
+ EventUtils.synthesizeMouseAtCenter(buttonSend, {}, buttonSend.ownerGlobal);
+ await dialogPromise;
+ await new Promise(resolve => setTimeout(resolve));
+
+ // After clicking "Send Now" sending is proceeding, just handle the error.
+ click_send_and_handle_send_error(cwc, true);
+
+ // We're now back in the compose window, let's close it then.
+ close_compose_window(cwc);
+});
+
+/**
+ * Click the manual reminder in the menu.
+ *
+ * @param aCwc A compose window controller.
+ * @param aExpectedState A boolean specifying what is the expected state
+ * of the reminder menuitem after the click.
+ */
+async function click_manual_reminder(aCwc, aExpectedState) {
+ wait_for_window_focused(aCwc.window);
+ let button = aCwc.window.document.getElementById("button-attach");
+
+ let popup = aCwc.window.document.getElementById("button-attachPopup");
+ let shownPromise = BrowserTestUtils.waitForEvent(popup, "popupshown");
+ EventUtils.synthesizeMouseAtCenter(
+ button.querySelector(".toolbarbutton-menubutton-dropmarker"),
+ {},
+ aCwc.window
+ );
+ await shownPromise;
+ let hiddenPromise = BrowserTestUtils.waitForEvent(popup, "popuphidden");
+ popup.activateItem(
+ aCwc.window.document.getElementById("button-attachPopup_remindLaterItem")
+ );
+ await hiddenPromise;
+ wait_for_window_focused(aCwc.window);
+ assert_manual_reminder_state(aCwc, aExpectedState);
+}
+
+/**
+ * Bug 521128
+ * Test proper behaviour of the manual reminder.
+ */
+add_task(async function test_manual_attachment_reminder() {
+ // Open a sample message with no attachment keywords.
+ let cwc = open_compose_new_mail();
+ setup_msg_contents(
+ cwc,
+ "test@example.invalid",
+ "Testing manual reminder!",
+ "Some body..."
+ );
+
+ // Enable the manual reminder.
+ await click_manual_reminder(cwc, true);
+ // There should be no attachment notification.
+ assert_automatic_reminder_state(cwc, false);
+
+ // Now close the message with saving it as draft.
+ plan_for_modal_dialog("commonDialogWindow", click_save_message);
+ cwc.window.goDoCommand("cmd_close");
+ wait_for_modal_dialog("commonDialogWindow");
+
+ // Open another blank compose window.
+ cwc = open_compose_new_mail();
+ // This one should have the reminder disabled.
+ assert_manual_reminder_state(cwc, false);
+ // There should be no attachment notification.
+ assert_automatic_reminder_state(cwc, false);
+
+ close_compose_window(cwc);
+
+ // The draft message was saved into Local Folders/Drafts.
+ await be_in_folder(gDrafts);
+
+ select_click_row(0);
+ // Wait for the notification with the Edit button.
+ wait_for_notification_to_show(
+ aboutMessage,
+ "mail-notification-top",
+ "draftMsgContent"
+ );
+ // Edit the draft again...
+ plan_for_new_window("msgcompose");
+ let box = get_notification(
+ aboutMessage,
+ "mail-notification-top",
+ "draftMsgContent"
+ );
+ // ... by clicking Edit in the draft message notification bar.
+ EventUtils.synthesizeMouseAtCenter(
+ box.buttonContainer.firstElementChild,
+ {},
+ aboutMessage
+ );
+ cwc = wait_for_compose_window();
+
+ // Check the reminder enablement was preserved in the message.
+ assert_manual_reminder_state(cwc, true);
+ // There should be no attachment notification.
+ assert_automatic_reminder_state(cwc, false);
+
+ // Now try to send, make sure we get the alert.
+ // Click the "Oh, I Did!" button in the attachment reminder dialog.
+ let dialogPromise = BrowserTestUtils.promiseAlertDialog("extra1");
+ let buttonSend = cwc.window.document.getElementById("button-send");
+ EventUtils.synthesizeMouseAtCenter(buttonSend, {}, buttonSend.ownerGlobal);
+ await dialogPromise;
+ await new Promise(resolve => setTimeout(resolve));
+
+ // We were alerted once and the manual reminder is automatically turned off.
+ assert_manual_reminder_state(cwc, false);
+
+ // Enable the manual reminder and disable it again to see if it toggles right.
+ await click_manual_reminder(cwc, true);
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(resolve => setTimeout(resolve, 2000));
+ await click_manual_reminder(cwc, false);
+
+ // Now try to send again, there should be no more alert.
+ click_send_and_handle_send_error(cwc);
+
+ close_compose_window(cwc);
+
+ // Delete the leftover draft message.
+ press_delete();
+}).__skipMe = AppConstants.platform == "linux"; // See bug 1535292.
+
+/**
+ * Bug 938759
+ * Test hiding of the automatic notification if the manual reminder is set.
+ */
+add_task(
+ async function test_manual_automatic_attachment_reminder_interaction() {
+ // Open a blank message compose
+ let cwc = open_compose_new_mail();
+ // This one should have the reminder disabled.
+ assert_manual_reminder_state(cwc, false);
+ // There should be no attachment notification.
+ assert_automatic_reminder_state(cwc, false);
+
+ // Add some attachment keywords.
+ setup_msg_contents(
+ cwc,
+ "test@example.invalid",
+ "Testing manual reminder!",
+ "Expect an attachment here..."
+ );
+
+ // The automatic attachment notification should pop up.
+ await wait_for_reminder_state(cwc, true);
+
+ // Now enable the manual reminder.
+ await click_manual_reminder(cwc, true);
+ // The attachment notification should disappear.
+ await wait_for_reminder_state(cwc, false);
+
+ // Add some more text so the automatic notification
+ // could potentially show up.
+ setup_msg_contents(cwc, "", "", " and look for your attachment!");
+ // Give the notification time to appear. It shouldn't.
+ await wait_for_reminder_state(cwc, false);
+
+ // Now disable the manual reminder.
+ await click_manual_reminder(cwc, false);
+ // Give the notification time to appear. It shouldn't.
+ await wait_for_reminder_state(cwc, false);
+
+ // Add some more text without keywords.
+ setup_msg_contents(cwc, "", "", " No keywords here.");
+ // Give the notification time to appear. It shouldn't.
+ await wait_for_reminder_state(cwc, false);
+
+ // Add some more text with a new keyword.
+ setup_msg_contents(cwc, "", "", " Do you find it attached?");
+ // Give the notification time to appear. It should now.
+ await wait_for_reminder_state(cwc, true);
+ Assert.equal(get_reminder_keywords(cwc), "attachment, attached");
+
+ close_compose_window(cwc);
+ }
+);
+
+/**
+ * Assert if there is any notification in the compose window.
+ *
+ * @param aCwc Compose Window Controller
+ * @param aValue True if notification should exist.
+ * False otherwise.
+ */
+function assert_any_notification(aCwc, aValue) {
+ let notification =
+ aCwc.window.document.getElementById(kBoxId).currentNotification;
+ if ((notification == null) == aValue) {
+ throw new Error("Notification in wrong state");
+ }
+}
+
+/**
+ * Bug 989653
+ * Send filelink attachment should not trigger the attachment reminder.
+ */
+add_task(function test_attachment_vs_filelink_reminder() {
+ // Open a blank message compose
+ let cwc = open_compose_new_mail();
+ setup_msg_contents(
+ cwc,
+ "test@example.invalid",
+ "Testing Filelink notification",
+ "There is no body. I hope you don't mind!"
+ );
+
+ // There should be no notification yet.
+ assert_any_notification(cwc, false);
+
+ // Bring up the FileLink notification.
+ let kOfferThreshold = "mail.compose.big_attachments.threshold_kb";
+ let maxSize = Services.prefs.getIntPref(kOfferThreshold, 0) * 1024;
+ let file = Services.dirsvc.get("ProfD", Ci.nsIFile);
+ file.append("prefs.js");
+ add_attachments(cwc, Services.io.newFileURI(file).spec, maxSize);
+
+ // The filelink attachment proposal should be up but not the attachment
+ // reminder and it should also not interfere with the sending of the message.
+ wait_for_notification_to_show(cwc.window, kBoxId, "bigAttachment");
+ assert_automatic_reminder_state(cwc, false);
+
+ click_send_and_handle_send_error(cwc);
+ close_compose_window(cwc);
+});
+
+/**
+ * Bug 944643
+ * Test the attachment reminder coming up when keyword is in subject line.
+ */
+add_task(async function test_attachment_reminder_in_subject() {
+ // Open a blank message compose
+ let cwc = open_compose_new_mail();
+ // This one should have the reminder disabled.
+ assert_manual_reminder_state(cwc, false);
+ // There should be no attachment notification.
+ assert_automatic_reminder_state(cwc, false);
+
+ // Add some attachment keyword in subject.
+ setup_msg_contents(
+ cwc,
+ "test@example.invalid",
+ "Testing attachment reminder!",
+ "There is no keyword in this body..."
+ );
+
+ // The automatic attachment notification should pop up.
+ await wait_for_reminder_state(cwc, true);
+ Assert.equal(get_reminder_keywords(cwc), "attachment");
+
+ // Now clear the subject
+ delete_all_existing(cwc, cwc.window.document.getElementById("msgSubject"));
+
+ // Give the notification time to disappear.
+ await wait_for_reminder_state(cwc, false);
+
+ close_compose_window(cwc);
+});
+
+/**
+ * Bug 944643
+ * Test the attachment reminder coming up when keyword is in subject line
+ * and also body.
+ */
+add_task(async function test_attachment_reminder_in_subject_and_body() {
+ // Open a blank message compose
+ let cwc = open_compose_new_mail();
+ // This one should have the reminder disabled.
+ assert_manual_reminder_state(cwc, false);
+ // There should be no attachment notification.
+ assert_automatic_reminder_state(cwc, false);
+
+ // Add some attachment keyword in subject.
+ setup_msg_contents(
+ cwc,
+ "test@example.invalid",
+ "Testing attachment reminder!",
+ "There should be an attached file in this body..."
+ );
+
+ // The automatic attachment notification should pop up.
+ await wait_for_reminder_state(cwc, true);
+ Assert.equal(get_reminder_keywords(cwc), "attachment, attached");
+
+ // Now clear only the subject
+ delete_all_existing(cwc, cwc.window.document.getElementById("msgSubject"));
+
+ // Give the notification some time. It should not disappear,
+ // just reduce the keywords list.
+ await wait_for_reminder_state(cwc, true, true);
+ Assert.equal(get_reminder_keywords(cwc), "attached");
+
+ close_compose_window(cwc);
+});
+
+/**
+ * Bug 1099866
+ * Test proper behaviour of attachment reminder when keyword reminding
+ * is turned off.
+ */
+add_task(async function test_disabled_attachment_reminder() {
+ Services.prefs.setBoolPref(kReminderPref, false);
+
+ // Open a sample message with no attachment keywords.
+ let cwc = open_compose_new_mail();
+ setup_msg_contents(
+ cwc,
+ "test@example.invalid",
+ "Testing disabled keyword reminder!",
+ "Some body..."
+ );
+
+ // This one should have the manual reminder disabled.
+ assert_manual_reminder_state(cwc, false);
+ // There should be no attachment notification.
+ assert_automatic_reminder_state(cwc, false);
+
+ // Add some keyword so the automatic notification
+ // could potentially show up.
+ setup_msg_contents(cwc, "", "", " and look for your attachment!");
+ // Give the notification time to appear. It shouldn't.
+ await wait_for_reminder_state(cwc, false);
+
+ // Enable the manual reminder.
+ await click_manual_reminder(cwc, true);
+ assert_automatic_reminder_state(cwc, false);
+
+ // Disable the manual reminder and the notification should still be hidden
+ // even when there are still keywords in the body.
+ await click_manual_reminder(cwc, false);
+ assert_automatic_reminder_state(cwc, false);
+
+ // There should be no attachment message upon send.
+ click_send_and_handle_send_error(cwc);
+
+ close_compose_window(cwc);
+
+ Services.prefs.setBoolPref(kReminderPref, true);
+});
+
+/**
+ * Bug 833909
+ * Test reminder comes up when a draft with keywords is opened.
+ */
+add_task(async function test_reminder_in_draft() {
+ // Open a sample message with no attachment keywords.
+ let cwc = open_compose_new_mail();
+ setup_msg_contents(
+ cwc,
+ "test@example.invalid",
+ "Testing draft reminder!",
+ "Some body..."
+ );
+
+ // This one should have the manual reminder disabled.
+ assert_manual_reminder_state(cwc, false);
+ // There should be no attachment notification.
+ assert_automatic_reminder_state(cwc, false);
+
+ // Add some keyword so the automatic notification
+ // could potentially show up.
+ setup_msg_contents(cwc, "", "", " and look for your attachment!");
+
+ // Give the notification time to appear.
+ await wait_for_reminder_state(cwc, true);
+
+ // Now close the message with saving it as draft.
+ await save_compose_message(cwc.window);
+ close_compose_window(cwc);
+
+ // The draft message was saved into Local Folders/Drafts.
+ await be_in_folder(gDrafts);
+
+ select_click_row(0);
+ // Wait for the notification with the Edit button.
+ wait_for_notification_to_show(
+ aboutMessage,
+ "mail-notification-top",
+ "draftMsgContent"
+ );
+ // Edit the draft again...
+ plan_for_new_window("msgcompose");
+ let box = get_notification(
+ aboutMessage,
+ "mail-notification-top",
+ "draftMsgContent"
+ );
+ // ... by clicking Edit in the draft message notification bar.
+ EventUtils.synthesizeMouseAtCenter(
+ box.buttonContainer.firstElementChild,
+ {},
+ aboutMessage
+ );
+ cwc = wait_for_compose_window();
+
+ // Give the notification time to appear.
+ await wait_for_reminder_state(cwc, true);
+
+ close_compose_window(cwc);
+
+ // Delete the leftover draft message.
+ press_delete();
+});
+
+/**
+ * Bug 942436
+ * Test that the reminder can be turned off for the current message.
+ */
+add_task(async function test_disabling_attachment_reminder() {
+ // Open a sample message with attachment keywords.
+ let cwc = open_compose_new_mail();
+ setup_msg_contents(
+ cwc,
+ "test@example.invalid",
+ "Testing turning off the reminder",
+ "Some attachment keywords here..."
+ );
+
+ // This one should have the manual reminder disabled.
+ assert_manual_reminder_state(cwc, false);
+ // There should be an attachment reminder.
+ await wait_for_reminder_state(cwc, true);
+
+ // Disable the reminder (not just dismiss) using the menuitem
+ // in the notification bar menu-button.
+ let disableButton = get_notification_button(
+ cwc.window,
+ kBoxId,
+ kNotificationId,
+ {
+ popup: "reminderBarPopup",
+ }
+ );
+ let dropmarker = disableButton.querySelector("dropmarker");
+ EventUtils.synthesizeMouseAtCenter(dropmarker, {}, dropmarker.ownerGlobal);
+ await click_menus_in_sequence(
+ disableButton.closest("toolbarbutton").querySelector("menupopup"),
+ [{ id: "disableReminder" }]
+ );
+
+ await wait_for_reminder_state(cwc, false);
+
+ // Add more keywords.
+ setup_msg_contents(cwc, "", "", "... and another file attached.");
+ // Give the notification time to appear. It shouldn't.
+ await wait_for_reminder_state(cwc, false);
+
+ // Enable the manual reminder.
+ // This overrides the previous explicit disabling of any reminder.
+ await click_manual_reminder(cwc, true);
+ assert_automatic_reminder_state(cwc, false);
+
+ // Disable the manual reminder and the notification should still be hidden
+ // even when there are still keywords in the body.
+ await click_manual_reminder(cwc, false);
+ assert_automatic_reminder_state(cwc, false);
+
+ // Add more keywords to trigger automatic reminder.
+ setup_msg_contents(cwc, "", "", "I enclosed another file.");
+ // Give the notification time to appear. It should now.
+ await wait_for_reminder_state(cwc, true);
+
+ // Disable the reminder again.
+ disableButton = get_notification_button(cwc.window, kBoxId, kNotificationId, {
+ popup: "reminderBarPopup",
+ });
+ dropmarker = disableButton.querySelector("dropmarker");
+ EventUtils.synthesizeMouseAtCenter(dropmarker, {}, dropmarker.ownerGlobal);
+ await click_menus_in_sequence(
+ disableButton.closest("toolbarbutton").querySelector("menupopup"),
+ [{ id: "disableReminder" }]
+ );
+ await wait_for_reminder_state(cwc, false);
+
+ // Now send the message.
+ plan_for_window_close(cwc);
+ cwc.window.goDoCommand("cmd_sendLater");
+ wait_for_window_close();
+
+ // There should be no alert so it is saved in Outbox.
+ await be_in_folder(gOutbox);
+
+ select_click_row(0);
+ // Delete the leftover outgoing message.
+ press_delete();
+
+ // Get back to the mail account for other tests.
+ let mail = MailServices.accounts.defaultAccount.incomingServer.rootFolder;
+ await be_in_folder(mail);
+});
+
+/**
+ * Click the send button and handle the send error dialog popping up.
+ * It will return us back to the compose window.
+ *
+ * @param aController
+ * @param aAlreadySending Set this to true if sending was already triggered
+ * by other means.
+ */
+function click_send_and_handle_send_error(aController, aAlreadySending) {
+ plan_for_modal_dialog("commonDialogWindow", click_ok_on_send_error);
+ if (!aAlreadySending) {
+ let buttonSend = aController.window.document.getElementById("button-send");
+ EventUtils.synthesizeMouseAtCenter(buttonSend, {}, buttonSend.ownerGlobal);
+ }
+ wait_for_modal_dialog("commonDialogWindow");
+}
+
+/**
+ * Click Ok in the Send Message Error dialog.
+ */
+function click_ok_on_send_error(controller) {
+ if (controller.window.document.title != "Send Message Error") {
+ throw new Error(
+ "Not a send error dialog; title=" + controller.window.document.title
+ );
+ }
+ controller.window.document
+ .querySelector("dialog")
+ .getButton("accept")
+ .doCommand();
+}
+
+/**
+ * Click Save in the Save message dialog.
+ */
+function click_save_message(controller) {
+ if (controller.window.document.title != "Save Message") {
+ throw new Error(
+ "Not a Save message dialog; title=" + controller.window.document.title
+ );
+ }
+ controller.window.document
+ .querySelector("dialog")
+ .getButton("accept")
+ .doCommand();
+}