Bug 1218351 - Fix fullscreen-api-keys test to work with new FAYT code. r?mikedeboer,xidorn draft
authorLuis Miguel [:quicksaver] <quicksaver@gmail.com>
Thu, 14 Jan 2016 16:51:45 +0000
changeset 321737 8091809f746e99072d8efff981126c553c8595bb
parent 321733 75a5055f0d0c522b1ad873b23238ce6e3e48f62d
child 512962 03a6798f96a787c0488f17b4d2f091a148d25064
push id9450
push userquicksaver@gmail.com
push dateThu, 14 Jan 2016 16:58:22 +0000
reviewersmikedeboer, xidorn
bugs1218351
milestone46.0a1
Bug 1218351 - Fix fullscreen-api-keys test to work with new FAYT code. r?mikedeboer,xidorn
dom/html/test/browser_fullscreen-api-keys.js
--- a/dom/html/test/browser_fullscreen-api-keys.js
+++ b/dom/html/test/browser_fullscreen-api-keys.js
@@ -40,16 +40,18 @@ function frameScript() {
     } else {
       setTimeout(waitUntilActive, 10);
     }
   }
   waitUntilActive();
 }
 
 var gMessageManager;
+var gBufferKeyCode = null;
+var gBufferedEvents = new Set();
 
 function listenOneMessage(aMsg, aListener) {
   function listener({ data }) {
     gMessageManager.removeMessageListener(aMsg, listener);
     aListener(data);
   }
   gMessageManager.addMessageListener(aMsg, listener);
 }
@@ -65,34 +67,49 @@ function captureUnexpectedFullscreenChan
 function* temporaryRemoveUnexpectedFullscreenChangeCapture(callback) {
   gMessageManager.removeMessageListener(
     "Test:FullscreenChanged", captureUnexpectedFullscreenChange);
   yield* callback();
   gMessageManager.addMessageListener(
     "Test:FullscreenChanged", captureUnexpectedFullscreenChange);
 }
 
-function captureUnexpectedKeyEvent(type) {
-  ok(false, `Caught an unexpected ${type} event`);
+function captureUnexpectedKeyEvent({ data }) {
+  // Bug 1218351 - sending a syncMessage from content during a keypress system
+  // event listener causes the keydown and keypress events to be sent *before*
+  // our receiveExpectedKeyEvents is run.
+  if (gBufferKeyCode === data.keyCode) {
+    gBufferedEvents.add(data);
+    return;
+  }
+  ok(false, `Caught an unexpected ${data.type} event`);
 }
 
 function* temporaryRemoveUnexpectedKeyEventCapture(callback) {
   gMessageManager.removeMessageListener(
     "Test:KeyReceived", captureUnexpectedKeyEvent);
   yield* callback();
   gMessageManager.addMessageListener(
     "Test:KeyReceived", captureUnexpectedKeyEvent);
 }
 
 function* receiveExpectedKeyEvents(keyCode) {
   info("Waiting for key events");
   let events = ["keydown", "keypress", "keyup"];
-  while (events.length > 0) {
+  events_loop: while (events.length > 0) {
+    let expected = events.shift();
+    for (let bufferedEvent of gBufferedEvents) {
+      if (bufferedEvent.keyCode == keyCode &&
+          bufferedEvent.type == expected) {
+        gBufferedEvents.delete(bufferedEvent);
+        ok(true, `Buffered a ${expected} event with key code ${keyCode}`);
+        continue events_loop;
+      }
+    }
     let evt = yield promiseOneMessage("Test:KeyReceived");
-    let expected = events.shift();
     is(evt.type, expected, `Should receive a ${expected} event`);
     is(evt.keyCode, keyCode,
        `Should receive the event with key code ${keyCode}`);
   }
 }
 
 const kPage = "http://example.org/browser/" +
               "dom/html/test/file_fullscreen-api-keys.html";
@@ -144,21 +161,24 @@ add_task(function* () {
     info("Dispatch untrusted key events from content");
     yield* temporaryRemoveUnexpectedKeyEventCapture(function* () {
       gMessageManager.sendAsyncMessage("Test:DispatchUntrustedKeyEvents", code);
       yield* receiveExpectedKeyEvents(keyCode);
     });
 
     info("Send trusted key events");
     yield* temporaryRemoveUnexpectedFullscreenChangeCapture(function* () {
-      yield* temporaryRemoveUnexpectedKeyEventCapture(function* () {
-        EventUtils.synthesizeKey(code, {});
-        if (!suppressed) {
-          yield* receiveExpectedKeyEvents(keyCode);
-        }
-        let state = yield promiseOneMessage("Test:FullscreenChanged");
-        ok(!state, "The content should have exited fullscreen");
-        ok(!document.mozFullScreenElement,
-           "The chrome should also have exited fullscreen");
-      });
+      gBufferKeyCode = keyCode;
+      EventUtils.synthesizeKey(code, {});
+      gBufferKeyCode = null;
+      if (!suppressed) {
+        yield* temporaryRemoveUnexpectedKeyEventCapture(function* () {
+          yield* receiveExpectedKeyEvents(keyCode, suppressed);
+        });
+      }
+      let state = yield promiseOneMessage("Test:FullscreenChanged");
+      ok(!state, "The content should have exited fullscreen");
+      ok(!document.mozFullScreenElement,
+         "The chrome should also have exited fullscreen");
     });
+    ok(!gBufferedEvents.size, "There should be no leftover buffered events");
   }
 });