| 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_RENDERER_WEBPLUGIN_DELEGATE_PROXY_H_ | |
| 6 #define CHROME_RENDERER_WEBPLUGIN_DELEGATE_PROXY_H_ | |
| 7 #pragma once | |
| 8 | |
| 9 #include <string> | |
| 10 #include <vector> | |
| 11 | |
| 12 #include "app/surface/transport_dib.h" | |
| 13 #include "base/ref_counted.h" | |
| 14 #include "base/scoped_ptr.h" | |
| 15 #include "base/weak_ptr.h" | |
| 16 #include "googleurl/src/gurl.h" | |
| 17 #include "ipc/ipc_channel.h" | |
| 18 #include "ipc/ipc_message.h" | |
| 19 #include "ui/gfx/native_widget_types.h" | |
| 20 #include "ui/gfx/rect.h" | |
| 21 #include "webkit/plugins/npapi/webplugininfo.h" | |
| 22 #include "webkit/plugins/npapi/webplugin_delegate.h" | |
| 23 | |
| 24 #if defined(OS_MACOSX) | |
| 25 #include "base/hash_tables.h" | |
| 26 #include "base/linked_ptr.h" | |
| 27 #endif | |
| 28 | |
| 29 struct NPObject; | |
| 30 class NPObjectStub; | |
| 31 struct NPVariant_Param; | |
| 32 class PluginChannelHost; | |
| 33 struct PluginHostMsg_URLRequest_Params; | |
| 34 class RenderView; | |
| 35 class SkBitmap; | |
| 36 | |
| 37 namespace base { | |
| 38 class SharedMemory; | |
| 39 class WaitableEvent; | |
| 40 } | |
| 41 | |
| 42 namespace skia { | |
| 43 class PlatformCanvas; | |
| 44 } | |
| 45 | |
| 46 namespace webkit { | |
| 47 namespace npapi { | |
| 48 class WebPlugin; | |
| 49 } | |
| 50 } | |
| 51 | |
| 52 // An implementation of WebPluginDelegate that proxies all calls to | |
| 53 // the plugin process. | |
| 54 class WebPluginDelegateProxy | |
| 55 : public webkit::npapi::WebPluginDelegate, | |
| 56 public IPC::Channel::Listener, | |
| 57 public IPC::Message::Sender, | |
| 58 public base::SupportsWeakPtr<WebPluginDelegateProxy> { | |
| 59 public: | |
| 60 WebPluginDelegateProxy(const std::string& mime_type, | |
| 61 const base::WeakPtr<RenderView>& render_view); | |
| 62 | |
| 63 // WebPluginDelegate implementation: | |
| 64 virtual void PluginDestroyed(); | |
| 65 virtual bool Initialize(const GURL& url, | |
| 66 const std::vector<std::string>& arg_names, | |
| 67 const std::vector<std::string>& arg_values, | |
| 68 webkit::npapi::WebPlugin* plugin, | |
| 69 bool load_manually); | |
| 70 virtual void UpdateGeometry(const gfx::Rect& window_rect, | |
| 71 const gfx::Rect& clip_rect); | |
| 72 virtual void Paint(WebKit::WebCanvas* canvas, const gfx::Rect& rect); | |
| 73 virtual void Print(gfx::NativeDrawingContext context); | |
| 74 virtual NPObject* GetPluginScriptableObject(); | |
| 75 virtual void DidFinishLoadWithReason(const GURL& url, NPReason reason, | |
| 76 int notify_id); | |
| 77 virtual void SetFocus(bool focused); | |
| 78 virtual bool HandleInputEvent(const WebKit::WebInputEvent& event, | |
| 79 WebKit::WebCursorInfo* cursor); | |
| 80 virtual int GetProcessId(); | |
| 81 | |
| 82 // Informs the plugin that its containing content view has gained or lost | |
| 83 // first responder status. | |
| 84 virtual void SetContentAreaFocus(bool has_focus); | |
| 85 #if defined(OS_MACOSX) | |
| 86 // Informs the plugin that its enclosing window has gained or lost focus. | |
| 87 virtual void SetWindowFocus(bool window_has_focus); | |
| 88 // Informs the plugin that its container (window/tab) has changed visibility. | |
| 89 virtual void SetContainerVisibility(bool is_visible); | |
| 90 // Informs the plugin that its enclosing window's frame has changed. | |
| 91 virtual void WindowFrameChanged(gfx::Rect window_frame, gfx::Rect view_frame); | |
| 92 // Informs the plugin that plugin IME has completed. | |
| 93 // If |text| is empty, composition was cancelled. | |
| 94 virtual void ImeCompositionCompleted(const string16& text, int plugin_id); | |
| 95 #endif | |
| 96 | |
| 97 // IPC::Channel::Listener implementation: | |
| 98 virtual bool OnMessageReceived(const IPC::Message& msg); | |
| 99 virtual void OnChannelError(); | |
| 100 | |
| 101 // IPC::Message::Sender implementation: | |
| 102 virtual bool Send(IPC::Message* msg); | |
| 103 | |
| 104 virtual void SendJavaScriptStream(const GURL& url, | |
| 105 const std::string& result, | |
| 106 bool success, | |
| 107 int notify_id); | |
| 108 | |
| 109 virtual void DidReceiveManualResponse(const GURL& url, | |
| 110 const std::string& mime_type, | |
| 111 const std::string& headers, | |
| 112 uint32 expected_length, | |
| 113 uint32 last_modified); | |
| 114 virtual void DidReceiveManualData(const char* buffer, int length); | |
| 115 virtual void DidFinishManualLoading(); | |
| 116 virtual void DidManualLoadFail(); | |
| 117 virtual void InstallMissingPlugin(); | |
| 118 virtual webkit::npapi::WebPluginResourceClient* CreateResourceClient( | |
| 119 unsigned long resource_id, const GURL& url, int notify_id); | |
| 120 virtual webkit::npapi::WebPluginResourceClient* CreateSeekableResourceClient( | |
| 121 unsigned long resource_id, int range_request_id); | |
| 122 | |
| 123 gfx::PluginWindowHandle GetPluginWindowHandle(); | |
| 124 | |
| 125 protected: | |
| 126 template<class WebPluginDelegateProxy> friend class DeleteTask; | |
| 127 ~WebPluginDelegateProxy(); | |
| 128 | |
| 129 private: | |
| 130 // Message handlers for messages that proxy WebPlugin methods, which | |
| 131 // we translate into calls to the real WebPlugin. | |
| 132 void OnSetWindow(gfx::PluginWindowHandle window); | |
| 133 #if defined(OS_WIN) | |
| 134 void OnSetWindowlessPumpEvent(HANDLE modal_loop_pump_messages_event); | |
| 135 #endif | |
| 136 void OnCompleteURL(const std::string& url_in, std::string* url_out, | |
| 137 bool* result); | |
| 138 void OnHandleURLRequest(const PluginHostMsg_URLRequest_Params& params); | |
| 139 void OnCancelResource(int id); | |
| 140 void OnInvalidateRect(const gfx::Rect& rect); | |
| 141 void OnGetWindowScriptNPObject(int route_id, bool* success); | |
| 142 void OnGetPluginElement(int route_id, bool* success); | |
| 143 void OnSetCookie(const GURL& url, | |
| 144 const GURL& first_party_for_cookies, | |
| 145 const std::string& cookie); | |
| 146 void OnGetCookies(const GURL& url, const GURL& first_party_for_cookies, | |
| 147 std::string* cookies); | |
| 148 void OnMissingPluginStatus(int status); | |
| 149 void OnCancelDocumentLoad(); | |
| 150 void OnInitiateHTTPRangeRequest(const std::string& url, | |
| 151 const std::string& range_info, | |
| 152 int range_request_id); | |
| 153 void OnDeferResourceLoading(unsigned long resource_id, bool defer); | |
| 154 | |
| 155 #if defined(OS_MACOSX) | |
| 156 void OnFocusChanged(bool focused); | |
| 157 void OnStartIme(); | |
| 158 void OnBindFakePluginWindowHandle(bool opaque); | |
| 159 void OnUpdateGeometry_ACK(int ack_key); | |
| 160 void OnAcceleratedSurfaceSetIOSurface(gfx::PluginWindowHandle window, | |
| 161 int32 width, | |
| 162 int32 height, | |
| 163 uint64 io_surface_identifier); | |
| 164 void OnAcceleratedSurfaceSetTransportDIB(gfx::PluginWindowHandle window, | |
| 165 int32 width, | |
| 166 int32 height, | |
| 167 TransportDIB::Handle transport_dib); | |
| 168 void OnAcceleratedSurfaceAllocTransportDIB(size_t size, | |
| 169 TransportDIB::Handle* dib_handle); | |
| 170 void OnAcceleratedSurfaceFreeTransportDIB(TransportDIB::Id dib_id); | |
| 171 void OnAcceleratedSurfaceBuffersSwapped(gfx::PluginWindowHandle window, | |
| 172 uint64 surface_id); | |
| 173 #endif | |
| 174 | |
| 175 void OnURLRedirectResponse(bool allow, int resource_id); | |
| 176 | |
| 177 // Draw a graphic indicating a crashed plugin. | |
| 178 void PaintSadPlugin(WebKit::WebCanvas* canvas, const gfx::Rect& rect); | |
| 179 | |
| 180 // Returns true if the given rectangle is different in the native drawing | |
| 181 // context and the current background bitmap. | |
| 182 bool BackgroundChanged(gfx::NativeDrawingContext context, | |
| 183 const gfx::Rect& rect); | |
| 184 | |
| 185 // Copies the given rectangle from the transport bitmap to the backing store. | |
| 186 void CopyFromTransportToBacking(const gfx::Rect& rect); | |
| 187 | |
| 188 // Clears the shared memory section and canvases used for windowless plugins. | |
| 189 void ResetWindowlessBitmaps(); | |
| 190 | |
| 191 #if !defined(OS_WIN) | |
| 192 // Creates a process-local memory section and canvas. PlatformCanvas on | |
| 193 // Windows only works with a DIB, not arbitrary memory. | |
| 194 bool CreateLocalBitmap(std::vector<uint8>* memory, | |
| 195 scoped_ptr<skia::PlatformCanvas>* canvas); | |
| 196 #endif | |
| 197 | |
| 198 // Creates a shared memory section and canvas. | |
| 199 bool CreateSharedBitmap(scoped_ptr<TransportDIB>* memory, | |
| 200 scoped_ptr<skia::PlatformCanvas>* canvas); | |
| 201 | |
| 202 // Called for cleanup during plugin destruction. Normally right before the | |
| 203 // plugin window gets destroyed, or when the plugin has crashed (at which | |
| 204 // point the window has already been destroyed). | |
| 205 void WillDestroyWindow(); | |
| 206 | |
| 207 #if defined(OS_MACOSX) | |
| 208 // Synthesize a fake window handle for the plug-in to identify the instance | |
| 209 // to the browser, allowing mapping to a surface for hardware acceleration | |
| 210 // of plug-in content. The browser generates the handle which is then set on | |
| 211 // the plug-in. Returns true if it successfully sets the window handle on the | |
| 212 // plug-in. | |
| 213 bool BindFakePluginWindowHandle(bool opaque); | |
| 214 | |
| 215 typedef base::hash_map<int, linked_ptr<TransportDIB> > OldTransportDIBMap; | |
| 216 | |
| 217 OldTransportDIBMap old_transport_dibs_; | |
| 218 #endif // OS_MACOSX | |
| 219 | |
| 220 #if defined(OS_WIN) | |
| 221 // Returns true if we should update the plugin geometry synchronously. | |
| 222 bool UseSynchronousGeometryUpdates(); | |
| 223 #endif | |
| 224 | |
| 225 base::WeakPtr<RenderView> render_view_; | |
| 226 webkit::npapi::WebPlugin* plugin_; | |
| 227 bool uses_shared_bitmaps_; | |
| 228 gfx::PluginWindowHandle window_; | |
| 229 scoped_refptr<PluginChannelHost> channel_host_; | |
| 230 std::string mime_type_; | |
| 231 int instance_id_; | |
| 232 webkit::npapi::WebPluginInfo info_; | |
| 233 | |
| 234 gfx::Rect plugin_rect_; | |
| 235 gfx::Rect clip_rect_; | |
| 236 | |
| 237 NPObject* npobject_; | |
| 238 base::WeakPtr<NPObjectStub> window_script_object_; | |
| 239 | |
| 240 // Event passed in by the plugin process and is used to decide if | |
| 241 // messages need to be pumped in the NPP_HandleEvent sync call. | |
| 242 scoped_ptr<base::WaitableEvent> modal_loop_pump_messages_event_; | |
| 243 | |
| 244 // Bitmap for crashed plugin | |
| 245 SkBitmap* sad_plugin_; | |
| 246 | |
| 247 // True if we got an invalidate from the plugin and are waiting for a paint. | |
| 248 bool invalidate_pending_; | |
| 249 | |
| 250 // Used to desynchronize windowless painting. When WebKit paints, we bitblt | |
| 251 // from our backing store of what the plugin rectangle looks like. The | |
| 252 // plugin paints into the transport store, and we copy that to our backing | |
| 253 // store when we get an invalidate from it. The background bitmap is used | |
| 254 // for transparent plugins, as they need the backgroud data during painting. | |
| 255 bool transparent_; | |
| 256 #if defined(OS_WIN) | |
| 257 scoped_ptr<TransportDIB> backing_store_; | |
| 258 #else | |
| 259 std::vector<uint8> backing_store_; | |
| 260 #endif | |
| 261 scoped_ptr<skia::PlatformCanvas> backing_store_canvas_; | |
| 262 scoped_ptr<TransportDIB> transport_store_; | |
| 263 scoped_ptr<skia::PlatformCanvas> transport_store_canvas_; | |
| 264 scoped_ptr<TransportDIB> background_store_; | |
| 265 scoped_ptr<skia::PlatformCanvas> background_store_canvas_; | |
| 266 // This lets us know which portion of the backing store has been painted into. | |
| 267 gfx::Rect backing_store_painted_; | |
| 268 | |
| 269 // The url of the main frame hosting the plugin. | |
| 270 GURL page_url_; | |
| 271 | |
| 272 DISALLOW_COPY_AND_ASSIGN(WebPluginDelegateProxy); | |
| 273 }; | |
| 274 | |
| 275 #endif // CHROME_RENDERER_WEBPLUGIN_DELEGATE_PROXY_H_ | |
| OLD | NEW |