summaryrefslogtreecommitdiffstats
path: root/comm/calendar/test/browser/head.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--comm/calendar/test/browser/head.js374
1 files changed, 374 insertions, 0 deletions
diff --git a/comm/calendar/test/browser/head.js b/comm/calendar/test/browser/head.js
new file mode 100644
index 0000000000..f76cc85754
--- /dev/null
+++ b/comm/calendar/test/browser/head.js
@@ -0,0 +1,374 @@
+/* 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/. */
+
+/* import-globals-from ../../base/content/calendar-views-utils.js */
+
+/* globals openOptionsDialog, openAddonsMgr */
+
+const { CalendarTestUtils } = ChromeUtils.import(
+ "resource://testing-common/calendar/CalendarTestUtils.jsm"
+);
+
+async function openTasksTab() {
+ let tabmail = document.getElementById("tabmail");
+ let tasksMode = tabmail.tabModes.tasks;
+
+ if (tasksMode.tabs.length == 1) {
+ tabmail.selectedTab = tasksMode.tabs[0];
+ } else {
+ let tasksTabButton = document.getElementById("tasksButton");
+ EventUtils.synthesizeMouseAtCenter(tasksTabButton, { clickCount: 1 });
+ }
+
+ is(tasksMode.tabs.length, 1, "tasks tab is open");
+ is(tabmail.selectedTab, tasksMode.tabs[0], "tasks tab is selected");
+
+ await new Promise(resolve => setTimeout(resolve));
+}
+
+async function closeTasksTab() {
+ let tabmail = document.getElementById("tabmail");
+ let tasksMode = tabmail.tabModes.tasks;
+
+ if (tasksMode.tabs.length == 1) {
+ tabmail.closeTab(tasksMode.tabs[0]);
+ }
+
+ is(tasksMode.tabs.length, 0, "tasks tab is not open");
+
+ await new Promise(resolve => setTimeout(resolve));
+}
+
+/**
+ * Currently there's always a folder tab open, hence "select" not "open".
+ */
+async function selectFolderTab() {
+ const tabmail = document.getElementById("tabmail");
+ const folderMode = tabmail.tabModes.mail3PaneTab;
+
+ tabmail.selectedTab = folderMode.tabs[0];
+
+ is(folderMode.tabs.length > 0, true, "at least one folder tab is open");
+ is(tabmail.selectedTab, folderMode.tabs[0], "a folder tab is selected");
+
+ await new Promise(resolve => setTimeout(resolve));
+}
+
+async function openChatTab() {
+ let tabmail = document.getElementById("tabmail");
+ let chatMode = tabmail.tabModes.chat;
+
+ if (chatMode.tabs.length == 1) {
+ tabmail.selectedTab = chatMode.tabs[0];
+ } else {
+ window.showChatTab();
+ }
+
+ is(chatMode.tabs.length, 1, "chat tab is open");
+ is(tabmail.selectedTab, chatMode.tabs[0], "chat tab is selected");
+
+ await new Promise(resolve => setTimeout(resolve));
+}
+
+async function closeChatTab() {
+ let tabmail = document.getElementById("tabmail");
+ let chatMode = tabmail.tabModes.chat;
+
+ if (chatMode.tabs.length == 1) {
+ tabmail.closeTab(chatMode.tabs[0]);
+ }
+
+ is(chatMode.tabs.length, 0, "chat tab is not open");
+
+ await new Promise(resolve => setTimeout(resolve));
+}
+
+/**
+ * Opens a new calendar event or task tab.
+ *
+ * @param {string} tabMode - Mode of the new tab, either `calendarEvent` or `calendarTask`.
+ * @returns {string} - The id of the new tab's panel element.
+ */
+async function _openNewCalendarItemTab(tabMode) {
+ let tabmail = document.getElementById("tabmail");
+ let itemTabs = tabmail.tabModes[tabMode].tabs;
+ let previousTabCount = itemTabs.length;
+
+ Services.prefs.setBoolPref("calendar.item.editInTab", true);
+ let buttonId = "sidePanelNewEvent";
+ if (tabMode == "calendarTask") {
+ await openTasksTab();
+ buttonId = "sidePanelNewTask";
+ } else {
+ await CalendarTestUtils.openCalendarTab(window);
+ }
+
+ let newItemButton = document.getElementById(buttonId);
+ EventUtils.synthesizeMouseAtCenter(newItemButton, { clickCount: 1 });
+
+ let newTab = itemTabs[itemTabs.length - 1];
+
+ is(itemTabs.length, previousTabCount + 1, `new ${tabMode} tab is open`);
+ is(tabmail.selectedTab, newTab, `new ${tabMode} tab is selected`);
+
+ await BrowserTestUtils.browserLoaded(newTab.iframe);
+ await new Promise(resolve => setTimeout(resolve));
+ return newTab.panel.id;
+}
+
+let openNewCalendarEventTab = _openNewCalendarItemTab.bind(null, "calendarEvent");
+let openNewCalendarTaskTab = _openNewCalendarItemTab.bind(null, "calendarTask");
+
+/**
+ * Selects an existing (open) calendar event or task tab.
+ *
+ * @param {string} tabMode - The tab mode, either `calendarEvent` or `calendarTask`.
+ * @param {string} panelId - The id of the tab's panel element.
+ */
+async function _selectCalendarItemTab(tabMode, panelId) {
+ let tabmail = document.getElementById("tabmail");
+ let itemTabs = tabmail.tabModes[tabMode].tabs;
+ let tabToSelect = itemTabs.find(tab => tab.panel.id == panelId);
+
+ ok(tabToSelect, `${tabMode} tab is open`);
+
+ tabmail.selectedTab = tabToSelect;
+
+ is(tabmail.selectedTab, tabToSelect, `${tabMode} tab is selected`);
+
+ await new Promise(resolve => setTimeout(resolve));
+}
+
+let selectCalendarEventTab = _selectCalendarItemTab.bind(null, "calendarEvent");
+let selectCalendarTaskTab = _selectCalendarItemTab.bind(null, "calendarTask");
+
+/**
+ * Closes a calendar event or task tab.
+ *
+ * @param {string} tabMode - The tab mode, either `calendarEvent` or `calendarTask`.
+ * @param {string} panelId - The id of the panel of the tab to close.
+ */
+async function _closeCalendarItemTab(tabMode, panelId) {
+ let tabmail = document.getElementById("tabmail");
+ let itemTabs = tabmail.tabModes[tabMode].tabs;
+ let previousTabCount = itemTabs.length;
+ let itemTab = itemTabs.find(tab => tab.panel.id == panelId);
+
+ if (itemTab) {
+ // Tab does not immediately close, so wait for it.
+ let tabClosedPromise = new Promise(resolve => {
+ itemTab.tabNode.addEventListener("TabClose", resolve, { once: true });
+ });
+ tabmail.closeTab(itemTab);
+ await tabClosedPromise;
+ }
+
+ is(itemTabs.length, previousTabCount - 1, `${tabMode} tab was closed`);
+
+ await new Promise(resolve => setTimeout(resolve));
+}
+
+let closeCalendarEventTab = _closeCalendarItemTab.bind(null, "calendarEvent");
+let closeCalendarTaskTab = _closeCalendarItemTab.bind(null, "calendarTask");
+
+async function openPreferencesTab() {
+ const tabmail = document.getElementById("tabmail");
+ const prefsMode = tabmail.tabModes.preferencesTab;
+
+ if (prefsMode.tabs.length == 1) {
+ tabmail.selectedTab = prefsMode.tabs[0];
+ } else {
+ openOptionsDialog();
+ }
+
+ is(prefsMode.tabs.length, 1, "preferences tab is open");
+ is(tabmail.selectedTab, prefsMode.tabs[0], "preferences tab is selected");
+
+ await new Promise(resolve => setTimeout(resolve));
+}
+
+async function closeAddressBookTab() {
+ let tabmail = document.getElementById("tabmail");
+ let abMode = tabmail.tabModes.addressBookTab;
+
+ if (abMode.tabs.length == 1) {
+ tabmail.closeTab(abMode.tabs[0]);
+ }
+
+ is(abMode.tabs.length, 0, "address book tab is not open");
+
+ await new Promise(resolve => setTimeout(resolve));
+}
+
+async function closePreferencesTab() {
+ let tabmail = document.getElementById("tabmail");
+ let prefsMode = tabmail.tabModes.preferencesTab;
+
+ if (prefsMode.tabs.length == 1) {
+ tabmail.closeTab(prefsMode.tabs[0]);
+ }
+
+ is(prefsMode.tabs.length, 0, "preferences tab is not open");
+
+ await new Promise(resolve => setTimeout(resolve));
+}
+
+async function openAddonsTab() {
+ const tabmail = document.getElementById("tabmail");
+ const contentMode = tabmail.tabModes.contentTab;
+
+ if (contentMode.tabs.length == 1) {
+ tabmail.selectedTab = contentMode.tabs[0];
+ } else {
+ openAddonsMgr("addons://list/extension");
+ }
+
+ is(contentMode.tabs.length, 1, "addons tab is open");
+ is(tabmail.selectedTab, contentMode.tabs[0], "addons tab is selected");
+
+ await new Promise(resolve => setTimeout(resolve));
+}
+
+async function closeAddonsTab() {
+ let tabmail = document.getElementById("tabmail");
+ let contentMode = tabmail.tabModes.contentTab;
+
+ if (contentMode.tabs.length == 1) {
+ tabmail.closeTab(contentMode.tabs[0]);
+ }
+
+ is(contentMode.tabs.length, 0, "addons tab is not open");
+
+ await new Promise(resolve => setTimeout(resolve));
+}
+
+/**
+ * Create a calendar using the "Create New Calendar" dialog.
+ *
+ * @param {string} name - Name for the new calendar.
+ * @param {object} [data] - Data to enter into the dialog.
+ * @param {boolean} [data.showReminders] - False to disable reminders.
+ * @param {string} [data.email] - An email address.
+ * @param {object} [data.network] - Data for network calendars.
+ * @param {string} [data.network.location] - A URI (leave undefined for local ICS file).
+ * @param {boolean} [data.network.offline] - False to disable the cache.
+ */
+async function createCalendarUsingDialog(name, data = {}) {
+ /**
+ * Callback function to interact with the dialog.
+ *
+ * @param {nsIDOMWindow} win - The dialog window.
+ */
+ async function useDialog(win) {
+ let doc = win.document;
+ let dialogElement = doc.querySelector("dialog");
+ let acceptButton = dialogElement.getButton("accept");
+
+ if (data.network) {
+ // Choose network calendar type.
+ doc.querySelector("#calendar-type [value='network']").click();
+ acceptButton.click();
+
+ // Enter a location.
+ if (data.network.location == undefined) {
+ let calendarFile = Services.dirsvc.get("TmpD", Ci.nsIFile);
+ calendarFile.append(name + ".ics");
+ let fileURI = Services.io.newFileURI(calendarFile);
+ data.network.location = fileURI.prePath + fileURI.pathQueryRef;
+ }
+ EventUtils.synthesizeMouseAtCenter(doc.querySelector("#network-location-input"), {}, win);
+ EventUtils.sendString(data.network.location, win);
+
+ // Choose offline support.
+ if (data.network.offline == undefined) {
+ data.network.offline = true;
+ }
+ let offlineCheckbox = doc.querySelector("#network-cache-checkbox");
+ if (!offlineCheckbox.checked) {
+ EventUtils.synthesizeMouseAtCenter(offlineCheckbox, {}, win);
+ }
+ acceptButton.click();
+
+ // Set up an observer to wait for calendar(s) to be found, before
+ // clicking the accept button to subscribe to the calendar(s).
+ let observer = new MutationObserver(mutationList => {
+ mutationList.forEach(async mutation => {
+ if (mutation.type === "childList") {
+ acceptButton.click();
+ }
+ });
+ });
+ observer.observe(doc.querySelector("#network-calendar-list"), { childList: true });
+ } else {
+ // Choose local calendar type.
+ doc.querySelector("#calendar-type [value='local']").click();
+ acceptButton.click();
+
+ // Set calendar name.
+ // Setting the value does not activate the accept button on all platforms,
+ // so we need to type something in case the field is empty.
+ let nameInput = doc.querySelector("#local-calendar-name-input");
+ if (nameInput.value == "") {
+ EventUtils.synthesizeMouseAtCenter(nameInput, {}, win);
+ EventUtils.sendString(name, win);
+ }
+
+ // Set reminder option.
+ if (data.showReminders == undefined) {
+ data.showReminders = true;
+ }
+ let localFireAlarmsCheckbox = doc.querySelector("#local-fire-alarms-checkbox");
+ if (localFireAlarmsCheckbox.checked != data.showReminders) {
+ EventUtils.synthesizeMouseAtCenter(localFireAlarmsCheckbox, {}, win);
+ }
+
+ // Set email account.
+ if (data.email == undefined) {
+ data.email = "none";
+ }
+ let emailIdentityMenulist = doc.querySelector("#email-identity-menulist");
+ EventUtils.synthesizeMouseAtCenter(emailIdentityMenulist, {}, win);
+ emailIdentityMenulist.querySelector("menuitem[value='none']").click();
+
+ // Create the calendar.
+ acceptButton.click();
+ }
+ }
+
+ let dialogWindowPromise = BrowserTestUtils.promiseAlertDialog(
+ null,
+ "chrome://calendar/content/calendar-creation.xhtml",
+ { callback: useDialog }
+ );
+ // Open the "create new calendar" dialog.
+ CalendarTestUtils.openCalendarTab(window);
+ // This double-click must be inside the calendar list but below the list items.
+ EventUtils.synthesizeMouseAtCenter(document.querySelector("#calendar-list"), { clickCount: 2 });
+ return dialogWindowPromise;
+}
+
+const calendarViewsInitialState = CalendarTestUtils.saveCalendarViewsState(window);
+
+registerCleanupFunction(async () => {
+ await CalendarTestUtils.restoreCalendarViewsState(window, calendarViewsInitialState);
+ await closeTasksTab();
+ await closeChatTab();
+ await closeAddressBookTab();
+ await closePreferencesTab();
+ await closeAddonsTab();
+
+ // Close any event or task tabs that are open.
+ let tabmail = document.getElementById("tabmail");
+ let eventTabPanelIds = tabmail.tabModes.calendarEvent.tabs.map(tab => tab.panel.id);
+ let taskTabPanelIds = tabmail.tabModes.calendarTask.tabs.map(tab => tab.panel.id);
+ for (let id of eventTabPanelIds) {
+ await closeCalendarEventTab(id);
+ }
+ for (let id of taskTabPanelIds) {
+ await closeCalendarTaskTab(id);
+ }
+ Services.prefs.setBoolPref("calendar.item.editInTab", false);
+
+ Assert.equal(tabmail.tabInfo.length, 1, "all tabs closed");
+});