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

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 proto coverters for TextInputType 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"
10 #include "blimp/common/proto/blimp_conversions.h"
9 #include "blimp/common/proto/blimp_message.pb.h" 11 #include "blimp/common/proto/blimp_message.pb.h"
10 #include "blimp/common/proto/compositor.pb.h" 12 #include "blimp/common/proto/compositor.pb.h"
11 #include "blimp/common/proto/input.pb.h" 13 #include "blimp/common/proto/input.pb.h"
12 #include "blimp/common/proto/render_widget.pb.h" 14 #include "blimp/common/proto/render_widget.pb.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(
haibinlu 2016/03/17 18:59:46 add cases to unit tests
shaktisahu 2016/03/18 19:08:06 Done.
126 const int tab_id,
127 content::RenderWidgetHost* render_widget_host,
128 const ui::TextInputClient* client) {
Khushal 2016/03/17 10:02:45 DCHECK the host and client, since you're going to
129 ImeMessage* ime_message;
130 scoped_ptr<BlimpMessage> blimp_message =
131 CreateBlimpMessage(&ime_message, tab_id);
132
133 int render_widget_id = GetRenderWidgetId(tab_id, render_widget_host);
134 DCHECK_GT(render_widget_id, 0);
135 ime_message->set_render_widget_id(render_widget_id);
136 ime_message->set_type(ImeMessage::SHOW_IME);
137 ime_message->set_text_input_type(
138 TextInputTypeToProto(client->GetTextInputType()));
139
140 gfx::Range text_range;
141 base::string16 existing_text;
142 client->GetTextRange(&text_range);
143 client->GetTextFromRange(text_range, &existing_text);
144 ime_message->set_ime_text(base::UTF16ToUTF8(existing_text));
145
146 ime_message_sender_->ProcessMessage(std::move(blimp_message),
147 net::CompletionCallback());
148 }
149
150 void EngineRenderWidgetFeature::SendHideImeRequest(
151 const int tab_id,
152 content::RenderWidgetHost* render_widget_host,
153 const ui::TextInputClient* client) {
154 ImeMessage* ime_message;
155 scoped_ptr<BlimpMessage> blimp_message =
156 CreateBlimpMessage(&ime_message, tab_id);
157
158 int render_widget_id = GetRenderWidgetId(tab_id, render_widget_host);
159 DCHECK_GT(render_widget_id, 0);
160 ime_message->set_render_widget_id(render_widget_id);
161 ime_message->set_type(ImeMessage::HIDE_IME);
162
163 ime_message_sender_->ProcessMessage(std::move(blimp_message),
164 net::CompletionCallback());
165 }
166
116 void EngineRenderWidgetFeature::SetDelegate( 167 void EngineRenderWidgetFeature::SetDelegate(
117 const int tab_id, 168 const int tab_id,
118 RenderWidgetMessageDelegate* delegate) { 169 RenderWidgetMessageDelegate* delegate) {
119 DCHECK(!FindDelegate(tab_id)); 170 DCHECK(!FindDelegate(tab_id));
120 delegates_[tab_id] = delegate; 171 delegates_[tab_id] = delegate;
121 } 172 }
122 173
123 void EngineRenderWidgetFeature::RemoveDelegate(const int tab_id) { 174 void EngineRenderWidgetFeature::RemoveDelegate(const int tab_id) {
124 DelegateMap::iterator it = delegates_.find(tab_id); 175 DelegateMap::iterator it = delegates_.find(tab_id);
125 if (it != delegates_.end()) 176 if (it != delegates_.end())
126 delegates_.erase(it); 177 delegates_.erase(it);
127 } 178 }
128 179
129 void EngineRenderWidgetFeature::ProcessMessage( 180 void EngineRenderWidgetFeature::ProcessMessage(
130 scoped_ptr<BlimpMessage> message, 181 scoped_ptr<BlimpMessage> message,
131 const net::CompletionCallback& callback) { 182 const net::CompletionCallback& callback) {
132 DCHECK(!callback.is_null()); 183 DCHECK(!callback.is_null());
133 DCHECK(message->type() == BlimpMessage::RENDER_WIDGET || 184 DCHECK(message->type() == BlimpMessage::RENDER_WIDGET ||
185 message->type() == BlimpMessage::IME ||
134 message->type() == BlimpMessage::INPUT || 186 message->type() == BlimpMessage::INPUT ||
135 message->type() == BlimpMessage::COMPOSITOR); 187 message->type() == BlimpMessage::COMPOSITOR);
136 188
137 int target_tab_id = message->target_tab_id(); 189 int target_tab_id = message->target_tab_id();
138 190
139 RenderWidgetMessageDelegate* delegate = FindDelegate(target_tab_id); 191 RenderWidgetMessageDelegate* delegate = FindDelegate(target_tab_id);
140 DCHECK(delegate); 192 DCHECK(delegate);
141 193
142 content::RenderWidgetHost* render_widget_host = nullptr; 194 content::RenderWidgetHost* render_widget_host = nullptr;
143 195
(...skipping 12 matching lines...) Expand all
156 render_widget_host = GetRenderWidgetHost(target_tab_id, 208 render_widget_host = GetRenderWidgetHost(target_tab_id,
157 message->compositor().render_widget_id()); 209 message->compositor().render_widget_id());
158 if (render_widget_host) { 210 if (render_widget_host) {
159 std::vector<uint8_t> payload(message->compositor().payload().size()); 211 std::vector<uint8_t> payload(message->compositor().payload().size());
160 memcpy(payload.data(), 212 memcpy(payload.data(),
161 message->compositor().payload().data(), 213 message->compositor().payload().data(),
162 payload.size()); 214 payload.size());
163 delegate->OnCompositorMessageReceived(render_widget_host, payload); 215 delegate->OnCompositorMessageReceived(render_widget_host, payload);
164 } 216 }
165 break; 217 break;
218 case BlimpMessage::IME:
219 DCHECK(message->ime().type() == ImeMessage::SHOW_TEXT);
220 render_widget_host =
221 GetRenderWidgetHost(target_tab_id, message->ime().render_widget_id());
222 if (render_widget_host) {
223 InsertTextFromIME(render_widget_host->GetView()->GetTextInputClient(),
Khushal 2016/03/17 10:02:45 View can be null. Check that as well and drop the
shaktisahu 2016/03/18 19:08:06 Done.
224 message->ime().ime_text());
225 }
226 break;
166 default: 227 default:
167 NOTREACHED(); 228 NOTREACHED();
168 } 229 }
169 230
170 callback.Run(net::OK); 231 callback.Run(net::OK);
171 } 232 }
172 233
234 void EngineRenderWidgetFeature::InsertTextFromIME(ui::TextInputClient* client,
235 std::string text) {
236 if (client && client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) {
237 // Clear out any existing text first and
David Trainor- moved to gerrit 2016/03/17 21:53:29 newline is too early
238 // then insert new text entered through IME.
239 gfx::Range text_range;
240 client->GetTextRange(&text_range);
241 client->ExtendSelectionAndDelete(text_range.length(), text_range.length());
242
243 client->InsertText(base::UTF8ToUTF16(text));
244 }
245 }
246
173 EngineRenderWidgetFeature::RenderWidgetMessageDelegate* 247 EngineRenderWidgetFeature::RenderWidgetMessageDelegate*
174 EngineRenderWidgetFeature::FindDelegate(const int tab_id) { 248 EngineRenderWidgetFeature::FindDelegate(const int tab_id) {
175 DelegateMap::const_iterator it = delegates_.find(tab_id); 249 DelegateMap::const_iterator it = delegates_.find(tab_id);
176 if (it != delegates_.end()) 250 if (it != delegates_.end())
177 return it->second; 251 return it->second;
178 return nullptr; 252 return nullptr;
179 } 253 }
180 254
181 int EngineRenderWidgetFeature::AddRenderWidget( 255 int EngineRenderWidgetFeature::AddRenderWidget(
182 const int tab_id, 256 const int tab_id,
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 335
262 IdToRenderWidgetMap::const_iterator widget_id_it = 336 IdToRenderWidgetMap::const_iterator widget_id_it =
263 id_to_render_widget->find(render_widget_id); 337 id_to_render_widget->find(render_widget_id);
264 if (widget_id_it == id_to_render_widget->end()) 338 if (widget_id_it == id_to_render_widget->end())
265 return nullptr; 339 return nullptr;
266 340
267 return widget_id_it->second; 341 return widget_id_it->second;
268 } 342 }
269 343
270 } // namespace blimp 344 } // namespace blimp
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698