Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |