forked from mirrors/gecko-dev
		
	 3fc16475e9
			
		
	
	
		3fc16475e9
		
	
	
	
	
		
			
			Differential Revision: https://phabricator.services.mozilla.com/D66693 --HG-- extra : moz-landing-system : lando
		
			
				
	
	
		
			248 lines
		
	
	
	
		
			8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
	
		
			8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* 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() {},
 | |
|     });
 | |
|   });
 | |
| });
 |