12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list> 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <string> 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/status.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/ui_events.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/key_converter.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/test_util.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CheckEvents(const base::string16& keys, 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent expected_events[], 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool release_modifiers, 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t expected_size, 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_modifiers) { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int modifiers = 0; 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<KeyEvent> events; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kOk, ConvertKeysToKeyEvents(keys, release_modifiers, 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &modifiers, &events).code()); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_size, events.size()); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t i = 0; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<KeyEvent>::const_iterator it = events.begin(); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) while (i < expected_size && it != events.end()) { 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_events[i].type, it->type); 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_events[i].modifiers, it->modifiers); 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_events[i].modified_text, it->modified_text); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_events[i].unmodified_text, it->unmodified_text); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_events[i].key_code, it->key_code); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++i; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected_modifiers, modifiers); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CheckEventsReleaseModifiers(const base::string16& keys, 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent expected_events[], 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t expected_size) { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEvents(keys, expected_events, true /* release_modifier */, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_size, 0 /* expected_modifiers */); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckEventsReleaseModifiers(const std::string& keys, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent expected_events[], 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t expected_size) { 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CheckEventsReleaseModifiers(base::UTF8ToUTF16(keys), 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) expected_events, expected_size); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckNonShiftChar(ui::KeyboardCode key_code, char character) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int modifiers = 0; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string char_string; 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char_string.push_back(character); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<KeyEvent> events; 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kOk, ConvertKeysToKeyEvents(base::ASCIIToUTF16(char_string), 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true /* release_modifiers*/, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &modifiers, &events).code()); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(3u, events.size()) << "Char: " << character; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<KeyEvent>::const_iterator it = events.begin(); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(key_code, it->key_code) << "Char: " << character; 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it; // Move to the second event. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, it->modified_text.length()) << "Char: " << character; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, it->unmodified_text.length()) << "Char: " << character; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(character, it->modified_text[0]) << "Char: " << character; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(character, it->unmodified_text[0]) << "Char: " << character; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it; // Move to the third event. 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(key_code, it->key_code) << "Char: " << character; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckShiftChar(ui::KeyboardCode key_code, char character, char lower) { 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int modifiers = 0; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string char_string; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) char_string.push_back(character); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<KeyEvent> events; 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(kOk, ConvertKeysToKeyEvents(base::ASCIIToUTF16(char_string), 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true /* release_modifiers*/, 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &modifiers, &events).code()); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(5u, events.size()) << "Char: " << character; 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<KeyEvent>::const_iterator it = events.begin(); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ui::VKEY_SHIFT, it->key_code) << "Char: " << character; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it; // Move to second event. 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(key_code, it->key_code) << "Char: " << character; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it; // Move to third event. 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, it->modified_text.length()) << "Char: " << character; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, it->unmodified_text.length()) << "Char: " << character; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(character, it->modified_text[0]) << "Char: " << character; 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(lower, it->unmodified_text[0]) << "Char: " << character; 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it; // Move to fourth event. 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(key_code, it->key_code) << "Char: " << character; 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it; // Move to fifth event. 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(ui::VKEY_SHIFT, it->key_code) << "Char: " << character; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, SingleChar) { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_H, 0), 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("h", "h", 0), 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_H, 0)}; 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEventsReleaseModifiers("h", event_array, arraysize(event_array)); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, SingleNumber) { 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_1, 0), 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("1", "1", 0), 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_1, 0)}; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEventsReleaseModifiers("1", event_array, arraysize(event_array)); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, MultipleChars) { 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_H, 0), 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("h", "h", 0), 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_H, 0), 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_E, 0), 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("e", "e", 0), 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_E, 0), 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_Y, 0), 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("y", "y", 0), 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_Y, 0)}; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEventsReleaseModifiers("hey", event_array, arraysize(event_array)); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, WebDriverSpecialChar) { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_SPACE, 0), 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent(" ", " ", 0), 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_SPACE, 0)}; 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 keys; 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE00DU)); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEventsReleaseModifiers(keys, event_array, arraysize(event_array)); 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, WebDriverSpecialNonCharKey) { 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_F1, 0), 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_F1, 0)}; 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 keys; 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE031U)); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEventsReleaseModifiers(keys, event_array, arraysize(event_array)); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, FrenchKeyOnEnglishLayout) { 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_UNKNOWN, 0), 1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CreateCharEvent(base::WideToUTF8(L"\u00E9"), 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::WideToUTF8(L"\u00E9"), 0), 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_UNKNOWN, 0)}; 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CheckEventsReleaseModifiers(base::WideToUTF16(L"\u00E9"), 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_array, arraysize(event_array)); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, NeedsCtrlAndAlt) { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RestoreKeyboardLayoutOnDestruct restore; 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int ctrl_and_alt = kControlKeyModifierMask | kAltKeyModifierMask; 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_CONTROL, 0), 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_MENU, 0), 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_Q, ctrl_and_alt), 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("q", "@", ctrl_and_alt), 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_Q, ctrl_and_alt), 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_MENU, 0), 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_CONTROL, 0)}; 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(SwitchKeyboardLayout("00000407")); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEventsReleaseModifiers("@", event_array, arraysize(event_array)); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, UppercaseCharDoesShift) { 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_SHIFT, 0), 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_A, kShiftKeyModifierMask), 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("a", "A", kShiftKeyModifierMask), 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_A, kShiftKeyModifierMask), 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_SHIFT, 0)}; 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEventsReleaseModifiers("A", event_array, arraysize(event_array)); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, UppercaseSymbolCharDoesShift) { 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_SHIFT, 0), 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_1, kShiftKeyModifierMask), 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("1", "!", kShiftKeyModifierMask), 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_1, kShiftKeyModifierMask), 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_SHIFT, 0)}; 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEventsReleaseModifiers("!", event_array, arraysize(event_array)); 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, UppercaseCharUsesShiftOnlyIfNecessary) { 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_SHIFT, kShiftKeyModifierMask), 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_A, kShiftKeyModifierMask), 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("a", "A", kShiftKeyModifierMask), 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_A, kShiftKeyModifierMask), 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_B, kShiftKeyModifierMask), 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("b", "B", kShiftKeyModifierMask), 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_B, kShiftKeyModifierMask), 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_C, kShiftKeyModifierMask), 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("c", "C", kShiftKeyModifierMask), 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_C, kShiftKeyModifierMask), 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_SHIFT, 0)}; 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 keys; 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE008U)); 2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.append(base::UTF8ToUTF16("aBc")); 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEventsReleaseModifiers(keys, event_array, arraysize(event_array)); 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, ToggleModifiers) { 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_SHIFT, kShiftKeyModifierMask), 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_SHIFT, 0), 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_CONTROL, kControlKeyModifierMask), 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_CONTROL, 0), 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_MENU, kAltKeyModifierMask), 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_MENU, 0), 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_COMMAND, kMetaKeyModifierMask), 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_COMMAND, 0)}; 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 keys; 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE008U)); 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE008U)); 2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE009U)); 2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE009U)); 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE00AU)); 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE00AU)); 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE03DU)); 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE03DU)); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEventsReleaseModifiers(keys, event_array, arraysize(event_array)); 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_WIN) 2414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// https://code.google.com/p/chromedriver/issues/detail?id=546 2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_AllShorthandKeys DISABLED_AllShorthandKeys 2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#else 2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define MAYBE_AllShorthandKeys AllShorthandKeys 2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST(KeyConverter, MAYBE_AllShorthandKeys) { 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_RETURN, 0), 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("\r", "\r", 0), 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_RETURN, 0), 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_RETURN, 0), 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("\r", "\r", 0), 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_RETURN, 0), 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_TAB, 0), 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) || defined(OS_LINUX) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("\t", "\t", 0), 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_TAB, 0), 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_BACK, 0), 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) || defined(OS_LINUX) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent("\b", "\b", 0), 2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_BACK, 0), 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_SPACE, 0), 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateCharEvent(" ", " ", 0), 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_SPACE, 0)}; 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEventsReleaseModifiers("\n\r\n\t\b ", 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) event_array,arraysize(event_array)); 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fails on bots: crbug.com/174962 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AllEnglishKeyboardSymbols DISABLED_AllEnglishKeyboardSymbols 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 2762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AllEnglishKeyboardSymbols AllEnglishKeyboardSymbols 2772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 2782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, MAYBE_AllEnglishKeyboardSymbols) { 2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 keys; 2812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ui::KeyboardCode kSymbolKeyCodes[] = { 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::VKEY_OEM_3, 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::VKEY_OEM_MINUS, 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::VKEY_OEM_PLUS, 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::VKEY_OEM_4, 2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::VKEY_OEM_6, 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::VKEY_OEM_5, 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::VKEY_OEM_1, 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::VKEY_OEM_7, 2902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::VKEY_OEM_COMMA, 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::VKEY_OEM_PERIOD, 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::VKEY_OEM_2}; 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string kLowerSymbols = "`-=[]\\;',./"; 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string kUpperSymbols = "~_+{}|:\"<>?"; 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kLowerSymbols.length(); ++i) 2962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckNonShiftChar(kSymbolKeyCodes[i], kLowerSymbols[i]); 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kUpperSymbols.length(); ++i) 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckShiftChar(kSymbolKeyCodes[i], kUpperSymbols[i], kLowerSymbols[i]); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, AllEnglishKeyboardTextChars) { 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string kLowerChars = "0123456789abcdefghijklmnopqrstuvwxyz"; 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string kUpperChars = ")!@#$%^&*(ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kLowerChars.length(); ++i) { 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int offset = 0; 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i < 10) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offset = ui::VKEY_0; 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offset = ui::VKEY_0 + 7; 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::KeyboardCode expected_code = static_cast<ui::KeyboardCode>(offset + i); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckNonShiftChar(expected_code, kLowerChars[i]); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i < kUpperChars.length(); ++i) { 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int offset = 0; 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i < 10) 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offset = ui::VKEY_0; 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) offset = ui::VKEY_0 + 7; 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::KeyboardCode expected_code = static_cast<ui::KeyboardCode>(offset + i); 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckShiftChar(expected_code, kUpperChars[i], kLowerChars[i]); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if defined(OS_LINUX) || defined(OS_WIN) 3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// https://code.google.com/p/chromedriver/issues/detail?id=240 3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// https://code.google.com/p/chromedriver/issues/detail?id=546 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AllSpecialWebDriverKeysOnEnglishKeyboard \ 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISABLED_AllSpecialWebDriverKeysOnEnglishKeyboard 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_AllSpecialWebDriverKeysOnEnglishKeyboard \ 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AllSpecialWebDriverKeysOnEnglishKeyboard 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, MAYBE_AllSpecialWebDriverKeysOnEnglishKeyboard) { 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char kTextForKeys[] = { 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA) || defined(OS_LINUX) 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 0, 0, '\b', '\t', 0, '\r', '\r', 0, 0, 0, 0, 0x1B, 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x7F, ';', '=', 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 0, 0, 0, 0, 0, '\r', '\r', 0, 0, 0, 0, 0, 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ' ', 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ';', '=', 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) '*', '+', ',', '-', '.', '/'}; 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (size_t i = 0; i <= 0x3D; ++i) { 3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i > 0x29 && i < 0x31) 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) continue; 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 keys; 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int modifiers = 0; 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) keys.push_back(0xE000U + i); 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<KeyEvent> events; 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i == 1) { 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_NE(kOk, ConvertKeysToKeyEvents(keys, 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true /* release_modifiers*/, 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &modifiers, &events).code()) 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "Index: " << i; 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, events.size()) << "Index: " << i; 3582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kOk, ConvertKeysToKeyEvents(keys, 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) true /* release_modifiers */, 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &modifiers, &events).code()) 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "Index: " << i; 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (i == 0) { 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0u, events.size()) << "Index: " << i; 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (i >= arraysize(kTextForKeys) || kTextForKeys[i] == 0) { 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(2u, events.size()) << "Index: " << i; 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(3u, events.size()) << "Index: " << i; 3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<KeyEvent>::const_iterator it = events.begin(); 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++it; // Move to the second event. 3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_EQ(1u, it->unmodified_text.length()) << "Index: " << i; 3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(kTextForKeys[i], it->unmodified_text[0]) 3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << "Index: " << i; 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, ModifiersState) { 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int shift_key_modifier = kShiftKeyModifierMask; 3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int control_key_modifier = shift_key_modifier | kControlKeyModifierMask; 3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int alt_key_modifier = control_key_modifier | kAltKeyModifierMask; 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int meta_key_modifier = alt_key_modifier | kMetaKeyModifierMask; 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_SHIFT, shift_key_modifier), 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_CONTROL, control_key_modifier), 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_MENU, alt_key_modifier), 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_COMMAND, meta_key_modifier)}; 3895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 keys; 3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE008U)); 3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE009U)); 3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE00AU)); 3935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE03DU)); 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEvents(keys, event_array, false /* release_modifiers */, 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arraysize(event_array), meta_key_modifier); 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeyConverter, ReleaseModifiers) { 4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) KeyEvent event_array[] = { 4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_SHIFT, kShiftKeyModifierMask), 4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyDownEvent(ui::VKEY_CONTROL, 4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kShiftKeyModifierMask | kControlKeyModifierMask), 4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_SHIFT, 0), 4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateKeyUpEvent(ui::VKEY_CONTROL, 0)}; 4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 keys; 4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE008U)); 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) keys.push_back(static_cast<base::char16>(0xE009U)); 4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckEvents(keys, event_array, true /* release_modifiers */, 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) arraysize(event_array), 0); 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 413