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