Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3399)

Unified Diff: chrome/test/chromedriver/keycode_text_conversion_ozone.cc

Issue 1135203005: Implement keycode text conversion functions for Ozone. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/chrome_tests.gypi ('k') | chrome/test/chromedriver/keycode_text_conversion_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « chrome/chrome_tests.gypi ('k') | chrome/test/chromedriver/keycode_text_conversion_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698