Bug 1222285 - Part 3: Add test cases to check whether keyEvents been correctly spoofed and modifier keys been correctly suppressed. r?masayuki,arthuredelstein draft
authorTim Huang <tihuang@mozilla.com>
Tue, 05 Sep 2017 16:01:02 +0800
changeset 721356 19c52a71772b50806533d022f1b107f96f61cdc9
parent 720799 d74e47db32dbb2bfb0e22728ad788494b72d343e
child 746321 6bd23f756d23f418115c65678f78cd7db7ae6464
push id95822
push userbmo:tihuang@mozilla.com
push dateWed, 17 Jan 2018 08:14:24 +0000
reviewersmasayuki, arthuredelstein
bugs1222285
milestone59.0a1
Bug 1222285 - Part 3: Add test cases to check whether keyEvents been correctly spoofed and modifier keys been correctly suppressed. r?masayuki,arthuredelstein This patch adds two test cases which generates Keyboard events for English content and test whether the keyboard events been spoofed as US English QWERTY keyboard events. In addition, it also tests that whether the modifier keys been suppressed. MozReview-Commit-ID: d6uZxJJayk
browser/components/resistfingerprinting/test/browser/browser.ini
browser/components/resistfingerprinting/test/browser/browser_spoofing_keyboard_event.js
browser/components/resistfingerprinting/test/browser/file_keyBoardEvent.sjs
browser/components/resistfingerprinting/test/mochitest/mochitest.ini
browser/components/resistfingerprinting/test/mochitest/test_keyboard_event.html
--- a/browser/components/resistfingerprinting/test/browser/browser.ini
+++ b/browser/components/resistfingerprinting/test/browser/browser.ini
@@ -1,12 +1,13 @@
 [DEFAULT]
 tags = resistfingerprinting
 support-files =
   file_dummy.html
+  file_keyBoardEvent.sjs
   file_navigator.html
   file_navigatorWorker.js
   file_workerNetInfo.js
   file_workerPerformance.js
   head.js
 
 [browser_block_mozAddonManager.js]
 [browser_navigator.js]
@@ -21,10 +22,11 @@ support-files =
 [browser_roundedWindow_open_min_inner.js]
 [browser_roundedWindow_open_min_outer.js]
 [browser_roundedWindow_windowSetting_max_inner.js]
 [browser_roundedWindow_windowSetting_max_outer.js]
 [browser_roundedWindow_windowSetting_mid_inner.js]
 [browser_roundedWindow_windowSetting_mid_outer.js]
 [browser_roundedWindow_windowSetting_min_inner.js]
 [browser_roundedWindow_windowSetting_min_outer.js]
+[browser_spoofing_keyboard_event.js]
 [browser_timezone.js]
 [browser_bug1369357_site_specific_zoom_level.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/resistfingerprinting/test/browser/browser_spoofing_keyboard_event.js
@@ -0,0 +1,810 @@
+/**
+ * Bug 1222285 - A test case for testing whether keyboard events be spoofed correctly
+ *   when fingerprinting resistance is enable.
+ */
+
+const { classes: Cc, Constructor: CC, interfaces: Ci, utils: Cu } = Components;
+
+const nsIDOMKeyEvent = Ci.nsIDOMKeyEvent;
+const SHOULD_DELIVER_KEYDOWN          = 0x1;
+const SHOULD_DELIVER_KEYPRESS         = 0x2;
+const SHOULD_DELIVER_KEYUP            = 0x4;
+const SHOULD_DELIVER_ALL              = SHOULD_DELIVER_KEYDOWN |
+                                        SHOULD_DELIVER_KEYPRESS |
+                                        SHOULD_DELIVER_KEYUP;
+
+const TEST_PATH = "http://example.net/browser/browser/" +
+                  "components/resistfingerprinting/test/browser/";
+
+// The test cases for english content.
+const TEST_CASES_EN = [
+  { key: "KEY_ArrowDown", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "ArrowDown", code: "ArrowDown", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_DOWN,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_ArrowLeft", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "ArrowLeft", code: "ArrowLeft", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_LEFT,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_ArrowRight", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "ArrowRight", code: "ArrowRight", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_RIGHT,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_ArrowUp", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "ArrowUp", code: "ArrowUp", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_UP,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_CapsLock", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_KEYDOWN,
+    result: { key: "CapsLock", code: "CapsLock", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_CAPS_LOCK,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_End", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "End", code: "End", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_END,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_Enter", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "Enter", code: "Enter", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_RETURN,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_Escape", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "Escape", code: "Escape", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_ESCAPE,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_Home", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "Home", code: "Home", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_HOME,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_Meta", modifiers: { location: KeyboardEvent.DOM_KEY_LOCATION_LEFT, metaKey: true },
+    expectedKeyEvent: SHOULD_DELIVER_KEYDOWN,
+    result: { key: "Meta", code: "OSLeft", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_WIN,
+              location: KeyboardEvent.DOM_KEY_LOCATION_LEFT, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_Meta", modifiers: { location: KeyboardEvent.DOM_KEY_LOCATION_RIGHT, metaKey: true },
+    expectedKeyEvent: SHOULD_DELIVER_KEYDOWN,
+    result: { key: "Meta", code: "OSRight", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_WIN,
+              location: KeyboardEvent.DOM_KEY_LOCATION_RIGHT, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_OS", modifiers: { location: KeyboardEvent.DOM_KEY_LOCATION_LEFT, osKey: true },
+    expectedKeyEvent: SHOULD_DELIVER_KEYDOWN,
+    result: { key: "OS", code: "OSLeft", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_WIN,
+              location: KeyboardEvent.DOM_KEY_LOCATION_LEFT, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_OS", modifiers: { location: KeyboardEvent.DOM_KEY_LOCATION_RIGHT, osKey: true },
+    expectedKeyEvent: SHOULD_DELIVER_KEYDOWN,
+    result: { key: "OS", code: "OSRight", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_WIN,
+              location: KeyboardEvent.DOM_KEY_LOCATION_RIGHT, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_PageDown", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "PageDown", code: "PageDown", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_PAGE_DOWN,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_PageUp", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "PageUp", code: "PageUp", charCode: 0, keyCode: nsIDOMKeyEvent.DOM_VK_PAGE_UP,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: " ", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: " ", code: "Space", charCode: 32, keyCode: nsIDOMKeyEvent.DOM_VK_SPACE,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: ",", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: ",", code: "Comma", charCode: 44, keyCode: nsIDOMKeyEvent.DOM_VK_COMMA,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "<", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "<", code: "Comma", charCode: 60, keyCode: nsIDOMKeyEvent.DOM_VK_COMMA,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "[", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "[", code: "BracketLeft", charCode: 91, keyCode: nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "{", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "{", code: "BracketLeft", charCode: 123, keyCode: nsIDOMKeyEvent.DOM_VK_OPEN_BRACKET,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "]", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "]", code: "BracketRight", charCode: 93, keyCode: nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "}", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "}", code: "BracketRight", charCode: 125, keyCode: nsIDOMKeyEvent.DOM_VK_CLOSE_BRACKET,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "\\", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "\\", code: "Backslash", charCode: 92, keyCode: nsIDOMKeyEvent.DOM_VK_BACK_SLASH,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "|", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "|", code: "Backslash", charCode: 124, keyCode: nsIDOMKeyEvent.DOM_VK_BACK_SLASH,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: ";", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: ";", code: "Semicolon", charCode: 59, keyCode: nsIDOMKeyEvent.DOM_VK_SEMICOLON,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: ":", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: ":", code: "Semicolon", charCode: 58, keyCode: nsIDOMKeyEvent.DOM_VK_SEMICOLON,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: ".", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: ".", code: "Period", charCode: 46, keyCode: nsIDOMKeyEvent.DOM_VK_PERIOD,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: ">", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: ">", code: "Period", charCode: 62, keyCode: nsIDOMKeyEvent.DOM_VK_PERIOD,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "/", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "/", code: "Slash", charCode: 47, keyCode: nsIDOMKeyEvent.DOM_VK_SLASH,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "?", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "?", code: "Slash", charCode: 63, keyCode: nsIDOMKeyEvent.DOM_VK_SLASH,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "'", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "'", code: "Quote", charCode: 39, keyCode: nsIDOMKeyEvent.DOM_VK_QUOTE,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "\"", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "\"", code: "Quote", charCode: 34, keyCode: nsIDOMKeyEvent.DOM_VK_QUOTE,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "-", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "-", code: "Minus", charCode: 45, keyCode: nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "_", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "_", code: "Minus", charCode: 95, keyCode: nsIDOMKeyEvent.DOM_VK_HYPHEN_MINUS,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "=", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "=", code: "Equal", charCode: 61, keyCode: nsIDOMKeyEvent.DOM_VK_EQUALS,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "+", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "+", code: "Equal", charCode: 43, keyCode: nsIDOMKeyEvent.DOM_VK_EQUALS,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "a", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "a", code: "KeyA", charCode: 97, keyCode: nsIDOMKeyEvent.DOM_VK_A,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "A", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "A", code: "KeyA", charCode: 65, keyCode: nsIDOMKeyEvent.DOM_VK_A,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "b", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "b", code: "KeyB", charCode: 98, keyCode: nsIDOMKeyEvent.DOM_VK_B,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "B", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "B", code: "KeyB", charCode: 66, keyCode: nsIDOMKeyEvent.DOM_VK_B,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "c", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "c", code: "KeyC", charCode: 99, keyCode: nsIDOMKeyEvent.DOM_VK_C,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "C", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "C", code: "KeyC", charCode: 67, keyCode: nsIDOMKeyEvent.DOM_VK_C,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "d", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "d", code: "KeyD", charCode: 100, keyCode: nsIDOMKeyEvent.DOM_VK_D,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "D", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "D", code: "KeyD", charCode: 68, keyCode: nsIDOMKeyEvent.DOM_VK_D,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "e", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "e", code: "KeyE", charCode: 101, keyCode: nsIDOMKeyEvent.DOM_VK_E,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "E", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "E", code: "KeyE", charCode: 69, keyCode: nsIDOMKeyEvent.DOM_VK_E,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "f", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "f", code: "KeyF", charCode: 102, keyCode: nsIDOMKeyEvent.DOM_VK_F,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "F", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "F", code: "KeyF", charCode: 70, keyCode: nsIDOMKeyEvent.DOM_VK_F,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "g", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "g", code: "KeyG", charCode: 103, keyCode: nsIDOMKeyEvent.DOM_VK_G,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "G", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "G", code: "KeyG", charCode: 71, keyCode: nsIDOMKeyEvent.DOM_VK_G,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "h", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "h", code: "KeyH", charCode: 104, keyCode: nsIDOMKeyEvent.DOM_VK_H,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "H", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "H", code: "KeyH", charCode: 72, keyCode: nsIDOMKeyEvent.DOM_VK_H,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "i", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "i", code: "KeyI", charCode: 105, keyCode: nsIDOMKeyEvent.DOM_VK_I,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "I", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "I", code: "KeyI", charCode: 73, keyCode: nsIDOMKeyEvent.DOM_VK_I,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "j", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "j", code: "KeyJ", charCode: 106, keyCode: nsIDOMKeyEvent.DOM_VK_J,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "J", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "J", code: "KeyJ", charCode: 74, keyCode: nsIDOMKeyEvent.DOM_VK_J,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "k", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "k", code: "KeyK", charCode: 107, keyCode: nsIDOMKeyEvent.DOM_VK_K,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "K", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "K", code: "KeyK", charCode: 75, keyCode: nsIDOMKeyEvent.DOM_VK_K,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "l", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "l", code: "KeyL", charCode: 108, keyCode: nsIDOMKeyEvent.DOM_VK_L,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "L", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "L", code: "KeyL", charCode: 76, keyCode: nsIDOMKeyEvent.DOM_VK_L,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "m", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "m", code: "KeyM", charCode: 109, keyCode: nsIDOMKeyEvent.DOM_VK_M,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "M", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "M", code: "KeyM", charCode: 77, keyCode: nsIDOMKeyEvent.DOM_VK_M,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "n", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "n", code: "KeyN", charCode: 110, keyCode: nsIDOMKeyEvent.DOM_VK_N,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "N", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "N", code: "KeyN", charCode: 78, keyCode: nsIDOMKeyEvent.DOM_VK_N,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "o", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "o", code: "KeyO", charCode: 111, keyCode: nsIDOMKeyEvent.DOM_VK_O,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "O", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "O", code: "KeyO", charCode: 79, keyCode: nsIDOMKeyEvent.DOM_VK_O,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "p", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "p", code: "KeyP", charCode: 112, keyCode: nsIDOMKeyEvent.DOM_VK_P,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "P", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "P", code: "KeyP", charCode: 80, keyCode: nsIDOMKeyEvent.DOM_VK_P,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "q", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "q", code: "KeyQ", charCode: 113, keyCode: nsIDOMKeyEvent.DOM_VK_Q,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "Q", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "Q", code: "KeyQ", charCode: 81, keyCode: nsIDOMKeyEvent.DOM_VK_Q,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "r", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "r", code: "KeyR", charCode: 114, keyCode: nsIDOMKeyEvent.DOM_VK_R,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "R", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "R", code: "KeyR", charCode: 82, keyCode: nsIDOMKeyEvent.DOM_VK_R,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "s", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "s", code: "KeyS", charCode: 115, keyCode: nsIDOMKeyEvent.DOM_VK_S,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "S", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "S", code: "KeyS", charCode: 83, keyCode: nsIDOMKeyEvent.DOM_VK_S,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "t", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "t", code: "KeyT", charCode: 116, keyCode: nsIDOMKeyEvent.DOM_VK_T,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "T", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "T", code: "KeyT", charCode: 84, keyCode: nsIDOMKeyEvent.DOM_VK_T,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "u", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "u", code: "KeyU", charCode: 117, keyCode: nsIDOMKeyEvent.DOM_VK_U,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "U", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "U", code: "KeyU", charCode: 85, keyCode: nsIDOMKeyEvent.DOM_VK_U,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "v", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "v", code: "KeyV", charCode: 118, keyCode: nsIDOMKeyEvent.DOM_VK_V,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "V", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "V", code: "KeyV", charCode: 86, keyCode: nsIDOMKeyEvent.DOM_VK_V,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "w", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "w", code: "KeyW", charCode: 119, keyCode: nsIDOMKeyEvent.DOM_VK_W,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "W", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "W", code: "KeyW", charCode: 87, keyCode: nsIDOMKeyEvent.DOM_VK_W,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "x", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "x", code: "KeyX", charCode: 120, keyCode: nsIDOMKeyEvent.DOM_VK_X,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "X", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "X", code: "KeyX", charCode: 88, keyCode: nsIDOMKeyEvent.DOM_VK_X,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "y", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "y", code: "KeyY", charCode: 121, keyCode: nsIDOMKeyEvent.DOM_VK_Y,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "Y", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "Y", code: "KeyY", charCode: 89, keyCode: nsIDOMKeyEvent.DOM_VK_Y,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "z", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "z", code: "KeyZ", charCode: 122, keyCode: nsIDOMKeyEvent.DOM_VK_Z,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "Z", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "Z", code: "KeyZ", charCode: 90, keyCode: nsIDOMKeyEvent.DOM_VK_Z,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "0", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "0", code: "Digit0", charCode: 48, keyCode: nsIDOMKeyEvent.DOM_VK_0,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "1", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "1", code: "Digit1", charCode: 49, keyCode: nsIDOMKeyEvent.DOM_VK_1,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "2", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "2", code: "Digit2", charCode: 50, keyCode: nsIDOMKeyEvent.DOM_VK_2,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "3", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "3", code: "Digit3", charCode: 51, keyCode: nsIDOMKeyEvent.DOM_VK_3,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "4", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "4", code: "Digit4", charCode: 52, keyCode: nsIDOMKeyEvent.DOM_VK_4,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "5", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "5", code: "Digit5", charCode: 53, keyCode: nsIDOMKeyEvent.DOM_VK_5,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "6", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "6", code: "Digit6", charCode: 54, keyCode: nsIDOMKeyEvent.DOM_VK_6,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "7", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "7", code: "Digit7", charCode: 55, keyCode: nsIDOMKeyEvent.DOM_VK_7,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "8", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "8", code: "Digit8", charCode: 56, keyCode: nsIDOMKeyEvent.DOM_VK_8,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "9", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "9", code: "Digit9", charCode: 57, keyCode: nsIDOMKeyEvent.DOM_VK_9,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: ")", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: ")", code: "Digit0", charCode: 41, keyCode: nsIDOMKeyEvent.DOM_VK_0,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "!", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "!", code: "Digit1", charCode: 33, keyCode: nsIDOMKeyEvent.DOM_VK_1,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "@", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "@", code: "Digit2", charCode: 64, keyCode: nsIDOMKeyEvent.DOM_VK_2,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "#", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "#", code: "Digit3", charCode: 35, keyCode: nsIDOMKeyEvent.DOM_VK_3,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "$", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "$", code: "Digit4", charCode: 36, keyCode: nsIDOMKeyEvent.DOM_VK_4,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "%", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "%", code: "Digit5", charCode: 37, keyCode: nsIDOMKeyEvent.DOM_VK_5,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "^", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "^", code: "Digit6", charCode: 94, keyCode: nsIDOMKeyEvent.DOM_VK_6,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "&", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "&", code: "Digit7", charCode: 38, keyCode: nsIDOMKeyEvent.DOM_VK_7,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "*", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "*", code: "Digit8", charCode: 42, keyCode: nsIDOMKeyEvent.DOM_VK_8,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "(", modifiers: { shiftKey: true }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "(", code: "Digit9", charCode: 40, keyCode: nsIDOMKeyEvent.DOM_VK_9,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: true,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_F1", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "F1", code: "F1", charCode: 112, keyCode: nsIDOMKeyEvent.DOM_VK_F1,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_F2", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "F2", code: "F2", charCode: 113, keyCode: nsIDOMKeyEvent.DOM_VK_F2,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_F3", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "F3", code: "F3", charCode: 114, keyCode: nsIDOMKeyEvent.DOM_VK_F3,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_F4", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "F4", code: "F4", charCode: 115, keyCode: nsIDOMKeyEvent.DOM_VK_F4,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_F5", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "F5", code: "F5", charCode: 116, keyCode: nsIDOMKeyEvent.DOM_VK_F5,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_F7", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "F7", code: "F7", charCode: 118, keyCode: nsIDOMKeyEvent.DOM_VK_F7,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_F8", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "F8", code: "F8", charCode: 119, keyCode: nsIDOMKeyEvent.DOM_VK_F8,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_F9", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "F9", code: "F9", charCode: 120, keyCode: nsIDOMKeyEvent.DOM_VK_F9,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_F10", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "F10", code: "F10", charCode: 121, keyCode: nsIDOMKeyEvent.DOM_VK_F10,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_F11", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "F11", code: "F11", charCode: 122, keyCode: nsIDOMKeyEvent.DOM_VK_F11,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+  { key: "KEY_F12", modifiers: {}, expectedKeyEvent: SHOULD_DELIVER_ALL,
+    result: { key: "F12", code: "F12", charCode: 123, keyCode: nsIDOMKeyEvent.DOM_VK_F12,
+              location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+              ctrlKey: false, altGraphKey: false }
+  },
+];
+
+async function testKeyEvent(aTab, aTestCase) {
+  // Prepare all expected key events.
+  let testEvents = [];
+
+  if (aTestCase.expectedKeyEvent & SHOULD_DELIVER_KEYDOWN) {
+    testEvents.push("keydown");
+  }
+
+  if (aTestCase.expectedKeyEvent & SHOULD_DELIVER_KEYPRESS) {
+    testEvents.push("keypress");
+  }
+
+  if (aTestCase.expectedKeyEvent & SHOULD_DELIVER_KEYUP) {
+    testEvents.push("keyup");
+  }
+
+  let allKeyEventPromises = [];
+
+  for (let testEvent of testEvents) {
+    let keyEventPromise = ContentTask.spawn(aTab.linkedBrowser, {testEvent, result: aTestCase.result}, async (aInput) => {
+      function verifyKeyboardEvent(aEvent, aResult) {
+        is(aEvent.key, aResult.key, "KeyboardEvent.key is correctly spoofed.");
+        is(aEvent.code, aResult.code, "KeyboardEvent.code is correctly spoofed.");
+        is(aEvent.location, aResult.location, "KeyboardEvent.location is correctly spoofed.");
+        is(aEvent.altKey, aResult.altKey, "KeyboardEvent.altKey is correctly spoofed.");
+        is(aEvent.shiftKey, aResult.shiftKey, "KeyboardEvent.shiftKey is correctly spoofed.");
+        is(aEvent.ctrlKey, aResult.ctrlKey, "KeyboardEvent.ctrlKey is correctly spoofed.");
+
+        // If the charCode is not 0, this is a character. The keyCode will be remained as 0.
+        // Otherwise, we should check the keyCode.
+        if (aEvent.charCode != 0) {
+          is(aEvent.keyCode, 0, "KeyboardEvent.keyCode should be 0 for this case.");
+          is(aEvent.charCode, aResult.charCode, "KeyboardEvent.charCode is correctly spoofed.");
+        } else {
+          is(aEvent.keyCode, aResult.keyCode, "KeyboardEvent.keyCode is correctly spoofed.");
+          is(aEvent.charCode, 0, "KeyboardEvent.charCode should be 0 for this case.");
+        }
+
+        // Check getModifierState().
+        is(aEvent.modifierState.Alt, aResult.altKey,
+            "KeyboardEvent.getModifierState() reports a correctly spoofed value for 'Alt'.");
+        is(aEvent.modifierState.AltGraph, aResult.altGraphKey,
+            "KeyboardEvent.getModifierState() reports a correctly spoofed value for 'AltGraph'.");
+        is(aEvent.modifierState.Shift, aResult.shiftKey,
+            `KeyboardEvent.getModifierState() reports a correctly spoofed value for 'Shift'.`);
+        is(aEvent.modifierState.Control, aResult.ctrlKey,
+            `KeyboardEvent.getModifierState() reports a correctly spoofed value for 'Control'.`);
+      }
+
+      let {testEvent: eventType, result} = aInput;
+      let inputBox = content.document.getElementById("test");
+
+      // We need to put the real access of event object into the content page instead of
+      // here, ContentTask.spawn, since the script running here is under chrome privilege.
+      // So the fingerprinting resistance won't work here.
+      let resElement = content.document.getElementById("result-" + eventType);
+
+      // First, try to focus on the input box.
+      await new Promise(resolve => {
+        if (content.document.activeElement == inputBox) {
+          // the input box already got focused.
+          resolve();
+        } else {
+          inputBox.onfocus = () => {
+            resolve();
+          };
+          inputBox.focus();
+        }
+      });
+
+      // Once the result of the keyboard event ready, the content page will send
+      // a custom event 'resultAvailable' for informing the script to check the
+      // result.
+      await new Promise(resolve => {
+        function eventHandler(aEvent) {
+          verifyKeyboardEvent(JSON.parse(resElement.value), result);
+          resElement.removeEventListener("resultAvailable", eventHandler, true);
+          resolve();
+        }
+
+        resElement.addEventListener("resultAvailable", eventHandler, true);
+      });
+    });
+
+    allKeyEventPromises.push(keyEventPromise);
+  }
+
+  // Send key event to the tab.
+  BrowserTestUtils.synthesizeKey(aTestCase.key, aTestCase.modifiers, aTab.linkedBrowser);
+
+  await Promise.all(allKeyEventPromises);
+}
+
+function eventConsumer(aEvent) {
+  aEvent.preventDefault();
+}
+
+add_task(async function setup() {
+  await SpecialPowers.pushPrefEnv({"set":
+    [["privacy.resistFingerprinting", true]]
+  });
+});
+
+add_task(async function runTestsForEnglishContent() {
+  let tab = await BrowserTestUtils.openNewForegroundTab(
+    gBrowser, TEST_PATH + "file_keyBoardEvent.sjs?language=en-US");
+
+  // Prevent shortcut keys.
+  gBrowser.addEventListener("keypress", eventConsumer, true);
+
+  for (let test of TEST_CASES_EN) {
+    await testKeyEvent(tab, test);
+  }
+
+  // Test a key which doesn't exist in US English keyboard layout.
+  await testKeyEvent(tab,
+    {
+      key: "\u00DF", modifiers: { code: "Minus", keyCode: 63 }, expectedKeyEvent: SHOULD_DELIVER_ALL,
+      result: { key: "\u00DF", code: "", charCode: 223, keyCode: 0,
+                location: KeyboardEvent.DOM_KEY_LOCATION_STANDARD, altKey: false, shiftKey: false,
+                ctrlKey: false, altGraphKey: false }
+    }
+  );
+
+  gBrowser.removeEventListener("keypress", eventConsumer, true);
+
+  await BrowserTestUtils.removeTab(tab);
+});
+
+add_task(async function runTestForSuppressModifierKeys() {
+  let tab = await BrowserTestUtils.openNewForegroundTab(
+    gBrowser, TEST_PATH + "file_keyBoardEvent.sjs?language=en-US");
+
+  // Prevent Alt key to trigger the menu item.
+  gBrowser.addEventListener("keydown", eventConsumer, true);
+
+  for (let eventType of ["keydown", "keyup"]) {
+    for (let modifierKey of ["Alt", "Shift", "Control"]) {
+      let testPromise = ContentTask.spawn(tab.linkedBrowser, eventType, async (aEventType) => {
+        let inputBox = content.document.getElementById("test");
+
+        // First, try to focus on the input box.
+        await new Promise(resolve => {
+          if (content.document.activeElement == inputBox) {
+            // the input box already got focused.
+            resolve();
+          } else {
+            inputBox.onfocus = () => {
+              resolve();
+            };
+            inputBox.focus();
+          }
+        });
+
+        let event = await new Promise(resolve => {
+          inputBox.addEventListener(aEventType, (aEvent) => {
+            resolve(aEvent);
+          }, {once: true});
+        });
+
+        is(event.key, "x", "'x' should be seen and the modifier key should be suppressed");
+      });
+
+      let modifierState;
+
+      if (modifierKey === "Alt") {
+        modifierState = {altKey: true};
+      } else if (modifierKey === "Shift") {
+        modifierState = {shiftKey: true};
+      } else {
+        modifierState = {ctrlKey: true};
+      }
+
+      // Generate a Alt or Shift key event.
+      BrowserTestUtils.synthesizeKey(`KEY_${modifierKey}`, modifierState, tab.linkedBrowser);
+
+      // Generate a dummy "x" key event that will only be handled if
+      // modifier key is successfully suppressed.
+      BrowserTestUtils.synthesizeKey("x", {}, tab.linkedBrowser);
+
+      await testPromise;
+    }
+  }
+
+  gBrowser.removeEventListener("keydown", eventConsumer, true);
+
+  await BrowserTestUtils.removeTab(tab);
+});
+
new file mode 100644
--- /dev/null
+++ b/browser/components/resistfingerprinting/test/browser/file_keyBoardEvent.sjs
@@ -0,0 +1,64 @@
+"use strict";
+
+Components.utils.importGlobalProperties(["URLSearchParams"]);
+
+const HTML_DATA = `
+  <!DOCTYPE HTML>
+  <html>
+  <head>
+    <meta charset="utf-8">
+    <title>Test for Bug 1222285</title>
+    <script type="application/javascript">
+      function populateKeyEventResult(aEvent) {
+        let result = document.getElementById("result-" + aEvent.type);
+        let data = {
+          key: aEvent.key,
+          code: aEvent.code,
+          location: aEvent.location,
+          altKey: aEvent.altKey,
+          shiftKey: aEvent.shiftKey,
+          ctrlKey: aEvent.ctrlKey,
+          charCode: aEvent.charCode,
+          keyCode: aEvent.keyCode,
+          modifierState: {
+            Alt: aEvent.getModifierState("Alt"),
+            AltGraph: aEvent.getModifierState("AltGraph"),
+            Shift: aEvent.getModifierState("Shift"),
+            Control: aEvent.getModifierState("Control")
+          }
+        };
+
+        result.value = JSON.stringify(data);
+        result.dispatchEvent(new CustomEvent("resultAvailable"));
+      }
+
+      window.onload = () => {
+        for (event of ["keydown", "keypress", "keyup"]) {
+          document.getElementById("test")
+                  .addEventListener(event, populateKeyEventResult);
+        }
+      }
+    </script>
+  </head>
+  <body>
+    <input id="test"/>
+    <input id="result-keydown"/>
+    <input id="result-keypress"/>
+    <input id="result-keyup"/>
+  </body>
+  </html>`;
+
+function handleRequest(request, response) {
+  response.setHeader("Cache-Control", "no-cache", false);
+  response.setHeader("Content-Type", "text/html", false);
+
+  let queryString = new URLSearchParams(request.queryString);
+
+  let language = queryString.get("language");
+
+  if (language) {
+    response.setHeader("Content-Language", language, false);
+  }
+
+  response.write(HTML_DATA);
+}
--- a/browser/components/resistfingerprinting/test/mochitest/mochitest.ini
+++ b/browser/components/resistfingerprinting/test/mochitest/mochitest.ini
@@ -9,13 +9,14 @@ support-files =
 
 [test_animation_api.html]
 [test_device_sensor_event.html]
 [test_geolocation.html]
 scheme = https
 [test_reduce_time_precision.html]
 [test_hide_gamepad_info.html]
 support-files = test_hide_gamepad_info_iframe.html
+[test_keyboard_event.html]
 [test_speech_synthesis.html]
 [test_bug1382499_touch_api.html]
 [test_bug863246_resource_uri.html]
 [test_bug1354633_media_error.html]
 support-files = decode_error.mp4
new file mode 100644
--- /dev/null
+++ b/browser/components/resistfingerprinting/test/mochitest/test_keyboard_event.html
@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=1222285
+-->
+<head>
+  <meta charset="utf-8">
+  <title>Test for Bug 1222285</title>
+  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+  <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
+  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+  <script type="application/javascript">
+
+  /** Test for Bug 1222285 **/
+  SimpleTest.waitForExplicitFinish();
+
+  window.onload = () => {
+    SpecialPowers.pushPrefEnv({"set":
+      [
+        ["privacy.resistFingerprinting", true]
+      ]
+    }, doTestForSystemEventGroup);
+  };
+
+  // This test makes sure that system event group will still get real keyboard event.
+  function doTestForSystemEventGroup() {
+    SpecialPowers.addSystemEventListener(document, "keydown",
+      function eventHandler(aEvent) {
+        SpecialPowers.removeSystemEventListener(document,
+          "keydown", eventHandler, true);
+
+        is(aEvent.code, "Minus", "The system group event should get real code.");
+        is(aEvent.keyCode, 63, "The system group event should get real keyCode.");
+
+        doTestModifiersForSystemEventGroup();
+      }, true);
+
+    // Send key event to the system group.
+    synthesizeKey("\u00DF", {code: "Minus", keyCode: 63});
+  }
+
+  // Test that will system group event still get suppressed modifier keys
+  function doTestModifiersForSystemEventGroup() {
+    SpecialPowers.addSystemEventListener(document, "keydown",
+      function eventHandler(aEvent) {
+        SpecialPowers.removeSystemEventListener(document,
+          "keydown", eventHandler, true);
+        is(aEvent.key, "Alt", "The system group event get the suppressed keyboard event.");
+
+        SimpleTest.finish();
+      }, true);
+
+    // Send key event to the system group.
+    synthesizeKey("KEY_Alt", {altKey: true});
+  }
+
+  </script>
+</head>
+<body>
+</body>
+</html>