OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/test/webdriver/keycode_text_conversion.h" | |
6 | |
7 #include <windows.h> | |
8 | |
9 #include <cctype> | |
10 | |
11 #include "base/strings/utf_string_conversions.h" | |
12 #include "chrome/common/automation_constants.h" | |
13 | |
14 namespace webdriver { | |
15 | |
16 std::string ConvertKeyCodeToText(ui::KeyboardCode key_code, int modifiers) { | |
17 UINT scan_code = ::MapVirtualKeyW(key_code, MAPVK_VK_TO_VSC); | |
18 BYTE keyboard_state[256]; | |
19 memset(keyboard_state, 0, 256); | |
20 if (modifiers & automation::kShiftKeyMask) | |
21 keyboard_state[VK_SHIFT] |= 0x80; | |
22 if (modifiers & automation::kControlKeyMask) | |
23 keyboard_state[VK_CONTROL] |= 0x80; | |
24 if (modifiers & automation::kAltKeyMask) | |
25 keyboard_state[VK_MENU] |= 0x80; | |
26 wchar_t chars[5]; | |
27 int code = ::ToUnicode(key_code, scan_code, keyboard_state, chars, 4, 0); | |
28 // |ToUnicode| converts some non-text key codes like F1 to various ASCII | |
29 // control chars. Filter those out. | |
30 if (code <= 0 || (code == 1 && std::iscntrl(chars[0]))) { | |
31 return ""; | |
32 } else { | |
33 std::string text; | |
34 WideToUTF8(chars, code, &text); | |
35 return text; | |
36 } | |
37 } | |
38 | |
39 bool ConvertCharToKeyCode( | |
40 char16 key, ui::KeyboardCode* key_code, int *necessary_modifiers) { | |
41 short vkey_and_modifiers = ::VkKeyScanW(key); | |
42 bool translated = vkey_and_modifiers != -1 && | |
43 LOBYTE(vkey_and_modifiers) != -1 && | |
44 HIBYTE(vkey_and_modifiers) != -1; | |
45 if (translated) { | |
46 *key_code = static_cast<ui::KeyboardCode>(LOBYTE(vkey_and_modifiers)); | |
47 *necessary_modifiers = HIBYTE(vkey_and_modifiers); | |
48 } | |
49 return translated; | |
50 } | |
51 | |
52 } // namespace webdriver | |
OLD | NEW |