Bug 1218351 - Fix fullscreen-api-keys test to work with new FAYT code. r?mikedeboer,xidorn
--- 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");
}
});