diff options
Diffstat (limited to 'browser/base/content/test/popupNotifications/browser_popupNotification_checkbox.js')
-rw-r--r-- | browser/base/content/test/popupNotifications/browser_popupNotification_checkbox.js | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/browser/base/content/test/popupNotifications/browser_popupNotification_checkbox.js b/browser/base/content/test/popupNotifications/browser_popupNotification_checkbox.js new file mode 100644 index 000000000..bcc51fcd7 --- /dev/null +++ b/browser/base/content/test/popupNotifications/browser_popupNotification_checkbox.js @@ -0,0 +1,211 @@ +/* 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/. */ + +function test() { + waitForExplicitFinish(); + + ok(PopupNotifications, "PopupNotifications object exists"); + ok(PopupNotifications.panel, "PopupNotifications panel exists"); + + setup(); + goNext(); +} + +function checkCheckbox(checkbox, label, checked=false, hidden=false) { + is(checkbox.label, label, "Checkbox should have the correct label"); + is(checkbox.hidden, hidden, "Checkbox should be shown"); + is(checkbox.checked, checked, "Checkbox should be checked by default"); +} + +function checkMainAction(notification, disabled=false) { + let mainAction = notification.button; + let warningLabel = document.getAnonymousElementByAttribute(notification, "class", "popup-notification-warning"); + is(warningLabel.hidden, !disabled, "Warning label should be shown"); + is(mainAction.disabled, disabled, "MainAction should be disabled"); +} + +function promiseElementVisible(element) { + // HTMLElement.offsetParent is null when the element is not visisble + // (or if the element has |position: fixed|). See: + // https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/offsetParent + return BrowserTestUtils.waitForCondition(() => element.offsetParent !== null, + "Waiting for element to be visible"); +} + +var gNotification; + +var tests = [ + // Test that passing the checkbox field shows the checkbox. + { id: "show_checkbox", + run: function () { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.options.checkbox = { + label: "This is a checkbox", + }; + gNotification = showNotification(this.notifyObj); + }, + onShown: function (popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.childNodes[0]; + checkCheckbox(notification.checkbox, "This is a checkbox"); + triggerMainCommand(popup); + }, + onHidden: function () { } + }, + + // Test checkbox being checked by default + { id: "checkbox_checked", + run: function () { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.options.checkbox = { + label: "Check this", + checked: true, + }; + gNotification = showNotification(this.notifyObj); + }, + onShown: function (popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.childNodes[0]; + checkCheckbox(notification.checkbox, "Check this", true); + triggerMainCommand(popup); + }, + onHidden: function () { } + }, + + // Test checkbox passing the checkbox state on mainAction + { id: "checkbox_passCheckboxChecked_mainAction", + run: function () { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.mainAction.callback = ({checkboxChecked}) => this.mainActionChecked = checkboxChecked; + this.notifyObj.options.checkbox = { + label: "This is a checkbox", + }; + gNotification = showNotification(this.notifyObj); + }, + onShown: function* (popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.childNodes[0]; + let checkbox = notification.checkbox; + checkCheckbox(checkbox, "This is a checkbox"); + yield promiseElementVisible(checkbox); + EventUtils.synthesizeMouseAtCenter(checkbox, {}); + checkCheckbox(checkbox, "This is a checkbox", true); + triggerMainCommand(popup); + }, + onHidden: function () { + is(this.mainActionChecked, true, "mainAction callback is passed the correct checkbox value"); + } + }, + + // Test checkbox passing the checkbox state on secondaryAction + { id: "checkbox_passCheckboxChecked_secondaryAction", + run: function () { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.secondaryActions = [{ + label: "Test Secondary", + accessKey: "T", + callback: ({checkboxChecked}) => this.secondaryActionChecked = checkboxChecked, + }]; + this.notifyObj.options.checkbox = { + label: "This is a checkbox", + }; + gNotification = showNotification(this.notifyObj); + }, + onShown: function* (popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.childNodes[0]; + let checkbox = notification.checkbox; + checkCheckbox(checkbox, "This is a checkbox"); + yield promiseElementVisible(checkbox); + EventUtils.synthesizeMouseAtCenter(checkbox, {}); + checkCheckbox(checkbox, "This is a checkbox", true); + triggerSecondaryCommand(popup, 0); + }, + onHidden: function () { + is(this.secondaryActionChecked, true, "secondaryAction callback is passed the correct checkbox value"); + } + }, + + // Test checkbox preserving its state through re-opening the doorhanger + { id: "checkbox_reopen", + run: function () { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.options.checkbox = { + label: "This is a checkbox", + checkedState: { + disableMainAction: true, + warningLabel: "Testing disable", + }, + }; + gNotification = showNotification(this.notifyObj); + }, + onShown: function* (popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.childNodes[0]; + let checkbox = notification.checkbox; + checkCheckbox(checkbox, "This is a checkbox"); + yield promiseElementVisible(checkbox); + EventUtils.synthesizeMouseAtCenter(checkbox, {}); + dismissNotification(popup); + }, + onHidden: function* (popup) { + let icon = document.getElementById("default-notification-icon"); + let shown = waitForNotificationPanel(); + EventUtils.synthesizeMouseAtCenter(icon, {}); + yield shown; + let notification = popup.childNodes[0]; + let checkbox = notification.checkbox; + checkCheckbox(checkbox, "This is a checkbox", true); + checkMainAction(notification, true); + gNotification.remove(); + } + }, +]; + +// Test checkbox disabling the main action in different combinations +["checkedState", "uncheckedState"].forEach(function (state) { + [true, false].forEach(function (checked) { + tests.push( + { id: `checkbox_disableMainAction_${state}_${checked ? 'checked' : 'unchecked'}`, + run: function () { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.options.checkbox = { + label: "This is a checkbox", + checked: checked, + [state]: { + disableMainAction: true, + warningLabel: "Testing disable", + }, + }; + gNotification = showNotification(this.notifyObj); + }, + onShown: function* (popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.childNodes[0]; + let checkbox = notification.checkbox; + let disabled = (state === "checkedState" && checked) || + (state === "uncheckedState" && !checked); + + checkCheckbox(checkbox, "This is a checkbox", checked); + checkMainAction(notification, disabled); + yield promiseElementVisible(checkbox); + EventUtils.synthesizeMouseAtCenter(checkbox, {}); + checkCheckbox(checkbox, "This is a checkbox", !checked); + checkMainAction(notification, !disabled); + EventUtils.synthesizeMouseAtCenter(checkbox, {}); + checkCheckbox(checkbox, "This is a checkbox", checked); + checkMainAction(notification, disabled); + + // Unblock the main command if it's currently disabled. + if (disabled) { + EventUtils.synthesizeMouseAtCenter(checkbox, {}); + } + triggerMainCommand(popup); + }, + onHidden: function () { } + } + ); + }); +}); + |