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

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

Issue 2393043004: Blimp: IME should submit form with text (Closed)
Patch Set: dtrainor@ comments Created 4 years, 2 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
« no previous file with comments | « blimp/engine/feature/engine_render_widget_feature.h ('k') | blimp/test/data/input.html » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "base/strings/utf_string_conversions.h"
9 #include "blimp/common/create_blimp_message.h" 9 #include "blimp/common/create_blimp_message.h"
10 #include "blimp/common/proto/blimp_message.pb.h" 10 #include "blimp/common/proto/blimp_message.pb.h"
11 #include "blimp/common/proto/compositor.pb.h" 11 #include "blimp/common/proto/compositor.pb.h"
12 #include "blimp/common/proto/input.pb.h" 12 #include "blimp/common/proto/input.pb.h"
13 #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" 14 #include "blimp/net/input_message_converter.h"
15 #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" 16 #include "content/public/browser/render_widget_host_view.h"
17 #include "net/base/net_errors.h" 17 #include "net/base/net_errors.h"
18 #include "third_party/WebKit/public/web/WebInputEvent.h" 18 #include "third_party/WebKit/public/web/WebInputEvent.h"
19 #include "ui/events/event.h"
20 #include "ui/events/keycodes/dom/dom_code.h"
19 21
20 namespace blimp { 22 namespace blimp {
21 namespace engine { 23 namespace engine {
22 24
23 EngineRenderWidgetFeature::EngineRenderWidgetFeature(SettingsManager* settings) 25 EngineRenderWidgetFeature::EngineRenderWidgetFeature(SettingsManager* settings)
24 : settings_manager_(settings) { 26 : settings_manager_(settings) {
25 DCHECK(settings_manager_); 27 DCHECK(settings_manager_);
26 settings_manager_->AddObserver(this); 28 settings_manager_->AddObserver(this);
27 } 29 }
28 30
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 message->compositor().payload().data(), 224 message->compositor().payload().data(),
223 payload.size()); 225 payload.size());
224 delegate->OnCompositorMessageReceived(render_widget_host, payload); 226 delegate->OnCompositorMessageReceived(render_widget_host, payload);
225 } 227 }
226 break; 228 break;
227 case BlimpMessage::kIme: 229 case BlimpMessage::kIme:
228 DCHECK(message->ime().type() == ImeMessage::SET_TEXT); 230 DCHECK(message->ime().type() == ImeMessage::SET_TEXT);
229 render_widget_host = 231 render_widget_host =
230 GetRenderWidgetHost(target_tab_id, message->ime().render_widget_id()); 232 GetRenderWidgetHost(target_tab_id, message->ime().render_widget_id());
231 if (render_widget_host && render_widget_host->GetView()) { 233 if (render_widget_host && render_widget_host->GetView()) {
232 SetTextFromIME(render_widget_host->GetView()->GetTextInputClient(), 234 SetTextFromIME(render_widget_host, message->ime().ime_text(),
233 message->ime().ime_text()); 235 message->ime().auto_submit());
234 } 236 }
235 break; 237 break;
236 default: 238 default:
237 NOTREACHED(); 239 NOTREACHED();
238 } 240 }
239 241
240 callback.Run(net::OK); 242 callback.Run(net::OK);
241 } 243 }
242 244
243 void EngineRenderWidgetFeature::OnWebPreferencesChanged() { 245 void EngineRenderWidgetFeature::OnWebPreferencesChanged() {
244 for (TabMap::iterator tab_it = tabs_.begin(); tab_it != tabs_.end(); 246 for (TabMap::iterator tab_it = tabs_.begin(); tab_it != tabs_.end();
245 tab_it++) { 247 tab_it++) {
246 RenderWidgetMaps render_widget_maps = tab_it->second; 248 RenderWidgetMaps render_widget_maps = tab_it->second;
247 RenderWidgetToIdMap render_widget_to_id = render_widget_maps.first; 249 RenderWidgetToIdMap render_widget_to_id = render_widget_maps.first;
248 for (RenderWidgetToIdMap::iterator it = render_widget_to_id.begin(); 250 for (RenderWidgetToIdMap::iterator it = render_widget_to_id.begin();
249 it != render_widget_to_id.end(); it++) { 251 it != render_widget_to_id.end(); it++) {
250 content::RenderWidgetHost* render_widget_host = it->first; 252 content::RenderWidgetHost* render_widget_host = it->first;
251 content::RenderViewHost* render_view_host = 253 content::RenderViewHost* render_view_host =
252 content::RenderViewHost::From(render_widget_host); 254 content::RenderViewHost::From(render_widget_host);
253 if (render_view_host) 255 if (render_view_host)
254 render_view_host->OnWebkitPreferencesChanged(); 256 render_view_host->OnWebkitPreferencesChanged();
255 } 257 }
256 } 258 }
257 } 259 }
258 260
259 void EngineRenderWidgetFeature::SetTextFromIME(ui::TextInputClient* client, 261 void EngineRenderWidgetFeature::SetTextFromIME(
260 std::string text) { 262 content::RenderWidgetHost* render_widget_host,
261 if (client && client->GetTextInputType() != ui::TEXT_INPUT_TYPE_NONE) { 263 std::string text,
262 // Clear out any existing text first and then insert new text entered 264 bool auto_submit) {
263 // through IME. 265 ui::TextInputClient* client =
264 gfx::Range text_range; 266 render_widget_host->GetView()->GetTextInputClient();
265 client->GetTextRange(&text_range); 267 DCHECK(client);
266 client->ExtendSelectionAndDelete(text_range.length(), text_range.length());
267 268
268 client->InsertText(base::UTF8ToUTF16(text)); 269 if (!client || client->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE)
270 return;
271
272 // Clear out any existing text first and then insert new text entered
273 // through IME.
274 gfx::Range text_range;
275 client->GetTextRange(&text_range);
276 client->ExtendSelectionAndDelete(text_range.length(), text_range.length());
277
278 client->InsertText(base::UTF8ToUTF16(text));
279
280 if (auto_submit) {
281 // Send a synthetic key event to the renderer notifying that user has hit
282 // Return key. This should submit the current form.
283 ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_RETURN, ui::DomCode::ENTER,
284 0);
285 ui::KeyEvent char_event('\r', ui::VKEY_RETURN, 0);
286 ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_RETURN,
287 ui::DomCode::ENTER, 0);
288 render_widget_host->ForwardKeyboardEvent(
289 content::NativeWebKeyboardEvent(press));
290 render_widget_host->ForwardKeyboardEvent(
291 content::NativeWebKeyboardEvent(char_event));
292 render_widget_host->ForwardKeyboardEvent(
293 content::NativeWebKeyboardEvent(release));
269 } 294 }
270 } 295 }
271 296
272 EngineRenderWidgetFeature::RenderWidgetMessageDelegate* 297 EngineRenderWidgetFeature::RenderWidgetMessageDelegate*
273 EngineRenderWidgetFeature::FindDelegate(const int tab_id) { 298 EngineRenderWidgetFeature::FindDelegate(const int tab_id) {
274 DelegateMap::const_iterator it = delegates_.find(tab_id); 299 DelegateMap::const_iterator it = delegates_.find(tab_id);
275 if (it != delegates_.end()) 300 if (it != delegates_.end())
276 return it->second; 301 return it->second;
277 return nullptr; 302 return nullptr;
278 } 303 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 IdToRenderWidgetMap::const_iterator widget_id_it = 386 IdToRenderWidgetMap::const_iterator widget_id_it =
362 id_to_render_widget->find(render_widget_id); 387 id_to_render_widget->find(render_widget_id);
363 if (widget_id_it == id_to_render_widget->end()) 388 if (widget_id_it == id_to_render_widget->end())
364 return nullptr; 389 return nullptr;
365 390
366 return widget_id_it->second; 391 return widget_id_it->second;
367 } 392 }
368 393
369 } // namespace engine 394 } // namespace engine
370 } // namespace blimp 395 } // namespace blimp
OLDNEW
« no previous file with comments | « blimp/engine/feature/engine_render_widget_feature.h ('k') | blimp/test/data/input.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698