[iOS] Key code is 0 for many hardware keyboard keys
[WebKit-https.git] / Source / WebCore / platform / cocoa / KeyEventCocoa.mm
1 /*
2  * Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "KeyEventCocoa.h"
28
29 #import "Logging.h"
30 #import "WindowsKeyboardCodes.h"
31 #import <wtf/ASCIICType.h>
32 #import <wtf/text/WTFString.h>
33
34 #if PLATFORM(IOS)
35 #import "KeyEventCodesIOS.h"
36 #endif
37
38 using namespace WTF;
39
40 namespace WebCore {
41
42 // https://w3c.github.io/uievents-key/
43 String keyForCharCode(unichar charCode)
44 {
45     switch (charCode) {
46     case NSUpArrowFunctionKey:
47         return "ArrowUp"_s;
48     case NSDownArrowFunctionKey:
49         return "ArrowDown"_s;
50     case NSLeftArrowFunctionKey:
51         return "ArrowLeft"_s;
52     case NSRightArrowFunctionKey:
53         return "ArrowRight"_s;
54     case NSF1FunctionKey:
55         return "F1"_s;
56     case NSF2FunctionKey:
57         return "F2"_s;
58     case NSF3FunctionKey:
59         return "F3"_s;
60     case NSF4FunctionKey:
61         return "F4"_s;
62     case NSF5FunctionKey:
63         return "F5"_s;
64     case NSF6FunctionKey:
65         return "F6"_s;
66     case NSF7FunctionKey:
67         return "F7"_s;
68     case NSF8FunctionKey:
69         return "F8"_s;
70     case NSF9FunctionKey:
71         return "F9"_s;
72     case NSF10FunctionKey:
73         return "F10"_s;
74     case NSF11FunctionKey:
75         return "F11"_s;
76     case NSF12FunctionKey:
77         return "F12"_s;
78     case NSF13FunctionKey:
79         return "F13"_s;
80     case NSF14FunctionKey:
81         return "F14"_s;
82     case NSF15FunctionKey:
83         return "F15"_s;
84     case NSF16FunctionKey:
85         return "F16"_s;
86     case NSF17FunctionKey:
87         return "F17"_s;
88     case NSF18FunctionKey:
89         return "F18"_s;
90     case NSF19FunctionKey:
91         return "F19"_s;
92     case NSF20FunctionKey:
93         return "F20"_s;
94     case NSF21FunctionKey:
95         return "F21"_s;
96     case NSF22FunctionKey:
97         return "F22"_s;
98     case NSF23FunctionKey:
99         return "F23"_s;
100     case NSF24FunctionKey:
101         return "F24"_s;
102     case NSF25FunctionKey:
103         return "F25"_s;
104     case NSF26FunctionKey:
105         return "F26"_s;
106     case NSF27FunctionKey:
107         return "F27"_s;
108     case NSF28FunctionKey:
109         return "F28"_s;
110     case NSF29FunctionKey:
111         return "F29"_s;
112     case NSF30FunctionKey:
113         return "F30"_s;
114     case NSF31FunctionKey:
115         return "F31"_s;
116     case NSF32FunctionKey:
117         return "F32"_s;
118     case NSF33FunctionKey:
119         return "F33"_s;
120     case NSF34FunctionKey:
121         return "F34"_s;
122     case NSF35FunctionKey:
123         return "F35"_s;
124     case NSInsertFunctionKey:
125         return "Insert"_s;
126     case NSDeleteFunctionKey:
127         return "Delete"_s;
128     case NSHomeFunctionKey:
129         return "Home"_s;
130     case NSEndFunctionKey:
131         return "End"_s;
132     case NSPageUpFunctionKey:
133         return "PageUp"_s;
134     case NSPageDownFunctionKey:
135         return "PageDown"_s;
136     case NSPrintScreenFunctionKey:
137         return "PrintScreen"_s;
138     case NSScrollLockFunctionKey:
139         return "ScrollLock"_s;
140     case NSPauseFunctionKey:
141         return "Pause"_s;
142     case NSMenuFunctionKey:
143         return "ContextMenu"_s;
144     case NSPrintFunctionKey:
145         return "Print"_s;
146     case NSClearLineFunctionKey:
147         return "Clear"_s;
148     case NSSelectFunctionKey:
149         return "Select"_s;
150     case NSExecuteFunctionKey:
151         return "Execute"_s;
152     case NSUndoFunctionKey:
153         return "Undo"_s;
154     case NSRedoFunctionKey:
155         return "Redo"_s;
156     case NSFindFunctionKey:
157         return "Find"_s;
158     case NSHelpFunctionKey:
159         return "Help"_s;
160     case NSModeSwitchFunctionKey:
161         return "ModeChange"_s;
162     case NSEnterCharacter:
163     case NSNewlineCharacter:
164     case NSCarriageReturnCharacter:
165         return "Enter"_s;
166     case NSDeleteCharacter:
167     case NSBackspaceCharacter:
168         return "Backspace"_s;
169     case NSBackTabCharacter:
170     case NSTabCharacter:
171         return "Tab"_s;
172     case 0x1B:
173         return "Escape"_s;
174     case NSFormFeedCharacter:
175     case NSParagraphSeparatorCharacter:
176     case NSLineSeparatorCharacter:
177     case NSBeginFunctionKey:
178     case NSSysReqFunctionKey:
179     case NSBreakFunctionKey:
180     case NSResetFunctionKey:
181     case NSStopFunctionKey:
182     case NSUserFunctionKey:
183     case NSSystemFunctionKey:
184     case NSClearDisplayFunctionKey:
185     case NSInsertLineFunctionKey:
186     case NSDeleteLineFunctionKey:
187     case NSInsertCharFunctionKey:
188     case NSDeleteCharFunctionKey:
189     case NSPrevFunctionKey:
190     case NSNextFunctionKey:
191         return "Unidentified"_s;
192     default:
193         return String(&charCode, 1);
194     }
195 }
196
197 String keyIdentifierForCharCode(unichar charCode)
198 {
199     switch (charCode) {
200         // Each identifier listed in the DOM spec is listed here.
201         // Many are simply commented out since they do not appear on standard Macintosh keyboards
202         // or are on a key that doesn't have a corresponding character.
203
204         // "Accept"
205         // "AllCandidates"
206
207         // "Alt"
208         case NSMenuFunctionKey:
209             return "Alt";
210
211         // "Apps"
212         // "BrowserBack"
213         // "BrowserForward"
214         // "BrowserHome"
215         // "BrowserRefresh"
216         // "BrowserSearch"
217         // "BrowserStop"
218         // "CapsLock"
219
220         // "Clear"
221         case NSClearLineFunctionKey:
222             return "Clear";
223
224         // "CodeInput"
225         // "Compose"
226         // "Control"
227         // "Crsel"
228         // "Convert"
229         // "Copy"
230         // "Cut"
231
232         // "Down"
233         case NSDownArrowFunctionKey:
234             return "Down";
235         // "End"
236         case NSEndFunctionKey:
237             return "End";
238         // "Enter"
239         case 0x3: case 0xA: case 0xD: // Macintosh calls the one on the main keyboard Return, but Windows calls it Enter, so we'll do the same for the DOM
240             return "Enter";
241
242         // "EraseEof"
243
244         // "Execute"
245         case NSExecuteFunctionKey:
246             return "Execute";
247
248         // "Exsel"
249
250         // "F1"
251         case NSF1FunctionKey:
252             return "F1";
253         // "F2"
254         case NSF2FunctionKey:
255             return "F2";
256         // "F3"
257         case NSF3FunctionKey:
258             return "F3";
259         // "F4"
260         case NSF4FunctionKey:
261             return "F4";
262         // "F5"
263         case NSF5FunctionKey:
264             return "F5";
265         // "F6"
266         case NSF6FunctionKey:
267             return "F6";
268         // "F7"
269         case NSF7FunctionKey:
270             return "F7";
271         // "F8"
272         case NSF8FunctionKey:
273             return "F8";
274         // "F9"
275         case NSF9FunctionKey:
276             return "F9";
277         // "F10"
278         case NSF10FunctionKey:
279             return "F10";
280         // "F11"
281         case NSF11FunctionKey:
282             return "F11";
283         // "F12"
284         case NSF12FunctionKey:
285             return "F12";
286         // "F13"
287         case NSF13FunctionKey:
288             return "F13";
289         // "F14"
290         case NSF14FunctionKey:
291             return "F14";
292         // "F15"
293         case NSF15FunctionKey:
294             return "F15";
295         // "F16"
296         case NSF16FunctionKey:
297             return "F16";
298         // "F17"
299         case NSF17FunctionKey:
300             return "F17";
301         // "F18"
302         case NSF18FunctionKey:
303             return "F18";
304         // "F19"
305         case NSF19FunctionKey:
306             return "F19";
307         // "F20"
308         case NSF20FunctionKey:
309             return "F20";
310         // "F21"
311         case NSF21FunctionKey:
312             return "F21";
313         // "F22"
314         case NSF22FunctionKey:
315             return "F22";
316         // "F23"
317         case NSF23FunctionKey:
318             return "F23";
319         // "F24"
320         case NSF24FunctionKey:
321             return "F24";
322
323         // "FinalMode"
324
325         // "Find"
326         case NSFindFunctionKey:
327             return "Find";
328
329         // "FullWidth"
330         // "HalfWidth"
331         // "HangulMode"
332         // "HanjaMode"
333
334         // "Help"
335         case NSHelpFunctionKey:
336             return "Help";
337
338         // "Hiragana"
339
340         // "Home"
341         case NSHomeFunctionKey:
342             return "Home";
343         // "Insert"
344         case NSInsertFunctionKey:
345             return "Insert";
346
347         // "JapaneseHiragana"
348         // "JapaneseKatakana"
349         // "JapaneseRomaji"
350         // "JunjaMode"
351         // "KanaMode"
352         // "KanjiMode"
353         // "Katakana"
354         // "LaunchApplication1"
355         // "LaunchApplication2"
356         // "LaunchMail"
357
358         // "Left"
359         case NSLeftArrowFunctionKey:
360             return "Left";
361
362         // "Meta"
363         // "MediaNextTrack"
364         // "MediaPlayPause"
365         // "MediaPreviousTrack"
366         // "MediaStop"
367
368         // "ModeChange"
369         case NSModeSwitchFunctionKey:
370             return "ModeChange";
371
372         // "Nonconvert"
373         // "NumLock"
374
375         // "PageDown"
376         case NSPageDownFunctionKey:
377             return "PageDown";
378         // "PageUp"
379         case NSPageUpFunctionKey:
380             return "PageUp";
381
382         // "Paste"
383
384         // "Pause"
385         case NSPauseFunctionKey:
386             return "Pause";
387
388         // "Play"
389         // "PreviousCandidate"
390
391         // "PrintScreen"
392         case NSPrintScreenFunctionKey:
393             return "PrintScreen";
394
395         // "Process"
396         // "Props"
397
398         // "Right"
399         case NSRightArrowFunctionKey:
400             return "Right";
401
402         // "RomanCharacters"
403
404         // "Scroll"
405         case NSScrollLockFunctionKey:
406             return "Scroll";
407         // "Select"
408         case NSSelectFunctionKey:
409             return "Select";
410
411         // "SelectMedia"
412         // "Shift"
413
414         // "Stop"
415         case NSStopFunctionKey:
416             return "Stop";
417         // "Up"
418         case NSUpArrowFunctionKey:
419             return "Up";
420         // "Undo"
421         case NSUndoFunctionKey:
422             return "Undo";
423
424         // "VolumeDown"
425         // "VolumeMute"
426         // "VolumeUp"
427         // "Win"
428         // "Zoom"
429
430         // More function keys, not in the key identifier specification.
431         case NSF25FunctionKey:
432             return "F25";
433         case NSF26FunctionKey:
434             return "F26";
435         case NSF27FunctionKey:
436             return "F27";
437         case NSF28FunctionKey:
438             return "F28";
439         case NSF29FunctionKey:
440             return "F29";
441         case NSF30FunctionKey:
442             return "F30";
443         case NSF31FunctionKey:
444             return "F31";
445         case NSF32FunctionKey:
446             return "F32";
447         case NSF33FunctionKey:
448             return "F33";
449         case NSF34FunctionKey:
450             return "F34";
451         case NSF35FunctionKey:
452             return "F35";
453
454         // Turn 0x7F into 0x08, because backspace needs to always be 0x08.
455         case 0x7F:
456             return "U+0008";
457         // Standard says that DEL becomes U+007F.
458         case NSDeleteFunctionKey:
459             return "U+007F";
460
461         // Always use 0x09 for tab instead of AppKit's backtab character.
462         case NSBackTabCharacter:
463             return "U+0009";
464
465         case NSBeginFunctionKey:
466         case NSBreakFunctionKey:
467         case NSClearDisplayFunctionKey:
468         case NSDeleteCharFunctionKey:
469         case NSDeleteLineFunctionKey:
470         case NSInsertCharFunctionKey:
471         case NSInsertLineFunctionKey:
472         case NSNextFunctionKey:
473         case NSPrevFunctionKey:
474         case NSPrintFunctionKey:
475         case NSRedoFunctionKey:
476         case NSResetFunctionKey:
477         case NSSysReqFunctionKey:
478         case NSSystemFunctionKey:
479         case NSUserFunctionKey:
480             // FIXME: We should use something other than the vendor-area Unicode values for the above keys.
481             // For now, just fall through to the default.
482         default:
483             return String::format("U+%04X", toASCIIUpper(charCode));
484     }
485 }
486
487 int windowsKeyCodeForCharCode(unichar charCode)
488 {
489     switch (charCode) {
490 #if PLATFORM(IOS)
491         case 8: case 0x7F: return VK_BACK;
492         case 9: return VK_TAB;
493         case 0xD: case 3: return VK_RETURN;
494         case 0x1B: return VK_ESCAPE;
495         case ' ': return VK_SPACE;
496         case NSHomeFunctionKey: return VK_HOME;
497         case NSEndFunctionKey: return VK_END;
498         case NSPageUpFunctionKey: return VK_PRIOR;
499         case NSPageDownFunctionKey: return VK_NEXT;
500         case NSUpArrowFunctionKey: return VK_UP;
501         case NSDownArrowFunctionKey: return VK_DOWN;
502         case NSLeftArrowFunctionKey: return VK_LEFT;
503         case NSRightArrowFunctionKey: return VK_RIGHT;
504         case NSDeleteFunctionKey: return VK_DELETE;
505
506         case '0': case ')': return VK_0;
507         case '1': case '!': return VK_1;
508         case '2': case '@': return VK_2;
509         case '3': case '#': return VK_3;
510         case '4': case '$': return VK_4;
511         case '5': case '%': return VK_5;
512         case '6': case '^': return VK_6;
513         case '7': case '&': return VK_7;
514         case '8': case '*': return VK_8;
515         case '9': case '(': return VK_9;
516 #endif
517         case 'a': case 'A': return VK_A; 
518         case 'b': case 'B': return VK_B; 
519         case 'c': case 'C': return VK_C; 
520         case 'd': case 'D': return VK_D; 
521         case 'e': case 'E': return VK_E; 
522         case 'f': case 'F': return VK_F; 
523         case 'g': case 'G': return VK_G; 
524         case 'h': case 'H': return VK_H; 
525         case 'i': case 'I': return VK_I; 
526         case 'j': case 'J': return VK_J; 
527         case 'k': case 'K': return VK_K; 
528         case 'l': case 'L': return VK_L; 
529         case 'm': case 'M': return VK_M; 
530         case 'n': case 'N': return VK_N; 
531         case 'o': case 'O': return VK_O; 
532         case 'p': case 'P': return VK_P; 
533         case 'q': case 'Q': return VK_Q; 
534         case 'r': case 'R': return VK_R; 
535         case 's': case 'S': return VK_S; 
536         case 't': case 'T': return VK_T; 
537         case 'u': case 'U': return VK_U; 
538         case 'v': case 'V': return VK_V; 
539         case 'w': case 'W': return VK_W; 
540         case 'x': case 'X': return VK_X; 
541         case 'y': case 'Y': return VK_Y; 
542         case 'z': case 'Z': return VK_Z; 
543
544         // AppKit generates Unicode PUA character codes for some function keys; using these when key code is not known.
545         case NSPauseFunctionKey: return VK_PAUSE;
546         case NSSelectFunctionKey: return VK_SELECT;
547         case NSPrintFunctionKey: return VK_PRINT;
548         case NSExecuteFunctionKey: return VK_EXECUTE;
549         case NSPrintScreenFunctionKey: return VK_SNAPSHOT;
550 #if PLATFORM(IOS)
551         case NSInsertFunctionKey: case NSHelpFunctionKey: return VK_INSERT;
552
553         case NSF1FunctionKey: return VK_F1;
554         case NSF2FunctionKey: return VK_F2;
555         case NSF3FunctionKey: return VK_F3;
556         case NSF4FunctionKey: return VK_F4;
557         case NSF5FunctionKey: return VK_F5;
558         case NSF6FunctionKey: return VK_F6;
559         case NSF7FunctionKey: return VK_F7;
560         case NSF8FunctionKey: return VK_F8;
561         case NSF9FunctionKey: return VK_F9;
562         case NSF10FunctionKey: return VK_F10;
563         case NSF11FunctionKey: return VK_F11;
564         case NSF12FunctionKey: return VK_F12;
565         case NSF13FunctionKey: return VK_F13;
566         case NSF14FunctionKey: return VK_F14;
567         case NSF15FunctionKey: return VK_F15;
568         case NSF16FunctionKey: return VK_F16;
569         case NSF17FunctionKey: return VK_F17;
570         case NSF18FunctionKey: return VK_F18;
571         case NSF19FunctionKey: return VK_F19;
572         case NSF20FunctionKey: return VK_F20;
573 #else
574         case NSInsertFunctionKey: return VK_INSERT;
575 #endif
576         case NSF21FunctionKey: return VK_F21;
577         case NSF22FunctionKey: return VK_F22;
578         case NSF23FunctionKey: return VK_F23;
579         case NSF24FunctionKey: return VK_F24;
580         case NSScrollLockFunctionKey: return VK_SCROLL;
581
582         // This is for U.S. keyboard mapping, and doesn't necessarily make sense for different keyboard layouts.
583         // For example, '"' on Windows Russian layout is VK_2, not VK_OEM_7.
584         case ';': case ':': return VK_OEM_1; 
585         case '=': case '+': return VK_OEM_PLUS; 
586         case ',': case '<': return VK_OEM_COMMA; 
587         case '-': case '_': return VK_OEM_MINUS; 
588         case '.': case '>': return VK_OEM_PERIOD; 
589         case '/': case '?': return VK_OEM_2; 
590         case '`': case '~': return VK_OEM_3; 
591         case '[': case '{': return VK_OEM_4; 
592         case '\\': case '|': return VK_OEM_5; 
593         case ']': case '}': return VK_OEM_6; 
594         case '\'': case '"': return VK_OEM_7; 
595
596     }
597
598     return 0;
599 }
600
601 }