Index: chrome/test/webdriver/webdriver_key_converter.cc |
diff --git a/chrome/test/webdriver/webdriver_key_converter.cc b/chrome/test/webdriver/webdriver_key_converter.cc |
index f8f3db66b151514c54c2eb1ee4bfe934a8d291c8..b509f4a9626dcc49780721c1ed23369b116360fd 100644 |
--- a/chrome/test/webdriver/webdriver_key_converter.cc |
+++ b/chrome/test/webdriver/webdriver_key_converter.cc |
@@ -109,6 +109,39 @@ bool KeyCodeFromSpecialWebDriverKey(char16 key, ui::KeyboardCode* key_code) { |
return is_special_key; |
} |
+// Gets the key code associated with |key|, if it is a special shorthand key, |
+// Shorthand keys are common text equivalents for keys, such as the newline |
+// character, which is shorthand for the return key. Returns whether |key| is |
+// a shorthand key. If true, |key_code| will be set and |should_skip| will be |
+// set to whether the key should be skipped. |
+bool KeyCodeFromShorthandKey(char16 key_utf16, |
+ ui::KeyboardCode* key_code, |
+ bool* client_should_skip) { |
+ string16 key_str_utf16; |
+ key_str_utf16.push_back(key_utf16); |
+ std::string key_str_utf8 = UTF16ToUTF8(key_str_utf16); |
+ if (key_str_utf8.length() != 1) |
+ return false; |
+ bool should_skip = false; |
+ char key = key_str_utf8[0]; |
+ if (key == '\n') { |
Joe
2011/03/15 21:22:17
While \n is a newline for unix isn't \r\n a newlin
kkania
2011/03/18 21:45:12
Yes, I support \r\n and \n. I do this by skipping
|
+ *key_code = ui::VKEY_RETURN; |
+ } else if (key == '\t') { |
+ *key_code = ui::VKEY_TAB; |
+ } else if (key == '\b') { |
+ *key_code = ui::VKEY_BACK; |
+ } else if (key == ' ') { |
+ *key_code = ui::VKEY_SPACE; |
+ } else if (key == '\r') { |
+ *key_code = ui::VKEY_UNKNOWN; |
+ should_skip = true; |
+ } else { |
+ return false; |
+ } |
+ *client_should_skip = should_skip; |
+ return true; |
+} |
+ |
} // namespace |
namespace webdriver { |
@@ -189,28 +222,39 @@ void ConvertKeysToWebKeyEvents(const string16& client_keys, |
std::string unmodified_text, modified_text; |
int all_modifiers = sticky_modifiers; |
- bool is_special_key = KeyCodeFromSpecialWebDriverKey(key, &key_code); |
- if (is_special_key && key_code == ui::VKEY_UNKNOWN) { |
- LOG(ERROR) << "Unknown WebDriver key: " << static_cast<int>(key); |
- continue; |
- } |
- if (!is_special_key) { |
+ // Get the key code, text, and modifiers for the given key. |
+ bool should_skip = false; |
+ if (KeyCodeFromSpecialWebDriverKey(key, &key_code) || |
+ KeyCodeFromShorthandKey(key, &key_code, &should_skip)) { |
+ if (should_skip) |
+ continue; |
+ if (key_code == ui::VKEY_UNKNOWN) { |
+ LOG(ERROR) << "Unknown WebDriver key: " << static_cast<int>(key); |
Joe
2011/03/15 21:22:17
If an unknown key is requested shouldn't it break
kkania
2011/03/18 21:45:12
Done.
|
+ continue; |
+ } |
+ if (key_code == ui::VKEY_RETURN) { |
+ modified_text = unmodified_text = "\r"; |
+ } else { |
+ unmodified_text = ConvertKeyCodeToText(key_code, 0); |
+ modified_text = ConvertKeyCodeToText(key_code, all_modifiers); |
+ } |
+ } else { |
int necessary_modifiers = 0; |
ConvertCharToKeyCode(key, &key_code, &necessary_modifiers); |
all_modifiers |= necessary_modifiers; |
- } |
- if (key_code != ui::VKEY_UNKNOWN) { |
- unmodified_text = ConvertKeyCodeToText(key_code, 0); |
- modified_text = ConvertKeyCodeToText(key_code, all_modifiers); |
- } |
- if (!is_special_key && (unmodified_text.empty() || modified_text.empty())) { |
- // Do a best effort and use the raw key we were given. |
- LOG(WARNING) << "No translation for key code. Code point: " |
- << static_cast<int>(key); |
- if (unmodified_text.empty()) |
- unmodified_text = UTF16ToUTF8(keys.substr(i, 1)); |
- if (modified_text.empty()) |
- modified_text = UTF16ToUTF8(keys.substr(i, 1)); |
+ if (key_code != ui::VKEY_UNKNOWN) { |
+ unmodified_text = ConvertKeyCodeToText(key_code, 0); |
+ modified_text = ConvertKeyCodeToText(key_code, all_modifiers); |
+ } |
+ if (unmodified_text.empty() || modified_text.empty()) { |
+ // Do a best effort and use the raw key we were given. |
+ LOG(WARNING) << "No translation for key code. Code point: " |
+ << static_cast<int>(key); |
+ if (unmodified_text.empty()) |
+ unmodified_text = UTF16ToUTF8(keys.substr(i, 1)); |
+ if (modified_text.empty()) |
+ modified_text = UTF16ToUTF8(keys.substr(i, 1)); |
+ } |
} |
// Create the key events. |