Bug 947115 All tests shouldn't use nsIDOMWindowUtils.sendNativeKeyEvent() directly. Use synthesizeNativeKey() instead. r=smaug
authorMasayuki Nakano <masayuki@d-toybox.com>
Wed, 18 Dec 2013 16:02:46 +0900
changeset 176989 2700df15464427d3768136404ca8ec2270000fbd
parent 176988 0d0a56b1051fbebadc545e9fb6ed4e930bc02b53
child 176990 fa1dd7e7aa22f6f9acdb95945d8b29bd88413225
push id3343
push userffxbld
push dateMon, 17 Mar 2014 21:55:32 +0000
treeherdermozilla-beta@2f7d3415f79f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewerssmaug
bugs947115
milestone29.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 947115 All tests shouldn't use nsIDOMWindowUtils.sendNativeKeyEvent() directly. Use synthesizeNativeKey() instead. r=smaug
browser/metro/base/tests/mochitest/head.js
docshell/test/test_bug511449.html
testing/mochitest/tests/SimpleTest/EventUtils.js
testing/mochitest/tests/SimpleTest/NativeKeyCodes.js
widget/cocoa/TextInputHandler.h
widget/cocoa/TextInputHandler.mm
widget/tests/test_bug428405.xul
widget/tests/test_key_event_counts.xul
widget/tests/test_keycodes.xul
widget/tests/test_native_key_bindings_mac.html
widget/tests/test_plugin_input_event.html
widget/tests/test_secure_input.html
--- a/browser/metro/base/tests/mochitest/head.js
+++ b/browser/metro/base/tests/mochitest/head.js
@@ -556,33 +556,16 @@ function waitForObserver(aObsEvent, aTim
   }
 }
 
 /*=============================================================================
  * Native input helpers - these helpers send input directly to the os
  * generating os level input events that get processed by widget and
  * apzc logic.
  *===========================================================================*/
-
-// Keyboard layouts for use with synthesizeNativeKey
-const usEnglish = 0x409;
-const arSpanish = 0x2C0A;
-
-// Modifiers for use with synthesizeNativeKey
-const leftShift = 0x100;
-const rightShift = 0x200;
-const leftControl = 0x400;
-const rightControl = 0x800;
-const leftAlt = 0x1000;
-const rightAlt = 0x2000;
-
-function synthesizeNativeKey(aKbLayout, aVKey, aModifiers) {
-  Browser.windowUtils.sendNativeKeyEvent(aKbLayout, aVKey, aModifiers, '', '');
-}
-
 function synthesizeNativeMouse(aElement, aOffsetX, aOffsetY, aMsg) {
   let x = aOffsetX;
   let y = aOffsetY;
   if (aElement) {
     if (aElement.getBoundingClientRect) {
       let rect = aElement.getBoundingClientRect();
       x += rect.left;
       y += rect.top;
--- a/docshell/test/test_bug511449.html
+++ b/docshell/test/test_bug511449.html
@@ -33,18 +33,17 @@ function runTest() {
   SimpleTest.waitForFocus(runNextTest, win);
 }
 
 function runNextTest() {
   var didClose = false;
   win.onunload = function() {
     didClose = true;
   }
-  var utils = SpecialPowers.getDOMWindowUtils(win);
-  utils.sendNativeKeyEvent(0, MAC_VK_ANSI_W, 0x4000 /* cmd */, "w", "w");
+  synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_W, {metaKey:1}, "w", "w");
 
   setTimeout(function () {
     ok(didClose, "Cmd+W should have closed the tab");
     if (!didClose) {
       win.close();
     }
     SimpleTest.finish();
   }, 1000);
--- a/testing/mochitest/tests/SimpleTest/EventUtils.js
+++ b/testing/mochitest/tests/SimpleTest/EventUtils.js
@@ -615,20 +615,57 @@ function _parseNativeModifiers(aModifier
   if (aModifiers.accelKey) {
     modifiers |=
       (navigator.platform.indexOf("Mac") == 0) ? 0x00004000 : 0x00000400;
   }
   if (aModifiers.accelRightKey) {
     modifiers |=
       (navigator.platform.indexOf("Mac") == 0) ? 0x00008000 : 0x00000800;
   }
+  if (aModifiers.altGrKey) {
+    modifiers |=
+      (navigator.platform.indexOf("Win") == 0) ? 0x00002800 : 0x00001000;
+  }
   return modifiers;
 }
 
-const KEYBOARD_LAYOUT_EN_US = 0;
+// Mac: Any unused number is okay for adding new keyboard layout.
+//      When you add new keyboard layout here, you need to modify
+//      TISInputSourceWrapper::InitByLayoutID().
+// Win: These constants can be found by inspecting registry keys under
+//      HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Keyboard Layouts
+
+const KEYBOARD_LAYOUT_ARABIC =
+  { name: "Arabic",             Mac: 6,    Win: 0x00000401 };
+const KEYBOARD_LAYOUT_BRAZILIAN_ABNT =
+  { name: "Brazilian ABNT",     Mac: null, Win: 0x00000416 };
+const KEYBOARD_LAYOUT_DVORAK_QWERTY =
+  { name: "Dvorak-QWERTY",      Mac: 4,    Win: null       };
+const KEYBOARD_LAYOUT_EN_US =
+  { name: "US",                 Mac: 0,    Win: 0x00000409 };
+const KEYBOARD_LAYOUT_FRENCH =
+  { name: "French",             Mac: 7,    Win: 0x0000040C };
+const KEYBOARD_LAYOUT_GREEK =
+  { name: "Greek",              Mac: 1,    Win: 0x00000408 };
+const KEYBOARD_LAYOUT_GERMAN =
+  { name: "German",             Mac: 2,    Win: 0x00000407 };
+const KEYBOARD_LAYOUT_HEBREW =
+  { name: "Hebrew",             Mac: 8,    Win: 0x0000040D };
+const KEYBOARD_LAYOUT_JAPANESE =
+  { name: "Japanese",           Mac: null, Win: 0x00000411 };
+const KEYBOARD_LAYOUT_LITHUANIAN =
+  { name: "Lithuanian",         Mac: 9,    Win: 0x00010427 };
+const KEYBOARD_LAYOUT_NORWEGIAN =
+  { name: "Norwegian",          Mac: 10,   Win: 0x00000414 };
+const KEYBOARD_LAYOUT_SPANISH =
+  { name: "Spanish",            Mac: 11,   Win: 0x0000040A };
+const KEYBOARD_LAYOUT_SWEDISH =
+  { name: "Swedish",            Mac: 3,    Win: 0x0000041D };
+const KEYBOARD_LAYOUT_THAI =
+  { name: "Thai",               Mac: 5,    Win: 0x0002041E };
 
 /**
  * synthesizeNativeKey() dispatches native key event on active window.
  * This is implemented only on Windows and Mac.
  *
  * @param aKeyboardLayout       One of KEYBOARD_LAYOUT_* defined above.
  * @param aNativeKeyCode        A native keycode value defined in
  *                              NativeKeyCodes.js.
@@ -646,34 +683,23 @@ const KEYBOARD_LAYOUT_EN_US = 0;
 
 function synthesizeNativeKey(aKeyboardLayout, aNativeKeyCode, aModifiers,
                              aChars, aUnmodifiedChars)
 {
   var utils = _getDOMWindowUtils(window);
   if (!utils) {
     return false;
   }
-  var nativeKeyboardLayout;
+  var nativeKeyboardLayout = null;
   if (navigator.platform.indexOf("Mac") == 0) {
-    switch (aKeyboardLayout) {
-      case KEYBOARD_LAYOUT_EN_US:
-        nativeKeyboardLayout = 0;
-        break;
-      default:
-        return false;
-    }
+    nativeKeyboardLayout = aKeyboardLayout.Mac;
   } else if (navigator.platform.indexOf("Win") == 0) {
-    switch (aKeyboardLayout) {
-      case KEYBOARD_LAYOUT_EN_US:
-        nativeKeyboardLayout = 0x409;
-        break;
-      default:
-        return false;
-    }
-  } else {
+    nativeKeyboardLayout = aKeyboardLayout.Win;
+  }
+  if (nativeKeyboardLayout === null) {
     return false;
   }
   utils.sendNativeKeyEvent(nativeKeyboardLayout, aNativeKeyCode,
                            _parseNativeModifiers(aModifiers),
                            aChars, aUnmodifiedChars);
   return true;
 }
 
--- a/testing/mochitest/tests/SimpleTest/NativeKeyCodes.js
+++ b/testing/mochitest/tests/SimpleTest/NativeKeyCodes.js
@@ -1,11 +1,11 @@
 /**
- * This file defines all virtual keycodes for
- * nsIDOMWindowUtils.sendNativeKeyEvent()
+ * This file defines all virtual keycodes for synthesizeNativeKey() of
+ * EventUtils.js and nsIDOMWindowUtils.sendNativeKeyEvent().
  * These values are defined in each platform's SDK or documents.
  */
 
 // Windows
 
 const WIN_VK_LBUTTON                    = 0x01;
 const WIN_VK_RBUTTON                    = 0x02;
 const WIN_VK_CANCEL                     = 0x03;
--- a/widget/cocoa/TextInputHandler.h
+++ b/widget/cocoa/TextInputHandler.h
@@ -89,16 +89,22 @@ public:
    *
    * @param aLayoutID             An ID of keyboard layout.
    *                                0: US
    *                                1: Greek
    *                                2: German
    *                                3: Swedish-Pro
    *                                4: Dvorak-Qwerty Cmd
    *                                5: Thai
+   *                                6: Arabic
+   *                                7: French
+   *                                8: Hebrew
+   *                                9: Lithuanian
+   *                               10: Norwegian
+   *                               11: Spanish
    * @param aOverrideKeyboard     When testing set to TRUE, otherwise, set to
    *                              FALSE.  When TRUE, we use an ANSI keyboard
    *                              instead of the actual keyboard.
    */
   void InitByLayoutID(SInt32 aLayoutID, bool aOverrideKeyboard = false);
   void InitByCurrentInputSource();
   void InitByCurrentKeyboardLayout();
   void InitByCurrentASCIICapableInputSource();
--- a/widget/cocoa/TextInputHandler.mm
+++ b/widget/cocoa/TextInputHandler.mm
@@ -522,16 +522,34 @@ TISInputSourceWrapper::InitByLayoutID(SI
       InitByInputSourceID("com.apple.keylayout.Swedish-Pro");
       break;
     case 4:
       InitByInputSourceID("com.apple.keylayout.DVORAK-QWERTYCMD");
       break;
     case 5:
       InitByInputSourceID("com.apple.keylayout.Thai");
       break;
+    case 6:
+      InitByInputSourceID("com.apple.keylayout.Arabic");
+      break;
+    case 7:
+      InitByInputSourceID("com.apple.keylayout.French");
+      break;
+    case 8:
+      InitByInputSourceID("com.apple.keylayout.Hebrew");
+      break;
+    case 9:
+      InitByInputSourceID("com.apple.keylayout.Lithuanian");
+      break;
+    case 10:
+      InitByInputSourceID("com.apple.keylayout.Norwegian");
+      break;
+    case 11:
+      InitByInputSourceID("com.apple.keylayout.Spanish");
+      break;
     default:
       Clear();
       break;
   }
   mOverrideKeyboard = aOverrideKeyboard;
 }
 
 void
--- a/widget/tests/test_bug428405.xul
+++ b/widget/tests/test_bug428405.xul
@@ -21,33 +21,29 @@
       <browser onload="configureSecondTab();" id="tab2browser" flex="100%"/>
     </tabpanels>
   </tabbox>
 
   <script type="application/javascript"><![CDATA[
 
     SimpleTest.waitForExplicitFinish();
 
-    var gUtils;
-
     var gCmdOptYReceived = false;
 
     // Look for a cmd-opt-y event.
     function onKeyPress(aEvent) {
       gCmdOptYReceived = false;
       if (String.fromCharCode(aEvent.charCode) != 'y')
         return;
       if (aEvent.ctrlKey || aEvent.shiftKey || !aEvent.metaKey || !aEvent.altKey)
         return;
       gCmdOptYReceived = true;
     }
 
     function setGlobals() {
-      gUtils = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor).
-                      getInterface(Components.interfaces.nsIDOMWindowUtils);
       var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"].
                           getService(Components.interfaces.nsIWindowMediator);
       gChromeWindow = wm.getMostRecentWindow("navigator:browser");
       // For some reason, a global <key> element's oncommand handler only gets
       // invoked if the focus is outside both of the <browser> elements
       // (tab1browser and tab2browser).  So, to make sure we can see a
       // cmd-opt-y event in window1 (if one is available), regardless of where
       // the focus is in this window, we need to add a "keypress" event
@@ -142,21 +138,21 @@
     // latter make this test succeed when it should fail.
 
     // The 'aNativeKeyCode', 'aCharacters' and 'aUnmodifiedCharacters'
     // parameters used below (in synthesizeNativeReturnKey() and
     // synthesizeNativeCmdOptY()) were confirmed accurate using the
     // DebugEventsPlugin v1.01 from bmo bug 441880.
 
     function synthesizeNativeReturnKey() {
-      gUtils.sendNativeKeyEvent(0, MAC_VK_Return, 0, "\u000a", "\u000a");
+      synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, MAC_VK_Return, {}, "\u000a", "\u000a");
     }
 
     function synthesizeNativeCmdOptY() {
-      gUtils.sendNativeKeyEvent(0, MAC_VK_ANSI_Y, 0x5000, "y", "y");
+      synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_Y, {metaKey:1, altKey:1}, "y", "y");
     }
 
   ]]></script>
 
   <!-- test results are displayed in the html:body -->
   <body xmlns="http://www.w3.org/1999/xhtml">
     <p id="display"></p>
     <div id="content" style="display: none"></div>
--- a/widget/tests/test_key_event_counts.xul
+++ b/widget/tests/test_key_event_counts.xul
@@ -26,33 +26,30 @@
     function onKeyPress(e)
     {
       gKeyPressEventCount++;
       e.preventDefault();
     }
 
     function runTest()
     {
-      var domWindowUtils = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor).
-                             getInterface(Components.interfaces.nsIDOMWindowUtils);
-
       window.addEventListener("keypress", onKeyPress, false);
 
       // Test ctrl-tab
       gKeyPressEventCount = 0;
-      domWindowUtils.sendNativeKeyEvent(0, MAC_VK_Tab, 0x0400, "\t", "\t");
+      synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, MAC_VK_Tab, {ctrlKey:1}, "\t", "\t");
       is(gKeyPressEventCount, 1);
 
       // Test cmd+shift+a
       gKeyPressEventCount = 0;
-      domWindowUtils.sendNativeKeyEvent(0, MAC_VK_ANSI_A, 0x4000 | 0x0100, "a", "A");
+      synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_A, {metaKey:1, shiftKey:1}, "a", "A");
       is(gKeyPressEventCount, 1);
 
       // Test cmd-;
       gKeyPressEventCount = 0;
-      domWindowUtils.sendNativeKeyEvent(0, MAC_VK_ANSI_Semicolon, 0x4000, ";", ";");
+      synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_Semicolon, {metaKey:1}, ";", ";");
       is(gKeyPressEventCount, 1);
 
       window.removeEventListener("keypress", onKeyPress, false);
     }
   ]]></script>
 
 </window>
--- a/widget/tests/test_keycodes.xul
+++ b/widget/tests/test_keycodes.xul
@@ -7,16 +7,18 @@
   xmlns:html="http://www.w3.org/1999/xhtml"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
   <title>Key event tests</title>
   <script type="application/javascript"
           src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js" />
   <script type="application/javascript"
           src="chrome://mochikit/content/tests/SimpleTest/NativeKeyCodes.js" />
+  <script type="application/javascript"
+          src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js" />
 
 <keyset>
   <key id="unshiftedKey" key=";" modifiers="accel" oncommand="this.activeCount++"/>
   <key id="shiftedKey" key=":" modifiers="accel" oncommand="this.activeCount++"/>
   <key id="commandOptionF" key='f' modifiers="accel,alt" oncommand="this.activeCount++"/>
   <key id="question" key='?' modifiers="accel" oncommand="this.activeCount++"/>
   <key id="unshiftedX" key="x" modifiers="accel" oncommand="this.activeCount++"/>
   <key id="shiftedX" key="X" modifiers="accel,shift" oncommand="this.activeCount++"/>
@@ -56,126 +58,60 @@ function clearInfobars()
                   .QueryInterface(Ci.nsIDocShell).chromeEventHandler;
   var chromeWin = browser.ownerDocument.defaultView;
   var nb = chromeWin.gBrowser.getNotificationBox(browser);
   for (let n of nb.allNotifications) {
     nb.removeNotification(n, true);
   }
 }
 
-function synthesizeNativeKey(aLayout, aKeyCode, aModifiers, aSystemChars,
-                             aSystemUnmodifiedChars, aWindow)
-{
-  if (!aWindow)
-    aWindow = window;
-
-  var utils = aWindow.QueryInterface(Components.interfaces.nsIInterfaceRequestor).
-                      getInterface(Components.interfaces.nsIDOMWindowUtils);
-
-  if (utils) {
-    var modifiers = 0;
-    if (aModifiers.capsLock) modifiers |= 0x01;
-    if (aModifiers.numLock) modifiers |= 0x02;
-    if (aModifiers.shift) modifiers |= 0x0100;
-    if (aModifiers.shiftRight) modifiers |= 0x0200;
-    if (aModifiers.ctrl) modifiers |= 0x0400;
-    if (aModifiers.ctrlRight) modifiers |= 0x0800;
-    if (aModifiers.alt) modifiers |= 0x1000;
-    if (aModifiers.altRight) modifiers |= 0x2000;
-    if (IS_WIN && aModifiers.altGr) {
-      if (!aModifiers.ctrl && !aModifiers.ctrlRight) {
-        modifiers |= 0x0400;
-      }
-      if (!aModifiers.alt && !aModifiers.altRight) {
-        modifiers |= 0x1000;
-      }
-    }
-    if (aModifiers.command) modifiers |= 0x4000;
-    if (aModifiers.commandRight) modifiers |= 0x8000;
-    if (aModifiers.help) modifiers |= 0x10000;
-    if (aModifiers.function) modifiers |= 0x100000;
-    if (aModifiers.numericKeyPad) modifiers |= 0x01000000;
-
-    utils.sendNativeKeyEvent(aLayout, aKeyCode, modifiers,
-                             aSystemChars, aSystemUnmodifiedChars);
-  }
-}
-
-var keyboardLayouts;
-if (IS_MAC) {
-  // Any unused number is okay for adding new keyboard layout.
-  // When you add new keyboard layout here, you need to modify
-  // TISInputSourceWrapper::InitByLayoutID().
-  keyboardLayouts = {
-    "US":              0,
-    "Greek":           1,
-    "German":          2,
-    "Swedish":         3,
-    "Dvorak-Qwerty":   4,
-    "Thai":            5
-  };
-} else if (IS_WIN) {
-  // These constants can be found by inspecting registry keys under
-  // HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Keyboard Layouts
-  keyboardLayouts = {
-    "US":0x409,
-    "German":0x407,
-    "Greek":0x408,
-    "Spanish":0x40a,
-    "French":0x40c,
-    "Swedish":0x41d,
-    "Arabic":0x401,
-    "Hebrew":0x40d,
-    "Japanese":0x411,
-    "Norwegian":0x414,
-    "BrazilianABNT":0x416,
-    "Lithuanian":0x10427,
-    "Thai": 0x2041e
-  };
-}
-
 function eventToString(aEvent)
 {
-  var name = aEvent.layout + " keyCode=" +
+  var name = aEvent.layout.name + " keyCode=" +
     aEvent.keyCode + " (0x" + aEvent.keyCode.toString(16).toUpperCase() +
       ") chars='" + aEvent.chars + "'";
-  if (aEvent.shift) {
+  if (typeof aEvent.unmodifiedChars === "string") {
+    name += " unmodifiedChars='" + aEvent.unmodifiedChars + "'";
+  }
+  if (aEvent.modifiers.shiftKey) {
     name += " [Shift]";
   }
-  if (aEvent.shiftRight) {
+  if (aEvent.modifiers.shiftRightKey) {
     name += " [Right Shift]";
   }
-  if (aEvent.ctrl) {
+  if (aEvent.modifiers.ctrlKey) {
     name += " [Ctrl]";
   }
-  if (aEvent.ctrlRight) {
+  if (aEvent.modifiers.ctrlRightKey) {
     name += " [Right Ctrl]";
   }
-  if (aEvent.alt) {
+  if (aEvent.modifiers.altKey) {
     name += " [Alt]";
   }
-  if (aEvent.altRight) {
+  if (aEvent.modifiers.altRightKey) {
     name += " [Right Alt]";
   }
-  if (aEvent.command) {
+  if (aEvent.modifiers.metaKey) {
     name += " [Command]";
   }
-  if (aEvent.commandRight) {
+  if (aEvent.modifiers.metaRightKey) {
     name += " [Right Command]";
   }
 
   return name;  
 }
 
 function synthesizeKey(aEvent, aFocusElementId)
 {
   document.getElementById(aFocusElementId).focus();
 
-  synthesizeNativeKey(keyboardLayouts[aEvent.layout],
-                      aEvent.keyCode, aEvent, aEvent.chars, aEvent.unmodifiedChars);
+  var sent = synthesizeNativeKey(aEvent.layout, aEvent.keyCode,
+                                 aEvent.modifiers,
+                                 aEvent.chars, aEvent.unmodifiedChars);
+  ok(sent, "synthesizeNativeKey() should send a native key event");
 }
 
 // Test the charcodes and modifiers being delivered to keypress handlers and
 // also keydown/keyup events too.
 function runKeyEventTests()
 {
   const nsIDOMKeyEvent = Components.interfaces.nsIDOMKeyEvent;
   var eventList, keyDownFlags, keyUpFlags, testingEvent, expectedDOMKeyCode;
@@ -211,47 +147,53 @@ function runKeyEventTests()
         flags = keyUpFlags;
       }
       switch (e.keyCode) {
         case e.DOM_VK_SHIFT:
           is(e.ctrlKey, (flags & kCtrlFlag) != 0, name + ", Ctrl of Shift " + e.type + " event mismatch");
           is(e.metaKey, (flags & kMetaFlag) != 0, name + ", Command of Shift " + e.type + " event mismatch");
           is(e.altKey, (flags & kAltFlag) != 0, name + ", Alt of Shift " + e.type + " event mismatch");
           is(e.shiftKey, e.type == "keydown", name + ", Shift of Shift " + e.type + " event mismatch");
-          return (testingEvent.shift || testingEvent.shiftRight) && removeFlag(e, kShiftFlag) && expectedDOMKeyCode != e.keyCode;
+          return (testingEvent.modifiers.shiftKey || testingEvent.modifiers.shiftRightKey) &&
+                 removeFlag(e, kShiftFlag) && expectedDOMKeyCode != e.keyCode;
         case e.DOM_VK_CONTROL:
           is(e.ctrlKey, e.type == "keydown", name + ", Ctrl of Ctrl " + e.type + " event mismatch");
           is(e.metaKey, (flags & kMetaFlag) != 0, name + ", Command of Ctrl " + e.type + " event mismatch");
           is(e.altKey, (flags & kAltFlag) != 0, name + ", Alt of Ctrl " + e.type + " event mismatch");
           is(e.shiftKey, (flags & kShiftFlag) != 0, name + ", Shift of Ctrl " + e.type + " event mismatch");
-          return (testingEvent.ctrl || testingEvent.ctrlRight || (IS_WIN && testingEvent.altGr)) && removeFlag(e, kCtrlFlag) && expectedDOMKeyCode != e.keyCode;
+          return (testingEvent.modifiers.ctrlKey || testingEvent.modifiers.ctrlRightKey || (IS_WIN && testingEvent.modifiers.altGrKey)) &&
+                 removeFlag(e, kCtrlFlag) && expectedDOMKeyCode != e.keyCode;
         case e.DOM_VK_ALT:
           is(e.ctrlKey, (flags & kCtrlFlag) != 0, name + ", Ctrl of Alt " + e.type + " event mismatch");
           is(e.metaKey, (flags & kMetaFlag) != 0, name + ", Command of Alt " + e.type + " event mismatch");
           is(e.altKey, e.type == "keydown", name + ", Alt of Alt " + e.type + " event mismatch");
           is(e.shiftKey, (flags & kShiftFlag) != 0, name + ", Shift of Alt " + e.type + " event mismatch");
-          return (testingEvent.alt || testingEvent.altRight || (IS_WIN && testingEvent.altGr)) && removeFlag(e, kAltFlag) && expectedDOMKeyCode != e.keyCode;
+          return (testingEvent.modifiers.altKey || testingEvent.modifiers.altRightKey || (IS_WIN && testingEvent.modifiers.altGrKey)) &&
+                 removeFlag(e, kAltFlag) && expectedDOMKeyCode != e.keyCode;
         case e.DOM_VK_META:
           is(e.ctrlKey, (flags & kCtrlFlag) != 0, name + ", Ctrl of Command " + e.type + " evnet mismatch");
           is(e.metaKey, e.type == "keydown", name + ", Command of Command " + e.type + " evnet mismatch");
           is(e.altKey, (flags & kAltFlag) != 0, name + ", Alt of Command " + e.type + " evnet mismatch");
           is(e.shiftKey, (flags & kShiftFlag) != 0, name + ", Shift of Command " + e.type + " evnet mismatch");
-          return testingEvent.command && removeFlag(e, kMetaFlag) && expectedDOMKeyCode != e.keyCode;
+          return (testingEvent.modifiers.metaKey || testingEvent.modifiers.metaRightKey) &&
+                 removeFlag(e, kMetaFlag) && expectedDOMKeyCode != e.keyCode;
         case e.DOM_VK_NUM_LOCK:
           is(e.ctrlKey, (flags & kCtrlFlag) != 0, name + ", Ctrl of NumLock " + e.type + " event mismatch");
           is(e.metaKey, (flags & kMetaFlag) != 0, name + ", Command of NumLock " + e.type + " event mismatch");
           is(e.altKey, (flags & kAltFlag) != 0, name + ", Alt of NumLock " + e.type + " event mismatch");
           is(e.shiftKey, (flags & kShiftFlag) != 0, name + ", Shift of NumLock " + e.type + " event mismatch");
-          return testingEvent.numLock && removeFlag(e, kNumLockFlag) && expectedDOMKeyCode != e.keyCode;
+          return (testingEvent.modifiers.numLockKey || testingEvent.modifiers.numericKeyPadKey) &&
+                 removeFlag(e, kNumLockFlag) && expectedDOMKeyCode != e.keyCode;
         case e.DOM_VK_CAPS_LOCK:
           is(e.ctrlKey, (flags & kCtrlFlag) != 0, name + ", Ctrl of CapsLock " + e.type + " event mismatch");
           is(e.metaKey, (flags & kMetaFlag) != 0, name + ", Command of CapsLock " + e.type + " event mismatch");
           is(e.altKey, (flags & kAltFlag) != 0, name + ", Alt of CapsLock " + e.type + " event mismatch");
           is(e.shiftKey, (flags & kShiftFlag) != 0, name + ", Shift of CapsLock " + e.type + " event mismatch");
-          return testingEvent.capsLock && removeFlag(e, kCapsLockFlag) && expectedDOMKeyCode != e.keyCode;
+          return testingEvent.modifiers.capsLockKey &&
+                 removeFlag(e, kCapsLockFlag) && expectedDOMKeyCode != e.keyCode;
       }
       return false;
     }
 
     // Ignore the state changing key events which is fired by the testing event.
     if (!isStateChangingModifierKeyEvent(e))
       eventList.push(e);
     if (e.type == "keypress") {
@@ -284,37 +226,46 @@ function runKeyEventTests()
     eventList = [];
 
     // The modifier key events which are fired for state changing are har to
     // test. We should ignore them for now.
     keyDownFlags = keyUpFlags = 0;
     if (!IS_MAC) {
       // On Mac, nsChildView doesn't generate modifier keydown/keyup events for
       // state changing for synthesizeNativeKeyEvent.
-      if (aEvent.shift || aEvent.shiftRight)
+      if (aEvent.modifiers.shiftKey || aEvent.modifiers.shiftRightKey) {
         keyDownFlags |= kShiftFlag;
-      if (aEvent.ctrl || aEvent.ctrlRight || (IS_WIN && aEvent.altGr))
+      }
+      if (aEvent.modifiers.ctrlKey || aEvent.modifiers.ctrlRightKey ||
+          (IS_WIN && aEvent.modifiers.altGrKey)) {
         keyDownFlags |= kCtrlFlag;
-      if (aEvent.alt || aEvent.altRight || (IS_WIN && aEvent.altGr))
+      }
+      if (aEvent.modifiers.altKey || aEvent.modifiers.altRightKey ||
+          (IS_WIN && aEvent.modifiers.altGrKey)) {
         keyDownFlags |= kAltFlag;
-      if (aEvent.command)
+      }
+      if (aEvent.modifiers.metaKey || aEvent.modifiers.metaRightKey) {
         keyDownFlags |= kMetaFlag;
-      if (aEvent.numLock)
+      }
+      if (aEvent.modifiers.numLockKey || aEvent.modifiers.numericKeyPadKey) {
         keyDownFlags |= kNumLockFlag;
-      if (aEvent.capsLock)
+      }
+      if (aEvent.modifiers.capsLockKey) {
         keyDownFlags |= kCapsLockFlag;
+      }
       keyUpFlags = keyDownFlags;
     }
 
     testingEvent = aEvent;
     expectedDOMKeyCode = aExpectedGeckoKeyCode;
 
-    synthesizeKey(aEvent, "button");
+    var name = eventToString(aEvent);
+    ok(true, "Starting: " + name);
 
-    var name = eventToString(aEvent);
+    synthesizeKey(aEvent, "button");
 
     var expectEventTypeList = [];
     if (aShouldDelivedEvent & SHOULD_DELIVER_KEYDOWN)
       expectEventTypeList.push("keydown");
     if (aShouldDelivedEvent & SHOULD_DELIVER_KEYPRESS) {
       expectEventTypeList.push("keypress");
       for (var i = 1; i < aExpectGeckoChar.length; i++) {
         expectEventTypeList.push("keypress");
@@ -332,26 +283,28 @@ function runKeyEventTests()
       if (firedEventType != "")
         is(firedEventType, expectEventType, name + ", wrong type event fired");
       else
         is(firedEventType, expectEventType, name + ", a needed event is not fired");
 
       if (firedEventType != "") {
         var e = eventList[i];
         if (e.type == "keypress") {
-          var isCtrlExpected = aEvent.ctrl || aEvent.ctrlRight || false;
-          var isAltExpected = aEvent.alt || aEvent.altRight || false;
-          if (IS_WIN && aEvent.altGr) {
+          var isCtrlExpected =
+            aEvent.modifiers.ctrlKey || aEvent.modifiers.ctrlRightKey || false;
+          var isAltExpected =
+            aEvent.modifiers.altKey || aEvent.modifiers.altRightKey || false;
+          if (IS_WIN && aEvent.modifiers.altGrKey) {
             isCtrlExpected = isAltExpected =
               ((aShouldDelivedEvent & SHOULD_NOT_CAUSE_INPUT) != 0);
           }
           is(e.ctrlKey, isCtrlExpected, name + ", Ctrl mismatch");
-          is(e.metaKey, aEvent.command || aEvent.commandRight || false, name + ", Command mismatch");
+          is(e.metaKey, aEvent.modifiers.metaKey || aEvent.modifiers.metaRightKey || false, name + ", Command mismatch");
           is(e.altKey, isAltExpected, name + ", Alt mismatch");
-          is(e.shiftKey, aEvent.shift || aEvent.shiftRight || false, name + ", Shift mismatch");
+          is(e.shiftKey, aEvent.modifiers.shiftKey || aEvent.modifiers.shiftRightKey || false, name + ", Shift mismatch");
         }
 
         if (aExpectGeckoChar.length > 0 && e.type == "keypress") {
           is(e.charCode, aExpectGeckoChar.charCodeAt(keypressCount++), name + ", charcode");
           if (aExpectedGeckoKeyCode >= 0) {
             if (aExpectGeckoChar) {
               is(e.keyCode, 0, name + ", wrong keycode");
             } else {
@@ -383,1743 +336,2561 @@ function runKeyEventTests()
     // preferences widget to enable other keyboard layouts and select them from the
     // input menu to see what keyboard events they generate.
     // Note that it's possible to send bogus key events here, e.g.
     // {keyCode:0, chars:"z", unmodifiedChars:"P"} --- sendNativeKeyEvent
     // makes no attempt to verify that the keyCode matches the characters. So only
     // test key event records that you saw Cocoa send.
 
     // Ctrl keys
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, ctrl:1, chars:"\u0001", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1}, chars:"\u0001", unmodifiedChars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, ctrl:1, shift:1, chars:"\u0001", unmodifiedChars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0001", unmodifiedChars:"A"},
             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Alt keys
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, alt:1, chars:"\u00e5", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{altKey:1}, chars:"\u00e5", unmodifiedChars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00e5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, alt:1, shift:1, chars:"\u00c5", unmodifiedChars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{altKey:1, shiftKey:1}, chars:"\u00c5", unmodifiedChars:"A"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00c5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    
+
     // Command keys
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, command:1, chars:"a", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{metaKey:1}, chars:"a", unmodifiedChars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // Shift-cmd gives us the shifted character
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, command:1, shift:1, chars:"a", unmodifiedChars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{metaKey:1, shiftKey:1}, chars:"a", unmodifiedChars:"A"},
             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // Ctrl-cmd gives us the unshifted character
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, command:1, ctrl:1, chars:"\u0001", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{metaKey:1, ctrlKey:1}, chars:"\u0001", unmodifiedChars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // Alt-cmd gives us the shifted character
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, command:1, alt:1, chars:"\u00e5", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{metaKey:1, altKey:1}, chars:"\u00e5", unmodifiedChars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00e5", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, command:1, alt:1, shift:1, chars:"\u00c5", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{metaKey:1, altKey:1, shiftKey:1}, chars:"\u00c5", unmodifiedChars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00c5", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Greek ctrl keys produce Latin charcodes
-    testKey({layout:"Greek", keyCode:MAC_VK_ANSI_A, ctrl:1, chars:"\u0001", unmodifiedChars:"\u03b1"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1}, chars:"\u0001", unmodifiedChars:"\u03b1"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Greek", keyCode:MAC_VK_ANSI_A, ctrl:1, shift:1, chars:"\u0001", unmodifiedChars:"\u0391"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0001", unmodifiedChars:"\u0391"},
             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Greek command keys
-    testKey({layout:"Greek", keyCode:MAC_VK_ANSI_A, command:1, chars:"a", unmodifiedChars:"\u03b1"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
+             modifiers:{metaKey:1}, chars:"a", unmodifiedChars:"\u03b1"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // Shift-cmd gives us the shifted character
-    testKey({layout:"Greek", keyCode:MAC_VK_ANSI_A, command:1, shift:1, chars:"a", unmodifiedChars:"\u0391"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
+             modifiers:{metaKey:1, shiftKey:1}, chars:"a", unmodifiedChars:"\u0391"},
             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // Ctrl-cmd gives us the unshifted character
-    testKey({layout:"Greek", keyCode:MAC_VK_ANSI_A, command:1, ctrl:1, chars:"\u0001", unmodifiedChars:"\u03b1"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
+             modifiers:{metaKey:1, ctrlKey:1}, chars:"\u0001", unmodifiedChars:"\u03b1"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // Alt-cmd gives us the shifted character
-    testKey({layout:"Greek", keyCode:MAC_VK_ANSI_A, command:1, alt:1, chars:"\u00a8", unmodifiedChars:"\u03b1"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
+             modifiers:{metaKey:1, altKey:1}, chars:"\u00a8", unmodifiedChars:"\u03b1"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00a8", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Greek", keyCode:MAC_VK_ANSI_A, command:1, alt:1, shift:1, chars:"\u00b9", unmodifiedChars:"\u0391"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
+             modifiers:{metaKey:1, altKey:1, shiftKey:1}, chars:"\u00b9", unmodifiedChars:"\u0391"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00b9", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // German
-    testKey({layout:"German", keyCode:MAC_VK_ANSI_A, chars:"a", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_A,
+             modifiers: {}, chars:"a", unmodifiedChars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"German", keyCode:MAC_VK_ANSI_LeftBracket, chars:"\u00fc", unmodifiedChars:"\u00fc"},
+    testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_LeftBracket,
+             modifiers: {}, chars:"\u00fc", unmodifiedChars:"\u00fc"},
             0, "\u00fc", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"German", keyCode:MAC_VK_ANSI_Minus, chars:"\u00df", unmodifiedChars:"\u00df"},
+    testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_Minus,
+             modifiers: {}, chars:"\u00df", unmodifiedChars:"\u00df"},
             nsIDOMKeyEvent.DOM_VK_QUESTION_MARK, "\u00df", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"German", keyCode:MAC_VK_ANSI_Minus, shift:1, chars:"?", unmodifiedChars:"?"},
+    testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_Minus,
+             modifiers:{shiftKey:1}, chars:"?", unmodifiedChars:"?"},
             nsIDOMKeyEvent.DOM_VK_QUESTION_MARK, "?", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // Note that Shift+SS is '?' but Cmd+Shift+SS is '/' on German layout.
     // Therefore, when Cmd key is pressed, the SS key's keycode is changed.
-    testKey({layout:"German", keyCode:MAC_VK_ANSI_Minus, command:1, chars:"\u00df", unmodifiedChars:"\u00df"},
+    testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_Minus,
+             modifiers:{metaKey:1}, chars:"\u00df", unmodifiedChars:"\u00df"},
             nsIDOMKeyEvent.DOM_VK_SLASH, "\u00df", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"German", keyCode:MAC_VK_ANSI_Minus, command:1, shift:1, chars:"/", unmodifiedChars:"?"},
+    testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_Minus,
+             modifiers:{metaKey:1, shiftKey:1}, chars:"/", unmodifiedChars:"?"},
             nsIDOMKeyEvent.DOM_VK_SLASH, "?", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Caps Lock key event
     // XXX keyup event of Caps Lock key is not fired.
-    testKey({layout:"US", keyCode:MAC_VK_CapsLock, capsLock:1, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_CapsLock,
+             modifiers:{capsLockKey:1}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_CAPS_LOCK, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_CapsLock, capsLock:0, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_CapsLock,
+             modifiers:{capsLockKey:0}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_CAPS_LOCK, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Shift/RightShift key event
-    testKey({layout:"US", keyCode:MAC_VK_Shift, shift:1, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Shift,
+             modifiers:{shiftKey:1}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_SHIFT, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
-    testKey({layout:"US", keyCode:MAC_VK_Shift, shift:0, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Shift,
+             modifiers:{shiftKey:0}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_SHIFT, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
-    testKey({layout:"US", keyCode:MAC_VK_RightShift, shiftRight:1, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightShift,
+             modifiers:{shiftRightKey:1}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_SHIFT, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
-    testKey({layout:"US", keyCode:MAC_VK_RightShift, shiftRight:0, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightShift,
+             modifiers:{shiftRightKey:0}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_SHIFT, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
 
     // Control/RightControl key event
-    testKey({layout:"US", keyCode:MAC_VK_Control, ctrl:1, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Control,
+             modifiers:{ctrlKey:1}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_CONTROL, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
-    testKey({layout:"US", keyCode:MAC_VK_Control, ctrl:0, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Control,
+             modifiers:{ctrlKey:0}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_CONTROL, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
-    testKey({layout:"US", keyCode:MAC_VK_RightControl, ctrlRight:1, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightControl,
+             modifiers:{ctrlRightKey:1}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_CONTROL, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
-    testKey({layout:"US", keyCode:MAC_VK_RightControl, ctrlRight:0, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightControl,
+             modifiers:{ctrlRightKey:0}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_CONTROL, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
 
     // Option/RightOption key event
-    testKey({layout:"US", keyCode:MAC_VK_Option, alt:1, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Option,
+             modifiers:{altKey:1}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_ALT, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
-    testKey({layout:"US", keyCode:MAC_VK_Option, alt:0, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Option,
+             modifiers:{altKey:0}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_ALT, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
-    testKey({layout:"US", keyCode:MAC_VK_RightOption, altRight:1, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightOption,
+             modifiers:{altRightKey:1}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_ALT, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
-    testKey({layout:"US", keyCode:MAC_VK_RightOption, altRight:0, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightOption,
+             modifiers:{altRightKey:0}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_ALT, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
 
     // Command/RightCommand key event
-    testKey({layout:"US", keyCode:MAC_VK_Command, command:1, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Command,
+             modifiers:{metaKey:1}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_META, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
-    testKey({layout:"US", keyCode:MAC_VK_Command, command:0, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Command,
+             modifiers:{metaKey:0}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_META, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
-    testKey({layout:"US", keyCode:MAC_VK_RightCommand, commandRight:1, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightCommand,
+             modifiers:{metaRightKey:1}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_META, "", SHOULD_DELIVER_KEYDOWN, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
-    testKey({layout:"US", keyCode:MAC_VK_RightCommand, commandRight:0, chars:"", unmodifiedChars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightCommand,
+             modifiers:{metaRightKey:0}, chars:"", unmodifiedChars:""},
             nsIDOMKeyEvent.DOM_VK_META, "", SHOULD_DELIVER_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
 
     // all keys on keyboard (keyCode test)
-    testKey({layout:"US", keyCode:MAC_VK_Tab, chars:"\t", unmodifiedChars:"\t"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Tab,
+             modifiers: {}, chars:"\t", unmodifiedChars:"\t"},
             nsIDOMKeyEvent.DOM_VK_TAB, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadClear, chars:"\uF739", unmodifiedChars:"\uF739"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadClear,
+             modifiers: {}, chars:"\uF739", unmodifiedChars:"\uF739"},
             nsIDOMKeyEvent.DOM_VK_CLEAR, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_Return, chars:"\u000D", unmodifiedChars:"\u000D"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Return,
+             modifiers: {}, chars:"\u000D", unmodifiedChars:"\u000D"},
             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F15, chars:"\uF712", unmodifiedChars:"\uF712"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F15,
+             modifiers: {}, chars:"\uF712", unmodifiedChars:"\uF712"},
             nsIDOMKeyEvent.DOM_VK_PAUSE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_Escape, chars:"\u001B", unmodifiedChars:"\u001B"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Escape,
+             modifiers: {}, chars:"\u001B", unmodifiedChars:"\u001B"},
             nsIDOMKeyEvent.DOM_VK_ESCAPE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_Space, chars:" ", unmodifiedChars:" "},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Space,
+             modifiers: {}, chars:" ", unmodifiedChars:" "},
             nsIDOMKeyEvent.DOM_VK_SPACE, " ", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_PageUp, chars:"\uF72C", unmodifiedChars:"\uF72C"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_PageUp,
+             modifiers: {}, chars:"\uF72C", unmodifiedChars:"\uF72C"},
             nsIDOMKeyEvent.DOM_VK_PAGE_UP, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_PageDown, chars:"\uF72D", unmodifiedChars:"\uF72D"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_PageDown,
+             modifiers: {}, chars:"\uF72D", unmodifiedChars:"\uF72D"},
             nsIDOMKeyEvent.DOM_VK_PAGE_DOWN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_End, chars:"\uF72B", unmodifiedChars:"\uF72B"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_End,
+             modifiers: {}, chars:"\uF72B", unmodifiedChars:"\uF72B"},
             nsIDOMKeyEvent.DOM_VK_END, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_Home, chars:"\uF729", unmodifiedChars:"\uF729"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_Home,
+             modifiers: {}, chars:"\uF729", unmodifiedChars:"\uF729"},
             nsIDOMKeyEvent.DOM_VK_HOME, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_LeftArrow, chars:"\uF702", unmodifiedChars:"\uF702"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_LeftArrow,
+             modifiers: {}, chars:"\uF702", unmodifiedChars:"\uF702"},
             nsIDOMKeyEvent.DOM_VK_LEFT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_UpArrow, chars:"\uF700", unmodifiedChars:"\uF700"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_UpArrow,
+             modifiers: {}, chars:"\uF700", unmodifiedChars:"\uF700"},
             nsIDOMKeyEvent.DOM_VK_UP, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_RightArrow, chars:"\uF703", unmodifiedChars:"\uF703"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_RightArrow,
+             modifiers: {}, chars:"\uF703", unmodifiedChars:"\uF703"},
             nsIDOMKeyEvent.DOM_VK_RIGHT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_DownArrow, chars:"\uF701", unmodifiedChars:"\uF701"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_DownArrow,
+             modifiers: {}, chars:"\uF701", unmodifiedChars:"\uF701"},
             nsIDOMKeyEvent.DOM_VK_DOWN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_PC_PrintScreen, chars:"\uF710", unmodifiedChars:"\uF710"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_PC_PrintScreen,
+             modifiers: {}, chars:"\uF710", unmodifiedChars:"\uF710"},
             nsIDOMKeyEvent.DOM_VK_PRINTSCREEN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_PC_Delete, chars:"\uF728", unmodifiedChars:"\uF728"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_PC_Delete,
+             modifiers: {}, chars:"\uF728", unmodifiedChars:"\uF728"},
             nsIDOMKeyEvent.DOM_VK_DELETE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_PC_Pause, chars:"\uF711", unmodifiedChars:"\uF711"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_PC_Pause,
+             modifiers: {}, chars:"\uF711", unmodifiedChars:"\uF711"},
             nsIDOMKeyEvent.DOM_VK_SCROLL_LOCK, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_PC_ContextMenu, chars:"\u0010", unmodifiedChars:"\u0010"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_PC_ContextMenu,
+             modifiers: {}, chars:"\u0010", unmodifiedChars:"\u0010"},
             nsIDOMKeyEvent.DOM_VK_CONTEXT_MENU, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"US", keyCode:MAC_VK_F1, function:1, chars:"\uF704", unmodifiedChars:"\uF704"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F1,
+             modifiers:{fnKey:1}, chars:"\uF704", unmodifiedChars:"\uF704"},
             nsIDOMKeyEvent.DOM_VK_F1, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F2, function:1, chars:"\uF705", unmodifiedChars:"\uF705"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F2,
+             modifiers:{fnKey:1}, chars:"\uF705", unmodifiedChars:"\uF705"},
             nsIDOMKeyEvent.DOM_VK_F2, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F3, function:1, chars:"\uF706", unmodifiedChars:"\uF706"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F3,
+             modifiers:{fnKey:1}, chars:"\uF706", unmodifiedChars:"\uF706"},
             nsIDOMKeyEvent.DOM_VK_F3, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F4, function:1, chars:"\uF707", unmodifiedChars:"\uF707"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F4,
+             modifiers:{fnKey:1}, chars:"\uF707", unmodifiedChars:"\uF707"},
             nsIDOMKeyEvent.DOM_VK_F4, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F5, function:1, chars:"\uF708", unmodifiedChars:"\uF708"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F5,
+             modifiers:{fnKey:1}, chars:"\uF708", unmodifiedChars:"\uF708"},
             nsIDOMKeyEvent.DOM_VK_F5, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F6, function:1, chars:"\uF709", unmodifiedChars:"\uF709"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F6,
+             modifiers:{fnKey:1}, chars:"\uF709", unmodifiedChars:"\uF709"},
             nsIDOMKeyEvent.DOM_VK_F6, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F7, function:1, chars:"\uF70A", unmodifiedChars:"\uF70A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F7,
+             modifiers:{fnKey:1}, chars:"\uF70A", unmodifiedChars:"\uF70A"},
             nsIDOMKeyEvent.DOM_VK_F7, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F8, function:1, chars:"\uF70B", unmodifiedChars:"\uF70B"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F8,
+             modifiers:{fnKey:1}, chars:"\uF70B", unmodifiedChars:"\uF70B"},
             nsIDOMKeyEvent.DOM_VK_F8, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F9, function:1, chars:"\uF70C", unmodifiedChars:"\uF70C"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F9,
+             modifiers:{fnKey:1}, chars:"\uF70C", unmodifiedChars:"\uF70C"},
             nsIDOMKeyEvent.DOM_VK_F9, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F10, function:1, chars:"\uF70D", unmodifiedChars:"\uF70D"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F10,
+             modifiers:{fnKey:1}, chars:"\uF70D", unmodifiedChars:"\uF70D"},
             nsIDOMKeyEvent.DOM_VK_F10, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F11, function:1, chars:"\uF70E", unmodifiedChars:"\uF70E"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F11,
+             modifiers:{fnKey:1}, chars:"\uF70E", unmodifiedChars:"\uF70E"},
             nsIDOMKeyEvent.DOM_VK_F11, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F12, function:1, chars:"\uF70F", unmodifiedChars:"\uF70F"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F12,
+             modifiers:{fnKey:1}, chars:"\uF70F", unmodifiedChars:"\uF70F"},
             nsIDOMKeyEvent.DOM_VK_F12, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F16, function:1, chars:"\uF713", unmodifiedChars:"\uF713"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F16,
+             modifiers:{fnKey:1}, chars:"\uF713", unmodifiedChars:"\uF713"},
             nsIDOMKeyEvent.DOM_VK_F16, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F17, function:1, chars:"\uF714", unmodifiedChars:"\uF714"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F17,
+             modifiers:{fnKey:1}, chars:"\uF714", unmodifiedChars:"\uF714"},
             nsIDOMKeyEvent.DOM_VK_F17, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F18, function:1, chars:"\uF715", unmodifiedChars:"\uF715"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F18,
+             modifiers:{fnKey:1}, chars:"\uF715", unmodifiedChars:"\uF715"},
             nsIDOMKeyEvent.DOM_VK_F18, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_F19, function:1, chars:"\uF716", unmodifiedChars:"\uF716"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_F19,
+             modifiers:{fnKey:1}, chars:"\uF716", unmodifiedChars:"\uF716"},
             nsIDOMKeyEvent.DOM_VK_F19, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // US
     // Alphabet
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, chars:"a", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers: {}, chars:"a", unmodifiedChars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, shift:1, chars:"A", unmodifiedChars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{shiftKey:1}, chars:"A", unmodifiedChars:"A"},
             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, ctrl:1, chars:"\u0001", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1}, chars:"\u0001", unmodifiedChars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, alt:1, chars:"\u00E5", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{altKey:1}, chars:"\u00E5", unmodifiedChars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00E5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, command:1, chars:"a", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{metaKey:1}, chars:"a", unmodifiedChars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_B, chars:"b", unmodifiedChars:"b"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_B,
+             modifiers:{}, chars:"b", unmodifiedChars:"b"},
             nsIDOMKeyEvent.DOM_VK_B, "b", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_B, shift:1, chars:"B", unmodifiedChars:"B"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_B,
+             modifiers:{shiftKey:1}, chars:"B", unmodifiedChars:"B"},
             nsIDOMKeyEvent.DOM_VK_B, "B", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_B, ctrl:1, chars:"\u0002", unmodifiedChars:"b"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_B,
+             modifiers:{ctrlKey:1}, chars:"\u0002", unmodifiedChars:"b"},
             nsIDOMKeyEvent.DOM_VK_B, "b", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_B, alt:1, chars:"\u222B", unmodifiedChars:"b"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_B,
+             modifiers:{altKey:1}, chars:"\u222B", unmodifiedChars:"b"},
             nsIDOMKeyEvent.DOM_VK_B, "\u222B", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_B, command:1, chars:"b", unmodifiedChars:"b"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_B,
+             modifiers:{metaKey:1}, chars:"b", unmodifiedChars:"b"},
             nsIDOMKeyEvent.DOM_VK_B, "b", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_C, chars:"c", unmodifiedChars:"c"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_C,
+             modifiers:{}, chars:"c", unmodifiedChars:"c"},
             nsIDOMKeyEvent.DOM_VK_C, "c", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_C, shift:1, chars:"C", unmodifiedChars:"C"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_C,
+             modifiers:{shiftKey:1}, chars:"C", unmodifiedChars:"C"},
             nsIDOMKeyEvent.DOM_VK_C, "C", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_C, ctrl:1, chars:"\u0003", unmodifiedChars:"c"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_C,
+             modifiers:{ctrlKey:1}, chars:"\u0003", unmodifiedChars:"c"},
             nsIDOMKeyEvent.DOM_VK_C, "c", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_C, alt:1, chars:"\u00E7", unmodifiedChars:"c"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_C,
+             modifiers:{altKey:1}, chars:"\u00E7", unmodifiedChars:"c"},
             nsIDOMKeyEvent.DOM_VK_C, "\u00E7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_C, command:1, chars:"c", unmodifiedChars:"c"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_C,
+             modifiers:{metaKey:1}, chars:"c", unmodifiedChars:"c"},
             nsIDOMKeyEvent.DOM_VK_C, "c", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_D, chars:"d", unmodifiedChars:"d"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_D,
+             modifiers:{}, chars:"d", unmodifiedChars:"d"},
             nsIDOMKeyEvent.DOM_VK_D, "d", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_D, shift:1, chars:"D", unmodifiedChars:"D"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_D,
+             modifiers:{shiftKey:1}, chars:"D", unmodifiedChars:"D"},
             nsIDOMKeyEvent.DOM_VK_D, "D", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_D, ctrl:1, chars:"\u0004", unmodifiedChars:"d"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_D,
+             modifiers:{ctrlKey:1}, chars:"\u0004", unmodifiedChars:"d"},
             nsIDOMKeyEvent.DOM_VK_D, "d", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_D, alt:1, chars:"\u2202", unmodifiedChars:"d"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_D,
+             modifiers:{altKey:1}, chars:"\u2202", unmodifiedChars:"d"},
             nsIDOMKeyEvent.DOM_VK_D, "\u2202", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_D, command:1, chars:"d", unmodifiedChars:"d"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_D,
+             modifiers:{metaKey:1}, chars:"d", unmodifiedChars:"d"},
             nsIDOMKeyEvent.DOM_VK_D, "d", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_E, chars:"e", unmodifiedChars:"e"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_E,
+             modifiers:{}, chars:"e", unmodifiedChars:"e"},
             nsIDOMKeyEvent.DOM_VK_E, "e", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_E, shift:1, chars:"E", unmodifiedChars:"E"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_E,
+             modifiers:{shiftKey:1}, chars:"E", unmodifiedChars:"E"},
             nsIDOMKeyEvent.DOM_VK_E, "E", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_E, ctrl:1, chars:"\u0005", unmodifiedChars:"e"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_E,
+             modifiers:{ctrlKey:1}, chars:"\u0005", unmodifiedChars:"e"},
             nsIDOMKeyEvent.DOM_VK_E, "e", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_E, alt:1, chars:"", unmodifiedChars:"e"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_E,
+             modifiers:{altKey:1}, chars:"", unmodifiedChars:"e"},
             nsIDOMKeyEvent.DOM_VK_E, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // dead key
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_E, command:1, chars:"e", unmodifiedChars:"e"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_E,
+             modifiers:{metaKey:1}, chars:"e", unmodifiedChars:"e"},
             nsIDOMKeyEvent.DOM_VK_E, "e", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_F, chars:"f", unmodifiedChars:"f"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_F,
+             modifiers:{}, chars:"f", unmodifiedChars:"f"},
             nsIDOMKeyEvent.DOM_VK_F, "f", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_F, shift:1, chars:"F", unmodifiedChars:"F"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_F,
+             modifiers:{shiftKey:1}, chars:"F", unmodifiedChars:"F"},
             nsIDOMKeyEvent.DOM_VK_F, "F", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_F, ctrl:1, chars:"\u0006", unmodifiedChars:"f"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_F,
+             modifiers:{ctrlKey:1}, chars:"\u0006", unmodifiedChars:"f"},
             nsIDOMKeyEvent.DOM_VK_F, "f", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_F, alt:1, chars:"\u0192", unmodifiedChars:"f"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_F,
+             modifiers:{altKey:1}, chars:"\u0192", unmodifiedChars:"f"},
             nsIDOMKeyEvent.DOM_VK_F, "\u0192", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // XXX This test starts fullscreen mode.
-    // testKey({layout:"US", keyCode:MAC_VK_ANSI_F, command:1, chars:"f", unmodifiedChars:"f"},
+    // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_F,
+    //          modifiers:{metaKey:1}, chars:"f", unmodifiedChars:"f"},
     //         nsIDOMKeyEvent.DOM_VK_F, "f", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_G, chars:"g", unmodifiedChars:"g"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_G,
+             modifiers:{}, chars:"g", unmodifiedChars:"g"},
             nsIDOMKeyEvent.DOM_VK_G, "g", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_G, shift:1, chars:"G", unmodifiedChars:"G"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_G,
+             modifiers:{shiftKey:1}, chars:"G", unmodifiedChars:"G"},
             nsIDOMKeyEvent.DOM_VK_G, "G", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_G, ctrl:1, chars:"\u0007", unmodifiedChars:"g"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_G,
+             modifiers:{ctrlKey:1}, chars:"\u0007", unmodifiedChars:"g"},
             nsIDOMKeyEvent.DOM_VK_G, "g", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_G, alt:1, chars:"\u00A9", unmodifiedChars:"g"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_G,
+             modifiers:{altKey:1}, chars:"\u00A9", unmodifiedChars:"g"},
             nsIDOMKeyEvent.DOM_VK_G, "\u00A9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_G, command:1, chars:"g", unmodifiedChars:"g"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_G,
+             modifiers:{metaKey:1}, chars:"g", unmodifiedChars:"g"},
             nsIDOMKeyEvent.DOM_VK_G, "g", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_H, chars:"h", unmodifiedChars:"h"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_H,
+             modifiers:{}, chars:"h", unmodifiedChars:"h"},
             nsIDOMKeyEvent.DOM_VK_H, "h", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_H, shift:1, chars:"H", unmodifiedChars:"H"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_H,
+             modifiers:{shiftKey:1}, chars:"H", unmodifiedChars:"H"},
             nsIDOMKeyEvent.DOM_VK_H, "H", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_H, ctrl:1, chars:"\u0008", unmodifiedChars:"h"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_H,
+             modifiers:{ctrlKey:1}, chars:"\u0008", unmodifiedChars:"h"},
             nsIDOMKeyEvent.DOM_VK_H, "h", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_H, alt:1, chars:"\u02D9", unmodifiedChars:"h"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_H,
+             modifiers:{altKey:1}, chars:"\u02D9", unmodifiedChars:"h"},
             nsIDOMKeyEvent.DOM_VK_H, "\u02D9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_H, command:1, chars:"h", unmodifiedChars:"h"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_H,
+             modifiers:{metaKey:1}, chars:"h", unmodifiedChars:"h"},
             nsIDOMKeyEvent.DOM_VK_H, "h", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_I, chars:"i", unmodifiedChars:"i"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_I,
+             modifiers:{}, chars:"i", unmodifiedChars:"i"},
             nsIDOMKeyEvent.DOM_VK_I, "i", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_I, shift:1, chars:"I", unmodifiedChars:"I"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_I,
+             modifiers:{shiftKey:1}, chars:"I", unmodifiedChars:"I"},
             nsIDOMKeyEvent.DOM_VK_I, "I", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_I, ctrl:1, chars:"\u0009", unmodifiedChars:"i"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_I,
+             modifiers:{ctrlKey:1}, chars:"\u0009", unmodifiedChars:"i"},
             nsIDOMKeyEvent.DOM_VK_I, "i", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_I, alt:1, chars:"", unmodifiedChars:"i"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_I,
+             modifiers:{altKey:1}, chars:"", unmodifiedChars:"i"},
             nsIDOMKeyEvent.DOM_VK_I, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // dead key
     // XXX This test causes memory leak.
-    // testKey({layout:"US", keyCode:MAC_VK_ANSI_I, command:1, chars:"i", unmodifiedChars:"i"},
+    // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_I,
+    //          modifiers:{metaKey:1}, chars:"i", unmodifiedChars:"i"},
     //         nsIDOMKeyEvent.DOM_VK_I, "i", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_J, chars:"j", unmodifiedChars:"j"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_J,
+             modifiers:{}, chars:"j", unmodifiedChars:"j"},
             nsIDOMKeyEvent.DOM_VK_J, "j", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_J, shift:1, chars:"J", unmodifiedChars:"J"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_J,
+             modifiers:{shiftKey:1}, chars:"J", unmodifiedChars:"J"},
             nsIDOMKeyEvent.DOM_VK_J, "J", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_J, ctrl:1, chars:"\u000A", unmodifiedChars:"j"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_J,
+             modifiers:{ctrlKey:1}, chars:"\u000A", unmodifiedChars:"j"},
             nsIDOMKeyEvent.DOM_VK_J, "j", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_J, alt:1, chars:"\u2206", unmodifiedChars:"j"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_J,
+             modifiers:{altKey:1}, chars:"\u2206", unmodifiedChars:"j"},
             nsIDOMKeyEvent.DOM_VK_J, "\u2206", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_J, command:1, chars:"j", unmodifiedChars:"j"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_J,
+             modifiers:{metaKey:1}, chars:"j", unmodifiedChars:"j"},
             nsIDOMKeyEvent.DOM_VK_J, "j", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_K, chars:"k", unmodifiedChars:"k"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_K,
+             modifiers:{}, chars:"k", unmodifiedChars:"k"},
             nsIDOMKeyEvent.DOM_VK_K, "k", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_K, shift:1, chars:"K", unmodifiedChars:"K"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_K,
+             modifiers:{shiftKey:1}, chars:"K", unmodifiedChars:"K"},
             nsIDOMKeyEvent.DOM_VK_K, "K", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_K, ctrl:1, chars:"\u000B", unmodifiedChars:"k"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_K,
+             modifiers:{ctrlKey:1}, chars:"\u000B", unmodifiedChars:"k"},
             nsIDOMKeyEvent.DOM_VK_K, "k", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_K, alt:1, chars:"\u02DA", unmodifiedChars:"k"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_K,
+             modifiers:{altKey:1}, chars:"\u02DA", unmodifiedChars:"k"},
             nsIDOMKeyEvent.DOM_VK_K, "\u02DA", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_K, command:1, chars:"k", unmodifiedChars:"k"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_K,
+             modifiers:{metaKey:1}, chars:"k", unmodifiedChars:"k"},
             nsIDOMKeyEvent.DOM_VK_K, "k", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_L, chars:"l", unmodifiedChars:"l"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_L,
+             modifiers:{}, chars:"l", unmodifiedChars:"l"},
             nsIDOMKeyEvent.DOM_VK_L, "l", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_L, shift:1, chars:"L", unmodifiedChars:"L"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_L,
+             modifiers:{shiftKey:1}, chars:"L", unmodifiedChars:"L"},
             nsIDOMKeyEvent.DOM_VK_L, "L", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_L, ctrl:1, chars:"\u000C", unmodifiedChars:"l"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_L,
+             modifiers:{ctrlKey:1}, chars:"\u000C", unmodifiedChars:"l"},
             nsIDOMKeyEvent.DOM_VK_L, "l", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_L, alt:1, chars:"\u00AC", unmodifiedChars:"l"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_L,
+             modifiers:{altKey:1}, chars:"\u00AC", unmodifiedChars:"l"},
             nsIDOMKeyEvent.DOM_VK_L, "\u00AC", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_L, command:1, chars:"l", unmodifiedChars:"l"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_L,
+             modifiers:{metaKey:1}, chars:"l", unmodifiedChars:"l"},
             nsIDOMKeyEvent.DOM_VK_L, "l", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_M, chars:"m", unmodifiedChars:"m"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_M,
+             modifiers:{}, chars:"m", unmodifiedChars:"m"},
             nsIDOMKeyEvent.DOM_VK_M, "m", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_M, shift:1, chars:"M", unmodifiedChars:"M"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_M,
+             modifiers:{shiftKey:1}, chars:"M", unmodifiedChars:"M"},
             nsIDOMKeyEvent.DOM_VK_M, "M", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_M, ctrl:1, chars:"\u000D", unmodifiedChars:"m"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_M,
+             modifiers:{ctrlKey:1}, chars:"\u000D", unmodifiedChars:"m"},
             nsIDOMKeyEvent.DOM_VK_M, "m", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_M, alt:1, chars:"\u00B5", unmodifiedChars:"m"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_M,
+             modifiers:{altKey:1}, chars:"\u00B5", unmodifiedChars:"m"},
             nsIDOMKeyEvent.DOM_VK_M, "\u00B5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_M, command:1, chars:"m", unmodifiedChars:"m"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_M,
+             modifiers:{metaKey:1}, chars:"m", unmodifiedChars:"m"},
             nsIDOMKeyEvent.DOM_VK_M, "m", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_N, chars:"n", unmodifiedChars:"n"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_N,
+             modifiers:{}, chars:"n", unmodifiedChars:"n"},
             nsIDOMKeyEvent.DOM_VK_N, "n", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_N, shift:1, chars:"N", unmodifiedChars:"N"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_N,
+             modifiers:{shiftKey:1}, chars:"N", unmodifiedChars:"N"},
             nsIDOMKeyEvent.DOM_VK_N, "N", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_N, ctrl:1, chars:"\u000E", unmodifiedChars:"n"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_N,
+             modifiers:{ctrlKey:1}, chars:"\u000E", unmodifiedChars:"n"},
             nsIDOMKeyEvent.DOM_VK_N, "n", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_N, alt:1, chars:"", unmodifiedChars:"n"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_N,
+             modifiers:{altKey:1}, chars:"", unmodifiedChars:"n"},
             nsIDOMKeyEvent.DOM_VK_N, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // dead key
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_N, command:1, chars:"n", unmodifiedChars:"n"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_N,
+             modifiers:{metaKey:1}, chars:"n", unmodifiedChars:"n"},
             nsIDOMKeyEvent.DOM_VK_N, "n", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_O, chars:"o", unmodifiedChars:"o"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_O,
+             modifiers:{}, chars:"o", unmodifiedChars:"o"},
             nsIDOMKeyEvent.DOM_VK_O, "o", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_O, shift:1, chars:"O", unmodifiedChars:"O"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_O,
+             modifiers:{shiftKey:1}, chars:"O", unmodifiedChars:"O"},
             nsIDOMKeyEvent.DOM_VK_O, "O", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_O, ctrl:1, chars:"\u000F", unmodifiedChars:"o"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_O,
+             modifiers:{ctrlKey:1}, chars:"\u000F", unmodifiedChars:"o"},
             nsIDOMKeyEvent.DOM_VK_O, "o", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_O, alt:1, chars:"\u00F8", unmodifiedChars:"o"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_O,
+             modifiers:{altKey:1}, chars:"\u00F8", unmodifiedChars:"o"},
             nsIDOMKeyEvent.DOM_VK_O, "\u00F8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_O, command:1, chars:"o", unmodifiedChars:"o"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_O,
+             modifiers:{metaKey:1}, chars:"o", unmodifiedChars:"o"},
             nsIDOMKeyEvent.DOM_VK_O, "o", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_P, chars:"p", unmodifiedChars:"p"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_P,
+             modifiers:{}, chars:"p", unmodifiedChars:"p"},
             nsIDOMKeyEvent.DOM_VK_P, "p", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_P, shift:1, chars:"P", unmodifiedChars:"P"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_P,
+             modifiers:{shiftKey:1}, chars:"P", unmodifiedChars:"P"},
             nsIDOMKeyEvent.DOM_VK_P, "P", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_P, ctrl:1, chars:"\u0010", unmodifiedChars:"p"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_P,
+             modifiers:{ctrlKey:1}, chars:"\u0010", unmodifiedChars:"p"},
             nsIDOMKeyEvent.DOM_VK_P, "p", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_P, alt:1, chars:"\u03C0", unmodifiedChars:"p"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_P,
+             modifiers:{altKey:1}, chars:"\u03C0", unmodifiedChars:"p"},
             nsIDOMKeyEvent.DOM_VK_P, "\u03C0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // XXX This test starts private browsing mode (stopped at the confirmation dialog)
-    // testKey({layout:"US", keyCode:MAC_VK_ANSI_P, command:1, chars:"p", unmodifiedChars:"p"},
+    // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_P,
+    //          modifiers:{metaKey:1}, chars:"p", unmodifiedChars:"p"},
     //         nsIDOMKeyEvent.DOM_VK_P, "p", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Q, chars:"q", unmodifiedChars:"q"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Q,
+             modifiers:{}, chars:"q", unmodifiedChars:"q"},
             nsIDOMKeyEvent.DOM_VK_Q, "q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Q, shift:1, chars:"Q", unmodifiedChars:"Q"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Q,
+             modifiers:{shiftKey:1}, chars:"Q", unmodifiedChars:"Q"},
             nsIDOMKeyEvent.DOM_VK_Q, "Q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Q, ctrl:1, chars:"\u0011", unmodifiedChars:"q"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Q,
+             modifiers:{ctrlKey:1}, chars:"\u0011", unmodifiedChars:"q"},
             nsIDOMKeyEvent.DOM_VK_Q, "q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Q, alt:1, chars:"\u0153", unmodifiedChars:"q"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Q,
+             modifiers:{altKey:1}, chars:"\u0153", unmodifiedChars:"q"},
             nsIDOMKeyEvent.DOM_VK_Q, "\u0153", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Q, command:1, chars:"q", unmodifiedChars:"q"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Q,
+             modifiers:{metaKey:1}, chars:"q", unmodifiedChars:"q"},
             nsIDOMKeyEvent.DOM_VK_Q, "q", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_R, chars:"r", unmodifiedChars:"r"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_R,
+             modifiers:{}, chars:"r", unmodifiedChars:"r"},
             nsIDOMKeyEvent.DOM_VK_R, "r", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_R, shift:1, chars:"R", unmodifiedChars:"R"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_R,
+             modifiers:{shiftKey:1}, chars:"R", unmodifiedChars:"R"},
             nsIDOMKeyEvent.DOM_VK_R, "R", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_R, ctrl:1, chars:"\u0012", unmodifiedChars:"r"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_R,
+             modifiers:{ctrlKey:1}, chars:"\u0012", unmodifiedChars:"r"},
             nsIDOMKeyEvent.DOM_VK_R, "r", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_R, alt:1, chars:"\u00AE", unmodifiedChars:"r"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_R,
+             modifiers:{altKey:1}, chars:"\u00AE", unmodifiedChars:"r"},
             nsIDOMKeyEvent.DOM_VK_R, "\u00AE", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // XXX This test makes some tabs and dialogs.
-    // testKey({layout:"US", keyCode:MAC_VK_ANSI_R, command:1, chars:"r", unmodifiedChars:"r"},
+    // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_R,
+    //          modifiers:{metaKey:1}, chars:"r", unmodifiedChars:"r"},
     //         nsIDOMKeyEvent.DOM_VK_R, "r", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_S, chars:"s", unmodifiedChars:"s"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_S,
+             modifiers:{}, chars:"s", unmodifiedChars:"s"},
             nsIDOMKeyEvent.DOM_VK_S, "s", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_S, shift:1, chars:"S", unmodifiedChars:"S"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_S,
+             modifiers:{shiftKey:1}, chars:"S", unmodifiedChars:"S"},
             nsIDOMKeyEvent.DOM_VK_S, "S", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_S, ctrl:1, chars:"\u0013", unmodifiedChars:"s"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_S,
+             modifiers:{ctrlKey:1}, chars:"\u0013", unmodifiedChars:"s"},
             nsIDOMKeyEvent.DOM_VK_S, "s", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_S, alt:1, chars:"\u00DF", unmodifiedChars:"s"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_S,
+             modifiers:{altKey:1}, chars:"\u00DF", unmodifiedChars:"s"},
             nsIDOMKeyEvent.DOM_VK_S, "\u00DF", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_S, command:1, chars:"s", unmodifiedChars:"s"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_S,
+             modifiers:{metaKey:1}, chars:"s", unmodifiedChars:"s"},
             nsIDOMKeyEvent.DOM_VK_S, "s", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_T, chars:"t", unmodifiedChars:"t"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_T,
+             modifiers:{}, chars:"t", unmodifiedChars:"t"},
             nsIDOMKeyEvent.DOM_VK_T, "t", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_T, shift:1, chars:"T", unmodifiedChars:"T"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_T,
+             modifiers:{shiftKey:1}, chars:"T", unmodifiedChars:"T"},
             nsIDOMKeyEvent.DOM_VK_T, "T", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_T, ctrl:1, chars:"\u0014", unmodifiedChars:"t"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_T,
+             modifiers:{ctrlKey:1}, chars:"\u0014", unmodifiedChars:"t"},
             nsIDOMKeyEvent.DOM_VK_T, "t", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_T, alt:1, chars:"\u2020", unmodifiedChars:"t"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_T,
+             modifiers:{altKey:1}, chars:"\u2020", unmodifiedChars:"t"},
             nsIDOMKeyEvent.DOM_VK_T, "\u2020", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_T, command:1, chars:"t", unmodifiedChars:"t"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_T,
+             modifiers:{metaKey:1}, chars:"t", unmodifiedChars:"t"},
             nsIDOMKeyEvent.DOM_VK_T, "t", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_U, chars:"u", unmodifiedChars:"u"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_U,
+             modifiers:{}, chars:"u", unmodifiedChars:"u"},
             nsIDOMKeyEvent.DOM_VK_U, "u", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_U, shift:1, chars:"U", unmodifiedChars:"U"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_U,
+             modifiers:{shiftKey:1}, chars:"U", unmodifiedChars:"U"},
             nsIDOMKeyEvent.DOM_VK_U, "U", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_U, ctrl:1, chars:"\u0015", unmodifiedChars:"u"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_U,
+             modifiers:{ctrlKey:1}, chars:"\u0015", unmodifiedChars:"u"},
             nsIDOMKeyEvent.DOM_VK_U, "u", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_U, alt:1, chars:"", unmodifiedChars:"u"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_U,
+             modifiers:{altKey:1}, chars:"", unmodifiedChars:"u"},
             nsIDOMKeyEvent.DOM_VK_U, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // dead key
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_U, command:1, chars:"u", unmodifiedChars:"u"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_U,
+             modifiers:{metaKey:1}, chars:"u", unmodifiedChars:"u"},
             nsIDOMKeyEvent.DOM_VK_U, "u", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_V, chars:"v", unmodifiedChars:"v"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_V,
+             modifiers:{}, chars:"v", unmodifiedChars:"v"},
             nsIDOMKeyEvent.DOM_VK_V, "v", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_V, shift:1, chars:"V", unmodifiedChars:"V"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_V,
+             modifiers:{shiftKey:1}, chars:"V", unmodifiedChars:"V"},
             nsIDOMKeyEvent.DOM_VK_V, "V", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_V, ctrl:1, chars:"\u0016", unmodifiedChars:"v"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_V,
+             modifiers:{ctrlKey:1}, chars:"\u0016", unmodifiedChars:"v"},
             nsIDOMKeyEvent.DOM_VK_V, "v", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_V, alt:1, chars:"\u221A", unmodifiedChars:"v"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_V,
+             modifiers:{altKey:1}, chars:"\u221A", unmodifiedChars:"v"},
             nsIDOMKeyEvent.DOM_VK_V, "\u221A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_V, command:1, chars:"v", unmodifiedChars:"v"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_V,
+             modifiers:{metaKey:1}, chars:"v", unmodifiedChars:"v"},
             nsIDOMKeyEvent.DOM_VK_V, "v", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_W, chars:"w", unmodifiedChars:"w"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_W,
+             modifiers:{}, chars:"w", unmodifiedChars:"w"},
             nsIDOMKeyEvent.DOM_VK_W, "w", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_W, shift:1, chars:"W", unmodifiedChars:"W"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_W,
+             modifiers:{shiftKey:1}, chars:"W", unmodifiedChars:"W"},
             nsIDOMKeyEvent.DOM_VK_W, "W", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_W, ctrl:1, chars:"\u0017", unmodifiedChars:"w"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_W,
+             modifiers:{ctrlKey:1}, chars:"\u0017", unmodifiedChars:"w"},
             nsIDOMKeyEvent.DOM_VK_W, "w", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_W, alt:1, chars:"\u2211", unmodifiedChars:"w"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_W,
+             modifiers:{altKey:1}, chars:"\u2211", unmodifiedChars:"w"},
             nsIDOMKeyEvent.DOM_VK_W, "\u2211", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_W, command:1, chars:"w", unmodifiedChars:"w"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_W,
+             modifiers:{metaKey:1}, chars:"w", unmodifiedChars:"w"},
             nsIDOMKeyEvent.DOM_VK_W, "w", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_X, chars:"x", unmodifiedChars:"x"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_X,
+             modifiers:{}, chars:"x", unmodifiedChars:"x"},
             nsIDOMKeyEvent.DOM_VK_X, "x", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_X, shift:1, chars:"X", unmodifiedChars:"X"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_X,
+             modifiers:{shiftKey:1}, chars:"X", unmodifiedChars:"X"},
             nsIDOMKeyEvent.DOM_VK_X, "X", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_X, ctrl:1, chars:"\u0018", unmodifiedChars:"x"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_X,
+             modifiers:{ctrlKey:1}, chars:"\u0018", unmodifiedChars:"x"},
             nsIDOMKeyEvent.DOM_VK_X, "x", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_X, alt:1, chars:"\u2248", unmodifiedChars:"x"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_X,
+             modifiers:{altKey:1}, chars:"\u2248", unmodifiedChars:"x"},
             nsIDOMKeyEvent.DOM_VK_X, "\u2248", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_X, command:1, chars:"x", unmodifiedChars:"x"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_X,
+             modifiers:{metaKey:1}, chars:"x", unmodifiedChars:"x"},
             nsIDOMKeyEvent.DOM_VK_X, "x", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Y, chars:"y", unmodifiedChars:"y"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Y,
+             modifiers:{}, chars:"y", unmodifiedChars:"y"},
             nsIDOMKeyEvent.DOM_VK_Y, "y", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Y, shift:1, chars:"Y", unmodifiedChars:"Y"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Y,
+             modifiers:{shiftKey:1}, chars:"Y", unmodifiedChars:"Y"},
             nsIDOMKeyEvent.DOM_VK_Y, "Y", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Y, ctrl:1, chars:"\u0019", unmodifiedChars:"y"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Y,
+             modifiers:{ctrlKey:1}, chars:"\u0019", unmodifiedChars:"y"},
             nsIDOMKeyEvent.DOM_VK_Y, "y", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Y, alt:1, chars:"\u00A5", unmodifiedChars:"y"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Y,
+             modifiers:{altKey:1}, chars:"\u00A5", unmodifiedChars:"y"},
             nsIDOMKeyEvent.DOM_VK_Y, "\u00A5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Y, command:1, chars:"y", unmodifiedChars:"y"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Y,
+             modifiers:{metaKey:1}, chars:"y", unmodifiedChars:"y"},
             nsIDOMKeyEvent.DOM_VK_Y, "y", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Z, chars:"z", unmodifiedChars:"z"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Z,
+             modifiers:{}, chars:"z", unmodifiedChars:"z"},
             nsIDOMKeyEvent.DOM_VK_Z, "z", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Z, shift:1, chars:"Z", unmodifiedChars:"Z"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Z,
+             modifiers:{shiftKey:1}, chars:"Z", unmodifiedChars:"Z"},
             nsIDOMKeyEvent.DOM_VK_Z, "Z", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Z, ctrl:1, chars:"\u001A", unmodifiedChars:"z"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Z,
+             modifiers:{ctrlKey:1}, chars:"\u001A", unmodifiedChars:"z"},
             nsIDOMKeyEvent.DOM_VK_Z, "z", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Z, alt:1, chars:"\u03A9", unmodifiedChars:"z"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Z,
+             modifiers:{altKey:1}, chars:"\u03A9", unmodifiedChars:"z"},
             nsIDOMKeyEvent.DOM_VK_Z, "\u03A9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Z, command:1, chars:"z", unmodifiedChars:"z"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Z,
+             modifiers:{metaKey:1}, chars:"z", unmodifiedChars:"z"},
             nsIDOMKeyEvent.DOM_VK_Z, "z", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // numeric
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_1, chars:"1", unmodifiedChars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_1,
+             modifiers:{}, chars:"1", unmodifiedChars:"1"},
             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_1, shift:1, chars:"!", unmodifiedChars:"!"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_1,
+             modifiers:{shiftKey:1}, chars:"!", unmodifiedChars:"!"},
             nsIDOMKeyEvent.DOM_VK_1, "!", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_1, ctrl:1, chars:"1", unmodifiedChars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_1,
+             modifiers:{ctrlKey:1}, chars:"1", unmodifiedChars:"1"},
             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_1, alt:1, chars:"\u00A1", unmodifiedChars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_1,
+             modifiers:{altKey:1}, chars:"\u00A1", unmodifiedChars:"1"},
             nsIDOMKeyEvent.DOM_VK_1, "\u00A1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_1, command:1, chars:"1", unmodifiedChars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_1,
+             modifiers:{metaKey:1}, chars:"1", unmodifiedChars:"1"},
             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_2, chars:"2", unmodifiedChars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_2,
+             modifiers:{}, chars:"2", unmodifiedChars:"2"},
             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_2, shift:1, chars:"@", unmodifiedChars:"@"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_2,
+             modifiers:{shiftKey:1}, chars:"@", unmodifiedChars:"@"},
             nsIDOMKeyEvent.DOM_VK_2, "@", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_2, ctrl:1, chars:"2", unmodifiedChars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_2,
+             modifiers:{ctrlKey:1}, chars:"2", unmodifiedChars:"2"},
             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_2, alt:1, chars:"\u00A1", unmodifiedChars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_2,
+             modifiers:{altKey:1}, chars:"\u00A1", unmodifiedChars:"2"},
             nsIDOMKeyEvent.DOM_VK_2, "\u00A1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_2, command:1, chars:"2", unmodifiedChars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_2,
+             modifiers:{metaKey:1}, chars:"2", unmodifiedChars:"2"},
             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_3, chars:"3", unmodifiedChars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_3,
+             modifiers:{}, chars:"3", unmodifiedChars:"3"},
             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_3, shift:1, chars:"#", unmodifiedChars:"#"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_3,
+             modifiers:{shiftKey:1}, chars:"#", unmodifiedChars:"#"},
             nsIDOMKeyEvent.DOM_VK_3, "#", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_3, ctrl:1, chars:"3", unmodifiedChars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_3,
+             modifiers:{ctrlKey:1}, chars:"3", unmodifiedChars:"3"},
             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_3, alt:1, chars:"\u00A3", unmodifiedChars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_3,
+             modifiers:{altKey:1}, chars:"\u00A3", unmodifiedChars:"3"},
             nsIDOMKeyEvent.DOM_VK_3, "\u00A3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_3, command:1, chars:"3", unmodifiedChars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_3,
+             modifiers:{metaKey:1}, chars:"3", unmodifiedChars:"3"},
             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_4, chars:"4", unmodifiedChars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_4,
+             modifiers:{}, chars:"4", unmodifiedChars:"4"},
             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_4, shift:1, chars:"$", unmodifiedChars:"$"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_4,
+             modifiers:{shiftKey:1}, chars:"$", unmodifiedChars:"$"},
             nsIDOMKeyEvent.DOM_VK_4, "$", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_4, ctrl:1, chars:"4", unmodifiedChars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_4,
+             modifiers:{ctrlKey:1}, chars:"4", unmodifiedChars:"4"},
             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_4, alt:1, chars:"\u00A2", unmodifiedChars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_4,
+             modifiers:{altKey:1}, chars:"\u00A2", unmodifiedChars:"4"},
             nsIDOMKeyEvent.DOM_VK_4, "\u00A2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_4, command:1, chars:"4", unmodifiedChars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_4,
+             modifiers:{metaKey:1}, chars:"4", unmodifiedChars:"4"},
             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_5, chars:"5", unmodifiedChars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_5,
+             modifiers:{}, chars:"5", unmodifiedChars:"5"},
             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_5, shift:1, chars:"%", unmodifiedChars:"%"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_5,
+             modifiers:{shiftKey:1}, chars:"%", unmodifiedChars:"%"},
             nsIDOMKeyEvent.DOM_VK_5, "%", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_5, ctrl:1, chars:"5", unmodifiedChars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_5,
+             modifiers:{ctrlKey:1}, chars:"5", unmodifiedChars:"5"},
             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_5, alt:1, chars:"\u221E", unmodifiedChars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_5,
+             modifiers:{altKey:1}, chars:"\u221E", unmodifiedChars:"5"},
             nsIDOMKeyEvent.DOM_VK_5, "\u221E", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_5, command:1, chars:"5", unmodifiedChars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_5,
+             modifiers:{metaKey:1}, chars:"5", unmodifiedChars:"5"},
             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_6, chars:"6", unmodifiedChars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_6,
+             modifiers:{}, chars:"6", unmodifiedChars:"6"},
             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_6, shift:1, chars:"^", unmodifiedChars:"^"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_6,
+             modifiers:{shiftKey:1}, chars:"^", unmodifiedChars:"^"},
             nsIDOMKeyEvent.DOM_VK_6, "^", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_6, ctrl:1, chars:"6", unmodifiedChars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_6,
+             modifiers:{ctrlKey:1}, chars:"6", unmodifiedChars:"6"},
             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_6, alt:1, chars:"\u00A7", unmodifiedChars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_6,
+             modifiers:{altKey:1}, chars:"\u00A7", unmodifiedChars:"6"},
             nsIDOMKeyEvent.DOM_VK_6, "\u00A7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_6, command:1, chars:"6", unmodifiedChars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_6,
+             modifiers:{metaKey:1}, chars:"6", unmodifiedChars:"6"},
             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_7, chars:"7", unmodifiedChars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_7,
+             modifiers:{}, chars:"7", unmodifiedChars:"7"},
             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_7, shift:1, chars:"\u0026;", unmodifiedChars:"\u0026;"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_7,
+             modifiers:{shiftKey:1}, chars:"\u0026;", unmodifiedChars:"\u0026;"},
             nsIDOMKeyEvent.DOM_VK_7, "\u0026", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_7, ctrl:1, chars:"7", unmodifiedChars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_7,
+             modifiers:{ctrlKey:1}, chars:"7", unmodifiedChars:"7"},
             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_7, alt:1, chars:"\u00B6", unmodifiedChars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_7,
+             modifiers:{altKey:1}, chars:"\u00B6", unmodifiedChars:"7"},
             nsIDOMKeyEvent.DOM_VK_7, "\u00B6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_7, command:1, chars:"7", unmodifiedChars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_7,
+             modifiers:{metaKey:1}, chars:"7", unmodifiedChars:"7"},
             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_8, chars:"8", unmodifiedChars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_8,
+             modifiers:{}, chars:"8", unmodifiedChars:"8"},
             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_8, shift:1, chars:"*", unmodifiedChars:"*"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_8,
+             modifiers:{shiftKey:1}, chars:"*", unmodifiedChars:"*"},
             nsIDOMKeyEvent.DOM_VK_8, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_8, ctrl:1, chars:"8", unmodifiedChars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_8,
+             modifiers:{ctrlKey:1}, chars:"8", unmodifiedChars:"8"},
             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_8, alt:1, chars:"\u2022", unmodifiedChars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_8,
+             modifiers:{altKey:1}, chars:"\u2022", unmodifiedChars:"8"},
             nsIDOMKeyEvent.DOM_VK_8, "\u2022", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_8, command:1, chars:"8", unmodifiedChars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_8,
+             modifiers:{metaKey:1}, chars:"8", unmodifiedChars:"8"},
             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_9, chars:"9", unmodifiedChars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_9,
+             modifiers:{}, chars:"9", unmodifiedChars:"9"},
             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_9, shift:1, chars:"(", unmodifiedChars:"("},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_9,
+             modifiers:{shiftKey:1}, chars:"(", unmodifiedChars:"("},
             nsIDOMKeyEvent.DOM_VK_9, "(", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_9, ctrl:1, chars:"9", unmodifiedChars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_9,
+             modifiers:{ctrlKey:1}, chars:"9", unmodifiedChars:"9"},
             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_9, alt:1, chars:"\u00AA", unmodifiedChars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_9,
+             modifiers:{altKey:1}, chars:"\u00AA", unmodifiedChars:"9"},
             nsIDOMKeyEvent.DOM_VK_9, "\u00AA", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_9, command:1, chars:"9", unmodifiedChars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_9,
+             modifiers:{metaKey:1}, chars:"9", unmodifiedChars:"9"},
             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_0, chars:"0", unmodifiedChars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_0,
+             modifiers:{}, chars:"0", unmodifiedChars:"0"},
             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_0, shift:1, chars:")", unmodifiedChars:")"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_0,
+             modifiers:{shiftKey:1}, chars:")", unmodifiedChars:")"},
             nsIDOMKeyEvent.DOM_VK_0, ")", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_0, ctrl:1, chars:"0", unmodifiedChars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_0,
+             modifiers:{ctrlKey:1}, chars:"0", unmodifiedChars:"0"},
             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_0, alt:1, chars:"\u00BA", unmodifiedChars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_0,
+             modifiers:{altKey:1}, chars:"\u00BA", unmodifiedChars:"0"},
             nsIDOMKeyEvent.DOM_VK_0, "\u00BA", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_0, command:1, chars:"0", unmodifiedChars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_0,
+             modifiers:{metaKey:1}, chars:"0", unmodifiedChars:"0"},
             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // other chracters
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Grave, chars:"`", unmodifiedChars:"`"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Grave,
+             modifiers:{}, chars:"`", unmodifiedChars:"`"},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "`", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Grave, shift:1, chars:"~", unmodifiedChars:"~"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Grave,
+             modifiers:{shiftKey:1}, chars:"~", unmodifiedChars:"~"},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "~", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Grave, ctrl:1, chars:"`", unmodifiedChars:"`"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Grave,
+             modifiers:{ctrlKey:1}, chars:"`", unmodifiedChars:"`"},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "`", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Grave, alt:1, chars:"", unmodifiedChars:"`"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Grave,
+             modifiers:{altKey:1}, chars:"", unmodifiedChars:"`"},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // dead key
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Grave, command:1, chars:"`", unmodifiedChars:"`"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Grave,
+             modifiers:{metaKey:1}, chars:"`", unmodifiedChars:"`"},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "`", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Minus, chars:"-", unmodifiedChars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Minus,
+             modifiers:{}, chars:"-", unmodifiedChars:"-"},
             nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Minus, shift:1, chars:"_", unmodifiedChars:"_"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Minus,
+             modifiers:{shiftKey:1}, chars:"_", unmodifiedChars:"_"},
             nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "_", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // TODO:
-    // testKey({layout:"US", keyCode:MAC_VK_ANSI_Minus, ctrl:1, chars:"\u001F", unmodifiedChars:"-"},
+    // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Minus,
+    //          modifiers:{ctrlKey:1}, chars:"\u001F", unmodifiedChars:"-"},
     //         nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Minus, alt:1, chars:"\u2013", unmodifiedChars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Minus,
+             modifiers:{altKey:1}, chars:"\u2013", unmodifiedChars:"-"},
             nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "\u2013", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Minus, command:1, chars:"-", unmodifiedChars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Minus,
+             modifiers:{metaKey:1}, chars:"-", unmodifiedChars:"-"},
             nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "-", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Equal, chars:"=", unmodifiedChars:"="},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Equal,
+             modifiers:{}, chars:"=", unmodifiedChars:"="},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Equal, shift:1, chars:"+", unmodifiedChars:"+"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Equal,
+             modifiers:{shiftKey:1}, chars:"+", unmodifiedChars:"+"},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Equal, ctrl:1, chars:"=", unmodifiedChars:"="},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Equal,
+             modifiers:{ctrlKey:1}, chars:"=", unmodifiedChars:"="},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Equal, alt:1, chars:"\u2260", unmodifiedChars:"="},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Equal,
+             modifiers:{altKey:1}, chars:"\u2260", unmodifiedChars:"="},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "\u2260", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Equal, command:1, chars:"=", unmodifiedChars:"="},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Equal,
+             modifiers:{metaKey:1}, chars:"=", unmodifiedChars:"="},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_LeftBracket, chars:"[", unmodifiedChars:"["},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_LeftBracket,
+             modifiers:{}, chars:"[", unmodifiedChars:"["},
             nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "[", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_LeftBracket, shift:1, chars:"{", unmodifiedChars:"{"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_LeftBracket,
+             modifiers:{shiftKey:1}, chars:"{", unmodifiedChars:"{"},
             nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "{", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // TODO:
-    // testKey({layout:"US", keyCode:MAC_VK_ANSI_LeftBracket, ctrl:1, chars:"\u001B", unmodifiedChars:"["},
+    // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_LeftBracket,
+    //          modifiers:{ctrlKey:1}, chars:"\u001B", unmodifiedChars:"["},
     //         nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "[", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_LeftBracket, alt:1, chars:"\u201C", unmodifiedChars:"["},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_LeftBracket,
+             modifiers:{altKey:1}, chars:"\u201C", unmodifiedChars:"["},
             nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "\u201C", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_LeftBracket, command:1, chars:"[", unmodifiedChars:"["},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_LeftBracket,
+             modifiers:{metaKey:1}, chars:"[", unmodifiedChars:"["},
             nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "[", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_RightBracket, chars:"]", unmodifiedChars:"]"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_RightBracket,
+             modifiers:{}, chars:"]", unmodifiedChars:"]"},
             nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "]", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_RightBracket, shift:1, chars:"}", unmodifiedChars:"}"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_RightBracket,
+             modifiers:{shiftKey:1}, chars:"}", unmodifiedChars:"}"},
             nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "}", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // TODO:
-    // testKey({layout:"US", keyCode:MAC_VK_ANSI_RightBracket, ctrl:1, chars:"\u001D", unmodifiedChars:"]"},
+    // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_RightBracket,
+    //          modifiers:{ctrlKey:1}, chars:"\u001D", unmodifiedChars:"]"},
     //         nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "]", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_RightBracket, alt:1, chars:"\u2018", unmodifiedChars:"]"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_RightBracket,
+             modifiers:{altKey:1}, chars:"\u2018", unmodifiedChars:"]"},
             nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "\u2018", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_RightBracket, command:1, chars:"]", unmodifiedChars:"]"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_RightBracket,
+             modifiers:{metaKey:1}, chars:"]", unmodifiedChars:"]"},
             nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "]", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Backslash, chars:"\\", unmodifiedChars:"\\"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Backslash,
+             modifiers:{}, chars:"\\", unmodifiedChars:"\\"},
             nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "\\", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Backslash, shift:1, chars:"|", unmodifiedChars:"|"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Backslash,
+             modifiers:{shiftKey:1}, chars:"|", unmodifiedChars:"|"},
             nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "|", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // TODO:
-    // testKey({layout:"US", keyCode:MAC_VK_ANSI_Backslash, ctrl:1, chars:"\u001C", unmodifiedChars:"\\"},
+    // testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Backslash,
+    //          modifiers:{ctrlKey:1}, chars:"\u001C", unmodifiedChars:"\\"},
     //         nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "\\", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Backslash, alt:1, chars:"\u00AB", unmodifiedChars:"\\"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Backslash,
+             modifiers:{altKey:1}, chars:"\u00AB", unmodifiedChars:"\\"},
             nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "\u00AB", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Backslash, command:1, chars:"\\", unmodifiedChars:"\\"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Backslash,
+             modifiers:{metaKey:1}, chars:"\\", unmodifiedChars:"\\"},
             nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "\\", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Semicolon, chars:";", unmodifiedChars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
+             modifiers:{}, chars:";", unmodifiedChars:";"},
             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ";", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Semicolon, shift:1, chars:":", unmodifiedChars:":"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
+             modifiers:{shiftKey:1}, chars:":", unmodifiedChars:":"},
             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ":", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Semicolon, ctrl:1, chars:";", unmodifiedChars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
+             modifiers:{ctrlKey:1}, chars:";", unmodifiedChars:";"},
             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ";", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Semicolon, alt:1, chars:"\u2026", unmodifiedChars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
+             modifiers:{altKey:1}, chars:"\u2026", unmodifiedChars:";"},
             nsIDOMKeyEvent.DOM_VK_SEMICOLON, "\u2026", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Semicolon, command:1, chars:";", unmodifiedChars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
+             modifiers:{metaKey:1}, chars:";", unmodifiedChars:";"},
             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ";", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Quote, chars:"'", unmodifiedChars:"'"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Quote,
+             modifiers:{}, chars:"'", unmodifiedChars:"'"},
             nsIDOMKeyEvent.DOM_VK_QUOTE, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Quote, shift:1, chars:"\"", unmodifiedChars:"\""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Quote,
+             modifiers:{shiftKey:1}, chars:"\"", unmodifiedChars:"\""},
             nsIDOMKeyEvent.DOM_VK_QUOTE, "\"", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Quote, ctrl:1, chars:"'", unmodifiedChars:"'"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Quote,
+             modifiers:{ctrlKey:1}, chars:"'", unmodifiedChars:"'"},
             nsIDOMKeyEvent.DOM_VK_QUOTE, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Quote, alt:1, chars:"\u00E6", unmodifiedChars:"'"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Quote,
+             modifiers:{altKey:1}, chars:"\u00E6", unmodifiedChars:"'"},
             nsIDOMKeyEvent.DOM_VK_QUOTE, "\u00E6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Quote, command:1, chars:"'", unmodifiedChars:"'"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Quote,
+             modifiers:{metaKey:1}, chars:"'", unmodifiedChars:"'"},
             nsIDOMKeyEvent.DOM_VK_QUOTE, "'", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Comma, chars:",", unmodifiedChars:","},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Comma,
+             modifiers:{}, chars:",", unmodifiedChars:","},
             nsIDOMKeyEvent.DOM_VK_COMMA, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Comma, shift:1, chars:"\u003C", unmodifiedChars:"\u003C"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Comma,
+             modifiers:{shiftKey:1}, chars:"\u003C", unmodifiedChars:"\u003C"},
             nsIDOMKeyEvent.DOM_VK_COMMA, "\u003C", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Comma, ctrl:1, chars:",", unmodifiedChars:","},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Comma,
+             modifiers:{ctrlKey:1}, chars:",", unmodifiedChars:","},
             nsIDOMKeyEvent.DOM_VK_COMMA, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Comma, alt:1, chars:"\u2264", unmodifiedChars:","},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Comma,
+             modifiers:{altKey:1}, chars:"\u2264", unmodifiedChars:","},
             nsIDOMKeyEvent.DOM_VK_COMMA, "\u2264", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Comma, command:1, chars:",", unmodifiedChars:","},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Comma,
+             modifiers:{metaKey:1}, chars:",", unmodifiedChars:","},
             nsIDOMKeyEvent.DOM_VK_COMMA, ",", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Period, chars:".", unmodifiedChars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Period,
+             modifiers:{}, chars:".", unmodifiedChars:"."},
             nsIDOMKeyEvent.DOM_VK_PERIOD, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Period, shift:1, chars:"\u003E", unmodifiedChars:"\u003E"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Period,
+             modifiers:{shiftKey:1}, chars:"\u003E", unmodifiedChars:"\u003E"},
             nsIDOMKeyEvent.DOM_VK_PERIOD, "\u003E", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Period, ctrl:1, chars:".", unmodifiedChars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Period,
+             modifiers:{ctrlKey:1}, chars:".", unmodifiedChars:"."},
             nsIDOMKeyEvent.DOM_VK_PERIOD, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Period, alt:1, chars:"\u2265", unmodifiedChars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Period,
+             modifiers:{altKey:1}, chars:"\u2265", unmodifiedChars:"."},
             nsIDOMKeyEvent.DOM_VK_PERIOD, "\u2265", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Period, command:1, chars:".", unmodifiedChars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Period,
+             modifiers:{metaKey:1}, chars:".", unmodifiedChars:"."},
             nsIDOMKeyEvent.DOM_VK_PERIOD, ".", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Slash, chars:"/", unmodifiedChars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Slash,
+             modifiers:{}, chars:"/", unmodifiedChars:"/"},
             nsIDOMKeyEvent.DOM_VK_SLASH, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Slash, shift:1, chars:"?", unmodifiedChars:"?"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Slash,
+             modifiers:{shiftKey:1}, chars:"?", unmodifiedChars:"?"},
             nsIDOMKeyEvent.DOM_VK_SLASH, "?", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Slash, ctrl:1, chars:"/", unmodifiedChars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Slash,
+             modifiers:{ctrlKey:1}, chars:"/", unmodifiedChars:"/"},
             nsIDOMKeyEvent.DOM_VK_SLASH, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Slash, alt:1, chars:"\u00F7", unmodifiedChars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Slash,
+             modifiers:{altKey:1}, chars:"\u00F7", unmodifiedChars:"/"},
             nsIDOMKeyEvent.DOM_VK_SLASH, "\u00F7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Slash, command:1, chars:"/", unmodifiedChars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Slash,
+             modifiers:{metaKey:1}, chars:"/", unmodifiedChars:"/"},
             nsIDOMKeyEvent.DOM_VK_SLASH, "/", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // numpad
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad1, numLock:1, chars:"1", unmodifiedChars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad1,
+             modifiers:{numericKeyPadKey:1}, chars:"1", unmodifiedChars:"1"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad1, numLock:1, shift:1, chars:"1", unmodifiedChars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad1,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"1", unmodifiedChars:"1"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad1, numLock:1, ctrl:1, chars:"1", unmodifiedChars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad1,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"1", unmodifiedChars:"1"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad1, numLock:1, alt:1, chars:"1", unmodifiedChars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad1,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"1", unmodifiedChars:"1"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad1, numLock:1, command:1, chars:"1", unmodifiedChars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad1,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"1", unmodifiedChars:"1"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD1, "1", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad2, numLock:1, chars:"2", unmodifiedChars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad2,
+             modifiers:{numericKeyPadKey:1}, chars:"2", unmodifiedChars:"2"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad2, numLock:1, shift:1, chars:"2", unmodifiedChars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad2,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"2", unmodifiedChars:"2"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad2, numLock:1, ctrl:1, chars:"2", unmodifiedChars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad2,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"2", unmodifiedChars:"2"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad2, numLock:1, alt:1, chars:"2", unmodifiedChars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad2,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"2", unmodifiedChars:"2"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad2, numLock:1, command:1, chars:"2", unmodifiedChars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad2,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"2", unmodifiedChars:"2"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD2, "2", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad3, numLock:1, chars:"3", unmodifiedChars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad3,
+             modifiers:{numericKeyPadKey:1}, chars:"3", unmodifiedChars:"3"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad3, numLock:1, shift:1, chars:"3", unmodifiedChars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad3,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"3", unmodifiedChars:"3"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad3, numLock:1, ctrl:1, chars:"3", unmodifiedChars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad3,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"3", unmodifiedChars:"3"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad3, numLock:1, alt:1, chars:"3", unmodifiedChars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad3,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"3", unmodifiedChars:"3"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad3, numLock:1, command:1, chars:"3", unmodifiedChars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad3,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"3", unmodifiedChars:"3"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD3, "3", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad4, numLock:1, chars:"4", unmodifiedChars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad4,
+             modifiers:{numericKeyPadKey:1}, chars:"4", unmodifiedChars:"4"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad4, numLock:1, shift:1, chars:"4", unmodifiedChars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad4,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"4", unmodifiedChars:"4"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad4, numLock:1, ctrl:1, chars:"4", unmodifiedChars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad4,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"4", unmodifiedChars:"4"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad4, numLock:1, alt:1, chars:"4", unmodifiedChars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad4,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"4", unmodifiedChars:"4"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad4, numLock:1, command:1, chars:"4", unmodifiedChars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad4,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"4", unmodifiedChars:"4"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD4, "4", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad5, numLock:1, chars:"5", unmodifiedChars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad5,
+             modifiers:{numericKeyPadKey:1}, chars:"5", unmodifiedChars:"5"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad5, numLock:1, shift:1, chars:"5", unmodifiedChars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad5,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"5", unmodifiedChars:"5"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad5, numLock:1, ctrl:1, chars:"5", unmodifiedChars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad5,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"5", unmodifiedChars:"5"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad5, numLock:1, alt:1, chars:"5", unmodifiedChars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad5,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"5", unmodifiedChars:"5"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad5, numLock:1, command:1, chars:"5", unmodifiedChars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad5,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"5", unmodifiedChars:"5"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD5, "5", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad6, numLock:1, chars:"6", unmodifiedChars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad6,
+             modifiers:{numericKeyPadKey:1}, chars:"6", unmodifiedChars:"6"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad6, numLock:1, shift:1, chars:"6", unmodifiedChars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad6,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"6", unmodifiedChars:"6"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad6, numLock:1, ctrl:1, chars:"6", unmodifiedChars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad6,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"6", unmodifiedChars:"6"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad6, numLock:1, alt:1, chars:"6", unmodifiedChars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad6,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"6", unmodifiedChars:"6"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad6, numLock:1, command:1, chars:"6", unmodifiedChars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad6,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"6", unmodifiedChars:"6"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD6, "6", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad7, numLock:1, chars:"7", unmodifiedChars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad7,
+             modifiers:{numericKeyPadKey:1}, chars:"7", unmodifiedChars:"7"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad7, numLock:1, shift:1, chars:"7", unmodifiedChars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad7,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"7", unmodifiedChars:"7"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad7, numLock:1, ctrl:1, chars:"7", unmodifiedChars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad7,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"7", unmodifiedChars:"7"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad7, numLock:1, alt:1, chars:"7", unmodifiedChars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad7,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"7", unmodifiedChars:"7"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad7, numLock:1, command:1, chars:"7", unmodifiedChars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad7,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"7", unmodifiedChars:"7"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD7, "7", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad8, numLock:1, chars:"8", unmodifiedChars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad8,
+             modifiers:{numericKeyPadKey:1}, chars:"8", unmodifiedChars:"8"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad8, numLock:1, shift:1, chars:"8", unmodifiedChars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad8,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"8", unmodifiedChars:"8"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad8, numLock:1, ctrl:1, chars:"8", unmodifiedChars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad8,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"8", unmodifiedChars:"8"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad8, numLock:1, alt:1, chars:"8", unmodifiedChars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad8,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"8", unmodifiedChars:"8"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad8, numLock:1, command:1, chars:"8", unmodifiedChars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad8,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"8", unmodifiedChars:"8"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD8, "8", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad9, numLock:1, chars:"9", unmodifiedChars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad9,
+             modifiers:{numericKeyPadKey:1}, chars:"9", unmodifiedChars:"9"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad9, numLock:1, shift:1, chars:"9", unmodifiedChars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad9,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"9", unmodifiedChars:"9"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad9, numLock:1, ctrl:1, chars:"9", unmodifiedChars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad9,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"9", unmodifiedChars:"9"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad9, numLock:1, alt:1, chars:"9", unmodifiedChars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad9,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"9", unmodifiedChars:"9"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad9, numLock:1, command:1, chars:"9", unmodifiedChars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad9,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"9", unmodifiedChars:"9"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD9, "9", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad0, numLock:1, chars:"0", unmodifiedChars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad0,
+             modifiers:{numericKeyPadKey:1}, chars:"0", unmodifiedChars:"0"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad0, numLock:1, shift:1, chars:"0", unmodifiedChars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad0,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"0", unmodifiedChars:"0"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad0, numLock:1, ctrl:1, chars:"0", unmodifiedChars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad0,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"0", unmodifiedChars:"0"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad0, numLock:1, alt:1, chars:"0", unmodifiedChars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad0,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"0", unmodifiedChars:"0"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Keypad0, numLock:1, command:1, chars:"0", unmodifiedChars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Keypad0,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"0", unmodifiedChars:"0"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD0, "0", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadEquals, numLock:1, chars:"=", unmodifiedChars:"="},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEquals,
+             modifiers:{numericKeyPadKey:1}, chars:"=", unmodifiedChars:"="},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadEquals, numLock:1, shift:1, chars:"=", unmodifiedChars:"="},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEquals,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"=", unmodifiedChars:"="},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadEquals, numLock:1, ctrl:1, chars:"=", unmodifiedChars:"="},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEquals,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"=", unmodifiedChars:"="},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadEquals, numLock:1, alt:1, chars:"=", unmodifiedChars:"="},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEquals,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"=", unmodifiedChars:"="},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadEquals, numLock:1, command:1, chars:"=", unmodifiedChars:"="},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEquals,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"=", unmodifiedChars:"="},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadDivide, numLock:1, chars:"/", unmodifiedChars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadDivide,
+             modifiers:{numericKeyPadKey:1}, chars:"/", unmodifiedChars:"/"},
             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadDivide, numLock:1, shift:1, chars:"/", unmodifiedChars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadDivide,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"/", unmodifiedChars:"/"},
             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadDivide, numLock:1, ctrl:1, chars:"/", unmodifiedChars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadDivide,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"/", unmodifiedChars:"/"},
             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadDivide, numLock:1, alt:1, chars:"/", unmodifiedChars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadDivide,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"/", unmodifiedChars:"/"},
             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadDivide, numLock:1, command:1, chars:"/", unmodifiedChars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadDivide,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"/", unmodifiedChars:"/"},
             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadMultiply, numLock:1, chars:"*", unmodifiedChars:"*"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMultiply,
+             modifiers:{numericKeyPadKey:1}, chars:"*", unmodifiedChars:"*"},
             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadMultiply, numLock:1, shift:1, chars:"*", unmodifiedChars:"*"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMultiply,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"*", unmodifiedChars:"*"},
             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadMultiply, numLock:1, ctrl:1, chars:"*", unmodifiedChars:"*"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMultiply,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"*", unmodifiedChars:"*"},
             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadMultiply, numLock:1, alt:1, chars:"*", unmodifiedChars:"*"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMultiply,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"*", unmodifiedChars:"*"},
             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadMultiply, numLock:1, command:1, chars:"*", unmodifiedChars:"*"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMultiply,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"*", unmodifiedChars:"*"},
             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadMinus, numLock:1, chars:"-", unmodifiedChars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMinus,
+             modifiers:{numericKeyPadKey:1}, chars:"-", unmodifiedChars:"-"},
             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadMinus, numLock:1, shift:1, chars:"-", unmodifiedChars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMinus,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"-", unmodifiedChars:"-"},
             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadMinus, numLock:1, ctrl:1, chars:"-", unmodifiedChars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMinus,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"-", unmodifiedChars:"-"},
             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadMinus, numLock:1, alt:1, chars:"-", unmodifiedChars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMinus,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"-", unmodifiedChars:"-"},
             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadMinus, numLock:1, command:1, chars:"-", unmodifiedChars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadMinus,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"-", unmodifiedChars:"-"},
             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadPlus, numLock:1, chars:"+", unmodifiedChars:"+"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadPlus,
+             modifiers:{numericKeyPadKey:1}, chars:"+", unmodifiedChars:"+"},
             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadPlus, numLock:1, shift:1, chars:"+", unmodifiedChars:"+"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadPlus,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"+", unmodifiedChars:"+"},
             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadPlus, numLock:1, ctrl:1, chars:"+", unmodifiedChars:"+"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadPlus,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"+", unmodifiedChars:"+"},
             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadPlus, numLock:1, alt:1, chars:"+", unmodifiedChars:"+"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadPlus,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"+", unmodifiedChars:"+"},
             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadPlus, numLock:1, command:1, chars:"+", unmodifiedChars:"+"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadPlus,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"+", unmodifiedChars:"+"},
             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadEnter, numLock:1, chars:"\u0003", unmodifiedChars:"\u0003"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEnter,
+             modifiers:{numericKeyPadKey:1}, chars:"\u0003", unmodifiedChars:"\u0003"},
             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadEnter, numLock:1, shift:1, chars:"\u0003", unmodifiedChars:"\u0003"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEnter,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:"\u0003", unmodifiedChars:"\u0003"},
             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadEnter, numLock:1, ctrl:1, chars:"\u0003", unmodifiedChars:"\u0003"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEnter,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:"\u0003", unmodifiedChars:"\u0003"},
             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadEnter, numLock:1, alt:1, chars:"\u0003", unmodifiedChars:"\u0003"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEnter,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:"\u0003", unmodifiedChars:"\u0003"},
             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_KeypadEnter, numLock:1, command:1, chars:"\u0003", unmodifiedChars:"\u0003"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_KeypadEnter,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:"\u0003", unmodifiedChars:"\u0003"},
             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_JIS_KeypadComma, numLock:1, shift:1, chars:",", unmodifiedChars:","},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_JIS_KeypadComma,
+             modifiers:{numericKeyPadKey:1, shiftKey:1}, chars:",", unmodifiedChars:","},
             nsIDOMKeyEvent.DOM_VK_SEPARATOR, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_JIS_KeypadComma, numLock:1, ctrl:1, chars:",", unmodifiedChars:","},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_JIS_KeypadComma,
+             modifiers:{numericKeyPadKey:1, ctrlKey:1}, chars:",", unmodifiedChars:","},
             nsIDOMKeyEvent.DOM_VK_SEPARATOR, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_JIS_KeypadComma, numLock:1, alt:1, chars:",", unmodifiedChars:","},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_JIS_KeypadComma,
+             modifiers:{numericKeyPadKey:1, altKey:1}, chars:",", unmodifiedChars:","},
             nsIDOMKeyEvent.DOM_VK_SEPARATOR, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:MAC_VK_JIS_KeypadComma, numLock:1, command:1, chars:",", unmodifiedChars:","},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_JIS_KeypadComma,
+             modifiers:{numericKeyPadKey:1, metaKey:1}, chars:",", unmodifiedChars:","},
             nsIDOMKeyEvent.DOM_VK_SEPARATOR, ",", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
 
     // French, numeric
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_1, chars:"\u0026", unmodifiedChars:"\u0026"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_1,
+             modifiers:{}, chars:"\u0026", unmodifiedChars:"\u0026"},
             nsIDOMKeyEvent.DOM_VK_1, "\u0026", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_1, shift:1, chars:"1", unmodifiedChars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_1,
+             modifiers:{shiftKey:1}, chars:"1", unmodifiedChars:"1"},
+            nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_1,
+             modifiers:{ctrlKey:1}, chars:"1", unmodifiedChars:"\u0026"},
             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_1, ctrl:1, chars:"1", unmodifiedChars:"\u0026"},
-            nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_1, command:1, chars:"\u0026", unmodifiedChars:"\u0026"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_1,
+             modifiers:{metaKey:1}, chars:"\u0026", unmodifiedChars:"\u0026"},
+            nsIDOMKeyEvent.DOM_VK_1, "\u0026", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_1,
+             modifiers:{metaKey:1, shiftKey:1}, chars:"1", unmodifiedChars:"1"},
             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_2, chars:"\u00E9", unmodifiedChars:"\u00E9"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_2,
+             modifiers:{}, chars:"\u00E9", unmodifiedChars:"\u00E9"},
             nsIDOMKeyEvent.DOM_VK_2, "\u00E9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_2, shift:1, chars:"2", unmodifiedChars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_2,
+             modifiers:{shiftKey:1}, chars:"2", unmodifiedChars:"2"},
+            nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_2,
+             modifiers:{ctrlKey:1}, chars:"2", unmodifiedChars:"\u00E9"},
             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_2, ctrl:1, chars:"2", unmodifiedChars:"\u00E9"},
-            nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_2, command:1, chars:"\u00E9", unmodifiedChars:"\u00E9"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_2,
+             modifiers:{metaKey:1}, chars:"\u00E9", unmodifiedChars:"\u00E9"},
+            nsIDOMKeyEvent.DOM_VK_2, "\u00E9", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_2,
+             modifiers:{metaKey:1, shiftKey:1}, chars:"2", unmodifiedChars:"2"},
             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_3, chars:"\"", unmodifiedChars:"\""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_3,
+             modifiers:{}, chars:"\"", unmodifiedChars:"\""},
             nsIDOMKeyEvent.DOM_VK_3, "\"", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_3, shift:1, chars:"3", unmodifiedChars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_3,
+             modifiers:{shiftKey:1}, chars:"3", unmodifiedChars:"3"},
             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_3, ctrl:1, chars:"3", unmodifiedChars:"\""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_3,
+             modifiers:{ctrlKey:1}, chars:"3", unmodifiedChars:"\""},
             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_3, command:1, chars:"\"", unmodifiedChars:"\""},
-            nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_4, chars:"'", unmodifiedChars:"'"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_3,
+             modifiers:{metaKey:1}, chars:"\"", unmodifiedChars:"\""},
+            nsIDOMKeyEvent.DOM_VK_3, "\"", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    // Cmd+Shift+3 is a shortcut key of taking a snapshot
+    // testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_3,
+    //          modifiers:{metaKey:1, shiftKey:1}, chars:"\"", unmodifiedChars:"\""},
+    //         nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_4,
+             modifiers:{}, chars:"'", unmodifiedChars:"'"},
             nsIDOMKeyEvent.DOM_VK_4, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_4, shift:1, chars:"4", unmodifiedChars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_4,
+             modifiers:{shiftKey:1}, chars:"4", unmodifiedChars:"4"},
             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_4, ctrl:1, chars:"4", unmodifiedChars:"'"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_4,
+             modifiers:{ctrlKey:1}, chars:"4", unmodifiedChars:"'"},
             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_4, command:1, chars:"'", unmodifiedChars:"'"},
-            nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_5, chars:"(", unmodifiedChars:"("},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_4,
+             modifiers:{metaKey:1}, chars:"'", unmodifiedChars:"'"},
+            nsIDOMKeyEvent.DOM_VK_4, "'", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    // Cmd+Shift+4 is a shortcut key of taking a snapshot in specific range
+    // testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_4,
+    //          modifiers:{metaKey:1, shiftKey:1}, chars:"4", unmodifiedChars:"4"},
+    //         nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_5,
+             modifiers:{}, chars:"(", unmodifiedChars:"("},
             nsIDOMKeyEvent.DOM_VK_5, "(", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_5, shift:1, chars:"5", unmodifiedChars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_5,
+             modifiers:{shiftKey:1}, chars:"5", unmodifiedChars:"5"},
             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_5, ctrl:1, chars:"5", unmodifiedChars:"("},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_5,
+             modifiers:{ctrlKey:1}, chars:"5", unmodifiedChars:"("},
             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_5, command:1, chars:"(", unmodifiedChars:"("},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_5,
+             modifiers:{metaKey:1}, chars:"(", unmodifiedChars:"("},
+            nsIDOMKeyEvent.DOM_VK_5, "(", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_5,
+             modifiers:{metaKey:1, shiftKey:1}, chars:"5", unmodifiedChars:"5"},
             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_6, chars:"\u00A7", unmodifiedChars:"\u00A7"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_6,
+             modifiers:{}, chars:"\u00A7", unmodifiedChars:"\u00A7"},
             nsIDOMKeyEvent.DOM_VK_6, "\u00A7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_6, shift:1, chars:"6", unmodifiedChars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_6,
+             modifiers:{shiftKey:1}, chars:"6", unmodifiedChars:"6"},
             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // TODO:
-    // testKey({layout:"French", keyCode:MAC_VK_ANSI_6, ctrl:1, chars:"\u001D", unmodifiedChars:"\u00A7"},
+    // testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_6,
+    //          modifiers:{ctrlKey:1}, chars:"\u001D", unmodifiedChars:"\u00A7"},
     //         nsIDOMKeyEvent.DOM_VK_6, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Ctrl+6 sets strange char
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_6, command:1, chars:"\u00A7", unmodifiedChars:"\u00A7"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_6,
+             modifiers:{metaKey:1}, chars:"\u00A7", unmodifiedChars:"\u00A7"},
+            nsIDOMKeyEvent.DOM_VK_6, "\u00A7", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_6,
+             modifiers:{metaKey:1, shiftKey:1}, chars:"6", unmodifiedChars:"6"},
             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_7, chars:"\u00E8", unmodifiedChars:"\u00E8"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_7,
+             modifiers:{}, chars:"\u00E8", unmodifiedChars:"\u00E8"},
             nsIDOMKeyEvent.DOM_VK_7, "\u00E8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_7, shift:1, chars:"7", unmodifiedChars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_7,
+             modifiers:{shiftKey:1}, chars:"7", unmodifiedChars:"7"},
+            nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_7,
+             modifiers:{ctrlKey:1}, chars:"7", unmodifiedChars:"\u00E8"},
             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_7, ctrl:1, chars:"7", unmodifiedChars:"\u00E8"},
-            nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_7, command:1, chars:"\u00E8", unmodifiedChars:"\u00E8"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_7,
+             modifiers:{metaKey:1}, chars:"\u00E8", unmodifiedChars:"\u00E8"},
+            nsIDOMKeyEvent.DOM_VK_7, "\u00E8", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_7,
+             modifiers:{metaKey:1, shiftKey:1}, chars:"7", unmodifiedChars:"7"},
             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_8, chars:"!", unmodifiedChars:"!"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_8,
+             modifiers:{}, chars:"!", unmodifiedChars:"!"},
             nsIDOMKeyEvent.DOM_VK_8, "!", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_8, shift:1, chars:"8", unmodifiedChars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_8,
+             modifiers:{shiftKey:1}, chars:"8", unmodifiedChars:"8"},
             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_8, ctrl:1, chars:"8", unmodifiedChars:"!"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_8,
+             modifiers:{ctrlKey:1}, chars:"8", unmodifiedChars:"!"},
             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_8, command:1, chars:"!", unmodifiedChars:"!"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_8,
+             modifiers:{metaKey:1}, chars:"!", unmodifiedChars:"!"},
+            nsIDOMKeyEvent.DOM_VK_8, "!", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_8,
+             modifiers:{metaKey:1, shiftKey:1}, chars:"8", unmodifiedChars:"8"},
             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_9, chars:"\u00E7", unmodifiedChars:"\u00E7"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_9,
+             modifiers:{}, chars:"\u00E7", unmodifiedChars:"\u00E7"},
             nsIDOMKeyEvent.DOM_VK_9, "\u00E7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_9, shift:1, chars:"9", unmodifiedChars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_9,
+             modifiers:{shiftKey:1}, chars:"9", unmodifiedChars:"9"},
             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // TODO:
-    // testKey({layout:"French", keyCode:MAC_VK_ANSI_9, ctrl:1, chars:"\u001C", unmodifiedChars:"\u00E7"},
+    // testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_9,
+    //          modifiers:{ctrlKey:1}, chars:"\u001C", unmodifiedChars:"\u00E7"},
     //         nsIDOMKeyEvent.DOM_VK_9, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Ctrl+9 sets strange char
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_9, command:1, chars:"\u00E7", unmodifiedChars:"\u00E7"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_9,
+             modifiers:{metaKey:1}, chars:"\u00E7", unmodifiedChars:"\u00E7"},
+            nsIDOMKeyEvent.DOM_VK_9, "\u00E7", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_9,
+             modifiers:{metaKey:1, shiftKey:1}, chars:"9", unmodifiedChars:"9"},
             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_0, chars:"\u00E0", unmodifiedChars:"\u00E0"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_0,
+             modifiers:{}, chars:"\u00E0", unmodifiedChars:"\u00E0"},
             nsIDOMKeyEvent.DOM_VK_0, "\u00E0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_0, shift:1, chars:"0", unmodifiedChars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_0,
+             modifiers:{shiftKey:1}, chars:"0", unmodifiedChars:"0"},
             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // XXX No events fired, not sure the reason.
-    // testKey({layout:"French", keyCode:MAC_VK_ANSI_0, ctrl:1, chars:"", unmodifiedChars:"\u00E0"},
+    // testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_0,
+    //          modifiers:{ctrlKey:1}, chars:"", unmodifiedChars:"\u00E0"},
     //         nsIDOMKeyEvent.DOM_VK_0, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:MAC_VK_ANSI_0, command:1, chars:"\u00E0", unmodifiedChars:"\u00E0"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_0,
+             modifiers:{metaKey:1}, chars:"\u00E0", unmodifiedChars:"\u00E0"},
+            nsIDOMKeyEvent.DOM_VK_0, "\u00E0", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:MAC_VK_ANSI_0,
+             modifiers:{metaKey:1, shiftKey:1}, chars:"0", unmodifiedChars:"0"},
             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Thai
     // keycode should be DOM_VK_[A-Z] of the key on the latest ASCII capable keyboard layout is for alphabet
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_A, chars:"\u0E1F", unmodifiedChars:"\u0E1F"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_A,
+             modifiers:{}, chars:"\u0E1F", unmodifiedChars:"\u0E1F"},
             nsIDOMKeyEvent.DOM_VK_A, "\u0E1F", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // keycode should be shifted character if unshifted character isn't an ASCII character
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_Quote, chars:"\u0E07", unmodifiedChars:"\u0E07"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_Quote,
+             modifiers:{}, chars:"\u0E07", unmodifiedChars:"\u0E07"},
             nsIDOMKeyEvent.DOM_VK_PERIOD, "\u0E07", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // keycode should be zero if the character of the key on the latest ASCII capable keyboard layout isn't for alphabet
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_Period, chars:"\u0E43", unmodifiedChars:"\u0E43"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_Period,
+             modifiers:{}, chars:"\u0E43", unmodifiedChars:"\u0E43"},
             0, "\u0E43", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // keycode should be DOM_VK_[0-9] if the key on the latest ASCII capable keyboard layout is for numeric
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_1, chars:"\u0E45", unmodifiedChars:"\u0E45"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_1,
+             modifiers:{}, chars:"\u0E45", unmodifiedChars:"\u0E45"},
             nsIDOMKeyEvent.DOM_VK_1, "\u0E45", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_2, chars:"/", unmodifiedChars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_2,
+             modifiers:{}, chars:"/", unmodifiedChars:"/"},
             nsIDOMKeyEvent.DOM_VK_2, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_3, chars:"_", unmodifiedChars:"_"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_3,
+             modifiers:{}, chars:"_", unmodifiedChars:"_"},
             nsIDOMKeyEvent.DOM_VK_3, "_", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_4, chars:"\u0E20", unmodifiedChars:"\u0E20"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_4,
+             modifiers:{}, chars:"\u0E20", unmodifiedChars:"\u0E20"},
             nsIDOMKeyEvent.DOM_VK_4, "\u0E20", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_5, chars:"\u0E16", unmodifiedChars:"\u0E16"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_5,
+             modifiers:{}, chars:"\u0E16", unmodifiedChars:"\u0E16"},
             nsIDOMKeyEvent.DOM_VK_5, "\u0E16", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_6, chars:"\u0E38", unmodifiedChars:"\u0E38"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_6,
+             modifiers:{}, chars:"\u0E38", unmodifiedChars:"\u0E38"},
             nsIDOMKeyEvent.DOM_VK_6, "\u0E38", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_7, chars:"\u0E36", unmodifiedChars:"\u0E36"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_7,
+             modifiers:{}, chars:"\u0E36", unmodifiedChars:"\u0E36"},
             nsIDOMKeyEvent.DOM_VK_7, "\u0E36", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_8, chars:"\u0E04", unmodifiedChars:"\u0E04"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_8,
+             modifiers:{}, chars:"\u0E04", unmodifiedChars:"\u0E04"},
             nsIDOMKeyEvent.DOM_VK_8, "\u0E04", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_9, chars:"\u0E15", unmodifiedChars:"\u0E15"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_9,
+             modifiers:{}, chars:"\u0E15", unmodifiedChars:"\u0E15"},
             nsIDOMKeyEvent.DOM_VK_9, "\u0E15", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Thai", keyCode:MAC_VK_ANSI_0, chars:"\u0E08", unmodifiedChars:"\u0E08"},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:MAC_VK_ANSI_0,
+             modifiers:{}, chars:"\u0E08", unmodifiedChars:"\u0E08"},
             nsIDOMKeyEvent.DOM_VK_0, "\u0E08", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Dvorak-Qwerty, layout should be changed when Command key is pressed.
-    testKey({layout:"Dvorak-Qwerty", keyCode:MAC_VK_ANSI_S, chars:"o", unmodifiedChars:"o"},
+    testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_S,
+             modifiers:{}, chars:"o", unmodifiedChars:"o"},
             nsIDOMKeyEvent.DOM_VK_O, "o", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Dvorak-Qwerty", keyCode:MAC_VK_ANSI_S, shift:1, chars:"O", unmodifiedChars:"O"},
+    testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_S,
+             modifiers:{shiftKey:1}, chars:"O", unmodifiedChars:"O"},
             nsIDOMKeyEvent.DOM_VK_O, "O", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Dvorak-Qwerty", keyCode:MAC_VK_ANSI_S, ctrl:1, chars:"\u000F", unmodifiedChars:"o"},
+    testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_S,
+             modifiers:{ctrlKey:1}, chars:"\u000F", unmodifiedChars:"o"},
             nsIDOMKeyEvent.DOM_VK_O, "o", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Dvorak-Qwerty", keyCode:MAC_VK_ANSI_S, alt:1, chars:"\u00F8", unmodifiedChars:"o"},
+    testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_S,
+             modifiers:{altKey:1}, chars:"\u00F8", unmodifiedChars:"o"},
             nsIDOMKeyEvent.DOM_VK_O, "\u00F8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Dvorak-Qwerty", keyCode:MAC_VK_ANSI_S, command:1, chars:"s", unmodifiedChars:"o"},
+    testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_S,
+             modifiers:{metaKey:1}, chars:"s", unmodifiedChars:"o"},
             nsIDOMKeyEvent.DOM_VK_S, "s", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Dvorak-Qwerty", keyCode:MAC_VK_ANSI_D, chars:"e", unmodifiedChars:"e"},
+    testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_D,
+             modifiers:{}, chars:"e", unmodifiedChars:"e"},
             nsIDOMKeyEvent.DOM_VK_E, "e", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Dvorak-Qwerty", keyCode:MAC_VK_ANSI_D, shift:1, chars:"E", unmodifiedChars:"E"},
+    testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_D,
+             modifiers:{shiftKey:1}, chars:"E", unmodifiedChars:"E"},
             nsIDOMKeyEvent.DOM_VK_E, "E", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Dvorak-Qwerty", keyCode:MAC_VK_ANSI_D, ctrl:1, chars:"\u0005", unmodifiedChars:"e"},
+    testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_D,
+             modifiers:{ctrlKey:1}, chars:"\u0005", unmodifiedChars:"e"},
             nsIDOMKeyEvent.DOM_VK_E, "e", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Dvorak-Qwerty", keyCode:MAC_VK_ANSI_D, alt:1, chars:"", unmodifiedChars:"e"},
+    testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_D,
+             modifiers:{altKey:1}, chars:"", unmodifiedChars:"e"},
             nsIDOMKeyEvent.DOM_VK_E, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // dead key
-    testKey({layout:"Dvorak-Qwerty", keyCode:MAC_VK_ANSI_D, command:1, chars:"d", unmodifiedChars:"e"},
+    testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_D,
+             modifiers:{metaKey:1}, chars:"d", unmodifiedChars:"e"},
             nsIDOMKeyEvent.DOM_VK_D, "d", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Dvorak-Qwerty", keyCode:MAC_VK_ANSI_I, command:1, alt:1, chars:"^", unmodifiedChars:"c"},
+    testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_I,
+             modifiers:{metaKey:1, altKey:1}, chars:"^", unmodifiedChars:"c"},
             nsIDOMKeyEvent.DOM_VK_I, "^", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Dvorak-Qwerty", keyCode:MAC_VK_ANSI_I, command:1, alt:1, shift:1, chars:"\u02C6", unmodifiedChars:"C"},
-            nsIDOMKeyEvent.DOM_VK_I, "\u02C6", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);  }
-  else if (IS_WIN) {
+    testKey({layout:KEYBOARD_LAYOUT_DVORAK_QWERTY, keyCode:MAC_VK_ANSI_I,
+             modifiers:{metaKey:1, altKey:1, shiftKey:1}, chars:"\u02C6", unmodifiedChars:"C"},
+            nsIDOMKeyEvent.DOM_VK_I, "\u02C6", SHOULD_DELIVER_KEYDOWN_KEYPRESS, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
+  } else if (IS_WIN) {
     // On Windows, you can use Spy++ or Winspector (free) to watch window messages.
     // The keyCode is given by the wParam of the last WM_KEYDOWN message. The
     // chars string is given by the wParam of the WM_CHAR message. unmodifiedChars
     // is not needed on Windows.
 
     // Plain text input
-    testKey({layout:"US", keyCode:WIN_VK_A, chars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{}, chars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_B, chars:"b"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_B,
+             modifiers:{}, chars:"b"},
             nsIDOMKeyEvent.DOM_VK_B, "b", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_A, shift:1, chars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1}, chars:"A"},
             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Ctrl keys
-    testKey({layout:"US", keyCode:WIN_VK_A, ctrl:1, chars:"\u0001"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{ctrlKey:1}, chars:"\u0001"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_A, ctrl:1, shift:1, chars:"\u0001"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0001"},
             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Alt keys
-    testKey({layout:"US", keyCode:WIN_VK_A, alt:1, chars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{altKey:1}, chars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_A, alt:1, shift:1, chars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{altKey:1, shiftKey:1}, chars:"A"},
             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Shift-ctrl-alt generates no WM_CHAR, but we still get a keypress
-    testKey({layout:"US", keyCode:WIN_VK_A, alt:1, ctrl:1, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{altKey:1, ctrlKey:1, shiftKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Greek plain text
-    testKey({layout:"Greek", keyCode:WIN_VK_A, chars:"\u03b1"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
+             modifiers:{}, chars:"\u03b1"},
             nsIDOMKeyEvent.DOM_VK_A, "\u03b1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Greek", keyCode:WIN_VK_A, shift:1, chars:"\u0391"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1}, chars:"\u0391"},
             nsIDOMKeyEvent.DOM_VK_A, "\u0391", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Greek ctrl keys produce Latin charcodes
-    testKey({layout:"Greek", keyCode:WIN_VK_A, ctrl:1, chars:"\u0001"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
+             modifiers:{ctrlKey:1}, chars:"\u0001"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Greek", keyCode:WIN_VK_A, ctrl:1, shift:1, chars:"\u0001"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0001"},
             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Caps Lock key event
-    testKey({layout:"US", keyCode:WIN_VK_CAPITAL, capsLock:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_CAPITAL,
+             modifiers:{capsLockKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CAPS_LOCK, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_CAPITAL, capsLock:0, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_CAPITAL,
+             modifiers:{capsLockKey:0}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CAPS_LOCK, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Shift keys
-    testKey({layout:"US", keyCode:WIN_VK_LSHIFT, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_LSHIFT,
+             modifiers:{shiftKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_SHIFT, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
-    testKey({layout:"US", keyCode:WIN_VK_RSHIFT, shiftRight:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_RSHIFT,
+             modifiers:{shiftRightKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_SHIFT, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
 
     // Ctrl keys
-    testKey({layout:"US", keyCode:WIN_VK_LCONTROL, ctrl:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_LCONTROL,
+             modifiers:{ctrlKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CONTROL, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
-    testKey({layout:"US", keyCode:WIN_VK_RCONTROL, ctrlRight:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_RCONTROL,
+             modifiers:{ctrlRightKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CONTROL, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
 
     // Alt keys
-    testKey({layout:"US", keyCode:WIN_VK_LMENU, alt:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_LMENU,
+             modifiers:{altKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_ALT, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
-    testKey({layout:"US", keyCode:WIN_VK_RMENU, altRight:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_RMENU,
+             modifiers:{altRightKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_ALT, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
 
     // Win keys
-    testKey({layout:"US", keyCode:WIN_VK_LWIN, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_LWIN,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_WIN, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_LEFT);
-    testKey({layout:"US", keyCode:WIN_VK_RWIN, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_RWIN,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_WIN, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_RIGHT);
 
     // all keys on keyboard (keyCode test)
-    testKey({layout:"US", keyCode:WIN_VK_BACK, chars:"\u0008"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_BACK,
+             modifiers:{}, chars:"\u0008"},
             nsIDOMKeyEvent.DOM_VK_BACK_SPACE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_TAB, chars:"\t"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_TAB,
+             modifiers:{}, chars:"\t"},
             nsIDOMKeyEvent.DOM_VK_TAB, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_RETURN, chars:"\r"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_RETURN,
+             modifiers:{}, chars:"\r"},
             nsIDOMKeyEvent.DOM_VK_RETURN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_PAUSE, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_PAUSE,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_PAUSE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_KANA, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_KANA,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_KANA, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_JUNJA, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_JUNJA,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_JUNJA, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_FINAL, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_FINAL,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_FINAL, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_KANJI, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_KANJI,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_KANJI, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_ESCAPE, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_ESCAPE,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_ESCAPE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_CONVERT, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_CONVERT,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CONVERT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_NONCONVERT, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NONCONVERT,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_NONCONVERT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_ACCEPT, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_ACCEPT,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_ACCEPT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_MODECHANGE, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_MODECHANGE,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_MODECHANGE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_SPACE, chars:" "},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SPACE,
+             modifiers:{}, chars:" "},
             nsIDOMKeyEvent.DOM_VK_SPACE, " ", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_SELECT, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SELECT,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_SELECT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_PRINT, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_PRINT,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_PRINT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_EXECUTE, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_EXECUTE,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_EXECUTE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_SNAPSHOT, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SNAPSHOT,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_PRINTSCREEN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_HELP, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_HELP,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_HELP, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_SLEEP, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SLEEP,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_SLEEP, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
     // XXX TODO: we cannot test Home, Up, PageUp, Left, Right, End, Down, PageDown, Ins and Del.
 
     // US
     // Alphabet
-    testKey({layout:"US", keyCode:WIN_VK_A, chars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{}, chars:"a"},
             nsIDOMKeyEvent.DOM_VK_A, "a", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_A, shift:1, chars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1}, chars:"A"},
             nsIDOMKeyEvent.DOM_VK_A, "A", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_B, chars:"b"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_B,
+             modifiers:{}, chars:"b"},
             nsIDOMKeyEvent.DOM_VK_B, "b", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_B, shift:1, chars:"B"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_B,
+             modifiers:{shiftKey:1}, chars:"B"},
             nsIDOMKeyEvent.DOM_VK_B, "B", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_C, chars:"c"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_C,
+             modifiers:{}, chars:"c"},
             nsIDOMKeyEvent.DOM_VK_C, "c", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_C, shift:1, chars:"C"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_C,
+             modifiers:{shiftKey:1}, chars:"C"},
             nsIDOMKeyEvent.DOM_VK_C, "C", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_D, chars:"d"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_D,
+             modifiers:{}, chars:"d"},
             nsIDOMKeyEvent.DOM_VK_D, "d", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_D, shift:1, chars:"D"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_D,
+             modifiers:{shiftKey:1}, chars:"D"},
             nsIDOMKeyEvent.DOM_VK_D, "D", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_E, chars:"e"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_E,
+             modifiers:{}, chars:"e"},
             nsIDOMKeyEvent.DOM_VK_E, "e", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_E, shift:1, chars:"E"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_E,
+             modifiers:{shiftKey:1}, chars:"E"},
             nsIDOMKeyEvent.DOM_VK_E, "E", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_F, chars:"f"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_F,
+             modifiers:{}, chars:"f"},
             nsIDOMKeyEvent.DOM_VK_F, "f", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_F, shift:1, chars:"F"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_F,
+             modifiers:{shiftKey:1}, chars:"F"},
             nsIDOMKeyEvent.DOM_VK_F, "F", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_G, chars:"g"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_G,
+             modifiers:{}, chars:"g"},
             nsIDOMKeyEvent.DOM_VK_G, "g", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_G, shift:1, chars:"G"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_G,
+             modifiers:{shiftKey:1}, chars:"G"},
             nsIDOMKeyEvent.DOM_VK_G, "G", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_H, chars:"h"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_H,
+             modifiers:{}, chars:"h"},
             nsIDOMKeyEvent.DOM_VK_H, "h", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_H, shift:1, chars:"H"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_H,
+             modifiers:{shiftKey:1}, chars:"H"},
             nsIDOMKeyEvent.DOM_VK_H, "H", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_I, chars:"i"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_I,
+             modifiers:{}, chars:"i"},
             nsIDOMKeyEvent.DOM_VK_I, "i", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_I, shift:1, chars:"I"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_I,
+             modifiers:{shiftKey:1}, chars:"I"},
             nsIDOMKeyEvent.DOM_VK_I, "I", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_J, chars:"j"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_J,
+             modifiers:{}, chars:"j"},
             nsIDOMKeyEvent.DOM_VK_J, "j", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_J, shift:1, chars:"J"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_J,
+             modifiers:{shiftKey:1}, chars:"J"},
             nsIDOMKeyEvent.DOM_VK_J, "J", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_K, chars:"k"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_K,
+             modifiers:{}, chars:"k"},
             nsIDOMKeyEvent.DOM_VK_K, "k", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_K, shift:1, chars:"K"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_K,
+             modifiers:{shiftKey:1}, chars:"K"},
             nsIDOMKeyEvent.DOM_VK_K, "K", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_L, chars:"l"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_L,
+             modifiers:{}, chars:"l"},
             nsIDOMKeyEvent.DOM_VK_L, "l", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_L, shift:1, chars:"L"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_L,
+             modifiers:{shiftKey:1}, chars:"L"},
             nsIDOMKeyEvent.DOM_VK_L, "L", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_M, chars:"m"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_M,
+             modifiers:{}, chars:"m"},
             nsIDOMKeyEvent.DOM_VK_M, "m", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_M, shift:1, chars:"M"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_M,
+             modifiers:{shiftKey:1}, chars:"M"},
             nsIDOMKeyEvent.DOM_VK_M, "M", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_N, chars:"n"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_N,
+             modifiers:{}, chars:"n"},
             nsIDOMKeyEvent.DOM_VK_N, "n", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_N, shift:1, chars:"N"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_N,
+             modifiers:{shiftKey:1}, chars:"N"},
             nsIDOMKeyEvent.DOM_VK_N, "N", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_O, chars:"o"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_O,
+             modifiers:{}, chars:"o"},
             nsIDOMKeyEvent.DOM_VK_O, "o", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_O, shift:1, chars:"O"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_O,
+             modifiers:{shiftKey:1}, chars:"O"},
             nsIDOMKeyEvent.DOM_VK_O, "O", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_P, chars:"p"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_P,
+             modifiers:{}, chars:"p"},
             nsIDOMKeyEvent.DOM_VK_P, "p", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_P, shift:1, chars:"P"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_P,
+             modifiers:{shiftKey:1}, chars:"P"},
             nsIDOMKeyEvent.DOM_VK_P, "P", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_Q, chars:"q"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_Q,
+             modifiers:{}, chars:"q"},
             nsIDOMKeyEvent.DOM_VK_Q, "q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_Q, shift:1, chars:"Q"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_Q,
+             modifiers:{shiftKey:1}, chars:"Q"},
             nsIDOMKeyEvent.DOM_VK_Q, "Q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_R, chars:"r"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_R,
+             modifiers:{}, chars:"r"},
             nsIDOMKeyEvent.DOM_VK_R, "r", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_R, shift:1, chars:"R"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_R,
+             modifiers:{shiftKey:1}, chars:"R"},
             nsIDOMKeyEvent.DOM_VK_R, "R", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_S, chars:"s"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_S,
+             modifiers:{}, chars:"s"},
             nsIDOMKeyEvent.DOM_VK_S, "s", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_S, shift:1, chars:"S"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_S,
+             modifiers:{shiftKey:1}, chars:"S"},
             nsIDOMKeyEvent.DOM_VK_S, "S", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_T, chars:"t"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_T,
+             modifiers:{}, chars:"t"},
             nsIDOMKeyEvent.DOM_VK_T, "t", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_T, shift:1, chars:"T"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_T,
+             modifiers:{shiftKey:1}, chars:"T"},
             nsIDOMKeyEvent.DOM_VK_T, "T", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_U, chars:"u"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_U,
+             modifiers:{}, chars:"u"},
             nsIDOMKeyEvent.DOM_VK_U, "u", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_U, shift:1, chars:"U"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_U,
+             modifiers:{shiftKey:1}, chars:"U"},
             nsIDOMKeyEvent.DOM_VK_U, "U", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_V, chars:"v"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_V,
+             modifiers:{}, chars:"v"},
             nsIDOMKeyEvent.DOM_VK_V, "v", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_V, shift:1, chars:"V"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_V,
+             modifiers:{shiftKey:1}, chars:"V"},
             nsIDOMKeyEvent.DOM_VK_V, "V", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_W, chars:"w"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_W,
+             modifiers:{}, chars:"w"},
             nsIDOMKeyEvent.DOM_VK_W, "w", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_W, shift:1, chars:"W"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_W,
+             modifiers:{shiftKey:1}, chars:"W"},
             nsIDOMKeyEvent.DOM_VK_W, "W", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_X, chars:"x"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_X,
+             modifiers:{}, chars:"x"},
             nsIDOMKeyEvent.DOM_VK_X, "x", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_X, shift:1, chars:"X"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_X,
+             modifiers:{shiftKey:1}, chars:"X"},
             nsIDOMKeyEvent.DOM_VK_X, "X", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_Y, chars:"y"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_Y,
+             modifiers:{}, chars:"y"},
             nsIDOMKeyEvent.DOM_VK_Y, "y", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_Y, shift:1, chars:"Y"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_Y,
+             modifiers:{shiftKey:1}, chars:"Y"},
             nsIDOMKeyEvent.DOM_VK_Y, "Y", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_Z, chars:"z"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_Z,
+             modifiers:{}, chars:"z"},
             nsIDOMKeyEvent.DOM_VK_Z, "z", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_Z, shift:1, chars:"Z"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_Z,
+             modifiers:{shiftKey:1}, chars:"Z"},
             nsIDOMKeyEvent.DOM_VK_Z, "Z", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Numeric
-    testKey({layout:"US", keyCode:WIN_VK_0, chars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_0,
+             modifiers:{}, chars:"0"},
             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_0, shift:1, chars:")"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_0,
+             modifiers:{shiftKey:1}, chars:")"},
             nsIDOMKeyEvent.DOM_VK_0, ")", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_1, chars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_1,
+             modifiers:{}, chars:"1"},
             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_1, shift:1, chars:"!"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_1,
+             modifiers:{shiftKey:1}, chars:"!"},
             nsIDOMKeyEvent.DOM_VK_1, "!", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_2, chars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_2,
+             modifiers:{}, chars:"2"},
             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_2, shift:1, chars:"@"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_2,
+             modifiers:{shiftKey:1}, chars:"@"},
             nsIDOMKeyEvent.DOM_VK_2, "@", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_3, chars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_3,
+             modifiers:{}, chars:"3"},
             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_3, shift:1, chars:"#"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_3,
+             modifiers:{shiftKey:1}, chars:"#"},
             nsIDOMKeyEvent.DOM_VK_3, "#", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_4, chars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_4,
+             modifiers:{}, chars:"4"},
             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_4, shift:1, chars:"$"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_4,
+             modifiers:{shiftKey:1}, chars:"$"},
             nsIDOMKeyEvent.DOM_VK_4, "$", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_5, chars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_5,
+             modifiers:{}, chars:"5"},
             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_5, shift:1, chars:"%"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_5,
+             modifiers:{shiftKey:1}, chars:"%"},
             nsIDOMKeyEvent.DOM_VK_5, "%", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_6, chars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_6,
+             modifiers:{}, chars:"6"},
             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_6, shift:1, chars:"^"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_6,
+             modifiers:{shiftKey:1}, chars:"^"},
             nsIDOMKeyEvent.DOM_VK_6, "^", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_7, chars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_7,
+             modifiers:{}, chars:"7"},
             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_7, shift:1, chars:"&"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_7,
+             modifiers:{shiftKey:1}, chars:"&"},
             nsIDOMKeyEvent.DOM_VK_7, "&", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_8, chars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_8,
+             modifiers:{}, chars:"8"},
             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_8, shift:1, chars:"*"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_8,
+             modifiers:{shiftKey:1}, chars:"*"},
             nsIDOMKeyEvent.DOM_VK_8, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_9, chars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_9,
+             modifiers:{}, chars:"9"},
             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_9, shift:1, chars:"("},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_9,
+             modifiers:{shiftKey:1}, chars:"("},
             nsIDOMKeyEvent.DOM_VK_9, "(", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // OEM keys
-    testKey({layout:"US", keyCode:WIN_VK_OEM_MINUS, chars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_MINUS,
+             modifiers:{}, chars:"-"},
             nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_MINUS, shift:1, chars:"_"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_MINUS,
+             modifiers:{shiftKey:1}, chars:"_"},
             nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS, "_", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_PLUS, chars:"="},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{}, chars:"="},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_PLUS, shift:1, chars:"+"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{shiftKey:1}, chars:"+"},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_4, chars:"["},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_4,
+             modifiers:{}, chars:"["},
             nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "[", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_4, shift:1, chars:"{"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_4,
+             modifiers:{shiftKey:1}, chars:"{"},
             nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET, "{", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_6, chars:"]"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_6,
+             modifiers:{}, chars:"]"},
             nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "]", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_6, shift:1, chars:"}"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_6,
+             modifiers:{shiftKey:1}, chars:"}"},
             nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET, "}", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_1, chars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_1,
+             modifiers:{}, chars:";"},
             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ";", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_1, shift:1, chars:":"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_1,
+             modifiers:{shiftKey:1}, chars:":"},
             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ":", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_7, chars:"'"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_7,
+             modifiers:{}, chars:"'"},
             nsIDOMKeyEvent.DOM_VK_QUOTE, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_7, shift:1, chars:"\""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_7,
+             modifiers:{shiftKey:1}, chars:"\""},
             nsIDOMKeyEvent.DOM_VK_QUOTE, "\"", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_5, chars:"\\"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_5,
+             modifiers:{}, chars:"\\"},
             nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "\\", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_5, shift:1, chars:"|"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_5,
+             modifiers:{shiftKey:1}, chars:"|"},
             nsIDOMKeyEvent.DOM_VK_BACK_SLASH, "|", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_COMMA, chars:","},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_COMMA,
+             modifiers:{}, chars:","},
             nsIDOMKeyEvent.DOM_VK_COMMA, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_COMMA, shift:1, chars:"<"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_COMMA,
+             modifiers:{shiftKey:1}, chars:"<"},
             nsIDOMKeyEvent.DOM_VK_COMMA, "<", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_PERIOD, chars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_PERIOD,
+             modifiers:{}, chars:"."},
             nsIDOMKeyEvent.DOM_VK_PERIOD, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_PERIOD, shift:1, chars:">"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_PERIOD,
+             modifiers:{shiftKey:1}, chars:">"},
             nsIDOMKeyEvent.DOM_VK_PERIOD, ">", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_2, chars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_2,
+             modifiers:{}, chars:"/"},
             nsIDOMKeyEvent.DOM_VK_SLASH, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_2, shift:1, chars:"?"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_2,
+             modifiers:{shiftKey:1}, chars:"?"},
             nsIDOMKeyEvent.DOM_VK_SLASH, "?", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_3, chars:"`"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_3,
+             modifiers:{}, chars:"`"},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "`", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_3, shift:1, chars:"~"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_3,
+             modifiers:{shiftKey:1}, chars:"~"},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "~", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Numpad
-    testKey({layout:"US", keyCode:WIN_VK_NUMPAD0, numLock:1, chars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD0,
+             modifiers:{numLockKey:1}, chars:"0"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_NUMPAD1, numLock:1, chars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD1,
+             modifiers:{numLockKey:1}, chars:"1"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_NUMPAD2, numLock:1, chars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD2,
+             modifiers:{numLockKey:1}, chars:"2"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_NUMPAD3, numLock:1, chars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD3,
+             modifiers:{numLockKey:1}, chars:"3"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_NUMPAD4, numLock:1, chars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD4,
+             modifiers:{numLockKey:1}, chars:"4"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_NUMPAD5, numLock:1, chars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD5,
+             modifiers:{numLockKey:1}, chars:"5"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_NUMPAD6, numLock:1, chars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD6,
+             modifiers:{numLockKey:1}, chars:"6"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_NUMPAD7, numLock:1, chars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD7,
+             modifiers:{numLockKey:1}, chars:"7"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_NUMPAD8, numLock:1, chars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD8,
+             modifiers:{numLockKey:1}, chars:"8"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_NUMPAD9, numLock:1, chars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NUMPAD9,
+             modifiers:{numLockKey:1}, chars:"9"},
             nsIDOMKeyEvent.DOM_VK_NUMPAD9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
 
-    testKey({layout:"US", keyCode:WIN_VK_MULTIPLY, numLock:1, chars:"*"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_MULTIPLY,
+             modifiers:{numLockKey:1}, chars:"*"},
             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_MULTIPLY, numLock:1, shift:1, chars:"*"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_MULTIPLY,
+             modifiers:{numLockKey:1, shiftKey:1}, chars:"*"},
             nsIDOMKeyEvent.DOM_VK_MULTIPLY, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_ADD, numLock:1, chars:"+"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_ADD,
+             modifiers:{numLockKey:1}, chars:"+"},
             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_ADD, numLock:1, shift:1, chars:"+"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_ADD,
+             modifiers:{numLockKey:1, shiftKey:1}, chars:"+"},
             nsIDOMKeyEvent.DOM_VK_ADD, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
     // VK_SEPARATOR is keycode for NEC's PC-98 series whose keyboard layout was
     // different from current PC's keyboard layout and it cannot connect to
     // current PC.  Note that even if we synthesize WM_KEYDOWN with
     // VK_SEPARATOR, it doesn't work on Win7.
-    //testKey({layout:"US", keyCode:WIN_VK_SEPARATOR, numLock:1, chars:""},
+    //testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SEPARATOR,
+    //         modifiers:{numLockKey:1}, chars:""},
     //        nsIDOMKeyEvent.DOM_VK_SEPARATOR, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    //testKey({layout:"US", keyCode:WIN_VK_SEPARATOR, numLock:1, shift:1, chars:""},
+    //testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SEPARATOR,
+    //         modifiers:{numLockKey:1, shiftKey:1}, chars:""},
     //        nsIDOMKeyEvent.DOM_VK_SEPARATOR, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_SUBTRACT, numLock:1, chars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SUBTRACT,
+             modifiers:{numLockKey:1}, chars:"-"},
             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_SUBTRACT, numLock:1, shift:1, chars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_SUBTRACT,
+             modifiers:{numLockKey:1, shiftKey:1}, chars:"-"},
             nsIDOMKeyEvent.DOM_VK_SUBTRACT, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_DECIMAL, numLock:1, chars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_DECIMAL,
+             modifiers:{numLockKey:1}, chars:"."},
             nsIDOMKeyEvent.DOM_VK_DECIMAL, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_DECIMAL, numLock:1, shift:1, chars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_DECIMAL,
+             modifiers:{numLockKey:1, shiftKey:1}, chars:"."},
             nsIDOMKeyEvent.DOM_VK_DECIMAL, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_DIVIDE, numLock:1, chars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_DIVIDE,
+             modifiers:{numLockKey:1}, chars:"/"},
             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_DIVIDE, numLock:1, shift:1, chars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_DIVIDE,
+             modifiers:{numLockKey:1, shiftKey:1}, chars:"/"},
             nsIDOMKeyEvent.DOM_VK_DIVIDE, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
 
     // Numpad without NumLock
-    testKey({layout:"US", keyCode:WIN_VK_PRIOR, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_PRIOR,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_PAGE_UP, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_NEXT, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_NEXT,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_PAGE_DOWN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_END, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_END,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_END, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_HOME, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_HOME,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_HOME, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_LEFT, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_LEFT,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_LEFT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_UP, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_UP,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_UP, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_RIGHT, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_RIGHT,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_RIGHT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_DOWN, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_DOWN,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_DOWN, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_INSERT, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_INSERT,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_INSERT, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_DELETE, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_DELETE,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_DELETE, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"US", keyCode:WIN_VK_CLEAR, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_CLEAR,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CLEAR, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
 
     // Even if widget receives unknown keycode, it should dispatch key events
     // whose keycode is 0 rather than native keycode.
-    testKey({layout:"US", keyCode:0x3A, numLock:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:0x3A,
+             modifiers:{numLockKey:1}, chars:""},
             0, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // French
     // Numeric
-    testKey({layout:"French", keyCode:WIN_VK_0, chars:"\u00E0"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_0,
+             modifiers:{}, chars:"\u00E0"},
             nsIDOMKeyEvent.DOM_VK_0, "\u00E0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_0, shift:1, chars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_0,
+             modifiers:{shiftKey:1}, chars:"0"},
             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_1, chars:"&"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_1,
+             modifiers:{}, chars:"&"},
             nsIDOMKeyEvent.DOM_VK_1, "&", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_1, shift:1, chars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_1,
+             modifiers:{shiftKey:1}, chars:"1"},
             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_2, chars:"\u00E9"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_2,
+             modifiers:{}, chars:"\u00E9"},
             nsIDOMKeyEvent.DOM_VK_2, "\u00E9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_2, shift:1, chars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_2,
+             modifiers:{shiftKey:1}, chars:"2"},
             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_3, chars:"\""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_3,
+             modifiers:{}, chars:"\""},
             nsIDOMKeyEvent.DOM_VK_3, "\"", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_3, shift:1, chars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_3,
+             modifiers:{shiftKey:1}, chars:"3"},
             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_4, chars:"'"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_4,
+             modifiers:{}, chars:"'"},
             nsIDOMKeyEvent.DOM_VK_4, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_4, shift:1, chars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_4,
+             modifiers:{shiftKey:1}, chars:"4"},
             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_5, chars:"("},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_5,
+             modifiers:{}, chars:"("},
             nsIDOMKeyEvent.DOM_VK_5, "(", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_5, shift:1, chars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_5,
+             modifiers:{shiftKey:1}, chars:"5"},
             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_6, chars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_6,
+             modifiers:{}, chars:"-"},
             nsIDOMKeyEvent.DOM_VK_6, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_6, shift:1, chars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_6,
+             modifiers:{shiftKey:1}, chars:"6"},
             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_7, chars:"\u00E8"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_7,
+             modifiers:{}, chars:"\u00E8"},
             nsIDOMKeyEvent.DOM_VK_7, "\u00E8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_7, shift:1, chars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_7,
+             modifiers:{shiftKey:1}, chars:"7"},
             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_8, chars:"_"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_8,
+             modifiers:{}, chars:"_"},
             nsIDOMKeyEvent.DOM_VK_8, "_", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_8, shift:1, chars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_8,
+             modifiers:{shiftKey:1}, chars:"8"},
             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_9, chars:"\u00E7"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_9,
+             modifiers:{}, chars:"\u00E7"},
             nsIDOMKeyEvent.DOM_VK_9, "\u00E7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_9, shift:1, chars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_9,
+             modifiers:{shiftKey:1}, chars:"9"},
             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Numeric with ShiftLock
-    testKey({layout:"French", keyCode:WIN_VK_0, capsLock:1, chars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_0,
+             modifiers:{capsLockKey:1}, chars:"0"},
             nsIDOMKeyEvent.DOM_VK_0, "0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_0, capsLock:1, shift:1, chars:"\u00E0"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_0,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"\u00E0"},
             nsIDOMKeyEvent.DOM_VK_0, "\u00E0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_1, capsLock:1, chars:"1"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_1,
+             modifiers:{capsLockKey:1}, chars:"1"},
             nsIDOMKeyEvent.DOM_VK_1, "1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_1, capsLock:1, shift:1, chars:"&"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_1,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"&"},
             nsIDOMKeyEvent.DOM_VK_1, "&", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_2, capsLock:1, chars:"2"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_2,
+             modifiers:{capsLockKey:1}, chars:"2"},
             nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_2, capsLock:1, shift:1, chars:"\u00E9"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_2,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"\u00E9"},
             nsIDOMKeyEvent.DOM_VK_2, "\u00E9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_3, capsLock:1, chars:"3"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_3,
+             modifiers:{capsLockKey:1}, chars:"3"},
             nsIDOMKeyEvent.DOM_VK_3, "3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_3, capsLock:1, shift:1, chars:"\""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_3,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"\""},
             nsIDOMKeyEvent.DOM_VK_3, "\"", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_4, capsLock:1, chars:"4"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_4,
+             modifiers:{capsLockKey:1}, chars:"4"},
             nsIDOMKeyEvent.DOM_VK_4, "4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_4, capsLock:1, shift:1, chars:"'"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_4,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"'"},
             nsIDOMKeyEvent.DOM_VK_4, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_5, capsLock:1, chars:"5"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_5,
+             modifiers:{capsLockKey:1}, chars:"5"},
             nsIDOMKeyEvent.DOM_VK_5, "5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_5, capsLock:1, shift:1, chars:"("},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_5,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"("},
             nsIDOMKeyEvent.DOM_VK_5, "(", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_6, capsLock:1, chars:"6"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_6,
+             modifiers:{capsLockKey:1}, chars:"6"},
             nsIDOMKeyEvent.DOM_VK_6, "6", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_6, capsLock:1, shift:1, chars:"-"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_6,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"-"},
             nsIDOMKeyEvent.DOM_VK_6, "-", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_7, capsLock:1, chars:"7"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_7,
+             modifiers:{capsLockKey:1}, chars:"7"},
             nsIDOMKeyEvent.DOM_VK_7, "7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_7, capsLock:1, shift:1, chars:"\u00E8"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_7,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"\u00E8"},
             nsIDOMKeyEvent.DOM_VK_7, "\u00E8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_8, capsLock:1, chars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_8,
+             modifiers:{capsLockKey:1}, chars:"8"},
             nsIDOMKeyEvent.DOM_VK_8, "8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_8, capsLock:1, shift:1, chars:"_"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_8,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"_"},
             nsIDOMKeyEvent.DOM_VK_8, "_", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_9, capsLock:1, chars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_9,
+             modifiers:{capsLockKey:1}, chars:"9"},
             nsIDOMKeyEvent.DOM_VK_9, "9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_9, capsLock:1, shift:1, chars:"\u00E7"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_9,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"\u00E7"},
             nsIDOMKeyEvent.DOM_VK_9, "\u00E7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // OEM keys
-    testKey({layout:"French", keyCode:WIN_VK_OEM_7, chars:"\u00B2"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_7,
+             modifiers:{}, chars:"\u00B2"},
             0, "\u00B2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_7, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_7,
+             modifiers:{shiftKey:1}, chars:""},
             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_4, chars:")"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_4,
+             modifiers:{}, chars:")"},
             nsIDOMKeyEvent.DOM_VK_CLOSE_PAREN, ")", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_4, shift:1, chars:"\u00B0"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_4,
+             modifiers:{shiftKey:1}, chars:"\u00B0"},
             nsIDOMKeyEvent.DOM_VK_CLOSE_PAREN, "\u00B0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_PLUS, chars:"="},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{}, chars:"="},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_PLUS, shift:1, chars:"+"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{shiftKey:1}, chars:"+"},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    //testKey({layout:"French", keyCode:WIN_VK_OEM_6, chars:""},
+    //testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+    //         modifiers:{}, chars:""},
     //        nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Dead-key
-    //testKey({layout:"French", keyCode:WIN_VK_OEM_6, shift:1, chars:""},
+    //testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+    //         modifiers:{shiftKey:1}, chars:""},
     //        nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Dead-key
-    testKey({layout:"French", keyCode:WIN_VK_OEM_1, chars:"$"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_1,
+             modifiers:{}, chars:"$"},
             nsIDOMKeyEvent.DOM_VK_DOLLAR, "$", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_1, shift:1, chars:"\u00A3"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_1,
+             modifiers:{shiftKey:1}, chars:"\u00A3"},
             nsIDOMKeyEvent.DOM_VK_DOLLAR, "\u00A3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_3, chars:"\u00F9"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_3,
+             modifiers:{}, chars:"\u00F9"},
             nsIDOMKeyEvent.DOM_VK_PERCENT, "\u00F9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_3, shift:1, chars:"%"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_3,
+             modifiers:{shiftKey:1}, chars:"%"},
             nsIDOMKeyEvent.DOM_VK_PERCENT, "%", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_5, chars:"*"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_5,
+             modifiers:{}, chars:"*"},
             nsIDOMKeyEvent.DOM_VK_ASTERISK, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_5, shift:1, chars:"\u00B5"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_5,
+             modifiers:{shiftKey:1}, chars:"\u00B5"},
             nsIDOMKeyEvent.DOM_VK_ASTERISK, "\u00B5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_102, chars:"<"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_102,
+             modifiers:{}, chars:"<"},
             nsIDOMKeyEvent.DOM_VK_LESS_THAN, "<", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_102, shift:1, chars:">"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_102,
+             modifiers:{shiftKey:1}, chars:">"},
             nsIDOMKeyEvent.DOM_VK_LESS_THAN, ">", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_COMMA, chars:","},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_COMMA,
+             modifiers:{}, chars:","},
             nsIDOMKeyEvent.DOM_VK_COMMA, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_COMMA, shift:1, chars:"?"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_COMMA,
+             modifiers:{shiftKey:1}, chars:"?"},
             nsIDOMKeyEvent.DOM_VK_COMMA, "?", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_PERIOD, chars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PERIOD,
+             modifiers:{}, chars:";"},
             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ";", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_PERIOD, shift:1, chars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PERIOD,
+             modifiers:{shiftKey:1}, chars:"."},
             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_2, chars:":"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_2,
+             modifiers:{}, chars:":"},
             nsIDOMKeyEvent.DOM_VK_COLON, ":", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_2, shift:1, chars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_2,
+             modifiers:{shiftKey:1}, chars:"/"},
             nsIDOMKeyEvent.DOM_VK_COLON, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_8, chars:"!"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_8,
+             modifiers:{}, chars:"!"},
             nsIDOMKeyEvent.DOM_VK_EXCLAMATION, "!", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_8, shift:1, chars:"\u00A7"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_8,
+             modifiers:{shiftKey:1}, chars:"\u00A7"},
             nsIDOMKeyEvent.DOM_VK_EXCLAMATION, "\u00A7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // OEM keys with ShiftLock
-    testKey({layout:"French", keyCode:WIN_VK_OEM_7, capsLock:1, chars:"\u00B2"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_7,
+             modifiers:{capsLockKey:1}, chars:"\u00B2"},
             0, "\u00B2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_7, capsLock:1, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_7,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:""},
             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_4, capsLock:1, chars:"\u00B0"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_4,
+             modifiers:{capsLockKey:1}, chars:"\u00B0"},
             nsIDOMKeyEvent.DOM_VK_CLOSE_PAREN, "\u00B0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_4, capsLock:1, shift:1, chars:")"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_4,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:")"},
             nsIDOMKeyEvent.DOM_VK_CLOSE_PAREN, ")", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_PLUS, capsLock:1, chars:"+"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{capsLockKey:1}, chars:"+"},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "+", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_PLUS, capsLock:1, shift:1, chars:"="},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"="},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "=", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    //testKey({layout:"French", keyCode:WIN_VK_OEM_6, capsLock:1, chars:""},
+    //testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+    //         modifiers:{capsLockKey:1}, chars:""},
     //        0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Dead-key
-    //testKey({layout:"French", keyCode:WIN_VK_OEM_6, capsLock:1, shift:1, chars:""},
+    //testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+    //         modifiers:{capsLockKey:1, shiftKey:1}, chars:""},
     //        0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Dead-key
-    testKey({layout:"French", keyCode:WIN_VK_OEM_1, capsLock:1, chars:"\u00A3"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_1,
+             modifiers:{capsLockKey:1}, chars:"\u00A3"},
             nsIDOMKeyEvent.DOM_VK_DOLLAR, "\u00A3", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_1, capsLock:1, shift:1, chars:"$"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_1,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"$"},
             nsIDOMKeyEvent.DOM_VK_DOLLAR, "$", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_3, capsLock:1, chars:"%"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_3,
+             modifiers:{capsLockKey:1}, chars:"%"},
             nsIDOMKeyEvent.DOM_VK_PERCENT, "%", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_3, capsLock:1, shift:1, chars:"\u00F9"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_3,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"\u00F9"},
             nsIDOMKeyEvent.DOM_VK_PERCENT, "\u00F9", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_5, capsLock:1, chars:"\u00B5"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_5,
+             modifiers:{capsLockKey:1}, chars:"\u00B5"},
             nsIDOMKeyEvent.DOM_VK_ASTERISK, "\u00B5", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_5, capsLock:1, shift:1, chars:"*"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_5,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"*"},
             nsIDOMKeyEvent.DOM_VK_ASTERISK, "*", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_102, capsLock:1, chars:"<"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_102,
+             modifiers:{capsLockKey:1}, chars:"<"},
             nsIDOMKeyEvent.DOM_VK_LESS_THAN, "<", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_102, capsLock:1, shift:1, chars:">"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_102,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:">"},
             nsIDOMKeyEvent.DOM_VK_LESS_THAN, ">", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_COMMA, capsLock:1, chars:"?"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_COMMA,
+             modifiers:{capsLockKey:1}, chars:"?"},
             nsIDOMKeyEvent.DOM_VK_COMMA, "?", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_COMMA, capsLock:1, shift:1, chars:","},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_COMMA,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:","},
             nsIDOMKeyEvent.DOM_VK_COMMA, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_PERIOD, capsLock:1, chars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PERIOD,
+             modifiers:{capsLockKey:1}, chars:"."},
             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_PERIOD, capsLock:1, shift:1, chars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PERIOD,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:";"},
             nsIDOMKeyEvent.DOM_VK_SEMICOLON, ";", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_2, capsLock:1, chars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_2,
+             modifiers:{capsLockKey:1}, chars:"/"},
             nsIDOMKeyEvent.DOM_VK_COLON, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_2, capsLock:1, shift:1, chars:":"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_2,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:":"},
             nsIDOMKeyEvent.DOM_VK_COLON, ":", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_8, capsLock:1, chars:"\u00A7"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_8,
+             modifiers:{capsLockKey:1}, chars:"\u00A7"},
             nsIDOMKeyEvent.DOM_VK_EXCLAMATION, "\u00A7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_8, capsLock:1, shift:1, chars:"!"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_8,
+             modifiers:{capsLockKey:1, shiftKey:1}, chars:"!"},
             nsIDOMKeyEvent.DOM_VK_EXCLAMATION, "!", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // AltGr
-    testKey({layout:"French", keyCode:WIN_VK_0, altGr:1, chars:"@"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_0,
+             modifiers:{altGrKey:1}, chars:"@"},
             nsIDOMKeyEvent.DOM_VK_0, "@", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_1, altGr:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_1,
+             modifiers:{altGrKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_1, "&", SHOULD_DELIVER_ALL_BUT_NOT_CAUSE_INPUT, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    //testKey({layout:"French", keyCode:WIN_VK_2, altGr:1, chars:""},
+    //testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_2,
+    //         modifiers:{altGrKey:1}, chars:""},
     //        nsIDOMKeyEvent.DOM_VK_2, "2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Dead-key
-    testKey({layout:"French", keyCode:WIN_VK_3, altGr:1, chars:"#"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_3,
+             modifiers:{altGrKey:1}, chars:"#"},
             nsIDOMKeyEvent.DOM_VK_3, "#", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_4, altGr:1, chars:"{"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_4,
+             modifiers:{altGrKey:1}, chars:"{"},
             nsIDOMKeyEvent.DOM_VK_4, "{", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_5, altGr:1, chars:"["},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_5,
+             modifiers:{altGrKey:1}, chars:"["},
             nsIDOMKeyEvent.DOM_VK_5, "[", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_6, altGr:1, chars:"|"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_6,
+             modifiers:{altGrKey:1}, chars:"|"},
             nsIDOMKeyEvent.DOM_VK_6, "|", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    //testKey({layout:"French", keyCode:WIN_VK_7, altGr:1, chars:""},
+    //testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_7,
+    //         modifiers:{altGrKey:1}, chars:""},
     //        nsIDOMKeyEvent.DOM_VK_7, "", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD); // Dead-key
-    testKey({layout:"French", keyCode:WIN_VK_8, altGr:1, chars:"\\"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_8,
+             modifiers:{altGrKey:1}, chars:"\\"},
             nsIDOMKeyEvent.DOM_VK_8, "\\", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_9, altGr:1, chars:"^"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_9,
+             modifiers:{altGrKey:1}, chars:"^"},
             nsIDOMKeyEvent.DOM_VK_9, "^", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_4, altGr:1, chars:"]"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_4,
+             modifiers:{altGrKey:1}, chars:"]"},
             nsIDOMKeyEvent.DOM_VK_CLOSE_PAREN, "]", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_PLUS, altGr:1, chars:"}"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{altGrKey:1}, chars:"}"},
             nsIDOMKeyEvent.DOM_VK_EQUALS, "}", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // German
-    testKey({layout:"German", keyCode:WIN_VK_OEM_2, chars:"#"},
+    testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:WIN_VK_OEM_2,
+             modifiers:{}, chars:"#"},
             nsIDOMKeyEvent.DOM_VK_HASH, "#", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"German", keyCode:WIN_VK_OEM_2, shift:1, chars:"'"},
+    testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:WIN_VK_OEM_2,
+             modifiers:{shiftKey:1}, chars:"'"},
             nsIDOMKeyEvent.DOM_VK_HASH, "'", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Norwegian
-    testKey({layout:"Norwegian", keyCode:WIN_VK_OEM_5, chars:"|"},
+    testKey({layout:KEYBOARD_LAYOUT_NORWEGIAN, keyCode:WIN_VK_OEM_5,
+             modifiers:{}, chars:"|"},
             nsIDOMKeyEvent.DOM_VK_PIPE, "|", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Norwegian", keyCode:WIN_VK_OEM_5, shift:1, chars:"\u00A7"},
+    testKey({layout:KEYBOARD_LAYOUT_NORWEGIAN, keyCode:WIN_VK_OEM_5,
+             modifiers:{shiftKey:1}, chars:"\u00A7"},
             nsIDOMKeyEvent.DOM_VK_PIPE, "\u00A7", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
     // Brazilian ABNT
-    testKey({layout:"BrazilianABNT", keyCode:WIN_VK_ABNT_C1, chars:"/"},
+    testKey({layout:KEYBOARD_LAYOUT_BRAZILIAN_ABNT, keyCode:WIN_VK_ABNT_C1,
+             modifiers:{}, chars:"/"},
             nsIDOMKeyEvent.DOM_VK_SLASH, "/", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"BrazilianABNT", keyCode:WIN_VK_ABNT_C1, shift:1, chars:"?"},
+    testKey({layout:KEYBOARD_LAYOUT_BRAZILIAN_ABNT, keyCode:WIN_VK_ABNT_C1,
+             modifiers:{shiftKey:1}, chars:"?"},
             nsIDOMKeyEvent.DOM_VK_SLASH, "?", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"BrazilianABNT", keyCode:WIN_VK_ABNT_C2, numLock:1, chars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_BRAZILIAN_ABNT, keyCode:WIN_VK_ABNT_C2,
+             modifiers:{numLockKey:1}, chars:"."},
             nsIDOMKeyEvent.DOM_VK_SEPARATOR, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"BrazilianABNT", keyCode:WIN_VK_DECIMAL, numLock:1, chars:","},
+    testKey({layout:KEYBOARD_LAYOUT_BRAZILIAN_ABNT, keyCode:WIN_VK_DECIMAL,
+             modifiers:{numLockKey:1}, chars:","},
             nsIDOMKeyEvent.DOM_VK_DECIMAL, ",", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
 
     // Mac JIS keyboard
     // The separator key on JIS keyboard for Mac doesn't cause any character even with Japanese keyboard layout.
-    testKey({layout:"Japanese", keyCode:WIN_VK_ABNT_C2, numLock:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_JAPANESE, keyCode:WIN_VK_ABNT_C2,
+             modifiers:{numLockKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_SEPARATOR, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
-    testKey({layout:"Japanese", keyCode:WIN_VK_DECIMAL, numLock:1, chars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_JAPANESE, keyCode:WIN_VK_DECIMAL,
+             modifiers:{numLockKey:1}, chars:"."},
             nsIDOMKeyEvent.DOM_VK_DECIMAL, ".", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_NUMPAD);
 
     // Dead keys on any layouts
-    testKey({layout:"French", keyCode:WIN_VK_OEM_6, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_6, chars:"^^"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+             modifiers:{}, chars:"^^"},
             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "^^", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"French", keyCode:WIN_VK_OEM_6, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_A, chars:"\u00E2"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_A,
+             modifiers:{}, chars:"\u00E2"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00E2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"French", keyCode:WIN_VK_OEM_6, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_A, shift:1, chars:"\u00C2"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1}, chars:"\u00C2"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00C2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"French", keyCode:WIN_VK_OEM_6, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_Q, chars:"^q"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_Q,
+             modifiers:{}, chars:"^q"},
             nsIDOMKeyEvent.DOM_VK_Q, "^q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"French", keyCode:WIN_VK_OEM_6, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+             modifiers:{shiftKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_OEM_6, shift:1, chars:"\u00A8\u00A8"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+             modifiers:{shiftKey:1}, chars:"\u00A8\u00A8"},
             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "\u00A8\u00A8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"French", keyCode:WIN_VK_OEM_6, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+             modifiers:{shiftKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_A, shift:1, chars:"\u00C4"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1}, chars:"\u00C4"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00C4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"French", keyCode:WIN_VK_OEM_6, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+             modifiers:{shiftKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_A, chars:"\u00E4"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_A,
+             modifiers:{}, chars:"\u00E4"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00E4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"French", keyCode:WIN_VK_OEM_6, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_OEM_6,
+             modifiers:{shiftKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_CIRCUMFLEX, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"French", keyCode:WIN_VK_Q, shift:1, chars:"\u00A8Q"},
+    testKey({layout:KEYBOARD_LAYOUT_FRENCH, keyCode:WIN_VK_Q,
+             modifiers:{shiftKey:1}, chars:"\u00A8Q"},
             nsIDOMKeyEvent.DOM_VK_Q, "\u00A8Q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_1, chars:"``"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
+             modifiers:{}, chars:"``"},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "``", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_A, chars:"\u00E0"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
+             modifiers:{}, chars:"\u00E0"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00E0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_A, shift:1, chars:"\u00C0"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1}, chars:"\u00C0"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00C0", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
+             modifiers:{}, chars:""},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_Q, chars:"`q"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_Q,
+             modifiers:{}, chars:"`q"},
             nsIDOMKeyEvent.DOM_VK_Q, "`q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_1, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
+             modifiers:{shiftKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_1, shift:1, chars:"^^"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
+             modifiers:{shiftKey:1}, chars:"^^"},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "^^", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_1, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
+             modifiers:{shiftKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_A, shift:1, chars:"\u00C2"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1}, chars:"\u00C2"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00C2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_1, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
+             modifiers:{shiftKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_A, chars:"\u00E2"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
+             modifiers:{}, chars:"\u00E2"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00E2", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_1, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_1,
+             modifiers:{shiftKey:1}, chars:""},
             nsIDOMKeyEvent.DOM_VK_BACK_QUOTE, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_Q, shift:1, chars:"^Q"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_Q,
+             modifiers:{shiftKey:1}, chars:"^Q"},
             nsIDOMKeyEvent.DOM_VK_Q, "^Q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_7, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
+             modifiers:{}, chars:""},
             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_7, chars:"\u00B4\u00B4"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
+             modifiers:{}, chars:"\u00B4\u00B4"},
             0, "\u00B4\u00B4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_7, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
+             modifiers:{}, chars:""},
             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_A, chars:"\u00E1"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
+             modifiers:{}, chars:"\u00E1"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00E1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_7, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
+             modifiers:{}, chars:""},
             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_A, shift:1, chars:"\u00C1"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1}, chars:"\u00C1"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00C1", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_7, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
+             modifiers:{}, chars:""},
             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_Q, chars:"\u00B4q"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_Q,
+             modifiers:{}, chars:"\u00B4q"},
             nsIDOMKeyEvent.DOM_VK_Q, "\u00B4q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_7, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
+             modifiers:{shiftKey:1}, chars:""},
             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_7, shift:1, chars:"\u00A8\u00A8"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
+             modifiers:{shiftKey:1}, chars:"\u00A8\u00A8"},
             0, "\u00A8\u00A8", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_7, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
+             modifiers:{shiftKey:1}, chars:""},
             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_A, shift:1, chars:"\u00C4"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1}, chars:"\u00C4"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00C4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_7, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
+             modifiers:{shiftKey:1}, chars:""},
             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_A, chars:"\u00E4"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_A,
+             modifiers:{}, chars:"\u00E4"},
             nsIDOMKeyEvent.DOM_VK_A, "\u00E4", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
 
-    testKey({layout:"Spanish", keyCode:WIN_VK_OEM_7, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_OEM_7,
+             modifiers:{shiftKey:1}, chars:""},
             0, "", SHOULD_DELIVER_KEYDOWN_KEYUP, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
-    testKey({layout:"Spanish", keyCode:WIN_VK_Q, shift:1, chars:"\u00A8Q"},
+    testKey({layout:KEYBOARD_LAYOUT_SPANISH, keyCode:WIN_VK_Q,
+             modifiers:{shiftKey:1}, chars:"\u00A8Q"},
             nsIDOMKeyEvent.DOM_VK_Q, "\u00A8Q", SHOULD_DELIVER_ALL, KeyboardEvent.DOM_KEY_LOCATION_STANDARD);
   }
 
   document.removeEventListener("keydown",  onKeyEvent, false);
   document.removeEventListener("keypress", onKeyEvent, false);
   document.removeEventListener("keyup",    onKeyEvent, false);
 }
 
@@ -2148,87 +2919,113 @@ function runAccessKeyTests()
     is(activationCount, aShouldActivate ? 1 : 0, name + ", activating '" + aAccessKey + "'");
   }
 
   button.addEventListener("click", onClick, false);
   
   // These tests have to be per-plaform.
   if (IS_MAC) {
     // Basic sanity checks
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, chars:"a", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{}, chars:"a", unmodifiedChars:"a"},
             "a", false);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, ctrl:1, chars:"\u0001", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1}, chars:"\u0001", unmodifiedChars:"a"},
             "a", false);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, ctrl:1, chars:"\u0001", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1}, chars:"\u0001", unmodifiedChars:"a"},
             "A", false);
 
     // Shift-ctrl does not activate accesskeys
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, ctrl:1, shift:1, chars:"\u0001", unmodifiedChars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0001", unmodifiedChars:"A"},
             "a", false);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, ctrl:1, shift:1, chars:"\u0001", unmodifiedChars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0001", unmodifiedChars:"A"},
             "A", false);
     // Alt-ctrl activate accesskeys
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, ctrl:1, alt:1, chars:"\u0001", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"\u0001", unmodifiedChars:"a"},
             "a", true);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_A, ctrl:1, alt:1, chars:"\u0001", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"\u0001", unmodifiedChars:"a"},
             "A", true);
             
     // Greek layout can activate a Latin accesskey
-    testKey({layout:"Greek", keyCode:MAC_VK_ANSI_A, ctrl:1, alt:1, chars:"\u0001", unmodifiedChars:"\u03b1"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"\u0001", unmodifiedChars:"\u03b1"},
             "a", true);
-    testKey({layout:"Greek", keyCode:MAC_VK_ANSI_A, ctrl:1, alt:1, chars:"\u0001", unmodifiedChars:"\u03b1"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"\u0001", unmodifiedChars:"\u03b1"},
             "A", true);
     // ... and a Greek accesskey!
-    testKey({layout:"Greek", keyCode:MAC_VK_ANSI_A, ctrl:1, alt:1, chars:"\u0001", unmodifiedChars:"\u03b1"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"\u0001", unmodifiedChars:"\u03b1"},
             "\u03b1", true);
-    testKey({layout:"Greek", keyCode:MAC_VK_ANSI_A, ctrl:1, alt:1, chars:"\u0001", unmodifiedChars:"\u03b1"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"\u0001", unmodifiedChars:"\u03b1"},
             "\u0391", true);
 
     // bug 359638
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Period, ctrl:1, alt:1, chars:".", unmodifiedChars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Period,
+             modifiers:{ctrlKey:1, altKey:1}, chars:".", unmodifiedChars:"."},
             ".", true);
 
     // German (KCHR/KeyTranslate case)
-    testKey({layout:"German", keyCode:MAC_VK_ANSI_A, ctrl:1, alt:1, chars:"a", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"a", unmodifiedChars:"a"},
             "a", true);
-    testKey({layout:"German", keyCode:MAC_VK_ANSI_A, ctrl:1, alt:1, chars:"a", unmodifiedChars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_A,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"a", unmodifiedChars:"a"},
             "A", true);
-    testKey({layout:"German", keyCode:MAC_VK_ANSI_LeftBracket, ctrl:1, alt:1, chars:"\u00fc", unmodifiedChars:"\u00fc"},
+    testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_LeftBracket,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"\u00fc", unmodifiedChars:"\u00fc"},
             "\u00fc", true);
-    testKey({layout:"German", keyCode:MAC_VK_ANSI_LeftBracket, ctrl:1, alt:1, chars:"\u00fc", unmodifiedChars:"\u00fc"},
+    testKey({layout:KEYBOARD_LAYOUT_GERMAN, keyCode:MAC_VK_ANSI_LeftBracket,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"\u00fc", unmodifiedChars:"\u00fc"},
             "\u00dc", true);
   }
   else if (IS_WIN) {
     // Basic sanity checks
-    testKey({layout:"US", keyCode:WIN_VK_A, chars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{}, chars:"a"},
             "a", false);
-    testKey({layout:"US", keyCode:WIN_VK_A, shift:1, alt:1, chars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1, altKey:1}, chars:"A"},
             "a", true);
-    testKey({layout:"US", keyCode:WIN_VK_A, shift:1, alt:1, chars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1, altKey:1}, chars:"A"},
             "A", true);
 
     // shift-alt-ctrl does not activate accesskeys
-    testKey({layout:"US", keyCode:WIN_VK_A, ctrl:1, shift:1, alt:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{ctrlKey:1, shiftKey:1, altKey:1}, chars:""},
             "a", false);
-    testKey({layout:"US", keyCode:WIN_VK_A, ctrl:1, shift:1, alt:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{ctrlKey:1, shiftKey:1, altKey:1}, chars:""},
             "A", false);
 
     // Greek layout can activate a Latin accesskey
-    testKey({layout:"Greek", keyCode:WIN_VK_A, shift:1, alt:1, chars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1, altKey:1}, chars:"A"},
             "a", true);
-    testKey({layout:"Greek", keyCode:WIN_VK_A, shift:1, alt:1, chars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1, altKey:1}, chars:"A"},
             "A", true);
     // ... and a Greek accesskey!
-    testKey({layout:"Greek", keyCode:WIN_VK_A, shift:1, alt:1, chars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1, altKey:1}, chars:"A"},
             "\u03b1", true);
-    testKey({layout:"Greek", keyCode:WIN_VK_A, shift:1, alt:1, chars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_GREEK, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1, altKey:1}, chars:"A"},
             "\u0391", true);
 
     // bug 359638
-    testKey({layout:"US", keyCode:WIN_VK_OEM_PERIOD, shift:1, alt:1, chars:".", unmodifiedChars:"."},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_PERIOD,
+             modifiers:{shiftKey:1, altKey:1}, chars:".", unmodifiedChars:"."},
             ".", true);
   }
   
   button.removeEventListener("click", onClick, false);
 }
 
 function runXULKeyTests()
 {
@@ -2241,101 +3038,132 @@ function runXULKeyTests()
 
     var name = eventToString(aEvent);
 
     is(elem.activeCount, aShouldActivate ? 1 : 0,
        name + " activating " + aElem);
   }
 
   if (IS_MAC) {
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Semicolon, command:1, chars:";", unmodifiedChars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
+             modifiers:{metaKey:1}, chars:";", unmodifiedChars:";"},
             "unshiftedKey", true);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Semicolon, command:1, chars:";", unmodifiedChars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
+             modifiers:{metaKey:1}, chars:";", unmodifiedChars:";"},
             "shiftedKey", false);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Semicolon, command:1, shift:1, chars:";", unmodifiedChars:":"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
+             modifiers:{metaKey:1, shiftKey:1}, chars:";", unmodifiedChars:":"},
             "shiftedKey", true);
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_Semicolon, command:1, shift:1, chars:";", unmodifiedChars:":"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_Semicolon,
+             modifiers:{metaKey:1, shiftKey:1}, chars:";", unmodifiedChars:":"},
             "unshiftedKey", false);
   }
   else if (IS_WIN) {
-    testKey({layout:"US", keyCode:WIN_VK_OEM_1, ctrl:1, chars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_1,
+             modifiers:{ctrlKey:1}, chars:";"},
             "unshiftedKey", true);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_1, ctrl:1, chars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_1,
+             modifiers:{ctrlKey:1}, chars:";"},
             "shiftedKey", false);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_1, ctrl:1, shift:1, chars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_1,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:";"},
             "shiftedKey", true);
-    testKey({layout:"US", keyCode:WIN_VK_OEM_1, ctrl:1, shift:1, chars:";"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_OEM_1,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:";"},
             "unshiftedKey", false);
   }
 
   keyElems = ["commandOptionF"];
 
   // 429160
   if (IS_MAC) {
-    testKey({layout:"US", keyCode:MAC_VK_ANSI_F, command:1, alt:1, chars:"\u0192", unmodifiedChars:"f"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:MAC_VK_ANSI_F,
+             modifiers:{metaKey:1, altKey:1}, chars:"\u0192", unmodifiedChars:"f"},
             "commandOptionF", true);
   }
   else if (IS_WIN) {
-    testKey({layout:"US", keyCode:WIN_VK_F, ctrl:1, alt:1, chars:"\u0006"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_F,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"\u0006"},
             "commandOptionF", true);
   }
   
   // 432112
   if (IS_MAC) {
-    testKey({layout:"Swedish", keyCode:MAC_VK_ANSI_Minus, command:1, shift:1, chars:"+", unmodifiedChars:"?"},
+    testKey({layout:KEYBOARD_LAYOUT_SWEDISH, keyCode:MAC_VK_ANSI_Minus,
+             modifiers:{metaKey:1, shiftKey:1}, chars:"+", unmodifiedChars:"?"},
             "question", true);
   }
   else if (IS_WIN) {
-    testKey({layout:"Swedish", keyCode:WIN_VK_OEM_PLUS, ctrl:1, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SWEDISH, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:""},
             "question", true);
-    testKey({layout:"Swedish", keyCode:WIN_VK_OEM_PLUS, ctrl:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_SWEDISH, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{ctrlKey:1}, chars:""},
             "question", false);
   }
 
   // bug 433192
   if (IS_WIN) {
-    testKey({layout:"US", keyCode:WIN_VK_X, ctrl:1, chars:"\u0018"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_X,
+             modifiers:{ctrlKey:1}, chars:"\u0018"},
             "unshiftedX", true);
-    testKey({layout:"US", keyCode:WIN_VK_X, ctrl:1, chars:"\u0018"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_X,
+             modifiers:{ctrlKey:1}, chars:"\u0018"},
             "shiftedX", false);
-    testKey({layout:"US", keyCode:WIN_VK_X, ctrl:1, shift:1, chars:"\u0018"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_X,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0018"},
             "unshiftedX", false);
-    testKey({layout:"US", keyCode:WIN_VK_X, ctrl:1, shift:1, chars:"\u0018"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_X,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0018"},
             "shiftedX", true);
-    testKey({layout:"Arabic", keyCode:WIN_VK_X, ctrl:1, chars:"\u0018"},
+    testKey({layout:KEYBOARD_LAYOUT_ARABIC, keyCode:WIN_VK_X,
+             modifiers:{ctrlKey:1}, chars:"\u0018"},
             "unshiftedX", true);
-    testKey({layout:"Arabic", keyCode:WIN_VK_X, ctrl:1, chars:"\u0018"},
+    testKey({layout:KEYBOARD_LAYOUT_ARABIC, keyCode:WIN_VK_X,
+             modifiers:{ctrlKey:1}, chars:"\u0018"},
             "shiftedX", false);
-    testKey({layout:"Arabic", keyCode:WIN_VK_X, ctrl:1, shift:1, chars:"\u0018"},
+    testKey({layout:KEYBOARD_LAYOUT_ARABIC, keyCode:WIN_VK_X,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0018"},
             "unshiftedX", false);
-    testKey({layout:"Arabic", keyCode:WIN_VK_X, ctrl:1, shift:1, chars:"\u0018"},
+    testKey({layout:KEYBOARD_LAYOUT_ARABIC, keyCode:WIN_VK_X,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0018"},
             "shiftedX", true);
-    testKey({layout:"Hebrew", keyCode:WIN_VK_X, ctrl:1, chars:"\u0018"},
+    testKey({layout:KEYBOARD_LAYOUT_HEBREW, keyCode:WIN_VK_X,
+             modifiers:{ctrlKey:1}, chars:"\u0018"},
             "unshiftedX", true);
-    testKey({layout:"Hebrew", keyCode:WIN_VK_X, ctrl:1, chars:"\u0018"},
+    testKey({layout:KEYBOARD_LAYOUT_HEBREW, keyCode:WIN_VK_X,
+             modifiers:{ctrlKey:1}, chars:"\u0018"},
             "shiftedX", false);
-    testKey({layout:"Hebrew", keyCode:WIN_VK_X, ctrl:1, shift:1, chars:"\u0018"},
+    testKey({layout:KEYBOARD_LAYOUT_HEBREW, keyCode:WIN_VK_X,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0018"},
             "unshiftedX", false);
-    testKey({layout:"Hebrew", keyCode:WIN_VK_X, ctrl:1, shift:1, chars:"\u0018"},
+    testKey({layout:KEYBOARD_LAYOUT_HEBREW, keyCode:WIN_VK_X,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:"\u0018"},
             "shiftedX", true);
-    testKey({layout:"Japanese", keyCode:WIN_VK_OEM_PLUS, ctrl:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_JAPANESE, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{ctrlKey:1}, chars:""},
             "unshiftedPlus", false);
-    testKey({layout:"Japanese", keyCode:WIN_VK_OEM_PLUS, ctrl:1, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_JAPANESE, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:""},
             "unshiftedPlus", true);
   }
 
   // bug 759346
   if (IS_WIN) {
-    testKey({layout:"Thai", keyCode:WIN_VK_1, ctrl:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:WIN_VK_1,
+             modifiers:{ctrlKey:1}, chars:""},
             "unshiftedPlus", false);
-    testKey({layout:"Thai", keyCode:WIN_VK_1, ctrl:1, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:WIN_VK_1,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:""},
             "unshiftedPlus", true);
-    testKey({layout:"Thai", keyCode:WIN_VK_OEM_PLUS, ctrl:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{ctrlKey:1}, chars:""},
             "unshiftedPlus", true);
-    testKey({layout:"Thai", keyCode:WIN_VK_OEM_PLUS, ctrl:1, shift:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_THAI, keyCode:WIN_VK_OEM_PLUS,
+             modifiers:{ctrlKey:1, shiftKey:1}, chars:""},
             "unshiftedPlus", false);
   }
 }
 
 function runTextInputTests()
 {
   var textbox = document.getElementById("textbox");
 
@@ -2347,36 +3175,45 @@ function runTextInputTests()
 
     var name = eventToString(aEvent);
 
     is(textbox.value, aExpectText, name + " does not input correct text.");
   }
 
   if (IS_WIN) {
     // Basic sanity checks
-    testKey({layout:"US", keyCode:WIN_VK_A, chars:"a"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{}, chars:"a"},
             "a");
-    testKey({layout:"US", keyCode:WIN_VK_A, shift:1, chars:"A"},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{shiftKey:1}, chars:"A"},
             "A");
     // When Ctrl+Alt are pressed, any text should not be inputted.
-    testKey({layout:"US", keyCode:WIN_VK_A, ctrl:1, alt:1, chars:""},
+    testKey({layout:KEYBOARD_LAYOUT_EN_US, keyCode:WIN_VK_A,
+             modifiers:{ctrlKey:1, altKey:1}, chars:""},
             "");
 
     // Lithuanian AltGr should be consumed at 9/0 keys pressed
-    testKey({layout:"Lithuanian", keyCode:WIN_VK_8, chars:"\u016B"},
+    testKey({layout:KEYBOARD_LAYOUT_LITHUANIAN, keyCode:WIN_VK_8,
+             modifiers:{}, chars:"\u016B"},
             "\u016B");
-    testKey({layout:"Lithuanian", keyCode:WIN_VK_9, chars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_LITHUANIAN, keyCode:WIN_VK_9,
+             modifiers:{}, chars:"9"},
             "9");
-    testKey({layout:"Lithuanian", keyCode:WIN_VK_0, chars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_LITHUANIAN, keyCode:WIN_VK_0,
+             modifiers:{}, chars:"0"},
             "0");
-    testKey({layout:"Lithuanian", keyCode:WIN_VK_8, ctrl:1, alt:1, chars:"8"},
+    testKey({layout:KEYBOARD_LAYOUT_LITHUANIAN, keyCode:WIN_VK_8,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"8"},
             "8");
-    testKey({layout:"Lithuanian", keyCode:WIN_VK_9, ctrl:1, alt:1, chars:"9"},
+    testKey({layout:KEYBOARD_LAYOUT_LITHUANIAN, keyCode:WIN_VK_9,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"9"},
             "9");
-    testKey({layout:"Lithuanian", keyCode:WIN_VK_0, ctrl:1, alt:1, chars:"0"},
+    testKey({layout:KEYBOARD_LAYOUT_LITHUANIAN, keyCode:WIN_VK_0,
+             modifiers:{ctrlKey:1, altKey:1}, chars:"0"},
             "0");
   }
   else
     todo(false, "runTextInputTests() checks Windows only");
 
   // XXX We need to move focus for canceling to search the autocomplete
   // result. If we don't do here, Fx will crash at end of this tests.
   document.getElementById("button").focus();
--- a/widget/tests/test_native_key_bindings_mac.html
+++ b/widget/tests/test_native_key_bindings_mac.html
@@ -91,233 +91,199 @@
       lamp catnip in viverra tail flick zzz meow etiam enim. Ac ac hiss shed
       everywhere kittens rhoncus, attack your ankles zzz iaculis kittens.
       Nullam pellentesque rip the couch iaculis rhoncus nibh, give me fish orci
       turpis purr sleep on your face quis nunc bibendum.">
 
     <script type="text/javascript;version=1.8">
       SimpleTest.waitForExplicitFinish();
 
-      let utils = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor).
-                         getInterface(Components.interfaces.nsIDOMWindowUtils);
-
-      let layouts = {
-        "US":              0,
-        "Greek":           1,
-        "German":          2,
-        "Swedish":         3,
-        "Dvorak-Qwerty":   4,
-        "Thai":            5
-      };
-
       let synthesizedKeys = [];
       let expectations = [];
 
       // Move to beginning of line
-      synthesizedKeys.push([layouts.US, MAC_VK_LeftArrow,
-                            {ctrl: true}, "\uf702", "\uf702"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_LeftArrow,
+                            {ctrlKey: true}, "\uf702", "\uf702"]);
       expectations.push({
         editable: [0, 0],
         textarea: [0, 0],
         input:    [0, 0]
       });
 
       // Move to end of line
-      synthesizedKeys.push([layouts.US, MAC_VK_RightArrow,
-                            {ctrl: true}, "\uf703", "\uf703"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_RightArrow,
+                            {ctrlKey: true}, "\uf703", "\uf703"]);
       expectations.push({
         editable: [73, 73],
         textarea: [72, 72],
         input:    [732, 732]
       });
 
       // Move down
-      synthesizedKeys.push([layouts.US, MAC_VK_ANSI_N,
-                            {ctrl: true}, "\u000e", "n"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_N,
+                            {ctrlKey: true}, "\u000e", "n"]);
       expectations.push({
         editable: [140, 140],
         textarea: [145, 145],
         input:    [732, 732]
       });
 
       // Move to beginning of line
-      synthesizedKeys.push([layouts.US, MAC_VK_LeftArrow,
-                            {ctrl: true}, "\uf702", "\uf702"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_LeftArrow,
+                            {ctrlKey: true}, "\uf702", "\uf702"]);
       expectations.push({
         editable: [73, 73],
         textarea: [73, 73],
         input:    [0, 0]
       });
 
       // Move word right and modify selection
-      synthesizedKeys.push([layouts.US, MAC_VK_RightArrow,
-                            {alt: true, shift: true}, "\uf703", "\uf703"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_RightArrow,
+                            {altKey: true, shiftKey: true}, "\uf703", "\uf703"]);
       expectations.push({
         editable: [73, 84],
         textarea: [73, 90],
         input:    [0, 10]
       });
 
       // Move word right
-      synthesizedKeys.push([layouts.US, MAC_VK_RightArrow,
-                            {alt: true}, "\uf703", "\uf703"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_RightArrow,
+                            {altKey: true}, "\uf703", "\uf703"]);
       expectations.push({
         editable: [84, 84],
         textarea: [90, 90],
         input:    [10, 10]
       });
 
       // Move word right
-      synthesizedKeys.push([layouts.US, MAC_VK_RightArrow,
-                            {alt: true}, "\uf703", "\uf703"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_RightArrow,
+                            {altKey: true}, "\uf703", "\uf703"]);
       expectations.push({
         editable: [89, 89],
         textarea: [95, 95],
         input:    [17, 17]
       });
 
       // Move down and modify selection
-      synthesizedKeys.push([layouts.US, MAC_VK_DownArrow,
-                            {shift: true}, "\uf701", "\uf701"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_DownArrow,
+                            {shiftKey: true}, "\uf701", "\uf701"]);
       expectations.push({
         editable: [89, 171],
         textarea: [95, 175],
         input:    [17, 732]
       });
 
       // Move backward and modify selection
-      synthesizedKeys.push([layouts.US, MAC_VK_ANSI_B,
-                            {ctrl: true, shift: true}, "\u0002", "B"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_B,
+                            {ctrlKey: true, shiftKey: true}, "\u0002", "B"]);
       expectations.push({
         editable: [89, 170],
         textarea: [95, 174],
         input:    [17, 731]
       });
 
       // Delete forward
-      synthesizedKeys.push([layouts.US, MAC_VK_ANSI_D,
-                            {ctrl: true}, "\u0004", "d"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_D,
+                            {ctrlKey: true}, "\u0004", "d"]);
       expectations.push({
         editable: [89, 89],
         textarea: [95, 95],
         input:    [17, 17]
       });
 
       // Delete backward
-      synthesizedKeys.push([layouts.US, MAC_VK_ANSI_H,
-                            {ctrl: true}, "\u0008", "h"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_H,
+                            {ctrlKey: true}, "\u0008", "h"]);
       expectations.push({
         editable: [88, 88],
         textarea: [94, 94],
         input:    [16, 16]
       });
 
       // Move backward
-      synthesizedKeys.push([layouts.US, MAC_VK_ANSI_B,
-                            {ctrl: true}, "\u0002", "b"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_B,
+                            {ctrlKey: true}, "\u0002", "b"]);
       expectations.push({
         editable: [87, 87],
         textarea: [93, 93],
         input:    [15, 15]
       });
 
       // Move to beginning of paragraph (line for now)
-      synthesizedKeys.push([layouts.US, MAC_VK_ANSI_A,
-                            {ctrl: true}, "\u0001", "a"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_A,
+                            {ctrlKey: true}, "\u0001", "a"]);
       expectations.push({
         editable: [73, 73],
         textarea: [73, 73],
         input:    [0, 0]
       });
 
       // Move forward
-      synthesizedKeys.push([layouts.US, MAC_VK_ANSI_F,
-                            {ctrl: true}, "\u0006", "f"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_F,
+                            {ctrlKey: true}, "\u0006", "f"]);
       expectations.push({
         editable: [74, 74],
         textarea: [74, 74],
         input:    [1, 1]
       });
 
       // Move word right
-      synthesizedKeys.push([layouts.US, MAC_VK_RightArrow,
-                            {alt: true}, "\uf703", "\uf703"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_RightArrow,
+                            {altKey: true}, "\uf703", "\uf703"]);
       expectations.push({
         editable: [84, 84],
         textarea: [90, 90],
         input:    [10, 10]
       });
 
       // Move word right
-      synthesizedKeys.push([layouts.US, MAC_VK_RightArrow,
-                            {alt: true}, "\uf703", "\uf703"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_RightArrow,
+                            {altKey: true}, "\uf703", "\uf703"]);
       expectations.push({
         editable: [88, 88],
         textarea: [94, 94],
         input:    [17, 17]
       });
 
       // Delete to end of paragraph (line for now)
-      synthesizedKeys.push([layouts.US, MAC_VK_ANSI_K,
-                            {ctrl: true}, "\u000b", "k"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_K,
+                            {ctrlKey: true}, "\u000b", "k"]);
       expectations.push({
         editable: [88, 88],
         textarea: [94, 94],
         input:    [17, 17]
       });
 
       // Move backward and modify selection
-      synthesizedKeys.push([layouts.US, MAC_VK_ANSI_B,
-                            {ctrl: true, shift: true}, "\u0002", "B"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_B,
+                            {ctrlKey: true, shiftKey: true}, "\u0002", "B"]);
       expectations.push({
         editable: [88, 87],
         textarea: [93, 94],
         input:    [16, 17]
       });
 
       // Move to end of paragraph (line for now)
-      synthesizedKeys.push([layouts.US, MAC_VK_ANSI_E,
-                            {ctrl: true}, "\u0005", "e"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_E,
+                            {ctrlKey: true}, "\u0005", "e"]);
       expectations.push({
         editable: [144, 144],
         textarea: [94, 94],
         input:    [17, 17]
       });
 
       // Move up
-      synthesizedKeys.push([layouts.US, MAC_VK_ANSI_P,
-                            {ctrl: true}, "\u0010", "p"]);
+      synthesizedKeys.push([KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_P,
+                            {ctrlKey: true}, "\u0010", "p"]);
       expectations.push({
         editable: [73, 73],
         textarea: [21, 21],
         input:    [0, 0]
       });
 
-      function synthesizeNativeKey(aLayout, aKeyCode, aModifiers, aSystemChars,
-                                   aSystemUnmodifiedChars)
-      {
-        let modifiers = 0;
-        if (aModifiers.capsLock) modifiers |= 0x01;
-        if (aModifiers.numLock) modifiers |= 0x02;
-        if (aModifiers.shift) modifiers |= 0x0100;
-        if (aModifiers.shiftRight) modifiers |= 0x0200;
-        if (aModifiers.ctrl) modifiers |= 0x0400;
-        if (aModifiers.ctrlRight) modifiers |= 0x0800;
-        if (aModifiers.alt) modifiers |= 0x1000;
-        if (aModifiers.altRight) modifiers |= 0x2000;
-        if (aModifiers.command) modifiers |= 0x4000;
-        if (aModifiers.commandRight) modifiers |= 0x8000;
-        if (aModifiers.help) modifiers |= 0x10000;
-        if (aModifiers.function) modifiers |= 0x100000;
-        if (aModifiers.numericKeyPad) modifiers |= 0x01000000;
-
-        utils.sendNativeKeyEvent(aLayout, aKeyCode, modifiers,
-                                 aSystemChars, aSystemUnmodifiedChars);
-      }
-
       function checkWindowSelection(aElement, aSelection)
       {
         let selection = window.getSelection();
 
         is(selection.anchorOffset, aSelection[aElement.id][0],
            aElement.id + ": Incorrect anchor offset");
         is(selection.focusOffset, aSelection[aElement.id][1],
            aElement.id + ": Incorrect focus offset");
--- a/widget/tests/test_plugin_input_event.html
+++ b/widget/tests/test_plugin_input_event.html
@@ -44,29 +44,23 @@ var gUtils = window.
 function doTest() {
   gPlugin.focus();
 
   is(gUtils.IMEStatus, gUtils.IME_STATUS_PLUGIN,
      "Plugin failed to get focus");
 
   is(gPlugin.getLastKeyText(), "", "Must be empty before first key test");
 
-  gUtils.sendNativeKeyEvent(0x409 /* US */,
-                            WIN_VK_A, 0,
-                            "a", "a");
+  synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, WIN_VK_A, {}, "a", "a");
   is(gPlugin.getLastKeyText(), "a", "Invalid character was inputted");
 
-  gUtils.sendNativeKeyEvent(0x407 /* German */,
-                            WIN_VK_OEM_PLUS, 0,
-                            "+", "+");
+  synthesizeNativeKey(KEYBOARD_LAYOUT_GERMAN, WIN_VK_OEM_PLUS, {}, "+", "+");
   is(gPlugin.getLastKeyText(), "+", "Invalid character was inputted");
 
-  gUtils.sendNativeKeyEvent(0x407 /* German */,
-                            WIN_VK_OEM_PLUS, 0x1400 /* Ctrl + Alt (AltGr) */,
-                            "~", "+");
+  synthesizeNativeKey(KEYBOARD_LAYOUT_GERMAN, WIN_VK_OEM_PLUS, {altGrKey:1}, "~", "+");
   is(gPlugin.getLastKeyText(), "~", "Invalid character was inputted");
 
   SimpleTest.finish();
 }
 
 SimpleTest.waitForFocus(doTest);
 
 </script>
--- a/widget/tests/test_secure_input.html
+++ b/widget/tests/test_secure_input.html
@@ -31,18 +31,17 @@
 <div id="contenteditable" contenteditable style="min-height: 3em;"></div>
 
 <script class="testbody" type="application/javascript">
 
   SimpleTest.waitForExplicitFinish();
 
   function sendAKeyEvent()
   {
-    SpecialPowers.getDOMWindowUtils(window)
-                 .sendNativeKeyEvent(0, MAC_VK_ANSI_A, 0, "a", "a");
+    synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, MAC_VK_ANSI_A, {}, "a", "a");
   }
 
   function isFocused(aElement)
   {
     return (SpecialPowers.focusManager.focusedElement == aElement);
   }
 
   function runTest()