diff --git a/mail/base/content/mailCommands.js b/mail/base/content/mailCommands.js index c4a54727ce..2f1d6381de 100644 --- a/mail/base/content/mailCommands.js +++ b/mail/base/content/mailCommands.js @@ -119,42 +119,79 @@ function getIdentityForServer(server, optionalHint) function getIdentityForHeader(hdr, type) { - // If we treat reply from sent specially, do we check for that folder flag here ? - var isTemplate = (type == Components.interfaces.nsIMsgCompType.Template); - var hintForIdentity = isTemplate ? hdr.author : hdr.recipients + hdr.ccList; - var identity = null; - var server; + // If we treat reply from sent specially, do we check for that folder flag here? + var hintForIdentity = ""; + + // if the current mode is "reply-to-list" + if (type == Components.interfaces.nsIMsgCompType.ReplyToList) { + var key = "delivered-to"; + var allIdentities = accountManager.allIdentities; + + var tempIdentity = ""; + + // Get the delivered-to headers. + var deliveredTos = new Array(); + var index = 0; + while (tempIdentity = currentHeaderData[key]) { + deliveredTos.push(tempIdentity.headerValue.toLowerCase()); + key = "delivered-to" + index++; + } + + // Reverse the array so that the last delivered-to header will show at front. + deliveredTos.reverse(); + + // Get the last "delivered-to" that is in the defined identities. + for (var i = 0; i < deliveredTos.length; i++) { + for each (var tempID in fixIterator(allIdentities, + Components.interfaces.nsIMsgIdentity)) { + // If the deliver-to header contains the defined identity + if (deliveredTos[i].indexOf(tempID.email.toLowerCase()) != -1) { + hintForIdentity = tempID.email; + break; + } + } + // Identity has been found + if (hintForIdentity) + break; + } + } + else if (type == Components.interfaces.nsIMsgCompType.Template) + hintForIdentity = hdr.author; + else + hintForIdentity = hdr.recipients + hdr.ccList; + + var server = null; + var identity = null; var folder = hdr.folder; - if (folder) - { + if (folder) { server = folder.server; identity = folder.customIdentity; } var accountKey = hdr.accountKey; - if (accountKey.length > 0) - { + if (accountKey.length > 0) { var account = accountManager.getAccount(accountKey); if (account) server = account.incomingServer; } - if (server && !identity) + if (server && !identity) identity = getIdentityForServer(server, hintForIdentity); - if (!identity) - { + if (!identity) { var allIdentities = accountManager.allIdentities; identity = getBestIdentity(allIdentities, hintForIdentity); } + return identity; } function GetNextNMessages(folder) { if (folder) { - var newsFolder = folder.QueryInterface(Components.interfaces.nsIMsgNewsFolder); + var newsFolder = folder.QueryInterface( + Components.interfaces.nsIMsgNewsFolder); if (newsFolder) { newsFolder.getNextNMessages(msgWindow); } diff --git a/mail/base/content/msgHdrViewOverlay.js b/mail/base/content/msgHdrViewOverlay.js index d27066dd47..a9322b12a3 100644 --- a/mail/base/content/msgHdrViewOverlay.js +++ b/mail/base/content/msgHdrViewOverlay.js @@ -493,7 +493,8 @@ var messageHeaderSink = { this.mDummyMsgHeader.messageId = header.headerValue; else if (lowerCaseHeaderName == "list-post") this.mDummyMsgHeader.listPost = header.headerValue; - + else if (lowerCaseHeaderName == "delivered-to") + this.mDummyMsgHeader.deliveredTo = header.headerValue; } // according to RFC 2822, certain headers // can occur "unlimited" times diff --git a/mail/test/mozmill/message-header/test-reply-to-list-from-address-selection.js b/mail/test/mozmill/message-header/test-reply-to-list-from-address-selection.js new file mode 100644 index 0000000000..63d04d5fd1 --- /dev/null +++ b/mail/test/mozmill/message-header/test-reply-to-list-from-address-selection.js @@ -0,0 +1,143 @@ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is Thunderbird Mail Client. + * + * The Initial Developer of the Original Code is + * The Mozilla Foundation. + * Portions created by the Initial Developer are Copyright (C) 2010 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Kefu (Fisher) Zhao + * + * Alternatively, the contents of this file may be used under the terms of + * either the GNU General Public License Version 2 or later (the "GPL"), or + * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in windowHelperich case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +/* + * Test for the most suitable identity in From address for reply-to-list + */ + +var MODULE_NAME = "test-reply-to-list-from-address-selection"; + +var RELATIVE_ROOT = '../shared-modules'; +var MODULE_REQUIRES = ['folder-display-helpers', + 'window-helpers', 'compose-helpers']; + +var folderHelper = null; +var windowindowHelperelper = null; +var composeHelper = null; + +var testFolder = null; +var msgHdr = null; +var replyToListWindow = null; + +var identityString1 = "tinderbox_correct_identity@invalid.com"; + +var setupModule = function (module) { + + folderHelper = collector.getModule('folder-display-helpers'); + folderHelper.installInto(module); + windowHelper = collector.getModule('window-helpers'); + windowHelper.installInto(module); + composeHelper = collector.getModule('compose-helpers'); + composeHelper.installInto(module); + + addIdentitiesAndFolder(); + addMessageToFolder(testFolder); +} + +var addMessageToFolder = function (aFolder) { + var msgId = Cc["@mozilla.org/uuid-generator;1"] + .getService(Ci.nsIUUIDGenerator) + .generateUUID() + "@mozillamessaging.invalid"; + + var source = "From - Sat Nov 1 12:39:54 2008\n" + + "X-Mozilla-Status: 0001\n" + + "X-Mozilla-Status2: 00000000\n" + + "Delivered-To: \n" + + "Delivered-To: <" + identityString1 + ">\n" + + "Delivered-To: \n" + + "Message-ID: <" + msgId + ">\n" + + "Date: Wed, 11 Jun 2008 20:32:02 -0400\n" + + "From: Tester \n" + + "User-Agent: Thunderbird 3.0a2pre (Macintosh/2008052122)\n" + + "MIME-Version: 1.0\n" + + "List-ID: \n" + + "List-Post: , \n" + + " \n" + + "To: recipient@mozillamessaging.invalid\n" + + "Subject: " + "a subject" + "\n" + + "Content-Type: text/html; charset=ISO-8859-1\n" + + "Content-Transfer-Encoding: 7bit\n" + + "\n" + "text body" + "\n"; + + aFolder.QueryInterface(Ci.nsIMsgLocalMailFolder); + aFolder.gettingNewMessages = true; + aFolder.addMessage(source); + aFolder.gettingNewMessages = false; + + return aFolder.msgDatabase.getMsgHdrForMessageID(msgId); +} + +var addIdentitiesAndFolder = function() { + var acctMgr = Cc["@mozilla.org/messenger/account-manager;1"] + .getService(Ci.nsIMsgAccountManager); + + var identity2 = acctMgr.createIdentity(); + //identity.fullName = "Tinderbox_Identity1"; + identity2.email="tinderbox_identity1@invalid.com"; + + var identity = acctMgr.createIdentity(); + //identity.fullName = "Tinderbox_Identity1"; + identity.email = identityString1; + + var server = acctMgr.createIncomingServer("nobody", + "Test Local Folders", "pop3"); + testFolder = server.rootFolder.addSubfolder("Test Folder"); + + var account = acctMgr.createAccount(); + account.incomingServer = server; + account.addIdentity(identity); + account.addIdentity(identity2); +} + +function test_Reply_To_List_From_Address() { + be_in_folder(testFolder); + + select_click_row(0); + plan_for_new_window("mail:messageWindow"); + open_selected_message(); + + replyToListWindow = composeHelper.open_compose_with_reply_to_list(); + + var identityList = replyToListWindow.e("msgIdentity"); + + // see if it's the correct identity selected + if (identityList.selectedItem.label.indexOf(identityString1) == -1) + throw new Error("The From address is not correctly selected! Expected: "+ + identityString1 + "; Actual: " + + identityList.selectedItem.label); +} + diff --git a/mail/test/mozmill/shared-modules/test-compose-helpers.js b/mail/test/mozmill/shared-modules/test-compose-helpers.js index d1cab085b9..52cc6d42a5 100644 --- a/mail/test/mozmill/shared-modules/test-compose-helpers.js +++ b/mail/test/mozmill/shared-modules/test-compose-helpers.js @@ -67,6 +67,7 @@ function installInto(module) { // Now copy helper functions module.open_compose_new_mail = open_compose_new_mail; module.open_compose_with_reply = open_compose_with_reply; + module.open_compose_with_reply_to_list = open_compose_with_reply_to_list; module.open_compose_with_forward = open_compose_with_forward; } @@ -103,6 +104,23 @@ function open_compose_with_reply(aController) { return wait_for_compose_window(); } +/** + * Opens the compose window by replying to list for a selected message and waits for it + * to load. + * + * @return The loaded window of type "msgcompose" wrapped in a MozmillController + * that is augmented using augment_controller. + */ +function open_compose_with_reply_to_list(aController) { + if (aController === undefined) + aController = mc; + + windowHelper.plan_for_new_window("msgcompose"); + aController.keypress(null, "l", {shiftKey: true, accelKey: true}); + + return wait_for_compose_window(); +} + /** * Opens the compose window by forwarding the selected message and waits for it * to load. diff --git a/mailnews/mime/emitters/src/nsMimeHtmlEmitter.cpp b/mailnews/mime/emitters/src/nsMimeHtmlEmitter.cpp index a70bf72e2f..ad57c932cf 100644 --- a/mailnews/mime/emitters/src/nsMimeHtmlEmitter.cpp +++ b/mailnews/mime/emitters/src/nsMimeHtmlEmitter.cpp @@ -241,7 +241,7 @@ nsresult nsMimeHtmlDisplayEmitter::BroadcastHeaders(nsIMsgHeaderSink * aHeaderSi PL_strcasecmp("content-type", headerInfo->name) && PL_strcasecmp("message-id", headerInfo->name) && PL_strcasecmp("x-newsreader", headerInfo->name) && PL_strcasecmp("x-mimeole", headerInfo->name) && PL_strcasecmp("references", headerInfo->name) && PL_strcasecmp("in-reply-to", headerInfo->name) && - PL_strcasecmp("list-post", headerInfo->name) && + PL_strcasecmp("list-post", headerInfo->name) && PL_strcasecmp("delivered-to", headerInfo->name) && // make headerStr lower case because IndexOf is case-sensitive (!extraExpandedHeadersArray.Length() || (ToLowerCase(headerStr), extraExpandedHeadersArray.IndexOf(headerStr) ==