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 <string> 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string16.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/chrome/ui_events.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/keycode_text_conversion.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/chromedriver/test_util.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 13d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void CheckCharToKeyCode16(base::char16 character, ui::KeyboardCode key_code, 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int modifiers) { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::KeyboardCode actual_key_code = ui::VKEY_UNKNOWN; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int actual_modifiers = 0; 215e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) std::string error_msg; 225e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_TRUE(ConvertCharToKeyCode( 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) character, &actual_key_code, &actual_modifiers, &error_msg)); 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(key_code, actual_key_code) << "Char: " << character; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(modifiers, actual_modifiers) << "Char: " << character; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void CheckCharToKeyCode(char character, ui::KeyboardCode key_code, 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int modifiers) { 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CheckCharToKeyCode16(base::UTF8ToUTF16(std::string(1, character))[0], 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) key_code, modifiers); 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void CheckCharToKeyCode(wchar_t character, ui::KeyboardCode key_code, 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int modifiers) { 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CheckCharToKeyCode16(base::WideToUTF16(std::wstring(1, character))[0], 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) key_code, modifiers); 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void CheckCantConvertChar(wchar_t character) { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::wstring character_string; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) character_string.push_back(character); 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::char16 character_utf16 = base::WideToUTF16(character_string)[0]; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ui::KeyboardCode actual_key_code = ui::VKEY_UNKNOWN; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int actual_modifiers = 0; 485e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) std::string error_msg; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(ConvertCharToKeyCode( 505e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) character_utf16, &actual_key_code, &actual_modifiers, &error_msg)); 515e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)} 525e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) 535e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)std::string ConvertKeyCodeToTextNoError(ui::KeyboardCode key_code, 545e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) int modifiers) { 555e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) std::string error_msg; 565e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) std::string text; 575e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_TRUE(ConvertKeyCodeToText(key_code, modifiers, &text, &error_msg)); 585e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) return text; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fails on bots: crbug.com/174962 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_KeyCodeToText DISABLED_KeyCodeToText 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_KeyCodeToText KeyCodeToText 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeycodeTextConversionTest, MAYBE_KeyCodeToText) { 715e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("a", ConvertKeyCodeToTextNoError(ui::VKEY_A, 0)); 725e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("A", 735e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) ConvertKeyCodeToTextNoError(ui::VKEY_A, kShiftKeyModifierMask)); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 755e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("1", ConvertKeyCodeToTextNoError(ui::VKEY_1, 0)); 765e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("!", 775e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) ConvertKeyCodeToTextNoError(ui::VKEY_1, kShiftKeyModifierMask)); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 795e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ(",", ConvertKeyCodeToTextNoError(ui::VKEY_OEM_COMMA, 0)); 805e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("<", ConvertKeyCodeToTextNoError( 815e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) ui::VKEY_OEM_COMMA, kShiftKeyModifierMask)); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 835e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("", ConvertKeyCodeToTextNoError(ui::VKEY_F1, 0)); 845e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("", 855e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) ConvertKeyCodeToTextNoError(ui::VKEY_F1, kShiftKeyModifierMask)); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 875e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("/", ConvertKeyCodeToTextNoError(ui::VKEY_DIVIDE, 0)); 885e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("/", 895e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) ConvertKeyCodeToTextNoError(ui::VKEY_DIVIDE, kShiftKeyModifierMask)); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 915e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("", ConvertKeyCodeToTextNoError(ui::VKEY_SHIFT, 0)); 925e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("", 935e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) ConvertKeyCodeToTextNoError(ui::VKEY_SHIFT, kShiftKeyModifierMask)); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fails on bots: crbug.com/174962 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_CharToKeyCode DISABLED_CharToKeyCode 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_CharToKeyCode CharToKeyCode 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeycodeTextConversionTest, MAYBE_CharToKeyCode) { 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCharToKeyCode('a', ui::VKEY_A, 0); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCharToKeyCode('A', ui::VKEY_A, kShiftKeyModifierMask); 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCharToKeyCode('1', ui::VKEY_1, 0); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCharToKeyCode('!', ui::VKEY_1, kShiftKeyModifierMask); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCharToKeyCode(',', ui::VKEY_OEM_COMMA, 0); 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCharToKeyCode('<', ui::VKEY_OEM_COMMA, kShiftKeyModifierMask); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCharToKeyCode('/', ui::VKEY_OEM_2, 0); 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCharToKeyCode('?', ui::VKEY_OEM_2, kShiftKeyModifierMask); 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCantConvertChar(L'\u00E9'); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCantConvertChar(L'\u2159'); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) || defined(OS_MACOSX) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Not implemented on Linux. 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fails if German layout is not installed on Mac. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_NonShiftModifiers DISABLED_NonShiftModifiers 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_NonShiftModifiers NonShiftModifiers 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeycodeTextConversionTest, MAYBE_NonShiftModifiers) { 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RestoreKeyboardLayoutOnDestruct restore; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(SwitchKeyboardLayout("00000407")); // german 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int ctrl_and_alt = kControlKeyModifierMask | kAltKeyModifierMask; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCharToKeyCode('@', ui::VKEY_Q, ctrl_and_alt); 1345e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("@", ConvertKeyCodeToTextNoError(ui::VKEY_Q, ctrl_and_alt)); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_MACOSX) 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(SwitchKeyboardLayout("com.apple.keylayout.German")); 1375e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("@", ConvertKeyCodeToTextNoError( 1385e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) ui::VKEY_L, kAltKeyModifierMask)); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_LINUX) || defined(OS_MACOSX) 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Not implemented on Linux. 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Fails if German layout is not installed on Mac. 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_NonEnglish DISABLED_NonEnglish 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define MAYBE_NonEnglish NonEnglish 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(KeycodeTextConversionTest, MAYBE_NonEnglish) { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RestoreKeyboardLayoutOnDestruct restore; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_WIN) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(SwitchKeyboardLayout("00000408")); // greek 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCharToKeyCode(';', ui::VKEY_Q, 0); 1555e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ(";", ConvertKeyCodeToTextNoError(ui::VKEY_Q, 0)); 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Regression test for chromedriver bug #405. 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ASSERT_TRUE(SwitchKeyboardLayout("00000419")); // russian 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CheckCharToKeyCode(L'\u0438', ui::VKEY_B, 0); 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ(base::UTF16ToUTF8(L"\u0438"), 1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ConvertKeyCodeToTextNoError(ui::VKEY_B, 0)); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#elif defined(OS_MACOSX) 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(SwitchKeyboardLayout("com.apple.keylayout.German")); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CheckCharToKeyCode('z', ui::VKEY_Y, 0); 1645e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles) EXPECT_EQ("z", ConvertKeyCodeToTextNoError(ui::VKEY_Y, 0)); 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 167