widget/tests/test_keycodes.xul

Thu, 15 Jan 2015 15:59:08 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 15 Jan 2015 15:59:08 +0100
branch
TOR_BUG_9701
changeset 10
ac0c01689b40
permissions
-rw-r--r--

Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.

     1 <?xml version="1.0"?>
     2 <?xml-stylesheet href="chrome://global/skin" type="text/css"?>
     3 <?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css"
     4                  type="text/css"?>
     5 <window title="Key event tests"
     6   onload="runTest()"
     7   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
     9   <script type="application/javascript"
    10           src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
    11   <script type="application/javascript"
    12           src="chrome://mochikit/content/tests/SimpleTest/NativeKeyCodes.js" />
    13   <script type="application/javascript"
    14           src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js" />
    16 <keyset>
    17   <key id="unshiftedKey" key=";" modifiers="accel" oncommand="this.activeCount++"/>
    18   <key id="shiftedKey" key=":" modifiers="accel" oncommand="this.activeCount++"/>
    19   <key id="commandOptionF" key='f' modifiers="accel,alt" oncommand="this.activeCount++"/>
    20   <key id="question" key='?' modifiers="accel" oncommand="this.activeCount++"/>
    21   <key id="unshiftedX" key="x" modifiers="accel" oncommand="this.activeCount++"/>
    22   <key id="shiftedX" key="X" modifiers="accel,shift" oncommand="this.activeCount++"/>
    23   <key id="unshiftedPlus" key="+" modifiers="accel" oncommand="this.activeCount++"/>
    24 </keyset>
    26 <body  xmlns="http://www.w3.org/1999/xhtml">
    27 <p id="display">
    28   <!-- for some reason, if we don't have 'accesskey' here, adding it dynamically later
    29        doesn't work! -->
    30   <button id="button" accesskey="z">Hello</button>
    31   <input type="text" id="textbox" value=""/>
    32 </p>
    33 <div id="content" style="display: none">
    35 </div>
    36 <pre id="test">
    37 </pre>
    38 </body>
    40 <script class="testbody" type="application/javascript">
    41 <![CDATA[
    43 const IS_MAC = navigator.platform.indexOf("Mac") == 0;
    44 const IS_WIN = navigator.platform.indexOf("Win") == 0;
    46 /**
    47  * Firefox infobar UI can have access keys which conflict with this test. Really
    48  * stupid workaround until we can move this test into its own chrome window.
    49  */
    50 function clearInfobars()
    51 {
    52   var Ci = Components.interfaces;
    54   var browser = window.top.QueryInterface(Ci.nsIInterfaceRequestor)
    55                   .getInterface(Ci.nsIWebNavigation)
    56                   .QueryInterface(Ci.nsIDocShell).chromeEventHandler;
    57   var chromeWin = browser.ownerDocument.defaultView;
    58   var nb = chromeWin.gBrowser.getNotificationBox(browser);
    59   for (let n of nb.allNotifications) {
    60     nb.removeNotification(n, true);
    61   }
    62 }
    64 function eventToString(aEvent)
    65 {
    66   var name = aEvent.layout.name + " keyCode=" +
    67     aEvent.keyCode + " (0x" + aEvent.keyCode.toString(16).toUpperCase() +
    68       ") chars='" + aEvent.chars + "'";
    69   if (typeof aEvent.unmodifiedChars === "string") {
    70     name += " unmodifiedChars='" + aEvent.unmodifiedChars + "'";
    71   }
    72   if (aEvent.modifiers.shiftKey) {
    73     name += " [Shift]";
    74   }
    75   if (aEvent.modifiers.shiftRightKey) {
    76     name += " [Right Shift]";
    77   }
    78   if (aEvent.modifiers.ctrlKey) {
    79     name += " [Ctrl]";
    80   }
    81   if (aEvent.modifiers.ctrlRightKey) {
    82     name += " [Right Ctrl]";
    83   }
    84   if (aEvent.modifiers.altKey) {
    85     name += " [Alt]";
    86   }
    87   if (aEvent.modifiers.altRightKey) {
    88     name += " [Right Alt]";
    89   }
    90   if (aEvent.modifiers.metaKey) {
    91     name += " [Command]";
    92   }
    93   if (aEvent.modifiers.metaRightKey) {
    94     name += " [Right Command]";
    95   }
    97   return name;  
    98 }
   100 function synthesizeKey(aEvent, aFocusElementId)
   101 {
   102   document.getElementById(aFocusElementId).focus();
   104   var sent = synthesizeNativeKey(aEvent.layout, aEvent.keyCode,
   105                                  aEvent.modifiers,
   106                                  aEvent.chars, aEvent.unmodifiedChars);
   107   ok(sent, "synthesizeNativeKey() should send a native key event");
   108 }
   110 // Test the charcodes and modifiers being delivered to keypress handlers and
   111 // also keydown/keyup events too.
   112 function runKeyEventTests()
   113 {
   114   const nsIDOMKeyEvent = Components.interfaces.nsIDOMKeyEvent;
   115   var eventList, keyDownFlags, keyUpFlags, testingEvent, expectedDOMKeyCode;
   116   const kShiftFlag    = 0x1;
   117   const kCtrlFlag     = 0x2;
   118   const kAltFlag      = 0x4;
   119   const kMetaFlag     = 0x8;
   120   const kNumLockFlag  = 0x10;
   121   const kCapsLockFlag = 0x20;
   123   function onKeyEvent(e)
   124   {
   125     function removeFlag(e, aFlag)
   126     {
   127       if (e.type == "keydown") {
   128         var oldValue = keyDownFlags;
   129         keyDownFlags &= ~aFlag;
   130         return oldValue != keyDownFlags;
   131       } else if (e.type == "keyup") {
   132         var oldValue = keyUpFlags;
   133         keyUpFlags &= ~aFlag;
   134         return oldValue != keyUpFlags;
   135       }
   136       return false;
   137     }
   139     function isStateChangingModifierKeyEvent(e)
   140     {
   141       var flags = 0;
   142       if (e.type == "keydown") {
   143         flags = keyDownFlags ^ keyUpFlags;
   144       } else if (e.type == "keyup") {
   145         flags = keyUpFlags;
   146       }
   147       switch (e.keyCode) {
   148         case e.DOM_VK_SHIFT:
   149           is(e.ctrlKey, (flags & kCtrlFlag) != 0, name + ", Ctrl of Shift " + e.type + " event mismatch");
   150           is(e.metaKey, (flags & kMetaFlag) != 0, name + ", Command of Shift " + e.type + " event mismatch");
   151           is(e.altKey, (flags & kAltFlag) != 0, name + ", Alt of Shift " + e.type + " event mismatch");
   152           is(e.shiftKey, e.type == "keydown", name + ", Shift of Shift " + e.type + " event mismatch");
   153           return (testingEvent.modifiers.shiftKey || testingEvent.modifiers.shiftRightKey) &&
   154                  removeFlag(e, kShiftFlag) && expectedDOMKeyCode != e.keyCode;
   155         case e.DOM_VK_CONTROL:
   156           is(e.ctrlKey, e.type == "keydown", name + ", Ctrl of Ctrl " + e.type + " event mismatch");
   157           is(e.metaKey, (flags & kMetaFlag) != 0, name + ", Command of Ctrl " + e.type + " event mismatch");
   158           is(e.altKey, (flags & kAltFlag) != 0, name + ", Alt of Ctrl " + e.type + " event mismatch");
   159           is(e.shiftKey, (flags & kShiftFlag) != 0, name + ", Shift of Ctrl " + e.type + " event mismatch");
   160           return (testingEvent.modifiers.ctrlKey || testingEvent.modifiers.ctrlRightKey || (IS_WIN && testingEvent.modifiers.altGrKey)) &&
   161                  removeFlag(e, kCtrlFlag) && expectedDOMKeyCode != e.keyCode;
   162         case e.DOM_VK_ALT:
   163           is(e.ctrlKey, (flags & kCtrlFlag) != 0, name + ", Ctrl of Alt " + e.type + " event mismatch");
   164           is(e.metaKey, (flags & kMetaFlag) != 0, name + ", Command of Alt " + e.type + " event mismatch");
   165           is(e.altKey, e.type == "keydown", name + ", Alt of Alt " + e.type + " event mismatch");
   166           is(e.shiftKey, (flags & kShiftFlag) != 0, name + ", Shift of Alt " + e.type + " event mismatch");
   167           return (testingEvent.modifiers.altKey || testingEvent.modifiers.altRightKey || (IS_WIN && testingEvent.modifiers.altGrKey)) &&
   168                  removeFlag(e, kAltFlag) && expectedDOMKeyCode != e.keyCode;
   169         case e.DOM_VK_META:
   170           is(e.ctrlKey, (flags & kCtrlFlag) != 0, name + ", Ctrl of Command " + e.type + " evnet mismatch");
   171           is(e.metaKey, e.type == "keydown", name + ", Command of Command " + e.type + " evnet mismatch");
   172           is(e.altKey, (flags & kAltFlag) != 0, name + ", Alt of Command " + e.type + " evnet mismatch");
   173           is(e.shiftKey, (flags & kShiftFlag) != 0, name + ", Shift of Command " + e.type + " evnet mismatch");
   174           return (testingEvent.modifiers.metaKey || testingEvent.modifiers.metaRightKey) &&
   175                  removeFlag(e, kMetaFlag) && expectedDOMKeyCode != e.keyCode;
   176         case e.DOM_VK_NUM_LOCK:
   177           is(e.ctrlKey, (flags & kCtrlFlag) != 0, name + ", Ctrl of NumLock " + e.type + " event mismatch");
   178           is(e.metaKey, (flags & kMetaFlag) != 0, name + ", Command of NumLock " + e.type + " event mismatch");
   179           is(e.altKey, (flags & kAltFlag) != 0, name + ", Alt of NumLock " + e.type + " event mismatch");
   180           is(e.shiftKey, (flags & kShiftFlag) != 0, name + ", Shift of NumLock " + e.type + " event mismatch");
   181           return (testingEvent.modifiers.numLockKey || testingEvent.modifiers.numericKeyPadKey) &&
   182                  removeFlag(e, kNumLockFlag) && expectedDOMKeyCode != e.keyCode;
   183         case e.DOM_VK_CAPS_LOCK:
   184           is(e.ctrlKey, (flags & kCtrlFlag) != 0, name + ", Ctrl of CapsLock " + e.type + " event mismatch");
   185           is(e.metaKey, (flags & kMetaFlag) != 0, name + ", Command of CapsLock " + e.type + " event mismatch");
   186           is(e.altKey, (flags & kAltFlag) != 0, name + ", Alt of CapsLock " + e.type + " event mismatch");
   187           is(e.shiftKey, (flags & kShiftFlag) != 0, name + ", Shift of CapsLock " + e.type + " event mismatch");
   188           return testingEvent.modifiers.capsLockKey &&
   189                  removeFlag(e, kCapsLockFlag) && expectedDOMKeyCode != e.keyCode;
   190       }
   191       return false;
   192     }
   194     // Ignore the state changing key events which is fired by the testing event.
   195     if (!isStateChangingModifierKeyEvent(e))
   196       eventList.push(e);
   197     if (e.type == "keypress") {
   198       e.preventDefault();
   199     }
   200   }
   202   const SHOULD_DELIVER_NONE             = 0x0;
   203   const SHOULD_DELIVER_KEYDOWN          = 0x1;
   204   const SHOULD_DELIVER_KEYPRESS         = 0x2;
   205   const SHOULD_DELIVER_KEYUP            = 0x4;
   206   const SHOULD_NOT_CAUSE_INPUT          = 0x8;
   207   const SHOULD_DELIVER_ALL              = SHOULD_DELIVER_KEYDOWN |
   208                                           SHOULD_DELIVER_KEYPRESS |
   209                                           SHOULD_DELIVER_KEYUP;
   210   const SHOULD_DELIVER_ALL_BUT_NOT_CAUSE_INPUT = SHOULD_DELIVER_ALL |
   211                                           SHOULD_NOT_CAUSE_INPUT;
   212   const SHOULD_DELIVER_KEYDOWN_KEYUP    = SHOULD_DELIVER_KEYDOWN |
   213                                           SHOULD_DELIVER_KEYUP;
   214   const SHOULD_DELIVER_KEYDOWN_KEYPRESS = SHOULD_DELIVER_KEYDOWN |
   215                                           SHOULD_DELIVER_KEYPRESS;
   217   // The first parameter is the complete input event. The second parameter is
   218   // what to test against. The third parameter is which key events should be
   219   // delived for the event.
   220   function testKey(aEvent, aExpectedGeckoKeyCode, aExpectGeckoChar,
   221                    aShouldDelivedEvent, aExpectLocation)
   222   {
   223     ok(aExpectedGeckoKeyCode != undefined, "keycode is undefined");
   224     eventList = [];
   226     // The modifier key events which are fired for state changing are har to
   227     // test. We should ignore them for now.
   228     keyDownFlags = keyUpFlags = 0;
   229     if (!IS_MAC) {
   230       // On Mac, nsChildView doesn't generate modifier keydown/keyup events for
   231       // state changing for synthesizeNativeKeyEvent.
   232       if (aEvent.modifiers.shiftKey || aEvent.modifiers.shiftRightKey) {
   233         keyDownFlags |= kShiftFlag;
   234       }
   235       if (aEvent.modifiers.ctrlKey || aEvent.modifiers.ctrlRightKey ||
   236           (IS_WIN && aEvent.modifiers.altGrKey)) {
   237         keyDownFlags |= kCtrlFlag;
   238       }
   239       if (aEvent.modifiers.altKey || aEvent.modifiers.altRightKey ||
   240           (IS_WIN && aEvent.modifiers.altGrKey)) {
   241         keyDownFlags |= kAltFlag;
   242       }
   243       if (aEvent.modifiers.metaKey || aEvent.modifiers.metaRightKey) {
   244         keyDownFlags |= kMetaFlag;
   245       }
   246       if (aEvent.modifiers.numLockKey || aEvent.modifiers.numericKeyPadKey) {
   247         keyDownFlags |= kNumLockFlag;
   248       }
   249       if (aEvent.modifiers.capsLockKey) {
   250         keyDownFlags |= kCapsLockFlag;
   251       }
   252       keyUpFlags = keyDownFlags;
   253     }
   255     testingEvent = aEvent;
   256     expectedDOMKeyCode = aExpectedGeckoKeyCode;
   258     var name = eventToString(aEvent);
   259     ok(true, "Starting: " + name);
   261     synthesizeKey(aEvent, "button");
   263     var expectEventTypeList = [];
   264     if (aShouldDelivedEvent & SHOULD_DELIVER_KEYDOWN)
   265       expectEventTypeList.push("keydown");
   266     if (aShouldDelivedEvent & SHOULD_DELIVER_KEYPRESS) {
   267       expectEventTypeList.push("keypress");
   268       for (var i = 1; i < aExpectGeckoChar.length; i++) {
   269         expectEventTypeList.push("keypress");
   270       }
   271     }
   272     if (aShouldDelivedEvent & SHOULD_DELIVER_KEYUP)
   273       expectEventTypeList.push("keyup");
   274     is(eventList.length, expectEventTypeList.length, name + ", wrong number of key events");
   276     var longerLength = Math.max(eventList.length, expectEventTypeList.length);
   277     var keypressCount = 0;
   278     for (var i = 0; i < longerLength; i++) {
   279       var firedEventType = i < eventList.length ? eventList[i].type : "";
   280       var expectEventType = i < expectEventTypeList.length ? expectEventTypeList[i] : "";
   281       if (firedEventType != "")
   282         is(firedEventType, expectEventType, name + ", wrong type event fired");
   283       else
   284         is(firedEventType, expectEventType, name + ", a needed event is not fired");
   286       if (firedEventType != "") {
   287         var e = eventList[i];
   288         if (e.type == "keypress") {
   289           var isCtrlExpected =
   290             aEvent.modifiers.ctrlKey || aEvent.modifiers.ctrlRightKey || false;
   291           var isAltExpected =
   292             aEvent.modifiers.altKey || aEvent.modifiers.altRightKey || false;
   293           if (IS_WIN && aEvent.modifiers.altGrKey) {
   294             isCtrlExpected = isAltExpected =
   295               ((aShouldDelivedEvent & SHOULD_NOT_CAUSE_INPUT) != 0);
   296           }
   297           is(e.ctrlKey, isCtrlExpected, name + ", Ctrl mismatch");
   298           is(e.metaKey, aEvent.modifiers.metaKey || aEvent.modifiers.metaRightKey || false, name + ", Command mismatch");
   299           is(e.altKey, isAltExpected, name + ", Alt mismatch");
   300           is(e.shiftKey, aEvent.modifiers.shiftKey || aEvent.modifiers.shiftRightKey || false, name + ", Shift mismatch");
   301         }
   303         if (aExpectGeckoChar.length > 0 && e.type == "keypress") {
   304           is(e.charCode, aExpectGeckoChar.charCodeAt(keypressCount++), name + ", charcode");
   305           if (aExpectedGeckoKeyCode >= 0) {
   306             if (aExpectGeckoChar) {
   307               is(e.keyCode, 0, name + ", wrong keycode");
   308             } else {
   309               is(e.keyCode, aExpectedGeckoKeyCode, name + ", wrong keycode");
   310             }
   311           }
   312         } else {
   313           is(e.charCode, 0, name + ", no charcode");
   314           if (aExpectedGeckoKeyCode >= 0) {
   315             is(e.keyCode, aExpectedGeckoKeyCode, name + ", wrong keycode");
   316           }
   317         }
   318         is(e.location, aExpectLocation, name + ", wrong location");
   319       }
   320     }
   321   }
   323   // These tests have to be per-plaform.
   324   document.addEventListener("keydown",  onKeyEvent, false);
   325   document.addEventListener("keypress", onKeyEvent, false);
   326   document.addEventListener("keyup",    onKeyEvent, false);
   328   if (IS_MAC) {
   329     // On Mac, you can produce event records for any desired keyboard input
   330     // by running with NSPR_LOG_MODULES=TextInputHandlerWidgets:5 and typing
   331     // into the browser.  We will dump the key event fields to the console
   332     // (Find TextInputHandler::HandleKeyDownEvent or
   333     // TextInputHandler::HandleKeyUpEvent in the log). Use the International system
   334     // preferences widget to enable other keyboard layouts and select them from the
   335     // input menu to see what keyboard events they generate.
   336     // Note that it's possible to send bogus key events here, e.g.
   337     // {keyCode:0, chars:"z", unmodifiedChars:"P"} --- sendNativeKeyEvent
   338     // makes no attempt to verify that the keyCode matches the characters. So only
   339     // test key event records that you saw Cocoa send.
   341     // Ctrl keys
   342     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   343              modifiers:{ctrlKey:1}, chars:"\u0001", unmodifiedChars:"a"},
   344             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   345     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   346              modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0001", unmodifiedChars:"A"},
   347             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   349     // Alt keys
   350     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   351              modifiers:{altKey:1}, chars:"\u00e5", unmodifiedChars:"a"},
   352             nsIDOMKeyEvent.DOM_VK_A, "\u00e5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   353     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   354              modifiers:{altKey:1, shiftKey:1}, chars:"\u00c5", unmodifiedChars:"A"},
   355             nsIDOMKeyEvent.DOM_VK_A, "\u00c5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   357     // Command keys
   358     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   359              modifiers:{metaKey:1}, chars:"a", unmodifiedChars:"a"},
   360             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   361     // Shift-cmd gives us the shifted character
   362     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   363              modifiers:{metaKey:1, shiftKey:1}, chars:"a", unmodifiedChars:"A"},
   364             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   365     // Ctrl-cmd gives us the unshifted character
   366     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   367              modifiers:{metaKey:1, ctrlKey:1}, chars:"\u0001", unmodifiedChars:"a"},
   368             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   369     // Alt-cmd gives us the shifted character
   370     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   371              modifiers:{metaKey:1, altKey:1}, chars:"\u00e5", unmodifiedChars:"a"},
   372             nsIDOMKeyEvent.DOM_VK_A, "\u00e5", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   373     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   374              modifiers:{metaKey:1, altKey:1, shiftKey:1}, chars:"\u00c5", unmodifiedChars:"a"},
   375             nsIDOMKeyEvent.DOM_VK_A, "\u00c5", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   377     // Greek ctrl keys produce Latin charcodes
   378     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
   379              modifiers:{ctrlKey:1}, chars:"\u0001", unmodifiedChars:"\u03b1"},
   380             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   381     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
   382              modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0001", unmodifiedChars:"\u0391"},
   383             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   385     // Greek command keys
   386     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
   387              modifiers:{metaKey:1}, chars:"a", unmodifiedChars:"\u03b1"},
   388             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   389     // Shift-cmd gives us the shifted character
   390     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
   391              modifiers:{metaKey:1, shiftKey:1}, chars:"a", unmodifiedChars:"\u0391"},
   392             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   393     // Ctrl-cmd gives us the unshifted character
   394     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
   395              modifiers:{metaKey:1, ctrlKey:1}, chars:"\u0001", unmodifiedChars:"\u03b1"},
   396             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   397     // Alt-cmd gives us the shifted character
   398     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
   399              modifiers:{metaKey:1, altKey:1}, chars:"\u00a8", unmodifiedChars:"\u03b1"},
   400             nsIDOMKeyEvent.DOM_VK_A, "\u00a8", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   401     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
   402              modifiers:{metaKey:1, altKey:1, shiftKey:1}, chars:"\u00b9", unmodifiedChars:"\u0391"},
   403             nsIDOMKeyEvent.DOM_VK_A, "\u00b9", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   405     // German
   406     testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_A,
   407              modifiers: {}, chars:"a", unmodifiedChars:"a"},
   408             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   409     testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_LeftBracket,
   410              modifiers: {}, chars:"\u00fc", unmodifiedChars:"\u00fc"},
   411             0, "\u00fc", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   412     testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_Minus,
   413              modifiers: {}, chars:"\u00df", unmodifiedChars:"\u00df"},
   414             nsIDOMKeyEvent.DOM_VK_QUESTION_MARK, "\u00df", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   415     testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_Minus,
   416              modifiers:{shiftKey:1}, chars:"?", unmodifiedChars:"?"},
   417             nsIDOMKeyEvent.DOM_VK_QUESTION_MARK, "?", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   418     // Note that Shift+SS is '?' but Cmd+Shift+SS is '/' on German layout.
   419     // Therefore, when Cmd key is pressed, the SS key's keycode is changed.
   420     testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_Minus,
   421              modifiers:{metaKey:1}, chars:"\u00df", unmodifiedChars:"\u00df"},
   422             nsIDOMKeyEvent.DOM_VK_SLASH, "\u00df", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   423     testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_Minus,
   424              modifiers:{metaKey:1, shiftKey:1}, chars:"/", unmodifiedChars:"?"},
   425             nsIDOMKeyEvent.DOM_VK_SLASH, "?", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   427     // Caps Lock key event
   428     // XXX keyup event of Caps Lock key is not fired.
   429     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_CapsLock,
   430              modifiers:{capsLockKey:1}, chars:"", unmodifiedChars:""},
   431             nsIDOMKeyEvent.DOM_VK_CAPS_LOCK, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   432     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_CapsLock,
   433              modifiers:{capsLockKey:0}, chars:"", unmodifiedChars:""},
   434             nsIDOMKeyEvent.DOM_VK_CAPS_LOCK, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   436     // Shift/RightShift key event
   437     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Shift,
   438              modifiers:{shiftKey:1}, chars:"", unmodifiedChars:""},
   439             nsIDOMKeyEvent.DOM_VK_SHIFT, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
   440     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Shift,
   441              modifiers:{shiftKey:0}, chars:"", unmodifiedChars:""},
   442             nsIDOMKeyEvent.DOM_VK_SHIFT, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
   443     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightShift,
   444              modifiers:{shiftRightKey:1}, chars:"", unmodifiedChars:""},
   445             nsIDOMKeyEvent.DOM_VK_SHIFT, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
   446     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightShift,
   447              modifiers:{shiftRightKey:0}, chars:"", unmodifiedChars:""},
   448             nsIDOMKeyEvent.DOM_VK_SHIFT, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
   450     // Control/RightControl key event
   451     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Control,
   452              modifiers:{ctrlKey:1}, chars:"", unmodifiedChars:""},
   453             nsIDOMKeyEvent.DOM_VK_CONTROL, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
   454     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Control,
   455              modifiers:{ctrlKey:0}, chars:"", unmodifiedChars:""},
   456             nsIDOMKeyEvent.DOM_VK_CONTROL, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
   457     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightControl,
   458              modifiers:{ctrlRightKey:1}, chars:"", unmodifiedChars:""},
   459             nsIDOMKeyEvent.DOM_VK_CONTROL, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
   460     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightControl,
   461              modifiers:{ctrlRightKey:0}, chars:"", unmodifiedChars:""},
   462             nsIDOMKeyEvent.DOM_VK_CONTROL, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
   464     // Option/RightOption key event
   465     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Option,
   466              modifiers:{altKey:1}, chars:"", unmodifiedChars:""},
   467             nsIDOMKeyEvent.DOM_VK_ALT, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
   468     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Option,
   469              modifiers:{altKey:0}, chars:"", unmodifiedChars:""},
   470             nsIDOMKeyEvent.DOM_VK_ALT, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
   471     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightOption,
   472              modifiers:{altRightKey:1}, chars:"", unmodifiedChars:""},
   473             nsIDOMKeyEvent.DOM_VK_ALT, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
   474     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightOption,
   475              modifiers:{altRightKey:0}, chars:"", unmodifiedChars:""},
   476             nsIDOMKeyEvent.DOM_VK_ALT, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
   478     // Command/RightCommand key event
   479     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Command,
   480              modifiers:{metaKey:1}, chars:"", unmodifiedChars:""},
   481             nsIDOMKeyEvent.DOM_VK_META, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
   482     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Command,
   483              modifiers:{metaKey:0}, chars:"", unmodifiedChars:""},
   484             nsIDOMKeyEvent.DOM_VK_META, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
   485     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightCommand,
   486              modifiers:{metaRightKey:1}, chars:"", unmodifiedChars:""},
   487             nsIDOMKeyEvent.DOM_VK_META, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
   488     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightCommand,
   489              modifiers:{metaRightKey:0}, chars:"", unmodifiedChars:""},
   490             nsIDOMKeyEvent.DOM_VK_META, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
   492     // all keys on keyboard (keyCode test)
   493     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Tab,
   494              modifiers: {}, chars:"\t", unmodifiedChars:"\t"},
   495             nsIDOMKeyEvent.DOM_VK_TAB, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   496     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadClear,
   497              modifiers: {}, chars:"\uF739", unmodifiedChars:"\uF739"},
   498             nsIDOMKeyEvent.DOM_VK_CLEAR, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   499     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Return,
   500              modifiers: {}, chars:"\u000D", unmodifiedChars:"\u000D"},
   501             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   502     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F15,
   503              modifiers: {}, chars:"\uF712", unmodifiedChars:"\uF712"},
   504             nsIDOMKeyEvent.DOM_VK_PAUSE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   505     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Escape,
   506              modifiers: {}, chars:"\u001B", unmodifiedChars:"\u001B"},
   507             nsIDOMKeyEvent.DOM_VK_ESCAPE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   508     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Space,
   509              modifiers: {}, chars:" ", unmodifiedChars:" "},
   510             nsIDOMKeyEvent.DOM_VK_SPACE, " ", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   511     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_PageUp,
   512              modifiers: {}, chars:"\uF72C", unmodifiedChars:"\uF72C"},
   513             nsIDOMKeyEvent.DOM_VK_PAGE_UP, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   514     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_PageDown,
   515              modifiers: {}, chars:"\uF72D", unmodifiedChars:"\uF72D"},
   516             nsIDOMKeyEvent.DOM_VK_PAGE_DOWN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   517     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_End,
   518              modifiers: {}, chars:"\uF72B", unmodifiedChars:"\uF72B"},
   519             nsIDOMKeyEvent.DOM_VK_END, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   520     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Home,
   521              modifiers: {}, chars:"\uF729", unmodifiedChars:"\uF729"},
   522             nsIDOMKeyEvent.DOM_VK_HOME, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   523     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_LeftArrow,
   524              modifiers: {}, chars:"\uF702", unmodifiedChars:"\uF702"},
   525             nsIDOMKeyEvent.DOM_VK_LEFT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   526     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_UpArrow,
   527              modifiers: {}, chars:"\uF700", unmodifiedChars:"\uF700"},
   528             nsIDOMKeyEvent.DOM_VK_UP, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   529     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightArrow,
   530              modifiers: {}, chars:"\uF703", unmodifiedChars:"\uF703"},
   531             nsIDOMKeyEvent.DOM_VK_RIGHT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   532     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_DownArrow,
   533              modifiers: {}, chars:"\uF701", unmodifiedChars:"\uF701"},
   534             nsIDOMKeyEvent.DOM_VK_DOWN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   535     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_PC_PrintScreen,
   536              modifiers: {}, chars:"\uF710", unmodifiedChars:"\uF710"},
   537             nsIDOMKeyEvent.DOM_VK_PRINTSCREEN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   538     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_PC_Delete,
   539              modifiers: {}, chars:"\uF728", unmodifiedChars:"\uF728"},
   540             nsIDOMKeyEvent.DOM_VK_DELETE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   541     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_PC_Pause,
   542              modifiers: {}, chars:"\uF711", unmodifiedChars:"\uF711"},
   543             nsIDOMKeyEvent.DOM_VK_SCROLL_LOCK, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   544     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_PC_ContextMenu,
   545              modifiers: {}, chars:"\u0010", unmodifiedChars:"\u0010"},
   546             nsIDOMKeyEvent.DOM_VK_CONTEXT_MENU, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   548     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F1,
   549              modifiers:{fnKey:1}, chars:"\uF704", unmodifiedChars:"\uF704"},
   550             nsIDOMKeyEvent.DOM_VK_F1, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   551     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F2,
   552              modifiers:{fnKey:1}, chars:"\uF705", unmodifiedChars:"\uF705"},
   553             nsIDOMKeyEvent.DOM_VK_F2, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   554     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F3,
   555              modifiers:{fnKey:1}, chars:"\uF706", unmodifiedChars:"\uF706"},
   556             nsIDOMKeyEvent.DOM_VK_F3, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   557     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F4,
   558              modifiers:{fnKey:1}, chars:"\uF707", unmodifiedChars:"\uF707"},
   559             nsIDOMKeyEvent.DOM_VK_F4, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   560     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F5,
   561              modifiers:{fnKey:1}, chars:"\uF708", unmodifiedChars:"\uF708"},
   562             nsIDOMKeyEvent.DOM_VK_F5, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   563     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F6,
   564              modifiers:{fnKey:1}, chars:"\uF709", unmodifiedChars:"\uF709"},
   565             nsIDOMKeyEvent.DOM_VK_F6, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   566     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F7,
   567              modifiers:{fnKey:1}, chars:"\uF70A", unmodifiedChars:"\uF70A"},
   568             nsIDOMKeyEvent.DOM_VK_F7, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   569     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F8,
   570              modifiers:{fnKey:1}, chars:"\uF70B", unmodifiedChars:"\uF70B"},
   571             nsIDOMKeyEvent.DOM_VK_F8, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   572     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F9,
   573              modifiers:{fnKey:1}, chars:"\uF70C", unmodifiedChars:"\uF70C"},
   574             nsIDOMKeyEvent.DOM_VK_F9, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   575     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F10,
   576              modifiers:{fnKey:1}, chars:"\uF70D", unmodifiedChars:"\uF70D"},
   577             nsIDOMKeyEvent.DOM_VK_F10, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   578     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F11,
   579              modifiers:{fnKey:1}, chars:"\uF70E", unmodifiedChars:"\uF70E"},
   580             nsIDOMKeyEvent.DOM_VK_F11, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   581     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F12,
   582              modifiers:{fnKey:1}, chars:"\uF70F", unmodifiedChars:"\uF70F"},
   583             nsIDOMKeyEvent.DOM_VK_F12, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   584     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F16,
   585              modifiers:{fnKey:1}, chars:"\uF713", unmodifiedChars:"\uF713"},
   586             nsIDOMKeyEvent.DOM_VK_F16, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   587     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F17,
   588              modifiers:{fnKey:1}, chars:"\uF714", unmodifiedChars:"\uF714"},
   589             nsIDOMKeyEvent.DOM_VK_F17, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   590     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F18,
   591              modifiers:{fnKey:1}, chars:"\uF715", unmodifiedChars:"\uF715"},
   592             nsIDOMKeyEvent.DOM_VK_F18, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   593     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F19,
   594              modifiers:{fnKey:1}, chars:"\uF716", unmodifiedChars:"\uF716"},
   595             nsIDOMKeyEvent.DOM_VK_F19, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   597     // US
   598     // Alphabet
   599     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   600              modifiers: {}, chars:"a", unmodifiedChars:"a"},
   601             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   602     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   603              modifiers:{shiftKey:1}, chars:"A", unmodifiedChars:"A"},
   604             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   605     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   606              modifiers:{ctrlKey:1}, chars:"\u0001", unmodifiedChars:"a"},
   607             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   608     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   609              modifiers:{altKey:1}, chars:"\u00E5", unmodifiedChars:"a"},
   610             nsIDOMKeyEvent.DOM_VK_A, "\u00E5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   611     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
   612              modifiers:{metaKey:1}, chars:"a", unmodifiedChars:"a"},
   613             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   614     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_B,
   615              modifiers:{}, chars:"b", unmodifiedChars:"b"},
   616             nsIDOMKeyEvent.DOM_VK_B, "b", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   617     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_B,
   618              modifiers:{shiftKey:1}, chars:"B", unmodifiedChars:"B"},
   619             nsIDOMKeyEvent.DOM_VK_B, "B", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   620     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_B,
   621              modifiers:{ctrlKey:1}, chars:"\u0002", unmodifiedChars:"b"},
   622             nsIDOMKeyEvent.DOM_VK_B, "b", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   623     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_B,
   624              modifiers:{altKey:1}, chars:"\u222B", unmodifiedChars:"b"},
   625             nsIDOMKeyEvent.DOM_VK_B, "\u222B", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   626     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_B,
   627              modifiers:{metaKey:1}, chars:"b", unmodifiedChars:"b"},
   628             nsIDOMKeyEvent.DOM_VK_B, "b", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   629     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_C,
   630              modifiers:{}, chars:"c", unmodifiedChars:"c"},
   631             nsIDOMKeyEvent.DOM_VK_C, "c", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   632     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_C,
   633              modifiers:{shiftKey:1}, chars:"C", unmodifiedChars:"C"},
   634             nsIDOMKeyEvent.DOM_VK_C, "C", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   635     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_C,
   636              modifiers:{ctrlKey:1}, chars:"\u0003", unmodifiedChars:"c"},
   637             nsIDOMKeyEvent.DOM_VK_C, "c", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   638     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_C,
   639              modifiers:{altKey:1}, chars:"\u00E7", unmodifiedChars:"c"},
   640             nsIDOMKeyEvent.DOM_VK_C, "\u00E7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   641     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_C,
   642              modifiers:{metaKey:1}, chars:"c", unmodifiedChars:"c"},
   643             nsIDOMKeyEvent.DOM_VK_C, "c", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   644     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_D,
   645              modifiers:{}, chars:"d", unmodifiedChars:"d"},
   646             nsIDOMKeyEvent.DOM_VK_D, "d", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   647     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_D,
   648              modifiers:{shiftKey:1}, chars:"D", unmodifiedChars:"D"},
   649             nsIDOMKeyEvent.DOM_VK_D, "D", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   650     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_D,
   651              modifiers:{ctrlKey:1}, chars:"\u0004", unmodifiedChars:"d"},
   652             nsIDOMKeyEvent.DOM_VK_D, "d", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   653     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_D,
   654              modifiers:{altKey:1}, chars:"\u2202", unmodifiedChars:"d"},
   655             nsIDOMKeyEvent.DOM_VK_D, "\u2202", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   656     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_D,
   657              modifiers:{metaKey:1}, chars:"d", unmodifiedChars:"d"},
   658             nsIDOMKeyEvent.DOM_VK_D, "d", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   659     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_E,
   660              modifiers:{}, chars:"e", unmodifiedChars:"e"},
   661             nsIDOMKeyEvent.DOM_VK_E, "e", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   662     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_E,
   663              modifiers:{shiftKey:1}, chars:"E", unmodifiedChars:"E"},
   664             nsIDOMKeyEvent.DOM_VK_E, "E", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   665     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_E,
   666              modifiers:{ctrlKey:1}, chars:"\u0005", unmodifiedChars:"e"},
   667             nsIDOMKeyEvent.DOM_VK_E, "e", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   668     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_E,
   669              modifiers:{altKey:1}, chars:"", unmodifiedChars:"e"},
   670             nsIDOMKeyEvent.DOM_VK_E, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // dead key
   671     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_E,
   672              modifiers:{metaKey:1}, chars:"e", unmodifiedChars:"e"},
   673             nsIDOMKeyEvent.DOM_VK_E, "e", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   674     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_F,
   675              modifiers:{}, chars:"f", unmodifiedChars:"f"},
   676             nsIDOMKeyEvent.DOM_VK_F, "f", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   677     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_F,
   678              modifiers:{shiftKey:1}, chars:"F", unmodifiedChars:"F"},
   679             nsIDOMKeyEvent.DOM_VK_F, "F", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   680     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_F,
   681              modifiers:{ctrlKey:1}, chars:"\u0006", unmodifiedChars:"f"},
   682             nsIDOMKeyEvent.DOM_VK_F, "f", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   683     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_F,
   684              modifiers:{altKey:1}, chars:"\u0192", unmodifiedChars:"f"},
   685             nsIDOMKeyEvent.DOM_VK_F, "\u0192", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   686     // XXX This test starts fullscreen mode.
   687     // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_F,
   688     //          modifiers:{metaKey:1}, chars:"f", unmodifiedChars:"f"},
   689     //         nsIDOMKeyEvent.DOM_VK_F, "f", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   690     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_G,
   691              modifiers:{}, chars:"g", unmodifiedChars:"g"},
   692             nsIDOMKeyEvent.DOM_VK_G, "g", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   693     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_G,
   694              modifiers:{shiftKey:1}, chars:"G", unmodifiedChars:"G"},
   695             nsIDOMKeyEvent.DOM_VK_G, "G", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   696     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_G,
   697              modifiers:{ctrlKey:1}, chars:"\u0007", unmodifiedChars:"g"},
   698             nsIDOMKeyEvent.DOM_VK_G, "g", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   699     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_G,
   700              modifiers:{altKey:1}, chars:"\u00A9", unmodifiedChars:"g"},
   701             nsIDOMKeyEvent.DOM_VK_G, "\u00A9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   702     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_G,
   703              modifiers:{metaKey:1}, chars:"g", unmodifiedChars:"g"},
   704             nsIDOMKeyEvent.DOM_VK_G, "g", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   705     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_H,
   706              modifiers:{}, chars:"h", unmodifiedChars:"h"},
   707             nsIDOMKeyEvent.DOM_VK_H, "h", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   708     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_H,
   709              modifiers:{shiftKey:1}, chars:"H", unmodifiedChars:"H"},
   710             nsIDOMKeyEvent.DOM_VK_H, "H", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   711     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_H,
   712              modifiers:{ctrlKey:1}, chars:"\u0008", unmodifiedChars:"h"},
   713             nsIDOMKeyEvent.DOM_VK_H, "h", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   714     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_H,
   715              modifiers:{altKey:1}, chars:"\u02D9", unmodifiedChars:"h"},
   716             nsIDOMKeyEvent.DOM_VK_H, "\u02D9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   717     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_H,
   718              modifiers:{metaKey:1}, chars:"h", unmodifiedChars:"h"},
   719             nsIDOMKeyEvent.DOM_VK_H, "h", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   720     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_I,
   721              modifiers:{}, chars:"i", unmodifiedChars:"i"},
   722             nsIDOMKeyEvent.DOM_VK_I, "i", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   723     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_I,
   724              modifiers:{shiftKey:1}, chars:"I", unmodifiedChars:"I"},
   725             nsIDOMKeyEvent.DOM_VK_I, "I", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   726     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_I,
   727              modifiers:{ctrlKey:1}, chars:"\u0009", unmodifiedChars:"i"},
   728             nsIDOMKeyEvent.DOM_VK_I, "i", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   729     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_I,
   730              modifiers:{altKey:1}, chars:"", unmodifiedChars:"i"},
   731             nsIDOMKeyEvent.DOM_VK_I, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // dead key
   732     // XXX This test causes memory leak.
   733     // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_I,
   734     //          modifiers:{metaKey:1}, chars:"i", unmodifiedChars:"i"},
   735     //         nsIDOMKeyEvent.DOM_VK_I, "i", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   736     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_J,
   737              modifiers:{}, chars:"j", unmodifiedChars:"j"},
   738             nsIDOMKeyEvent.DOM_VK_J, "j", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   739     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_J,
   740              modifiers:{shiftKey:1}, chars:"J", unmodifiedChars:"J"},
   741             nsIDOMKeyEvent.DOM_VK_J, "J", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   742     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_J,
   743              modifiers:{ctrlKey:1}, chars:"\u000A", unmodifiedChars:"j"},
   744             nsIDOMKeyEvent.DOM_VK_J, "j", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   745     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_J,
   746              modifiers:{altKey:1}, chars:"\u2206", unmodifiedChars:"j"},
   747             nsIDOMKeyEvent.DOM_VK_J, "\u2206", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   748     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_J,
   749              modifiers:{metaKey:1}, chars:"j", unmodifiedChars:"j"},
   750             nsIDOMKeyEvent.DOM_VK_J, "j", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   751     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_K,
   752              modifiers:{}, chars:"k", unmodifiedChars:"k"},
   753             nsIDOMKeyEvent.DOM_VK_K, "k", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   754     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_K,
   755              modifiers:{shiftKey:1}, chars:"K", unmodifiedChars:"K"},
   756             nsIDOMKeyEvent.DOM_VK_K, "K", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   757     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_K,
   758              modifiers:{ctrlKey:1}, chars:"\u000B", unmodifiedChars:"k"},
   759             nsIDOMKeyEvent.DOM_VK_K, "k", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   760     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_K,
   761              modifiers:{altKey:1}, chars:"\u02DA", unmodifiedChars:"k"},
   762             nsIDOMKeyEvent.DOM_VK_K, "\u02DA", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   763     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_K,
   764              modifiers:{metaKey:1}, chars:"k", unmodifiedChars:"k"},
   765             nsIDOMKeyEvent.DOM_VK_K, "k", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   766     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_L,
   767              modifiers:{}, chars:"l", unmodifiedChars:"l"},
   768             nsIDOMKeyEvent.DOM_VK_L, "l", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   769     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_L,
   770              modifiers:{shiftKey:1}, chars:"L", unmodifiedChars:"L"},
   771             nsIDOMKeyEvent.DOM_VK_L, "L", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   772     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_L,
   773              modifiers:{ctrlKey:1}, chars:"\u000C", unmodifiedChars:"l"},
   774             nsIDOMKeyEvent.DOM_VK_L, "l", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   775     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_L,
   776              modifiers:{altKey:1}, chars:"\u00AC", unmodifiedChars:"l"},
   777             nsIDOMKeyEvent.DOM_VK_L, "\u00AC", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   778     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_L,
   779              modifiers:{metaKey:1}, chars:"l", unmodifiedChars:"l"},
   780             nsIDOMKeyEvent.DOM_VK_L, "l", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   781     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_M,
   782              modifiers:{}, chars:"m", unmodifiedChars:"m"},
   783             nsIDOMKeyEvent.DOM_VK_M, "m", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   784     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_M,
   785              modifiers:{shiftKey:1}, chars:"M", unmodifiedChars:"M"},
   786             nsIDOMKeyEvent.DOM_VK_M, "M", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   787     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_M,
   788              modifiers:{ctrlKey:1}, chars:"\u000D", unmodifiedChars:"m"},
   789             nsIDOMKeyEvent.DOM_VK_M, "m", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   790     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_M,
   791              modifiers:{altKey:1}, chars:"\u00B5", unmodifiedChars:"m"},
   792             nsIDOMKeyEvent.DOM_VK_M, "\u00B5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   793     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_M,
   794              modifiers:{metaKey:1}, chars:"m", unmodifiedChars:"m"},
   795             nsIDOMKeyEvent.DOM_VK_M, "m", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   796     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_N,
   797              modifiers:{}, chars:"n", unmodifiedChars:"n"},
   798             nsIDOMKeyEvent.DOM_VK_N, "n", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   799     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_N,
   800              modifiers:{shiftKey:1}, chars:"N", unmodifiedChars:"N"},
   801             nsIDOMKeyEvent.DOM_VK_N, "N", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   802     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_N,
   803              modifiers:{ctrlKey:1}, chars:"\u000E", unmodifiedChars:"n"},
   804             nsIDOMKeyEvent.DOM_VK_N, "n", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   805     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_N,
   806              modifiers:{altKey:1}, chars:"", unmodifiedChars:"n"},
   807             nsIDOMKeyEvent.DOM_VK_N, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // dead key
   808     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_N,
   809              modifiers:{metaKey:1}, chars:"n", unmodifiedChars:"n"},
   810             nsIDOMKeyEvent.DOM_VK_N, "n", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   811     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_O,
   812              modifiers:{}, chars:"o", unmodifiedChars:"o"},
   813             nsIDOMKeyEvent.DOM_VK_O, "o", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   814     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_O,
   815              modifiers:{shiftKey:1}, chars:"O", unmodifiedChars:"O"},
   816             nsIDOMKeyEvent.DOM_VK_O, "O", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   817     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_O,
   818              modifiers:{ctrlKey:1}, chars:"\u000F", unmodifiedChars:"o"},
   819             nsIDOMKeyEvent.DOM_VK_O, "o", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   820     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_O,
   821              modifiers:{altKey:1}, chars:"\u00F8", unmodifiedChars:"o"},
   822             nsIDOMKeyEvent.DOM_VK_O, "\u00F8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   823     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_O,
   824              modifiers:{metaKey:1}, chars:"o", unmodifiedChars:"o"},
   825             nsIDOMKeyEvent.DOM_VK_O, "o", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   826     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_P,
   827              modifiers:{}, chars:"p", unmodifiedChars:"p"},
   828             nsIDOMKeyEvent.DOM_VK_P, "p", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   829     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_P,
   830              modifiers:{shiftKey:1}, chars:"P", unmodifiedChars:"P"},
   831             nsIDOMKeyEvent.DOM_VK_P, "P", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   832     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_P,
   833              modifiers:{ctrlKey:1}, chars:"\u0010", unmodifiedChars:"p"},
   834             nsIDOMKeyEvent.DOM_VK_P, "p", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   835     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_P,
   836              modifiers:{altKey:1}, chars:"\u03C0", unmodifiedChars:"p"},
   837             nsIDOMKeyEvent.DOM_VK_P, "\u03C0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   838     // XXX This test starts private browsing mode (stopped at the confirmation dialog)
   839     // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_P,
   840     //          modifiers:{metaKey:1}, chars:"p", unmodifiedChars:"p"},
   841     //         nsIDOMKeyEvent.DOM_VK_P, "p", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   842     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Q,
   843              modifiers:{}, chars:"q", unmodifiedChars:"q"},
   844             nsIDOMKeyEvent.DOM_VK_Q, "q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   845     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Q,
   846              modifiers:{shiftKey:1}, chars:"Q", unmodifiedChars:"Q"},
   847             nsIDOMKeyEvent.DOM_VK_Q, "Q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   848     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Q,
   849              modifiers:{ctrlKey:1}, chars:"\u0011", unmodifiedChars:"q"},
   850             nsIDOMKeyEvent.DOM_VK_Q, "q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   851     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Q,
   852              modifiers:{altKey:1}, chars:"\u0153", unmodifiedChars:"q"},
   853             nsIDOMKeyEvent.DOM_VK_Q, "\u0153", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   854     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Q,
   855              modifiers:{metaKey:1}, chars:"q", unmodifiedChars:"q"},
   856             nsIDOMKeyEvent.DOM_VK_Q, "q", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   857     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_R,
   858              modifiers:{}, chars:"r", unmodifiedChars:"r"},
   859             nsIDOMKeyEvent.DOM_VK_R, "r", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   860     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_R,
   861              modifiers:{shiftKey:1}, chars:"R", unmodifiedChars:"R"},
   862             nsIDOMKeyEvent.DOM_VK_R, "R", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   863     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_R,
   864              modifiers:{ctrlKey:1}, chars:"\u0012", unmodifiedChars:"r"},
   865             nsIDOMKeyEvent.DOM_VK_R, "r", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   866     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_R,
   867              modifiers:{altKey:1}, chars:"\u00AE", unmodifiedChars:"r"},
   868             nsIDOMKeyEvent.DOM_VK_R, "\u00AE", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   869     // XXX This test makes some tabs and dialogs.
   870     // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_R,
   871     //          modifiers:{metaKey:1}, chars:"r", unmodifiedChars:"r"},
   872     //         nsIDOMKeyEvent.DOM_VK_R, "r", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   873     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_S,
   874              modifiers:{}, chars:"s", unmodifiedChars:"s"},
   875             nsIDOMKeyEvent.DOM_VK_S, "s", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   876     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_S,
   877              modifiers:{shiftKey:1}, chars:"S", unmodifiedChars:"S"},
   878             nsIDOMKeyEvent.DOM_VK_S, "S", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   879     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_S,
   880              modifiers:{ctrlKey:1}, chars:"\u0013", unmodifiedChars:"s"},
   881             nsIDOMKeyEvent.DOM_VK_S, "s", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   882     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_S,
   883              modifiers:{altKey:1}, chars:"\u00DF", unmodifiedChars:"s"},
   884             nsIDOMKeyEvent.DOM_VK_S, "\u00DF", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   885     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_S,
   886              modifiers:{metaKey:1}, chars:"s", unmodifiedChars:"s"},
   887             nsIDOMKeyEvent.DOM_VK_S, "s", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   888     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_T,
   889              modifiers:{}, chars:"t", unmodifiedChars:"t"},
   890             nsIDOMKeyEvent.DOM_VK_T, "t", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   891     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_T,
   892              modifiers:{shiftKey:1}, chars:"T", unmodifiedChars:"T"},
   893             nsIDOMKeyEvent.DOM_VK_T, "T", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   894     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_T,
   895              modifiers:{ctrlKey:1}, chars:"\u0014", unmodifiedChars:"t"},
   896             nsIDOMKeyEvent.DOM_VK_T, "t", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   897     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_T,
   898              modifiers:{altKey:1}, chars:"\u2020", unmodifiedChars:"t"},
   899             nsIDOMKeyEvent.DOM_VK_T, "\u2020", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   900     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_T,
   901              modifiers:{metaKey:1}, chars:"t", unmodifiedChars:"t"},
   902             nsIDOMKeyEvent.DOM_VK_T, "t", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   903     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_U,
   904              modifiers:{}, chars:"u", unmodifiedChars:"u"},
   905             nsIDOMKeyEvent.DOM_VK_U, "u", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   906     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_U,
   907              modifiers:{shiftKey:1}, chars:"U", unmodifiedChars:"U"},
   908             nsIDOMKeyEvent.DOM_VK_U, "U", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   909     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_U,
   910              modifiers:{ctrlKey:1}, chars:"\u0015", unmodifiedChars:"u"},
   911             nsIDOMKeyEvent.DOM_VK_U, "u", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   912     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_U,
   913              modifiers:{altKey:1}, chars:"", unmodifiedChars:"u"},
   914             nsIDOMKeyEvent.DOM_VK_U, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // dead key
   915     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_U,
   916              modifiers:{metaKey:1}, chars:"u", unmodifiedChars:"u"},
   917             nsIDOMKeyEvent.DOM_VK_U, "u", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   918     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_V,
   919              modifiers:{}, chars:"v", unmodifiedChars:"v"},
   920             nsIDOMKeyEvent.DOM_VK_V, "v", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   921     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_V,
   922              modifiers:{shiftKey:1}, chars:"V", unmodifiedChars:"V"},
   923             nsIDOMKeyEvent.DOM_VK_V, "V", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   924     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_V,
   925              modifiers:{ctrlKey:1}, chars:"\u0016", unmodifiedChars:"v"},
   926             nsIDOMKeyEvent.DOM_VK_V, "v", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   927     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_V,
   928              modifiers:{altKey:1}, chars:"\u221A", unmodifiedChars:"v"},
   929             nsIDOMKeyEvent.DOM_VK_V, "\u221A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   930     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_V,
   931              modifiers:{metaKey:1}, chars:"v", unmodifiedChars:"v"},
   932             nsIDOMKeyEvent.DOM_VK_V, "v", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   933     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_W,
   934              modifiers:{}, chars:"w", unmodifiedChars:"w"},
   935             nsIDOMKeyEvent.DOM_VK_W, "w", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   936     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_W,
   937              modifiers:{shiftKey:1}, chars:"W", unmodifiedChars:"W"},
   938             nsIDOMKeyEvent.DOM_VK_W, "W", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   939     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_W,
   940              modifiers:{ctrlKey:1}, chars:"\u0017", unmodifiedChars:"w"},
   941             nsIDOMKeyEvent.DOM_VK_W, "w", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   942     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_W,
   943              modifiers:{altKey:1}, chars:"\u2211", unmodifiedChars:"w"},
   944             nsIDOMKeyEvent.DOM_VK_W, "\u2211", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   945     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_W,
   946              modifiers:{metaKey:1}, chars:"w", unmodifiedChars:"w"},
   947             nsIDOMKeyEvent.DOM_VK_W, "w", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   948     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_X,
   949              modifiers:{}, chars:"x", unmodifiedChars:"x"},
   950             nsIDOMKeyEvent.DOM_VK_X, "x", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   951     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_X,
   952              modifiers:{shiftKey:1}, chars:"X", unmodifiedChars:"X"},
   953             nsIDOMKeyEvent.DOM_VK_X, "X", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   954     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_X,
   955              modifiers:{ctrlKey:1}, chars:"\u0018", unmodifiedChars:"x"},
   956             nsIDOMKeyEvent.DOM_VK_X, "x", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   957     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_X,
   958              modifiers:{altKey:1}, chars:"\u2248", unmodifiedChars:"x"},
   959             nsIDOMKeyEvent.DOM_VK_X, "\u2248", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   960     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_X,
   961              modifiers:{metaKey:1}, chars:"x", unmodifiedChars:"x"},
   962             nsIDOMKeyEvent.DOM_VK_X, "x", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   963     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Y,
   964              modifiers:{}, chars:"y", unmodifiedChars:"y"},
   965             nsIDOMKeyEvent.DOM_VK_Y, "y", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   966     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Y,
   967              modifiers:{shiftKey:1}, chars:"Y", unmodifiedChars:"Y"},
   968             nsIDOMKeyEvent.DOM_VK_Y, "Y", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   969     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Y,
   970              modifiers:{ctrlKey:1}, chars:"\u0019", unmodifiedChars:"y"},
   971             nsIDOMKeyEvent.DOM_VK_Y, "y", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   972     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Y,
   973              modifiers:{altKey:1}, chars:"\u00A5", unmodifiedChars:"y"},
   974             nsIDOMKeyEvent.DOM_VK_Y, "\u00A5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   975     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Y,
   976              modifiers:{metaKey:1}, chars:"y", unmodifiedChars:"y"},
   977             nsIDOMKeyEvent.DOM_VK_Y, "y", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   978     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Z,
   979              modifiers:{}, chars:"z", unmodifiedChars:"z"},
   980             nsIDOMKeyEvent.DOM_VK_Z, "z", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   981     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Z,
   982              modifiers:{shiftKey:1}, chars:"Z", unmodifiedChars:"Z"},
   983             nsIDOMKeyEvent.DOM_VK_Z, "Z", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   984     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Z,
   985              modifiers:{ctrlKey:1}, chars:"\u001A", unmodifiedChars:"z"},
   986             nsIDOMKeyEvent.DOM_VK_Z, "z", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   987     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Z,
   988              modifiers:{altKey:1}, chars:"\u03A9", unmodifiedChars:"z"},
   989             nsIDOMKeyEvent.DOM_VK_Z, "\u03A9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   990     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Z,
   991              modifiers:{metaKey:1}, chars:"z", unmodifiedChars:"z"},
   992             nsIDOMKeyEvent.DOM_VK_Z, "z", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   994     // numeric
   995     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_1,
   996              modifiers:{}, chars:"1", unmodifiedChars:"1"},
   997             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   998     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_1,
   999              modifiers:{shiftKey:1}, chars:"!", unmodifiedChars:"!"},
  1000             nsIDOMKeyEvent.DOM_VK_1, "!", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1001     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_1,
  1002              modifiers:{ctrlKey:1}, chars:"1", unmodifiedChars:"1"},
  1003             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1004     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_1,
  1005              modifiers:{altKey:1}, chars:"\u00A1", unmodifiedChars:"1"},
  1006             nsIDOMKeyEvent.DOM_VK_1, "\u00A1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1007     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_1,
  1008              modifiers:{metaKey:1}, chars:"1", unmodifiedChars:"1"},
  1009             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1010     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_2,
  1011              modifiers:{}, chars:"2", unmodifiedChars:"2"},
  1012             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1013     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_2,
  1014              modifiers:{shiftKey:1}, chars:"@", unmodifiedChars:"@"},
  1015             nsIDOMKeyEvent.DOM_VK_2, "@", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1016     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_2,
  1017              modifiers:{ctrlKey:1}, chars:"2", unmodifiedChars:"2"},
  1018             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1019     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_2,
  1020              modifiers:{altKey:1}, chars:"\u00A1", unmodifiedChars:"2"},
  1021             nsIDOMKeyEvent.DOM_VK_2, "\u00A1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1022     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_2,
  1023              modifiers:{metaKey:1}, chars:"2", unmodifiedChars:"2"},
  1024             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1025     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_3,
  1026              modifiers:{}, chars:"3", unmodifiedChars:"3"},
  1027             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1028     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_3,
  1029              modifiers:{shiftKey:1}, chars:"#", unmodifiedChars:"#"},
  1030             nsIDOMKeyEvent.DOM_VK_3, "#", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1031     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_3,
  1032              modifiers:{ctrlKey:1}, chars:"3", unmodifiedChars:"3"},
  1033             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1034     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_3,
  1035              modifiers:{altKey:1}, chars:"\u00A3", unmodifiedChars:"3"},
  1036             nsIDOMKeyEvent.DOM_VK_3, "\u00A3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1037     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_3,
  1038              modifiers:{metaKey:1}, chars:"3", unmodifiedChars:"3"},
  1039             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1040     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_4,
  1041              modifiers:{}, chars:"4", unmodifiedChars:"4"},
  1042             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1043     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_4,
  1044              modifiers:{shiftKey:1}, chars:"$", unmodifiedChars:"$"},
  1045             nsIDOMKeyEvent.DOM_VK_4, "$", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1046     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_4,
  1047              modifiers:{ctrlKey:1}, chars:"4", unmodifiedChars:"4"},
  1048             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1049     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_4,
  1050              modifiers:{altKey:1}, chars:"\u00A2", unmodifiedChars:"4"},
  1051             nsIDOMKeyEvent.DOM_VK_4, "\u00A2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1052     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_4,
  1053              modifiers:{metaKey:1}, chars:"4", unmodifiedChars:"4"},
  1054             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1055     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_5,
  1056              modifiers:{}, chars:"5", unmodifiedChars:"5"},
  1057             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1058     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_5,
  1059              modifiers:{shiftKey:1}, chars:"%", unmodifiedChars:"%"},
  1060             nsIDOMKeyEvent.DOM_VK_5, "%", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1061     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_5,
  1062              modifiers:{ctrlKey:1}, chars:"5", unmodifiedChars:"5"},
  1063             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1064     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_5,
  1065              modifiers:{altKey:1}, chars:"\u221E", unmodifiedChars:"5"},
  1066             nsIDOMKeyEvent.DOM_VK_5, "\u221E", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1067     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_5,
  1068              modifiers:{metaKey:1}, chars:"5", unmodifiedChars:"5"},
  1069             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1070     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_6,
  1071              modifiers:{}, chars:"6", unmodifiedChars:"6"},
  1072             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1073     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_6,
  1074              modifiers:{shiftKey:1}, chars:"^", unmodifiedChars:"^"},
  1075             nsIDOMKeyEvent.DOM_VK_6, "^", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1076     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_6,
  1077              modifiers:{ctrlKey:1}, chars:"6", unmodifiedChars:"6"},
  1078             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1079     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_6,
  1080              modifiers:{altKey:1}, chars:"\u00A7", unmodifiedChars:"6"},
  1081             nsIDOMKeyEvent.DOM_VK_6, "\u00A7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1082     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_6,
  1083              modifiers:{metaKey:1}, chars:"6", unmodifiedChars:"6"},
  1084             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1085     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_7,
  1086              modifiers:{}, chars:"7", unmodifiedChars:"7"},
  1087             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1088     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_7,
  1089              modifiers:{shiftKey:1}, chars:"\u0026;", unmodifiedChars:"\u0026;"},
  1090             nsIDOMKeyEvent.DOM_VK_7, "\u0026", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1091     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_7,
  1092              modifiers:{ctrlKey:1}, chars:"7", unmodifiedChars:"7"},
  1093             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1094     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_7,
  1095              modifiers:{altKey:1}, chars:"\u00B6", unmodifiedChars:"7"},
  1096             nsIDOMKeyEvent.DOM_VK_7, "\u00B6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1097     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_7,
  1098              modifiers:{metaKey:1}, chars:"7", unmodifiedChars:"7"},
  1099             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1100     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_8,
  1101              modifiers:{}, chars:"8", unmodifiedChars:"8"},
  1102             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1103     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_8,
  1104              modifiers:{shiftKey:1}, chars:"*", unmodifiedChars:"*"},
  1105             nsIDOMKeyEvent.DOM_VK_8, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1106     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_8,
  1107              modifiers:{ctrlKey:1}, chars:"8", unmodifiedChars:"8"},
  1108             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1109     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_8,
  1110              modifiers:{altKey:1}, chars:"\u2022", unmodifiedChars:"8"},
  1111             nsIDOMKeyEvent.DOM_VK_8, "\u2022", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1112     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_8,
  1113              modifiers:{metaKey:1}, chars:"8", unmodifiedChars:"8"},
  1114             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1115     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_9,
  1116              modifiers:{}, chars:"9", unmodifiedChars:"9"},
  1117             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1118     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_9,
  1119              modifiers:{shiftKey:1}, chars:"(", unmodifiedChars:"("},
  1120             nsIDOMKeyEvent.DOM_VK_9, "(", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1121     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_9,
  1122              modifiers:{ctrlKey:1}, chars:"9", unmodifiedChars:"9"},
  1123             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1124     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_9,
  1125              modifiers:{altKey:1}, chars:"\u00AA", unmodifiedChars:"9"},
  1126             nsIDOMKeyEvent.DOM_VK_9, "\u00AA", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1127     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_9,
  1128              modifiers:{metaKey:1}, chars:"9", unmodifiedChars:"9"},
  1129             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1130     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_0,
  1131              modifiers:{}, chars:"0", unmodifiedChars:"0"},
  1132             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1133     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_0,
  1134              modifiers:{shiftKey:1}, chars:")", unmodifiedChars:")"},
  1135             nsIDOMKeyEvent.DOM_VK_0, ")", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1136     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_0,
  1137              modifiers:{ctrlKey:1}, chars:"0", unmodifiedChars:"0"},
  1138             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1139     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_0,
  1140              modifiers:{altKey:1}, chars:"\u00BA", unmodifiedChars:"0"},
  1141             nsIDOMKeyEvent.DOM_VK_0, "\u00BA", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1142     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_0,
  1143              modifiers:{metaKey:1}, chars:"0", unmodifiedChars:"0"},
  1144             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1146     // other chracters
  1147     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Grave,
  1148              modifiers:{}, chars:"`", unmodifiedChars:"`"},
  1149             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "`", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1150     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Grave,
  1151              modifiers:{shiftKey:1}, chars:"~", unmodifiedChars:"~"},
  1152             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "~", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1153     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Grave,
  1154              modifiers:{ctrlKey:1}, chars:"`", unmodifiedChars:"`"},
  1155             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "`", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1156     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Grave,
  1157              modifiers:{altKey:1}, chars:"", unmodifiedChars:"`"},
  1158             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // dead key
  1159     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Grave,
  1160              modifiers:{metaKey:1}, chars:"`", unmodifiedChars:"`"},
  1161             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "`", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1162     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Minus,
  1163              modifiers:{}, chars:"-", unmodifiedChars:"-"},
  1164             nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1165     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Minus,
  1166              modifiers:{shiftKey:1}, chars:"_", unmodifiedChars:"_"},
  1167             nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "_", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1168     // TODO:
  1169     // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Minus,
  1170     //          modifiers:{ctrlKey:1}, chars:"\u001F", unmodifiedChars:"-"},
  1171     //         nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1172     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Minus,
  1173              modifiers:{altKey:1}, chars:"\u2013", unmodifiedChars:"-"},
  1174             nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "\u2013", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1175     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Minus,
  1176              modifiers:{metaKey:1}, chars:"-", unmodifiedChars:"-"},
  1177             nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "-", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1178     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Equal,
  1179              modifiers:{}, chars:"=", unmodifiedChars:"="},
  1180             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1181     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Equal,
  1182              modifiers:{shiftKey:1}, chars:"+", unmodifiedChars:"+"},
  1183             nsIDOMKeyEvent.DOM_VK_EQUALS, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1184     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Equal,
  1185              modifiers:{ctrlKey:1}, chars:"=", unmodifiedChars:"="},
  1186             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1187     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Equal,
  1188              modifiers:{altKey:1}, chars:"\u2260", unmodifiedChars:"="},
  1189             nsIDOMKeyEvent.DOM_VK_EQUALS, "\u2260", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1190     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Equal,
  1191              modifiers:{metaKey:1}, chars:"=", unmodifiedChars:"="},
  1192             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1193     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_LeftBracket,
  1194              modifiers:{}, chars:"[", unmodifiedChars:"["},
  1195             nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "[", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1196     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_LeftBracket,
  1197              modifiers:{shiftKey:1}, chars:"{", unmodifiedChars:"{"},
  1198             nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "{", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1199     // TODO:
  1200     // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_LeftBracket,
  1201     //          modifiers:{ctrlKey:1}, chars:"\u001B", unmodifiedChars:"["},
  1202     //         nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "[", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1203     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_LeftBracket,
  1204              modifiers:{altKey:1}, chars:"\u201C", unmodifiedChars:"["},
  1205             nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "\u201C", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1206     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_LeftBracket,
  1207              modifiers:{metaKey:1}, chars:"[", unmodifiedChars:"["},
  1208             nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "[", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1209     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_RightBracket,
  1210              modifiers:{}, chars:"]", unmodifiedChars:"]"},
  1211             nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "]", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1212     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_RightBracket,
  1213              modifiers:{shiftKey:1}, chars:"}", unmodifiedChars:"}"},
  1214             nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "}", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1215     // TODO:
  1216     // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_RightBracket,
  1217     //          modifiers:{ctrlKey:1}, chars:"\u001D", unmodifiedChars:"]"},
  1218     //         nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "]", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1219     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_RightBracket,
  1220              modifiers:{altKey:1}, chars:"\u2018", unmodifiedChars:"]"},
  1221             nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "\u2018", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1222     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_RightBracket,
  1223              modifiers:{metaKey:1}, chars:"]", unmodifiedChars:"]"},
  1224             nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "]", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1225     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Backslash,
  1226              modifiers:{}, chars:"\\", unmodifiedChars:"\\"},
  1227             nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "\\", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1228     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Backslash,
  1229              modifiers:{shiftKey:1}, chars:"|", unmodifiedChars:"|"},
  1230             nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "|", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1231     // TODO:
  1232     // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Backslash,
  1233     //          modifiers:{ctrlKey:1}, chars:"\u001C", unmodifiedChars:"\\"},
  1234     //         nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "\\", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1235     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Backslash,
  1236              modifiers:{altKey:1}, chars:"\u00AB", unmodifiedChars:"\\"},
  1237             nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "\u00AB", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1238     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Backslash,
  1239              modifiers:{metaKey:1}, chars:"\\", unmodifiedChars:"\\"},
  1240             nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "\\", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1241     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
  1242              modifiers:{}, chars:";", unmodifiedChars:";"},
  1243             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ";", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1244     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
  1245              modifiers:{shiftKey:1}, chars:":", unmodifiedChars:":"},
  1246             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ":", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1247     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
  1248              modifiers:{ctrlKey:1}, chars:";", unmodifiedChars:";"},
  1249             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ";", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1250     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
  1251              modifiers:{altKey:1}, chars:"\u2026", unmodifiedChars:";"},
  1252             nsIDOMKeyEvent.DOM_VK_SEMICOLON, "\u2026", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1253     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
  1254              modifiers:{metaKey:1}, chars:";", unmodifiedChars:";"},
  1255             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ";", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1256     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Quote,
  1257              modifiers:{}, chars:"'", unmodifiedChars:"'"},
  1258             nsIDOMKeyEvent.DOM_VK_QUOTE, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1259     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Quote,
  1260              modifiers:{shiftKey:1}, chars:"\"", unmodifiedChars:"\""},
  1261             nsIDOMKeyEvent.DOM_VK_QUOTE, "\"", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1262     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Quote,
  1263              modifiers:{ctrlKey:1}, chars:"'", unmodifiedChars:"'"},
  1264             nsIDOMKeyEvent.DOM_VK_QUOTE, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1265     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Quote,
  1266              modifiers:{altKey:1}, chars:"\u00E6", unmodifiedChars:"'"},
  1267             nsIDOMKeyEvent.DOM_VK_QUOTE, "\u00E6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1268     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Quote,
  1269              modifiers:{metaKey:1}, chars:"'", unmodifiedChars:"'"},
  1270             nsIDOMKeyEvent.DOM_VK_QUOTE, "'", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1271     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Comma,
  1272              modifiers:{}, chars:",", unmodifiedChars:","},
  1273             nsIDOMKeyEvent.DOM_VK_COMMA, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1274     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Comma,
  1275              modifiers:{shiftKey:1}, chars:"\u003C", unmodifiedChars:"\u003C"},
  1276             nsIDOMKeyEvent.DOM_VK_COMMA, "\u003C", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1277     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Comma,
  1278              modifiers:{ctrlKey:1}, chars:",", unmodifiedChars:","},
  1279             nsIDOMKeyEvent.DOM_VK_COMMA, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1280     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Comma,
  1281              modifiers:{altKey:1}, chars:"\u2264", unmodifiedChars:","},
  1282             nsIDOMKeyEvent.DOM_VK_COMMA, "\u2264", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1283     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Comma,
  1284              modifiers:{metaKey:1}, chars:",", unmodifiedChars:","},
  1285             nsIDOMKeyEvent.DOM_VK_COMMA, ",", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1286     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Period,
  1287              modifiers:{}, chars:".", unmodifiedChars:"."},
  1288             nsIDOMKeyEvent.DOM_VK_PERIOD, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1289     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Period,
  1290              modifiers:{shiftKey:1}, chars:"\u003E", unmodifiedChars:"\u003E"},
  1291             nsIDOMKeyEvent.DOM_VK_PERIOD, "\u003E", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1292     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Period,
  1293              modifiers:{ctrlKey:1}, chars:".", unmodifiedChars:"."},
  1294             nsIDOMKeyEvent.DOM_VK_PERIOD, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1295     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Period,
  1296              modifiers:{altKey:1}, chars:"\u2265", unmodifiedChars:"."},
  1297             nsIDOMKeyEvent.DOM_VK_PERIOD, "\u2265", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1298     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Period,
  1299              modifiers:{metaKey:1}, chars:".", unmodifiedChars:"."},
  1300             nsIDOMKeyEvent.DOM_VK_PERIOD, ".", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1301     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Slash,
  1302              modifiers:{}, chars:"/", unmodifiedChars:"/"},
  1303             nsIDOMKeyEvent.DOM_VK_SLASH, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1304     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Slash,
  1305              modifiers:{shiftKey:1}, chars:"?", unmodifiedChars:"?"},
  1306             nsIDOMKeyEvent.DOM_VK_SLASH, "?", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1307     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Slash,
  1308              modifiers:{ctrlKey:1}, chars:"/", unmodifiedChars:"/"},
  1309             nsIDOMKeyEvent.DOM_VK_SLASH, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1310     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Slash,
  1311              modifiers:{altKey:1}, chars:"\u00F7", unmodifiedChars:"/"},
  1312             nsIDOMKeyEvent.DOM_VK_SLASH, "\u00F7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1313     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Slash,
  1314              modifiers:{metaKey:1}, chars:"/", unmodifiedChars:"/"},
  1315             nsIDOMKeyEvent.DOM_VK_SLASH, "/", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1317     // numpad
  1318     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad1,
  1319              modifiers:{numericKeyPadKey:1}, chars:"1", unmodifiedChars:"1"},
  1320             nsIDOMKeyEvent.DOM_VK_NUMPAD1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1321     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad1,
  1322              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"1", unmodifiedChars:"1"},
  1323             nsIDOMKeyEvent.DOM_VK_NUMPAD1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1324     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad1,
  1325              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"1", unmodifiedChars:"1"},
  1326             nsIDOMKeyEvent.DOM_VK_NUMPAD1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1327     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad1,
  1328              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"1", unmodifiedChars:"1"},
  1329             nsIDOMKeyEvent.DOM_VK_NUMPAD1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1330     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad1,
  1331              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"1", unmodifiedChars:"1"},
  1332             nsIDOMKeyEvent.DOM_VK_NUMPAD1, "1", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1333     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad2,
  1334              modifiers:{numericKeyPadKey:1}, chars:"2", unmodifiedChars:"2"},
  1335             nsIDOMKeyEvent.DOM_VK_NUMPAD2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1336     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad2,
  1337              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"2", unmodifiedChars:"2"},
  1338             nsIDOMKeyEvent.DOM_VK_NUMPAD2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1339     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad2,
  1340              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"2", unmodifiedChars:"2"},
  1341             nsIDOMKeyEvent.DOM_VK_NUMPAD2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1342     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad2,
  1343              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"2", unmodifiedChars:"2"},
  1344             nsIDOMKeyEvent.DOM_VK_NUMPAD2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1345     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad2,
  1346              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"2", unmodifiedChars:"2"},
  1347             nsIDOMKeyEvent.DOM_VK_NUMPAD2, "2", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1348     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad3,
  1349              modifiers:{numericKeyPadKey:1}, chars:"3", unmodifiedChars:"3"},
  1350             nsIDOMKeyEvent.DOM_VK_NUMPAD3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1351     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad3,
  1352              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"3", unmodifiedChars:"3"},
  1353             nsIDOMKeyEvent.DOM_VK_NUMPAD3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1354     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad3,
  1355              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"3", unmodifiedChars:"3"},
  1356             nsIDOMKeyEvent.DOM_VK_NUMPAD3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1357     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad3,
  1358              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"3", unmodifiedChars:"3"},
  1359             nsIDOMKeyEvent.DOM_VK_NUMPAD3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1360     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad3,
  1361              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"3", unmodifiedChars:"3"},
  1362             nsIDOMKeyEvent.DOM_VK_NUMPAD3, "3", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1363     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad4,
  1364              modifiers:{numericKeyPadKey:1}, chars:"4", unmodifiedChars:"4"},
  1365             nsIDOMKeyEvent.DOM_VK_NUMPAD4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1366     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad4,
  1367              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"4", unmodifiedChars:"4"},
  1368             nsIDOMKeyEvent.DOM_VK_NUMPAD4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1369     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad4,
  1370              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"4", unmodifiedChars:"4"},
  1371             nsIDOMKeyEvent.DOM_VK_NUMPAD4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1372     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad4,
  1373              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"4", unmodifiedChars:"4"},
  1374             nsIDOMKeyEvent.DOM_VK_NUMPAD4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1375     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad4,
  1376              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"4", unmodifiedChars:"4"},
  1377             nsIDOMKeyEvent.DOM_VK_NUMPAD4, "4", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1378     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad5,
  1379              modifiers:{numericKeyPadKey:1}, chars:"5", unmodifiedChars:"5"},
  1380             nsIDOMKeyEvent.DOM_VK_NUMPAD5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1381     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad5,
  1382              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"5", unmodifiedChars:"5"},
  1383             nsIDOMKeyEvent.DOM_VK_NUMPAD5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1384     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad5,
  1385              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"5", unmodifiedChars:"5"},
  1386             nsIDOMKeyEvent.DOM_VK_NUMPAD5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1387     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad5,
  1388              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"5", unmodifiedChars:"5"},
  1389             nsIDOMKeyEvent.DOM_VK_NUMPAD5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1390     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad5,
  1391              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"5", unmodifiedChars:"5"},
  1392             nsIDOMKeyEvent.DOM_VK_NUMPAD5, "5", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1393     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad6,
  1394              modifiers:{numericKeyPadKey:1}, chars:"6", unmodifiedChars:"6"},
  1395             nsIDOMKeyEvent.DOM_VK_NUMPAD6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1396     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad6,
  1397              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"6", unmodifiedChars:"6"},
  1398             nsIDOMKeyEvent.DOM_VK_NUMPAD6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1399     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad6,
  1400              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"6", unmodifiedChars:"6"},
  1401             nsIDOMKeyEvent.DOM_VK_NUMPAD6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1402     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad6,
  1403              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"6", unmodifiedChars:"6"},
  1404             nsIDOMKeyEvent.DOM_VK_NUMPAD6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1405     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad6,
  1406              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"6", unmodifiedChars:"6"},
  1407             nsIDOMKeyEvent.DOM_VK_NUMPAD6, "6", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1408     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad7,
  1409              modifiers:{numericKeyPadKey:1}, chars:"7", unmodifiedChars:"7"},
  1410             nsIDOMKeyEvent.DOM_VK_NUMPAD7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1411     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad7,
  1412              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"7", unmodifiedChars:"7"},
  1413             nsIDOMKeyEvent.DOM_VK_NUMPAD7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1414     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad7,
  1415              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"7", unmodifiedChars:"7"},
  1416             nsIDOMKeyEvent.DOM_VK_NUMPAD7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1417     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad7,
  1418              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"7", unmodifiedChars:"7"},
  1419             nsIDOMKeyEvent.DOM_VK_NUMPAD7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1420     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad7,
  1421              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"7", unmodifiedChars:"7"},
  1422             nsIDOMKeyEvent.DOM_VK_NUMPAD7, "7", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1423     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad8,
  1424              modifiers:{numericKeyPadKey:1}, chars:"8", unmodifiedChars:"8"},
  1425             nsIDOMKeyEvent.DOM_VK_NUMPAD8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1426     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad8,
  1427              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"8", unmodifiedChars:"8"},
  1428             nsIDOMKeyEvent.DOM_VK_NUMPAD8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1429     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad8,
  1430              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"8", unmodifiedChars:"8"},
  1431             nsIDOMKeyEvent.DOM_VK_NUMPAD8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1432     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad8,
  1433              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"8", unmodifiedChars:"8"},
  1434             nsIDOMKeyEvent.DOM_VK_NUMPAD8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1435     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad8,
  1436              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"8", unmodifiedChars:"8"},
  1437             nsIDOMKeyEvent.DOM_VK_NUMPAD8, "8", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1438     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad9,
  1439              modifiers:{numericKeyPadKey:1}, chars:"9", unmodifiedChars:"9"},
  1440             nsIDOMKeyEvent.DOM_VK_NUMPAD9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1441     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad9,
  1442              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"9", unmodifiedChars:"9"},
  1443             nsIDOMKeyEvent.DOM_VK_NUMPAD9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1444     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad9,
  1445              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"9", unmodifiedChars:"9"},
  1446             nsIDOMKeyEvent.DOM_VK_NUMPAD9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1447     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad9,
  1448              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"9", unmodifiedChars:"9"},
  1449             nsIDOMKeyEvent.DOM_VK_NUMPAD9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1450     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad9,
  1451              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"9", unmodifiedChars:"9"},
  1452             nsIDOMKeyEvent.DOM_VK_NUMPAD9, "9", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1453     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad0,
  1454              modifiers:{numericKeyPadKey:1}, chars:"0", unmodifiedChars:"0"},
  1455             nsIDOMKeyEvent.DOM_VK_NUMPAD0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1456     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad0,
  1457              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"0", unmodifiedChars:"0"},
  1458             nsIDOMKeyEvent.DOM_VK_NUMPAD0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1459     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad0,
  1460              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"0", unmodifiedChars:"0"},
  1461             nsIDOMKeyEvent.DOM_VK_NUMPAD0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1462     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad0,
  1463              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"0", unmodifiedChars:"0"},
  1464             nsIDOMKeyEvent.DOM_VK_NUMPAD0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1465     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad0,
  1466              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"0", unmodifiedChars:"0"},
  1467             nsIDOMKeyEvent.DOM_VK_NUMPAD0, "0", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1468     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEquals,
  1469              modifiers:{numericKeyPadKey:1}, chars:"=", unmodifiedChars:"="},
  1470             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1471     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEquals,
  1472              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"=", unmodifiedChars:"="},
  1473             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1474     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEquals,
  1475              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"=", unmodifiedChars:"="},
  1476             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1477     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEquals,
  1478              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"=", unmodifiedChars:"="},
  1479             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1480     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEquals,
  1481              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"=", unmodifiedChars:"="},
  1482             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1483     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadDivide,
  1484              modifiers:{numericKeyPadKey:1}, chars:"/", unmodifiedChars:"/"},
  1485             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1486     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadDivide,
  1487              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"/", unmodifiedChars:"/"},
  1488             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1489     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadDivide,
  1490              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"/", unmodifiedChars:"/"},
  1491             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1492     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadDivide,
  1493              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"/", unmodifiedChars:"/"},
  1494             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1495     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadDivide,
  1496              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"/", unmodifiedChars:"/"},
  1497             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1498     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMultiply,
  1499              modifiers:{numericKeyPadKey:1}, chars:"*", unmodifiedChars:"*"},
  1500             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1501     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMultiply,
  1502              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"*", unmodifiedChars:"*"},
  1503             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1504     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMultiply,
  1505              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"*", unmodifiedChars:"*"},
  1506             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1507     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMultiply,
  1508              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"*", unmodifiedChars:"*"},
  1509             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1510     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMultiply,
  1511              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"*", unmodifiedChars:"*"},
  1512             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1513     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMinus,
  1514              modifiers:{numericKeyPadKey:1}, chars:"-", unmodifiedChars:"-"},
  1515             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1516     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMinus,
  1517              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"-", unmodifiedChars:"-"},
  1518             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1519     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMinus,
  1520              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"-", unmodifiedChars:"-"},
  1521             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1522     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMinus,
  1523              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"-", unmodifiedChars:"-"},
  1524             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1525     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMinus,
  1526              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"-", unmodifiedChars:"-"},
  1527             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1528     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadPlus,
  1529              modifiers:{numericKeyPadKey:1}, chars:"+", unmodifiedChars:"+"},
  1530             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1531     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadPlus,
  1532              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"+", unmodifiedChars:"+"},
  1533             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1534     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadPlus,
  1535              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"+", unmodifiedChars:"+"},
  1536             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1537     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadPlus,
  1538              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"+", unmodifiedChars:"+"},
  1539             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1540     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadPlus,
  1541              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"+", unmodifiedChars:"+"},
  1542             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1543     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEnter,
  1544              modifiers:{numericKeyPadKey:1}, chars:"\u0003", unmodifiedChars:"\u0003"},
  1545             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1546     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEnter,
  1547              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"\u0003", unmodifiedChars:"\u0003"},
  1548             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1549     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEnter,
  1550              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"\u0003", unmodifiedChars:"\u0003"},
  1551             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1552     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEnter,
  1553              modifiers:{numericKeyPadKey:1, altKey:1}, chars:"\u0003", unmodifiedChars:"\u0003"},
  1554             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1555     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEnter,
  1556              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"\u0003", unmodifiedChars:"\u0003"},
  1557             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1558     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_JIS_KeypadComma,
  1559              modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:",", unmodifiedChars:","},
  1560             nsIDOMKeyEvent.DOM_VK_SEPARATOR, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1561     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_JIS_KeypadComma,
  1562              modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:",", unmodifiedChars:","},
  1563             nsIDOMKeyEvent.DOM_VK_SEPARATOR, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1564     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_JIS_KeypadComma,
  1565              modifiers:{numericKeyPadKey:1, altKey:1}, chars:",", unmodifiedChars:","},
  1566             nsIDOMKeyEvent.DOM_VK_SEPARATOR, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1567     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_JIS_KeypadComma,
  1568              modifiers:{numericKeyPadKey:1, metaKey:1}, chars:",", unmodifiedChars:","},
  1569             nsIDOMKeyEvent.DOM_VK_SEPARATOR, ",", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  1571     // French, numeric
  1572     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_1,
  1573              modifiers:{}, chars:"\u0026", unmodifiedChars:"\u0026"},
  1574             nsIDOMKeyEvent.DOM_VK_1, "\u0026", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1575     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_1,
  1576              modifiers:{shiftKey:1}, chars:"1", unmodifiedChars:"1"},
  1577             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1578     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_1,
  1579              modifiers:{ctrlKey:1}, chars:"1", unmodifiedChars:"\u0026"},
  1580             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1581     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_1,
  1582              modifiers:{metaKey:1}, chars:"\u0026", unmodifiedChars:"\u0026"},
  1583             nsIDOMKeyEvent.DOM_VK_1, "\u0026", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1584     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_1,
  1585              modifiers:{metaKey:1, shiftKey:1}, chars:"1", unmodifiedChars:"1"},
  1586             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1587     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_2,
  1588              modifiers:{}, chars:"\u00E9", unmodifiedChars:"\u00E9"},
  1589             nsIDOMKeyEvent.DOM_VK_2, "\u00E9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1590     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_2,
  1591              modifiers:{shiftKey:1}, chars:"2", unmodifiedChars:"2"},
  1592             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1593     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_2,
  1594              modifiers:{ctrlKey:1}, chars:"2", unmodifiedChars:"\u00E9"},
  1595             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1596     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_2,
  1597              modifiers:{metaKey:1}, chars:"\u00E9", unmodifiedChars:"\u00E9"},
  1598             nsIDOMKeyEvent.DOM_VK_2, "\u00E9", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1599     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_2,
  1600              modifiers:{metaKey:1, shiftKey:1}, chars:"2", unmodifiedChars:"2"},
  1601             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1602     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_3,
  1603              modifiers:{}, chars:"\"", unmodifiedChars:"\""},
  1604             nsIDOMKeyEvent.DOM_VK_3, "\"", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1605     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_3,
  1606              modifiers:{shiftKey:1}, chars:"3", unmodifiedChars:"3"},
  1607             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1608     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_3,
  1609              modifiers:{ctrlKey:1}, chars:"3", unmodifiedChars:"\""},
  1610             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1611     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_3,
  1612              modifiers:{metaKey:1}, chars:"\"", unmodifiedChars:"\""},
  1613             nsIDOMKeyEvent.DOM_VK_3, "\"", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1614     // Cmd+Shift+3 is a shortcut key of taking a snapshot
  1615     // testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_3,
  1616     //          modifiers:{metaKey:1, shiftKey:1}, chars:"\"", unmodifiedChars:"\""},
  1617     //         nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1618     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_4,
  1619              modifiers:{}, chars:"'", unmodifiedChars:"'"},
  1620             nsIDOMKeyEvent.DOM_VK_4, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1621     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_4,
  1622              modifiers:{shiftKey:1}, chars:"4", unmodifiedChars:"4"},
  1623             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1624     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_4,
  1625              modifiers:{ctrlKey:1}, chars:"4", unmodifiedChars:"'"},
  1626             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1627     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_4,
  1628              modifiers:{metaKey:1}, chars:"'", unmodifiedChars:"'"},
  1629             nsIDOMKeyEvent.DOM_VK_4, "'", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1630     // Cmd+Shift+4 is a shortcut key of taking a snapshot in specific range
  1631     // testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_4,
  1632     //          modifiers:{metaKey:1, shiftKey:1}, chars:"4", unmodifiedChars:"4"},
  1633     //         nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1634     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_5,
  1635              modifiers:{}, chars:"(", unmodifiedChars:"("},
  1636             nsIDOMKeyEvent.DOM_VK_5, "(", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1637     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_5,
  1638              modifiers:{shiftKey:1}, chars:"5", unmodifiedChars:"5"},
  1639             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1640     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_5,
  1641              modifiers:{ctrlKey:1}, chars:"5", unmodifiedChars:"("},
  1642             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1643     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_5,
  1644              modifiers:{metaKey:1}, chars:"(", unmodifiedChars:"("},
  1645             nsIDOMKeyEvent.DOM_VK_5, "(", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1646     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_5,
  1647              modifiers:{metaKey:1, shiftKey:1}, chars:"5", unmodifiedChars:"5"},
  1648             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1649     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_6,
  1650              modifiers:{}, chars:"\u00A7", unmodifiedChars:"\u00A7"},
  1651             nsIDOMKeyEvent.DOM_VK_6, "\u00A7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1652     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_6,
  1653              modifiers:{shiftKey:1}, chars:"6", unmodifiedChars:"6"},
  1654             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1655     // TODO:
  1656     // testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_6,
  1657     //          modifiers:{ctrlKey:1}, chars:"\u001D", unmodifiedChars:"\u00A7"},
  1658     //         nsIDOMKeyEvent.DOM_VK_6, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Ctrl+6 sets strange char
  1659     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_6,
  1660              modifiers:{metaKey:1}, chars:"\u00A7", unmodifiedChars:"\u00A7"},
  1661             nsIDOMKeyEvent.DOM_VK_6, "\u00A7", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1662     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_6,
  1663              modifiers:{metaKey:1, shiftKey:1}, chars:"6", unmodifiedChars:"6"},
  1664             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1665     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_7,
  1666              modifiers:{}, chars:"\u00E8", unmodifiedChars:"\u00E8"},
  1667             nsIDOMKeyEvent.DOM_VK_7, "\u00E8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1668     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_7,
  1669              modifiers:{shiftKey:1}, chars:"7", unmodifiedChars:"7"},
  1670             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1671     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_7,
  1672              modifiers:{ctrlKey:1}, chars:"7", unmodifiedChars:"\u00E8"},
  1673             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1674     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_7,
  1675              modifiers:{metaKey:1}, chars:"\u00E8", unmodifiedChars:"\u00E8"},
  1676             nsIDOMKeyEvent.DOM_VK_7, "\u00E8", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1677     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_7,
  1678              modifiers:{metaKey:1, shiftKey:1}, chars:"7", unmodifiedChars:"7"},
  1679             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1680     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_8,
  1681              modifiers:{}, chars:"!", unmodifiedChars:"!"},
  1682             nsIDOMKeyEvent.DOM_VK_8, "!", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1683     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_8,
  1684              modifiers:{shiftKey:1}, chars:"8", unmodifiedChars:"8"},
  1685             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1686     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_8,
  1687              modifiers:{ctrlKey:1}, chars:"8", unmodifiedChars:"!"},
  1688             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1689     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_8,
  1690              modifiers:{metaKey:1}, chars:"!", unmodifiedChars:"!"},
  1691             nsIDOMKeyEvent.DOM_VK_8, "!", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1692     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_8,
  1693              modifiers:{metaKey:1, shiftKey:1}, chars:"8", unmodifiedChars:"8"},
  1694             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1695     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_9,
  1696              modifiers:{}, chars:"\u00E7", unmodifiedChars:"\u00E7"},
  1697             nsIDOMKeyEvent.DOM_VK_9, "\u00E7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1698     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_9,
  1699              modifiers:{shiftKey:1}, chars:"9", unmodifiedChars:"9"},
  1700             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1701     // TODO:
  1702     // testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_9,
  1703     //          modifiers:{ctrlKey:1}, chars:"\u001C", unmodifiedChars:"\u00E7"},
  1704     //         nsIDOMKeyEvent.DOM_VK_9, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Ctrl+9 sets strange char
  1705     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_9,
  1706              modifiers:{metaKey:1}, chars:"\u00E7", unmodifiedChars:"\u00E7"},
  1707             nsIDOMKeyEvent.DOM_VK_9, "\u00E7", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1708     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_9,
  1709              modifiers:{metaKey:1, shiftKey:1}, chars:"9", unmodifiedChars:"9"},
  1710             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1711     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_0,
  1712              modifiers:{}, chars:"\u00E0", unmodifiedChars:"\u00E0"},
  1713             nsIDOMKeyEvent.DOM_VK_0, "\u00E0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1714     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_0,
  1715              modifiers:{shiftKey:1}, chars:"0", unmodifiedChars:"0"},
  1716             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1717     // XXX No events fired, not sure the reason.
  1718     // testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_0,
  1719     //          modifiers:{ctrlKey:1}, chars:"", unmodifiedChars:"\u00E0"},
  1720     //         nsIDOMKeyEvent.DOM_VK_0, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1721     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_0,
  1722              modifiers:{metaKey:1}, chars:"\u00E0", unmodifiedChars:"\u00E0"},
  1723             nsIDOMKeyEvent.DOM_VK_0, "\u00E0", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1724     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_0,
  1725              modifiers:{metaKey:1, shiftKey:1}, chars:"0", unmodifiedChars:"0"},
  1726             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1728     // Thai
  1729     // keycode should be DOM_VK_[A-Z] of the key on the latest ASCII capable keyboard layout is for alphabet
  1730     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_A,
  1731              modifiers:{}, chars:"\u0E1F", unmodifiedChars:"\u0E1F"},
  1732             nsIDOMKeyEvent.DOM_VK_A, "\u0E1F", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1733     // keycode should be shifted character if unshifted character isn't an ASCII character
  1734     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_Quote,
  1735              modifiers:{}, chars:"\u0E07", unmodifiedChars:"\u0E07"},
  1736             nsIDOMKeyEvent.DOM_VK_PERIOD, "\u0E07", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1737     // keycode should be zero if the character of the key on the latest ASCII capable keyboard layout isn't for alphabet
  1738     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_Period,
  1739              modifiers:{}, chars:"\u0E43", unmodifiedChars:"\u0E43"},
  1740             0, "\u0E43", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1741     // keycode should be DOM_VK_[0-9] if the key on the latest ASCII capable keyboard layout is for numeric
  1742     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_1,
  1743              modifiers:{}, chars:"\u0E45", unmodifiedChars:"\u0E45"},
  1744             nsIDOMKeyEvent.DOM_VK_1, "\u0E45", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1745     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_2,
  1746              modifiers:{}, chars:"/", unmodifiedChars:"/"},
  1747             nsIDOMKeyEvent.DOM_VK_2, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1748     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_3,
  1749              modifiers:{}, chars:"_", unmodifiedChars:"_"},
  1750             nsIDOMKeyEvent.DOM_VK_3, "_", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1751     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_4,
  1752              modifiers:{}, chars:"\u0E20", unmodifiedChars:"\u0E20"},
  1753             nsIDOMKeyEvent.DOM_VK_4, "\u0E20", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1754     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_5,
  1755              modifiers:{}, chars:"\u0E16", unmodifiedChars:"\u0E16"},
  1756             nsIDOMKeyEvent.DOM_VK_5, "\u0E16", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1757     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_6,
  1758              modifiers:{}, chars:"\u0E38", unmodifiedChars:"\u0E38"},
  1759             nsIDOMKeyEvent.DOM_VK_6, "\u0E38", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1760     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_7,
  1761              modifiers:{}, chars:"\u0E36", unmodifiedChars:"\u0E36"},
  1762             nsIDOMKeyEvent.DOM_VK_7, "\u0E36", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1763     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_8,
  1764              modifiers:{}, chars:"\u0E04", unmodifiedChars:"\u0E04"},
  1765             nsIDOMKeyEvent.DOM_VK_8, "\u0E04", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1766     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_9,
  1767              modifiers:{}, chars:"\u0E15", unmodifiedChars:"\u0E15"},
  1768             nsIDOMKeyEvent.DOM_VK_9, "\u0E15", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1769     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_0,
  1770              modifiers:{}, chars:"\u0E08", unmodifiedChars:"\u0E08"},
  1771             nsIDOMKeyEvent.DOM_VK_0, "\u0E08", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1773     // Dvorak-Qwerty, layout should be changed when Command key is pressed.
  1774     testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_S,
  1775              modifiers:{}, chars:"o", unmodifiedChars:"o"},
  1776             nsIDOMKeyEvent.DOM_VK_O, "o", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1777     testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_S,
  1778              modifiers:{shiftKey:1}, chars:"O", unmodifiedChars:"O"},
  1779             nsIDOMKeyEvent.DOM_VK_O, "O", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1780     testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_S,
  1781              modifiers:{ctrlKey:1}, chars:"\u000F", unmodifiedChars:"o"},
  1782             nsIDOMKeyEvent.DOM_VK_O, "o", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1783     testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_S,
  1784              modifiers:{altKey:1}, chars:"\u00F8", unmodifiedChars:"o"},
  1785             nsIDOMKeyEvent.DOM_VK_O, "\u00F8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1786     testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_S,
  1787              modifiers:{metaKey:1}, chars:"s", unmodifiedChars:"o"},
  1788             nsIDOMKeyEvent.DOM_VK_S, "s", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1789     testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_D,
  1790              modifiers:{}, chars:"e", unmodifiedChars:"e"},
  1791             nsIDOMKeyEvent.DOM_VK_E, "e", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1792     testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_D,
  1793              modifiers:{shiftKey:1}, chars:"E", unmodifiedChars:"E"},
  1794             nsIDOMKeyEvent.DOM_VK_E, "E", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1795     testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_D,
  1796              modifiers:{ctrlKey:1}, chars:"\u0005", unmodifiedChars:"e"},
  1797             nsIDOMKeyEvent.DOM_VK_E, "e", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1798     testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_D,
  1799              modifiers:{altKey:1}, chars:"", unmodifiedChars:"e"},
  1800             nsIDOMKeyEvent.DOM_VK_E, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // dead key
  1801     testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_D,
  1802              modifiers:{metaKey:1}, chars:"d", unmodifiedChars:"e"},
  1803             nsIDOMKeyEvent.DOM_VK_D, "d", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1804     testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_I,
  1805              modifiers:{metaKey:1, altKey:1}, chars:"^", unmodifiedChars:"c"},
  1806             nsIDOMKeyEvent.DOM_VK_I, "^", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1807     testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_I,
  1808              modifiers:{metaKey:1, altKey:1, shiftKey:1}, chars:"\u02C6", unmodifiedChars:"C"},
  1809             nsIDOMKeyEvent.DOM_VK_I, "\u02C6", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1810   } else if (IS_WIN) {
  1811     // On Windows, you can use Spy++ or Winspector (free) to watch window messages.
  1812     // The keyCode is given by the wParam of the last WM_KEYDOWN message. The
  1813     // chars string is given by the wParam of the WM_CHAR message. unmodifiedChars
  1814     // is not needed on Windows.
  1816     // Plain text input
  1817     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  1818              modifiers:{}, chars:"a"},
  1819             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1820     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_B,
  1821              modifiers:{}, chars:"b"},
  1822             nsIDOMKeyEvent.DOM_VK_B, "b", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1823     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  1824              modifiers:{shiftKey:1}, chars:"A"},
  1825             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1827     // Ctrl keys
  1828     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  1829              modifiers:{ctrlKey:1}, chars:"\u0001"},
  1830             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1831     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  1832              modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0001"},
  1833             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1835     // Alt keys
  1836     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  1837              modifiers:{altKey:1}, chars:"a"},
  1838             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1839     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  1840              modifiers:{altKey:1, shiftKey:1}, chars:"A"},
  1841             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1843     // Shift-ctrl-alt generates no WM_CHAR, but we still get a keypress
  1844     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  1845              modifiers:{altKey:1, ctrlKey:1, shiftKey:1}, chars:""},
  1846             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1848     // Greek plain text
  1849     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
  1850              modifiers:{}, chars:"\u03b1"},
  1851             nsIDOMKeyEvent.DOM_VK_A, "\u03b1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1852     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
  1853              modifiers:{shiftKey:1}, chars:"\u0391"},
  1854             nsIDOMKeyEvent.DOM_VK_A, "\u0391", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1856     // Greek ctrl keys produce Latin charcodes
  1857     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
  1858              modifiers:{ctrlKey:1}, chars:"\u0001"},
  1859             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1860     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
  1861              modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0001"},
  1862             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1864     // Caps Lock key event
  1865     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_CAPITAL,
  1866              modifiers:{capsLockKey:1}, chars:""},
  1867             nsIDOMKeyEvent.DOM_VK_CAPS_LOCK, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1868     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_CAPITAL,
  1869              modifiers:{capsLockKey:0}, chars:""},
  1870             nsIDOMKeyEvent.DOM_VK_CAPS_LOCK, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1872     // Shift keys
  1873     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_LSHIFT,
  1874              modifiers:{shiftKey:1}, chars:""},
  1875             nsIDOMKeyEvent.DOM_VK_SHIFT, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
  1876     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_RSHIFT,
  1877              modifiers:{shiftRightKey:1}, chars:""},
  1878             nsIDOMKeyEvent.DOM_VK_SHIFT, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
  1880     // Ctrl keys
  1881     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_LCONTROL,
  1882              modifiers:{ctrlKey:1}, chars:""},
  1883             nsIDOMKeyEvent.DOM_VK_CONTROL, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
  1884     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_RCONTROL,
  1885              modifiers:{ctrlRightKey:1}, chars:""},
  1886             nsIDOMKeyEvent.DOM_VK_CONTROL, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
  1888     // Alt keys
  1889     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_LMENU,
  1890              modifiers:{altKey:1}, chars:""},
  1891             nsIDOMKeyEvent.DOM_VK_ALT, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
  1892     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_RMENU,
  1893              modifiers:{altRightKey:1}, chars:""},
  1894             nsIDOMKeyEvent.DOM_VK_ALT, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
  1896     // Win keys
  1897     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_LWIN,
  1898              modifiers:{}, chars:""},
  1899             nsIDOMKeyEvent.DOM_VK_WIN, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
  1900     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_RWIN,
  1901              modifiers:{}, chars:""},
  1902             nsIDOMKeyEvent.DOM_VK_WIN, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
  1904     // all keys on keyboard (keyCode test)
  1905     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_BACK,
  1906              modifiers:{}, chars:"\u0008"},
  1907             nsIDOMKeyEvent.DOM_VK_BACK_SPACE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1908     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_TAB,
  1909              modifiers:{}, chars:"\t"},
  1910             nsIDOMKeyEvent.DOM_VK_TAB, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1911     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_RETURN,
  1912              modifiers:{}, chars:"\r"},
  1913             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1914     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_PAUSE,
  1915              modifiers:{}, chars:""},
  1916             nsIDOMKeyEvent.DOM_VK_PAUSE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1917     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_KANA,
  1918              modifiers:{}, chars:""},
  1919             nsIDOMKeyEvent.DOM_VK_KANA, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1920     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_JUNJA,
  1921              modifiers:{}, chars:""},
  1922             nsIDOMKeyEvent.DOM_VK_JUNJA, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1923     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_FINAL,
  1924              modifiers:{}, chars:""},
  1925             nsIDOMKeyEvent.DOM_VK_FINAL, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1926     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_KANJI,
  1927              modifiers:{}, chars:""},
  1928             nsIDOMKeyEvent.DOM_VK_KANJI, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1929     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_ESCAPE,
  1930              modifiers:{}, chars:""},
  1931             nsIDOMKeyEvent.DOM_VK_ESCAPE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1932     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_CONVERT,
  1933              modifiers:{}, chars:""},
  1934             nsIDOMKeyEvent.DOM_VK_CONVERT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1935     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NONCONVERT,
  1936              modifiers:{}, chars:""},
  1937             nsIDOMKeyEvent.DOM_VK_NONCONVERT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1938     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_ACCEPT,
  1939              modifiers:{}, chars:""},
  1940             nsIDOMKeyEvent.DOM_VK_ACCEPT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1941     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_MODECHANGE,
  1942              modifiers:{}, chars:""},
  1943             nsIDOMKeyEvent.DOM_VK_MODECHANGE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1944     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SPACE,
  1945              modifiers:{}, chars:" "},
  1946             nsIDOMKeyEvent.DOM_VK_SPACE, " ", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1947     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SELECT,
  1948              modifiers:{}, chars:""},
  1949             nsIDOMKeyEvent.DOM_VK_SELECT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1950     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_PRINT,
  1951              modifiers:{}, chars:""},
  1952             nsIDOMKeyEvent.DOM_VK_PRINT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1953     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_EXECUTE,
  1954              modifiers:{}, chars:""},
  1955             nsIDOMKeyEvent.DOM_VK_EXECUTE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1956     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SNAPSHOT,
  1957              modifiers:{}, chars:""},
  1958             nsIDOMKeyEvent.DOM_VK_PRINTSCREEN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1959     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_HELP,
  1960              modifiers:{}, chars:""},
  1961             nsIDOMKeyEvent.DOM_VK_HELP, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1962     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SLEEP,
  1963              modifiers:{}, chars:""},
  1964             nsIDOMKeyEvent.DOM_VK_SLEEP, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1965     // XXX TODO: we cannot test Home, Up, PageUp, Left, Right, End, Down, PageDown, Ins and Del.
  1967     // US
  1968     // Alphabet
  1969     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  1970              modifiers:{}, chars:"a"},
  1971             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1972     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  1973              modifiers:{shiftKey:1}, chars:"A"},
  1974             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1975     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_B,
  1976              modifiers:{}, chars:"b"},
  1977             nsIDOMKeyEvent.DOM_VK_B, "b", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1978     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_B,
  1979              modifiers:{shiftKey:1}, chars:"B"},
  1980             nsIDOMKeyEvent.DOM_VK_B, "B", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1981     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_C,
  1982              modifiers:{}, chars:"c"},
  1983             nsIDOMKeyEvent.DOM_VK_C, "c", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1984     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_C,
  1985              modifiers:{shiftKey:1}, chars:"C"},
  1986             nsIDOMKeyEvent.DOM_VK_C, "C", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1987     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_D,
  1988              modifiers:{}, chars:"d"},
  1989             nsIDOMKeyEvent.DOM_VK_D, "d", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1990     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_D,
  1991              modifiers:{shiftKey:1}, chars:"D"},
  1992             nsIDOMKeyEvent.DOM_VK_D, "D", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1993     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_E,
  1994              modifiers:{}, chars:"e"},
  1995             nsIDOMKeyEvent.DOM_VK_E, "e", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1996     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_E,
  1997              modifiers:{shiftKey:1}, chars:"E"},
  1998             nsIDOMKeyEvent.DOM_VK_E, "E", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  1999     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_F,
  2000              modifiers:{}, chars:"f"},
  2001             nsIDOMKeyEvent.DOM_VK_F, "f", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2002     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_F,
  2003              modifiers:{shiftKey:1}, chars:"F"},
  2004             nsIDOMKeyEvent.DOM_VK_F, "F", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2005     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_G,
  2006              modifiers:{}, chars:"g"},
  2007             nsIDOMKeyEvent.DOM_VK_G, "g", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2008     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_G,
  2009              modifiers:{shiftKey:1}, chars:"G"},
  2010             nsIDOMKeyEvent.DOM_VK_G, "G", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2011     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_H,
  2012              modifiers:{}, chars:"h"},
  2013             nsIDOMKeyEvent.DOM_VK_H, "h", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2014     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_H,
  2015              modifiers:{shiftKey:1}, chars:"H"},
  2016             nsIDOMKeyEvent.DOM_VK_H, "H", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2017     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_I,
  2018              modifiers:{}, chars:"i"},
  2019             nsIDOMKeyEvent.DOM_VK_I, "i", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2020     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_I,
  2021              modifiers:{shiftKey:1}, chars:"I"},
  2022             nsIDOMKeyEvent.DOM_VK_I, "I", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2023     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_J,
  2024              modifiers:{}, chars:"j"},
  2025             nsIDOMKeyEvent.DOM_VK_J, "j", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2026     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_J,
  2027              modifiers:{shiftKey:1}, chars:"J"},
  2028             nsIDOMKeyEvent.DOM_VK_J, "J", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2029     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_K,
  2030              modifiers:{}, chars:"k"},
  2031             nsIDOMKeyEvent.DOM_VK_K, "k", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2032     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_K,
  2033              modifiers:{shiftKey:1}, chars:"K"},
  2034             nsIDOMKeyEvent.DOM_VK_K, "K", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2035     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_L,
  2036              modifiers:{}, chars:"l"},
  2037             nsIDOMKeyEvent.DOM_VK_L, "l", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2038     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_L,
  2039              modifiers:{shiftKey:1}, chars:"L"},
  2040             nsIDOMKeyEvent.DOM_VK_L, "L", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2041     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_M,
  2042              modifiers:{}, chars:"m"},
  2043             nsIDOMKeyEvent.DOM_VK_M, "m", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2044     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_M,
  2045              modifiers:{shiftKey:1}, chars:"M"},
  2046             nsIDOMKeyEvent.DOM_VK_M, "M", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2047     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_N,
  2048              modifiers:{}, chars:"n"},
  2049             nsIDOMKeyEvent.DOM_VK_N, "n", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2050     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_N,
  2051              modifiers:{shiftKey:1}, chars:"N"},
  2052             nsIDOMKeyEvent.DOM_VK_N, "N", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2053     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_O,
  2054              modifiers:{}, chars:"o"},
  2055             nsIDOMKeyEvent.DOM_VK_O, "o", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2056     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_O,
  2057              modifiers:{shiftKey:1}, chars:"O"},
  2058             nsIDOMKeyEvent.DOM_VK_O, "O", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2059     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_P,
  2060              modifiers:{}, chars:"p"},
  2061             nsIDOMKeyEvent.DOM_VK_P, "p", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2062     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_P,
  2063              modifiers:{shiftKey:1}, chars:"P"},
  2064             nsIDOMKeyEvent.DOM_VK_P, "P", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2065     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_Q,
  2066              modifiers:{}, chars:"q"},
  2067             nsIDOMKeyEvent.DOM_VK_Q, "q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2068     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_Q,
  2069              modifiers:{shiftKey:1}, chars:"Q"},
  2070             nsIDOMKeyEvent.DOM_VK_Q, "Q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2071     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_R,
  2072              modifiers:{}, chars:"r"},
  2073             nsIDOMKeyEvent.DOM_VK_R, "r", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2074     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_R,
  2075              modifiers:{shiftKey:1}, chars:"R"},
  2076             nsIDOMKeyEvent.DOM_VK_R, "R", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2077     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_S,
  2078              modifiers:{}, chars:"s"},
  2079             nsIDOMKeyEvent.DOM_VK_S, "s", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2080     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_S,
  2081              modifiers:{shiftKey:1}, chars:"S"},
  2082             nsIDOMKeyEvent.DOM_VK_S, "S", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2083     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_T,
  2084              modifiers:{}, chars:"t"},
  2085             nsIDOMKeyEvent.DOM_VK_T, "t", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2086     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_T,
  2087              modifiers:{shiftKey:1}, chars:"T"},
  2088             nsIDOMKeyEvent.DOM_VK_T, "T", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2089     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_U,
  2090              modifiers:{}, chars:"u"},
  2091             nsIDOMKeyEvent.DOM_VK_U, "u", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2092     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_U,
  2093              modifiers:{shiftKey:1}, chars:"U"},
  2094             nsIDOMKeyEvent.DOM_VK_U, "U", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2095     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_V,
  2096              modifiers:{}, chars:"v"},
  2097             nsIDOMKeyEvent.DOM_VK_V, "v", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2098     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_V,
  2099              modifiers:{shiftKey:1}, chars:"V"},
  2100             nsIDOMKeyEvent.DOM_VK_V, "V", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2101     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_W,
  2102              modifiers:{}, chars:"w"},
  2103             nsIDOMKeyEvent.DOM_VK_W, "w", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2104     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_W,
  2105              modifiers:{shiftKey:1}, chars:"W"},
  2106             nsIDOMKeyEvent.DOM_VK_W, "W", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2107     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_X,
  2108              modifiers:{}, chars:"x"},
  2109             nsIDOMKeyEvent.DOM_VK_X, "x", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2110     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_X,
  2111              modifiers:{shiftKey:1}, chars:"X"},
  2112             nsIDOMKeyEvent.DOM_VK_X, "X", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2113     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_Y,
  2114              modifiers:{}, chars:"y"},
  2115             nsIDOMKeyEvent.DOM_VK_Y, "y", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2116     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_Y,
  2117              modifiers:{shiftKey:1}, chars:"Y"},
  2118             nsIDOMKeyEvent.DOM_VK_Y, "Y", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2119     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_Z,
  2120              modifiers:{}, chars:"z"},
  2121             nsIDOMKeyEvent.DOM_VK_Z, "z", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2122     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_Z,
  2123              modifiers:{shiftKey:1}, chars:"Z"},
  2124             nsIDOMKeyEvent.DOM_VK_Z, "Z", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2126     // Numeric
  2127     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_0,
  2128              modifiers:{}, chars:"0"},
  2129             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2130     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_0,
  2131              modifiers:{shiftKey:1}, chars:")"},
  2132             nsIDOMKeyEvent.DOM_VK_0, ")", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2133     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_1,
  2134              modifiers:{}, chars:"1"},
  2135             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2136     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_1,
  2137              modifiers:{shiftKey:1}, chars:"!"},
  2138             nsIDOMKeyEvent.DOM_VK_1, "!", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2139     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_2,
  2140              modifiers:{}, chars:"2"},
  2141             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2142     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_2,
  2143              modifiers:{shiftKey:1}, chars:"@"},
  2144             nsIDOMKeyEvent.DOM_VK_2, "@", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2145     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_3,
  2146              modifiers:{}, chars:"3"},
  2147             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2148     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_3,
  2149              modifiers:{shiftKey:1}, chars:"#"},
  2150             nsIDOMKeyEvent.DOM_VK_3, "#", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2151     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_4,
  2152              modifiers:{}, chars:"4"},
  2153             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2154     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_4,
  2155              modifiers:{shiftKey:1}, chars:"$"},
  2156             nsIDOMKeyEvent.DOM_VK_4, "$", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2157     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_5,
  2158              modifiers:{}, chars:"5"},
  2159             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2160     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_5,
  2161              modifiers:{shiftKey:1}, chars:"%"},
  2162             nsIDOMKeyEvent.DOM_VK_5, "%", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2163     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_6,
  2164              modifiers:{}, chars:"6"},
  2165             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2166     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_6,
  2167              modifiers:{shiftKey:1}, chars:"^"},
  2168             nsIDOMKeyEvent.DOM_VK_6, "^", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2169     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_7,
  2170              modifiers:{}, chars:"7"},
  2171             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2172     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_7,
  2173              modifiers:{shiftKey:1}, chars:"&"},
  2174             nsIDOMKeyEvent.DOM_VK_7, "&", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2175     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_8,
  2176              modifiers:{}, chars:"8"},
  2177             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2178     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_8,
  2179              modifiers:{shiftKey:1}, chars:"*"},
  2180             nsIDOMKeyEvent.DOM_VK_8, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2181     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_9,
  2182              modifiers:{}, chars:"9"},
  2183             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2184     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_9,
  2185              modifiers:{shiftKey:1}, chars:"("},
  2186             nsIDOMKeyEvent.DOM_VK_9, "(", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2188     // OEM keys
  2189     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_MINUS,
  2190              modifiers:{}, chars:"-"},
  2191             nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2192     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_MINUS,
  2193              modifiers:{shiftKey:1}, chars:"_"},
  2194             nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "_", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2195     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_PLUS,
  2196              modifiers:{}, chars:"="},
  2197             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2198     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_PLUS,
  2199              modifiers:{shiftKey:1}, chars:"+"},
  2200             nsIDOMKeyEvent.DOM_VK_EQUALS, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2201     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_4,
  2202              modifiers:{}, chars:"["},
  2203             nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "[", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2204     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_4,
  2205              modifiers:{shiftKey:1}, chars:"{"},
  2206             nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "{", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2207     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_6,
  2208              modifiers:{}, chars:"]"},
  2209             nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "]", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2210     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_6,
  2211              modifiers:{shiftKey:1}, chars:"}"},
  2212             nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "}", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2213     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_1,
  2214              modifiers:{}, chars:";"},
  2215             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ";", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2216     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_1,
  2217              modifiers:{shiftKey:1}, chars:":"},
  2218             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ":", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2219     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_7,
  2220              modifiers:{}, chars:"'"},
  2221             nsIDOMKeyEvent.DOM_VK_QUOTE, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2222     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_7,
  2223              modifiers:{shiftKey:1}, chars:"\""},
  2224             nsIDOMKeyEvent.DOM_VK_QUOTE, "\"", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2225     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_5,
  2226              modifiers:{}, chars:"\\"},
  2227             nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "\\", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2228     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_5,
  2229              modifiers:{shiftKey:1}, chars:"|"},
  2230             nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "|", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2231     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_COMMA,
  2232              modifiers:{}, chars:","},
  2233             nsIDOMKeyEvent.DOM_VK_COMMA, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2234     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_COMMA,
  2235              modifiers:{shiftKey:1}, chars:"<"},
  2236             nsIDOMKeyEvent.DOM_VK_COMMA, "<", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2237     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_PERIOD,
  2238              modifiers:{}, chars:"."},
  2239             nsIDOMKeyEvent.DOM_VK_PERIOD, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2240     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_PERIOD,
  2241              modifiers:{shiftKey:1}, chars:">"},
  2242             nsIDOMKeyEvent.DOM_VK_PERIOD, ">", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2243     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_2,
  2244              modifiers:{}, chars:"/"},
  2245             nsIDOMKeyEvent.DOM_VK_SLASH, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2246     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_2,
  2247              modifiers:{shiftKey:1}, chars:"?"},
  2248             nsIDOMKeyEvent.DOM_VK_SLASH, "?", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2249     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_3,
  2250              modifiers:{}, chars:"`"},
  2251             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "`", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2252     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_3,
  2253              modifiers:{shiftKey:1}, chars:"~"},
  2254             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "~", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2256     // Numpad
  2257     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD0,
  2258              modifiers:{numLockKey:1}, chars:"0"},
  2259             nsIDOMKeyEvent.DOM_VK_NUMPAD0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2260     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD1,
  2261              modifiers:{numLockKey:1}, chars:"1"},
  2262             nsIDOMKeyEvent.DOM_VK_NUMPAD1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2263     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD2,
  2264              modifiers:{numLockKey:1}, chars:"2"},
  2265             nsIDOMKeyEvent.DOM_VK_NUMPAD2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2266     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD3,
  2267              modifiers:{numLockKey:1}, chars:"3"},
  2268             nsIDOMKeyEvent.DOM_VK_NUMPAD3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2269     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD4,
  2270              modifiers:{numLockKey:1}, chars:"4"},
  2271             nsIDOMKeyEvent.DOM_VK_NUMPAD4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2272     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD5,
  2273              modifiers:{numLockKey:1}, chars:"5"},
  2274             nsIDOMKeyEvent.DOM_VK_NUMPAD5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2275     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD6,
  2276              modifiers:{numLockKey:1}, chars:"6"},
  2277             nsIDOMKeyEvent.DOM_VK_NUMPAD6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2278     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD7,
  2279              modifiers:{numLockKey:1}, chars:"7"},
  2280             nsIDOMKeyEvent.DOM_VK_NUMPAD7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2281     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD8,
  2282              modifiers:{numLockKey:1}, chars:"8"},
  2283             nsIDOMKeyEvent.DOM_VK_NUMPAD8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2284     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD9,
  2285              modifiers:{numLockKey:1}, chars:"9"},
  2286             nsIDOMKeyEvent.DOM_VK_NUMPAD9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2288     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_MULTIPLY,
  2289              modifiers:{numLockKey:1}, chars:"*"},
  2290             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2291     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_MULTIPLY,
  2292              modifiers:{numLockKey:1, shiftKey:1}, chars:"*"},
  2293             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2294     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_ADD,
  2295              modifiers:{numLockKey:1}, chars:"+"},
  2296             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2297     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_ADD,
  2298              modifiers:{numLockKey:1, shiftKey:1}, chars:"+"},
  2299             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2300     // VK_SEPARATOR is keycode for NEC's PC-98 series whose keyboard layout was
  2301     // different from current PC's keyboard layout and it cannot connect to
  2302     // current PC.  Note that even if we synthesize WM_KEYDOWN with
  2303     // VK_SEPARATOR, it doesn't work on Win7.
  2304     //testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SEPARATOR,
  2305     //         modifiers:{numLockKey:1}, chars:""},
  2306     //        nsIDOMKeyEvent.DOM_VK_SEPARATOR, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2307     //testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SEPARATOR,
  2308     //         modifiers:{numLockKey:1, shiftKey:1}, chars:""},
  2309     //        nsIDOMKeyEvent.DOM_VK_SEPARATOR, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2310     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SUBTRACT,
  2311              modifiers:{numLockKey:1}, chars:"-"},
  2312             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2313     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SUBTRACT,
  2314              modifiers:{numLockKey:1, shiftKey:1}, chars:"-"},
  2315             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2316     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_DECIMAL,
  2317              modifiers:{numLockKey:1}, chars:"."},
  2318             nsIDOMKeyEvent.DOM_VK_DECIMAL, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2319     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_DECIMAL,
  2320              modifiers:{numLockKey:1, shiftKey:1}, chars:"."},
  2321             nsIDOMKeyEvent.DOM_VK_DECIMAL, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2322     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_DIVIDE,
  2323              modifiers:{numLockKey:1}, chars:"/"},
  2324             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2325     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_DIVIDE,
  2326              modifiers:{numLockKey:1, shiftKey:1}, chars:"/"},
  2327             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2329     // Numpad without NumLock
  2330     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_PRIOR,
  2331              modifiers:{}, chars:""},
  2332             nsIDOMKeyEvent.DOM_VK_PAGE_UP, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2333     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NEXT,
  2334              modifiers:{}, chars:""},
  2335             nsIDOMKeyEvent.DOM_VK_PAGE_DOWN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2336     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_END,
  2337              modifiers:{}, chars:""},
  2338             nsIDOMKeyEvent.DOM_VK_END, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2339     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_HOME,
  2340              modifiers:{}, chars:""},
  2341             nsIDOMKeyEvent.DOM_VK_HOME, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2342     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_LEFT,
  2343              modifiers:{}, chars:""},
  2344             nsIDOMKeyEvent.DOM_VK_LEFT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2345     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_UP,
  2346              modifiers:{}, chars:""},
  2347             nsIDOMKeyEvent.DOM_VK_UP, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2348     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_RIGHT,
  2349              modifiers:{}, chars:""},
  2350             nsIDOMKeyEvent.DOM_VK_RIGHT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2351     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_DOWN,
  2352              modifiers:{}, chars:""},
  2353             nsIDOMKeyEvent.DOM_VK_DOWN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2354     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_INSERT,
  2355              modifiers:{}, chars:""},
  2356             nsIDOMKeyEvent.DOM_VK_INSERT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2357     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_DELETE,
  2358              modifiers:{}, chars:""},
  2359             nsIDOMKeyEvent.DOM_VK_DELETE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2360     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_CLEAR,
  2361              modifiers:{}, chars:""},
  2362             nsIDOMKeyEvent.DOM_VK_CLEAR, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2364     // Even if widget receives unknown keycode, it should dispatch key events
  2365     // whose keycode is 0 rather than native keycode.
  2366     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:0x3A,
  2367              modifiers:{numLockKey:1}, chars:""},
  2368             0, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2370     // French
  2371     // Numeric
  2372     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_0,
  2373              modifiers:{}, chars:"\u00E0"},
  2374             nsIDOMKeyEvent.DOM_VK_0, "\u00E0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2375     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_0,
  2376              modifiers:{shiftKey:1}, chars:"0"},
  2377             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2378     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_1,
  2379              modifiers:{}, chars:"&"},
  2380             nsIDOMKeyEvent.DOM_VK_1, "&", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2381     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_1,
  2382              modifiers:{shiftKey:1}, chars:"1"},
  2383             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2384     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_2,
  2385              modifiers:{}, chars:"\u00E9"},
  2386             nsIDOMKeyEvent.DOM_VK_2, "\u00E9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2387     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_2,
  2388              modifiers:{shiftKey:1}, chars:"2"},
  2389             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2390     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_3,
  2391              modifiers:{}, chars:"\""},
  2392             nsIDOMKeyEvent.DOM_VK_3, "\"", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2393     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_3,
  2394              modifiers:{shiftKey:1}, chars:"3"},
  2395             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2396     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_4,
  2397              modifiers:{}, chars:"'"},
  2398             nsIDOMKeyEvent.DOM_VK_4, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2399     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_4,
  2400              modifiers:{shiftKey:1}, chars:"4"},
  2401             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2402     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_5,
  2403              modifiers:{}, chars:"("},
  2404             nsIDOMKeyEvent.DOM_VK_5, "(", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2405     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_5,
  2406              modifiers:{shiftKey:1}, chars:"5"},
  2407             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2408     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_6,
  2409              modifiers:{}, chars:"-"},
  2410             nsIDOMKeyEvent.DOM_VK_6, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2411     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_6,
  2412              modifiers:{shiftKey:1}, chars:"6"},
  2413             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2414     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_7,
  2415              modifiers:{}, chars:"\u00E8"},
  2416             nsIDOMKeyEvent.DOM_VK_7, "\u00E8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2417     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_7,
  2418              modifiers:{shiftKey:1}, chars:"7"},
  2419             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2420     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_8,
  2421              modifiers:{}, chars:"_"},
  2422             nsIDOMKeyEvent.DOM_VK_8, "_", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2423     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_8,
  2424              modifiers:{shiftKey:1}, chars:"8"},
  2425             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2426     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_9,
  2427              modifiers:{}, chars:"\u00E7"},
  2428             nsIDOMKeyEvent.DOM_VK_9, "\u00E7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2429     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_9,
  2430              modifiers:{shiftKey:1}, chars:"9"},
  2431             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2433     // Numeric with ShiftLock
  2434     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_0,
  2435              modifiers:{capsLockKey:1}, chars:"0"},
  2436             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2437     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_0,
  2438              modifiers:{capsLockKey:1, shiftKey:1}, chars:"\u00E0"},
  2439             nsIDOMKeyEvent.DOM_VK_0, "\u00E0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2440     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_1,
  2441              modifiers:{capsLockKey:1}, chars:"1"},
  2442             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2443     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_1,
  2444              modifiers:{capsLockKey:1, shiftKey:1}, chars:"&"},
  2445             nsIDOMKeyEvent.DOM_VK_1, "&", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2446     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_2,
  2447              modifiers:{capsLockKey:1}, chars:"2"},
  2448             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2449     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_2,
  2450              modifiers:{capsLockKey:1, shiftKey:1}, chars:"\u00E9"},
  2451             nsIDOMKeyEvent.DOM_VK_2, "\u00E9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2452     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_3,
  2453              modifiers:{capsLockKey:1}, chars:"3"},
  2454             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2455     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_3,
  2456              modifiers:{capsLockKey:1, shiftKey:1}, chars:"\""},
  2457             nsIDOMKeyEvent.DOM_VK_3, "\"", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2458     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_4,
  2459              modifiers:{capsLockKey:1}, chars:"4"},
  2460             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2461     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_4,
  2462              modifiers:{capsLockKey:1, shiftKey:1}, chars:"'"},
  2463             nsIDOMKeyEvent.DOM_VK_4, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2464     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_5,
  2465              modifiers:{capsLockKey:1}, chars:"5"},
  2466             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2467     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_5,
  2468              modifiers:{capsLockKey:1, shiftKey:1}, chars:"("},
  2469             nsIDOMKeyEvent.DOM_VK_5, "(", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2470     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_6,
  2471              modifiers:{capsLockKey:1}, chars:"6"},
  2472             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2473     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_6,
  2474              modifiers:{capsLockKey:1, shiftKey:1}, chars:"-"},
  2475             nsIDOMKeyEvent.DOM_VK_6, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2476     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_7,
  2477              modifiers:{capsLockKey:1}, chars:"7"},
  2478             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2479     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_7,
  2480              modifiers:{capsLockKey:1, shiftKey:1}, chars:"\u00E8"},
  2481             nsIDOMKeyEvent.DOM_VK_7, "\u00E8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2482     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_8,
  2483              modifiers:{capsLockKey:1}, chars:"8"},
  2484             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2485     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_8,
  2486              modifiers:{capsLockKey:1, shiftKey:1}, chars:"_"},
  2487             nsIDOMKeyEvent.DOM_VK_8, "_", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2488     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_9,
  2489              modifiers:{capsLockKey:1}, chars:"9"},
  2490             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2491     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_9,
  2492              modifiers:{capsLockKey:1, shiftKey:1}, chars:"\u00E7"},
  2493             nsIDOMKeyEvent.DOM_VK_9, "\u00E7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2495     // OEM keys
  2496     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_7,
  2497              modifiers:{}, chars:"\u00B2"},
  2498             0, "\u00B2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2499     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_7,
  2500              modifiers:{shiftKey:1}, chars:""},
  2501             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2502     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_4,
  2503              modifiers:{}, chars:")"},
  2504             nsIDOMKeyEvent.DOM_VK_CLOSE_PAREN, ")", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2505     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_4,
  2506              modifiers:{shiftKey:1}, chars:"\u00B0"},
  2507             nsIDOMKeyEvent.DOM_VK_CLOSE_PAREN, "\u00B0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2508     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PLUS,
  2509              modifiers:{}, chars:"="},
  2510             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2511     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PLUS,
  2512              modifiers:{shiftKey:1}, chars:"+"},
  2513             nsIDOMKeyEvent.DOM_VK_EQUALS, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2514     //testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2515     //         modifiers:{}, chars:""},
  2516     //        nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Dead-key
  2517     //testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2518     //         modifiers:{shiftKey:1}, chars:""},
  2519     //        nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Dead-key
  2520     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_1,
  2521              modifiers:{}, chars:"$"},
  2522             nsIDOMKeyEvent.DOM_VK_DOLLAR, "$", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2523     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_1,
  2524              modifiers:{shiftKey:1}, chars:"\u00A3"},
  2525             nsIDOMKeyEvent.DOM_VK_DOLLAR, "\u00A3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2526     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_3,
  2527              modifiers:{}, chars:"\u00F9"},
  2528             nsIDOMKeyEvent.DOM_VK_PERCENT, "\u00F9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2529     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_3,
  2530              modifiers:{shiftKey:1}, chars:"%"},
  2531             nsIDOMKeyEvent.DOM_VK_PERCENT, "%", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2532     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_5,
  2533              modifiers:{}, chars:"*"},
  2534             nsIDOMKeyEvent.DOM_VK_ASTERISK, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2535     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_5,
  2536              modifiers:{shiftKey:1}, chars:"\u00B5"},
  2537             nsIDOMKeyEvent.DOM_VK_ASTERISK, "\u00B5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2538     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_102,
  2539              modifiers:{}, chars:"<"},
  2540             nsIDOMKeyEvent.DOM_VK_LESS_THAN, "<", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2541     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_102,
  2542              modifiers:{shiftKey:1}, chars:">"},
  2543             nsIDOMKeyEvent.DOM_VK_LESS_THAN, ">", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2544     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_COMMA,
  2545              modifiers:{}, chars:","},
  2546             nsIDOMKeyEvent.DOM_VK_COMMA, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2547     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_COMMA,
  2548              modifiers:{shiftKey:1}, chars:"?"},
  2549             nsIDOMKeyEvent.DOM_VK_COMMA, "?", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2550     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PERIOD,
  2551              modifiers:{}, chars:";"},
  2552             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ";", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2553     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PERIOD,
  2554              modifiers:{shiftKey:1}, chars:"."},
  2555             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2556     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_2,
  2557              modifiers:{}, chars:":"},
  2558             nsIDOMKeyEvent.DOM_VK_COLON, ":", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2559     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_2,
  2560              modifiers:{shiftKey:1}, chars:"/"},
  2561             nsIDOMKeyEvent.DOM_VK_COLON, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2562     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_8,
  2563              modifiers:{}, chars:"!"},
  2564             nsIDOMKeyEvent.DOM_VK_EXCLAMATION, "!", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2565     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_8,
  2566              modifiers:{shiftKey:1}, chars:"\u00A7"},
  2567             nsIDOMKeyEvent.DOM_VK_EXCLAMATION, "\u00A7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2569     // OEM keys with ShiftLock
  2570     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_7,
  2571              modifiers:{capsLockKey:1}, chars:"\u00B2"},
  2572             0, "\u00B2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2573     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_7,
  2574              modifiers:{capsLockKey:1, shiftKey:1}, chars:""},
  2575             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2576     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_4,
  2577              modifiers:{capsLockKey:1}, chars:"\u00B0"},
  2578             nsIDOMKeyEvent.DOM_VK_CLOSE_PAREN, "\u00B0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2579     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_4,
  2580              modifiers:{capsLockKey:1, shiftKey:1}, chars:")"},
  2581             nsIDOMKeyEvent.DOM_VK_CLOSE_PAREN, ")", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2582     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PLUS,
  2583              modifiers:{capsLockKey:1}, chars:"+"},
  2584             nsIDOMKeyEvent.DOM_VK_EQUALS, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2585     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PLUS,
  2586              modifiers:{capsLockKey:1, shiftKey:1}, chars:"="},
  2587             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2588     //testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2589     //         modifiers:{capsLockKey:1}, chars:""},
  2590     //        0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Dead-key
  2591     //testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2592     //         modifiers:{capsLockKey:1, shiftKey:1}, chars:""},
  2593     //        0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Dead-key
  2594     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_1,
  2595              modifiers:{capsLockKey:1}, chars:"\u00A3"},
  2596             nsIDOMKeyEvent.DOM_VK_DOLLAR, "\u00A3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2597     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_1,
  2598              modifiers:{capsLockKey:1, shiftKey:1}, chars:"$"},
  2599             nsIDOMKeyEvent.DOM_VK_DOLLAR, "$", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2600     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_3,
  2601              modifiers:{capsLockKey:1}, chars:"%"},
  2602             nsIDOMKeyEvent.DOM_VK_PERCENT, "%", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2603     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_3,
  2604              modifiers:{capsLockKey:1, shiftKey:1}, chars:"\u00F9"},
  2605             nsIDOMKeyEvent.DOM_VK_PERCENT, "\u00F9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2606     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_5,
  2607              modifiers:{capsLockKey:1}, chars:"\u00B5"},
  2608             nsIDOMKeyEvent.DOM_VK_ASTERISK, "\u00B5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2609     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_5,
  2610              modifiers:{capsLockKey:1, shiftKey:1}, chars:"*"},
  2611             nsIDOMKeyEvent.DOM_VK_ASTERISK, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2612     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_102,
  2613              modifiers:{capsLockKey:1}, chars:"<"},
  2614             nsIDOMKeyEvent.DOM_VK_LESS_THAN, "<", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2615     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_102,
  2616              modifiers:{capsLockKey:1, shiftKey:1}, chars:">"},
  2617             nsIDOMKeyEvent.DOM_VK_LESS_THAN, ">", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2618     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_COMMA,
  2619              modifiers:{capsLockKey:1}, chars:"?"},
  2620             nsIDOMKeyEvent.DOM_VK_COMMA, "?", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2621     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_COMMA,
  2622              modifiers:{capsLockKey:1, shiftKey:1}, chars:","},
  2623             nsIDOMKeyEvent.DOM_VK_COMMA, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2624     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PERIOD,
  2625              modifiers:{capsLockKey:1}, chars:"."},
  2626             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2627     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PERIOD,
  2628              modifiers:{capsLockKey:1, shiftKey:1}, chars:";"},
  2629             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ";", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2630     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_2,
  2631              modifiers:{capsLockKey:1}, chars:"/"},
  2632             nsIDOMKeyEvent.DOM_VK_COLON, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2633     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_2,
  2634              modifiers:{capsLockKey:1, shiftKey:1}, chars:":"},
  2635             nsIDOMKeyEvent.DOM_VK_COLON, ":", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2636     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_8,
  2637              modifiers:{capsLockKey:1}, chars:"\u00A7"},
  2638             nsIDOMKeyEvent.DOM_VK_EXCLAMATION, "\u00A7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2639     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_8,
  2640              modifiers:{capsLockKey:1, shiftKey:1}, chars:"!"},
  2641             nsIDOMKeyEvent.DOM_VK_EXCLAMATION, "!", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2643     // AltGr
  2644     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_0,
  2645              modifiers:{altGrKey:1}, chars:"@"},
  2646             nsIDOMKeyEvent.DOM_VK_0, "@", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2647     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_1,
  2648              modifiers:{altGrKey:1}, chars:""},
  2649             nsIDOMKeyEvent.DOM_VK_1, "&", SHOULD_DELIVER_ALL_BUT_NOT_CAUSE_INPUT, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2650     //testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_2,
  2651     //         modifiers:{altGrKey:1}, chars:""},
  2652     //        nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Dead-key
  2653     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_3,
  2654              modifiers:{altGrKey:1}, chars:"#"},
  2655             nsIDOMKeyEvent.DOM_VK_3, "#", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2656     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_4,
  2657              modifiers:{altGrKey:1}, chars:"{"},
  2658             nsIDOMKeyEvent.DOM_VK_4, "{", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2659     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_5,
  2660              modifiers:{altGrKey:1}, chars:"["},
  2661             nsIDOMKeyEvent.DOM_VK_5, "[", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2662     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_6,
  2663              modifiers:{altGrKey:1}, chars:"|"},
  2664             nsIDOMKeyEvent.DOM_VK_6, "|", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2665     //testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_7,
  2666     //         modifiers:{altGrKey:1}, chars:""},
  2667     //        nsIDOMKeyEvent.DOM_VK_7, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Dead-key
  2668     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_8,
  2669              modifiers:{altGrKey:1}, chars:"\\"},
  2670             nsIDOMKeyEvent.DOM_VK_8, "\\", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2671     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_9,
  2672              modifiers:{altGrKey:1}, chars:"^"},
  2673             nsIDOMKeyEvent.DOM_VK_9, "^", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2674     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_4,
  2675              modifiers:{altGrKey:1}, chars:"]"},
  2676             nsIDOMKeyEvent.DOM_VK_CLOSE_PAREN, "]", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2677     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PLUS,
  2678              modifiers:{altGrKey:1}, chars:"}"},
  2679             nsIDOMKeyEvent.DOM_VK_EQUALS, "}", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2681     // German
  2682     testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:WIN_VK_OEM_2,
  2683              modifiers:{}, chars:"#"},
  2684             nsIDOMKeyEvent.DOM_VK_HASH, "#", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2685     testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:WIN_VK_OEM_2,
  2686              modifiers:{shiftKey:1}, chars:"'"},
  2687             nsIDOMKeyEvent.DOM_VK_HASH, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2689     // Norwegian
  2690     testKey({layout:KEYBOARD_LAYOUT_NORWEGIAN, keyCode:WIN_VK_OEM_5,
  2691              modifiers:{}, chars:"|"},
  2692             nsIDOMKeyEvent.DOM_VK_PIPE, "|", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2693     testKey({layout:KEYBOARD_LAYOUT_NORWEGIAN, keyCode:WIN_VK_OEM_5,
  2694              modifiers:{shiftKey:1}, chars:"\u00A7"},
  2695             nsIDOMKeyEvent.DOM_VK_PIPE, "\u00A7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2697     // Brazilian ABNT
  2698     testKey({layout:KEYBOARD_LAYOUT_BRAZILIAN_ABNT, keyCode:WIN_VK_ABNT_C1,
  2699              modifiers:{}, chars:"/"},
  2700             nsIDOMKeyEvent.DOM_VK_SLASH, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2701     testKey({layout:KEYBOARD_LAYOUT_BRAZILIAN_ABNT, keyCode:WIN_VK_ABNT_C1,
  2702              modifiers:{shiftKey:1}, chars:"?"},
  2703             nsIDOMKeyEvent.DOM_VK_SLASH, "?", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2704     testKey({layout:KEYBOARD_LAYOUT_BRAZILIAN_ABNT, keyCode:WIN_VK_ABNT_C2,
  2705              modifiers:{numLockKey:1}, chars:"."},
  2706             nsIDOMKeyEvent.DOM_VK_SEPARATOR, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2707     testKey({layout:KEYBOARD_LAYOUT_BRAZILIAN_ABNT, keyCode:WIN_VK_DECIMAL,
  2708              modifiers:{numLockKey:1}, chars:","},
  2709             nsIDOMKeyEvent.DOM_VK_DECIMAL, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2711     // Mac JIS keyboard
  2712     // The separator key on JIS keyboard for Mac doesn't cause any character even with Japanese keyboard layout.
  2713     testKey({layout:KEYBOARD_LAYOUT_JAPANESE, keyCode:WIN_VK_ABNT_C2,
  2714              modifiers:{numLockKey:1}, chars:""},
  2715             nsIDOMKeyEvent.DOM_VK_SEPARATOR, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2716     testKey({layout:KEYBOARD_LAYOUT_JAPANESE, keyCode:WIN_VK_DECIMAL,
  2717              modifiers:{numLockKey:1}, chars:"."},
  2718             nsIDOMKeyEvent.DOM_VK_DECIMAL, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
  2720     // Dead keys on any layouts
  2721     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2722              modifiers:{}, chars:""},
  2723             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2724     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2725              modifiers:{}, chars:"^^"},
  2726             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "^^", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2728     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2729              modifiers:{}, chars:""},
  2730             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2731     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_A,
  2732              modifiers:{}, chars:"\u00E2"},
  2733             nsIDOMKeyEvent.DOM_VK_A, "\u00E2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2735     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2736              modifiers:{}, chars:""},
  2737             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2738     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_A,
  2739              modifiers:{shiftKey:1}, chars:"\u00C2"},
  2740             nsIDOMKeyEvent.DOM_VK_A, "\u00C2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2742     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2743              modifiers:{}, chars:""},
  2744             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2745     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_Q,
  2746              modifiers:{}, chars:"^q"},
  2747             nsIDOMKeyEvent.DOM_VK_Q, "^q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2749     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2750              modifiers:{shiftKey:1}, chars:""},
  2751             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2752     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2753              modifiers:{shiftKey:1}, chars:"\u00A8\u00A8"},
  2754             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "\u00A8\u00A8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2756     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2757              modifiers:{shiftKey:1}, chars:""},
  2758             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2759     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_A,
  2760              modifiers:{shiftKey:1}, chars:"\u00C4"},
  2761             nsIDOMKeyEvent.DOM_VK_A, "\u00C4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2763     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2764              modifiers:{shiftKey:1}, chars:""},
  2765             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2766     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_A,
  2767              modifiers:{}, chars:"\u00E4"},
  2768             nsIDOMKeyEvent.DOM_VK_A, "\u00E4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2770     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
  2771              modifiers:{shiftKey:1}, chars:""},
  2772             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2773     testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_Q,
  2774              modifiers:{shiftKey:1}, chars:"\u00A8Q"},
  2775             nsIDOMKeyEvent.DOM_VK_Q, "\u00A8Q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2777     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
  2778              modifiers:{}, chars:""},
  2779             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2780     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
  2781              modifiers:{}, chars:"``"},
  2782             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "``", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2784     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
  2785              modifiers:{}, chars:""},
  2786             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2787     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
  2788              modifiers:{}, chars:"\u00E0"},
  2789             nsIDOMKeyEvent.DOM_VK_A, "\u00E0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2791     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
  2792              modifiers:{}, chars:""},
  2793             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2794     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
  2795              modifiers:{shiftKey:1}, chars:"\u00C0"},
  2796             nsIDOMKeyEvent.DOM_VK_A, "\u00C0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2798     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
  2799              modifiers:{}, chars:""},
  2800             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2801     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_Q,
  2802              modifiers:{}, chars:"`q"},
  2803             nsIDOMKeyEvent.DOM_VK_Q, "`q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2805     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
  2806              modifiers:{shiftKey:1}, chars:""},
  2807             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2808     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
  2809              modifiers:{shiftKey:1}, chars:"^^"},
  2810             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "^^", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2812     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
  2813              modifiers:{shiftKey:1}, chars:""},
  2814             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2815     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
  2816              modifiers:{shiftKey:1}, chars:"\u00C2"},
  2817             nsIDOMKeyEvent.DOM_VK_A, "\u00C2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2819     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
  2820              modifiers:{shiftKey:1}, chars:""},
  2821             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2822     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
  2823              modifiers:{}, chars:"\u00E2"},
  2824             nsIDOMKeyEvent.DOM_VK_A, "\u00E2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2826     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
  2827              modifiers:{shiftKey:1}, chars:""},
  2828             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2829     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_Q,
  2830              modifiers:{shiftKey:1}, chars:"^Q"},
  2831             nsIDOMKeyEvent.DOM_VK_Q, "^Q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2833     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
  2834              modifiers:{}, chars:""},
  2835             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2836     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
  2837              modifiers:{}, chars:"\u00B4\u00B4"},
  2838             0, "\u00B4\u00B4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2840     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
  2841              modifiers:{}, chars:""},
  2842             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2843     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
  2844              modifiers:{}, chars:"\u00E1"},
  2845             nsIDOMKeyEvent.DOM_VK_A, "\u00E1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2847     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
  2848              modifiers:{}, chars:""},
  2849             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2850     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
  2851              modifiers:{shiftKey:1}, chars:"\u00C1"},
  2852             nsIDOMKeyEvent.DOM_VK_A, "\u00C1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2854     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
  2855              modifiers:{}, chars:""},
  2856             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2857     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_Q,
  2858              modifiers:{}, chars:"\u00B4q"},
  2859             nsIDOMKeyEvent.DOM_VK_Q, "\u00B4q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2861     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
  2862              modifiers:{shiftKey:1}, chars:""},
  2863             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2864     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
  2865              modifiers:{shiftKey:1}, chars:"\u00A8\u00A8"},
  2866             0, "\u00A8\u00A8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2868     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
  2869              modifiers:{shiftKey:1}, chars:""},
  2870             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2871     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
  2872              modifiers:{shiftKey:1}, chars:"\u00C4"},
  2873             nsIDOMKeyEvent.DOM_VK_A, "\u00C4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2875     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
  2876              modifiers:{shiftKey:1}, chars:""},
  2877             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2878     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
  2879              modifiers:{}, chars:"\u00E4"},
  2880             nsIDOMKeyEvent.DOM_VK_A, "\u00E4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2882     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
  2883              modifiers:{shiftKey:1}, chars:""},
  2884             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2885     testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_Q,
  2886              modifiers:{shiftKey:1}, chars:"\u00A8Q"},
  2887             nsIDOMKeyEvent.DOM_VK_Q, "\u00A8Q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
  2890   document.removeEventListener("keydown",  onKeyEvent, false);
  2891   document.removeEventListener("keypress", onKeyEvent, false);
  2892   document.removeEventListener("keyup",    onKeyEvent, false);
  2895 // Test the activation (or not) of an HTML accesskey
  2896 function runAccessKeyTests()
  2898   var button = document.getElementById("button");
  2899   var activationCount;
  2901   function onClick(e)
  2903     ++activationCount;
  2906   // The first parameter is the complete input event. The second and third parameters are
  2907   // what to test against.
  2908   function testKey(aEvent, aAccessKey, aShouldActivate)
  2910     activationCount = 0;
  2911     button.setAttribute("accesskey", aAccessKey);
  2913     synthesizeKey(aEvent, "button");
  2915     var name = eventToString(aEvent);
  2917     is(activationCount, aShouldActivate ? 1 : 0, name + ", activating '" + aAccessKey + "'");
  2920   button.addEventListener("click", onClick, false);
  2922   // These tests have to be per-plaform.
  2923   if (IS_MAC) {
  2924     // Basic sanity checks
  2925     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
  2926              modifiers:{}, chars:"a", unmodifiedChars:"a"},
  2927             "a", false);
  2928     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
  2929              modifiers:{ctrlKey:1}, chars:"\u0001", unmodifiedChars:"a"},
  2930             "a", false);
  2931     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
  2932              modifiers:{ctrlKey:1}, chars:"\u0001", unmodifiedChars:"a"},
  2933             "A", false);
  2935     // Shift-ctrl does not activate accesskeys
  2936     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
  2937              modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0001", unmodifiedChars:"A"},
  2938             "a", false);
  2939     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
  2940              modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0001", unmodifiedChars:"A"},
  2941             "A", false);
  2942     // Alt-ctrl activate accesskeys
  2943     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
  2944              modifiers:{ctrlKey:1, altKey:1}, chars:"\u0001", unmodifiedChars:"a"},
  2945             "a", true);
  2946     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
  2947              modifiers:{ctrlKey:1, altKey:1}, chars:"\u0001", unmodifiedChars:"a"},
  2948             "A", true);
  2950     // Greek layout can activate a Latin accesskey
  2951     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
  2952              modifiers:{ctrlKey:1, altKey:1}, chars:"\u0001", unmodifiedChars:"\u03b1"},
  2953             "a", true);
  2954     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
  2955              modifiers:{ctrlKey:1, altKey:1}, chars:"\u0001", unmodifiedChars:"\u03b1"},
  2956             "A", true);
  2957     // ... and a Greek accesskey!
  2958     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
  2959              modifiers:{ctrlKey:1, altKey:1}, chars:"\u0001", unmodifiedChars:"\u03b1"},
  2960             "\u03b1", true);
  2961     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
  2962              modifiers:{ctrlKey:1, altKey:1}, chars:"\u0001", unmodifiedChars:"\u03b1"},
  2963             "\u0391", true);
  2965     // bug 359638
  2966     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Period,
  2967              modifiers:{ctrlKey:1, altKey:1}, chars:".", unmodifiedChars:"."},
  2968             ".", true);
  2970     // German (KCHR/KeyTranslate case)
  2971     testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_A,
  2972              modifiers:{ctrlKey:1, altKey:1}, chars:"a", unmodifiedChars:"a"},
  2973             "a", true);
  2974     testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_A,
  2975              modifiers:{ctrlKey:1, altKey:1}, chars:"a", unmodifiedChars:"a"},
  2976             "A", true);
  2977     testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_LeftBracket,
  2978              modifiers:{ctrlKey:1, altKey:1}, chars:"\u00fc", unmodifiedChars:"\u00fc"},
  2979             "\u00fc", true);
  2980     testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_LeftBracket,
  2981              modifiers:{ctrlKey:1, altKey:1}, chars:"\u00fc", unmodifiedChars:"\u00fc"},
  2982             "\u00dc", true);
  2984   else if (IS_WIN) {
  2985     // Basic sanity checks
  2986     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  2987              modifiers:{}, chars:"a"},
  2988             "a", false);
  2989     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  2990              modifiers:{shiftKey:1, altKey:1}, chars:"A"},
  2991             "a", true);
  2992     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  2993              modifiers:{shiftKey:1, altKey:1}, chars:"A"},
  2994             "A", true);
  2996     // shift-alt-ctrl does not activate accesskeys
  2997     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  2998              modifiers:{ctrlKey:1, shiftKey:1, altKey:1}, chars:""},
  2999             "a", false);
  3000     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  3001              modifiers:{ctrlKey:1, shiftKey:1, altKey:1}, chars:""},
  3002             "A", false);
  3004     // Greek layout can activate a Latin accesskey
  3005     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
  3006              modifiers:{shiftKey:1, altKey:1}, chars:"A"},
  3007             "a", true);
  3008     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
  3009              modifiers:{shiftKey:1, altKey:1}, chars:"A"},
  3010             "A", true);
  3011     // ... and a Greek accesskey!
  3012     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
  3013              modifiers:{shiftKey:1, altKey:1}, chars:"A"},
  3014             "\u03b1", true);
  3015     testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
  3016              modifiers:{shiftKey:1, altKey:1}, chars:"A"},
  3017             "\u0391", true);
  3019     // bug 359638
  3020     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_PERIOD,
  3021              modifiers:{shiftKey:1, altKey:1}, chars:".", unmodifiedChars:"."},
  3022             ".", true);
  3025   button.removeEventListener("click", onClick, false);
  3028 function runXULKeyTests()
  3030   function testKey(aEvent, aElem, aShouldActivate)
  3032     var elem = document.getElementById(aElem);
  3033     elem.activeCount = 0;
  3035     synthesizeKey(aEvent, "button");
  3037     var name = eventToString(aEvent);
  3039     is(elem.activeCount, aShouldActivate ? 1 : 0,
  3040        name + " activating " + aElem);
  3043   if (IS_MAC) {
  3044     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
  3045              modifiers:{metaKey:1}, chars:";", unmodifiedChars:";"},
  3046             "unshiftedKey", true);
  3047     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
  3048              modifiers:{metaKey:1}, chars:";", unmodifiedChars:";"},
  3049             "shiftedKey", false);
  3050     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
  3051              modifiers:{metaKey:1, shiftKey:1}, chars:";", unmodifiedChars:":"},
  3052             "shiftedKey", true);
  3053     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
  3054              modifiers:{metaKey:1, shiftKey:1}, chars:";", unmodifiedChars:":"},
  3055             "unshiftedKey", false);
  3057   else if (IS_WIN) {
  3058     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_1,
  3059              modifiers:{ctrlKey:1}, chars:";"},
  3060             "unshiftedKey", true);
  3061     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_1,
  3062              modifiers:{ctrlKey:1}, chars:";"},
  3063             "shiftedKey", false);
  3064     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_1,
  3065              modifiers:{ctrlKey:1, shiftKey:1}, chars:";"},
  3066             "shiftedKey", true);
  3067     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_1,
  3068              modifiers:{ctrlKey:1, shiftKey:1}, chars:";"},
  3069             "unshiftedKey", false);
  3072   keyElems = ["commandOptionF"];
  3074   // 429160
  3075   if (IS_MAC) {
  3076     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_F,
  3077              modifiers:{metaKey:1, altKey:1}, chars:"\u0192", unmodifiedChars:"f"},
  3078             "commandOptionF", true);
  3080   else if (IS_WIN) {
  3081     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_F,
  3082              modifiers:{ctrlKey:1, altKey:1}, chars:"\u0006"},
  3083             "commandOptionF", true);
  3086   // 432112
  3087   if (IS_MAC) {
  3088     testKey({layout:KEYBOARD_LAYOUT_SWEDISH, keyCode:MAC_VK_ANSI_Minus,
  3089              modifiers:{metaKey:1, shiftKey:1}, chars:"+", unmodifiedChars:"?"},
  3090             "question", true);
  3092   else if (IS_WIN) {
  3093     testKey({layout:KEYBOARD_LAYOUT_SWEDISH, keyCode:WIN_VK_OEM_PLUS,
  3094              modifiers:{ctrlKey:1, shiftKey:1}, chars:""},
  3095             "question", true);
  3096     testKey({layout:KEYBOARD_LAYOUT_SWEDISH, keyCode:WIN_VK_OEM_PLUS,
  3097              modifiers:{ctrlKey:1}, chars:""},
  3098             "question", false);
  3101   // bug 433192
  3102   if (IS_WIN) {
  3103     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_X,
  3104              modifiers:{ctrlKey:1}, chars:"\u0018"},
  3105             "unshiftedX", true);
  3106     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_X,
  3107              modifiers:{ctrlKey:1}, chars:"\u0018"},
  3108             "shiftedX", false);
  3109     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_X,
  3110              modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0018"},
  3111             "unshiftedX", false);
  3112     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_X,
  3113              modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0018"},
  3114             "shiftedX", true);
  3115     testKey({layout:KEYBOARD_LAYOUT_ARABIC, keyCode:WIN_VK_X,
  3116              modifiers:{ctrlKey:1}, chars:"\u0018"},
  3117             "unshiftedX", true);
  3118     testKey({layout:KEYBOARD_LAYOUT_ARABIC, keyCode:WIN_VK_X,
  3119              modifiers:{ctrlKey:1}, chars:"\u0018"},
  3120             "shiftedX", false);
  3121     testKey({layout:KEYBOARD_LAYOUT_ARABIC, keyCode:WIN_VK_X,
  3122              modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0018"},
  3123             "unshiftedX", false);
  3124     testKey({layout:KEYBOARD_LAYOUT_ARABIC, keyCode:WIN_VK_X,
  3125              modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0018"},
  3126             "shiftedX", true);
  3127     testKey({layout:KEYBOARD_LAYOUT_HEBREW, keyCode:WIN_VK_X,
  3128              modifiers:{ctrlKey:1}, chars:"\u0018"},
  3129             "unshiftedX", true);
  3130     testKey({layout:KEYBOARD_LAYOUT_HEBREW, keyCode:WIN_VK_X,
  3131              modifiers:{ctrlKey:1}, chars:"\u0018"},
  3132             "shiftedX", false);
  3133     testKey({layout:KEYBOARD_LAYOUT_HEBREW, keyCode:WIN_VK_X,
  3134              modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0018"},
  3135             "unshiftedX", false);
  3136     testKey({layout:KEYBOARD_LAYOUT_HEBREW, keyCode:WIN_VK_X,
  3137              modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0018"},
  3138             "shiftedX", true);
  3139     testKey({layout:KEYBOARD_LAYOUT_JAPANESE, keyCode:WIN_VK_OEM_PLUS,
  3140              modifiers:{ctrlKey:1}, chars:""},
  3141             "unshiftedPlus", false);
  3142     testKey({layout:KEYBOARD_LAYOUT_JAPANESE, keyCode:WIN_VK_OEM_PLUS,
  3143              modifiers:{ctrlKey:1, shiftKey:1}, chars:""},
  3144             "unshiftedPlus", true);
  3147   // bug 759346
  3148   if (IS_WIN) {
  3149     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:WIN_VK_1,
  3150              modifiers:{ctrlKey:1}, chars:""},
  3151             "unshiftedPlus", false);
  3152     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:WIN_VK_1,
  3153              modifiers:{ctrlKey:1, shiftKey:1}, chars:""},
  3154             "unshiftedPlus", true);
  3155     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:WIN_VK_OEM_PLUS,
  3156              modifiers:{ctrlKey:1}, chars:""},
  3157             "unshiftedPlus", true);
  3158     testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:WIN_VK_OEM_PLUS,
  3159              modifiers:{ctrlKey:1, shiftKey:1}, chars:""},
  3160             "unshiftedPlus", false);
  3164 function runTextInputTests()
  3166   var textbox = document.getElementById("textbox");
  3168   function testKey(aEvent, aExpectText) {
  3169     textbox.value = "";
  3170     textbox.focus();
  3172     synthesizeKey(aEvent, "textbox");
  3174     var name = eventToString(aEvent);
  3176     is(textbox.value, aExpectText, name + " does not input correct text.");
  3179   if (IS_WIN) {
  3180     // Basic sanity checks
  3181     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  3182              modifiers:{}, chars:"a"},
  3183             "a");
  3184     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  3185              modifiers:{shiftKey:1}, chars:"A"},
  3186             "A");
  3187     // When Ctrl+Alt are pressed, any text should not be inputted.
  3188     testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
  3189              modifiers:{ctrlKey:1, altKey:1}, chars:""},
  3190             "");
  3192     // Lithuanian AltGr should be consumed at 9/0 keys pressed
  3193     testKey({layout:KEYBOARD_LAYOUT_LITHUANIAN, keyCode:WIN_VK_8,
  3194              modifiers:{}, chars:"\u016B"},
  3195             "\u016B");
  3196     testKey({layout:KEYBOARD_LAYOUT_LITHUANIAN, keyCode:WIN_VK_9,
  3197              modifiers:{}, chars:"9"},
  3198             "9");
  3199     testKey({layout:KEYBOARD_LAYOUT_LITHUANIAN, keyCode:WIN_VK_0,
  3200              modifiers:{}, chars:"0"},
  3201             "0");
  3202     testKey({layout:KEYBOARD_LAYOUT_LITHUANIAN, keyCode:WIN_VK_8,
  3203              modifiers:{ctrlKey:1, altKey:1}, chars:"8"},
  3204             "8");
  3205     testKey({layout:KEYBOARD_LAYOUT_LITHUANIAN, keyCode:WIN_VK_9,
  3206              modifiers:{ctrlKey:1, altKey:1}, chars:"9"},
  3207             "9");
  3208     testKey({layout:KEYBOARD_LAYOUT_LITHUANIAN, keyCode:WIN_VK_0,
  3209              modifiers:{ctrlKey:1, altKey:1}, chars:"0"},
  3210             "0");
  3212   else
  3213     todo(false, "runTextInputTests() checks Windows only");
  3215   // XXX We need to move focus for canceling to search the autocomplete
  3216   // result. If we don't do here, Fx will crash at end of this tests.
  3217   document.getElementById("button").focus();
  3220 function runTest()
  3222   if (!IS_MAC && !IS_WIN) {
  3223     todo(false, "This test is supported on MacOSX and Windows only. (Bug 431503)");
  3224     return;
  3227   SimpleTest.waitForExplicitFinish();
  3229   clearInfobars();
  3231   runKeyEventTests();
  3232   runAccessKeyTests();
  3233   runXULKeyTests();
  3234   runTextInputTests();
  3236   SimpleTest.finish();
  3239 ]]>
  3240 </script>
  3242 </window>

mercurial