| Index: telemetry/telemetry/internal/actions/key_event.py
|
| diff --git a/telemetry/telemetry/internal/actions/key_event.py b/telemetry/telemetry/internal/actions/key_event.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1558607f0e3d5df23e7e3a0fb0d81cdacfe098bc
|
| --- /dev/null
|
| +++ b/telemetry/telemetry/internal/actions/key_event.py
|
| @@ -0,0 +1,96 @@
|
| +# Copyright 2016 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +import string
|
| +
|
| +from telemetry.internal.actions import page_action
|
| +
|
| +
|
| +# Map from DOM key values
|
| +# (https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key) to
|
| +# Windows virtual key codes
|
| +# (https://cs.chromium.org/chromium/src/third_party/WebKit/Source/platform/WindowsKeyboardCodes.h)
|
| +# and their printed representations (if available).
|
| +_KEY_MAP = {}
|
| +
|
| +def _AddSpecialKey(key, windows_virtual_key_code, text=None):
|
| + assert key not in _KEY_MAP, 'Duplicate key: %s' % key
|
| + _KEY_MAP[key] = (windows_virtual_key_code, text)
|
| +
|
| +def _AddRegularKey(keys, windows_virtual_key_code):
|
| + for k in keys:
|
| + assert k not in _KEY_MAP, 'Duplicate key: %s' % k
|
| + _KEY_MAP[k] = (windows_virtual_key_code, k)
|
| +
|
| +_AddSpecialKey('PageUp', 0x21)
|
| +_AddSpecialKey('PageDown', 0x22)
|
| +_AddSpecialKey('End', 0x23)
|
| +_AddSpecialKey('Home', 0x24)
|
| +_AddSpecialKey('ArrowLeft', 0x25)
|
| +_AddSpecialKey('ArrowUp', 0x26)
|
| +_AddSpecialKey('ArrowRight', 0x27)
|
| +_AddSpecialKey('ArrowDown', 0x28)
|
| +
|
| +_AddSpecialKey('Return', 0x0D, text='\x0D')
|
| +_AddSpecialKey('Delete', 0x2E, text='\x7F')
|
| +_AddSpecialKey('Backspace', 0x08, text='\x08')
|
| +
|
| +# Letter keys.
|
| +for c in string.ascii_uppercase:
|
| + _AddRegularKey([c, c.lower()], ord(c))
|
| +
|
| +# Symbol keys.
|
| +_AddRegularKey(';:', 0xBA)
|
| +_AddRegularKey('=+', 0xBB)
|
| +_AddRegularKey(',<', 0xBC)
|
| +_AddRegularKey('-_', 0xBD)
|
| +_AddRegularKey('.>', 0xBE)
|
| +_AddRegularKey('/?', 0xBF)
|
| +_AddRegularKey('`~', 0xC0)
|
| +_AddRegularKey('[{', 0xDB)
|
| +_AddRegularKey('\\|', 0xDC)
|
| +_AddRegularKey(']}', 0xDD)
|
| +_AddRegularKey('\'"', 0xDE)
|
| +
|
| +# Numeric keys.
|
| +_AddRegularKey('0)', 0x30)
|
| +_AddRegularKey('1!', 0x31)
|
| +_AddRegularKey('2@', 0x32)
|
| +_AddRegularKey('3#', 0x33)
|
| +_AddRegularKey('4$', 0x34)
|
| +_AddRegularKey('5%', 0x35)
|
| +_AddRegularKey('6^', 0x36)
|
| +_AddRegularKey('7&', 0x37)
|
| +_AddRegularKey('8*', 0x38)
|
| +_AddRegularKey('9(', 0x39)
|
| +
|
| +# Space.
|
| +_AddRegularKey(' ', 0x20)
|
| +
|
| +
|
| +class KeyPressAction(page_action.PageAction):
|
| +
|
| + def __init__(self, dom_key, timeout=60):
|
| + super(KeyPressAction, self).__init__()
|
| + self._dom_key = dom_key
|
| + if dom_key not in _KEY_MAP:
|
| + raise ValueError('No mapping for key: %s' % dom_key)
|
| + self._windows_virtual_key_code, self._text = _KEY_MAP[dom_key]
|
| + self._timeout = timeout
|
| +
|
| + def RunAction(self, tab):
|
| + tab.DispatchKeyEvent(keyEventType='rawKeyDown',
|
| + domKey=self._dom_key,
|
| + windowsVirtualKeyCode=self._windows_virtual_key_code,
|
| + timeout=self._timeout)
|
| + if self._text:
|
| + tab.DispatchKeyEvent(keyEventType='char',
|
| + text=self._text,
|
| + domKey=self._dom_key,
|
| + windowsVirtualKeyCode=ord(self._text),
|
| + timeout=self._timeout)
|
| + tab.DispatchKeyEvent(keyEventType='keyUp',
|
| + domKey=self._dom_key,
|
| + windowsVirtualKeyCode=self._windows_virtual_key_code,
|
| + timeout=self._timeout)
|
|
|