2 -- Copyright 2013 The Chromium Authors. All rights reserved.
3 -- Use of this source code is governed by a BSD-style license that can be
4 -- found in the LICENSE file.
7 <polymer-element name="kb-key-codes">
11 // Flag values for ctrl, alt and shift as defined by EventFlags
12 // in "event_constants.h".
21 // Each virtual key event is assigned a unique ID.
22 var nextRequestID = 0;
24 // Keycodes have been deprecated in the KeyEvent specification, but are
25 // nonetheless required to support legacy web content. The Keycodes in the
26 // following table are based on subset of US-EN 101-key keyboard. These
27 // codes are used in the absence of explicit keycodes for kb-key and
28 // kb-keysequence elements. Keyboard layout authors may explicitly set the
29 // keyCode attribute for kb-key or kb-keysequence elements to refer to
30 // indices in this table in order to emulate a physical keyboard with an
31 // alternate layout. Not all keys on a virtual keyboard are required to
32 // have keyCodes. The shiftModifier specifies whether to always include or
33 // exclude the shift modifer when sending key events for this key. If it's
34 // undefined, it will defer to state of the keyboard.
35 // TODO(rsadam): Correctly propagate shutdown keycode. This is currently
36 // ignored due to chromoting (crbug/146609)
38 '\b': {keyCode: 0x08, shiftModifier: false},
39 '\t': {keyCode: 0x09, shiftModifier: false},
40 '\n': {keyCode: 0x0D, shiftModifier: false},
41 'Esc': {keyCode: 0x1B, shiftModifier: false},
42 ' ': {keyCode: 0x20, shiftModifier: false},
43 'Arrow-Left': {keyCode: 0x25, shiftModifier: undefined},
44 'Arrow-Up': {keyCode: 0x26, shiftModifier: undefined},
45 'Arrow-Right': {keyCode: 0x27, shiftModifier: undefined},
46 'Arrow-Down': {keyCode: 0x28, shiftModifier: undefined},
47 '0': {keyCode: 0x30, shiftModifier: false},
48 ')': {keyCode: 0x30, shiftModifier: true},
49 '1': {keyCode: 0x31, shiftModifier: false},
50 '!': {keyCode: 0x31, shiftModifier: true},
51 '2': {keyCode: 0x32, shiftModifier: false},
52 '@': {keyCode: 0x32, shiftModifier: true},
53 '3': {keyCode: 0x33, shiftModifier: false},
54 '#': {keyCode: 0x33, shiftModifier: true},
55 '4': {keyCode: 0x34, shiftModifier: false},
56 '$': {keyCode: 0x34, shiftModifier: true},
57 '5': {keyCode: 0x35, shiftModifier: false},
58 '%': {keyCode: 0x35, shiftModifier: true},
59 '6': {keyCode: 0x36, shiftModifier: false},
60 '^': {keyCode: 0x36, shiftModifier: true},
61 '7': {keyCode: 0x37, shiftModifier: false},
62 '&': {keyCode: 0x37, shiftModifier: true},
63 '8': {keyCode: 0x38, shiftModifier: false},
64 '*': {keyCode: 0x38, shiftModifier: true},
65 '9': {keyCode: 0x39, shiftModifier: false},
66 '(': {keyCode: 0x39, shiftModifier: true},
67 'a': {keyCode: 0x41, shiftModifier: false},
68 'A': {keyCode: 0x41, shiftModifier: true},
69 'b': {keyCode: 0x42, shiftModifier: false},
70 'B': {keyCode: 0x42, shiftModifier: true},
71 'c': {keyCode: 0x43, shiftModifier: false},
72 'C': {keyCode: 0x43, shiftModifier: true},
73 'd': {keyCode: 0x44, shiftModifier: false},
74 'D': {keyCode: 0x44, shiftModifier: true},
75 'e': {keyCode: 0x45, shiftModifier: false},
76 'E': {keyCode: 0x45, shiftModifier: true},
77 'f': {keyCode: 0x46, shiftModifier: false},
78 'F': {keyCode: 0x46, shiftModifier: true},
79 'g': {keyCode: 0x47, shiftModifier: false},
80 'G': {keyCode: 0x47, shiftModifier: true},
81 'h': {keyCode: 0x48, shiftModifier: false},
82 'H': {keyCode: 0x48, shiftModifier: true},
83 'i': {keyCode: 0x49, shiftModifier: false},
84 'I': {keyCode: 0x49, shiftModifier: true},
85 'j': {keyCode: 0x4A, shiftModifier: false},
86 'J': {keyCode: 0x4A, shiftModifier: true},
87 'k': {keyCode: 0x4B, shiftModifier: false},
88 'K': {keyCode: 0x4B, shiftModifier: true},
89 'l': {keyCode: 0x4C, shiftModifier: false},
90 'L': {keyCode: 0x4C, shiftModifier: true},
91 'm': {keyCode: 0x4D, shiftModifier: false},
92 'M': {keyCode: 0x4D, shiftModifier: true},
93 'n': {keyCode: 0x4E, shiftModifier: false},
94 'N': {keyCode: 0x4E, shiftModifier: true},
95 'o': {keyCode: 0x4F, shiftModifier: false},
96 'O': {keyCode: 0x4F, shiftModifier: true},
97 'p': {keyCode: 0x50, shiftModifier: false},
98 'P': {keyCode: 0x50, shiftModifier: true},
99 'q': {keyCode: 0x51, shiftModifier: false},
100 'Q': {keyCode: 0x51, shiftModifier: true},
101 'r': {keyCode: 0x52, shiftModifier: false},
102 'R': {keyCode: 0x52, shiftModifier: true},
103 's': {keyCode: 0x53, shiftModifier: false},
104 'S': {keyCode: 0x53, shiftModifier: true},
105 't': {keyCode: 0x54, shiftModifier: false},
106 'T': {keyCode: 0x54, shiftModifier: true},
107 'u': {keyCode: 0x55, shiftModifier: false},
108 'U': {keyCode: 0x55, shiftModifier: true},
109 'v': {keyCode: 0x56, shiftModifier: false},
110 'V': {keyCode: 0x56, shiftModifier: true},
111 'w': {keyCode: 0x57, shiftModifier: false},
112 'W': {keyCode: 0x57, shiftModifier: true},
113 'x': {keyCode: 0x58, shiftModifier: false},
114 'X': {keyCode: 0x58, shiftModifier: true},
115 'y': {keyCode: 0x59, shiftModifier: false},
116 'Y': {keyCode: 0x59, shiftModifier: true},
117 'z': {keyCode: 0x5A, shiftModifier: false},
118 'Z': {keyCode: 0x5A, shiftModifier: true},
119 'Fullscreen': {keyCode: 0x7A, shiftModifier: false},
120 'Shutdown': {keyCode: 0x98, shiftModifier: false},
121 'Back': {keyCode: 0xA6, shiftModifier: false},
122 'Forward': {keyCode: 0xA7, shiftModifier: false},
123 'Reload': {keyCode: 0xA8, shiftModifier: false},
124 'Mute': {keyCode: 0xAD, shiftModifier: false},
125 'Volume-Down': {keyCode: 0xAE, shiftModifier: false},
126 'Volume-Up': {keyCode: 0xAF, shiftModifier: false},
127 'Change-Window': {keyCode: 0xB6, shiftModifier: false},
128 ';': {keyCode: 0xBA, shiftModifier: false},
129 ':': {keyCode: 0xBA, shiftModifier: true},
130 '=': {keyCode: 0xBB, shiftModifier: false},
131 '+': {keyCode: 0xBB, shiftModifier: true},
132 ',': {keyCode: 0xBC, shiftModifier: false},
133 '<': {keyCode: 0xBC, shiftModifier: true},
134 '-': {keyCode: 0xBD, shiftModifier: false},
135 '_': {keyCode: 0xBD, shiftModifier: true},
136 '.': {keyCode: 0xBE, shiftModifier: false},
137 '>': {keyCode: 0xBE, shiftModifier: true},
138 '/': {keyCode: 0xBF, shiftModifier: false},
139 '?': {keyCode: 0xBF, shiftModifier: true},
140 '`': {keyCode: 0xC0, shiftModifier: false},
141 '~': {keyCode: 0xC0, shiftModifier: true},
142 'Brightness-Down': {keyCode: 0xD8, shiftModifier: false},
143 'Brightness-Up': {keyCode: 0xD9, shiftModifier: false},
144 '[': {keyCode: 0xDB, shiftModifier: false},
145 '{': {keyCode: 0xDB, shiftModifier: true},
146 '\\': {keyCode: 0xDC, shiftModifier: false},
147 '|': {keyCode: 0xDC, shiftModifier: true},
148 ']': {keyCode: 0xDD, shiftModifier: false},
149 '}': {keyCode: 0xDD, shiftModifier: true},
150 '\'': {keyCode: 0xDE, shiftModifier: false},
151 '"': {keyCode: 0xDE, shiftModifier: true},
154 Polymer('kb-key-codes', {
156 * Retrieves the keyCode and status of the shift modifier.
157 * @param {string} id ID of an entry in the code table.
158 * @return {keyCode: numeric, shiftModifier: boolean}
160 GetKeyCodeAndModifiers: function(id) {
161 var entry = keyCodes[id];
164 keyCode: entry.keyCode,
165 shiftModifier: entry.shiftModifier
170 // Special case of accented characters.
178 * Creates a virtual key event for use with the keyboard extension API.
179 * See http://www.w3.org/TR/DOM-Level-3-Events/#events-KeyboardEvent.
180 * @param {Object} detail Attribute of the key being pressed or released.
181 * @param {string} type The type of key event, which may be keydown
183 * @return {?KeyboardEvent} A KeyboardEvent object, or undefined on
186 createVirtualKeyEvent: function(detail, type) {
187 var char = detail.char;
188 var keyCode = detail.keyCode;
189 // The shift modifier is handled specially. Some charactares like '+'
190 // {keyCode: 0xBB, shiftModifier: true}, are available on non-upper
191 // keysets, and so we rely on caching the correct shiftModifier. If
192 // the cached value of the shiftModifier is undefined, we defer to
193 // the shiftModifier in the detail.
194 var shiftModifier = detail.shiftModifier;
195 if (keyCode == undefined) {
196 var state = this.GetKeyCodeAndModifiers(char);
198 keyCode = state.keyCode;
199 shiftModifier = (state.shiftModifier == undefined) ?
200 shiftModifier : state.shiftModifier;
202 // Keycode not defined.
206 var modifiers = Modifier.NONE;
207 modifiers = shiftModifier ? modifiers | Modifier.SHIFT : modifiers;
208 modifiers = detail.controlModifier ?
209 modifiers | Modifier.CONTROL : modifiers;
210 modifiers = detail.altModifier ? modifiers | Modifier.ALT : modifiers;
213 charValue: char.charCodeAt(0),