| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef BLIMP_ENGINE_FEATURE_ENGINE_RENDER_WIDGET_FEATURE_H_ | |
| 6 #define BLIMP_ENGINE_FEATURE_ENGINE_RENDER_WIDGET_FEATURE_H_ | |
| 7 | |
| 8 #include <stdint.h> | |
| 9 | |
| 10 #include <map> | |
| 11 #include <memory> | |
| 12 #include <vector> | |
| 13 | |
| 14 #include "base/atomic_sequence_num.h" | |
| 15 #include "base/containers/small_map.h" | |
| 16 #include "base/macros.h" | |
| 17 #include "blimp/engine/app/settings_manager.h" | |
| 18 #include "blimp/net/blimp_message_processor.h" | |
| 19 #include "blimp/net/input_message_converter.h" | |
| 20 #include "ui/base/ime/text_input_client.h" | |
| 21 | |
| 22 namespace blink { | |
| 23 class WebGestureEvent; | |
| 24 } | |
| 25 | |
| 26 namespace content { | |
| 27 class RenderWidgetHost; | |
| 28 struct FormFieldData; | |
| 29 } | |
| 30 | |
| 31 namespace blimp { | |
| 32 namespace engine { | |
| 33 | |
| 34 // Handles all incoming and outgoing protobuf message types tied to a specific | |
| 35 // RenderWidget. This includes BlimpMessage::INPUT, BlimpMessage::COMPOSITOR, | |
| 36 // and BlimpMessage::RENDER_WIDGET messages. Delegates can be added to be | |
| 37 // notified of incoming messages. This class automatically handles dropping | |
| 38 // stale BlimpMessage::RENDER_WIDGET messages from the client after a | |
| 39 // RenderWidgetMessage::INITIALIZE message is sent. | |
| 40 class EngineRenderWidgetFeature : public BlimpMessageProcessor, | |
| 41 public SettingsManager::Observer { | |
| 42 public: | |
| 43 // A delegate to be notified of specific RenderWidget related incoming events. | |
| 44 class RenderWidgetMessageDelegate { | |
| 45 public: | |
| 46 // Called when the client is sending a WebGestureEvent to the engine. | |
| 47 virtual void OnWebGestureEvent( | |
| 48 content::RenderWidgetHost* render_widget_host, | |
| 49 std::unique_ptr<blink::WebGestureEvent> event) = 0; | |
| 50 | |
| 51 // Called when the client sent a CompositorMessage. These messages should | |
| 52 // be sent to the engine's render process so they can be processed by the | |
| 53 // RemoteChannel of the compositor. | |
| 54 virtual void OnCompositorMessageReceived( | |
| 55 content::RenderWidgetHost* render_widget_host, | |
| 56 const std::vector<uint8_t>& message) = 0; | |
| 57 }; | |
| 58 | |
| 59 explicit EngineRenderWidgetFeature(SettingsManager* settings); | |
| 60 ~EngineRenderWidgetFeature() override; | |
| 61 | |
| 62 void set_render_widget_message_sender( | |
| 63 std::unique_ptr<BlimpMessageProcessor> message_processor); | |
| 64 | |
| 65 void set_input_message_sender( | |
| 66 std::unique_ptr<BlimpMessageProcessor> message_processor); | |
| 67 | |
| 68 void set_compositor_message_sender( | |
| 69 std::unique_ptr<BlimpMessageProcessor> message_processor); | |
| 70 | |
| 71 void set_ime_message_sender( | |
| 72 std::unique_ptr<BlimpMessageProcessor> message_processor); | |
| 73 | |
| 74 // Notifes the client that a new RenderWidget for a particular WebContents has | |
| 75 // been created. This will trigger the creation of the BlimpCompositor for | |
| 76 // this widget on the client. | |
| 77 void OnRenderWidgetCreated(const int tab_id, | |
| 78 content::RenderWidgetHost* render_widget_host); | |
| 79 | |
| 80 // Notifies the client that the RenderWidget for a particular WebContents has | |
| 81 // changed. When this is sent the native view on the client becomes bound to | |
| 82 // the BlimpCompositor for this widget. | |
| 83 // Since the compositor on the client performs the operations of the view for | |
| 84 // this widget, this will set the visibility and draw state correctly for this | |
| 85 // widget. | |
| 86 // Note: This assumes that this is the RenderWidgetHost for the main frame. | |
| 87 // Only one RenderWidget can be in initialized state for a tab. | |
| 88 void OnRenderWidgetInitialized(const int tab_id, | |
| 89 content::RenderWidgetHost* render_widget_host); | |
| 90 | |
| 91 void OnRenderWidgetDeleted(const int tab_id, | |
| 92 content::RenderWidgetHost* render_widget_host); | |
| 93 | |
| 94 // Notifies the client to show/hide IME. | |
| 95 void SendShowImeRequest(const int tab_id, | |
| 96 content::RenderWidgetHost* render_widget_host, | |
| 97 const content::FormFieldData& field); | |
| 98 void SendHideImeRequest(const int tab_id, | |
| 99 content::RenderWidgetHost* render_widget_host); | |
| 100 | |
| 101 // Sends a CompositorMessage for |tab_id| to the client. | |
| 102 void SendCompositorMessage(const int tab_id, | |
| 103 content::RenderWidgetHost* render_widget_host, | |
| 104 const std::vector<uint8_t>& message); | |
| 105 | |
| 106 // Sets a RenderWidgetMessageDelegate to be notified of all incoming | |
| 107 // RenderWidget related messages for |tab_id| from the client. There can only | |
| 108 // be one RenderWidgetMessageDelegate per tab. | |
| 109 void SetDelegate(const int tab_id, RenderWidgetMessageDelegate* delegate); | |
| 110 void RemoveDelegate(const int tab_id); | |
| 111 | |
| 112 // BlimpMessageProcessor implementation. | |
| 113 void ProcessMessage(std::unique_ptr<BlimpMessage> message, | |
| 114 const net::CompletionCallback& callback) override; | |
| 115 | |
| 116 // Settings::Observer implementation. | |
| 117 void OnWebPreferencesChanged() override; | |
| 118 | |
| 119 private: | |
| 120 typedef base::SmallMap<std::map<int, RenderWidgetMessageDelegate*> > | |
| 121 DelegateMap; | |
| 122 | |
| 123 typedef base::SmallMap<std::map<content::RenderWidgetHost*, int>> | |
| 124 RenderWidgetToIdMap; | |
| 125 | |
| 126 typedef base::SmallMap<std::map<int, content::RenderWidgetHost*>> | |
| 127 IdToRenderWidgetMap; | |
| 128 | |
| 129 typedef std::pair<RenderWidgetToIdMap, IdToRenderWidgetMap> RenderWidgetMaps; | |
| 130 | |
| 131 typedef base::SmallMap<std::map<int, RenderWidgetMaps>> TabMap; | |
| 132 | |
| 133 // Returns nullptr if no delegate is found. | |
| 134 RenderWidgetMessageDelegate* FindDelegate(const int tab_id); | |
| 135 | |
| 136 // Adds the RenderWidgetHost to the map and return the render_widget_id. | |
| 137 int AddRenderWidget(const int tab_id, | |
| 138 content::RenderWidgetHost* render_widget_host); | |
| 139 | |
| 140 // Deletes the RenderWidgetHost from the map and returns the render_widget_id | |
| 141 // for the deleted host. | |
| 142 int DeleteRenderWidget(const int tab_id, | |
| 143 content::RenderWidgetHost* render_widget_host); | |
| 144 | |
| 145 // Returns the render_widget_id for the RenderWidgetHost. Will return 0U if | |
| 146 // the host is not found. | |
| 147 int GetRenderWidgetId(const int tab_id, | |
| 148 content::RenderWidgetHost* render_widget_host); | |
| 149 | |
| 150 // Returns the RenderWidgetHost for the given render_widget_id. Will return | |
| 151 // nullptr if no host is found. | |
| 152 content::RenderWidgetHost* GetRenderWidgetHost(const int tab_id, | |
| 153 const int render_widget_id); | |
| 154 | |
| 155 // Sends the text entered by the user to the renderer. | |
| 156 // The existing text in the box gets replaced by the new text from IME. | |
| 157 void SetTextFromIME(content::RenderWidgetHost* render_widget_host, | |
| 158 std::string text, | |
| 159 bool auto_submit); | |
| 160 | |
| 161 DelegateMap delegates_; | |
| 162 TabMap tabs_; | |
| 163 | |
| 164 // A RenderWidgetHost can also be uniquely identified by the | |
| 165 // <process_id, routing_id> where the process_id is the id for the | |
| 166 // RenderProcessHost for this widget and the routing_id is the id for the | |
| 167 // widget. | |
| 168 // But we generate our own ids to avoid having the render widget protocol tied | |
| 169 // to always using a combination of these ids, generated by the content layer. | |
| 170 // By using an AtomicSequenceNumber for identifying render widgets across | |
| 171 // tabs, we can be sure that there will always be a 1:1 mapping between the | |
| 172 // render widget and the consumer of the features tied to this widget on the | |
| 173 // client, which is the BlimpCompositor. | |
| 174 base::AtomicSequenceNumber next_widget_id_; | |
| 175 | |
| 176 InputMessageConverter input_message_converter_; | |
| 177 | |
| 178 SettingsManager* settings_manager_; | |
| 179 | |
| 180 // Outgoing message processors for RENDER_WIDGET, COMPOSITOR and INPUT types. | |
| 181 std::unique_ptr<BlimpMessageProcessor> render_widget_message_sender_; | |
| 182 std::unique_ptr<BlimpMessageProcessor> compositor_message_sender_; | |
| 183 std::unique_ptr<BlimpMessageProcessor> input_message_sender_; | |
| 184 std::unique_ptr<BlimpMessageProcessor> ime_message_sender_; | |
| 185 | |
| 186 base::WeakPtrFactory<EngineRenderWidgetFeature> weak_factory_; | |
| 187 | |
| 188 DISALLOW_COPY_AND_ASSIGN(EngineRenderWidgetFeature); | |
| 189 }; | |
| 190 | |
| 191 } // namespace engine | |
| 192 } // namespace blimp | |
| 193 | |
| 194 #endif // BLIMP_ENGINE_FEATURE_ENGINE_RENDER_WIDGET_FEATURE_H_ | |
| OLD | NEW |