// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "ui/keyboard/keyboard_ui_handler.h" #include #include "base/bind.h" #include "base/logging.h" #include "base/values.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_view.h" #include "content/public/browser/web_ui.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/root_window.h" #include "ui/aura/window.h" #include "ui/base/ime/input_method.h" #include "ui/base/ime/text_input_client.h" #include "ui/keyboard/keyboard_controller.h" #include "ui/keyboard/keyboard_util.h" namespace keyboard { KeyboardUIHandler::KeyboardUIHandler() { } KeyboardUIHandler::~KeyboardUIHandler() { } void KeyboardUIHandler::RegisterMessages() { web_ui()->RegisterMessageCallback( "insertText", base::Bind(&KeyboardUIHandler::HandleInsertTextMessage, base::Unretained(this))); web_ui()->RegisterMessageCallback( "getInputContext", base::Bind(&KeyboardUIHandler::HandleGetInputContextMessage, base::Unretained(this))); web_ui()->RegisterMessageCallback( "sendKeyEvent", base::Bind(&KeyboardUIHandler::HandleSendKeyEventMessage, base::Unretained(this))); web_ui()->RegisterMessageCallback( "hideKeyboard", base::Bind(&KeyboardUIHandler::HandleHideKeyboard, base::Unretained(this))); } void KeyboardUIHandler::HandleInsertTextMessage(const base::ListValue* args) { string16 text; if (!args->GetString(0, &text)) { LOG(ERROR) << "insertText failed: bad argument"; return; } aura::RootWindow* root_window = web_ui()->GetWebContents()->GetView()->GetNativeView()->GetRootWindow(); if (!root_window) { LOG(ERROR) << "insertText failed: no root window"; return; } if (!keyboard::InsertText(text, root_window)) LOG(ERROR) << "insertText failed"; } void KeyboardUIHandler::HandleGetInputContextMessage( const base::ListValue* args) { int request_id; if (!args->GetInteger(0, &request_id)) { LOG(ERROR) << "getInputContext failed: bad argument"; return; } base::DictionaryValue results; results.SetInteger("requestId", request_id); aura::RootWindow* root_window = web_ui()->GetWebContents()->GetView()->GetNativeView()->GetRootWindow(); if (!root_window) { LOG(ERROR) << "getInputContext failed: no root window"; return; } ui::InputMethod* input_method = root_window->GetProperty(aura::client::kRootWindowInputMethodKey); if (!input_method) { LOG(ERROR) << "getInputContext failed: no input method"; return; } ui::TextInputClient* tic = input_method->GetTextInputClient(); results.SetInteger("type", tic ? tic->GetTextInputType() : ui::TEXT_INPUT_TYPE_NONE); web_ui()->CallJavascriptFunction("GetInputContextCallback", results); } void KeyboardUIHandler::HandleSendKeyEventMessage( const base::ListValue* args) { const base::DictionaryValue* params = NULL; std::string type; int char_value; int key_code; bool shift_modifier; if (!args->GetDictionary(0, ¶ms) || !params->GetString("type", &type) || !params->GetInteger("charValue", &char_value) || !params->GetInteger("keyCode", &key_code) || !params->GetBoolean("shiftKey", &shift_modifier)) { LOG(ERROR) << "SendKeyEvent failed: bad argument"; return; } aura::RootWindow* root_window = web_ui()->GetWebContents()->GetView()->GetNativeView()->GetRootWindow(); if (!root_window) { LOG(ERROR) << "sendKeyEvent failed: no root window"; return; } if (!keyboard::SendKeyEvent(type, char_value, key_code, shift_modifier, root_window)) { LOG(ERROR) << "sendKeyEvent failed"; } } void KeyboardUIHandler::HandleHideKeyboard(const base::ListValue* args) { // TODO(stevet): Call into the keyboard controller to hide the keyboard // directly. NOTIMPLEMENTED(); return; } } // namespace keyboard