forked from mirrors/gecko-dev
		
	This is generally pretty straightforward, and rewrites nearly all calls. It skips the ones that it can detect using frame script globals like `sendAsyncMessage`, though. Differential Revision: https://phabricator.services.mozilla.com/D53740 --HG-- extra : moz-landing-system : lando
		
			
				
	
	
		
			145 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
"use strict";
 | 
						|
 | 
						|
// This test tends to trigger a race in the fullscreen time telemetry,
 | 
						|
// where the fullscreen enter and fullscreen exit events (which use the
 | 
						|
// same histogram ID) overlap. That causes TelemetryStopwatch to log an
 | 
						|
// error.
 | 
						|
SimpleTest.ignoreAllUncaughtExceptions(true);
 | 
						|
 | 
						|
const { AppMenuNotifications } = ChromeUtils.import(
 | 
						|
  "resource://gre/modules/AppMenuNotifications.jsm"
 | 
						|
);
 | 
						|
 | 
						|
function waitForDocshellActivated() {
 | 
						|
  return SpecialPowers.spawn(gBrowser.selectedBrowser, [], async function() {
 | 
						|
    // Setting docshell activated/deactivated will trigger visibility state
 | 
						|
    // changes to relevant state ("visible" or "hidden"). AFAIK, there is no
 | 
						|
    // such event notifying docshell is being activated, so I use
 | 
						|
    // "visibilitychange" event rather than polling the docShell.isActive.
 | 
						|
    await ContentTaskUtils.waitForEvent(
 | 
						|
      content.document,
 | 
						|
      "visibilitychange",
 | 
						|
      true /* capture */,
 | 
						|
      aEvent => {
 | 
						|
        return content.docShell.isActive;
 | 
						|
      }
 | 
						|
    );
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
function waitForFullscreen() {
 | 
						|
  return Promise.all([
 | 
						|
    BrowserTestUtils.waitForEvent(window, "fullscreen"),
 | 
						|
    // In the platforms that support reporting occlusion state (e.g. Mac),
 | 
						|
    // enter/exit fullscreen mode will trigger docshell being set to non-activate
 | 
						|
    // and then set to activate back again. For those platforms, we should wait
 | 
						|
    // until the docshell has been activated again before starting next test,
 | 
						|
    // otherwise, the fullscreen request might be denied.
 | 
						|
    Services.appinfo.OS === "Darwin"
 | 
						|
      ? waitForDocshellActivated()
 | 
						|
      : Promise.resolve(),
 | 
						|
  ]);
 | 
						|
}
 | 
						|
 | 
						|
add_task(async function testFullscreen() {
 | 
						|
  if (Services.appinfo.OS !== "Darwin") {
 | 
						|
    await SpecialPowers.pushPrefEnv({
 | 
						|
      set: [["browser.fullscreen.autohide", false]],
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  is(
 | 
						|
    PanelUI.notificationPanel.state,
 | 
						|
    "closed",
 | 
						|
    "update-manual doorhanger is closed."
 | 
						|
  );
 | 
						|
  let mainActionCalled = false;
 | 
						|
  let mainAction = {
 | 
						|
    callback: () => {
 | 
						|
      mainActionCalled = true;
 | 
						|
    },
 | 
						|
  };
 | 
						|
  AppMenuNotifications.showNotification("update-manual", mainAction);
 | 
						|
  await BrowserTestUtils.waitForEvent(PanelUI.notificationPanel, "popupshown");
 | 
						|
 | 
						|
  isnot(
 | 
						|
    PanelUI.notificationPanel.state,
 | 
						|
    "closed",
 | 
						|
    "update-manual doorhanger is showing."
 | 
						|
  );
 | 
						|
  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 fullscreenPromise = waitForFullscreen();
 | 
						|
  EventUtils.synthesizeKey("KEY_F11");
 | 
						|
  await fullscreenPromise;
 | 
						|
  isnot(
 | 
						|
    PanelUI.notificationPanel.state,
 | 
						|
    "closed",
 | 
						|
    "update-manual doorhanger is still showing after entering fullscreen."
 | 
						|
  );
 | 
						|
 | 
						|
  let popuphiddenPromise = BrowserTestUtils.waitForEvent(
 | 
						|
    PanelUI.notificationPanel,
 | 
						|
    "popuphidden"
 | 
						|
  );
 | 
						|
  await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => {
 | 
						|
    content.document.documentElement.requestFullscreen();
 | 
						|
  });
 | 
						|
  await popuphiddenPromise;
 | 
						|
  await new Promise(executeSoon);
 | 
						|
  is(
 | 
						|
    PanelUI.notificationPanel.state,
 | 
						|
    "closed",
 | 
						|
    "update-manual doorhanger is hidden after entering DOM fullscreen."
 | 
						|
  );
 | 
						|
 | 
						|
  let popupshownPromise = BrowserTestUtils.waitForEvent(
 | 
						|
    PanelUI.notificationPanel,
 | 
						|
    "popupshown"
 | 
						|
  );
 | 
						|
  await SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => {
 | 
						|
    content.document.exitFullscreen();
 | 
						|
  });
 | 
						|
  await popupshownPromise;
 | 
						|
  await new Promise(executeSoon);
 | 
						|
  isnot(
 | 
						|
    PanelUI.notificationPanel.state,
 | 
						|
    "closed",
 | 
						|
    "update-manual doorhanger is shown after exiting DOM fullscreen."
 | 
						|
  );
 | 
						|
  isnot(
 | 
						|
    PanelUI.menuButton.getAttribute("badge-status"),
 | 
						|
    "update-manual",
 | 
						|
    "Badge is not displaying on PanelUI button."
 | 
						|
  );
 | 
						|
 | 
						|
  doorhanger.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"
 | 
						|
  );
 | 
						|
 | 
						|
  fullscreenPromise = BrowserTestUtils.waitForEvent(window, "fullscreen");
 | 
						|
  EventUtils.synthesizeKey("KEY_F11");
 | 
						|
  await fullscreenPromise;
 | 
						|
});
 |