Bug 1191597 part 2 - Convert fullscreen-esc-context-menu to a browser chrome test. draft
authorXidorn Quan <quanxunzhen@gmail.com>
Fri, 09 Oct 2015 18:31:21 +1100
changeset 319973 5c5196bdd8252d52c0504dc1fdbb178e92d50dd0
parent 319972 0a80a333d95374f6064846739d0d7b71d0c8e980
child 319974 30ede73c4b964754c93e2e4323fd9d05b01121c9
push id9116
push userxquan@mozilla.com
push dateFri, 08 Jan 2016 09:53:58 +0000
bugs1191597
milestone46.0a1
Bug 1191597 part 2 - Convert fullscreen-esc-context-menu to a browser chrome test.
dom/html/test/browser.ini
dom/html/test/browser_fullscreen-contextmenu-esc.js
dom/html/test/file_fullscreen-esc-context-menu.html
dom/html/test/mochitest.ini
dom/html/test/test_fullscreen-api.html
--- a/dom/html/test/browser.ini
+++ b/dom/html/test/browser.ini
@@ -11,8 +11,9 @@ support-files =
 skip-if = e10s # Bug ?????? - leaked until shutdown [nsGlobalWindow #16 about:blank]
 [browser_bug1081537.js]
 [browser_bug1108547.js]
 support-files =
   file_bug1108547-1.html
   file_bug1108547-2.html
   file_bug1108547-3.html
 [browser_DOMDocElementInserted.js]
+[browser_fullscreen-contextmenu-esc.js]
new file mode 100644
--- /dev/null
+++ b/dom/html/test/browser_fullscreen-contextmenu-esc.js
@@ -0,0 +1,105 @@
+"use strict";
+
+function frameScript() {
+  addMessageListener("Test:RequestFullscreen", () => {
+    content.document.body.mozRequestFullScreen();
+  });
+  content.document.addEventListener("mozfullscreenchange", () => {
+    sendAsyncMessage("Test:FullscreenChanged", content.document.mozFullScreen);
+  });
+  addMessageListener("Test:QueryFullscreenState", () => {
+    sendAsyncMessage("Test:FullscreenState", content.document.mozFullScreen);
+  });
+  function waitUntilActive() {
+    let doc = content.document;
+    if (doc.docShell.isActive && doc.hasFocus()) {
+      sendAsyncMessage("Test:Activated");
+    } else {
+      setTimeout(waitUntilActive, 10);
+    }
+  }
+  waitUntilActive();
+}
+
+var gMessageManager;
+
+function listenOneMessage(aMsg, aListener) {
+  function listener({ data }) {
+    gMessageManager.removeMessageListener(aMsg, listener);
+    aListener(data);
+  }
+  gMessageManager.addMessageListener(aMsg, listener);
+}
+
+function promiseOneMessage(aMsg) {
+  return new Promise(resolve => listenOneMessage(aMsg, resolve));
+}
+
+function captureUnexpectedFullscreenChange() {
+  ok(false, "Caught an unexpected fullscreen change");
+}
+
+const kPage = "http://example.org/browser/dom/html/test/dummy_page.html";
+
+add_task(function* () {
+  yield pushPrefs(
+    ["full-screen-api.transition-duration.enter", "0 0"],
+    ["full-screen-api.transition-duration.leave", "0 0"]);
+
+  let tab = gBrowser.addTab(kPage);
+  registerCleanupFunction(() => gBrowser.removeTab(tab));
+  let browser = tab.linkedBrowser;
+  gBrowser.selectedTab = tab;
+  yield waitForDocLoadComplete();
+
+  gMessageManager = browser.messageManager;
+  gMessageManager.loadFrameScript(
+    "data:,(" + frameScript.toString() + ")();", false);
+
+  // Wait for the document being activated, so that
+  // fullscreen request won't be denied.
+  yield promiseOneMessage("Test:Activated");
+
+  let contextMenu = document.getElementById("contentAreaContextMenu");
+  ok(contextMenu, "Got context menu");
+
+  let state;
+  info("Enter DOM fullscreen");
+  gMessageManager.sendAsyncMessage("Test:RequestFullscreen");
+  state = yield promiseOneMessage("Test:FullscreenChanged");
+  ok(state, "The content should have entered fullscreen");
+  ok(document.mozFullScreen, "The chrome should also be in fullscreen");
+  gMessageManager.addMessageListener(
+    "Test:FullscreenChanged", captureUnexpectedFullscreenChange);
+
+  info("Open context menu");
+  is(contextMenu.state, "closed", "Should not have opened context menu");
+  let popupShownPromise = promiseWaitForEvent(window, "popupshown");
+  EventUtils.synthesizeMouse(browser, screen.width / 2, screen.height / 2,
+                             {type: "contextmenu", button: 2}, window);
+  yield popupShownPromise;
+  is(contextMenu.state, "open", "Should have opened context menu");
+
+  info("Send the first escape");
+  let popupHidePromise = promiseWaitForEvent(window, "popuphidden");
+  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  yield popupHidePromise;
+  is(contextMenu.state, "closed", "Should have closed context menu");
+
+  // Wait a small time to confirm that the first ESC key
+  // does not exit fullscreen.
+  yield new Promise(resolve => setTimeout(resolve, 1000));
+  gMessageManager.sendAsyncMessage("Test:QueryFullscreenState");
+  state = yield promiseOneMessage("Test:FullscreenState");
+  ok(state, "The content should still be in fullscreen");
+  ok(document.mozFullScreen, "The chrome should still be in fullscreen");
+
+  info("Send the second escape");
+  gMessageManager.removeMessageListener(
+    "Test:FullscreenChanged", captureUnexpectedFullscreenChange);
+  let fullscreenExitPromise = promiseOneMessage("Test:FullscreenChanged");
+  EventUtils.synthesizeKey("VK_ESCAPE", {});
+  state = yield fullscreenExitPromise;
+  ok(!state, "The content should have exited fullscreen");
+  ok(!document.mozFullScreen, "The chrome should have exited fullscreen");
+});
deleted file mode 100644
--- a/dom/html/test/file_fullscreen-esc-context-menu.html
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<!--
-https://bugzilla.mozilla.org/show_bug.cgi?id=910532
-
-Verify that an ESC key press canceling the context menu
-won't exit DOM fullscreen.
--->
-<head>
-  <meta charset="UTF-8">
-  <title>Text for bug 910532</title>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
-  <script type="application/javascript" src="file_fullscreen-utils.js"></script>
-  <style>
-    body:-moz-full-screen {
-      background-color: red;
-    }
-  </style>
-</head>
-<body>
-<script type="application/javascript">
-
-const Ci = SpecialPowers.Ci;
-
-SimpleTest.requestFlakyTimeout("We need to wait a small time to confirm " +
-  "that the first ESC key does not exit fullscreen.");
-
-function ok(condition, msg) {
-  opener.ok(condition, "[esc-context-menu] " + msg);
-}
-
-function is(a, b, msg) {
-  opener.is(a, b, "[esc-context-menu] " + msg);
-}
-
-var contextMenu;
-var escapeSent = 0;
-
-function sendEscape() {
-  escapeSent++;
-  synthesizeKey("VK_ESCAPE", {});
-}
-
-function begin() {
-  // Copy from browser/base/content/test/general/test_contextmenu.html
-  var chromeWin = SpecialPowers.wrap(window)
-                    .QueryInterface(Ci.nsIInterfaceRequestor)
-                    .getInterface(Ci.nsIWebNavigation)
-                    .QueryInterface(Ci.nsIDocShellTreeItem)
-                    .rootTreeItem
-                    .QueryInterface(Ci.nsIInterfaceRequestor)
-                    .getInterface(Ci.nsIDOMWindow)
-                    .QueryInterface(Ci.nsIDOMChromeWindow);
-  contextMenu = chromeWin.document.getElementById("contentAreaContextMenu");
-  ok(contextMenu, "Got context menu XUL");
-
-  addFullscreenChangeContinuation("enter", fullscreenEntered);
-  document.body.mozRequestFullScreen();
-}
-
-function finish() {
-  opener.nextTest();
-}
-
-function fullscreenEntered(event) {
-  ok(document.mozFullScreen, "Should have entered fullscreen mode");
-  is(document.mozFullScreenElement, document.body, "FSE should be doc");
-  contextMenu.addEventListener("popupshown", contextMenuOpened, false);
-  is(contextMenu.state, "closed", "Should not have opened context menu");
-  synthesizeMouseAtCenter(document.body, {type: 'contextmenu', button: 2});
-}
-
-function contextMenuOpened(event) {
-  contextMenu.removeEventListener("popupshown", contextMenuOpened);
-  is(contextMenu.state, "open", "Should have opened context menu");
-  addFullscreenChangeContinuation("exit", fullscreenExited);
-  contextMenu.addEventListener("popuphidden", contextMenuClosed, false);
-  sendEscape();
-}
-
-function contextMenuClosed(event) {
-  is(contextMenu.state, "closed", "Should have closed context menu");
-  setTimeout(function () {
-    ok(document.mozFullScreen, "Should still be in fullscreen mode");
-    sendEscape();
-  }, 100);
-}
-
-function fullscreenExited(event) {
-  is(escapeSent, 2, "Only the second escape should exit fullscreen");
-  ok(!document.mozFullScreen, "Should have left fullscreen mode");
-  finish();
-}
-
-</script>
-</body>
-</html>
--- a/dom/html/test/mochitest.ini
+++ b/dom/html/test/mochitest.ini
@@ -45,17 +45,16 @@ support-files =
   file_bug417760.png
   file_bug893537.html
   file_formSubmission_img.jpg
   file_formSubmission_text.txt
   file_fullscreen-api-keys.html
   file_fullscreen-api.html
   file_fullscreen-denied-inner.html
   file_fullscreen-denied.html
-  file_fullscreen-esc-context-menu.html
   file_fullscreen-esc-exit-inner.html
   file_fullscreen-esc-exit.html
   file_fullscreen-hidden.html
   file_fullscreen-multiple-inner.html
   file_fullscreen-multiple.html
   file_fullscreen-navigation.html
   file_fullscreen-nested.html
   file_fullscreen-plugins.html
--- a/dom/html/test/test_fullscreen-api.html
+++ b/dom/html/test/test_fullscreen-api.html
@@ -25,17 +25,16 @@
 SimpleTest.requestFlakyTimeout("untriaged");
 
 // Run the tests which go full-screen in new windows, as mochitests normally
 // run in an iframe, which by default will not have the allowfullscreen
 // attribute set, so full-screen won't work.
 var gTestWindows = [
   "file_fullscreen-multiple.html",
   "file_fullscreen-rollback.html",
-  "file_fullscreen-esc-context-menu.html",
   "file_fullscreen-esc-exit.html",
   "file_fullscreen-denied.html",
   "file_fullscreen-api.html",
   "file_fullscreen-api-keys.html",
   "file_fullscreen-plugins.html",
   "file_fullscreen-hidden.html",
   "file_fullscreen-svg-element.html",
   "file_fullscreen-navigation.html",