Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(353)

Side by Side Diff: blimp/engine/feature/engine_render_widget_feature.cc

Issue 1779673003: Added network components for blimp text input feature (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added unit tests and addressed comments Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "blimp/engine/feature/engine_render_widget_feature.h" 5 #include "blimp/engine/feature/engine_render_widget_feature.h"
6 6
7 #include "base/numerics/safe_conversions.h" 7 #include "base/numerics/safe_conversions.h"
8 #include "base/strings/utf_string_conversions.h"
8 #include "blimp/common/create_blimp_message.h" 9 #include "blimp/common/create_blimp_message.h"
9 #include "blimp/common/proto/blimp_message.pb.h" 10 #include "blimp/common/proto/blimp_message.pb.h"
10 #include "blimp/common/proto/compositor.pb.h" 11 #include "blimp/common/proto/compositor.pb.h"
11 #include "blimp/common/proto/input.pb.h" 12 #include "blimp/common/proto/input.pb.h"
12 #include "blimp/common/proto/render_widget.pb.h" 13 #include "blimp/common/proto/render_widget.pb.h"
14 #include "blimp/net/input_message_converter.h"
13 #include "content/public/browser/render_widget_host.h" 15 #include "content/public/browser/render_widget_host.h"
16 #include "content/public/browser/render_widget_host_view.h"
14 #include "net/base/net_errors.h" 17 #include "net/base/net_errors.h"
15 #include "third_party/WebKit/public/web/WebInputEvent.h" 18 #include "third_party/WebKit/public/web/WebInputEvent.h"
16 19
17 namespace blimp { 20 namespace blimp {
18 21
19 EngineRenderWidgetFeature::EngineRenderWidgetFeature() {} 22 EngineRenderWidgetFeature::EngineRenderWidgetFeature() {}
20 23
21 EngineRenderWidgetFeature::~EngineRenderWidgetFeature() {} 24 EngineRenderWidgetFeature::~EngineRenderWidgetFeature() {}
22 25
23 void EngineRenderWidgetFeature::set_render_widget_message_sender( 26 void EngineRenderWidgetFeature::set_render_widget_message_sender(
24 scoped_ptr<BlimpMessageProcessor> message_processor) { 27 scoped_ptr<BlimpMessageProcessor> message_processor) {
25 DCHECK(message_processor); 28 DCHECK(message_processor);
26 render_widget_message_sender_ = std::move(message_processor); 29 render_widget_message_sender_ = std::move(message_processor);
27 } 30 }
28 31
29 void EngineRenderWidgetFeature::set_input_message_sender( 32 void EngineRenderWidgetFeature::set_input_message_sender(
30 scoped_ptr<BlimpMessageProcessor> message_processor) { 33 scoped_ptr<BlimpMessageProcessor> message_processor) {
31 DCHECK(message_processor); 34 DCHECK(message_processor);
32 input_message_sender_ = std::move(message_processor); 35 input_message_sender_ = std::move(message_processor);
33 } 36 }
34 37
38 void EngineRenderWidgetFeature::set_ime_message_sender(
39 scoped_ptr<BlimpMessageProcessor> message_processor) {
40 DCHECK(message_processor);
41 ime_message_sender_ = std::move(message_processor);
42 }
43
35 void EngineRenderWidgetFeature::set_compositor_message_sender( 44 void EngineRenderWidgetFeature::set_compositor_message_sender(
36 scoped_ptr<BlimpMessageProcessor> message_processor) { 45 scoped_ptr<BlimpMessageProcessor> message_processor) {
37 DCHECK(message_processor); 46 DCHECK(message_processor);
38 compositor_message_sender_ = std::move(message_processor); 47 compositor_message_sender_ = std::move(message_processor);
39 } 48 }
40 49
41 void EngineRenderWidgetFeature::OnRenderWidgetCreated( 50 void EngineRenderWidgetFeature::OnRenderWidgetCreated(
42 const int tab_id, 51 const int tab_id,
43 content::RenderWidgetHost* render_widget_host) { 52 content::RenderWidgetHost* render_widget_host) {
44 DCHECK(render_widget_host); 53 DCHECK(render_widget_host);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
106 compositor_message->set_render_widget_id(render_widget_id); 115 compositor_message->set_render_widget_id(render_widget_id);
107 // TODO(dtrainor): Move the transport medium to std::string* and use 116 // TODO(dtrainor): Move the transport medium to std::string* and use
108 // set_allocated_payload. 117 // set_allocated_payload.
109 compositor_message->set_payload(message.data(), 118 compositor_message->set_payload(message.data(),
110 base::checked_cast<int>(message.size())); 119 base::checked_cast<int>(message.size()));
111 120
112 compositor_message_sender_->ProcessMessage(std::move(blimp_message), 121 compositor_message_sender_->ProcessMessage(std::move(blimp_message),
113 net::CompletionCallback()); 122 net::CompletionCallback());
114 } 123 }
115 124
125 void EngineRenderWidgetFeature::SendShowImeRequest(
126 const int tab_id,
127 content::RenderWidgetHost* render_widget_host,
128 const ui::TextInputClient* client) {
129 DCHECK(client);
130
131 ImeMessage* ime_message;
132 scoped_ptr<BlimpMessage> blimp_message =
133 CreateBlimpMessage(&ime_message, tab_id);
134
135 int render_widget_id = GetRenderWidgetId(tab_id, render_widget_host);
136 DCHECK_GT(render_widget_id, 0);
137 ime_message->set_render_widget_id(render_widget_id);
138 ime_message->set_type(ImeMessage::SHOW_IME);
139 ime_message->set_text_input_type(
140 InputMessageConverter::TextInputTypeToProto(client->GetTextInputType()));
141
142 gfx::Range text_range;
143 base::string16 existing_text;
144 client->GetTextRange(&text_range);
145 client->GetTextFromRange(text_range, &existing_text);
146 ime_message->set_ime_text(base::UTF16ToUTF8(existing_text));
147
148 ime_message_sender_->ProcessMessage(std::move(blimp_message),
149 net::CompletionCallback());
150 }
151
152 void EngineRenderWidgetFeature::SendHideImeRequest(
153 const int tab_id,
154 content::RenderWidgetHost* render_widget_host) {
155 ImeMessage* ime_message;
156 scoped_ptr<BlimpMessage> blimp_message =
157 CreateBlimpMessage(&ime_message, tab_id);
158
159 int render_widget_id = GetRenderWidgetId(tab_id, render_widget_host);
160 DCHECK_GT(render_widget_id, 0);
161 ime_message->set_render_widget_id(render_widget_id);
162 ime_message->set_type(ImeMessage::HIDE_IME);
163
164 ime_message_sender_->ProcessMessage(std::move(blimp_message),
165 net::CompletionCallback());
166 }
167
116 void EngineRenderWidgetFeature::SetDelegate( 168 void EngineRenderWidgetFeature::SetDelegate(
117 const int tab_id, 169 const int tab_id,
118 RenderWidgetMessageDelegate* delegate) { 170 RenderWidgetMessageDelegate* delegate) {
119 DCHECK(!FindDelegate(tab_id)); 171 DCHECK(!FindDelegate(tab_id));
120 delegates_[tab_id] = delegate; 172 delegates_[tab_id] = delegate;
121 } 173 }
122 174
123 void EngineRenderWidgetFeature::RemoveDelegate(const int tab_id) { 175 void EngineRenderWidgetFeature::RemoveDelegate(const int tab_id) {
124 DelegateMap::iterator it = delegates_.find(tab_id); 176 DelegateMap::iterator it = delegates_.find(tab_id);
125 if (it != delegates_.end()) 177 if (it != delegates_.end())
126 delegates_.erase(it); 178 delegates_.erase(it);
127 } 179 }
128 180
129 void EngineRenderWidgetFeature::ProcessMessage( 181 void EngineRenderWidgetFeature::ProcessMessage(
130 scoped_ptr<BlimpMessage> message, 182 scoped_ptr<BlimpMessage> message,
131 const net::CompletionCallback& callback) { 183 const net::CompletionCallback& callback) {
132 DCHECK(!callback.is_null()); 184 DCHECK(!callback.is_null());
133 DCHECK(message->type() == BlimpMessage::RENDER_WIDGET || 185 DCHECK(message->type() == BlimpMessage::RENDER_WIDGET ||
186 message->type() == BlimpMessage::IME ||
134 message->type() == BlimpMessage::INPUT || 187 message->type() == BlimpMessage::INPUT ||
135 message->type() == BlimpMessage::COMPOSITOR); 188 message->type() == BlimpMessage::COMPOSITOR);
136 189
137 int target_tab_id = message->target_tab_id(); 190 int target_tab_id = message->target_tab_id();
138 191
139 RenderWidgetMessageDelegate* delegate = FindDelegate(target_tab_id); 192 RenderWidgetMessageDelegate* delegate = FindDelegate(target_tab_id);
140 DCHECK(delegate); 193 DCHECK(delegate);
141 194
142 content::RenderWidgetHost* render_widget_host = nullptr; 195 content::RenderWidgetHost* render_widget_host = nullptr;
143 196
(...skipping 12 matching lines...) Expand all
156 render_widget_host = GetRenderWidgetHost(target_tab_id, 209 render_widget_host = GetRenderWidgetHost(target_tab_id,
157 message->compositor().render_widget_id()); 210 message->compositor().render_widget_id());
158 if (render_widget_host) { 211 if (render_widget_host) {
159 std::vector<uint8_t> payload(message->compositor().payload().size()); 212 std::vector<uint8_t> payload(message->compositor().payload().size());
160 memcpy(payload.data(), 213 memcpy(payload.data(),
161 message->compositor().payload().data(), 214 message->compositor().payload().data(),
162 payload.size()); 215 payload.size());
163 delegate->OnCompositorMessageReceived(render_widget_host, payload); 216 delegate->OnCompositorMessageReceived(render_widget_host, payload);
164 } 217 }
165 break; 218 break;
219 case BlimpMessage::IME:
220 DCHECK(message->ime().type() == ImeMessage::SET_TEXT);
221 render_widget_host =
222 GetRenderWidgetHost(target_tab_id, message->ime().render_widget_id());
223 if (render_widget_host && render_widget_host->GetView()) {
224 InsertTextFromIME(render_widget_host->GetView()->GetTextInputClient(),
haibinlu 2016/03/18 19:53:49 SetTextFromIME to be consistent with ImeMessage::S
shaktisahu 2016/03/22 19:44:20 Done.
225 message->ime().ime_text());
226 }
227 break;
166 default: 228 default:
167 NOTREACHED(); 229 NOTREACHED();
168 } 230 }
169 231
170 callback.Run(net::OK); 232 callback.Run(net::OK);
171 } 233 }
172 234
235 void EngineRenderWidgetFeature::InsertTextFromIME(ui::TextInputClient* client,
236 std::string text) {
237 if (client && client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) {
238 // Clear out any existing text first and then insert new text entered
239 // through IME.
240 gfx::Range text_range;
241 client->GetTextRange(&text_range);
242 client->ExtendSelectionAndDelete(text_range.length(), text_range.length());
243
244 client->InsertText(base::UTF8ToUTF16(text));
245 }
246 }
247
173 EngineRenderWidgetFeature::RenderWidgetMessageDelegate* 248 EngineRenderWidgetFeature::RenderWidgetMessageDelegate*
174 EngineRenderWidgetFeature::FindDelegate(const int tab_id) { 249 EngineRenderWidgetFeature::FindDelegate(const int tab_id) {
175 DelegateMap::const_iterator it = delegates_.find(tab_id); 250 DelegateMap::const_iterator it = delegates_.find(tab_id);
176 if (it != delegates_.end()) 251 if (it != delegates_.end())
177 return it->second; 252 return it->second;
178 return nullptr; 253 return nullptr;
179 } 254 }
180 255
181 int EngineRenderWidgetFeature::AddRenderWidget( 256 int EngineRenderWidgetFeature::AddRenderWidget(
182 const int tab_id, 257 const int tab_id,
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 336
262 IdToRenderWidgetMap::const_iterator widget_id_it = 337 IdToRenderWidgetMap::const_iterator widget_id_it =
263 id_to_render_widget->find(render_widget_id); 338 id_to_render_widget->find(render_widget_id);
264 if (widget_id_it == id_to_render_widget->end()) 339 if (widget_id_it == id_to_render_widget->end())
265 return nullptr; 340 return nullptr;
266 341
267 return widget_id_it->second; 342 return widget_id_it->second;
268 } 343 }
269 344
270 } // namespace blimp 345 } // namespace blimp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698