Index: chrome/test/chromedriver/keycode_text_conversion_ozone.cc |
diff --git a/chrome/test/chromedriver/keycode_text_conversion_ozone.cc b/chrome/test/chromedriver/keycode_text_conversion_ozone.cc |
index fa47f9ad1f908635ed52adb9afc2305eeb06dbda..4e7693ac609b0160943bcf5e1b14f77d03625a2f 100644 |
--- a/chrome/test/chromedriver/keycode_text_conversion_ozone.cc |
+++ b/chrome/test/chromedriver/keycode_text_conversion_ozone.cc |
@@ -3,25 +3,92 @@ |
// found in the LICENSE file. |
#include "base/logging.h" |
+#include "base/strings/string16.h" |
+#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
#include "chrome/test/chromedriver/chrome/ui_events.h" |
#include "chrome/test/chromedriver/keycode_text_conversion.h" |
+#include "ui/events/event_constants.h" |
+#include "ui/events/keycodes/dom3/dom_code.h" |
+#include "ui/events/keycodes/keyboard_code_conversion.h" |
+#include "ui/events/ozone/layout/keyboard_layout_engine.h" |
+#include "ui/events/ozone/layout/keyboard_layout_engine_manager.h" |
-// TODO(arunprasadr) Implement these functions properly for ozone platforms. |
-bool ConvertKeyCodeToText( |
- ui::KeyboardCode key_code, int modifiers, std::string* text, |
- std::string* error_msg) { |
- *text = std::string(); |
- *error_msg = std::string("Not Implemented"); |
- NOTIMPLEMENTED(); |
- return false; |
+bool ConvertKeyCodeToText(ui::KeyboardCode key_code, |
+ int modifiers, |
+ std::string* text, |
+ std::string* error_msg) { |
+ ui::KeyboardLayoutEngine* keyboard_layout_engine = |
+ ui::KeyboardLayoutEngineManager::GetKeyboardLayoutEngine(); |
+ ui::DomCode dom_code = ui::UsLayoutKeyboardCodeToDomCode(key_code); |
+ int event_flags = ui::EF_NONE; |
+ |
+ // Chrome OS keyboards don't have meta or num lock keys, so these modifier |
+ // masks are ignored. Only handle alt, ctrl and shift. |
+ if (modifiers & kAltKeyModifierMask) |
+ event_flags |= ui::EF_ALT_DOWN; |
+ if (modifiers & kControlKeyModifierMask) |
+ event_flags |= ui::EF_CONTROL_DOWN; |
+ if (modifiers & kShiftKeyModifierMask) |
+ event_flags |= ui::EF_SHIFT_DOWN; |
+ |
+ ui::DomKey dom_key_ignored; |
+ base::char16 str[2] = {'\0'}; |
+ ui::KeyboardCode key_code_ignored; |
+ uint32 platform_keycode_ignored; |
+ |
+ if (!keyboard_layout_engine->Lookup(dom_code, event_flags, &dom_key_ignored, |
+ &str[0], &key_code_ignored, |
+ &platform_keycode_ignored)) { |
+ // Key codes like ui::VKEY_UNKNOWN need to be mapped to the empty string, so |
+ // even if the lookup fails we still need to return true here. |
+ *text = std::string(); |
+ return true; |
+ } |
+ |
+ if (!base::UTF16ToUTF8(str, base::c16len(str), text)) { |
+ *error_msg = base::StringPrintf( |
+ "unicode conversion failed for keycode %d with modifiers 0x%x", |
+ key_code, modifiers); |
+ return false; |
+ } |
+ |
+ return true; |
} |
-bool ConvertCharToKeyCode( |
- base::char16 key, ui::KeyboardCode* key_code, int *necessary_modifiers, |
- std::string* error_msg) { |
- *error_msg = std::string("Not Implemented"); |
- *necessary_modifiers = 0; |
- NOTIMPLEMENTED(); |
- return false; |
+bool ConvertCharToKeyCode(base::char16 key, |
+ ui::KeyboardCode* key_code, |
+ int* necessary_modifiers, |
+ std::string* error_msg) { |
+ base::string16 key_string; |
+ key_string.push_back(key); |
+ std::string key_string_utf8 = base::UTF16ToUTF8(key_string); |
+ bool found_code = false; |
+ *error_msg = std::string(); |
+ // There doesn't seem to be a way to get a CrOS key code for a given unicode |
+ // character. So here we check every key code to see if it produces the |
+ // right character, as we do on Mac (see keycode_text_conversion_mac.mm). |
+ for (int i = 0; i < 256; ++i) { |
+ ui::KeyboardCode code = static_cast<ui::KeyboardCode>(i); |
+ // Skip the numpad keys. |
+ if (code >= ui::VKEY_NUMPAD0 && code <= ui::VKEY_DIVIDE) |
+ continue; |
+ std::string key_string; |
+ if (!ConvertKeyCodeToText(code, 0, &key_string, error_msg)) |
+ return false; |
+ found_code = key_string_utf8 == key_string; |
+ std::string key_string_utf8_tmp; |
+ if (!ConvertKeyCodeToText(code, kShiftKeyModifierMask, &key_string_utf8_tmp, |
+ error_msg)) |
+ return false; |
+ if (!found_code && key_string_utf8 == key_string_utf8_tmp) { |
+ *necessary_modifiers = kShiftKeyModifierMask; |
+ found_code = true; |
+ } |
+ if (found_code) { |
+ *key_code = code; |
+ break; |
+ } |
+ } |
+ return found_code; |
} |