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 | 248 |
1 files changed, 248 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 0000000000..c1d82042c8 --- /dev/null +++ b/browser/base/content/test/popupNotifications/browser_popupNotification_checkbox.js @@ -0,0 +1,248 @@ +/* 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(); +} + +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 = notification.querySelector(".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 TestUtils.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() { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.options.checkbox = { + label: "This is a checkbox", + }; + gNotification = showNotification(this.notifyObj); + }, + onShown(popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.children[0]; + checkCheckbox(notification.checkbox, "This is a checkbox"); + triggerMainCommand(popup); + }, + onHidden() {}, + }, + + // Test checkbox being checked by default + { + id: "checkbox_checked", + run() { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.options.checkbox = { + label: "Check this", + checked: true, + }; + gNotification = showNotification(this.notifyObj); + }, + onShown(popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.children[0]; + checkCheckbox(notification.checkbox, "Check this", true); + triggerMainCommand(popup); + }, + onHidden() {}, + }, + + // Test checkbox passing the checkbox state on mainAction + { + id: "checkbox_passCheckboxChecked_mainAction", + run() { + 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); + }, + async onShown(popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.children[0]; + let checkbox = notification.checkbox; + checkCheckbox(checkbox, "This is a checkbox"); + await promiseElementVisible(checkbox); + EventUtils.synthesizeMouseAtCenter(checkbox, {}); + checkCheckbox(checkbox, "This is a checkbox", true); + triggerMainCommand(popup); + }, + onHidden() { + 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() { + 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); + }, + async onShown(popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.children[0]; + let checkbox = notification.checkbox; + checkCheckbox(checkbox, "This is a checkbox"); + await promiseElementVisible(checkbox); + EventUtils.synthesizeMouseAtCenter(checkbox, {}); + checkCheckbox(checkbox, "This is a checkbox", true); + triggerSecondaryCommand(popup, 0); + }, + onHidden() { + 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() { + 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); + }, + async onShown(popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.children[0]; + let checkbox = notification.checkbox; + checkCheckbox(checkbox, "This is a checkbox"); + await promiseElementVisible(checkbox); + EventUtils.synthesizeMouseAtCenter(checkbox, {}); + dismissNotification(popup); + }, + async onHidden(popup) { + let icon = document.getElementById("default-notification-icon"); + let shown = waitForNotificationPanel(); + EventUtils.synthesizeMouseAtCenter(icon, {}); + await shown; + let notification = popup.children[0]; + let checkbox = notification.checkbox; + checkCheckbox(checkbox, "This is a checkbox", true); + checkMainAction(notification, true); + gNotification.remove(); + }, + }, + + // Test no checkbox hides warning label + { + id: "no_checkbox", + run() { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.options.checkbox = null; + gNotification = showNotification(this.notifyObj); + }, + onShown(popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.children[0]; + checkCheckbox(notification.checkbox, "", false, true); + checkMainAction(notification); + triggerMainCommand(popup); + }, + onHidden() {}, + }, +]; + +// 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() { + this.notifyObj = new BasicNotification(this.id); + this.notifyObj.options.checkbox = { + label: "This is a checkbox", + checked, + [state]: { + disableMainAction: true, + warningLabel: "Testing disable", + }, + }; + gNotification = showNotification(this.notifyObj); + }, + async onShown(popup) { + checkPopup(popup, this.notifyObj); + let notification = popup.children[0]; + let checkbox = notification.checkbox; + let disabled = + (state === "checkedState" && checked) || + (state === "uncheckedState" && !checked); + + checkCheckbox(checkbox, "This is a checkbox", checked); + checkMainAction(notification, disabled); + await 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() {}, + }); + }); +}); |