forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			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() {},
 | 
						|
    });
 | 
						|
  });
 | 
						|
});
 |