1# Licensed to the Software Freedom Conservancy (SFC) under one
2# or more contributor license agreements.  See the NOTICE file
3# distributed with this work for additional information
4# regarding copyright ownership.  The SFC licenses this file
5# to you under the Apache License, Version 2.0 (the
6# "License"); you may not use this file except in compliance
7# with the License.  You may obtain a copy of the License at
8#
9#   http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing,
12# software distributed under the License is distributed on an
13# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14# KIND, either express or implied.  See the License for the
15# specific language governing permissions and limitations
16# under the License.
17
18"""The Keys implementation."""
19
20import sys
21
22from collections import OrderedDict
23from inspect import getmembers
24
25class Keys(object):
26    """
27    Set of special keys codes.
28
29    See also https://w3c.github.io/webdriver/#keyboard-actions
30    """
31
32    NULL = u"\ue000"
33    CANCEL = u"\ue001"  # ^break
34    HELP = u"\ue002"
35    BACKSPACE = u"\ue003"
36    TAB = u"\ue004"
37    CLEAR = u"\ue005"
38    RETURN = u"\ue006"
39    ENTER = u"\ue007"
40    SHIFT = u"\ue008"
41    CONTROL = u"\ue009"
42    ALT = u"\ue00a"
43    PAUSE = u"\ue00b"
44    ESCAPE = u"\ue00c"
45    SPACE = u"\ue00d"
46    PAGE_UP = u"\ue00e"
47    PAGE_DOWN = u"\ue00f"
48    END = u"\ue010"
49    HOME = u"\ue011"
50    LEFT = u"\ue012"
51    UP = u"\ue013"
52    RIGHT = u"\ue014"
53    DOWN = u"\ue015"
54    INSERT = u"\ue016"
55    DELETE = u"\ue017"
56    SEMICOLON = u"\ue018"
57    EQUALS = u"\ue019"
58
59    NUMPAD0 = u"\ue01a"  # number pad keys
60    NUMPAD1 = u"\ue01b"
61    NUMPAD2 = u"\ue01c"
62    NUMPAD3 = u"\ue01d"
63    NUMPAD4 = u"\ue01e"
64    NUMPAD5 = u"\ue01f"
65    NUMPAD6 = u"\ue020"
66    NUMPAD7 = u"\ue021"
67    NUMPAD8 = u"\ue022"
68    NUMPAD9 = u"\ue023"
69    MULTIPLY = u"\ue024"
70    ADD = u"\ue025"
71    SEPARATOR = u"\ue026"
72    SUBTRACT = u"\ue027"
73    DECIMAL = u"\ue028"
74    DIVIDE = u"\ue029"
75
76    F1 = u"\ue031"  # function  keys
77    F2 = u"\ue032"
78    F3 = u"\ue033"
79    F4 = u"\ue034"
80    F5 = u"\ue035"
81    F6 = u"\ue036"
82    F7 = u"\ue037"
83    F8 = u"\ue038"
84    F9 = u"\ue039"
85    F10 = u"\ue03a"
86    F11 = u"\ue03b"
87    F12 = u"\ue03c"
88
89    META = u"\ue03d"
90
91    # More keys from webdriver spec
92    ZENKAKUHANKAKU = u"\uE040"
93    R_SHIFT = u"\uE050"
94    R_CONTROL = u"\uE051"
95    R_ALT = u"\uE052"
96    R_META = u"\uE053"
97    R_PAGEUP = u"\uE054"
98    R_PAGEDOWN = u"\uE055"
99    R_END = u"\uE056"
100    R_HOME = u"\uE057"
101    R_ARROWLEFT = u"\uE058"
102    R_ARROWUP = u"\uE059"
103    R_ARROWRIGHT = u"\uE05A"
104    R_ARROWDOWN = u"\uE05B"
105    R_INSERT = u"\uE05C"
106    R_DELETE = u"\uE05D"
107
108
109ALL_KEYS = getmembers(Keys, lambda x: type(x) == str)
110
111ALL_EVENTS = OrderedDict(
112    [
113        ("ADD", OrderedDict(
114            [
115                ("code", "NumpadAdd"),
116                ("ctrl", False),
117                ("key", "+"),
118                ("location", 3),
119                ("meta", False),
120                ("shift", False),
121                ("value", u"\ue025")
122            ]
123        )),
124        ("ALT", OrderedDict(
125            [
126                ("code", "AltLeft"),
127                ("ctrl", False),
128                ("key", "Alt"),
129                ("location", 1),
130                ("meta", False),
131                ("shift", False),
132                ("value", u"\ue00a")
133            ]
134        )),
135        ("BACKSPACE", OrderedDict(
136            [
137                ("code", "Backspace"),
138                ("ctrl", False),
139                ("key", "Backspace"),
140                ("location", 0),
141                ("meta", False),
142                ("shift", False),
143                ("value", u"\ue003")
144            ]
145        )),
146        ("CANCEL", OrderedDict(
147            [
148                ("code", ""),
149                ("ctrl", False),
150                ("key", "Cancel"),
151                ("location", 0),
152                ("meta", False),
153                ("shift", False),
154                ("value", u"\ue001")
155            ]
156        )),
157        ("CLEAR", OrderedDict(
158            [
159                ("code", ""),
160                ("ctrl", False),
161                ("key", "Clear"),
162                ("location", 0),
163                ("meta", False),
164                ("shift", False),
165                ("value", u"\ue005")
166            ]
167        )),
168        ("CONTROL", OrderedDict(
169            [
170                ("code", "ControlLeft"),
171                ("ctrl", True),
172                ("key", "Control"),
173                ("location", 1),
174                ("meta", False),
175                ("shift", False),
176                ("value", u"\ue009")
177            ]
178        )),
179        ("DECIMAL", OrderedDict(
180            [
181                ("code", "NumpadDecimal"),
182                ("ctrl", False),
183                ("key", "."),
184                ("location", 3),
185                ("meta", False),
186                ("shift", False),
187                ("value", u"\ue028")
188            ]
189        )),
190        ("DELETE", OrderedDict(
191            [
192                ("code", "Delete"),
193                ("ctrl", False),
194                ("key", "Delete"),
195                ("location", 0),
196                ("meta", False),
197                ("shift", False),
198                ("value", u"\ue017")
199            ]
200        )),
201        ("DIVIDE", OrderedDict(
202            [
203                ("code", "NumpadDivide"),
204                ("ctrl", False),
205                ("key", "/"),
206                ("location", 3),
207                ("meta", False),
208                ("shift", False),
209                ("value", u"\ue029")
210            ]
211        )),
212        ("DOWN", OrderedDict(
213            [
214                ("code", "ArrowDown"),
215                ("ctrl", False),
216                ("key", "ArrowDown"),
217                ("location", 0),
218                ("meta", False),
219                ("shift", False),
220                ("value", u"\ue015")
221            ]
222        )),
223        ("END", OrderedDict(
224            [
225                ("code", "End"),
226                ("ctrl", False),
227                ("key", "End"),
228                ("location", 0),
229                ("meta", False),
230                ("shift", False),
231                ("value", u"\ue010")
232            ]
233        )),
234        ("ENTER", OrderedDict(
235            [
236                ("code", "NumpadEnter"),
237                ("ctrl", False),
238                ("key", "Enter"),
239                ("location", 1),
240                ("meta", False),
241                ("shift", False),
242                ("value", u"\ue007")
243            ]
244        )),
245        ("EQUALS", OrderedDict(
246            [
247                ("code", ""),
248                ("ctrl", False),
249                ("key", "="),
250                ("location", 0),
251                ("meta", False),
252                ("shift", False),
253                ("value", u"\ue019")
254            ]
255        )),
256        ("ESCAPE", OrderedDict(
257            [
258                ("code", "Escape"),
259                ("ctrl", False),
260                ("key", "Escape"),
261                ("location", 0),
262                ("meta", False),
263                ("shift", False),
264                ("value", u"\ue00c")
265            ]
266        )),
267        ("F1", OrderedDict(
268            [
269                ("code", "F1"),
270                ("ctrl", False),
271                ("key", "F1"),
272                ("location", 0),
273                ("meta", False),
274                ("shift", False),
275                ("value", u"\ue031")
276            ]
277        )),
278        ("F10", OrderedDict(
279            [
280                ("code", "F10"),
281                ("ctrl", False),
282                ("key", "F10"),
283                ("location", 0),
284                ("meta", False),
285                ("shift", False),
286                ("value", u"\ue03a")
287            ]
288        )),
289        ("F11", OrderedDict(
290            [
291                ("code", "F11"),
292                ("ctrl", False),
293                ("key", "F11"),
294                ("location", 0),
295                ("meta", False),
296                ("shift", False),
297                ("value", u"\ue03b")
298            ]
299        )),
300        ("F12", OrderedDict(
301            [
302                ("code", "F12"),
303                ("ctrl", False),
304                ("key", "F12"),
305                ("location", 0),
306                ("meta", False),
307                ("shift", False),
308                ("value", u"\ue03c")
309            ]
310        )),
311        ("F2", OrderedDict(
312            [
313                ("code", "F2"),
314                ("ctrl", False),
315                ("key", "F2"),
316                ("location", 0),
317                ("meta", False),
318                ("shift", False),
319                ("value", u"\ue032")
320            ]
321        )),
322        ("F3", OrderedDict(
323            [
324                ("code", "F3"),
325                ("ctrl", False),
326                ("key", "F3"),
327                ("location", 0),
328                ("meta", False),
329                ("shift", False),
330                ("value", u"\ue033")
331            ]
332        )),
333        ("F4", OrderedDict(
334            [
335                ("code", "F4"),
336                ("ctrl", False),
337                ("key", "F4"),
338                ("location", 0),
339                ("meta", False),
340                ("shift", False),
341                ("value", u"\ue034")
342            ]
343        )),
344        ("F5", OrderedDict(
345            [
346                ("code", "F5"),
347                ("ctrl", False),
348                ("key", "F5"),
349                ("location", 0),
350                ("meta", False),
351                ("shift", False),
352                ("value", u"\ue035")
353            ]
354        )),
355        ("F6", OrderedDict(
356            [
357                ("code", "F6"),
358                ("ctrl", False),
359                ("key", "F6"),
360                ("location", 0),
361                ("meta", False),
362                ("shift", False),
363                ("value", u"\ue036")
364            ]
365        )),
366        ("F7", OrderedDict(
367            [
368                ("code", "F7"),
369                ("ctrl", False),
370                ("key", "F7"),
371                ("location", 0),
372                ("meta", False),
373                ("shift", False),
374                ("value", u"\ue037")
375            ]
376        )),
377        ("F8", OrderedDict(
378            [
379                ("code", "F8"),
380                ("ctrl", False),
381                ("key", "F8"),
382                ("location", 0),
383                ("meta", False),
384                ("shift", False),
385                ("value", u"\ue038")
386            ]
387        )),
388        ("F9", OrderedDict(
389            [
390                ("code", "F9"),
391                ("ctrl", False),
392                ("key", "F9"),
393                ("location", 0),
394                ("meta", False),
395                ("shift", False),
396                ("value", u"\ue039")
397            ]
398        )),
399        ("HELP", OrderedDict(
400            [
401                ("code", "Help"),
402                ("ctrl", False),
403                ("key", "Help"),
404                ("location", 0),
405                ("meta", False),
406                ("shift", False),
407                ("value", u"\ue002")
408            ]
409        )),
410        ("HOME", OrderedDict(
411            [
412                ("code", "Home"),
413                ("ctrl", False),
414                ("key", "Home"),
415                ("location", 0),
416                ("meta", False),
417                ("shift", False),
418                ("value", u"\ue011")
419            ]
420        )),
421        ("INSERT", OrderedDict(
422            [
423                ("code", "Insert"),
424                ("ctrl", False),
425                ("key", "Insert"),
426                ("location", 0),
427                ("meta", False),
428                ("shift", False),
429                ("value", u"\ue016")
430            ]
431        )),
432        ("LEFT", OrderedDict(
433            [
434                ("code", "ArrowLeft"),
435                ("ctrl", False),
436                ("key", "ArrowLeft"),
437                ("location", 0),
438                ("meta", False),
439                ("shift", False),
440                ("value", u"\ue012")
441            ]
442        )),
443        ("META", OrderedDict(
444            [
445                ("code", "OSLeft"),
446                ("ctrl", False),
447                ("key", "Meta"),
448                ("location", 1),
449                ("meta", True),
450                ("shift", False),
451                ("value", u"\ue03d")
452            ]
453        )),
454        ("MULTIPLY", OrderedDict(
455            [
456                ("code", "NumpadMultiply"),
457                ("ctrl", False),
458                ("key", "*"),
459                ("location", 3),
460                ("meta", False),
461                ("shift", False),
462                ("value", u"\ue024")
463            ]
464        )),
465        ("NULL", OrderedDict(
466            [
467                ("code", ""),
468                ("ctrl", False),
469                ("key", "Unidentified"),
470                ("location", 0),
471                ("meta", False),
472                ("shift", False),
473                ("value", u"\ue000")
474            ]
475        )),
476        ("NUMPAD0", OrderedDict(
477            [
478                ("code", "Numpad0"),
479                ("ctrl", False),
480                ("key", "0"),
481                ("location", 3),
482                ("meta", False),
483                ("shift", False),
484                ("value", u"\ue01a")
485            ]
486        )),
487        ("NUMPAD1", OrderedDict(
488            [
489                ("code", "Numpad1"),
490                ("ctrl", False),
491                ("key", "1"),
492                ("location", 3),
493                ("meta", False),
494                ("shift", False),
495                ("value", u"\ue01b")
496            ]
497        )),
498        ("NUMPAD2", OrderedDict(
499            [
500                ("code", "Numpad2"),
501                ("ctrl", False),
502                ("key", "2"),
503                ("location", 3),
504                ("meta", False),
505                ("shift", False),
506                ("value", u"\ue01c")
507            ]
508        )),
509        ("NUMPAD3", OrderedDict(
510            [
511                ("code", "Numpad3"),
512                ("ctrl", False),
513                ("key", "3"),
514                ("location", 3),
515                ("meta", False),
516                ("shift", False),
517                ("value", u"\ue01d")
518            ]
519        )),
520        ("NUMPAD4", OrderedDict(
521            [
522                ("code", "Numpad4"),
523                ("ctrl", False),
524                ("key", "4"),
525                ("location", 3),
526                ("meta", False),
527                ("shift", False),
528                ("value", u"\ue01e")
529            ]
530        )),
531        ("NUMPAD5", OrderedDict(
532            [
533                ("code", "Numpad5"),
534                ("ctrl", False),
535                ("key", "5"),
536                ("location", 3),
537                ("meta", False),
538                ("shift", False),
539                ("value", u"\ue01f")
540            ]
541        )),
542        ("NUMPAD6", OrderedDict(
543            [
544                ("code", "Numpad6"),
545                ("ctrl", False),
546                ("key", "6"),
547                ("location", 3),
548                ("meta", False),
549                ("shift", False),
550                ("value", u"\ue020")
551            ]
552        )),
553        ("NUMPAD7", OrderedDict(
554            [
555                ("code", "Numpad7"),
556                ("ctrl", False),
557                ("key", "7"),
558                ("location", 3),
559                ("meta", False),
560                ("shift", False),
561                ("value", u"\ue021")
562            ]
563        )),
564        ("NUMPAD8", OrderedDict(
565            [
566                ("code", "Numpad8"),
567                ("ctrl", False),
568                ("key", "8"),
569                ("location", 3),
570                ("meta", False),
571                ("shift", False),
572                ("value", u"\ue022")
573            ]
574        )),
575        ("NUMPAD9", OrderedDict(
576            [
577                ("code", "Numpad9"),
578                ("ctrl", False),
579                ("key", "9"),
580                ("location", 3),
581                ("meta", False),
582                ("shift", False),
583                ("value", u"\ue023")
584            ]
585        )),
586        ("PAGE_DOWN", OrderedDict(
587            [
588                ("code", "PageDown"),
589                ("ctrl", False),
590                ("key", "PageDown"),
591                ("location", 0),
592                ("meta", False),
593                ("shift", False),
594                ("value", u"\ue00f")
595            ]
596        )),
597        ("PAGE_UP", OrderedDict(
598            [
599                ("code", "PageUp"),
600                ("ctrl", False),
601                ("key", "PageUp"),
602                ("location", 0),
603                ("meta", False),
604                ("shift", False),
605                ("value", u"\ue00e")
606            ]
607        )),
608        ("PAUSE", OrderedDict(
609            [
610                ("code", ""),
611                ("ctrl", False),
612                ("key", "Pause"),
613                ("location", 0),
614                ("meta", False),
615                ("shift", False),
616                ("value", u"\ue00b")
617            ]
618        )),
619        ("RETURN", OrderedDict(
620            [
621                ("code", "Enter"),
622                ("ctrl", False),
623                ("key", "Enter"),
624                ("location", 0),
625                ("meta", False),
626                ("shift", False),
627                ("value", u"\ue006")
628            ]
629        )),
630        ("RIGHT", OrderedDict(
631            [
632                ("code", "ArrowRight"),
633                ("ctrl", False),
634                ("key", "ArrowRight"),
635                ("location", 0),
636                ("meta", False),
637                ("shift", False),
638                ("value", u"\ue014")
639            ]
640        )),
641        ("R_ALT", OrderedDict(
642            [
643                ("code", "AltRight"),
644                ("ctrl", False),
645                ("key", "Alt"),
646                ("location", 2),
647                ("meta", False),
648                ("shift", False),
649                ("value", u"\ue052")
650            ]
651        )),
652        ("R_ARROWDOWN", OrderedDict(
653            [
654                ("code", "Numpad2"),
655                ("ctrl", False),
656                ("key", "ArrowDown"),
657                ("location", 3),
658                ("meta", False),
659                ("shift", False),
660                ("value", u"\ue05b")
661            ]
662        )),
663        ("R_ARROWLEFT", OrderedDict(
664            [
665                ("code", "Numpad4"),
666                ("ctrl", False),
667                ("key", "ArrowLeft"),
668                ("location", 3),
669                ("meta", False),
670                ("shift", False),
671                ("value", u"\ue058")
672            ]
673        )),
674        ("R_ARROWRIGHT", OrderedDict(
675            [
676                ("code", "Numpad6"),
677                ("ctrl", False),
678                ("key", "ArrowRight"),
679                ("location", 3),
680                ("meta", False),
681                ("shift", False),
682                ("value", u"\ue05a")
683            ]
684        )),
685        ("R_ARROWUP", OrderedDict(
686            [
687                ("code", "Numpad8"),
688                ("ctrl", False),
689                ("key", "ArrowUp"),
690                ("location", 3),
691                ("meta", False),
692                ("shift", False),
693                ("value", u"\ue059")
694            ]
695        )),
696        ("R_CONTROL", OrderedDict(
697            [
698                ("code", "ControlRight"),
699                ("ctrl", True),
700                ("key", "Control"),
701                ("location", 2),
702                ("meta", False),
703                ("shift", False),
704                ("value", u"\ue051")
705            ]
706        )),
707        ("R_DELETE", OrderedDict(
708            [
709                ("code", "NumpadDecimal"),
710                ("ctrl", False),
711                ("key", "Delete"),
712                ("location", 3),
713                ("meta", False),
714                ("shift", False),
715                ("value", u"\ue05d")
716            ]
717        )),
718        ("R_END", OrderedDict(
719            [
720                ("code", "Numpad1"),
721                ("ctrl", False),
722                ("key", "End"),
723                ("location", 3),
724                ("meta", False),
725                ("shift", False),
726                ("value", u"\ue056")
727            ]
728        )),
729        ("R_HOME", OrderedDict(
730            [
731                ("code", "Numpad7"),
732                ("ctrl", False),
733                ("key", "Home"),
734                ("location", 3),
735                ("meta", False),
736                ("shift", False),
737                ("value", u"\ue057")
738            ]
739        )),
740        ("R_INSERT", OrderedDict(
741            [
742                ("code", "Numpad0"),
743                ("ctrl", False),
744                ("key", "Insert"),
745                ("location", 3),
746                ("meta", False),
747                ("shift", False),
748                ("value", u"\ue05c")
749            ]
750        )),
751        ("R_META", OrderedDict(
752            [
753                ("code", "OSRight"),
754                ("ctrl", False),
755                ("key", "Meta"),
756                ("location", 2),
757                ("meta", True),
758                ("shift", False),
759                ("value", u"\ue053")
760            ]
761        )),
762        ("R_PAGEDOWN", OrderedDict(
763            [
764                ("code", "Numpad3"),
765                ("ctrl", False),
766                ("key", "PageDown"),
767                ("location", 3),
768                ("meta", False),
769                ("shift", False),
770                ("value", u"\ue055")
771            ]
772        )),
773        ("R_PAGEUP", OrderedDict(
774            [
775                ("code", "Numpad9"),
776                ("ctrl", False),
777                ("key", "PageUp"),
778                ("location", 3),
779                ("meta", False),
780                ("shift", False),
781                ("value", u"\ue054")
782            ]
783        )),
784        ("R_SHIFT", OrderedDict(
785            [
786                ("code", "ShiftRight"),
787                ("ctrl", False),
788                ("key", "Shift"),
789                ("location", 2),
790                ("meta", False),
791                ("shift", True),
792                ("value", u"\ue050")
793            ]
794        )),
795        ("SEMICOLON", OrderedDict(
796            [
797                ("code", ""),
798                ("ctrl", False),
799                ("key", ";"),
800                ("location", 0),
801                ("meta", False),
802                ("shift", False),
803                ("value", u"\ue018")
804            ]
805        )),
806        ("SEPARATOR", OrderedDict(
807            [
808                ("code", "NumpadComma"),
809                ("ctrl", False),
810                ("key", ","),
811                ("location", 3),
812                ("meta", False),
813                ("shift", False),
814                ("value", u"\ue026")
815            ]
816        )),
817        ("SHIFT", OrderedDict(
818            [
819                ("code", "ShiftLeft"),
820                ("ctrl", False),
821                ("key", "Shift"),
822                ("location", 1),
823                ("meta", False),
824                ("shift", True),
825                ("value", u"\ue008")
826            ]
827        )),
828        ("SPACE", OrderedDict(
829            [
830                ("code", "Space"),
831                ("ctrl", False),
832                ("key", " "),
833                ("location", 0),
834                ("meta", False),
835                ("shift", False),
836                ("value", u"\ue00d")
837            ]
838        )),
839        ("SUBTRACT", OrderedDict(
840            [
841                ("code", "NumpadSubtract"),
842                ("ctrl", False),
843                ("key", "-"),
844                ("location", 3),
845                ("meta", False),
846                ("shift", False),
847                ("value", u"\ue027")
848            ]
849        )),
850        ("TAB", OrderedDict(
851            [
852                ("code", "Tab"),
853                ("ctrl", False),
854                ("key", "Tab"),
855                ("location", 0),
856                ("meta", False),
857                ("shift", False),
858                ("value", u"\ue004")
859            ]
860        )),
861        ("UP", OrderedDict(
862            [
863                ("code", "ArrowUp"),
864                ("ctrl", False),
865                ("key", "ArrowUp"),
866                ("location", 0),
867                ("meta", False),
868                ("shift", False),
869                ("value", u"\ue013")
870            ]
871        )),
872        ("ZENKAKUHANKAKU", OrderedDict(
873            [
874                ("code", ""),
875                ("ctrl", False),
876                ("key", "ZenkakuHankaku"),
877                ("location", 0),
878                ("meta", False),
879                ("shift", False),
880                ("value", u"\ue040")
881            ]
882        ))
883    ]
884)
885
886ALTERNATIVE_KEY_NAMES = {
887    "ADD": "Add",
888    "DECIMAL": "Decimal",
889    "DELETE": "Del",
890    "DIVIDE": "Divide",
891    "DOWN": "Down",
892    "ESCAPE": "Esc",
893    "LEFT": "Left",
894    "MULTIPLY": "Multiply",
895    "R_ARROWDOWN": "Down",
896    "R_ARROWLEFT": "Left",
897    "R_ARROWRIGHT": "Right",
898    "R_ARROWUP": "Up",
899    "R_DELETE": "Del",
900    "RIGHT": "Right",
901    "SEPARATOR": "Separator",
902    "SPACE": "Spacebar",
903    "SUBTRACT": "Subtract",
904    "UP": "Up",
905}
906
907if sys.platform == "darwin":
908    MODIFIER_KEY = Keys.META
909else:
910    MODIFIER_KEY = Keys.CONTROL
911