mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 10:18:41 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			214 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			214 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
const { AppMenuNotifications } = ChromeUtils.importESModule(
 | 
						|
  "resource://gre/modules/AppMenuNotifications.sys.mjs"
 | 
						|
);
 | 
						|
 | 
						|
/**
 | 
						|
 * Tests that when we try to show a notification in a background window, it
 | 
						|
 * does not display until the window comes back into the foreground. However,
 | 
						|
 * it should display a badge.
 | 
						|
 */
 | 
						|
add_task(async function testDoesNotShowDoorhangerForBackgroundWindow() {
 | 
						|
  let options = {
 | 
						|
    gBrowser: window.gBrowser,
 | 
						|
    url: "about:blank",
 | 
						|
  };
 | 
						|
 | 
						|
  await BrowserTestUtils.withNewTab(options, async function () {
 | 
						|
    let win = await BrowserTestUtils.openNewBrowserWindow();
 | 
						|
    await SimpleTest.promiseFocus(win);
 | 
						|
    let mainActionCalled = false;
 | 
						|
    let mainAction = {
 | 
						|
      callback: () => {
 | 
						|
        mainActionCalled = true;
 | 
						|
      },
 | 
						|
    };
 | 
						|
    AppMenuNotifications.showNotification("update-manual", mainAction);
 | 
						|
    is(
 | 
						|
      PanelUI.notificationPanel.state,
 | 
						|
      "closed",
 | 
						|
      "The background window's doorhanger is closed."
 | 
						|
    );
 | 
						|
    is(
 | 
						|
      PanelUI.menuButton.hasAttribute("badge-status"),
 | 
						|
      true,
 | 
						|
      "The background window has a badge."
 | 
						|
    );
 | 
						|
 | 
						|
    let popupShown = BrowserTestUtils.waitForEvent(
 | 
						|
      PanelUI.notificationPanel,
 | 
						|
      "popupshown"
 | 
						|
    );
 | 
						|
 | 
						|
    await BrowserTestUtils.closeWindow(win);
 | 
						|
    await SimpleTest.promiseFocus(window);
 | 
						|
    await popupShown;
 | 
						|
 | 
						|
    let notifications = [...PanelUI.notificationPanel.children].filter(
 | 
						|
      n => !n.hidden
 | 
						|
    );
 | 
						|
    is(
 | 
						|
      notifications.length,
 | 
						|
      1,
 | 
						|
      "PanelUI doorhanger is only displaying one notification."
 | 
						|
    );
 | 
						|
    let doorhanger = notifications[0];
 | 
						|
    is(
 | 
						|
      doorhanger.id,
 | 
						|
      "appMenu-update-manual-notification",
 | 
						|
      "PanelUI is displaying the update-manual notification."
 | 
						|
    );
 | 
						|
 | 
						|
    let button = doorhanger.button;
 | 
						|
 | 
						|
    Assert.equal(
 | 
						|
      PanelUI.notificationPanel.state,
 | 
						|
      "open",
 | 
						|
      "Expect panel state to be open when clicking panel buttons"
 | 
						|
    );
 | 
						|
    button.click();
 | 
						|
 | 
						|
    ok(mainActionCalled, "Main action callback was called");
 | 
						|
    is(
 | 
						|
      PanelUI.notificationPanel.state,
 | 
						|
      "closed",
 | 
						|
      "update-manual doorhanger is closed."
 | 
						|
    );
 | 
						|
    is(
 | 
						|
      PanelUI.menuButton.hasAttribute("badge-status"),
 | 
						|
      false,
 | 
						|
      "Should not have a badge status"
 | 
						|
    );
 | 
						|
  });
 | 
						|
});
 | 
						|
 | 
						|
/**
 | 
						|
 * Tests that when we try to show a notification in a background window and in
 | 
						|
 * a foreground window, if the foreground window's main action is called, the
 | 
						|
 * background window's doorhanger will be removed.
 | 
						|
 */
 | 
						|
add_task(
 | 
						|
  async function testBackgroundWindowNotificationsAreRemovedByForeground() {
 | 
						|
    let options = {
 | 
						|
      gBrowser: window.gBrowser,
 | 
						|
      url: "about:blank",
 | 
						|
    };
 | 
						|
 | 
						|
    await BrowserTestUtils.withNewTab(options, async function () {
 | 
						|
      let win = await BrowserTestUtils.openNewBrowserWindow();
 | 
						|
      await SimpleTest.promiseFocus(win);
 | 
						|
      AppMenuNotifications.showNotification("update-manual", { callback() {} });
 | 
						|
      let notifications = [...win.PanelUI.notificationPanel.children].filter(
 | 
						|
        n => !n.hidden
 | 
						|
      );
 | 
						|
      is(
 | 
						|
        notifications.length,
 | 
						|
        1,
 | 
						|
        "PanelUI doorhanger is only displaying one notification."
 | 
						|
      );
 | 
						|
      let doorhanger = notifications[0];
 | 
						|
      doorhanger.button.click();
 | 
						|
 | 
						|
      await BrowserTestUtils.closeWindow(win);
 | 
						|
      await SimpleTest.promiseFocus(window);
 | 
						|
 | 
						|
      is(
 | 
						|
        PanelUI.notificationPanel.state,
 | 
						|
        "closed",
 | 
						|
        "update-manual doorhanger is closed."
 | 
						|
      );
 | 
						|
      is(
 | 
						|
        PanelUI.menuButton.hasAttribute("badge-status"),
 | 
						|
        false,
 | 
						|
        "Should not have a badge status"
 | 
						|
      );
 | 
						|
    });
 | 
						|
  }
 | 
						|
);
 | 
						|
 | 
						|
/**
 | 
						|
 * Tests that when we try to show a notification in a background window and in
 | 
						|
 * a foreground window, if the foreground window's doorhanger is dismissed,
 | 
						|
 * the background window's doorhanger will also be dismissed once the window
 | 
						|
 * regains focus.
 | 
						|
 */
 | 
						|
add_task(
 | 
						|
  async function testBackgroundWindowNotificationsAreDismissedByForeground() {
 | 
						|
    let options = {
 | 
						|
      gBrowser: window.gBrowser,
 | 
						|
      url: "about:blank",
 | 
						|
    };
 | 
						|
 | 
						|
    await BrowserTestUtils.withNewTab(options, async function () {
 | 
						|
      let win = await BrowserTestUtils.openNewBrowserWindow();
 | 
						|
      await SimpleTest.promiseFocus(win);
 | 
						|
      AppMenuNotifications.showNotification("update-manual", { callback() {} });
 | 
						|
      let notifications = [...win.PanelUI.notificationPanel.children].filter(
 | 
						|
        n => !n.hidden
 | 
						|
      );
 | 
						|
      is(
 | 
						|
        notifications.length,
 | 
						|
        1,
 | 
						|
        "PanelUI doorhanger is only displaying one notification."
 | 
						|
      );
 | 
						|
      let doorhanger = notifications[0];
 | 
						|
      let button = doorhanger.secondaryButton;
 | 
						|
      button.click();
 | 
						|
 | 
						|
      await BrowserTestUtils.closeWindow(win);
 | 
						|
      await SimpleTest.promiseFocus(window);
 | 
						|
 | 
						|
      is(
 | 
						|
        PanelUI.notificationPanel.state,
 | 
						|
        "closed",
 | 
						|
        "The background window's doorhanger is closed."
 | 
						|
      );
 | 
						|
      is(
 | 
						|
        PanelUI.menuButton.hasAttribute("badge-status"),
 | 
						|
        true,
 | 
						|
        "The dismissed notification should still have a badge status"
 | 
						|
      );
 | 
						|
 | 
						|
      AppMenuNotifications.removeNotification(/.*/);
 | 
						|
    });
 | 
						|
  }
 | 
						|
);
 | 
						|
 | 
						|
/**
 | 
						|
 * Tests that when we open a new window while a notification is showing, the
 | 
						|
 * notification also shows on the new window.
 | 
						|
 */
 | 
						|
add_task(async function testOpenWindowAfterShowingNotification() {
 | 
						|
  AppMenuNotifications.showNotification("update-manual", { callback() {} });
 | 
						|
 | 
						|
  let win = await BrowserTestUtils.openNewBrowserWindow();
 | 
						|
  await SimpleTest.promiseFocus(win);
 | 
						|
  let notifications = [...win.PanelUI.notificationPanel.children].filter(
 | 
						|
    n => !n.hidden
 | 
						|
  );
 | 
						|
  is(
 | 
						|
    notifications.length,
 | 
						|
    1,
 | 
						|
    "PanelUI doorhanger is only displaying one notification."
 | 
						|
  );
 | 
						|
  let doorhanger = notifications[0];
 | 
						|
  let button = doorhanger.secondaryButton;
 | 
						|
  button.click();
 | 
						|
 | 
						|
  await BrowserTestUtils.closeWindow(win);
 | 
						|
  await SimpleTest.promiseFocus(window);
 | 
						|
 | 
						|
  is(
 | 
						|
    PanelUI.notificationPanel.state,
 | 
						|
    "closed",
 | 
						|
    "The background window's doorhanger is closed."
 | 
						|
  );
 | 
						|
  is(
 | 
						|
    PanelUI.menuButton.hasAttribute("badge-status"),
 | 
						|
    true,
 | 
						|
    "The dismissed notification should still have a badge status"
 | 
						|
  );
 | 
						|
 | 
						|
  AppMenuNotifications.removeNotification(/.*/);
 | 
						|
});
 |