Index: blimp/engine/feature/engine_render_widget_feature.cc |
diff --git a/blimp/engine/feature/engine_render_widget_feature.cc b/blimp/engine/feature/engine_render_widget_feature.cc |
deleted file mode 100644 |
index 5bf47a12d747e096639455394cd6d9131cbfa887..0000000000000000000000000000000000000000 |
--- a/blimp/engine/feature/engine_render_widget_feature.cc |
+++ /dev/null |
@@ -1,400 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "blimp/engine/feature/engine_render_widget_feature.h" |
- |
-#include "base/numerics/safe_conversions.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "blimp/common/create_blimp_message.h" |
-#include "blimp/common/proto/blimp_message.pb.h" |
-#include "blimp/common/proto/compositor.pb.h" |
-#include "blimp/common/proto/input.pb.h" |
-#include "blimp/common/proto/render_widget.pb.h" |
-#include "blimp/net/input_message_converter.h" |
-#include "content/public/browser/render_widget_host.h" |
-#include "content/public/browser/render_widget_host_view.h" |
-#include "content/public/common/form_field_data.h" |
-#include "net/base/net_errors.h" |
-#include "third_party/WebKit/public/platform/WebInputEvent.h" |
-#include "ui/events/event.h" |
-#include "ui/events/keycodes/dom/dom_code.h" |
- |
-namespace blimp { |
-namespace engine { |
- |
-EngineRenderWidgetFeature::EngineRenderWidgetFeature(SettingsManager* settings) |
- : settings_manager_(settings), weak_factory_(this) { |
- DCHECK(settings_manager_); |
- settings_manager_->AddObserver(this); |
-} |
- |
-EngineRenderWidgetFeature::~EngineRenderWidgetFeature() { |
- DCHECK(settings_manager_); |
- settings_manager_->RemoveObserver(this); |
-} |
- |
-void EngineRenderWidgetFeature::set_render_widget_message_sender( |
- std::unique_ptr<BlimpMessageProcessor> message_processor) { |
- DCHECK(message_processor); |
- render_widget_message_sender_ = std::move(message_processor); |
-} |
- |
-void EngineRenderWidgetFeature::set_input_message_sender( |
- std::unique_ptr<BlimpMessageProcessor> message_processor) { |
- DCHECK(message_processor); |
- input_message_sender_ = std::move(message_processor); |
-} |
- |
-void EngineRenderWidgetFeature::set_ime_message_sender( |
- std::unique_ptr<BlimpMessageProcessor> message_processor) { |
- DCHECK(message_processor); |
- ime_message_sender_ = std::move(message_processor); |
-} |
- |
-void EngineRenderWidgetFeature::set_compositor_message_sender( |
- std::unique_ptr<BlimpMessageProcessor> message_processor) { |
- DCHECK(message_processor); |
- compositor_message_sender_ = std::move(message_processor); |
-} |
- |
-void EngineRenderWidgetFeature::OnRenderWidgetCreated( |
- const int tab_id, |
- content::RenderWidgetHost* render_widget_host) { |
- DCHECK(render_widget_host); |
- |
- int render_widget_id = AddRenderWidget(tab_id, render_widget_host); |
- DCHECK_GT(render_widget_id, 0); |
- |
- RenderWidgetMessage* render_widget_message; |
- std::unique_ptr<BlimpMessage> blimp_message = |
- CreateBlimpMessage(&render_widget_message, tab_id); |
- render_widget_message->set_type(RenderWidgetMessage::CREATED); |
- render_widget_message->set_render_widget_id(render_widget_id); |
- |
- render_widget_message_sender_->ProcessMessage(std::move(blimp_message), |
- net::CompletionCallback()); |
-} |
- |
-void EngineRenderWidgetFeature::OnRenderWidgetInitialized( |
- const int tab_id, |
- content::RenderWidgetHost* render_widget_host) { |
- DCHECK(render_widget_host); |
- |
- int render_widget_id = GetRenderWidgetId(tab_id, render_widget_host); |
- DCHECK_GT(render_widget_id, 0); |
- |
- RenderWidgetMessage* render_widget_message; |
- std::unique_ptr<BlimpMessage> blimp_message = |
- CreateBlimpMessage(&render_widget_message, tab_id); |
- render_widget_message->set_type(RenderWidgetMessage::INITIALIZE); |
- render_widget_message->set_render_widget_id(render_widget_id); |
- |
- render_widget_message_sender_->ProcessMessage(std::move(blimp_message), |
- net::CompletionCallback()); |
-} |
- |
-void EngineRenderWidgetFeature::OnRenderWidgetDeleted( |
- const int tab_id, |
- content::RenderWidgetHost* render_widget_host) { |
- DCHECK(render_widget_host); |
- |
- int render_widget_id = DeleteRenderWidget(tab_id, render_widget_host); |
- DCHECK_GT(render_widget_id, 0); |
- |
- RenderWidgetMessage* render_widget_message; |
- std::unique_ptr<BlimpMessage> blimp_message = |
- CreateBlimpMessage(&render_widget_message, tab_id); |
- render_widget_message->set_type(RenderWidgetMessage::DELETED); |
- render_widget_message->set_render_widget_id(render_widget_id); |
- |
- render_widget_message_sender_->ProcessMessage(std::move(blimp_message), |
- net::CompletionCallback()); |
-} |
- |
-void EngineRenderWidgetFeature::SendCompositorMessage( |
- const int tab_id, |
- content::RenderWidgetHost* render_widget_host, |
- const std::vector<uint8_t>& message) { |
- CompositorMessage* compositor_message; |
- std::unique_ptr<BlimpMessage> blimp_message = |
- CreateBlimpMessage(&compositor_message, tab_id); |
- |
- int render_widget_id = GetRenderWidgetId(tab_id, render_widget_host); |
- DCHECK_GT(render_widget_id, 0); |
- |
- compositor_message->set_render_widget_id(render_widget_id); |
- // TODO(dtrainor): Move the transport medium to std::string* and use |
- // set_allocated_payload. |
- compositor_message->set_payload(message.data(), |
- base::checked_cast<int>(message.size())); |
- |
- compositor_message_sender_->ProcessMessage(std::move(blimp_message), |
- net::CompletionCallback()); |
-} |
- |
-void EngineRenderWidgetFeature::SendShowImeRequest( |
- const int tab_id, |
- content::RenderWidgetHost* render_widget_host, |
- const content::FormFieldData& field) { |
- ImeMessage* ime_message; |
- std::unique_ptr<BlimpMessage> blimp_message = |
- CreateBlimpMessage(&ime_message, tab_id); |
- |
- int render_widget_id = GetRenderWidgetId(tab_id, render_widget_host); |
- DCHECK_GT(render_widget_id, 0); |
- ime_message->set_render_widget_id(render_widget_id); |
- ime_message->set_type(ImeMessage::SHOW_IME); |
- ime_message->set_text_input_type( |
- InputMessageConverter::TextInputTypeToProto(field.text_input_type)); |
- ime_message->set_ime_text(field.text); |
- // TODO(shaktisahu): Add remaining fields to proto. |
- |
- ime_message_sender_->ProcessMessage(std::move(blimp_message), |
- net::CompletionCallback()); |
-} |
- |
-void EngineRenderWidgetFeature::SendHideImeRequest( |
- const int tab_id, |
- content::RenderWidgetHost* render_widget_host) { |
- ImeMessage* ime_message; |
- std::unique_ptr<BlimpMessage> blimp_message = |
- CreateBlimpMessage(&ime_message, tab_id); |
- |
- int render_widget_id = GetRenderWidgetId(tab_id, render_widget_host); |
- DCHECK_GT(render_widget_id, 0); |
- ime_message->set_render_widget_id(render_widget_id); |
- ime_message->set_type(ImeMessage::HIDE_IME); |
- |
- ime_message_sender_->ProcessMessage(std::move(blimp_message), |
- net::CompletionCallback()); |
-} |
- |
-void EngineRenderWidgetFeature::SetDelegate( |
- const int tab_id, |
- RenderWidgetMessageDelegate* delegate) { |
- DCHECK(!FindDelegate(tab_id)); |
- delegates_[tab_id] = delegate; |
-} |
- |
-void EngineRenderWidgetFeature::RemoveDelegate(const int tab_id) { |
- DelegateMap::iterator it = delegates_.find(tab_id); |
- if (it != delegates_.end()) |
- delegates_.erase(it); |
-} |
- |
-void EngineRenderWidgetFeature::ProcessMessage( |
- std::unique_ptr<BlimpMessage> message, |
- const net::CompletionCallback& callback) { |
- DCHECK(!callback.is_null()); |
- DCHECK(message->feature_case() == BlimpMessage::kRenderWidget || |
- message->feature_case() == BlimpMessage::kIme || |
- message->feature_case() == BlimpMessage::kInput || |
- message->feature_case() == BlimpMessage::kCompositor); |
- |
- int target_tab_id = message->target_tab_id(); |
- |
- RenderWidgetMessageDelegate* delegate = FindDelegate(target_tab_id); |
- DCHECK(delegate); |
- |
- content::RenderWidgetHost* render_widget_host = nullptr; |
- |
- switch (message->feature_case()) { |
- case BlimpMessage::kInput: |
- render_widget_host = GetRenderWidgetHost(target_tab_id, |
- message->input().render_widget_id()); |
- if (render_widget_host) { |
- std::unique_ptr<blink::WebGestureEvent> event = |
- input_message_converter_.ProcessMessage(message->input()); |
- if (event) |
- delegate->OnWebGestureEvent(render_widget_host, std::move(event)); |
- } |
- break; |
- case BlimpMessage::kCompositor: |
- render_widget_host = GetRenderWidgetHost(target_tab_id, |
- message->compositor().render_widget_id()); |
- if (render_widget_host) { |
- std::vector<uint8_t> payload(message->compositor().payload().size()); |
- memcpy(payload.data(), |
- message->compositor().payload().data(), |
- payload.size()); |
- delegate->OnCompositorMessageReceived(render_widget_host, payload); |
- } |
- break; |
- case BlimpMessage::kIme: |
- DCHECK(message->ime().type() == ImeMessage::SET_TEXT); |
- render_widget_host = |
- GetRenderWidgetHost(target_tab_id, message->ime().render_widget_id()); |
- if (render_widget_host && render_widget_host->GetView()) { |
- SetTextFromIME(render_widget_host, message->ime().ime_text(), |
- message->ime().auto_submit()); |
- |
- // TODO(shaktisahu): Remove this fake HIDE_IME request once the blimp |
- // IME design is completed (crbug/661328). |
- base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&EngineRenderWidgetFeature::SendHideImeRequest, |
- weak_factory_.GetWeakPtr(), target_tab_id, |
- render_widget_host), |
- base::TimeDelta::FromMilliseconds(1500)); |
- } |
- break; |
- default: |
- NOTREACHED(); |
- } |
- |
- callback.Run(net::OK); |
-} |
- |
-void EngineRenderWidgetFeature::OnWebPreferencesChanged() { |
- for (TabMap::iterator tab_it = tabs_.begin(); tab_it != tabs_.end(); |
- tab_it++) { |
- RenderWidgetMaps render_widget_maps = tab_it->second; |
- RenderWidgetToIdMap render_widget_to_id = render_widget_maps.first; |
- for (RenderWidgetToIdMap::iterator it = render_widget_to_id.begin(); |
- it != render_widget_to_id.end(); it++) { |
- content::RenderWidgetHost* render_widget_host = it->first; |
- content::RenderViewHost* render_view_host = |
- content::RenderViewHost::From(render_widget_host); |
- if (render_view_host) |
- render_view_host->OnWebkitPreferencesChanged(); |
- } |
- } |
-} |
- |
-void EngineRenderWidgetFeature::SetTextFromIME( |
- content::RenderWidgetHost* render_widget_host, |
- std::string text, |
- bool auto_submit) { |
- ui::TextInputClient* client = |
- render_widget_host->GetView()->GetTextInputClient(); |
- DCHECK(client); |
- |
- if (!client || client->GetTextInputType() == ui::TEXT_INPUT_TYPE_NONE) |
- return; |
- |
- // Clear out any existing text first and then insert new text entered |
- // through IME. |
- gfx::Range text_range; |
- client->GetTextRange(&text_range); |
- client->ExtendSelectionAndDelete(text_range.length(), text_range.length()); |
- |
- client->InsertText(base::UTF8ToUTF16(text)); |
- |
- if (auto_submit) { |
- // Send a synthetic key event to the renderer notifying that user has hit |
- // Return key. This should submit the current form. |
- ui::KeyEvent press(ui::ET_KEY_PRESSED, ui::VKEY_RETURN, ui::DomCode::ENTER, |
- 0); |
- ui::KeyEvent char_event('\r', ui::VKEY_RETURN, 0); |
- ui::KeyEvent release(ui::ET_KEY_RELEASED, ui::VKEY_RETURN, |
- ui::DomCode::ENTER, 0); |
- render_widget_host->ForwardKeyboardEvent( |
- content::NativeWebKeyboardEvent(press)); |
- render_widget_host->ForwardKeyboardEvent( |
- content::NativeWebKeyboardEvent(char_event)); |
- render_widget_host->ForwardKeyboardEvent( |
- content::NativeWebKeyboardEvent(release)); |
- } |
-} |
- |
-EngineRenderWidgetFeature::RenderWidgetMessageDelegate* |
-EngineRenderWidgetFeature::FindDelegate(const int tab_id) { |
- DelegateMap::const_iterator it = delegates_.find(tab_id); |
- if (it != delegates_.end()) |
- return it->second; |
- return nullptr; |
-} |
- |
-int EngineRenderWidgetFeature::AddRenderWidget( |
- const int tab_id, |
- content::RenderWidgetHost* render_widget_host) { |
- TabMap::iterator tab_it = tabs_.find(tab_id); |
- if (tab_it == tabs_.end()) { |
- tabs_[tab_id] = std::make_pair(RenderWidgetToIdMap(), |
- IdToRenderWidgetMap()); |
- tab_it = tabs_.find(tab_id); |
- } |
- |
- int render_widget_id = next_widget_id_.GetNext() + 1; |
- |
- RenderWidgetMaps* render_widget_maps = &tab_it->second; |
- |
- RenderWidgetToIdMap* render_widget_to_id = &render_widget_maps->first; |
- IdToRenderWidgetMap* id_to_render_widget = &render_widget_maps->second; |
- |
- DCHECK(render_widget_to_id->find(render_widget_host) == |
- render_widget_to_id->end()); |
- DCHECK(id_to_render_widget->find(render_widget_id) == |
- id_to_render_widget->end()); |
- |
- (*render_widget_to_id)[render_widget_host] = render_widget_id; |
- (*id_to_render_widget)[render_widget_id] = render_widget_host; |
- |
- return render_widget_id; |
-} |
- |
-int EngineRenderWidgetFeature::DeleteRenderWidget( |
- const int tab_id, |
- content::RenderWidgetHost* render_widget_host) { |
- TabMap::iterator tab_it = tabs_.find(tab_id); |
- DCHECK(tab_it != tabs_.end()); |
- |
- RenderWidgetMaps* render_widget_maps = &tab_it->second; |
- |
- RenderWidgetToIdMap* render_widget_to_id = &render_widget_maps->first; |
- RenderWidgetToIdMap::iterator widget_to_id_it = |
- render_widget_to_id->find(render_widget_host); |
- DCHECK(widget_to_id_it != render_widget_to_id->end()); |
- |
- int render_widget_id = widget_to_id_it->second; |
- render_widget_to_id->erase(widget_to_id_it); |
- |
- IdToRenderWidgetMap* id_to_render_widget = &render_widget_maps->second; |
- IdToRenderWidgetMap::iterator id_to_widget_it = |
- id_to_render_widget->find(render_widget_id); |
- DCHECK(id_to_widget_it->second == render_widget_host); |
- id_to_render_widget->erase(id_to_widget_it); |
- |
- return render_widget_id; |
-} |
- |
-int EngineRenderWidgetFeature::GetRenderWidgetId( |
- const int tab_id, |
- content::RenderWidgetHost* render_widget_host) { |
- TabMap::const_iterator tab_it = tabs_.find(tab_id); |
- if (tab_it == tabs_.end()) |
- return 0; |
- |
- const RenderWidgetMaps* render_widget_maps = &tab_it->second; |
- const RenderWidgetToIdMap* render_widget_to_id = &render_widget_maps->first; |
- |
- RenderWidgetToIdMap::const_iterator widget_it = |
- render_widget_to_id->find(render_widget_host); |
- if (widget_it == render_widget_to_id->end()) |
- return 0; |
- |
- return widget_it->second; |
-} |
- |
-content::RenderWidgetHost* EngineRenderWidgetFeature::GetRenderWidgetHost( |
- const int tab_id, |
- const int render_widget_id) { |
- TabMap::const_iterator tab_it = tabs_.find(tab_id); |
- if (tab_it == tabs_.end()) |
- return nullptr; |
- |
- const RenderWidgetMaps* render_widget_maps = &tab_it->second; |
- const IdToRenderWidgetMap* id_to_render_widget = &render_widget_maps->second; |
- |
- IdToRenderWidgetMap::const_iterator widget_id_it = |
- id_to_render_widget->find(render_widget_id); |
- if (widget_id_it == id_to_render_widget->end()) |
- return nullptr; |
- |
- return widget_id_it->second; |
-} |
- |
-} // namespace engine |
-} // namespace blimp |