| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "ui/keyboard/keyboard_ui_handler.h" | |
| 6 | |
| 7 #include <string> | |
| 8 | |
| 9 #include "base/bind.h" | |
| 10 #include "base/logging.h" | |
| 11 #include "base/values.h" | |
| 12 #include "content/public/browser/web_contents.h" | |
| 13 #include "content/public/browser/web_contents_view.h" | |
| 14 #include "content/public/browser/web_ui.h" | |
| 15 #include "ui/aura/client/aura_constants.h" | |
| 16 #include "ui/aura/window.h" | |
| 17 #include "ui/aura/window_tree_host.h" | |
| 18 #include "ui/base/ime/input_method.h" | |
| 19 #include "ui/base/ime/text_input_client.h" | |
| 20 #include "ui/keyboard/keyboard_controller.h" | |
| 21 #include "ui/keyboard/keyboard_util.h" | |
| 22 | |
| 23 namespace keyboard { | |
| 24 | |
| 25 KeyboardUIHandler::KeyboardUIHandler() { | |
| 26 } | |
| 27 | |
| 28 KeyboardUIHandler::~KeyboardUIHandler() { | |
| 29 } | |
| 30 | |
| 31 void KeyboardUIHandler::RegisterMessages() { | |
| 32 web_ui()->RegisterMessageCallback( | |
| 33 "insertText", | |
| 34 base::Bind(&KeyboardUIHandler::HandleInsertTextMessage, | |
| 35 base::Unretained(this))); | |
| 36 web_ui()->RegisterMessageCallback( | |
| 37 "getInputContext", | |
| 38 base::Bind(&KeyboardUIHandler::HandleGetInputContextMessage, | |
| 39 base::Unretained(this))); | |
| 40 web_ui()->RegisterMessageCallback( | |
| 41 "sendKeyEvent", | |
| 42 base::Bind(&KeyboardUIHandler::HandleSendKeyEventMessage, | |
| 43 base::Unretained(this))); | |
| 44 web_ui()->RegisterMessageCallback( | |
| 45 "hideKeyboard", | |
| 46 base::Bind(&KeyboardUIHandler::HandleHideKeyboard, | |
| 47 base::Unretained(this))); | |
| 48 } | |
| 49 | |
| 50 void KeyboardUIHandler::HandleInsertTextMessage(const base::ListValue* args) { | |
| 51 base::string16 text; | |
| 52 if (!args->GetString(0, &text)) { | |
| 53 LOG(ERROR) << "insertText failed: bad argument"; | |
| 54 return; | |
| 55 } | |
| 56 | |
| 57 aura::Window* root_window = | |
| 58 web_ui()->GetWebContents()->GetView()->GetNativeView()->GetRootWindow(); | |
| 59 if (!root_window) { | |
| 60 LOG(ERROR) << "insertText failed: no root window"; | |
| 61 return; | |
| 62 } | |
| 63 | |
| 64 if (!keyboard::InsertText(text, root_window)) | |
| 65 LOG(ERROR) << "insertText failed"; | |
| 66 } | |
| 67 | |
| 68 void KeyboardUIHandler::HandleGetInputContextMessage( | |
| 69 const base::ListValue* args) { | |
| 70 int request_id; | |
| 71 if (!args->GetInteger(0, &request_id)) { | |
| 72 LOG(ERROR) << "getInputContext failed: bad argument"; | |
| 73 return; | |
| 74 } | |
| 75 base::DictionaryValue results; | |
| 76 results.SetInteger("requestId", request_id); | |
| 77 | |
| 78 aura::Window* root_window = | |
| 79 web_ui()->GetWebContents()->GetView()->GetNativeView()->GetRootWindow(); | |
| 80 if (!root_window) { | |
| 81 LOG(ERROR) << "getInputContext failed: no root window"; | |
| 82 return; | |
| 83 } | |
| 84 ui::InputMethod* input_method = | |
| 85 root_window->GetProperty(aura::client::kRootWindowInputMethodKey); | |
| 86 if (!input_method) { | |
| 87 LOG(ERROR) << "getInputContext failed: no input method"; | |
| 88 return; | |
| 89 } | |
| 90 | |
| 91 ui::TextInputClient* tic = input_method->GetTextInputClient(); | |
| 92 results.SetInteger("type", | |
| 93 tic ? tic->GetTextInputType() : ui::TEXT_INPUT_TYPE_NONE); | |
| 94 | |
| 95 web_ui()->CallJavascriptFunction("GetInputContextCallback", | |
| 96 results); | |
| 97 } | |
| 98 | |
| 99 void KeyboardUIHandler::HandleSendKeyEventMessage( | |
| 100 const base::ListValue* args) { | |
| 101 const base::DictionaryValue* params = NULL; | |
| 102 std::string type; | |
| 103 int char_value; | |
| 104 int key_code; | |
| 105 std::string key_name; | |
| 106 int modifiers; | |
| 107 | |
| 108 if (!args->GetDictionary(0, ¶ms) || | |
| 109 !params->GetString("type", &type) || | |
| 110 !params->GetInteger("charValue", &char_value) || | |
| 111 !params->GetInteger("keyCode", &key_code) || | |
| 112 !params->GetString("keyName", &key_name) || | |
| 113 !params->GetInteger("modifiers", &modifiers)) { | |
| 114 LOG(ERROR) << "SendKeyEvent failed: bad argument"; | |
| 115 return; | |
| 116 } | |
| 117 | |
| 118 aura::WindowTreeHost* host = | |
| 119 web_ui()->GetWebContents()->GetView()->GetNativeView()->GetHost(); | |
| 120 if (!host) { | |
| 121 LOG(ERROR) << "sendKeyEvent failed: no dispatcher"; | |
| 122 return; | |
| 123 } | |
| 124 | |
| 125 if (!keyboard::SendKeyEvent(type, | |
| 126 char_value, | |
| 127 key_code, | |
| 128 key_name, | |
| 129 modifiers, | |
| 130 host)) { | |
| 131 LOG(ERROR) << "sendKeyEvent failed"; | |
| 132 } | |
| 133 } | |
| 134 | |
| 135 void KeyboardUIHandler::HandleHideKeyboard(const base::ListValue* args) { | |
| 136 // TODO(stevet): Call into the keyboard controller to hide the keyboard | |
| 137 // directly. | |
| 138 NOTIMPLEMENTED(); | |
| 139 return; | |
| 140 } | |
| 141 | |
| 142 } // namespace keyboard | |
| OLD | NEW |