[SyncFS] Build indexes from FileTracker entries on disk.
[chromium-blink-merge.git] / content / plugin / webplugin_proxy.h
blob5cece13893eb7fef8f132e1529ac8abbc37f65d9
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.
5 #ifndef CONTENT_PLUGIN_WEBPLUGIN_PROXY_H_
6 #define CONTENT_PLUGIN_WEBPLUGIN_PROXY_H_
8 #include <string>
10 #include "base/containers/hash_tables.h"
11 #include "base/memory/ref_counted.h"
12 #if defined(OS_MACOSX)
13 #include "base/mac/scoped_cftyperef.h"
14 #endif
15 #include "base/memory/scoped_ptr.h"
16 #include "base/memory/shared_memory.h"
17 #include "base/memory/weak_ptr.h"
18 #include "base/timer/timer.h"
19 #include "content/child/npapi/webplugin.h"
20 #include "ipc/ipc_message.h"
21 #include "ipc/ipc_sender.h"
22 #include "skia/ext/refptr.h"
23 #include "third_party/skia/include/core/SkCanvas.h"
24 #include "url/gurl.h"
25 #include "ui/gl/gpu_preference.h"
26 #include "ui/surface/transport_dib.h"
28 struct PluginMsg_FetchURL_Params;
30 namespace content {
31 class PluginChannel;
32 class WebPluginDelegateImpl;
34 #if defined(OS_MACOSX)
35 class WebPluginAcceleratedSurfaceProxy;
36 #endif
38 // This is an implementation of WebPlugin that proxies all calls to the
39 // renderer.
40 class WebPluginProxy : public WebPlugin,
41 public IPC::Sender {
42 public:
43 // Creates a new proxy for WebPlugin, using the given sender to send the
44 // marshalled WebPlugin calls.
45 WebPluginProxy(PluginChannel* channel,
46 int route_id,
47 const GURL& page_url,
48 int host_render_view_routing_id);
49 virtual ~WebPluginProxy();
51 void set_delegate(WebPluginDelegateImpl* d) { delegate_ = d; }
53 // WebPlugin overrides
54 virtual void SetWindow(gfx::PluginWindowHandle window) OVERRIDE;
55 virtual void SetAcceptsInputEvents(bool accepts) OVERRIDE;
56 virtual void WillDestroyWindow(gfx::PluginWindowHandle window) OVERRIDE;
57 virtual void CancelResource(unsigned long id) OVERRIDE;
58 virtual void Invalidate() OVERRIDE;
59 virtual void InvalidateRect(const gfx::Rect& rect) OVERRIDE;
60 virtual NPObject* GetWindowScriptNPObject() OVERRIDE;
61 virtual NPObject* GetPluginElement() OVERRIDE;
62 virtual bool FindProxyForUrl(const GURL& url,
63 std::string* proxy_list) OVERRIDE;
64 virtual void SetCookie(const GURL& url,
65 const GURL& first_party_for_cookies,
66 const std::string& cookie) OVERRIDE;
67 virtual std::string GetCookies(const GURL& url,
68 const GURL& first_party_for_cookies) OVERRIDE;
69 virtual void HandleURLRequest(const char* url,
70 const char* method,
71 const char* target,
72 const char* buf,
73 unsigned int len,
74 int notify_id,
75 bool popups_allowed,
76 bool notify_redirects) OVERRIDE;
77 void UpdateGeometry(const gfx::Rect& window_rect,
78 const gfx::Rect& clip_rect,
79 const TransportDIB::Handle& windowless_buffer0,
80 const TransportDIB::Handle& windowless_buffer1,
81 int windowless_buffer_index);
82 virtual void CancelDocumentLoad() OVERRIDE;
83 virtual void InitiateHTTPRangeRequest(
84 const char* url, const char* range_info, int range_request_id) OVERRIDE;
85 virtual void DidStartLoading() OVERRIDE;
86 virtual void DidStopLoading() OVERRIDE;
87 virtual void SetDeferResourceLoading(unsigned long resource_id,
88 bool defer) OVERRIDE;
89 virtual bool IsOffTheRecord() OVERRIDE;
90 virtual void ResourceClientDeleted(
91 WebPluginResourceClient* resource_client) OVERRIDE;
92 virtual void URLRedirectResponse(bool allow, int resource_id) OVERRIDE;
93 virtual bool CheckIfRunInsecureContent(const GURL& url) OVERRIDE;
94 #if defined(OS_WIN)
95 void SetWindowlessData(HANDLE pump_messages_event,
96 gfx::NativeViewId dummy_activation_window);
97 #endif
98 #if defined(OS_MACOSX)
99 virtual void FocusChanged(bool focused) OVERRIDE;
100 virtual void StartIme() OVERRIDE;
101 virtual WebPluginAcceleratedSurface*
102 GetAcceleratedSurface(gfx::GpuPreference gpu_preference) OVERRIDE;
103 virtual void AcceleratedPluginEnabledRendering() OVERRIDE;
104 virtual void AcceleratedPluginAllocatedIOSurface(int32 width,
105 int32 height,
106 uint32 surface_id) OVERRIDE;
107 virtual void AcceleratedPluginSwappedIOSurface() OVERRIDE;
108 #endif
110 // IPC::Sender implementation.
111 virtual bool Send(IPC::Message* msg) OVERRIDE;
113 // class-specific methods
115 // Returns a WebPluginResourceClient object given its id, or NULL if no
116 // object with that id exists.
117 WebPluginResourceClient* GetResourceClient(int id);
119 // Returns the id of the renderer that contains this plugin.
120 int GetRendererId();
122 // Returns the id of the associated render view.
123 int host_render_view_routing_id() const {
124 return host_render_view_routing_id_;
127 // For windowless plugins, paints the given rectangle into the local buffer.
128 void Paint(const gfx::Rect& rect);
130 // Callback from the renderer to let us know that a paint occurred.
131 void DidPaint();
133 // Notification received on a plugin issued resource request creation.
134 void OnResourceCreated(int resource_id, WebPluginResourceClient* client);
136 #if defined(OS_WIN) && !defined(USE_AURA)
137 // Retrieves the IME status from a windowless plug-in and sends it to a
138 // renderer process. A renderer process will convert the coordinates from
139 // local to the window coordinates and send the converted coordinates to a
140 // browser process.
141 void UpdateIMEStatus();
142 #endif
144 private:
145 class SharedTransportDIB : public base::RefCounted<SharedTransportDIB> {
146 public:
147 explicit SharedTransportDIB(TransportDIB* dib);
148 TransportDIB* dib() { return dib_.get(); }
149 private:
150 friend class base::RefCounted<SharedTransportDIB>;
151 ~SharedTransportDIB();
153 scoped_ptr<TransportDIB> dib_;
156 // Handler for sending over the paint event to the plugin.
157 void OnPaint(const gfx::Rect& damaged_rect);
159 #if defined(OS_WIN)
160 void CreateCanvasFromHandle(const TransportDIB::Handle& dib_handle,
161 const gfx::Rect& window_rect,
162 skia::RefPtr<SkCanvas>* canvas);
163 #elif defined(OS_MACOSX)
164 static void CreateDIBAndCGContextFromHandle(
165 const TransportDIB::Handle& dib_handle,
166 const gfx::Rect& window_rect,
167 scoped_ptr<TransportDIB>* dib_out,
168 base::ScopedCFTypeRef<CGContextRef>* cg_context_out);
169 #endif
171 // Updates the shared memory sections where windowless plugins paint.
172 void SetWindowlessBuffers(const TransportDIB::Handle& windowless_buffer0,
173 const TransportDIB::Handle& windowless_buffer1,
174 const gfx::Rect& window_rect);
176 #if defined(OS_MACOSX)
177 CGContextRef windowless_context() const {
178 return windowless_contexts_[windowless_buffer_index_].get();
180 #else
181 skia::RefPtr<SkCanvas> windowless_canvas() const {
182 return windowless_canvases_[windowless_buffer_index_];
184 #endif
186 typedef base::hash_map<int, WebPluginResourceClient*> ResourceClientMap;
187 ResourceClientMap resource_clients_;
189 scoped_refptr<PluginChannel> channel_;
190 int route_id_;
191 NPObject* window_npobject_;
192 NPObject* plugin_element_;
193 WebPluginDelegateImpl* delegate_;
194 gfx::Rect damaged_rect_;
195 bool waiting_for_paint_;
196 // The url of the main frame hosting the plugin.
197 GURL page_url_;
199 // Variables used for desynchronized windowless plugin painting. See note in
200 // webplugin_delegate_proxy.h for how this works. The two sets of windowless_*
201 // fields are for the front-buffer and back-buffer of a buffer flipping system
202 // and windowless_buffer_index_ identifies which set we are using as the
203 // back-buffer at any given time.
204 int windowless_buffer_index_;
205 #if defined(OS_MACOSX)
206 scoped_ptr<TransportDIB> windowless_dibs_[2];
207 base::ScopedCFTypeRef<CGContextRef> windowless_contexts_[2];
208 scoped_ptr<WebPluginAcceleratedSurfaceProxy> accelerated_surface_;
209 #else
210 skia::RefPtr<SkCanvas> windowless_canvases_[2];
211 #endif
213 // Contains the routing id of the host render view.
214 int host_render_view_routing_id_;
216 base::WeakPtrFactory<WebPluginProxy> weak_factory_;
219 } // namespace content
221 #endif // CONTENT_PLUGIN_WEBPLUGIN_PROXY_H_