diff options
Diffstat (limited to 'comm/calendar/test/browser/preferences')
4 files changed, 346 insertions, 0 deletions
diff --git a/comm/calendar/test/browser/preferences/browser.ini b/comm/calendar/test/browser/preferences/browser.ini new file mode 100644 index 0000000000..a06213b220 --- /dev/null +++ b/comm/calendar/test/browser/preferences/browser.ini @@ -0,0 +1,16 @@ +[default] +head = head.js +prefs = + calendar.item.promptDelete=false + calendar.timezone.local=UTC + calendar.timezone.useSystemTimezone=false + calendar.week.start=0 + mail.provider.suppress_dialog_on_startup=true + mail.spotlight.firstRunDone=true + mail.winsearch.firstRunDone=true + mailnews.start_page.override_url=about:blank + mailnews.start_page.url=about:blank +subsuite = thunderbird + +[browser_alarmDefaultValue.js] +[browser_categoryColors.js] diff --git a/comm/calendar/test/browser/preferences/browser_alarmDefaultValue.js b/comm/calendar/test/browser/preferences/browser_alarmDefaultValue.js new file mode 100644 index 0000000000..b1cde7cf11 --- /dev/null +++ b/comm/calendar/test/browser/preferences/browser_alarmDefaultValue.js @@ -0,0 +1,176 @@ +/* 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/. */ + +/** + * Test default alarm settings for events and tasks + */ + +var { cal } = ChromeUtils.import("resource:///modules/calendar/calUtils.jsm"); + +var { CalendarTestUtils } = ChromeUtils.import( + "resource://testing-common/calendar/CalendarTestUtils.jsm" +); +var { cancelItemDialog } = ChromeUtils.import( + "resource://testing-common/calendar/ItemEditingHelpers.jsm" +); + +const DEFVALUE = 43; + +add_task(async function testDefaultAlarms() { + let calendar = CalendarTestUtils.createCalendar("Mochitest", "memory"); + calendar.setProperty("calendar-main-default", true); + registerCleanupFunction(async () => { + CalendarTestUtils.removeCalendar(calendar); + }); + + let localeUnitString = cal.l10n.getCalString("unitDays"); + let unitString = PluralForm.get(DEFVALUE, localeUnitString).replace("#1", DEFVALUE); + let alarmString = (...args) => cal.l10n.getString("calendar-alarms", ...args); + let originStringEvent = alarmString("reminderCustomOriginBeginBeforeEvent"); + let originStringTask = alarmString("reminderCustomOriginBeginBeforeTask"); + let expectedEventReminder = alarmString("reminderCustomTitle", [unitString, originStringEvent]); + let expectedTaskReminder = alarmString("reminderCustomTitle", [unitString, originStringTask]); + + // Configure the preferences. + let { prefsWindow, prefsDocument } = await openNewPrefsTab("paneCalendar", "defaultsnoozelength"); + await handlePrefTab(prefsWindow, prefsDocument); + + // Create New Event. + await CalendarTestUtils.openCalendarTab(window); + + let { dialogWindow, iframeWindow, iframeDocument } = await CalendarTestUtils.editNewEvent(window); + + Assert.equal(iframeDocument.querySelector(".item-alarm").value, "custom"); + let reminderDetails = iframeDocument.querySelector(".reminder-single-alarms-label"); + Assert.equal(reminderDetails.value, expectedEventReminder); + + let reminderDialogPromise = BrowserTestUtils.promiseAlertDialog( + null, + "chrome://calendar/content/calendar-event-dialog-reminder.xhtml", + { callback: handleReminderDialog } + ); + EventUtils.synthesizeMouseAtCenter(reminderDetails, {}, iframeWindow); + await reminderDialogPromise; + + let promptPromise = BrowserTestUtils.promiseAlertDialog("extra1"); + cancelItemDialog(dialogWindow); + await promptPromise; + + // Create New Task. + await openTasksTab(); + ({ dialogWindow, iframeWindow, iframeDocument } = await CalendarTestUtils.editNewTask(window)); + + Assert.equal(iframeDocument.querySelector(".item-alarm").value, "custom"); + reminderDetails = iframeDocument.querySelector(".reminder-single-alarms-label"); + Assert.equal(reminderDetails.value, expectedTaskReminder); + + reminderDialogPromise = BrowserTestUtils.promiseAlertDialog( + null, + "chrome://calendar/content/calendar-event-dialog-reminder.xhtml", + { callback: handleReminderDialog } + ); + EventUtils.synthesizeMouseAtCenter(reminderDetails, {}, iframeWindow); + await reminderDialogPromise; + + promptPromise = BrowserTestUtils.promiseAlertDialog("extra1"); + cancelItemDialog(dialogWindow); + await promptPromise; +}); + +async function handlePrefTab(prefsWindow, prefsDocument) { + function menuList(id, value) { + let list = prefsDocument.getElementById(id); + list.scrollIntoView(); + list.click(); + list.querySelector(`menuitem[value="${value}"]`).click(); + } + // Turn on alarms for events and tasks. + menuList("eventdefalarm", "1"); + menuList("tododefalarm", "1"); + + // Selects "days" as a unit. + menuList("tododefalarmunit", "days"); + menuList("eventdefalarmunit", "days"); + + function text(id, value) { + let input = prefsDocument.getElementById(id); + input.scrollIntoView(); + EventUtils.synthesizeMouse(input, 5, 5, {}, prefsWindow); + Assert.equal(prefsDocument.activeElement, input); + EventUtils.synthesizeKey("a", { accelKey: true }, prefsWindow); + EventUtils.sendString(value, prefsWindow); + } + // Sets default alarm length for events to DEFVALUE. + text("eventdefalarmlen", DEFVALUE.toString()); + text("tododefalarmlen", DEFVALUE.toString()); + + Assert.equal(Services.prefs.getIntPref("calendar.alarms.onforevents"), 1); + Assert.equal(Services.prefs.getIntPref("calendar.alarms.eventalarmlen"), DEFVALUE); + Assert.equal(Services.prefs.getStringPref("calendar.alarms.eventalarmunit"), "days"); + Assert.equal(Services.prefs.getIntPref("calendar.alarms.onfortodos"), 1); + Assert.equal(Services.prefs.getIntPref("calendar.alarms.todoalarmlen"), DEFVALUE); + Assert.equal(Services.prefs.getStringPref("calendar.alarms.todoalarmunit"), "days"); +} + +async function handleReminderDialog(remindersWindow) { + await new Promise(remindersWindow.setTimeout); + let remindersDocument = remindersWindow.document; + + let listbox = remindersDocument.getElementById("reminder-listbox"); + Assert.equal(listbox.selectedCount, 1); + Assert.equal(listbox.selectedItem.reminder.offset.days, DEFVALUE); + + EventUtils.synthesizeMouseAtCenter( + remindersDocument.getElementById("reminder-new-button"), + {}, + remindersWindow + ); + Assert.equal(listbox.itemCount, 2); + Assert.equal(listbox.selectedCount, 1); + Assert.equal(listbox.selectedItem.reminder.offset.days, DEFVALUE); + + function text(id, value) { + let input = remindersDocument.getElementById(id); + EventUtils.synthesizeMouse(input, 5, 5, {}, remindersWindow); + Assert.equal(remindersDocument.activeElement, input); + EventUtils.synthesizeKey("a", { accelKey: true }, remindersWindow); + EventUtils.sendString(value, remindersWindow); + } + text("reminder-length", "20"); + Assert.equal(listbox.selectedItem.reminder.offset.days, 20); + + EventUtils.synthesizeMouseAtCenter(listbox, {}, remindersWindow); + EventUtils.synthesizeKey("VK_UP", {}, remindersWindow); + Assert.equal(listbox.selectedIndex, 0); + + Assert.equal(listbox.selectedItem.reminder.offset.days, DEFVALUE); + + remindersDocument.querySelector("dialog").getButton("accept").click(); +} + +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)); +} + +registerCleanupFunction(function () { + Services.prefs.clearUserPref("calendar.alarms.onforevents"); + Services.prefs.clearUserPref("calendar.alarms.eventalarmlen"); + Services.prefs.clearUserPref("calendar.alarms.eventalarmunit"); + Services.prefs.clearUserPref("calendar.alarms.onfortodos"); + Services.prefs.clearUserPref("calendar.alarms.todoalarmlen"); + Services.prefs.clearUserPref("calendar.alarms.todoalarmunit"); +}); diff --git a/comm/calendar/test/browser/preferences/browser_categoryColors.js b/comm/calendar/test/browser/preferences/browser_categoryColors.js new file mode 100644 index 0000000000..29ad21ce13 --- /dev/null +++ b/comm/calendar/test/browser/preferences/browser_categoryColors.js @@ -0,0 +1,90 @@ +/* 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 { cal } = ChromeUtils.import("resource:///modules/calendar/calUtils.jsm"); + +var { CalendarTestUtils } = ChromeUtils.import( + "resource://testing-common/calendar/CalendarTestUtils.jsm" +); + +add_task(async function testCategoryColors() { + let calendar = CalendarTestUtils.createCalendar("Mochitest", "memory"); + + registerCleanupFunction(async () => { + CalendarTestUtils.removeCalendar(calendar); + }); + + let { prefsWindow, prefsDocument } = await openNewPrefsTab("paneCalendar", "categorieslist"); + + let listBox = prefsDocument.getElementById("categorieslist"); + Assert.equal(listBox.itemChildren.length, 22); + + for (let item of listBox.itemChildren) { + info(`${item.firstElementChild.value}: ${item.lastElementChild.style.backgroundColor}`); + Assert.ok(item.lastElementChild.style.backgroundColor); + } + + // Edit the name and colour of a built-in category. + + let subDialogPromise = BrowserTestUtils.waitForEvent( + prefsWindow.gSubDialog._dialogStack, + "dialogopen" + ); + + EventUtils.synthesizeMouse(listBox, 5, 5, {}, prefsWindow); + Assert.equal(listBox.selectedIndex, 0); + EventUtils.synthesizeMouseAtCenter(prefsDocument.getElementById("editCButton"), {}, prefsWindow); + + await subDialogPromise; + + let subDialogBrowser = prefsWindow.gSubDialog._topDialog._frame; + let subDialogDocument = subDialogBrowser.contentDocument; + subDialogDocument.getElementById("categoryName").value = "ZZZ Mochitest"; + subDialogDocument.getElementById("categoryColor").value = "#00CC00"; + subDialogDocument.body.firstElementChild.getButton("accept").click(); + + let listItem = listBox.itemChildren[listBox.itemCount - 1]; + Assert.equal(listBox.selectedItem, listItem); + Assert.equal(listItem.firstElementChild.value, "ZZZ Mochitest"); + Assert.equal(listItem.lastElementChild.style.backgroundColor, "rgb(0, 204, 0)"); + Assert.equal(Services.prefs.getCharPref("calendar.category.color.zzz_mochitest"), "#00cc00"); + + // Remove the colour of a built-in category. + + subDialogPromise = BrowserTestUtils.waitForEvent( + prefsWindow.gSubDialog._dialogStack, + "dialogopen" + ); + + EventUtils.synthesizeMouse(listBox, 5, 5, {}, prefsWindow); + EventUtils.synthesizeKey("VK_HOME", {}, prefsWindow); + Assert.equal(listBox.selectedIndex, 0); + let itemName = listBox.itemChildren[0].firstElementChild.value; + EventUtils.synthesizeMouseAtCenter(prefsDocument.getElementById("editCButton"), {}, prefsWindow); + + await subDialogPromise; + + subDialogBrowser = prefsWindow.gSubDialog._topDialog._frame; + await new Promise(subDialogBrowser.contentWindow.setTimeout); + subDialogDocument = subDialogBrowser.contentDocument; + subDialogDocument.getElementById("useColor").checked = false; + subDialogDocument.body.firstElementChild.getButton("accept").click(); + + listItem = listBox.itemChildren[0]; + Assert.equal(listBox.selectedItem, listItem); + Assert.equal(listItem.firstElementChild.value, itemName); + Assert.equal(listItem.lastElementChild.style.backgroundColor, ""); + Assert.equal(Services.prefs.getCharPref(`calendar.category.color.${itemName.toLowerCase()}`), ""); + + // Remove the added category. + + EventUtils.synthesizeMouse(listBox, 5, 5, {}, prefsWindow); + EventUtils.synthesizeKey("VK_END", {}, prefsWindow); + Assert.equal(listBox.selectedIndex, listBox.itemCount - 1); + EventUtils.synthesizeMouseAtCenter( + prefsDocument.getElementById("deleteCButton"), + {}, + prefsWindow + ); +}); diff --git a/comm/calendar/test/browser/preferences/head.js b/comm/calendar/test/browser/preferences/head.js new file mode 100644 index 0000000000..8d6d5d3ab5 --- /dev/null +++ b/comm/calendar/test/browser/preferences/head.js @@ -0,0 +1,64 @@ +/* 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/. */ + +/* globals openPreferencesTab */ + +async function openNewPrefsTab(paneID, scrollPaneTo, otherArgs) { + let tabmail = document.getElementById("tabmail"); + let prefsTabMode = tabmail.tabModes.preferencesTab; + + Assert.equal(prefsTabMode.tabs.length, 0, "Prefs tab is not open"); + + let prefsDocument = await new Promise(resolve => { + Services.obs.addObserver(function documentLoaded(subject) { + if (subject.URL.startsWith("about:preferences")) { + Services.obs.removeObserver(documentLoaded, "chrome-document-loaded"); + resolve(subject); + } + }, "chrome-document-loaded"); + openPreferencesTab(paneID, scrollPaneTo, otherArgs); + }); + Assert.ok(prefsDocument.URL.startsWith("about:preferences"), "Prefs tab is open"); + + prefsDocument = prefsTabMode.tabs[0].browser.contentDocument; + let prefsWindow = prefsDocument.ownerGlobal; + prefsWindow.resizeTo(screen.availWidth, screen.availHeight); + if (paneID) { + await new Promise(resolve => prefsWindow.setTimeout(resolve)); + Assert.equal(prefsWindow.gLastCategory.category, paneID, `Selected pane is ${paneID}`); + } else { + // If we don't wait here for other scripts to run, they + // could be in a bad state if our test closes the tab. + await new Promise(resolve => prefsWindow.setTimeout(resolve)); + } + + registerCleanupOnce(); + + await new Promise(resolve => prefsWindow.setTimeout(resolve)); + if (scrollPaneTo) { + Assert.greater( + prefsDocument.getElementById("preferencesContainer").scrollTop, + 0, + "Prefs page did scroll when it was supposed to" + ); + } + return { prefsDocument, prefsWindow }; +} + +function registerCleanupOnce() { + if (registerCleanupOnce.alreadyRegistered) { + return; + } + registerCleanupFunction(closePrefsTab); + registerCleanupOnce.alreadyRegistered = true; +} + +async function closePrefsTab() { + info("Closing prefs tab"); + let tabmail = document.getElementById("tabmail"); + let prefsTab = tabmail.tabModes.preferencesTab.tabs[0]; + if (prefsTab) { + tabmail.closeTab(prefsTab); + } +} |