| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 // Copyright (c) 2012 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 CONTENT_RENDERER_PEPPER_PEPPER_PLUGIN_DELEGATE_IMPL_H_ |  | 
| 6 #define CONTENT_RENDERER_PEPPER_PEPPER_PLUGIN_DELEGATE_IMPL_H_ |  | 
| 7 |  | 
| 8 #include <map> |  | 
| 9 #include <set> |  | 
| 10 #include <string> |  | 
| 11 #include <vector> |  | 
| 12 |  | 
| 13 #include "base/basictypes.h" |  | 
| 14 #include "base/id_map.h" |  | 
| 15 #include "base/memory/ref_counted.h" |  | 
| 16 #include "base/memory/scoped_ptr.h" |  | 
| 17 #include "base/memory/weak_ptr.h" |  | 
| 18 #include "base/observer_list.h" |  | 
| 19 #include "content/public/renderer/render_view_observer.h" |  | 
| 20 #include "content/renderer/pepper/pepper_browser_connection.h" |  | 
| 21 #include "content/renderer/render_view_pepper_helper.h" |  | 
| 22 #include "ipc/ipc_platform_file.h" |  | 
| 23 #include "ppapi/c/pp_file_info.h" |  | 
| 24 #include "ppapi/c/ppb_tcp_socket.h" |  | 
| 25 #include "ppapi/c/private/ppb_tcp_socket_private.h" |  | 
| 26 #include "ppapi/shared_impl/private/ppb_tcp_server_socket_shared.h" |  | 
| 27 #include "ppapi/shared_impl/private/tcp_socket_private_impl.h" |  | 
| 28 #include "ui/base/ime/text_input_type.h" |  | 
| 29 |  | 
| 30 namespace base { |  | 
| 31 class FilePath; |  | 
| 32 } |  | 
| 33 |  | 
| 34 namespace ppapi { |  | 
| 35 class PepperFilePath; |  | 
| 36 class PpapiPermissions; |  | 
| 37 class PPB_X509Certificate_Fields; |  | 
| 38 namespace host { |  | 
| 39 class ResourceHost; |  | 
| 40 } |  | 
| 41 } |  | 
| 42 |  | 
| 43 namespace WebKit { |  | 
| 44 class WebGamepads; |  | 
| 45 class WebURLResponse; |  | 
| 46 struct WebCompositionUnderline; |  | 
| 47 struct WebCursorInfo; |  | 
| 48 } |  | 
| 49 |  | 
| 50 namespace content { |  | 
| 51 class ContextProviderCommandBuffer; |  | 
| 52 class GamepadSharedMemoryReader; |  | 
| 53 class PepperBroker; |  | 
| 54 class PluginModule; |  | 
| 55 class PPB_Broker_Impl; |  | 
| 56 class PPB_TCPSocket_Private_Impl; |  | 
| 57 class RenderViewImpl; |  | 
| 58 struct WebPluginInfo; |  | 
| 59 |  | 
| 60 class PepperPluginDelegateImpl |  | 
| 61     : public RenderViewPepperHelper, |  | 
| 62       public base::SupportsWeakPtr<PepperPluginDelegateImpl>, |  | 
| 63       public RenderViewObserver { |  | 
| 64  public: |  | 
| 65   explicit PepperPluginDelegateImpl(RenderViewImpl* render_view); |  | 
| 66   virtual ~PepperPluginDelegateImpl(); |  | 
| 67 |  | 
| 68   RenderViewImpl* render_view() { return render_view_; } |  | 
| 69 |  | 
| 70   PepperBrowserConnection* pepper_browser_connection() { |  | 
| 71     return &pepper_browser_connection_; |  | 
| 72   } |  | 
| 73 |  | 
| 74   // A pointer is returned immediately, but it is not ready to be used until |  | 
| 75   // BrokerConnected has been called. |  | 
| 76   // The caller is responsible for calling Disconnect() on the returned pointer |  | 
| 77   // to clean up the corresponding resources allocated during this call. |  | 
| 78   PepperBroker* ConnectToBroker(PPB_Broker_Impl* client); |  | 
| 79 |  | 
| 80   // Removes broker from pending_connect_broker_ if present. Returns true if so. |  | 
| 81   bool StopWaitingForBrokerConnection(PepperBroker* broker); |  | 
| 82 |  | 
| 83   void RegisterTCPSocket(PPB_TCPSocket_Private_Impl* socket, uint32 socket_id); |  | 
| 84   void UnregisterTCPSocket(uint32 socket_id); |  | 
| 85   void TCPServerSocketStopListening(uint32 socket_id); |  | 
| 86 |  | 
| 87   // Notifies that |instance| has changed the cursor. |  | 
| 88   // This will update the cursor appearance if it is currently over the plugin |  | 
| 89   // instance. |  | 
| 90   void DidChangeCursor(PepperPluginInstanceImpl* instance, |  | 
| 91                        const WebKit::WebCursorInfo& cursor); |  | 
| 92 |  | 
| 93   // Notifies that |instance| has received a mouse event. |  | 
| 94   void DidReceiveMouseEvent(PepperPluginInstanceImpl* instance); |  | 
| 95 |  | 
| 96   // Notification that the given plugin is focused or unfocused. |  | 
| 97   void PluginFocusChanged(PepperPluginInstanceImpl* instance, bool focused); |  | 
| 98 |  | 
| 99   // Notification that the text input status of the given plugin is changed. |  | 
| 100   void PluginTextInputTypeChanged(PepperPluginInstanceImpl* instance); |  | 
| 101 |  | 
| 102   // Notification that the caret position in the given plugin is changed. |  | 
| 103   void PluginCaretPositionChanged(PepperPluginInstanceImpl* instance); |  | 
| 104 |  | 
| 105   // Notification that the plugin requested to cancel the current composition. |  | 
| 106   void PluginRequestedCancelComposition(PepperPluginInstanceImpl* instance); |  | 
| 107 |  | 
| 108   // Notification that the text selection in the given plugin is changed. |  | 
| 109   void PluginSelectionChanged(PepperPluginInstanceImpl* instance); |  | 
| 110 |  | 
| 111   // Indicates that the given instance has been created. |  | 
| 112   void InstanceCreated(PepperPluginInstanceImpl* instance); |  | 
| 113 |  | 
| 114   // Indicates that the given instance is being destroyed. This is called from |  | 
| 115   // the destructor, so it's important that the instance is not dereferenced |  | 
| 116   // from this call. |  | 
| 117   void InstanceDeleted(PepperPluginInstanceImpl* instance); |  | 
| 118 |  | 
| 119   // Sends an async IPC to open a local file. |  | 
| 120   typedef base::Callback<void (base::PlatformFileError, base::PassPlatformFile)> |  | 
| 121       AsyncOpenFileCallback; |  | 
| 122   bool AsyncOpenFile(const base::FilePath& path, |  | 
| 123                      int flags, |  | 
| 124                      const AsyncOpenFileCallback& callback); |  | 
| 125 |  | 
| 126   // Retrieve current gamepad data. |  | 
| 127   void SampleGamepads(WebKit::WebGamepads* data); |  | 
| 128 |  | 
| 129   // Notifies the plugin of the document load. This should initiate the call to |  | 
| 130   // PPP_Instance.HandleDocumentLoad. |  | 
| 131   // |  | 
| 132   // The loader object should set itself on the PluginInstance as the document |  | 
| 133   // loader using set_document_loader. |  | 
| 134   void HandleDocumentLoad(PepperPluginInstanceImpl* instance, |  | 
| 135                           const WebKit::WebURLResponse& response); |  | 
| 136 |  | 
| 137   // Sets up the renderer host and out-of-process proxy for an external plugin |  | 
| 138   // module. Returns the renderer host, or NULL if it couldn't be created. |  | 
| 139   RendererPpapiHost* CreateExternalPluginModule( |  | 
| 140       scoped_refptr<PluginModule> module, |  | 
| 141       const base::FilePath& path, |  | 
| 142       ::ppapi::PpapiPermissions permissions, |  | 
| 143       const IPC::ChannelHandle& channel_handle, |  | 
| 144       base::ProcessId plugin_pid, |  | 
| 145       int plugin_child_id); |  | 
| 146 |  | 
| 147  private: |  | 
| 148   // RenderViewPepperHelper implementation. |  | 
| 149   virtual WebKit::WebPlugin* CreatePepperWebPlugin( |  | 
| 150     const WebPluginInfo& webplugin_info, |  | 
| 151     const WebKit::WebPluginParams& params) OVERRIDE; |  | 
| 152   virtual void ViewWillInitiatePaint() OVERRIDE; |  | 
| 153   virtual void ViewInitiatedPaint() OVERRIDE; |  | 
| 154   virtual void ViewFlushedPaint() OVERRIDE; |  | 
| 155   virtual PepperPluginInstanceImpl* GetBitmapForOptimizedPluginPaint( |  | 
| 156       const gfx::Rect& paint_bounds, |  | 
| 157       TransportDIB** dib, |  | 
| 158       gfx::Rect* location, |  | 
| 159       gfx::Rect* clip, |  | 
| 160       float* scale_factor) OVERRIDE; |  | 
| 161   virtual void OnSetFocus(bool has_focus) OVERRIDE; |  | 
| 162   virtual void PageVisibilityChanged(bool is_visible) OVERRIDE; |  | 
| 163   virtual bool IsPluginFocused() const OVERRIDE; |  | 
| 164   virtual gfx::Rect GetCaretBounds() const OVERRIDE; |  | 
| 165   virtual ui::TextInputType GetTextInputType() const OVERRIDE; |  | 
| 166   virtual bool IsPluginAcceptingCompositionEvents() const OVERRIDE; |  | 
| 167   virtual bool CanComposeInline() const OVERRIDE; |  | 
| 168   virtual void GetSurroundingText(string16* text, |  | 
| 169                                   ui::Range* range) const OVERRIDE; |  | 
| 170   virtual void OnImeSetComposition( |  | 
| 171       const string16& text, |  | 
| 172       const std::vector<WebKit::WebCompositionUnderline>& underlines, |  | 
| 173       int selection_start, |  | 
| 174       int selection_end) OVERRIDE; |  | 
| 175   virtual void OnImeConfirmComposition(const string16& text) OVERRIDE; |  | 
| 176   virtual void WillHandleMouseEvent() OVERRIDE; |  | 
| 177 |  | 
| 178   // RenderViewObserver implementation. |  | 
| 179   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; |  | 
| 180   virtual void OnDestruct() OVERRIDE; |  | 
| 181 |  | 
| 182   void OnTCPSocketConnectACK(uint32 plugin_dispatcher_id, |  | 
| 183                              uint32 socket_id, |  | 
| 184                              int32_t result, |  | 
| 185                              const PP_NetAddress_Private& local_addr, |  | 
| 186                              const PP_NetAddress_Private& remote_addr); |  | 
| 187   void OnTCPSocketSSLHandshakeACK( |  | 
| 188       uint32 plugin_dispatcher_id, |  | 
| 189       uint32 socket_id, |  | 
| 190       bool succeeded, |  | 
| 191       const ppapi::PPB_X509Certificate_Fields& certificate_fields); |  | 
| 192   void OnTCPSocketReadACK(uint32 plugin_dispatcher_id, |  | 
| 193                           uint32 socket_id, |  | 
| 194                           int32_t result, |  | 
| 195                           const std::string& data); |  | 
| 196   void OnTCPSocketWriteACK(uint32 plugin_dispatcher_id, |  | 
| 197                            uint32 socket_id, |  | 
| 198                            int32_t result); |  | 
| 199   void OnTCPSocketSetOptionACK(uint32 plugin_dispatcher_id, |  | 
| 200                                uint32 socket_id, |  | 
| 201                                int32_t result); |  | 
| 202   void OnTCPServerSocketListenACK(uint32 plugin_dispatcher_id, |  | 
| 203                                   PP_Resource socket_resource, |  | 
| 204                                   uint32 socket_id, |  | 
| 205                                   const PP_NetAddress_Private& local_addr, |  | 
| 206                                   int32_t status); |  | 
| 207   void OnTCPServerSocketAcceptACK(uint32 plugin_dispatcher_id, |  | 
| 208                                   uint32 socket_id, |  | 
| 209                                   uint32 accepted_socket_id, |  | 
| 210                                   const PP_NetAddress_Private& local_addr, |  | 
| 211                                   const PP_NetAddress_Private& remote_addr); |  | 
| 212   void OnPpapiBrokerChannelCreated(int request_id, |  | 
| 213                                    base::ProcessId broker_pid, |  | 
| 214                                    const IPC::ChannelHandle& handle); |  | 
| 215   void OnAsyncFileOpened(base::PlatformFileError error_code, |  | 
| 216                          IPC::PlatformFileForTransit file_for_transit, |  | 
| 217                          int message_id); |  | 
| 218   void OnPpapiBrokerPermissionResult(int request_id, bool result); |  | 
| 219 |  | 
| 220   // Attempts to create a PPAPI plugin for the given filepath. On success, it |  | 
| 221   // will return the newly-created module. |  | 
| 222   // |  | 
| 223   // There are two reasons for failure. The first is that the plugin isn't |  | 
| 224   // a PPAPI plugin. In this case, |*pepper_plugin_was_registered| will be set |  | 
| 225   // to false and the caller may want to fall back on creating an NPAPI plugin. |  | 
| 226   // the second is that the plugin failed to initialize. In this case, |  | 
| 227   // |*pepper_plugin_was_registered| will be set to true and the caller should |  | 
| 228   // not fall back on any other plugin types. |  | 
| 229   scoped_refptr<PluginModule> CreatePepperPluginModule( |  | 
| 230       const WebPluginInfo& webplugin_info, |  | 
| 231       bool* pepper_plugin_was_registered); |  | 
| 232 |  | 
| 233   // Asynchronously attempts to create a PPAPI broker for the given plugin. |  | 
| 234   scoped_refptr<PepperBroker> CreateBroker(PluginModule* plugin_module); |  | 
| 235 |  | 
| 236   // Create a new HostDispatcher for proxying, hook it to the PluginModule, |  | 
| 237   // and perform other common initialization. |  | 
| 238   RendererPpapiHost* CreateOutOfProcessModule( |  | 
| 239       PluginModule* module, |  | 
| 240       const base::FilePath& path, |  | 
| 241       ppapi::PpapiPermissions permissions, |  | 
| 242       const IPC::ChannelHandle& channel_handle, |  | 
| 243       base::ProcessId plugin_pid, |  | 
| 244       int plugin_child_id, |  | 
| 245       bool is_external); |  | 
| 246 |  | 
| 247   // Pointer to the RenderView that owns us. |  | 
| 248   RenderViewImpl* render_view_; |  | 
| 249 |  | 
| 250   // Connection for sending and receiving pepper host-related messages to/from |  | 
| 251   // the browser. |  | 
| 252   PepperBrowserConnection pepper_browser_connection_; |  | 
| 253 |  | 
| 254   std::set<PepperPluginInstanceImpl*> active_instances_; |  | 
| 255 |  | 
| 256   IDMap<AsyncOpenFileCallback> pending_async_open_files_; |  | 
| 257 |  | 
| 258   IDMap<PPB_TCPSocket_Private_Impl> tcp_sockets_; |  | 
| 259 |  | 
| 260   IDMap<ppapi::PPB_TCPServerSocket_Shared> tcp_server_sockets_; |  | 
| 261 |  | 
| 262   typedef IDMap<scoped_refptr<PepperBroker>, IDMapOwnPointer> BrokerMap; |  | 
| 263   BrokerMap pending_connect_broker_; |  | 
| 264 |  | 
| 265   typedef IDMap<base::WeakPtr<PPB_Broker_Impl> > PermissionRequestMap; |  | 
| 266   PermissionRequestMap pending_permission_requests_; |  | 
| 267 |  | 
| 268   // Whether or not the focus is on a PPAPI plugin |  | 
| 269   PepperPluginInstanceImpl* focused_plugin_; |  | 
| 270 |  | 
| 271   // Current text input composition text. Empty if no composition is in |  | 
| 272   // progress. |  | 
| 273   string16 composition_text_; |  | 
| 274 |  | 
| 275   // The plugin instance that received the last mouse event. It is set to NULL |  | 
| 276   // if the last mouse event went to elements other than Pepper plugins. |  | 
| 277   // |last_mouse_event_target_| is not owned by this class. We can know about |  | 
| 278   // when it is destroyed via InstanceDeleted(). |  | 
| 279   PepperPluginInstanceImpl* last_mouse_event_target_; |  | 
| 280 |  | 
| 281   scoped_ptr<GamepadSharedMemoryReader> gamepad_shared_memory_reader_; |  | 
| 282 |  | 
| 283   scoped_refptr<ContextProviderCommandBuffer> offscreen_context3d_; |  | 
| 284 |  | 
| 285   DISALLOW_COPY_AND_ASSIGN(PepperPluginDelegateImpl); |  | 
| 286 }; |  | 
| 287 |  | 
| 288 }  // namespace content |  | 
| 289 |  | 
| 290 #endif  // CONTENT_RENDERER_PEPPER_PEPPER_PLUGIN_DELEGATE_IMPL_H_ |  | 
| OLD | NEW | 
|---|