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" |
| 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 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( | |
|
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 Loading... | |
| 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 Loading... | |
| 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 |
| OLD | NEW |