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