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/root_window.h" 17 #include "ui/aura/window.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 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::WindowEventDispatcher* dispatcher = 119 web_ui()->GetWebContents()->GetView()->GetNativeView()->GetDispatcher(); 120 if (!dispatcher) { 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 dispatcher)) { 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 143