summaryrefslogtreecommitdiffstats
path: root/comm/mail/components/addrbook/test/browser/browser_display_multiple.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/components/addrbook/test/browser/browser_display_multiple.js')
-rw-r--r--comm/mail/components/addrbook/test/browser/browser_display_multiple.js468
1 files changed, 468 insertions, 0 deletions
diff --git a/comm/mail/components/addrbook/test/browser/browser_display_multiple.js b/comm/mail/components/addrbook/test/browser/browser_display_multiple.js
new file mode 100644
index 0000000000..02642f4408
--- /dev/null
+++ b/comm/mail/components/addrbook/test/browser/browser_display_multiple.js
@@ -0,0 +1,468 @@
+/* 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/. */
+
+var { CalendarTestUtils } = ChromeUtils.import(
+ "resource://testing-common/calendar/CalendarTestUtils.jsm"
+);
+
+var { VCardUtils } = ChromeUtils.import("resource:///modules/VCardUtils.jsm");
+
+add_setup(async function () {
+ let card1 = personalBook.addCard(createContact("victor", "test"));
+ personalBook.addCard(createContact("romeo", "test", undefined, ""));
+ let card3 = personalBook.addCard(createContact("oscar", "test"));
+ personalBook.addCard(createContact("mike", "test", undefined, ""));
+ const card5 = personalBook.addCard(createContact("xray", "test"));
+ const card6 = personalBook.addCard(createContact("yankee", "test"));
+ const card7 = personalBook.addCard(createContact("zulu", "test"));
+ let list1 = personalBook.addMailList(createMailingList("list 1"));
+ list1.addCard(card1);
+ list1.addCard(card3);
+ list1.addCard(card5);
+ list1.addCard(card6);
+ list1.addCard(card7);
+ let list2 = personalBook.addMailList(createMailingList("list 2"));
+ list2.addCard(card3);
+
+ MailServices.accounts.createLocalMailAccount();
+ let account = MailServices.accounts.accounts[0];
+ account.addIdentity(MailServices.accounts.createIdentity());
+
+ let calendar = CalendarTestUtils.createCalendar();
+
+ registerCleanupFunction(async () => {
+ MailServices.accounts.removeAccount(account, true);
+ CalendarTestUtils.removeCalendar(calendar);
+ });
+});
+
+add_task(async function testSelectMultiple() {
+ let abWindow = await openAddressBookWindow();
+ openDirectory(personalBook);
+
+ let abDocument = abWindow.document;
+ let cardsList = abDocument.getElementById("cards");
+ let detailsPane = abDocument.getElementById("detailsPane");
+
+ // In order; list 1, list 2, mike, oscar, romeo, victor, xray, yankee, zulu.
+ Assert.equal(cardsList.view.rowCount, 9);
+ Assert.ok(detailsPane.hidden);
+
+ // Select list 1 and check the list display.
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow);
+ await checkHeader({ listName: "list 1" });
+ await checkActionButtons(
+ ["list 1 <list 1>"],
+ [],
+ [
+ "victor test <victor.test@invalid>",
+ "oscar test <oscar.test@invalid>",
+ "xray test <xray.test@invalid>",
+ "yankee test <yankee.test@invalid>",
+ "zulu test <zulu.test@invalid>",
+ ]
+ );
+ await checkList([
+ "oscar test",
+ "victor test",
+ "xray test",
+ "yankee test",
+ "zulu test",
+ ]);
+
+ // list 1 and list 2.
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(1),
+ { shiftKey: true },
+ abWindow
+ );
+ await checkHeader({ selectionCount: 2, selectionType: "lists" });
+ await checkActionButtons(["list 1 <list 1>", "list 2 <list 2>"]);
+ await checkList(["list 1", "list 2"]);
+
+ // list 1 and mike (no address).
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow);
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(2),
+ { accelKey: true },
+ abWindow
+ );
+ await checkHeader({ selectionCount: 2, selectionType: "mixed" });
+ await checkActionButtons(["list 1 <list 1>"]);
+ await checkList(["list 1", "mike test"]);
+
+ // list 1 and oscar.
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow);
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(3),
+ { accelKey: true },
+ abWindow
+ );
+ await checkHeader({ selectionCount: 2, selectionType: "mixed" });
+ await checkActionButtons(
+ ["list 1 <list 1>"],
+ ["oscar test <oscar.test@invalid>"]
+ );
+ await checkList(["list 1", "oscar test"]);
+
+ // mike (no address) and oscar.
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(2), {}, abWindow);
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(3),
+ { shiftKey: true },
+ abWindow
+ );
+ await checkHeader({ selectionCount: 2, selectionType: "contacts" });
+ await checkActionButtons([], ["oscar test <oscar.test@invalid>"]);
+ await checkList(["mike test", "oscar test"]);
+
+ // mike (no address), oscar, romeo (no address) and victor.
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(5),
+ { shiftKey: true },
+ abWindow
+ );
+ await checkHeader({ selectionCount: 4, selectionType: "contacts" });
+ await checkActionButtons(
+ [],
+ ["oscar test <oscar.test@invalid>", "victor test <victor.test@invalid>"]
+ );
+ await checkList(["mike test", "oscar test", "romeo test", "victor test"]);
+
+ // mike and romeo (no addresses).
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(2), {}, abWindow);
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(4),
+ { accelKey: true },
+ abWindow
+ );
+ await checkHeader({ selectionCount: 2, selectionType: "contacts" });
+ await checkActionButtons();
+ await checkList(["mike test", "romeo test"]);
+
+ // Everything.
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow);
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(5),
+ { shiftKey: true },
+ abWindow
+ );
+ await checkHeader({ selectionCount: 6, selectionType: "mixed" });
+ await checkActionButtons(
+ ["list 1 <list 1>", "list 2 <list 2>"],
+ ["oscar test <oscar.test@invalid>", "victor test <victor.test@invalid>"]
+ );
+ await checkList([
+ "list 1",
+ "list 2",
+ "mike test",
+ "oscar test",
+ "romeo test",
+ "victor test",
+ ]);
+
+ await closeAddressBookWindow();
+});
+
+add_task(async function testDeleteMultiple() {
+ const abWindow = await openAddressBookWindow();
+ const booksList = abWindow.booksList;
+
+ // Open mailing list list1.
+ booksList.getRowAtIndex(2).click();
+
+ const abDocument = abWindow.document;
+ const cardsList = abDocument.getElementById("cards");
+ const detailsPane = abDocument.getElementById("detailsPane");
+
+ // In order; oscar, victor, xray, yankee, zulu.
+ Assert.equal(cardsList.view.rowCount, 5);
+ Assert.ok(detailsPane.hidden);
+
+ // Select victor and yankee.
+ await TestUtils.waitForTick();
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(1), {}, abWindow);
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(3),
+ { accelKey: true },
+ abWindow
+ );
+ await checkHeader({ selectionCount: 2, selectionType: "contacts" });
+ await checkList(["victor test", "yankee test"]);
+
+ // Delete victor and yankee.
+ let deletePromise = BrowserTestUtils.promiseAlertDialog("accept");
+ EventUtils.synthesizeKey("VK_DELETE", {}, window);
+ await deletePromise;
+ await TestUtils.topicObserved("addrbook-list-member-removed");
+ Assert.equal(cardsList.view.rowCount, 3);
+ Assert.ok(
+ detailsPane.hidden,
+ "The details pane should be cleared after removing two mailing list members."
+ );
+
+ // Select all contacts.
+ await TestUtils.waitForTick();
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow);
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(2),
+ { shiftKey: true },
+ abWindow
+ );
+ await checkHeader({ selectionCount: 3, selectionType: "contacts" });
+ await checkList(["oscar test", "xray test", "zulu test"]);
+
+ // Delete all contacts.
+ deletePromise = BrowserTestUtils.promiseAlertDialog("accept");
+ EventUtils.synthesizeKey("VK_DELETE", {}, window);
+ await deletePromise;
+ await TestUtils.topicObserved("addrbook-list-member-removed");
+ Assert.equal(cardsList.view.rowCount, 0);
+ Assert.ok(
+ detailsPane.hidden,
+ "The details pane should be cleared after removing all mailing list members."
+ );
+
+ // Open address book personalBook.
+ booksList.getRowAtIndex(1).click();
+
+ // In order; list 1, list 2, mike, oscar, romeo, victor, xray, yankee, zulu.
+ Assert.equal(cardsList.view.rowCount, 9);
+ Assert.ok(detailsPane.hidden);
+
+ // Select list 2 and victor.
+ await TestUtils.waitForTick();
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(1), {}, abWindow);
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(5),
+ { accelKey: true },
+ abWindow
+ );
+ await checkHeader({ selectionCount: 2, selectionType: "mixed" });
+ await checkList(["list 2", "victor test"]);
+
+ // Delete list 2 and victor.
+ deletePromise = BrowserTestUtils.promiseAlertDialog("accept");
+ EventUtils.synthesizeKey("VK_DELETE", {}, window);
+ await deletePromise;
+ await TestUtils.topicObserved("addrbook-contact-deleted");
+ Assert.equal(cardsList.view.rowCount, 7);
+ Assert.ok(
+ detailsPane.hidden,
+ "The details pane should be cleared after deleting one list and one contact."
+ );
+
+ // Select all contacts.
+ await TestUtils.waitForTick();
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow);
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(6),
+ { shiftKey: true },
+ abWindow
+ );
+ await checkHeader({ selectionCount: 7, selectionType: "mixed" });
+ await checkList([
+ "list 1",
+ "mike test",
+ "oscar test",
+ "romeo test",
+ "xray test",
+ "yankee test",
+ "zulu test",
+ ]);
+
+ // Delete all contacts.
+ deletePromise = BrowserTestUtils.promiseAlertDialog("accept");
+ EventUtils.synthesizeKey("VK_DELETE", {}, window);
+ await deletePromise;
+ await TestUtils.topicObserved("addrbook-contact-deleted");
+ Assert.equal(cardsList.view.rowCount, 0);
+ Assert.ok(
+ detailsPane.hidden,
+ "The details pane should be cleared after removing all contacts."
+ );
+ await closeAddressBookWindow();
+});
+
+function checkHeader({ listName, selectionCount, selectionType } = {}) {
+ let abWindow = getAddressBookWindow();
+ let abDocument = abWindow.document;
+
+ let contactPhoto = abDocument.getElementById("viewContactPhoto");
+ let contactName = abDocument.getElementById("viewContactName");
+ let listHeader = abDocument.getElementById("viewListName");
+ let selectionHeader = abDocument.getElementById("viewSelectionCount");
+
+ Assert.ok(
+ BrowserTestUtils.is_hidden(contactPhoto),
+ "contact photo should be hidden"
+ );
+ Assert.ok(
+ BrowserTestUtils.is_hidden(contactName),
+ "contact name should be hidden"
+ );
+ if (listName) {
+ Assert.ok(
+ BrowserTestUtils.is_visible(listHeader),
+ "list header should be visible"
+ );
+ Assert.equal(
+ listHeader.textContent,
+ listName,
+ "list header text is correct"
+ );
+ Assert.ok(
+ BrowserTestUtils.is_hidden(selectionHeader),
+ "selection header should be hidden"
+ );
+ } else {
+ Assert.ok(
+ BrowserTestUtils.is_hidden(listHeader),
+ "list header should be hidden"
+ );
+ Assert.ok(
+ BrowserTestUtils.is_visible(selectionHeader),
+ "selection header should be visible"
+ );
+ Assert.deepEqual(abDocument.l10n.getAttributes(selectionHeader), {
+ id: `about-addressbook-selection-${selectionType}-header2`,
+ args: {
+ count: selectionCount,
+ },
+ });
+ }
+}
+
+async function checkActionButtons(
+ listAddresses = [],
+ cardAddresses = [],
+ eventAddresses = cardAddresses
+) {
+ let abWindow = getAddressBookWindow();
+ let abDocument = abWindow.document;
+
+ let writeButton = abDocument.getElementById("detailsWriteButton");
+ let eventButton = abDocument.getElementById("detailsEventButton");
+ let searchButton = abDocument.getElementById("detailsSearchButton");
+ let newListButton = abDocument.getElementById("detailsNewListButton");
+
+ if (cardAddresses.length || listAddresses.length) {
+ // Write.
+ Assert.ok(
+ BrowserTestUtils.is_visible(writeButton),
+ "write button is visible"
+ );
+
+ let composeWindowPromise = BrowserTestUtils.domWindowOpened();
+ EventUtils.synthesizeMouseAtCenter(writeButton, {}, abWindow);
+ await checkComposeWindow(
+ await composeWindowPromise,
+ ...listAddresses,
+ ...cardAddresses
+ );
+ }
+
+ if (eventAddresses.length) {
+ // Event.
+ Assert.ok(
+ BrowserTestUtils.is_visible(eventButton),
+ "event button is visible"
+ );
+
+ let eventWindowPromise = CalendarTestUtils.waitForEventDialog("edit");
+ EventUtils.synthesizeMouseAtCenter(eventButton, {}, abWindow);
+ let eventWindow = await eventWindowPromise;
+
+ let iframe = eventWindow.document.getElementById(
+ "calendar-item-panel-iframe"
+ );
+ let tabPanels = iframe.contentDocument.getElementById(
+ "event-grid-tabpanels"
+ );
+ let attendeesTabPanel = iframe.contentDocument.getElementById(
+ "event-grid-tabpanel-attendees"
+ );
+ Assert.equal(
+ tabPanels.selectedPanel,
+ attendeesTabPanel,
+ "attendees are displayed"
+ );
+ let attendeeNames = attendeesTabPanel.querySelectorAll(
+ ".attendee-list .attendee-name"
+ );
+ Assert.deepEqual(
+ Array.from(attendeeNames, a => a.textContent),
+ eventAddresses,
+ "attendees are correct"
+ );
+
+ eventWindowPromise = BrowserTestUtils.domWindowClosed(eventWindow);
+ BrowserTestUtils.promiseAlertDialog("extra1");
+ EventUtils.synthesizeKey("VK_ESCAPE", {}, eventWindow);
+ await eventWindowPromise;
+ await new Promise(resolve => abWindow.setTimeout(resolve));
+ Assert.report(false, undefined, undefined, "Item dialog closed");
+ } else {
+ Assert.ok(
+ BrowserTestUtils.is_hidden(eventButton),
+ "event button is hidden"
+ );
+ }
+
+ if (cardAddresses.length) {
+ // New List.
+ Assert.ok(
+ BrowserTestUtils.is_visible(newListButton),
+ "new list button is visible"
+ );
+ let listWindowPromise = promiseLoadSubDialog(
+ "chrome://messenger/content/addressbook/abMailListDialog.xhtml"
+ );
+ EventUtils.synthesizeMouseAtCenter(newListButton, {}, abWindow);
+ let listWindow = await listWindowPromise;
+ let memberNames = listWindow.document.querySelectorAll(
+ ".textbox-addressingWidget"
+ );
+ Assert.deepEqual(
+ Array.from(memberNames, aw => aw.value),
+ [...cardAddresses, ""],
+ "list members are correct"
+ );
+
+ EventUtils.synthesizeKey("VK_ESCAPE", {}, listWindow);
+ } else {
+ Assert.ok(
+ BrowserTestUtils.is_hidden(newListButton),
+ "new list button is hidden"
+ );
+ }
+
+ Assert.ok(
+ BrowserTestUtils.is_hidden(searchButton),
+ "search button is hidden"
+ );
+}
+
+function checkList(names) {
+ let abWindow = getAddressBookWindow();
+ let abDocument = abWindow.document;
+
+ let selectedCardsSection = abDocument.getElementById("selectedCards");
+ let otherSections = abDocument.querySelectorAll(
+ "#detailsBody > section:not(#detailsActions, #selectedCards)"
+ );
+
+ Assert.ok(BrowserTestUtils.is_visible(selectedCardsSection));
+ for (let section of otherSections) {
+ Assert.ok(BrowserTestUtils.is_hidden(section), `${section.id} is hidden`);
+ }
+
+ Assert.deepEqual(
+ Array.from(
+ selectedCardsSection.querySelectorAll("li .name"),
+ li => li.textContent
+ ),
+ names
+ );
+}