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