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""" 19The Keys implementation. 20""" 21 22from inspect import getmembers 23import sys 24 25 26class Keys(object): 27 """ 28 Set of special keys codes. 29 30 See also https://w3c.github.io/webdriver/webdriver-spec.html#h-keyboard-actions 31 """ 32 33 NULL = u"\ue000" 34 CANCEL = u"\ue001" # ^break 35 HELP = u"\ue002" 36 BACKSPACE = u"\ue003" 37 TAB = u"\ue004" 38 CLEAR = u"\ue005" 39 RETURN = u"\ue006" 40 ENTER = u"\ue007" 41 SHIFT = u"\ue008" 42 CONTROL = u"\ue009" 43 ALT = u"\ue00a" 44 PAUSE = u"\ue00b" 45 ESCAPE = u"\ue00c" 46 SPACE = u"\ue00d" 47 PAGE_UP = u"\ue00e" 48 PAGE_DOWN = u"\ue00f" 49 END = u"\ue010" 50 HOME = u"\ue011" 51 LEFT = u"\ue012" 52 UP = u"\ue013" 53 RIGHT = u"\ue014" 54 DOWN = u"\ue015" 55 INSERT = u"\ue016" 56 DELETE = u"\ue017" 57 SEMICOLON = u"\ue018" 58 EQUALS = u"\ue019" 59 60 NUMPAD0 = u"\ue01a" # number pad keys 61 NUMPAD1 = u"\ue01b" 62 NUMPAD2 = u"\ue01c" 63 NUMPAD3 = u"\ue01d" 64 NUMPAD4 = u"\ue01e" 65 NUMPAD5 = u"\ue01f" 66 NUMPAD6 = u"\ue020" 67 NUMPAD7 = u"\ue021" 68 NUMPAD8 = u"\ue022" 69 NUMPAD9 = u"\ue023" 70 MULTIPLY = u"\ue024" 71 ADD = u"\ue025" 72 SEPARATOR = u"\ue026" 73 SUBTRACT = u"\ue027" 74 DECIMAL = u"\ue028" 75 DIVIDE = u"\ue029" 76 77 F1 = u"\ue031" # function keys 78 F2 = u"\ue032" 79 F3 = u"\ue033" 80 F4 = u"\ue034" 81 F5 = u"\ue035" 82 F6 = u"\ue036" 83 F7 = u"\ue037" 84 F8 = u"\ue038" 85 F9 = u"\ue039" 86 F10 = u"\ue03a" 87 F11 = u"\ue03b" 88 F12 = u"\ue03c" 89 90 META = u"\ue03d" 91 92 # More keys from webdriver spec 93 ZENKAKUHANKAKU = u"\uE040" 94 R_SHIFT = u"\uE050" 95 R_CONTROL = u"\uE051" 96 R_ALT = u"\uE052" 97 R_META = u"\uE053" 98 R_PAGEUP = u"\uE054" 99 R_PAGEDOWN = u"\uE055" 100 R_END = u"\uE056" 101 R_HOME = u"\uE057" 102 R_ARROWLEFT = u"\uE058" 103 R_ARROWUP = u"\uE059" 104 R_ARROWRIGHT = u"\uE05A" 105 R_ARROWDOWN = u"\uE05B" 106 R_INSERT = u"\uE05C" 107 R_DELETE = u"\uE05D" 108 109 110ALL_KEYS = getmembers(Keys, lambda x: type(x) == unicode) 111 112ALL_EVENTS = { 113 "ADD": { 114 "code": "", 115 "ctrl": False, 116 "key": "+", 117 "location": 3, 118 "meta": False, 119 "shift": False, 120 "value": u"\ue025", 121 }, 122 "ALT": { 123 "code": "AltLeft", 124 "ctrl": False, 125 "key": "Alt", 126 "location": 1, 127 "meta": False, 128 "shift": False, 129 "value": u"\ue00a", 130 }, 131 "BACKSPACE": { 132 "code": "Backspace", 133 "ctrl": False, 134 "key": "Backspace", 135 "location": 0, 136 "meta": False, 137 "shift": False, 138 "value": u"\ue003", 139 }, 140 "CANCEL": { 141 "code": "", 142 "ctrl": False, 143 "key": "Cancel", 144 "location": 0, 145 "meta": False, 146 "shift": False, 147 "value": u"\ue001", 148 }, 149 "CLEAR": { 150 "code": "", 151 "ctrl": False, 152 "key": "Clear", 153 "location": 0, 154 "meta": False, 155 "shift": False, 156 "value": u"\ue005", 157 }, 158 "CONTROL": { 159 "code": "ControlLeft", 160 "ctrl": True, 161 "key": "Control", 162 "location": 1, 163 "meta": False, 164 "shift": False, 165 "value": u"\ue009", 166 }, 167 "DECIMAL": { 168 "code": "NumpadDecimal", 169 "ctrl": False, 170 "key": ".", 171 "location": 3, 172 "meta": False, 173 "shift": False, 174 "value": u"\ue028", 175 }, 176 "DELETE": { 177 "code": "Delete", 178 "ctrl": False, 179 "key": "Delete", 180 "location": 0, 181 "meta": False, 182 "shift": False, 183 "value": u"\ue017", 184 }, 185 "DIVIDE": { 186 "code": "NumpadDivide", 187 "ctrl": False, 188 "key": "/", 189 "location": 3, 190 "meta": False, 191 "shift": False, 192 "value": u"\ue029", 193 }, 194 "DOWN": { 195 "code": "ArrowDown", 196 "ctrl": False, 197 "key": "ArrowDown", 198 "location": 0, 199 "meta": False, 200 "shift": False, 201 "value": u"\ue015", 202 }, 203 "END": { 204 "code": "End", 205 "ctrl": False, 206 "key": "End", 207 "location": 0, 208 "meta": False, 209 "shift": False, 210 "value": u"\ue010", 211 }, 212 "ENTER": { 213 "code": "NumpadEnter", 214 "ctrl": False, 215 "key": "Enter", 216 "location": 1, 217 "meta": False, 218 "shift": False, 219 "value": u"\ue007", 220 }, 221 "EQUALS": { 222 "code": "", 223 "ctrl": False, 224 "key": "=", 225 "location": 0, 226 "meta": False, 227 "shift": False, 228 "value": u"\ue019", 229 }, 230 "ESCAPE": { 231 "code": "Escape", 232 "ctrl": False, 233 "key": "Escape", 234 "location": 0, 235 "meta": False, 236 "shift": False, 237 "value": u"\ue00c", 238 }, 239 "F1": { 240 "code": "F1", 241 "ctrl": False, 242 "key": "F1", 243 "location": 0, 244 "meta": False, 245 "shift": False, 246 "value": u"\ue031", 247 }, 248 "F10": { 249 "code": "F10", 250 "ctrl": False, 251 "key": "F10", 252 "location": 0, 253 "meta": False, 254 "shift": False, 255 "value": u"\ue03a", 256 }, 257 "F11": { 258 "code": "F11", 259 "ctrl": False, 260 "key": "F11", 261 "location": 0, 262 "meta": False, 263 "shift": False, 264 "value": u"\ue03b", 265 }, 266 "F12": { 267 "code": "F12", 268 "ctrl": False, 269 "key": "F12", 270 "location": 0, 271 "meta": False, 272 "shift": False, 273 "value": u"\ue03c", 274 }, 275 "F2": { 276 "code": "F2", 277 "ctrl": False, 278 "key": "F2", 279 "location": 0, 280 "meta": False, 281 "shift": False, 282 "value": u"\ue032", 283 }, 284 "F3": { 285 "code": "F3", 286 "ctrl": False, 287 "key": "F3", 288 "location": 0, 289 "meta": False, 290 "shift": False, 291 "value": u"\ue033", 292 }, 293 "F4": { 294 "code": "F4", 295 "ctrl": False, 296 "key": "F4", 297 "location": 0, 298 "meta": False, 299 "shift": False, 300 "value": u"\ue034", 301 }, 302 "F5": { 303 "code": "F5", 304 "ctrl": False, 305 "key": "F5", 306 "location": 0, 307 "meta": False, 308 "shift": False, 309 "value": u"\ue035", 310 }, 311 "F6": { 312 "code": "F6", 313 "ctrl": False, 314 "key": "F6", 315 "location": 0, 316 "meta": False, 317 "shift": False, 318 "value": u"\ue036", 319 }, 320 "F7": { 321 "code": "F7", 322 "ctrl": False, 323 "key": "F7", 324 "location": 0, 325 "meta": False, 326 "shift": False, 327 "value": u"\ue037", 328 }, 329 "F8": { 330 "code": "F8", 331 "ctrl": False, 332 "key": "F8", 333 "location": 0, 334 "meta": False, 335 "shift": False, 336 "value": u"\ue038", 337 }, 338 "F9": { 339 "code": "F9", 340 "ctrl": False, 341 "key": "F9", 342 "location": 0, 343 "meta": False, 344 "shift": False, 345 "value": u"\ue039", 346 }, 347 "HELP": { 348 "code": "Help", 349 "ctrl": False, 350 "key": "Help", 351 "location": 0, 352 "meta": False, 353 "shift": False, 354 "value": u"\ue002", 355 }, 356 "HOME": { 357 "code": "Home", 358 "ctrl": False, 359 "key": "Home", 360 "location": 0, 361 "meta": False, 362 "shift": False, 363 "value": u"\ue011", 364 }, 365 "INSERT": { 366 "code": "Insert", 367 "ctrl": False, 368 "key": "Insert", 369 "location": 0, 370 "meta": False, 371 "shift": False, 372 "value": u"\ue016", 373 }, 374 "LEFT": { 375 "code": "ArrowLeft", 376 "ctrl": False, 377 "key": "ArrowLeft", 378 "location": 0, 379 "meta": False, 380 "shift": False, 381 "value": u"\ue012", 382 }, 383 "META": { 384 "code": "OSLeft", 385 "ctrl": False, 386 "key": "Meta", 387 "location": 1, 388 "meta": True, 389 "shift": False, 390 "value": u"\ue03d", 391 }, 392 "MULTIPLY": { 393 "code": "NumpadMultiply", 394 "ctrl": False, 395 "key": "*", 396 "location": 3, 397 "meta": False, 398 "shift": False, 399 "value": u"\ue024", 400 }, 401 "NULL": { 402 "code": "", 403 "ctrl": False, 404 "key": "Unidentified", 405 "location": 0, 406 "meta": False, 407 "shift": False, 408 "value": u"\ue000", 409 }, 410 "NUMPAD0": { 411 "code": "Numpad0", 412 "ctrl": False, 413 "key": "0", 414 "location": 3, 415 "meta": False, 416 "shift": False, 417 "value": u"\ue01a", 418 }, 419 "NUMPAD1": { 420 "code": "Numpad1", 421 "ctrl": False, 422 "key": "1", 423 "location": 3, 424 "meta": False, 425 "shift": False, 426 "value": u"\ue01b", 427 }, 428 "NUMPAD2": { 429 "code": "Numpad2", 430 "ctrl": False, 431 "key": "2", 432 "location": 3, 433 "meta": False, 434 "shift": False, 435 "value": u"\ue01c", 436 }, 437 "NUMPAD3": { 438 "code": "Numpad3", 439 "ctrl": False, 440 "key": "3", 441 "location": 3, 442 "meta": False, 443 "shift": False, 444 "value": u"\ue01d", 445 }, 446 "NUMPAD4": { 447 "code": "PageDown", 448 "ctrl": False, 449 "key": "4", 450 "location": 3, 451 "meta": False, 452 "shift": False, 453 "value": u"\ue01e", 454 }, 455 "NUMPAD5": { 456 "code": "PageUp", 457 "ctrl": False, 458 "key": "5", 459 "location": 3, 460 "meta": False, 461 "shift": False, 462 "value": u"\ue01f", 463 }, 464 "NUMPAD6": { 465 "code": "Numpad6", 466 "ctrl": False, 467 "key": "6", 468 "location": 3, 469 "meta": False, 470 "shift": False, 471 "value": u"\ue020", 472 }, 473 "NUMPAD7": { 474 "code": "Numpad7", 475 "ctrl": False, 476 "key": "7", 477 "location": 3, 478 "meta": False, 479 "shift": False, 480 "value": u"\ue021", 481 }, 482 "NUMPAD8": { 483 "code": "Numpad8", 484 "ctrl": False, 485 "key": "8", 486 "location": 3, 487 "meta": False, 488 "shift": False, 489 "value": u"\ue022", 490 }, 491 "NUMPAD9": { 492 "code": "Numpad9", 493 "ctrl": False, 494 "key": "9", 495 "location": 3, 496 "meta": False, 497 "shift": False, 498 "value": u"\ue023", 499 }, 500 "PAGE_DOWN": { 501 "code": "", 502 "ctrl": False, 503 "key": "PageDown", 504 "location": 0, 505 "meta": False, 506 "shift": False, 507 "value": u"\ue00f", 508 }, 509 "PAGE_UP": { 510 "code": "", 511 "ctrl": False, 512 "key": "PageUp", 513 "location": 0, 514 "meta": False, 515 "shift": False, 516 "value": u"\ue00e", 517 }, 518 "PAUSE": { 519 "code": "", 520 "ctrl": False, 521 "key": "Pause", 522 "location": 0, 523 "meta": False, 524 "shift": False, 525 "value": u"\ue00b", 526 }, 527 "RETURN": { 528 "code": "Enter", 529 "ctrl": False, 530 "key": "Enter", 531 "location": 0, 532 "meta": False, 533 "shift": False, 534 "value": u"\ue006", 535 }, 536 "RIGHT": { 537 "code": "ArrowRight", 538 "ctrl": False, 539 "key": "ArrowRight", 540 "location": 0, 541 "meta": False, 542 "shift": False, 543 "value": u"\ue014", 544 }, 545 "R_ALT": { 546 "code": "AltRight", 547 "ctrl": False, 548 "key": "Alt", 549 "location": 2, 550 "meta": False, 551 "shift": False, 552 "value": u"\ue052", 553 }, 554 "R_ARROWDOWN": { 555 "code": "Numpad2", 556 "ctrl": False, 557 "key": "ArrowDown", 558 "location": 3, 559 "meta": False, 560 "shift": False, 561 "value": u"\ue05b", 562 }, 563 "R_ARROWLEFT": { 564 "code": "Numpad4", 565 "ctrl": False, 566 "key": "ArrowLeft", 567 "location": 3, 568 "meta": False, 569 "shift": False, 570 "value": u"\ue058", 571 }, 572 "R_ARROWRIGHT": { 573 "code": "Numpad6", 574 "ctrl": False, 575 "key": "ArrowRight", 576 "location": 3, 577 "meta": False, 578 "shift": False, 579 "value": u"\ue05a", 580 }, 581 "R_ARROWUP": { 582 "code": "Numpad8", 583 "ctrl": False, 584 "key": "ArrowUp", 585 "location": 3, 586 "meta": False, 587 "shift": False, 588 "value": u"\ue059", 589 }, 590 "R_CONTROL": { 591 "code": "ControlRight", 592 "ctrl": True, 593 "key": "Control", 594 "location": 2, 595 "meta": False, 596 "shift": False, 597 "value": u"\ue051", 598 }, 599 "R_DELETE": { 600 "code": "NumpadDecimal", 601 "ctrl": False, 602 "key": "Delete", 603 "location": 3, 604 "meta": False, 605 "shift": False, 606 "value": u"\ue05d", 607 }, 608 "R_END": { 609 "code": "Numpad1", 610 "ctrl": False, 611 "key": "End", 612 "location": 3, 613 "meta": False, 614 "shift": False, 615 "value": u"\ue056", 616 }, 617 "R_HOME": { 618 "code": "Numpad7", 619 "ctrl": False, 620 "key": "Home", 621 "location": 3, 622 "meta": False, 623 "shift": False, 624 "value": u"\ue057", 625 }, 626 "R_INSERT": { 627 "code": "Numpad0", 628 "ctrl": False, 629 "key": "Insert", 630 "location": 3, 631 "meta": False, 632 "shift": False, 633 "value": u"\ue05c", 634 }, 635 "R_META": { 636 "code": "OSRight", 637 "ctrl": False, 638 "key": "Meta", 639 "location": 2, 640 "meta": True, 641 "shift": False, 642 "value": u"\ue053", 643 }, 644 "R_PAGEDOWN": { 645 "code": "Numpad3", 646 "ctrl": False, 647 "key": "PageDown", 648 "location": 3, 649 "meta": False, 650 "shift": False, 651 "value": u"\ue055", 652 }, 653 "R_PAGEUP": { 654 "code": "Numpad9", 655 "ctrl": False, 656 "key": "PageUp", 657 "location": 3, 658 "meta": False, 659 "shift": False, 660 "value": u"\ue054", 661 }, 662 "R_SHIFT": { 663 "code": "ShiftRight", 664 "ctrl": False, 665 "key": "Shift", 666 "location": 2, 667 "meta": False, 668 "shift": True, 669 "value": u"\ue050", 670 }, 671 "SEMICOLON": { 672 "code": "", 673 "ctrl": False, 674 "key": ";", 675 "location": 0, 676 "meta": False, 677 "shift": False, 678 "value": u"\ue018", 679 }, 680 "SEPARATOR": { 681 "code": "NumpadSubtract", 682 "ctrl": False, 683 "key": ",", 684 "location": 3, 685 "meta": False, 686 "shift": False, 687 "value": u"\ue026", 688 }, 689 "SHIFT": { 690 "code": "ShiftLeft", 691 "ctrl": False, 692 "key": "Shift", 693 "location": 1, 694 "meta": False, 695 "shift": True, 696 "value": u"\ue008", 697 }, 698 "SPACE": { 699 "code": "Space", 700 "ctrl": False, 701 "key": " ", 702 "location": 0, 703 "meta": False, 704 "shift": False, 705 "value": u"\ue00d", 706 }, 707 "SUBTRACT": { 708 "code": "", 709 "ctrl": False, 710 "key": "-", 711 "location": 3, 712 "meta": False, 713 "shift": False, 714 "value": u"\ue027", 715 }, 716 "TAB": { 717 "code": "Tab", 718 "ctrl": False, 719 "key": "Tab", 720 "location": 0, 721 "meta": False, 722 "shift": False, 723 "value": u"\ue004", 724 }, 725 "UP": { 726 "code": "ArrowUp", 727 "ctrl": False, 728 "key": "ArrowUp", 729 "location": 0, 730 "meta": False, 731 "shift": False, 732 "value": u"\ue013", 733 }, 734 "ZENKAKUHANKAKU": { 735 "code": "", 736 "ctrl": False, 737 "key": "ZenkakuHankaku", 738 "location": 0, 739 "meta": False, 740 "shift": False, 741 "value": u"\ue040", 742 } 743} 744 745if sys.platform == 'darwin': 746 MODIFIER_KEY = Keys.META 747else: 748 MODIFIER_KEY = Keys.CONTROL 749