dom/browser-element/mochitest/browserElement_KeyEvents.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/dom/browser-element/mochitest/browserElement_KeyEvents.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,113 @@
     1.4 +/* Any copyright is dedicated to the public domain.
     1.5 +   http://creativecommons.org/publicdomain/zero/1.0/ */
     1.6 +
     1.7 +// Test that an iframe with the |mozbrowser| attribute does bubble some
     1.8 +// whitelisted key events.
     1.9 +"use strict";
    1.10 +
    1.11 +let Ci = SpecialPowers.Ci;
    1.12 +
    1.13 +let whitelistedKeyCodes = [
    1.14 +  Ci.nsIDOMKeyEvent.DOM_VK_ESCAPE,   // Back button.
    1.15 +  Ci.nsIDOMKeyEvent.DOM_VK_SLEEP,    // Power button
    1.16 +  Ci.nsIDOMKeyEvent.DOM_VK_CONTEXT_MENU,
    1.17 +  Ci.nsIDOMKeyEvent.DOM_VK_F5,       // Search button.
    1.18 +  Ci.nsIDOMKeyEvent.DOM_VK_PAGE_UP,  // Volume up.
    1.19 +  Ci.nsIDOMKeyEvent.DOM_VK_PAGE_DOWN // Volume down.
    1.20 +];
    1.21 +
    1.22 +let blacklistedKeyCodes = [
    1.23 +  Ci.nsIDOMKeyEvent.DOM_VK_A,
    1.24 +  Ci.nsIDOMKeyEvent.DOM_VK_B
    1.25 +];
    1.26 +
    1.27 +SimpleTest.waitForExplicitFinish();
    1.28 +browserElementTestHelpers.setEnabledPref(true);
    1.29 +browserElementTestHelpers.addPermission();
    1.30 +
    1.31 +// Number of expected events at which point we will consider the test as done.
    1.32 +var nbEvents = whitelistedKeyCodes.length * 3;
    1.33 +
    1.34 +var iframe;
    1.35 +var finished = false;
    1.36 +function runTest() {
    1.37 +  iframe = document.createElement('iframe');
    1.38 +  SpecialPowers.wrap(iframe).mozbrowser = true;
    1.39 +  iframe.src = browserElementTestHelpers.focusPage;
    1.40 +
    1.41 +  var gotFocus = false;
    1.42 +  var gotLoadend = false;
    1.43 +
    1.44 +  function maybeTest2() {
    1.45 +    if (gotFocus && gotLoadend) {
    1.46 +      SimpleTest.executeSoon(test2);
    1.47 +    }
    1.48 +  }
    1.49 +
    1.50 +  iframe.addEventListener('mozbrowserloadend', function() {
    1.51 +    gotLoadend = true;
    1.52 +    maybeTest2();
    1.53 +  });
    1.54 +
    1.55 +  document.body.appendChild(iframe);
    1.56 +
    1.57 +  SimpleTest.waitForFocus(function() {
    1.58 +    iframe.focus();
    1.59 +    gotFocus = true;
    1.60 +    maybeTest2();
    1.61 +  });
    1.62 +}
    1.63 +
    1.64 +function eventHandler(e) {
    1.65 +  if (whitelistedKeyCodes.indexOf(e.keyCode) == -1 &&
    1.66 +      blacklistedKeyCodes.indexOf(e.keyCode) == -1) {
    1.67 +    // See bug 856006: We sometimes get unexpected key presses, and we don't
    1.68 +    // know why.  Don't turn the test orange over this.
    1.69 +    ok(true, "Ignoring unexpected " + e.type +
    1.70 +       " with keyCode " + e.keyCode + ".");
    1.71 +    return;
    1.72 +  }
    1.73 +
    1.74 +  ok(e.type == 'keydown' || e.type == 'keypress' || e.type == 'keyup',
    1.75 +     "e.type was " + e.type + ", expected keydown, keypress, or keyup");
    1.76 +  ok(!e.defaultPrevented, "expected !e.defaultPrevented");
    1.77 +  ok(whitelistedKeyCodes.indexOf(e.keyCode) != -1,
    1.78 +     "Expected a whitelited keycode, but got " + e.keyCode + " instead.");
    1.79 +
    1.80 +  nbEvents--;
    1.81 +
    1.82 +  if (nbEvents == 0) {
    1.83 +    SimpleTest.finish();
    1.84 +    return;
    1.85 +  }
    1.86 +
    1.87 +  if (nbEvents < 0 && !finished) {
    1.88 +    ok(false, "got an unexpected event! " + e.type + " " + e.keyCode);
    1.89 +  }
    1.90 +}
    1.91 +
    1.92 +function test2() {
    1.93 +  is(document.activeElement, iframe, "iframe should be focused");
    1.94 +
    1.95 +  addEventListener('keydown', eventHandler);
    1.96 +  addEventListener('keypress', eventHandler);
    1.97 +  addEventListener('keyup', eventHandler);
    1.98 +
    1.99 +  // These events should not be received because they are not whitelisted.
   1.100 +  synthesizeKey("VK_A", {});
   1.101 +  synthesizeKey("VK_B", {});
   1.102 +
   1.103 +  // These events should not be received because preventDefault is called.
   1.104 +  synthesizeKey("VK_ESCAPE", {});
   1.105 +
   1.106 +  // These events should be received.
   1.107 +  synthesizeKey("VK_F5", {});
   1.108 +  synthesizeKey("VK_ESCAPE", {});
   1.109 +  synthesizeKey("VK_PAGE_UP", {});
   1.110 +  synthesizeKey("VK_PAGE_DOWN", {});
   1.111 +  synthesizeKey("VK_CONTEXT_MENU", {});
   1.112 +  synthesizeKey("VK_SLEEP", {});
   1.113 +  finished = true;
   1.114 +}
   1.115 +
   1.116 +addEventListener('testready', runTest);

mercurial