summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/composition/browser_draftIdentity.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/test/browser/composition/browser_draftIdentity.js')
-rw-r--r--comm/mail/test/browser/composition/browser_draftIdentity.js313
1 files changed, 313 insertions, 0 deletions
diff --git a/comm/mail/test/browser/composition/browser_draftIdentity.js b/comm/mail/test/browser/composition/browser_draftIdentity.js
new file mode 100644
index 0000000000..554b3f594e
--- /dev/null
+++ b/comm/mail/test/browser/composition/browser_draftIdentity.js
@@ -0,0 +1,313 @@
+/* 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 compose new message chooses the correct initial identity when
+ * called from the context of an open composer.
+ */
+
+"use strict";
+
+var { close_compose_window, open_compose_from_draft } = ChromeUtils.import(
+ "resource://testing-common/mozmill/ComposeHelpers.jsm"
+);
+var {
+ assert_selected_and_displayed,
+ be_in_folder,
+ get_special_folder,
+ get_about_message,
+ mc,
+ press_delete,
+ select_click_row,
+} = ChromeUtils.import(
+ "resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
+);
+var { assert_notification_displayed, wait_for_notification_to_show } =
+ ChromeUtils.import(
+ "resource://testing-common/mozmill/NotificationBoxHelpers.jsm"
+ );
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+
+let aboutMessage = get_about_message();
+
+var gDrafts;
+var gAccount;
+
+// The first identity should become the default in the account.
+var gIdentities = [
+ { email: "x@example.invalid" },
+ { email: "y@example.invalid", fullname: "User Y" },
+ { email: "y@example.invalid", fullname: "User YY", label: "YY" },
+ { email: "y+y@example.invalid", fullname: "User Y" },
+ { email: "z@example.invalid", fullname: "User Z", label: "Label Z" },
+ { email: "a+b@example.invalid", fullname: "User A" },
+];
+
+add_setup(async function () {
+ // Now set up an account with some identities.
+ gAccount = MailServices.accounts.createAccount();
+ gAccount.incomingServer = MailServices.accounts.createIncomingServer(
+ "nobody",
+ "Draft Identity Testing",
+ "pop3"
+ );
+
+ for (let id of gIdentities) {
+ let identity = MailServices.accounts.createIdentity();
+ if ("email" in id) {
+ identity.email = id.email;
+ }
+ if ("fullname" in id) {
+ identity.fullName = id.fullname;
+ }
+ if ("label" in id) {
+ identity.label = id.label;
+ }
+ gAccount.addIdentity(identity);
+ id.key = identity.key;
+ id.name = identity.identityName;
+ }
+
+ MailServices.accounts.defaultAccount = gAccount;
+
+ gDrafts = await get_special_folder(Ci.nsMsgFolderFlags.Drafts, true);
+});
+
+/**
+ * Create a new templated draft message in the drafts folder.
+ *
+ * @returns {integer} The index (position) of the created message in the drafts folder.
+ */
+function create_draft(aFrom, aIdKey) {
+ let msgCount = gDrafts.getTotalMessages(false);
+ let source =
+ "From - Wed Mar 01 01:02:03 2017\n" +
+ "X-Mozilla-Status: 0000\n" +
+ "X-Mozilla-Status2: 00000000\n" +
+ "X-Mozilla-Keys:\n" +
+ "FCC: mailbox://nobody@Local%20Folders/Sent\n" +
+ (aIdKey
+ ? // prettier-ignore
+ `X-Identity-Key: ${aIdKey}\n` +
+ `X-Account-Key: ${gAccount.key}\n`
+ : "") +
+ `From: ${aFrom}\n` +
+ "To: nobody@example.invalid\n" +
+ "Subject: test!\n" +
+ `Message-ID: <${msgCount}@example.invalid>\n` +
+ "Date: Wed, 1 Mar 2017 01:02:03 +0100\n" +
+ "X-Mozilla-Draft-Info: internal/draft; vcard=0; receipt=0; DSN=0; uuencode=0;\n" +
+ " attachmentreminder=0; deliveryformat=4\n" +
+ "MIME-Version: 1.0\n" +
+ "Content-Type: text/plain; charset=utf-8\n" +
+ "Content-Transfer-Encoding: 8bit\n" +
+ "\n" +
+ "Testing draft identity.\n";
+
+ gDrafts.QueryInterface(Ci.nsIMsgLocalMailFolder).addMessage(source);
+ let msgCountNew = gDrafts.getTotalMessages(false);
+
+ Assert.equal(msgCountNew, msgCount + 1);
+ return msgCountNew - 1;
+}
+
+/**
+ * Helper to check that a suitable From identity was set up in the given
+ * composer window.
+ *
+ * @param cwc Compose window controller.
+ * @param aIdentityKey The key of the expected identity.
+ * @param aFrom The expected displayed From address.
+ */
+function checkCompIdentity(cwc, aIdentityKey, aFrom) {
+ Assert.equal(
+ cwc.window.getCurrentAccountKey(),
+ gAccount.key,
+ "The From account is not correctly selected"
+ );
+ Assert.equal(
+ cwc.window.getCurrentIdentityKey(),
+ aIdentityKey,
+ "The From identity is not correctly selected"
+ );
+ Assert.equal(
+ cwc.window.document.getElementById("msgIdentity").value,
+ aFrom,
+ "The From value was initialized to an unexpected value"
+ );
+}
+
+/**
+ * Bug 394216
+ * Test that starting a new message from a draft with various combinations
+ * of From and X-Identity-Key gets the expected initial identity selected.
+ */
+add_task(async function test_draft_identity_selection() {
+ let tests = [
+ // X-Identity-Key header exists:
+ // 1. From header matches X-Identity-Key identity exactly
+ {
+ idIndex: 1,
+ warning: false,
+ draftIdKey: gIdentities[1].key,
+ draftFrom: gIdentities[1].name,
+ },
+ // 2. From header similar to X-Identity-Key identity with +suffix appended
+ {
+ idIndex: 1,
+ warning: false,
+ draftIdKey: gIdentities[1].key,
+ draftFrom: gIdentities[1].name.replace("y@", "y+x@"),
+ },
+ // 3. X-Identity-Key identity similar to From header with +suffix appended
+ {
+ idIndex: 5,
+ warning: false,
+ draftIdKey: gIdentities[5].key,
+ draftFrom: gIdentities[5].name.replace("a+b@", "a@"),
+ },
+
+ // From header not similar to existing X-Identity-Key identity:
+ // 4. From header not even containing an email address
+ {
+ idIndex: 5,
+ warning: false,
+ draftIdKey: gIdentities[5].key,
+ draftFrom: "User",
+ from: "User <>",
+ },
+ // 5. no matching identity exists
+ {
+ idIndex: 1,
+ warning: true,
+ draftIdKey: gIdentities[1].key,
+ draftFrom: "New User <modified@sender.invalid>",
+ },
+ // 6. 1 matching identity exists
+ {
+ idIndex: 4,
+ warning: false,
+ draftIdKey: gIdentities[4].key,
+ draftFrom: "New User <" + gIdentities[4].email + ">",
+ },
+ // 7. 2 or more matching identities exist
+ {
+ idIndex: 1,
+ warning: true,
+ draftIdKey: gIdentities[0].key,
+ draftFrom: gIdentities[1].name.replace("User Y", "User YZ"),
+ },
+
+ // No X-Identity-Key header:
+ // 8. no matching identity exists
+ // This is a 'foreign draft' in which case we won't preserve the From value
+ // and set it from the default identity.
+ {
+ idIndex: 0,
+ warning: true,
+ draftFrom: "Unknown <unknown@nowhere.invalid>",
+ from: gIdentities[0].name,
+ },
+ // 9. From header matches default identity
+ { idIndex: 0, warning: false, draftFrom: gIdentities[0].name },
+ // 10. From header matches some other identity
+ { idIndex: 5, warning: false, draftFrom: gIdentities[5].name },
+ // 11. From header matches identity with suffix
+ { idIndex: 3, warning: false, draftFrom: gIdentities[3].name },
+ // 12. From header matches 2 identities
+ {
+ idIndex: 1,
+ warning: true,
+ draftFrom: gIdentities[1].email,
+ from: gIdentities[1].name,
+ },
+ ];
+
+ for (let test of tests) {
+ test.draftIndex = create_draft(test.draftFrom, test.draftIdKey);
+ }
+
+ for (let test of tests) {
+ dump("Running draft identity test" + tests.indexOf(test) + "\n");
+ await be_in_folder(gDrafts);
+ select_click_row(test.draftIndex);
+ assert_selected_and_displayed(test.draftIndex);
+ wait_for_notification_to_show(
+ aboutMessage,
+ "mail-notification-top",
+ "draftMsgContent"
+ );
+ let cwc = open_compose_from_draft();
+ checkCompIdentity(
+ cwc,
+ gIdentities[test.idIndex].key,
+ test.from ? test.from : test.draftFrom
+ );
+ if (test.warning) {
+ wait_for_notification_to_show(
+ cwc.window,
+ "compose-notification-bottom",
+ "identityWarning"
+ );
+ } else {
+ assert_notification_displayed(
+ cwc.window,
+ "compose-notification-bottom",
+ "identityWarning",
+ false
+ );
+ }
+
+ close_compose_window(cwc, false);
+ }
+ /*
+ // TODO: fix this in bug 1238264, the identity selector does not properly close.
+ // Open a draft again that shows the notification.
+ await be_in_folder(gDrafts);
+ select_click_row(tests[tests.length-1].draftIndex);
+ let cwc = open_compose_from_draft();
+ wait_for_notification_to_show(cwc, "compose-notification-bottom",
+ "identityWarning");
+ // Notification should go away when another identity is chosen.
+ EventUtils.synthesizeMouseAtCenter(cwc.e("msgIdentity"), { }, cwc.window.document.getElementById("msgIdentity").ownerGlobal)
+ await click_menus_in_sequence(cwc.window.document.getElementById("msgIdentityPopup"),
+ [ { identitykey: gIdentities[0].key } ]);
+
+ wait_for_notification_to_stop(cwc, "compose-notification-bottom",
+ "identityWarning");
+ close_compose_window(cwc, false);
+*/
+});
+
+registerCleanupFunction(async function () {
+ for (let id = 1; id < gIdentities.length; id++) {
+ gAccount.removeIdentity(
+ MailServices.accounts.getIdentity(gIdentities[id].key)
+ );
+ }
+
+ // The last identity of an account can't be removed so clear all its prefs
+ // which effectively destroys it.
+ MailServices.accounts.getIdentity(gIdentities[0].key).clearAllValues();
+ MailServices.accounts.removeAccount(gAccount);
+ gAccount = null;
+
+ // Clear our drafts.
+ await be_in_folder(gDrafts);
+ while (gDrafts.getTotalMessages(false) > 0) {
+ press_delete();
+ }
+
+ // 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;
+ // Focus an element in the main window, then blur it again to avoid it
+ // hijacking keypresses.
+ let mainWindowElement = document.getElementById("button-appmenu");
+ mainWindowElement.focus();
+ mainWindowElement.blur();
+});