| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2010 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 CHROME_PLUGIN_WEBPLUGIN_PROXY_H_ | |
| 6 #define CHROME_PLUGIN_WEBPLUGIN_PROXY_H_ | |
| 7 #pragma once | |
| 8 | |
| 9 #include <string> | |
| 10 | |
| 11 #if defined(USE_X11) | |
| 12 #include "ui/base/x/x11_util.h" | |
| 13 #endif | |
| 14 #include "app/surface/transport_dib.h" | |
| 15 #include "base/hash_tables.h" | |
| 16 #include "base/ref_counted.h" | |
| 17 #if defined(OS_MACOSX) | |
| 18 #include "base/mac/scoped_cftyperef.h" | |
| 19 #endif | |
| 20 #include "base/scoped_handle.h" | |
| 21 #include "base/scoped_ptr.h" | |
| 22 #include "base/shared_memory.h" | |
| 23 #include "base/timer.h" | |
| 24 #include "googleurl/src/gurl.h" | |
| 25 #include "ipc/ipc_message.h" | |
| 26 #include "webkit/plugins/npapi/webplugin.h" | |
| 27 | |
| 28 class PluginChannel; | |
| 29 | |
| 30 namespace webkit { | |
| 31 namespace npapi { | |
| 32 class WebPluginDelegateImpl; | |
| 33 } | |
| 34 } | |
| 35 | |
| 36 #if defined(OS_MACOSX) | |
| 37 class WebPluginAcceleratedSurfaceProxy; | |
| 38 #endif | |
| 39 | |
| 40 // This is an implementation of WebPlugin that proxies all calls to the | |
| 41 // renderer. | |
| 42 class WebPluginProxy : public webkit::npapi::WebPlugin { | |
| 43 public: | |
| 44 // Creates a new proxy for WebPlugin, using the given sender to send the | |
| 45 // marshalled WebPlugin calls. | |
| 46 WebPluginProxy(PluginChannel* channel, | |
| 47 int route_id, | |
| 48 const GURL& page_url, | |
| 49 gfx::NativeViewId containing_window, | |
| 50 int host_render_view_routing_id); | |
| 51 ~WebPluginProxy(); | |
| 52 | |
| 53 void set_delegate(webkit::npapi::WebPluginDelegateImpl* d) { delegate_ = d; } | |
| 54 | |
| 55 // WebPlugin overrides | |
| 56 virtual void SetWindow(gfx::PluginWindowHandle window); | |
| 57 | |
| 58 // Whether input events should be sent to the delegate. | |
| 59 virtual void SetAcceptsInputEvents(bool accepts); | |
| 60 | |
| 61 virtual void WillDestroyWindow(gfx::PluginWindowHandle window); | |
| 62 #if defined(OS_WIN) | |
| 63 void SetWindowlessPumpEvent(HANDLE pump_messages_event); | |
| 64 #endif | |
| 65 | |
| 66 virtual void CancelResource(unsigned long id); | |
| 67 virtual void Invalidate(); | |
| 68 virtual void InvalidateRect(const gfx::Rect& rect); | |
| 69 virtual NPObject* GetWindowScriptNPObject(); | |
| 70 virtual NPObject* GetPluginElement(); | |
| 71 virtual void SetCookie(const GURL& url, | |
| 72 const GURL& first_party_for_cookies, | |
| 73 const std::string& cookie); | |
| 74 virtual std::string GetCookies(const GURL& url, | |
| 75 const GURL& first_party_for_cookies); | |
| 76 | |
| 77 virtual void OnMissingPluginStatus(int status); | |
| 78 // class-specific methods | |
| 79 | |
| 80 // Returns a WebPluginResourceClient object given its id, or NULL if no | |
| 81 // object with that id exists. | |
| 82 webkit::npapi::WebPluginResourceClient* GetResourceClient(int id); | |
| 83 | |
| 84 // Returns the id of the renderer that contains this plugin. | |
| 85 int GetRendererId(); | |
| 86 | |
| 87 // Returns the id of the associated render view. | |
| 88 int host_render_view_routing_id() const { | |
| 89 return host_render_view_routing_id_; | |
| 90 } | |
| 91 | |
| 92 // For windowless plugins, paints the given rectangle into the local buffer. | |
| 93 void Paint(const gfx::Rect& rect); | |
| 94 | |
| 95 // Callback from the renderer to let us know that a paint occurred. | |
| 96 void DidPaint(); | |
| 97 | |
| 98 // Notification received on a plugin issued resource request creation. | |
| 99 void OnResourceCreated(int resource_id, | |
| 100 webkit::npapi::WebPluginResourceClient* client); | |
| 101 | |
| 102 virtual void HandleURLRequest(const char* url, | |
| 103 const char* method, | |
| 104 const char* target, | |
| 105 const char* buf, | |
| 106 unsigned int len, | |
| 107 int notify_id, | |
| 108 bool popups_allowed, | |
| 109 bool notify_redirects); | |
| 110 void UpdateGeometry(const gfx::Rect& window_rect, | |
| 111 const gfx::Rect& clip_rect, | |
| 112 const TransportDIB::Handle& windowless_buffer, | |
| 113 const TransportDIB::Handle& background_buffer, | |
| 114 bool transparent | |
| 115 #if defined(OS_MACOSX) | |
| 116 , | |
| 117 int ack_key | |
| 118 #endif | |
| 119 ); | |
| 120 virtual void CancelDocumentLoad(); | |
| 121 virtual void InitiateHTTPRangeRequest( | |
| 122 const char* url, const char* range_info, int range_request_id); | |
| 123 virtual void SetDeferResourceLoading(unsigned long resource_id, bool defer); | |
| 124 virtual bool IsOffTheRecord(); | |
| 125 virtual void ResourceClientDeleted( | |
| 126 webkit::npapi::WebPluginResourceClient* resource_client); | |
| 127 gfx::NativeViewId containing_window() { return containing_window_; } | |
| 128 | |
| 129 #if defined(OS_MACOSX) | |
| 130 virtual void FocusChanged(bool focused); | |
| 131 | |
| 132 virtual void StartIme(); | |
| 133 | |
| 134 virtual void BindFakePluginWindowHandle(bool opaque); | |
| 135 | |
| 136 virtual webkit::npapi::WebPluginAcceleratedSurface* GetAcceleratedSurface(); | |
| 137 | |
| 138 // Tell the browser (via the renderer) to invalidate because the | |
| 139 // accelerated buffers have changed. | |
| 140 virtual void AcceleratedFrameBuffersDidSwap( | |
| 141 gfx::PluginWindowHandle window, uint64 surface_id); | |
| 142 | |
| 143 // Tell the renderer and browser to associate the given plugin handle with | |
| 144 // |accelerated_surface_identifier|. The geometry is used to resize any | |
| 145 // native "window" (which on the Mac is a just a view). | |
| 146 // This method is used when IOSurface support is available. | |
| 147 virtual void SetAcceleratedSurface(gfx::PluginWindowHandle window, | |
| 148 const gfx::Size& size, | |
| 149 uint64 accelerated_surface_identifier); | |
| 150 | |
| 151 // Tell the renderer and browser to associate the given plugin handle with | |
| 152 // |dib_handle|. The geometry is used to resize any native "window" (which | |
| 153 // on the Mac is just a view). | |
| 154 // This method is used when IOSurface support is not available. | |
| 155 virtual void SetAcceleratedDIB( | |
| 156 gfx::PluginWindowHandle window, | |
| 157 const gfx::Size& size, | |
| 158 const TransportDIB::Handle& dib_handle); | |
| 159 | |
| 160 // Create/destroy TranportDIBs via messages to the browser process. | |
| 161 // These are only used when IOSurface support is not available. | |
| 162 virtual void AllocSurfaceDIB(const size_t size, | |
| 163 TransportDIB::Handle* dib_handle); | |
| 164 virtual void FreeSurfaceDIB(TransportDIB::Id dib_id); | |
| 165 #endif | |
| 166 | |
| 167 virtual void URLRedirectResponse(bool allow, int resource_id); | |
| 168 | |
| 169 private: | |
| 170 bool Send(IPC::Message* msg); | |
| 171 | |
| 172 // Handler for sending over the paint event to the plugin. | |
| 173 void OnPaint(const gfx::Rect& damaged_rect); | |
| 174 | |
| 175 // Updates the shared memory section where windowless plugins paint. | |
| 176 void SetWindowlessBuffer(const TransportDIB::Handle& windowless_buffer, | |
| 177 const TransportDIB::Handle& background_buffer, | |
| 178 const gfx::Rect& window_rect); | |
| 179 | |
| 180 typedef base::hash_map<int, webkit::npapi::WebPluginResourceClient*> | |
| 181 ResourceClientMap; | |
| 182 ResourceClientMap resource_clients_; | |
| 183 | |
| 184 scoped_refptr<PluginChannel> channel_; | |
| 185 int route_id_; | |
| 186 NPObject* window_npobject_; | |
| 187 NPObject* plugin_element_; | |
| 188 webkit::npapi::WebPluginDelegateImpl* delegate_; | |
| 189 gfx::Rect damaged_rect_; | |
| 190 bool waiting_for_paint_; | |
| 191 gfx::NativeViewId containing_window_; | |
| 192 // The url of the main frame hosting the plugin. | |
| 193 GURL page_url_; | |
| 194 | |
| 195 // Variables used for desynchronized windowless plugin painting. See note in | |
| 196 // webplugin_delegate_proxy.h for how this works. | |
| 197 bool transparent_; | |
| 198 #if defined(OS_MACOSX) | |
| 199 scoped_ptr<TransportDIB> windowless_dib_; | |
| 200 scoped_ptr<TransportDIB> background_dib_; | |
| 201 base::mac::ScopedCFTypeRef<CGContextRef> windowless_context_; | |
| 202 base::mac::ScopedCFTypeRef<CGContextRef> background_context_; | |
| 203 scoped_ptr<WebPluginAcceleratedSurfaceProxy> accelerated_surface_; | |
| 204 #else | |
| 205 scoped_ptr<skia::PlatformCanvas> windowless_canvas_; | |
| 206 scoped_ptr<skia::PlatformCanvas> background_canvas_; | |
| 207 | |
| 208 #if defined(USE_X11) | |
| 209 scoped_ptr<TransportDIB> windowless_dib_; | |
| 210 scoped_ptr<TransportDIB> background_dib_; | |
| 211 // If we can use SHM pixmaps for windowless plugin painting or not. | |
| 212 bool use_shm_pixmap_; | |
| 213 // The SHM pixmap for windowless plugin painting. | |
| 214 XID windowless_shm_pixmap_; | |
| 215 #endif | |
| 216 | |
| 217 #endif | |
| 218 | |
| 219 // Contains the routing id of the host render view. | |
| 220 int host_render_view_routing_id_; | |
| 221 | |
| 222 ScopedRunnableMethodFactory<WebPluginProxy> runnable_method_factory_; | |
| 223 }; | |
| 224 | |
| 225 #endif // CHROME_PLUGIN_WEBPLUGIN_PROXY_H_ | |
| OLD | NEW |