| 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         SetTextFromIME(render_widget_host->GetView()->GetTextInputClient(), | 
|  | 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::SetTextFromIME(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 | 
|---|