summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/account/browser_values.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/test/browser/account/browser_values.js')
-rw-r--r--comm/mail/test/browser/account/browser_values.js401
1 files changed, 401 insertions, 0 deletions
diff --git a/comm/mail/test/browser/account/browser_values.js b/comm/mail/test/browser/account/browser_values.js
new file mode 100644
index 0000000000..8d44a65f5a
--- /dev/null
+++ b/comm/mail/test/browser/account/browser_values.js
@@ -0,0 +1,401 @@
+/* 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/. */
+
+/**
+ * This test checks proper operation of the account settings panes
+ * when certain special or invalid values are entered into the fields.
+ */
+
+"use strict";
+
+var { click_account_tree_row, get_account_tree_row, open_advanced_settings } =
+ ChromeUtils.import(
+ "resource://testing-common/mozmill/AccountManagerHelpers.jsm"
+ );
+var { input_value } = ChromeUtils.import(
+ "resource://testing-common/mozmill/KeyboardHelpers.jsm"
+);
+var { gMockPromptService } = ChromeUtils.import(
+ "resource://testing-common/mozmill/PromptHelpers.jsm"
+);
+var { plan_for_modal_dialog, wait_for_modal_dialog } = ChromeUtils.import(
+ "resource://testing-common/mozmill/WindowHelpers.jsm"
+);
+
+var { MailServices } = ChromeUtils.import(
+ "resource:///modules/MailServices.jsm"
+);
+
+var { mc } = ChromeUtils.import(
+ "resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
+);
+
+var gPopAccount, gOriginalAccountCount;
+
+add_setup(function () {
+ // There may be pre-existing accounts from other tests.
+ gOriginalAccountCount = MailServices.accounts.allServers.length;
+
+ // Create a POP server
+ let popServer = MailServices.accounts
+ .createIncomingServer("nobody", "example.invalid", "pop3")
+ .QueryInterface(Ci.nsIPop3IncomingServer);
+
+ let identity = MailServices.accounts.createIdentity();
+ identity.email = "tinderbox@example.invalid";
+
+ gPopAccount = MailServices.accounts.createAccount();
+ gPopAccount.incomingServer = popServer;
+ gPopAccount.addIdentity(identity);
+
+ // Now there should be one more account.
+ Assert.equal(
+ MailServices.accounts.allServers.length,
+ gOriginalAccountCount + 1
+ );
+});
+
+registerCleanupFunction(function () {
+ // Remove our test account to leave the profile clean.
+ MailServices.accounts.removeAccount(gPopAccount);
+ // There should be only the original accounts left.
+ Assert.equal(MailServices.accounts.allServers.length, gOriginalAccountCount);
+});
+
+/**
+ * Bug 208628.
+ * Check that if the CC field is empty, enabling CC will automatically
+ * prefill the currently default email address.
+ */
+add_task(async function test_default_CC_address() {
+ await open_advanced_settings(function (tab) {
+ subtest_check_default_CC_address(tab);
+ });
+});
+
+/**
+ * Check that if the CC field is empty, enabling CC will automatically
+ * prefill the currently default email address.
+ *
+ * @param {object} tab - The account manager tab.
+ */
+function subtest_check_default_CC_address(tab) {
+ let accountRow = get_account_tree_row(
+ gPopAccount.key,
+ "am-copies.xhtml",
+ tab
+ );
+ click_account_tree_row(tab, accountRow);
+
+ let iframe =
+ tab.browser.contentWindow.document.getElementById("contentFrame");
+
+ let defaultAddress =
+ iframe.contentDocument.getElementById("identity.email").value;
+ let ccCheck = iframe.contentDocument.getElementById("identity.doCc");
+ let ccAddress = iframe.contentDocument.getElementById("identity.doCcList");
+ // The CC checkbox is not enabled and the address value is empty.
+ Assert.ok(!ccCheck.checked);
+ Assert.equal(ccAddress.value, "");
+ // After ticking the CC checkbox the default address should be prefilled.
+ EventUtils.synthesizeMouseAtCenter(ccCheck, {}, ccCheck.ownerGlobal);
+ Assert.equal(ccAddress.value, defaultAddress);
+
+ let bccCheck = iframe.contentDocument.getElementById("identity.doBcc");
+ let bccAddress = iframe.contentDocument.getElementById("identity.doBccList");
+ // The BCC checkbox is not enabled but we set the address value to something.
+ Assert.ok(!bccCheck.checked);
+ Assert.equal(bccAddress.value, "");
+ let bccUserAddress = "somebody@else.invalid";
+ bccAddress.value = bccUserAddress;
+ // After ticking the BCC checkbox the current value of the address should not change.
+ EventUtils.synthesizeMouseAtCenter(bccCheck, {}, bccCheck.ownerGlobal);
+ Assert.equal(bccAddress.value, bccUserAddress);
+}
+
+/**
+ * Bug 720199.
+ * Check if the account name automatically changes when the user changes
+ * the username or hostname.
+ */
+add_task(async function test_account_name() {
+ // We already have a POP account ready.
+ // Create also a NNTP server.
+ let nntpServer = MailServices.accounts
+ .createIncomingServer(null, "example.nntp.invalid", "nntp")
+ .QueryInterface(Ci.nsINntpIncomingServer);
+
+ let identity = MailServices.accounts.createIdentity();
+ identity.email = "tinderbox2@example.invalid";
+
+ let nntpAccount = MailServices.accounts.createAccount();
+ nntpAccount.incomingServer = nntpServer;
+ nntpAccount.addIdentity(identity);
+
+ Assert.equal(
+ gPopAccount.incomingServer.prettyName,
+ "nobody on example.invalid"
+ );
+ Assert.equal(nntpAccount.incomingServer.prettyName, "example.nntp.invalid");
+
+ // The automatic account name update works only if the name is
+ // in the form of user@host.
+ gPopAccount.incomingServer.prettyName = "nobody@example.invalid";
+
+ let newHost = "some.host.invalid";
+ let newUser = "somebody";
+
+ // On NNTP there is no user name so just set new hostname.
+ await open_advanced_settings(function (tab) {
+ subtest_check_account_name(nntpAccount, newHost, null, tab);
+ });
+
+ // And see if the account name is updated to it.
+ Assert.equal(nntpAccount.incomingServer.prettyName, newHost);
+
+ // On POP3 there is both user name and host name.
+ // Set new host name first.
+ await open_advanced_settings(function (tab) {
+ subtest_check_account_name(gPopAccount, newHost, null, tab);
+ });
+
+ // And see if in the account name the host part is updated to it.
+ Assert.equal(gPopAccount.incomingServer.prettyName, "nobody@" + newHost);
+
+ // Set new host name first.
+ await open_advanced_settings(function (tab) {
+ subtest_check_account_name(gPopAccount, null, newUser, tab);
+ });
+
+ // And see if in the account name the user part is updated.
+ Assert.equal(gPopAccount.incomingServer.prettyName, newUser + "@" + newHost);
+
+ newHost = "another.host.invalid";
+ newUser = "anotherbody";
+
+ // Set user name and host name at once.
+ await open_advanced_settings(function (tab) {
+ subtest_check_account_name(gPopAccount, newHost, newUser, tab);
+ });
+
+ // And see if in the account name the host part is updated to it.
+ Assert.equal(gPopAccount.incomingServer.prettyName, newUser + "@" + newHost);
+
+ // Now have an account name where the name does not match the hostname.
+ gPopAccount.incomingServer.prettyName = newUser + "@example.invalid";
+
+ newHost = "third.host.invalid";
+ // Set the host name again.
+ await open_advanced_settings(function (tab) {
+ subtest_check_account_name(gPopAccount, newHost, null, tab);
+ });
+
+ // And the account name should not be touched.
+ Assert.equal(
+ gPopAccount.incomingServer.prettyName,
+ newUser + "@example.invalid"
+ );
+
+ MailServices.accounts.removeAccount(nntpAccount);
+}).skip(); // Restart is required to apply change to server name or username.
+
+/**
+ * Changes the user name and hostname to the supplied values.
+ *
+ * @param {object} account - The account to change
+ * @param {string} newHostname - The hostname value to set
+ * @param {string} newUsername - The username value to set
+ * @param {object} tab - The account manager tab.
+ */
+function subtest_check_account_name(account, newHostname, newUsername, tab) {
+ let accountRow = get_account_tree_row(account.key, "am-server.xhtml", tab);
+ click_account_tree_row(tab, accountRow);
+
+ let iframe =
+ tab.browser.contentWindow.document.getElementById("contentFrame");
+
+ if (newHostname) {
+ let hostname = iframe.contentDocument.getElementById("server.hostName");
+ Assert.equal(hostname.value, account.incomingServer.hostName);
+
+ // Now change the server host name.
+ hostname.value = newHostname;
+ }
+
+ if (newUsername) {
+ let username = iframe.contentDocument.getElementById("server.username");
+ Assert.equal(username.value, account.incomingServer.username);
+
+ // Now change the server user name.
+ username.value = newUsername;
+ }
+
+ if (newUsername) {
+ gMockPromptService.register();
+ }
+
+ tab.browser.contentWindow.onAccept(true);
+ if (newUsername) {
+ Assert.equal("alert", gMockPromptService.promptState.method);
+ gMockPromptService.unregister();
+ }
+}
+
+/**
+ * Bug 536768.
+ * Check if invalid junk target settings (folders) are fixed to sane values.
+ */
+add_task(async function test_invalid_junk_target() {
+ // Set the junk target prefs to invalid values.
+ let branch = Services.prefs.getBranch(
+ "mail.server." + gPopAccount.incomingServer.key + "."
+ );
+ branch.setCharPref("spamActionTargetAccount", "some random non-existent URI");
+ branch.setStringPref(
+ "spamActionTargetFolder",
+ "some random non-existent URI"
+ );
+ let moveOnSpam = true;
+ branch.setBoolPref("moveOnSpam", moveOnSpam);
+ await open_advanced_settings(function (tab) {
+ subtest_check_invalid_junk_target(tab);
+ });
+
+ // The pref has no default so its non-existence means it was cleared.
+ moveOnSpam = branch.getBoolPref("moveOnSpam", false);
+ Assert.ok(!moveOnSpam);
+ // The targets should point to the same pop account now.
+ let targetAccount = branch.getCharPref("spamActionTargetAccount");
+ Assert.equal(targetAccount, gPopAccount.incomingServer.serverURI);
+ let targetFolder = branch.getStringPref("spamActionTargetFolder");
+ Assert.equal(targetFolder, gPopAccount.incomingServer.serverURI + "/Junk");
+});
+
+/**
+ * Just show the Junk settings pane and let it fix the values.
+ *
+ * @param {object} tab - The account manager tab.
+ */
+function subtest_check_invalid_junk_target(tab) {
+ let accountRow = get_account_tree_row(gPopAccount.key, "am-junk.xhtml", tab);
+ click_account_tree_row(tab, accountRow);
+ tab.browser.contentWindow.onAccept(true);
+}
+
+/**
+ * Bug 327812.
+ * Checks if invalid server hostnames are not accepted.
+ */
+add_task(async function test_invalid_hostname() {
+ let branch = Services.prefs.getBranch(
+ "mail.server." + gPopAccount.incomingServer.key + "."
+ );
+ let origHostname = branch.getCharPref("hostname");
+
+ await open_advanced_settings(function (tab) {
+ subtest_check_invalid_hostname(tab, false, origHostname);
+ });
+ await open_advanced_settings(function (tab) {
+ subtest_check_invalid_hostname(tab, true, origHostname);
+ });
+
+ // The new bad hostname should not have been saved.
+ let newHostname = branch.getCharPref("hostname");
+ Assert.equal(origHostname, newHostname);
+});
+
+/**
+ * Set the hostname to an invalid value and check if it gets fixed.
+ *
+ * @param {object} tab - The account manager tab.
+ * @param {boolean} exitSettings - Attempt to close the Account settings dialog.
+ * @param {string} originalHostname - Original hostname of this server.
+ */
+function subtest_check_invalid_hostname(tab, exitSettings, originalHostname) {
+ let accountRow = get_account_tree_row(
+ gPopAccount.key,
+ "am-server.xhtml",
+ tab
+ );
+ click_account_tree_row(tab, accountRow);
+
+ let iframe =
+ tab.browser.contentWindow.document.getElementById("contentFrame");
+ let hostname = iframe.contentDocument.getElementById("server.hostName");
+ Assert.equal(hostname.value, originalHostname);
+
+ hostname.value = "some_invalid+host&domain*in>invalid";
+
+ if (!exitSettings) {
+ accountRow = get_account_tree_row(gPopAccount.key, "am-junk.xhtml", tab);
+ click_account_tree_row(tab, accountRow);
+
+ // The invalid hostname should be set back to previous value at this point...
+ accountRow = get_account_tree_row(gPopAccount.key, "am-server.xhtml", tab);
+ click_account_tree_row(tab, accountRow);
+
+ // ...let's check that:
+ iframe = tab.browser.contentWindow.document.getElementById("contentFrame");
+ hostname = iframe.contentDocument.getElementById("server.hostName");
+ Assert.equal(hostname.value, originalHostname);
+ } else {
+ // If the hostname is bad, we should get a warning dialog.
+ plan_for_modal_dialog("commonDialogWindow", function (cdc) {
+ // Just dismiss it.
+ cdc.window.document.documentElement
+ .querySelector("dialog")
+ .acceptDialog();
+ });
+ tab.browser.contentWindow.onAccept(true);
+ wait_for_modal_dialog("commonDialogWindow");
+ }
+}
+
+/**
+ * Bug 1426328.
+ * Check that the AM will trim user added spaces around text values.
+ */
+const badName = "trailing space ";
+const badEmail = " leading_space@example.com";
+
+add_task(async function test_trailing_spaces() {
+ await open_advanced_settings(function (tab) {
+ subtest_check_trailing_spaces(tab);
+ });
+ Assert.equal(gPopAccount.incomingServer.prettyName, badName.trim());
+ Assert.equal(gPopAccount.defaultIdentity.email, badEmail.trim());
+});
+
+/**
+ * Check that the AM will trim user added spaces around text values
+ * when storing them into the account.
+ *
+ * @param {object} tab - The account manager tab.
+ */
+function subtest_check_trailing_spaces(tab) {
+ let accountRow = get_account_tree_row(gPopAccount.key, null, tab);
+ click_account_tree_row(tab, accountRow);
+
+ let iframe =
+ tab.browser.contentWindow.document.getElementById("contentFrame");
+
+ let accountName = iframe.contentDocument.getElementById("server.prettyName");
+ let defaultAddress = iframe.contentDocument.getElementById("identity.email");
+ accountName.value = "";
+ defaultAddress.value = "";
+ input_value(mc, badName, accountName);
+ input_value(mc, badEmail, defaultAddress);
+
+ Assert.equal(
+ accountName.value,
+ badName,
+ "accountName should have the correct value typed in"
+ );
+ // type="email" inputs are now automatically trimmed
+ Assert.equal(
+ defaultAddress.value,
+ badEmail.trim(),
+ "defaultAddress should have the correct value typed in"
+ );
+}