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 |