Unreviewed, rolling out r234489.
[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 windowsKeyCodeForKeyCode(uint16_t keyCode)
488 {
489     static const int windowsKeyCode[] = {
490         /* 0 */ VK_A,
491         /* 1 */ VK_S,
492         /* 2 */ VK_D,
493         /* 3 */ VK_F,
494         /* 4 */ VK_H,
495         /* 5 */ VK_G,
496         /* 6 */ VK_Z,
497         /* 7 */ VK_X,
498         /* 8 */ VK_C,
499         /* 9 */ VK_V,
500         /* 0x0A */ VK_OEM_3, // "Section" - key to the left from 1 (ISO Keyboard Only)
501         /* 0x0B */ VK_B,
502         /* 0x0C */ VK_Q,
503         /* 0x0D */ VK_W,
504         /* 0x0E */ VK_E,
505         /* 0x0F */ VK_R,
506         /* 0x10 */ VK_Y,
507         /* 0x11 */ VK_T,
508         /* 0x12 */ VK_1,
509         /* 0x13 */ VK_2,
510         /* 0x14 */ VK_3,
511         /* 0x15 */ VK_4,
512         /* 0x16 */ VK_6,
513         /* 0x17 */ VK_5,
514         /* 0x18 */ VK_OEM_PLUS, // =+
515         /* 0x19 */ VK_9,
516         /* 0x1A */ VK_7,
517         /* 0x1B */ VK_OEM_MINUS, // -_
518         /* 0x1C */ VK_8,
519         /* 0x1D */ VK_0,
520         /* 0x1E */ VK_OEM_6, // ]}
521         /* 0x1F */ VK_O,
522         /* 0x20 */ VK_U,
523         /* 0x21 */ VK_OEM_4, // {[
524         /* 0x22 */ VK_I,
525         /* 0x23 */ VK_P,
526         /* 0x24 */ VK_RETURN, // Return
527         /* 0x25 */ VK_L,
528         /* 0x26 */ VK_J,
529         /* 0x27 */ VK_OEM_7, // '"
530         /* 0x28 */ VK_K,
531         /* 0x29 */ VK_OEM_1, // ;:
532         /* 0x2A */ VK_OEM_5, // \|
533         /* 0x2B */ VK_OEM_COMMA, // ,<
534         /* 0x2C */ VK_OEM_2, // /?
535         /* 0x2D */ VK_N,
536         /* 0x2E */ VK_M,
537         /* 0x2F */ VK_OEM_PERIOD, // .>
538         /* 0x30 */ VK_TAB,
539         /* 0x31 */ VK_SPACE,
540         /* 0x32 */ VK_OEM_3, // `~
541         /* 0x33 */ VK_BACK, // Backspace
542         /* 0x34 */ 0, // n/a
543         /* 0x35 */ VK_ESCAPE,
544         /* 0x36 */ VK_APPS, // Right Command
545         /* 0x37 */ VK_LWIN, // Left Command
546         /* 0x38 */ VK_LSHIFT, // Left Shift
547         /* 0x39 */ VK_CAPITAL, // Caps Lock
548         /* 0x3A */ VK_LMENU, // Left Option
549         /* 0x3B */ VK_LCONTROL, // Left Ctrl
550         /* 0x3C */ VK_RSHIFT, // Right Shift
551         /* 0x3D */ VK_RMENU, // Right Option
552         /* 0x3E */ VK_RCONTROL, // Right Ctrl
553         /* 0x3F */ 0, // fn
554         /* 0x40 */ VK_F17,
555         /* 0x41 */ VK_DECIMAL, // Num Pad .
556         /* 0x42 */ 0, // n/a
557         /* 0x43 */ VK_MULTIPLY, // Num Pad *
558         /* 0x44 */ 0, // n/a
559         /* 0x45 */ VK_ADD, // Num Pad +
560         /* 0x46 */ 0, // n/a
561         /* 0x47 */ VK_CLEAR, // Num Pad Clear
562         /* 0x48 */ VK_VOLUME_UP,
563         /* 0x49 */ VK_VOLUME_DOWN,
564         /* 0x4A */ VK_VOLUME_MUTE,
565         /* 0x4B */ VK_DIVIDE, // Num Pad /
566         /* 0x4C */ VK_RETURN, // Num Pad Enter
567         /* 0x4D */ 0, // n/a
568         /* 0x4E */ VK_SUBTRACT, // Num Pad -
569         /* 0x4F */ VK_F18,
570         /* 0x50 */ VK_F19,
571         /* 0x51 */ VK_OEM_PLUS, // Num Pad =. There is no such key on common PC keyboards, mapping to normal "+=".
572         /* 0x52 */ VK_NUMPAD0,
573         /* 0x53 */ VK_NUMPAD1,
574         /* 0x54 */ VK_NUMPAD2,
575         /* 0x55 */ VK_NUMPAD3,
576         /* 0x56 */ VK_NUMPAD4,
577         /* 0x57 */ VK_NUMPAD5,
578         /* 0x58 */ VK_NUMPAD6,
579         /* 0x59 */ VK_NUMPAD7,
580         /* 0x5A */ VK_F20,
581         /* 0x5B */ VK_NUMPAD8,
582         /* 0x5C */ VK_NUMPAD9,
583         /* 0x5D */ 0, // Yen (JIS Keyboard Only)
584         /* 0x5E */ 0, // Underscore (JIS Keyboard Only)
585         /* 0x5F */ 0, // KeypadComma (JIS Keyboard Only)
586         /* 0x60 */ VK_F5,
587         /* 0x61 */ VK_F6,
588         /* 0x62 */ VK_F7,
589         /* 0x63 */ VK_F3,
590         /* 0x64 */ VK_F8,
591         /* 0x65 */ VK_F9,
592         /* 0x66 */ 0, // Eisu (JIS Keyboard Only)
593         /* 0x67 */ VK_F11,
594         /* 0x68 */ 0, // Kana (JIS Keyboard Only)
595         /* 0x69 */ VK_F13,
596         /* 0x6A */ VK_F16,
597         /* 0x6B */ VK_F14,
598         /* 0x6C */ 0, // n/a
599         /* 0x6D */ VK_F10,
600         /* 0x6E */ 0, // n/a (Windows95 key?)
601         /* 0x6F */ VK_F12,
602         /* 0x70 */ 0, // n/a
603         /* 0x71 */ VK_F15,
604         /* 0x72 */ VK_INSERT, // Help
605         /* 0x73 */ VK_HOME, // Home
606         /* 0x74 */ VK_PRIOR, // Page Up
607         /* 0x75 */ VK_DELETE, // Forward Delete
608         /* 0x76 */ VK_F4,
609         /* 0x77 */ VK_END, // End
610         /* 0x78 */ VK_F2,
611         /* 0x79 */ VK_NEXT, // Page Down
612         /* 0x7A */ VK_F1,
613         /* 0x7B */ VK_LEFT, // Left Arrow
614         /* 0x7C */ VK_RIGHT, // Right Arrow
615         /* 0x7D */ VK_DOWN, // Down Arrow
616         /* 0x7E */ VK_UP, // Up Arrow
617         /* 0x7F */ 0 // n/a
618     };
619
620     if (keyCode >= 0x80)
621         return 0;
622
623      return windowsKeyCode[keyCode];
624 }
625
626 int windowsKeyCodeForCharCode(unichar charCode)
627 {
628     switch (charCode) {
629 #if PLATFORM(IOS)
630         case 8: case 0x7F: return VK_BACK;
631         case 9: return VK_TAB;
632         case 0xD: case 3: return VK_RETURN;
633         case 0x1B: return VK_ESCAPE;
634         case ' ': return VK_SPACE;
635         case NSHomeFunctionKey: return VK_HOME;
636         case NSEndFunctionKey: return VK_END;
637         case NSPageUpFunctionKey: return VK_PRIOR;
638         case NSPageDownFunctionKey: return VK_NEXT;
639         case NSUpArrowFunctionKey: return VK_UP;
640         case NSDownArrowFunctionKey: return VK_DOWN;
641         case NSLeftArrowFunctionKey: return VK_LEFT;
642         case NSRightArrowFunctionKey: return VK_RIGHT;
643         case NSDeleteFunctionKey: return VK_DELETE;
644
645         case '0': case ')': return VK_0;
646         case '1': case '!': return VK_1;
647         case '2': case '@': return VK_2;
648         case '3': case '#': return VK_3;
649         case '4': case '$': return VK_4;
650         case '5': case '%': return VK_5;
651         case '6': case '^': return VK_6;
652         case '7': case '&': return VK_7;
653         case '8': case '*': return VK_8;
654         case '9': case '(': return VK_9;
655 #endif
656         case 'a': case 'A': return VK_A; 
657         case 'b': case 'B': return VK_B; 
658         case 'c': case 'C': return VK_C; 
659         case 'd': case 'D': return VK_D; 
660         case 'e': case 'E': return VK_E; 
661         case 'f': case 'F': return VK_F; 
662         case 'g': case 'G': return VK_G; 
663         case 'h': case 'H': return VK_H; 
664         case 'i': case 'I': return VK_I; 
665         case 'j': case 'J': return VK_J; 
666         case 'k': case 'K': return VK_K; 
667         case 'l': case 'L': return VK_L; 
668         case 'm': case 'M': return VK_M; 
669         case 'n': case 'N': return VK_N; 
670         case 'o': case 'O': return VK_O; 
671         case 'p': case 'P': return VK_P; 
672         case 'q': case 'Q': return VK_Q; 
673         case 'r': case 'R': return VK_R; 
674         case 's': case 'S': return VK_S; 
675         case 't': case 'T': return VK_T; 
676         case 'u': case 'U': return VK_U; 
677         case 'v': case 'V': return VK_V; 
678         case 'w': case 'W': return VK_W; 
679         case 'x': case 'X': return VK_X; 
680         case 'y': case 'Y': return VK_Y; 
681         case 'z': case 'Z': return VK_Z; 
682
683         // AppKit generates Unicode PUA character codes for some function keys; using these when key code is not known.
684         case NSPauseFunctionKey: return VK_PAUSE;
685         case NSSelectFunctionKey: return VK_SELECT;
686         case NSPrintFunctionKey: return VK_PRINT;
687         case NSExecuteFunctionKey: return VK_EXECUTE;
688         case NSPrintScreenFunctionKey: return VK_SNAPSHOT;
689 #if PLATFORM(IOS)
690         case NSInsertFunctionKey: case NSHelpFunctionKey: return VK_INSERT;
691
692         case NSF1FunctionKey: return VK_F1;
693         case NSF2FunctionKey: return VK_F2;
694         case NSF3FunctionKey: return VK_F3;
695         case NSF4FunctionKey: return VK_F4;
696         case NSF5FunctionKey: return VK_F5;
697         case NSF6FunctionKey: return VK_F6;
698         case NSF7FunctionKey: return VK_F7;
699         case NSF8FunctionKey: return VK_F8;
700         case NSF9FunctionKey: return VK_F9;
701         case NSF10FunctionKey: return VK_F10;
702         case NSF11FunctionKey: return VK_F11;
703         case NSF12FunctionKey: return VK_F12;
704         case NSF13FunctionKey: return VK_F13;
705         case NSF14FunctionKey: return VK_F14;
706         case NSF15FunctionKey: return VK_F15;
707         case NSF16FunctionKey: return VK_F16;
708         case NSF17FunctionKey: return VK_F17;
709         case NSF18FunctionKey: return VK_F18;
710         case NSF19FunctionKey: return VK_F19;
711         case NSF20FunctionKey: return VK_F20;
712 #else
713         case NSInsertFunctionKey: return VK_INSERT;
714 #endif
715         case NSF21FunctionKey: return VK_F21;
716         case NSF22FunctionKey: return VK_F22;
717         case NSF23FunctionKey: return VK_F23;
718         case NSF24FunctionKey: return VK_F24;
719         case NSScrollLockFunctionKey: return VK_SCROLL;
720
721         // This is for U.S. keyboard mapping, and doesn't necessarily make sense for different keyboard layouts.
722         // For example, '"' on Windows Russian layout is VK_2, not VK_OEM_7.
723         case ';': case ':': return VK_OEM_1; 
724         case '=': case '+': return VK_OEM_PLUS; 
725         case ',': case '<': return VK_OEM_COMMA; 
726         case '-': case '_': return VK_OEM_MINUS; 
727         case '.': case '>': return VK_OEM_PERIOD; 
728         case '/': case '?': return VK_OEM_2; 
729         case '`': case '~': return VK_OEM_3; 
730         case '[': case '{': return VK_OEM_4; 
731         case '\\': case '|': return VK_OEM_5; 
732         case ']': case '}': return VK_OEM_6; 
733         case '\'': case '"': return VK_OEM_7; 
734
735     }
736
737     return 0;
738 }
739
740 }