summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/composition/browser_signatureUpdating.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/test/browser/composition/browser_signatureUpdating.js')
-rw-r--r--comm/mail/test/browser/composition/browser_signatureUpdating.js276
1 files changed, 276 insertions, 0 deletions
diff --git a/comm/mail/test/browser/composition/browser_signatureUpdating.js b/comm/mail/test/browser/composition/browser_signatureUpdating.js
new file mode 100644
index 0000000000..1555703e27
--- /dev/null
+++ b/comm/mail/test/browser/composition/browser_signatureUpdating.js
@@ -0,0 +1,276 @@
+/* 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 signature updates properly when switching identities.
+ */
+
+// mail.identity.id1.htmlSigFormat = false
+// mail.identity.id1.htmlSigText = "Tinderbox is soo 90ies"
+
+// mail.identity.id2.htmlSigFormat = true
+// mail.identity.id2.htmlSigText = "Tinderboxpushlog is the new <b>hotness!</b>"
+
+"use strict";
+
+var { close_compose_window, open_compose_new_mail, setup_msg_contents } =
+ ChromeUtils.import("resource://testing-common/mozmill/ComposeHelpers.jsm");
+var { be_in_folder, FAKE_SERVER_HOSTNAME, get_special_folder } =
+ ChromeUtils.import(
+ "resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
+ );
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+
+var cwc = null; // compose window controller
+
+add_setup(async function () {
+ requestLongerTimeout(2);
+
+ // These prefs can't be set in the manifest as they contain white-space.
+ Services.prefs.setStringPref(
+ "mail.identity.id1.htmlSigText",
+ "Tinderbox is soo 90ies"
+ );
+ Services.prefs.setStringPref(
+ "mail.identity.id2.htmlSigText",
+ "Tinderboxpushlog is the new <b>hotness!</b>"
+ );
+
+ // Ensure we're in the tinderbox account as that has the right identities set
+ // up for this test.
+ let server = MailServices.accounts.findServer(
+ "tinderbox",
+ FAKE_SERVER_HOSTNAME,
+ "pop3"
+ );
+ let inbox = await get_special_folder(
+ Ci.nsMsgFolderFlags.Inbox,
+ false,
+ server
+ );
+ await be_in_folder(inbox);
+});
+
+registerCleanupFunction(function () {
+ Services.prefs.clearUserPref("mail.compose.default_to_paragraph");
+ Services.prefs.clearUserPref("mail.identity.id1.compose_html");
+ Services.prefs.clearUserPref("mail.identity.id1.htmlSigText");
+ Services.prefs.clearUserPref("mail.identity.id2.htmlSigText");
+ Services.prefs.clearUserPref(
+ "mail.identity.id1.suppress_signature_separator"
+ );
+ Services.prefs.clearUserPref(
+ "mail.identity.id2.suppress_signature_separator"
+ );
+});
+
+/**
+ * Test that the plaintext compose window has a signature initially,
+ * and has the correct signature after switching to another identity.
+ */
+async function plaintextComposeWindowSwitchSignatures(suppressSigSep) {
+ Services.prefs.setBoolPref("mail.identity.id1.compose_html", false);
+ Services.prefs.setBoolPref(
+ "mail.identity.id1.suppress_signature_separator",
+ suppressSigSep
+ );
+ Services.prefs.setBoolPref(
+ "mail.identity.id2.suppress_signature_separator",
+ suppressSigSep
+ );
+ cwc = open_compose_new_mail();
+
+ let contentFrame = cwc.window.document.getElementById("messageEditor");
+ let mailBody = contentFrame.contentDocument.body;
+
+ // The first node in the body should be a BR node, which allows the user
+ // to insert text before / outside of the signature.
+ Assert.equal(mailBody.firstChild.localName, "br");
+
+ setup_msg_contents(cwc, "", "Plaintext compose window", "Body, first line.");
+
+ let node = mailBody.lastChild;
+
+ // The last node is a BR - this allows users to put text after the
+ // signature without it being styled like the signature.
+ Assert.equal(node.localName, "br");
+ node = node.previousSibling;
+
+ // Now we should have the DIV node that contains the signature, with
+ // the class moz-signature.
+ Assert.equal(node.localName, "div");
+
+ const kSeparator = "-- ";
+ const kSigClass = "moz-signature";
+ Assert.equal(node.className, kSigClass);
+
+ let sigNode = node.firstChild;
+
+ if (!suppressSigSep) {
+ Assert.equal(sigNode.textContent, kSeparator);
+ let brNode = sigNode.nextSibling;
+ Assert.equal(brNode.localName, "br");
+ sigNode = brNode.nextSibling;
+ }
+
+ let expectedText = "Tinderbox is soo 90ies";
+ Assert.equal(sigNode.textContent, expectedText);
+
+ // Now switch identities!
+ await chooseIdentity(cwc.window, "id2");
+
+ node = contentFrame.contentDocument.body.lastChild;
+
+ // The last node is a BR - this allows users to put text after the
+ // signature without it being styled like the signature.
+ Assert.equal(node.localName, "br");
+ node = node.previousSibling;
+
+ Assert.equal(node.localName, "div");
+ Assert.equal(node.className, kSigClass);
+
+ sigNode = node.firstChild;
+
+ if (!suppressSigSep) {
+ expectedText = "-- ";
+ Assert.equal(sigNode.textContent, kSeparator);
+ let brNode = sigNode.nextSibling;
+ Assert.equal(brNode.localName, "br");
+ sigNode = brNode.nextSibling;
+ }
+
+ expectedText = "Tinderboxpushlog is the new *hotness!*";
+ Assert.equal(sigNode.textContent, expectedText);
+
+ // Now check that the original signature has been removed by ensuring
+ // that there's only one node with class moz-signature.
+ let sigs = contentFrame.contentDocument.querySelectorAll("." + kSigClass);
+ Assert.equal(sigs.length, 1);
+
+ // And ensure that the text we wrote wasn't altered
+ let bodyFirstChild = contentFrame.contentDocument.body.firstChild;
+
+ while (node != bodyFirstChild) {
+ node = node.previousSibling;
+ }
+
+ Assert.equal(node.nodeValue, "Body, first line.");
+
+ close_compose_window(cwc);
+}
+
+add_task(async function testPlaintextComposeWindowSwitchSignatures() {
+ await plaintextComposeWindowSwitchSignatures(false);
+});
+
+add_task(
+ async function testPlaintextComposeWindowSwitchSignaturesWithSuppressedSeparator() {
+ await plaintextComposeWindowSwitchSignatures(true);
+ }
+);
+
+/**
+ * Same test, but with an HTML compose window
+ */
+async function HTMLComposeWindowSwitchSignatures(
+ suppressSigSep,
+ paragraphFormat
+) {
+ Services.prefs.setBoolPref(
+ "mail.compose.default_to_paragraph",
+ paragraphFormat
+ );
+
+ Services.prefs.setBoolPref("mail.identity.id1.compose_html", true);
+ Services.prefs.setBoolPref(
+ "mail.identity.id1.suppress_signature_separator",
+ suppressSigSep
+ );
+ Services.prefs.setBoolPref(
+ "mail.identity.id2.suppress_signature_separator",
+ suppressSigSep
+ );
+ cwc = open_compose_new_mail();
+
+ setup_msg_contents(cwc, "", "HTML compose window", "Body, first line.");
+
+ let contentFrame = cwc.window.document.getElementById("messageEditor");
+ let node = contentFrame.contentDocument.body.lastChild;
+
+ // In html compose, the signature is inside the last node, which has a
+ // class="moz-signature".
+ Assert.equal(node.className, "moz-signature");
+ node = node.firstChild; // text node containing the signature divider
+ if (suppressSigSep) {
+ Assert.equal(node.nodeValue, "Tinderbox is soo 90ies");
+ } else {
+ Assert.equal(node.nodeValue, "-- \nTinderbox is soo 90ies");
+ }
+
+ // Now switch identities!
+ await chooseIdentity(cwc.window, "id2");
+
+ node = contentFrame.contentDocument.body.lastChild;
+
+ // In html compose, the signature is inside the last node
+ // with class="moz-signature".
+ Assert.equal(node.className, "moz-signature");
+ node = node.firstChild; // text node containing the signature divider
+ if (!suppressSigSep) {
+ Assert.equal(node.nodeValue, "-- ");
+ node = node.nextSibling;
+ Assert.equal(node.localName, "br");
+ node = node.nextSibling;
+ }
+ Assert.equal(node.nodeValue, "Tinderboxpushlog is the new ");
+ node = node.nextSibling;
+ Assert.equal(node.localName, "b");
+ node = node.firstChild;
+ Assert.equal(node.nodeValue, "hotness!");
+
+ // Now check that the original signature has been removed,
+ // and no blank lines got added!
+ node = contentFrame.contentDocument.body.firstChild;
+ let textNode;
+ if (paragraphFormat) {
+ textNode = node.firstChild;
+ } else {
+ textNode = node;
+ }
+ Assert.equal(textNode.nodeValue, "Body, first line.");
+ if (!paragraphFormat) {
+ node = node.nextSibling;
+ Assert.equal(node.localName, "br");
+ }
+ node = node.nextSibling;
+ // check that the signature is immediately after the message text.
+ Assert.equal(node.className, "moz-signature");
+ // check that that the signature is the last node.
+ Assert.equal(node, contentFrame.contentDocument.body.lastChild);
+
+ close_compose_window(cwc);
+}
+
+add_task(async function testHTMLComposeWindowSwitchSignatures() {
+ await HTMLComposeWindowSwitchSignatures(false, false);
+});
+
+add_task(
+ async function testHTMLComposeWindowSwitchSignaturesWithSuppressedSeparator() {
+ await HTMLComposeWindowSwitchSignatures(true, false);
+ }
+);
+
+add_task(async function testHTMLComposeWindowSwitchSignaturesParagraphFormat() {
+ await HTMLComposeWindowSwitchSignatures(false, true);
+});
+
+add_task(
+ async function testHTMLComposeWindowSwitchSignaturesWithSuppressedSeparatorParagraphFormat() {
+ await HTMLComposeWindowSwitchSignatures(true, true);
+ }
+);