Index: ui/keyboard/keyboard_util.cc |
diff --git a/ui/keyboard/keyboard_util.cc b/ui/keyboard/keyboard_util.cc |
index 2054e6736ad52f8b662ecfb4ddae653d880d3ebb..9daabe2733bb9c3b23e2db6cf9e7db0e799c8855 100644 |
--- a/ui/keyboard/keyboard_util.cc |
+++ b/ui/keyboard/keyboard_util.cc |
@@ -17,6 +17,13 @@ |
#include "ui/base/ime/text_input_client.h" |
#include "ui/keyboard/keyboard_switches.h" |
+namespace { |
+ |
+const char kKeyDown[] ="keydown"; |
+const char kKeyUp[] = "keyup"; |
+ |
+} // namespace |
+ |
namespace keyboard { |
bool IsKeyboardEnabled() { |
@@ -28,28 +35,6 @@ bool InsertText(const base::string16& text, aura::RootWindow* root_window) { |
if (!root_window) |
return false; |
- // Handle Backspace and Enter specially: using TextInputClient::InsertText is |
- // very unreliable for these characters. |
- // TODO(bryeung): remove this code once virtual keyboards are able to send |
- // these events directly via the Input Injection API. |
- if (text.length() == 1) { |
- ui::KeyboardCode code = ui::VKEY_UNKNOWN; |
- if (text[0] == L'\n') |
- code = ui::VKEY_RETURN; |
- else if (text[0] == L'\b') |
- code = ui::VKEY_BACK; |
- |
- if (code != ui::VKEY_UNKNOWN) { |
- ui::KeyEvent press_event(ui::ET_KEY_PRESSED, code, 0, 0); |
- root_window->AsRootWindowHostDelegate()->OnHostKeyEvent(&press_event); |
- |
- ui::KeyEvent release_event(ui::ET_KEY_RELEASED, code, 0, 0); |
- root_window->AsRootWindowHostDelegate()->OnHostKeyEvent(&release_event); |
- |
- return true; |
- } |
- } |
- |
ui::InputMethod* input_method = root_window->GetProperty( |
aura::client::kRootWindowInputMethodKey); |
if (!input_method) |
@@ -103,6 +88,41 @@ bool MoveCursor(int swipe_direction, |
return true; |
} |
+bool SendKeyEvent(const std::string type, |
+ int key_value, |
+ int key_code, |
+ bool shift_modifier, |
+ aura::RootWindow* root_window) { |
+ ui::EventType event_type = ui::ET_UNKNOWN; |
+ if (type == kKeyDown) |
+ event_type = ui::ET_KEY_PRESSED; |
+ else if (type == kKeyUp) |
+ event_type = ui::ET_KEY_RELEASED; |
+ if (event_type == ui::ET_UNKNOWN) |
+ return false; |
+ |
+ int flags = ui::EF_NONE; |
+ if (shift_modifier) |
+ flags = ui::EF_SHIFT_DOWN; |
+ |
+ ui::KeyboardCode code = static_cast<ui::KeyboardCode>(key_code); |
+ |
+ ui::KeyEvent event(event_type, code, flags, false); |
+ event.set_character(key_value); |
+ event.set_unmodified_character(key_value); |
+ |
+ if (code != ui::VKEY_UNKNOWN) { |
+ root_window->AsRootWindowHostDelegate()->OnHostKeyEvent(&event); |
+ } else if (event_type == ui::ET_KEY_RELEASED) { |
+ // TODO(kevers): Fix key handling to support key_value when code is |
+ // VKEY_UNKNOWN. |
+ base::string16 text; |
+ text.push_back(static_cast<char16>(key_value)); |
+ InsertText(text, root_window); |
+ } |
+ return true; |
+} |
+ |
const GritResourceMap* GetKeyboardExtensionResources(size_t* size) { |
// This looks a lot like the contents of a resource map; however it is |
// necessary to have a custom path for the extension path, so the resource |