- add sources.
[platform/framework/web/crosswalk.git] / src / ui / keyboard / resources / elements / kb-key-codes.html
1 <!--
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.
5   -->
6
7 <polymer-element name="kb-key-codes">
8 <script>
9   (function() {
10
11     // Flag values for ctrl, alt and shift as defined by EventFlags
12     // in "event_constants.h".
13     // @enum {number}
14     var Modifier = {
15       NONE: 0,
16       ALT: 8,
17       CONTROL: 4,
18       SHIFT: 2
19     }
20
21     // Each virtual key event is assigned a unique ID.
22     var nextRequestID = 0;
23
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)
37     var keyCodes = {
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},
152     };
153
154     Polymer('kb-key-codes', {
155       /**
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}
159        */
160       GetKeyCodeAndModifiers: function(id) {
161         var entry = keyCodes[id];
162         if (entry) {
163           return {
164             keyCode: entry.keyCode,
165             shiftModifier: entry.shiftModifier
166           };
167         }
168         if (id.length != 1)
169           return;
170         // Special case of accented characters.
171         return {
172           keyCode: 0,
173           shiftModifier: false
174         };
175       },
176
177      /**
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
182       *     or keyup.
183       * @return {?KeyboardEvent} A KeyboardEvent object, or undefined on
184       *     failure.
185       */
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);
197          if (state) {
198            keyCode = state.keyCode;
199            shiftModifier = (state.shiftModifier == undefined) ?
200                shiftModifier : state.shiftModifier;
201          } else {
202            // Keycode not defined.
203            return;
204          }
205        }
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;
211        return {
212          type: type,
213          charValue: char.charCodeAt(0),
214          keyCode: keyCode,
215          modifiers: modifiers
216        };
217      },
218     });
219   })();
220 </script>
221 </polymer-element>