diff -r 000000000000 -r 6474c204b198 dom/browser-element/mochitest/browserElement_KeyEvents.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dom/browser-element/mochitest/browserElement_KeyEvents.js Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,113 @@ +/* Any copyright is dedicated to the public domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Test that an iframe with the |mozbrowser| attribute does bubble some +// whitelisted key events. +"use strict"; + +let Ci = SpecialPowers.Ci; + +let whitelistedKeyCodes = [ + Ci.nsIDOMKeyEvent.DOM_VK_ESCAPE, // Back button. + Ci.nsIDOMKeyEvent.DOM_VK_SLEEP, // Power button + Ci.nsIDOMKeyEvent.DOM_VK_CONTEXT_MENU, + Ci.nsIDOMKeyEvent.DOM_VK_F5, // Search button. + Ci.nsIDOMKeyEvent.DOM_VK_PAGE_UP, // Volume up. + Ci.nsIDOMKeyEvent.DOM_VK_PAGE_DOWN // Volume down. +]; + +let blacklistedKeyCodes = [ + Ci.nsIDOMKeyEvent.DOM_VK_A, + Ci.nsIDOMKeyEvent.DOM_VK_B +]; + +SimpleTest.waitForExplicitFinish(); +browserElementTestHelpers.setEnabledPref(true); +browserElementTestHelpers.addPermission(); + +// Number of expected events at which point we will consider the test as done. +var nbEvents = whitelistedKeyCodes.length * 3; + +var iframe; +var finished = false; +function runTest() { + iframe = document.createElement('iframe'); + SpecialPowers.wrap(iframe).mozbrowser = true; + iframe.src = browserElementTestHelpers.focusPage; + + var gotFocus = false; + var gotLoadend = false; + + function maybeTest2() { + if (gotFocus && gotLoadend) { + SimpleTest.executeSoon(test2); + } + } + + iframe.addEventListener('mozbrowserloadend', function() { + gotLoadend = true; + maybeTest2(); + }); + + document.body.appendChild(iframe); + + SimpleTest.waitForFocus(function() { + iframe.focus(); + gotFocus = true; + maybeTest2(); + }); +} + +function eventHandler(e) { + if (whitelistedKeyCodes.indexOf(e.keyCode) == -1 && + blacklistedKeyCodes.indexOf(e.keyCode) == -1) { + // See bug 856006: We sometimes get unexpected key presses, and we don't + // know why. Don't turn the test orange over this. + ok(true, "Ignoring unexpected " + e.type + + " with keyCode " + e.keyCode + "."); + return; + } + + ok(e.type == 'keydown' || e.type == 'keypress' || e.type == 'keyup', + "e.type was " + e.type + ", expected keydown, keypress, or keyup"); + ok(!e.defaultPrevented, "expected !e.defaultPrevented"); + ok(whitelistedKeyCodes.indexOf(e.keyCode) != -1, + "Expected a whitelited keycode, but got " + e.keyCode + " instead."); + + nbEvents--; + + if (nbEvents == 0) { + SimpleTest.finish(); + return; + } + + if (nbEvents < 0 && !finished) { + ok(false, "got an unexpected event! " + e.type + " " + e.keyCode); + } +} + +function test2() { + is(document.activeElement, iframe, "iframe should be focused"); + + addEventListener('keydown', eventHandler); + addEventListener('keypress', eventHandler); + addEventListener('keyup', eventHandler); + + // These events should not be received because they are not whitelisted. + synthesizeKey("VK_A", {}); + synthesizeKey("VK_B", {}); + + // These events should not be received because preventDefault is called. + synthesizeKey("VK_ESCAPE", {}); + + // These events should be received. + synthesizeKey("VK_F5", {}); + synthesizeKey("VK_ESCAPE", {}); + synthesizeKey("VK_PAGE_UP", {}); + synthesizeKey("VK_PAGE_DOWN", {}); + synthesizeKey("VK_CONTEXT_MENU", {}); + synthesizeKey("VK_SLEEP", {}); + finished = true; +} + +addEventListener('testready', runTest);