From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- .../browser/composition/browser_charsetEdit.js | 231 +++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 comm/mail/test/browser/composition/browser_charsetEdit.js (limited to 'comm/mail/test/browser/composition/browser_charsetEdit.js') diff --git a/comm/mail/test/browser/composition/browser_charsetEdit.js b/comm/mail/test/browser/composition/browser_charsetEdit.js new file mode 100644 index 0000000000..61b4a756b8 --- /dev/null +++ b/comm/mail/test/browser/composition/browser_charsetEdit.js @@ -0,0 +1,231 @@ +/* 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 we do the right thing wrt. message encoding when editing or + * replying to messages. + */ + +"use strict"; + +var utils = ChromeUtils.import("resource://testing-common/mozmill/utils.jsm"); + +var { + close_compose_window, + open_compose_with_reply, + save_compose_message, + wait_for_compose_window, +} = ChromeUtils.import("resource://testing-common/mozmill/ComposeHelpers.jsm"); +var { + add_message_to_folder, + assert_selected_and_displayed, + be_in_folder, + create_message, + get_special_folder, + get_about_message, + make_display_unthreaded, + mc, + press_delete, + select_click_row, +} = ChromeUtils.import( + "resource://testing-common/mozmill/FolderDisplayHelpers.jsm" +); +var { SyntheticPartLeaf } = ChromeUtils.import( + "resource://testing-common/mailnews/MessageGenerator.jsm" +); +var { wait_for_notification_to_show, get_notification } = ChromeUtils.import( + "resource://testing-common/mozmill/NotificationBoxHelpers.jsm" +); +var { plan_for_new_window } = ChromeUtils.import( + "resource://testing-common/mozmill/WindowHelpers.jsm" +); + +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); +var { MimeParser } = ChromeUtils.import("resource:///modules/mimeParser.jsm"); + +let aboutMessage = get_about_message(); + +var gDrafts; + +add_setup(async function () { + gDrafts = await get_special_folder(Ci.nsMsgFolderFlags.Drafts, true); +}); + +/** + * Helper to get the full message content. + * + * @param aMsgHdr: nsIMsgDBHdr object whose text body will be read + * @param aGetText: if true, return header objects. if false, return body data. + * @returns Map(partnum -> message headers) + */ +function getMsgHeaders(aMsgHdr, aGetText = false) { + let msgFolder = aMsgHdr.folder; + let msgUri = msgFolder.getUriForMsg(aMsgHdr); + + let handler = { + _done: false, + _data: new Map(), + _text: new Map(), + endMessage() { + this._done = true; + }, + deliverPartData(num, text) { + this._text.set(num, this._text.get(num) + text); + }, + startPart(num, headers) { + this._data.set(num, headers); + this._text.set(num, ""); + }, + }; + let streamListener = MimeParser.makeStreamListenerParser(handler, { + strformat: "unicode", + }); + MailServices.messageServiceFromURI(msgUri).streamMessage( + msgUri, + streamListener, + null, + null, + false, + "", + false + ); + utils.waitFor(() => handler._done); + return aGetText ? handler._text : handler._data; +} + +/** + * Test that if we reply to a message in an invalid charset, we don't try to compose + * in that charset. Instead, we should be using UTF-8. + */ +add_task(async function test_wrong_reply_charset() { + let folder = gDrafts; + let msg0 = create_message({ + bodyPart: new SyntheticPartLeaf("Some text", { + charset: "invalid-charset", + }), + }); + await add_message_to_folder([folder], msg0); + await be_in_folder(folder); + // Make the folder unthreaded for easier message selection. + make_display_unthreaded(); + + let msg = select_click_row(0); + assert_selected_and_displayed(mc, msg); + Assert.equal(getMsgHeaders(msg).get("").charset, "invalid-charset"); + + let rwc = open_compose_with_reply(); + await save_compose_message(rwc.window); + await TestUtils.waitForCondition( + () => folder.getTotalMessages(false) == 2, + "message saved to drafts folder" + ); + close_compose_window(rwc); + + let draftMsg = select_click_row(1); + Assert.equal(getMsgHeaders(draftMsg).get("").charset, "UTF-8"); + press_delete(mc); // Delete message + + // Edit the original message. Charset should be UTF-8 now. + msg = select_click_row(0); + + // Wait for the notification with the Edit button. + wait_for_notification_to_show( + aboutMessage, + "mail-notification-top", + "draftMsgContent" + ); + + plan_for_new_window("msgcompose"); + + let box = get_notification( + aboutMessage, + "mail-notification-top", + "draftMsgContent" + ); + // Click on the "Edit" button in the draft notification. + EventUtils.synthesizeMouseAtCenter( + box.buttonContainer.firstElementChild, + {}, + aboutMessage + ); + rwc = wait_for_compose_window(); + await save_compose_message(rwc.window); + close_compose_window(rwc); + msg = select_click_row(0); + await TestUtils.waitForCondition( + () => getMsgHeaders(msg).get("").charset == "UTF-8", + "The charset matches" + ); + press_delete(mc); // Delete message +}); + +/** + * Test that replying to bad charsets don't screw up the existing text. + */ +add_task(async function test_no_mojibake() { + let folder = gDrafts; + let nonASCII = "ケツァルコアトル"; + let UTF7 = "+MLEwxDChMOswszCiMMgw6w-"; + let msg0 = create_message({ + bodyPart: new SyntheticPartLeaf(UTF7, { charset: "utf-7" }), + }); + await add_message_to_folder([folder], msg0); + await be_in_folder(folder); + let msg = select_click_row(0); + assert_selected_and_displayed(mc, msg); + await TestUtils.waitForCondition( + () => getMsgHeaders(msg).get("").charset == "utf-7", + "message charset correctly set" + ); + Assert.equal(getMsgHeaders(msg, true).get("").trim(), nonASCII); + + let rwc = open_compose_with_reply(); + await save_compose_message(rwc.window); + await TestUtils.waitForCondition( + () => folder.getTotalMessages(false) == 2, + "message saved to drafts folder" + ); + close_compose_window(rwc); + + let draftMsg = select_click_row(1); + Assert.equal(getMsgHeaders(draftMsg).get("").charset.toUpperCase(), "UTF-8"); + let text = getMsgHeaders(draftMsg, true).get(""); + // Delete message first before throwing so subsequent tests are not affected. + press_delete(mc); + if (!text.includes(nonASCII)) { + throw new Error("Expected to find " + nonASCII + " in " + text); + } + + // Edit the original message. Charset should be UTF-8 now. + msg = select_click_row(0); + + // Wait for the notification with the Edit button. + wait_for_notification_to_show( + aboutMessage, + "mail-notification-top", + "draftMsgContent" + ); + + plan_for_new_window("msgcompose"); + let box = get_notification( + aboutMessage, + "mail-notification-top", + "draftMsgContent" + ); + // Click on the "Edit" button in the draft notification. + EventUtils.synthesizeMouseAtCenter( + box.buttonContainer.firstElementChild, + {}, + aboutMessage + ); + rwc = wait_for_compose_window(); + await save_compose_message(rwc.window); + close_compose_window(rwc); + msg = select_click_row(0); + Assert.equal(getMsgHeaders(msg).get("").charset.toUpperCase(), "UTF-8"); + Assert.equal(getMsgHeaders(msg, true).get("").trim(), nonASCII); + press_delete(mc); // Delete message +}); -- cgit v1.2.3