diff options
author | kkania@chromium.org <kkania@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-16 01:36:48 +0000 |
---|---|---|
committer | kkania@chromium.org <kkania@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-02-16 01:36:48 +0000 |
commit | 487d1730d922bf933e332b997fda6796c3b0da5b (patch) | |
tree | 6263cc6121b094d0e1f18ef7d48d378309111df2 /chrome/test/webdriver | |
parent | 7ba168d309dd2777cd07bbbd3c024c26265f79ba (diff) | |
download | chromium_src-487d1730d922bf933e332b997fda6796c3b0da5b.zip chromium_src-487d1730d922bf933e332b997fda6796c3b0da5b.tar.gz chromium_src-487d1730d922bf933e332b997fda6796c3b0da5b.tar.bz2 |
Implement keycode/text conversion for ChromeDriver on Linux, which is needed
for the Value command.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/6526025
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@75047 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/test/webdriver')
-rw-r--r-- | chrome/test/webdriver/WEBDRIVER_TESTS | 4 | ||||
-rw-r--r-- | chrome/test/webdriver/webdriver_key_converter.cc | 38 | ||||
-rw-r--r-- | chrome/test/webdriver/webdriver_key_converter_unittest.cc | 18 |
3 files changed, 59 insertions, 1 deletions
diff --git a/chrome/test/webdriver/WEBDRIVER_TESTS b/chrome/test/webdriver/WEBDRIVER_TESTS index bc5a697..47f4373 100644 --- a/chrome/test/webdriver/WEBDRIVER_TESTS +++ b/chrome/test/webdriver/WEBDRIVER_TESTS @@ -89,6 +89,8 @@ ], 'linux': [ - + 'typing_tests', + # needs clear command + '-typing_tests.TypingTests.testNumberpadAndFunctionKeys', ], } diff --git a/chrome/test/webdriver/webdriver_key_converter.cc b/chrome/test/webdriver/webdriver_key_converter.cc index d78c1e2..39c06b3 100644 --- a/chrome/test/webdriver/webdriver_key_converter.cc +++ b/chrome/test/webdriver/webdriver_key_converter.cc @@ -4,9 +4,17 @@ #include "chrome/test/webdriver/webdriver_key_converter.h" +#include <cctype> + +#include "base/string_util.h" #include "base/utf_string_conversions.h" #include "chrome/common/automation_constants.h" +#if defined(OS_LINUX) +#include <gdk/gdk.h> +#include "ui/base/keycodes/keyboard_code_conversion_gtk.h" +#endif + namespace { // TODO(kkania): Use this in KeyMap. @@ -121,6 +129,22 @@ bool ConvertCharToKeyCode( *necessary_modifiers = HIBYTE(vkey_and_modifiers); } return translated; +#elif defined(OS_LINUX) + guint gdk_key_code = gdk_unicode_to_keyval(key); + if (!gdk_key_code) + return false; + + string16 key_string; + key_string.push_back(key); + const std::string kNeedsShiftSymbols= "!@#$%^&*()_+~{}|\":<>?"; + bool is_special_symbol = IsStringASCII(key_string) && + kNeedsShiftSymbols.find(static_cast<char>(gdk_key_code)) != + std::string::npos; + + if (is_special_symbol || key != std::towlower(key)) + *necessary_modifiers = automation::kShiftKeyMask; + *key_code = ui::WindowsKeyCodeForGdkKeyCode(gdk_key_code); + return true; #else // TODO(kkania): Implement. return false; @@ -145,6 +169,20 @@ std::string ConvertKeyCodeToText(ui::KeyboardCode key_code, int modifiers) { WideToUTF8(chars, code, &text); return text; } +#elif defined(OS_LINUX) + // |gdk_keyval_to_upper| does not convert some keys like '1' to '!', so + // provide |ui::GdkKeyCodeForWindowsKeyCode| with our shift state as well, + // which will do basic conversions like it for us. + guint gdk_key_code = ui::GdkKeyCodeForWindowsKeyCode( + key_code, modifiers & automation::kShiftKeyMask); + if (modifiers & automation::kShiftKeyMask) + gdk_key_code = gdk_keyval_to_upper(gdk_key_code); + guint32 unicode_char = gdk_keyval_to_unicode(gdk_key_code); + if (!unicode_char) + return ""; + string16 text; + text.push_back(unicode_char); + return UTF16ToUTF8(text); #else // TODO(kkania): Implement return ""; diff --git a/chrome/test/webdriver/webdriver_key_converter_unittest.cc b/chrome/test/webdriver/webdriver_key_converter_unittest.cc index 47a3afb..ccb0440 100644 --- a/chrome/test/webdriver/webdriver_key_converter_unittest.cc +++ b/chrome/test/webdriver/webdriver_key_converter_unittest.cc @@ -42,6 +42,14 @@ TEST(WebDriverKeyConverter, SingleChar) { CheckEvents("h", event_array, arraysize(event_array)); } +TEST(WebDriverKeyConverter, SingleNumber) { + WebKeyEvent event_array[] = { + CreateKeyDownEvent(ui::VKEY_1, 0), + CreateCharEvent("1", "1", 0), + CreateKeyUpEvent(ui::VKEY_1, 0)}; + CheckEvents("1", event_array, arraysize(event_array)); +} + TEST(WebDriverKeyConverter, MultipleChars) { WebKeyEvent event_array[] = { CreateKeyDownEvent(ui::VKEY_H, 0), @@ -107,6 +115,16 @@ TEST(WebDriverKeyConverter, UppercaseCharDoesShift) { CheckEvents("A", event_array, arraysize(event_array)); } +TEST(WebDriverKeyConverter, UppercaseSymbolCharDoesShift) { + WebKeyEvent event_array[] = { + CreateKeyDownEvent(ui::VKEY_SHIFT, 0), + CreateKeyDownEvent(ui::VKEY_1, automation::kShiftKeyMask), + CreateCharEvent("1", "!", automation::kShiftKeyMask), + CreateKeyUpEvent(ui::VKEY_1, automation::kShiftKeyMask), + CreateKeyUpEvent(ui::VKEY_SHIFT, 0)}; + CheckEvents("!", event_array, arraysize(event_array)); +} + TEST(WebDriverKeyConverter, UppercaseCharUsesShiftOnlyIfNecessary) { WebKeyEvent event_array[] = { CreateKeyDownEvent(ui::VKEY_SHIFT, automation::kShiftKeyMask), |