summaryrefslogtreecommitdiffstats
path: root/comm/mail/components/addrbook/test/browser/browser_drag_drop.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/components/addrbook/test/browser/browser_drag_drop.js')
-rw-r--r--comm/mail/components/addrbook/test/browser/browser_drag_drop.js417
1 files changed, 417 insertions, 0 deletions
diff --git a/comm/mail/components/addrbook/test/browser/browser_drag_drop.js b/comm/mail/components/addrbook/test/browser/browser_drag_drop.js
new file mode 100644
index 0000000000..4f3c23aa5b
--- /dev/null
+++ b/comm/mail/components/addrbook/test/browser/browser_drag_drop.js
@@ -0,0 +1,417 @@
+/* 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/. */
+
+let dragService = Cc["@mozilla.org/widget/dragservice;1"].getService(
+ Ci.nsIDragService
+);
+
+function doDrag(sourceIndex, destIndex, modifiers, expectedEffect) {
+ let abWindow = getAddressBookWindow();
+ let booksList = abWindow.document.getElementById("books");
+ let cardsList = abWindow.document.getElementById("cards");
+
+ let destElement = abWindow.document.body;
+ if (destIndex !== null) {
+ destElement = booksList.getRowAtIndex(destIndex);
+ }
+
+ let [result, dataTransfer] = EventUtils.synthesizeDragOver(
+ cardsList.getRowAtIndex(sourceIndex),
+ destElement,
+ null,
+ null,
+ abWindow,
+ abWindow,
+ modifiers
+ );
+
+ Assert.equal(dataTransfer.effectAllowed, "all");
+ Assert.equal(dataTransfer.dropEffect, expectedEffect);
+
+ return [result, dataTransfer];
+}
+
+function doDragToBooksList(sourceIndex, destIndex, modifiers, expectedEffect) {
+ let abWindow = getAddressBookWindow();
+ let booksList = abWindow.document.getElementById("books");
+
+ dragService.startDragSessionForTests(Ci.nsIDragService.DRAGDROP_ACTION_NONE);
+
+ let [result, dataTransfer] = doDrag(
+ sourceIndex,
+ destIndex,
+ modifiers,
+ expectedEffect
+ );
+
+ EventUtils.synthesizeDropAfterDragOver(
+ result,
+ dataTransfer,
+ booksList.getRowAtIndex(destIndex),
+ abWindow,
+ modifiers
+ );
+
+ dragService.endDragSession(true);
+}
+
+async function doDragToComposeWindow(sourceIndices, expectedPills) {
+ let params = Cc[
+ "@mozilla.org/messengercompose/composeparams;1"
+ ].createInstance(Ci.nsIMsgComposeParams);
+ params.composeFields = Cc[
+ "@mozilla.org/messengercompose/composefields;1"
+ ].createInstance(Ci.nsIMsgCompFields);
+
+ let composeWindowPromise = BrowserTestUtils.domWindowOpened();
+ MailServices.compose.OpenComposeWindowWithParams(null, params);
+ let composeWindow = await composeWindowPromise;
+ await BrowserTestUtils.waitForEvent(composeWindow, "load");
+ let composeDocument = composeWindow.document;
+ let toAddrInput = composeDocument.getElementById("toAddrInput");
+ let toAddrRow = composeDocument.getElementById("addressRowTo");
+
+ let abWindow = getAddressBookWindow();
+ let cardsList = abWindow.document.getElementById("cards");
+
+ dragService.startDragSessionForTests(Ci.nsIDragService.DRAGDROP_ACTION_NONE);
+
+ cardsList.selectedIndices = sourceIndices;
+ let [result, dataTransfer] = EventUtils.synthesizeDragOver(
+ cardsList.getRowAtIndex(sourceIndices[0]),
+ toAddrInput,
+ null,
+ null,
+ abWindow,
+ composeWindow
+ );
+ EventUtils.synthesizeDropAfterDragOver(
+ result,
+ dataTransfer,
+ toAddrInput,
+ composeWindow
+ );
+
+ dragService.endDragSession(true);
+
+ let pills = toAddrRow.querySelectorAll("mail-address-pill");
+ Assert.equal(pills.length, expectedPills.length);
+ for (let i = 0; i < expectedPills.length; i++) {
+ Assert.equal(pills[i].label, expectedPills[i]);
+ }
+
+ let promptPromise = BrowserTestUtils.promiseAlertDialog("extra1");
+ composeWindow.goDoCommand("cmd_close");
+ await promptPromise;
+}
+
+function checkCardsInDirectory(directory, expectedCards = [], copiedCard) {
+ let actualCards = directory.childCards.slice();
+
+ for (let card of expectedCards) {
+ let index = actualCards.findIndex(c => c.UID == card.UID);
+ Assert.greaterOrEqual(index, 0);
+ actualCards.splice(index, 1);
+ }
+
+ if (copiedCard) {
+ Assert.equal(actualCards.length, 1);
+ Assert.equal(actualCards[0].firstName, copiedCard.firstName);
+ Assert.equal(actualCards[0].lastName, copiedCard.lastName);
+ Assert.equal(actualCards[0].primaryEmail, copiedCard.primaryEmail);
+ Assert.notEqual(actualCards[0].UID, copiedCard.UID);
+ } else {
+ Assert.equal(actualCards.length, 0);
+ }
+}
+
+add_task(async function test_drag() {
+ let sourceBook = createAddressBook("Source Book");
+
+ let contact1 = sourceBook.addCard(createContact("contact", "1"));
+ let contact2 = sourceBook.addCard(createContact("contact", "2"));
+ let contact3 = sourceBook.addCard(createContact("contact", "3"));
+
+ let abWindow = await openAddressBookWindow();
+ let cardsList = abWindow.document.getElementById("cards");
+
+ // Drag just contact1.
+
+ dragService.startDragSessionForTests(Ci.nsIDragService.DRAGDROP_ACTION_NONE);
+
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow);
+ let [, dataTransfer] = doDrag(0, null, {}, "none");
+
+ let transferCards = dataTransfer.mozGetDataAt("moz/abcard-array", 0);
+ Assert.equal(transferCards.length, 1);
+ Assert.ok(transferCards[0].equals(contact1));
+
+ let transferUnicode = dataTransfer.getData("text/plain");
+ Assert.equal(transferUnicode, "contact 1 <contact.1@invalid>");
+
+ let transferVCard = dataTransfer.getData("text/vcard");
+ Assert.stringContains(transferVCard, `\r\nUID:${contact1.UID}\r\n`);
+
+ dragService.endDragSession(true);
+
+ // Drag contact2 without selecting it.
+
+ dragService.startDragSessionForTests(Ci.nsIDragService.DRAGDROP_ACTION_NONE);
+
+ [, dataTransfer] = doDrag(1, null, {}, "none");
+
+ transferCards = dataTransfer.mozGetDataAt("moz/abcard-array", 0);
+ Assert.equal(transferCards.length, 1);
+ Assert.ok(transferCards[0].equals(contact2));
+
+ transferUnicode = dataTransfer.getData("text/plain");
+ Assert.equal(transferUnicode, "contact 2 <contact.2@invalid>");
+
+ transferVCard = dataTransfer.getData("text/vcard");
+ Assert.stringContains(transferVCard, `\r\nUID:${contact2.UID}\r\n`);
+
+ dragService.endDragSession(true);
+
+ // Drag all contacts.
+
+ dragService.startDragSessionForTests(Ci.nsIDragService.DRAGDROP_ACTION_NONE);
+
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(2),
+ { shiftKey: true },
+ abWindow
+ );
+ [, dataTransfer] = doDrag(0, null, {}, "none");
+
+ transferCards = dataTransfer.mozGetDataAt("moz/abcard-array", 0);
+ Assert.equal(transferCards.length, 3);
+ Assert.ok(transferCards[0].equals(contact1));
+ Assert.ok(transferCards[1].equals(contact2));
+ Assert.ok(transferCards[2].equals(contact3));
+
+ transferUnicode = dataTransfer.getData("text/plain");
+ Assert.equal(
+ transferUnicode,
+ "contact 1 <contact.1@invalid>,contact 2 <contact.2@invalid>,contact 3 <contact.3@invalid>"
+ );
+
+ transferVCard = dataTransfer.getData("text/vcard");
+ Assert.stringContains(transferVCard, `\r\nUID:${contact1.UID}\r\n`);
+
+ dragService.endDragSession(true);
+
+ await closeAddressBookWindow();
+
+ await promiseDirectoryRemoved(sourceBook.URI);
+});
+
+add_task(async function test_drop_on_books_list() {
+ let sourceBook = createAddressBook("Source Book");
+ let sourceList = sourceBook.addMailList(createMailingList("Source List"));
+ let destBook = createAddressBook("Destination Book");
+ let destList = destBook.addMailList(createMailingList("Destination List"));
+
+ let contact1 = sourceBook.addCard(createContact("contact", "1"));
+ let contact2 = sourceBook.addCard(createContact("contact", "2"));
+ let contact3 = sourceBook.addCard(createContact("contact", "3"));
+
+ let abWindow = await openAddressBookWindow();
+ let booksList = abWindow.document.getElementById("books");
+ let cardsList = abWindow.document.getElementById("cards");
+
+ checkCardsInDirectory(sourceBook, [contact1, contact2, contact3, sourceList]);
+ checkCardsInDirectory(sourceList);
+ checkCardsInDirectory(destBook, [destList]);
+ checkCardsInDirectory(destList);
+
+ Assert.equal(booksList.rowCount, 7);
+ openDirectory(sourceBook);
+
+ // Check drag effect set correctly for dragging a card.
+
+ Assert.equal(cardsList.view.rowCount, 4);
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow);
+
+ dragService.startDragSessionForTests(Ci.nsIDragService.DRAGDROP_ACTION_NONE);
+
+ doDrag(0, 0, {}, "none"); // All Address Books
+ doDrag(0, 0, { ctrlKey: true }, "none");
+
+ doDrag(0, 1, {}, "move"); // Personal Address Book
+ doDrag(0, 1, { ctrlKey: true }, "copy");
+
+ doDrag(0, 2, {}, "move"); // Destination Book
+ doDrag(0, 2, { ctrlKey: true }, "copy");
+
+ doDrag(0, 3, {}, "none"); // Destination List
+ doDrag(0, 3, { ctrlKey: true }, "none");
+
+ doDrag(0, 4, {}, "none"); // Source Book
+ doDrag(0, 4, { ctrlKey: true }, "none");
+
+ doDrag(0, 5, {}, "link"); // Source List
+ doDrag(0, 5, { ctrlKey: true }, "link");
+
+ doDrag(0, 6, {}, "move"); // Collected Addresses
+ doDrag(0, 6, { ctrlKey: true }, "copy");
+
+ dragService.endDragSession(true);
+
+ // Check drag effect set correctly for dragging a list.
+
+ Assert.equal(cardsList.view.rowCount, 4);
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(3), {}, abWindow);
+
+ dragService.startDragSessionForTests(Ci.nsIDragService.DRAGDROP_ACTION_NONE);
+
+ doDrag(3, 0, {}, "none"); // All Address Books
+ doDrag(3, 0, { ctrlKey: true }, "none");
+
+ doDrag(3, 1, {}, "none"); // Personal Address Book
+ doDrag(3, 1, { ctrlKey: true }, "none");
+
+ doDrag(3, 2, {}, "none"); // Destination Book
+ doDrag(3, 2, { ctrlKey: true }, "none");
+
+ doDrag(3, 3, {}, "none"); // Destination List
+ doDrag(3, 3, { ctrlKey: true }, "none");
+
+ doDrag(3, 4, {}, "none"); // Source Book
+ doDrag(3, 4, { ctrlKey: true }, "none");
+
+ doDrag(3, 5, {}, "none"); // Source List
+ doDrag(3, 5, { ctrlKey: true }, "none");
+
+ doDrag(3, 6, {}, "none"); // Collected Addresses
+ doDrag(3, 6, { ctrlKey: true }, "none");
+
+ dragService.endDragSession(true);
+
+ // Drag contact1 into sourceList.
+
+ Assert.equal(cardsList.view.rowCount, 4);
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow);
+
+ doDragToBooksList(0, 5, {}, "link");
+ checkCardsInDirectory(sourceBook, [contact1, contact2, contact3, sourceList]);
+ checkCardsInDirectory(sourceList, [contact1]);
+
+ // Drag contact1 into destList. Nothing should happen.
+
+ doDragToBooksList(0, 3, {}, "none");
+ checkCardsInDirectory(sourceBook, [contact1, contact2, contact3, sourceList]);
+ checkCardsInDirectory(destBook, [destList]);
+ checkCardsInDirectory(destList);
+
+ // Drag contact1 into destBook. It should be moved into destBook.
+
+ doDragToBooksList(0, 2, {}, "move");
+ checkCardsInDirectory(sourceBook, [contact2, contact3, sourceList]);
+ checkCardsInDirectory(sourceList);
+ checkCardsInDirectory(destBook, [contact1, destList]);
+
+ // Drag contact2 into destBook with Ctrl pressed.
+ // It should be copied into destBook.
+
+ Assert.equal(cardsList.view.rowCount, 3);
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow);
+
+ doDragToBooksList(0, 2, { ctrlKey: true }, "copy");
+ checkCardsInDirectory(sourceBook, [contact2, contact3, sourceList]);
+ checkCardsInDirectory(destBook, [contact1, destList], contact2);
+ checkCardsInDirectory(destList);
+
+ // Delete the cards from destBook as it's confusing.
+
+ destBook.deleteCards(destBook.childCards.filter(c => !c.isMailList));
+ checkCardsInDirectory(destBook, [destList]);
+
+ // Drag contact2 and contact3 to destBook.
+
+ Assert.equal(cardsList.view.rowCount, 3);
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow);
+ EventUtils.synthesizeMouseAtCenter(
+ cardsList.getRowAtIndex(1),
+ { shiftKey: true },
+ abWindow
+ );
+
+ doDragToBooksList(0, 2, {}, "move");
+ checkCardsInDirectory(sourceBook, [sourceList]);
+ checkCardsInDirectory(destBook, [contact2, contact3, destList]);
+
+ // Drag contact2 to the book it's already in. Nothing should happen.
+ // This test doesn't actually catch the bug it was written for, but maybe
+ // one day it will catch something.
+
+ openDirectory(destBook);
+ Assert.equal(cardsList.view.rowCount, 3);
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow);
+ doDragToBooksList(0, 2, {}, "none");
+ checkCardsInDirectory(destBook, [contact2, contact3, destList]);
+
+ // Drag destList to the book it's already in. Nothing should happen.
+
+ EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(2), {}, abWindow);
+ doDragToBooksList(2, 2, {}, "none");
+ checkCardsInDirectory(destBook, [contact2, contact3, destList]);
+
+ await closeAddressBookWindow();
+
+ await promiseDirectoryRemoved(sourceBook.URI);
+ await promiseDirectoryRemoved(destBook.URI);
+});
+
+add_task(async function test_drop_on_compose() {
+ MailServices.accounts.createLocalMailAccount();
+ let account = MailServices.accounts.accounts[0];
+ account.addIdentity(MailServices.accounts.createIdentity());
+
+ registerCleanupFunction(async () => {
+ MailServices.accounts.removeAccount(account, true);
+ });
+
+ let sourceBook = createAddressBook("Source Book");
+ let sourceList = sourceBook.addMailList(createMailingList("Source List"));
+
+ let contact1 = sourceBook.addCard(createContact("contact", "1"));
+ let contact2 = sourceBook.addCard(createContact("contact", "2"));
+ let contact3 = sourceBook.addCard(createContact("contact", "3"));
+ sourceList.addCard(contact1);
+ sourceList.addCard(contact2);
+ sourceList.addCard(contact3);
+
+ let abWindow = await openAddressBookWindow();
+ let cardsList = abWindow.document.getElementById("cards");
+ Assert.equal(cardsList.view.rowCount, 4);
+
+ // One contact.
+
+ await doDragToComposeWindow([0], ["contact 1 <contact.1@invalid>"]);
+
+ // Multiple contacts.
+
+ await doDragToComposeWindow(
+ [0, 1, 2],
+ [
+ "contact 1 <contact.1@invalid>",
+ "contact 2 <contact.2@invalid>",
+ "contact 3 <contact.3@invalid>",
+ ]
+ );
+
+ // A mailing list.
+
+ await doDragToComposeWindow([3], [`Source List <"Source List">`]);
+
+ // A mailing list and a contact.
+
+ await doDragToComposeWindow(
+ [3, 2],
+ ["contact 3 <contact.3@invalid>", `Source List <"Source List">`]
+ );
+
+ await closeAddressBookWindow();
+ await promiseDirectoryRemoved(sourceBook.URI);
+});