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 WEBKIT_PLUGINS_NPAPI_WEBPLUGIN_IMPL_H_ | |
6 #define WEBKIT_PLUGINS_NPAPI_WEBPLUGIN_IMPL_H_ | |
7 | |
8 #include <map> | |
9 #include <string> | |
10 #include <vector> | |
11 | |
12 #include "base/basictypes.h" | |
13 #include "base/files/file_path.h" | |
14 #include "base/memory/scoped_ptr.h" | |
15 #include "base/memory/weak_ptr.h" | |
16 #include "third_party/WebKit/public/platform/WebRect.h" | |
17 #include "third_party/WebKit/public/platform/WebString.h" | |
18 #include "third_party/WebKit/public/platform/WebURLLoaderClient.h" | |
19 #include "third_party/WebKit/public/platform/WebURLRequest.h" | |
20 #include "third_party/WebKit/public/platform/WebVector.h" | |
21 #include "third_party/WebKit/public/web/WebPlugin.h" | |
22 #include "ui/gfx/native_widget_types.h" | |
23 #include "url/gurl.h" | |
24 #include "webkit/plugins/npapi/webplugin.h" | |
25 #include "webkit/plugins/webkit_plugins_export.h" | |
26 | |
27 namespace cc { | |
28 class IOSurfaceLayer; | |
29 } | |
30 | |
31 namespace WebKit { | |
32 class WebFrame; | |
33 class WebLayer; | |
34 class WebPluginContainer; | |
35 class WebURLResponse; | |
36 class WebURLLoader; | |
37 class WebURLRequest; | |
38 } | |
39 | |
40 namespace webkit_glue { | |
41 class MultipartResponseDelegate; | |
42 } // namespace webkit_glue | |
43 | |
44 namespace webkit { | |
45 namespace npapi { | |
46 | |
47 class WebPluginDelegate; | |
48 class WebPluginPageDelegate; | |
49 | |
50 // This is the WebKit side of the plugin implementation that forwards calls, | |
51 // after changing out of WebCore types, to a delegate. The delegate may | |
52 // be in a different process. | |
53 class WEBKIT_PLUGINS_EXPORT WebPluginImpl : | |
54 NON_EXPORTED_BASE(public WebPlugin), | |
55 NON_EXPORTED_BASE(public WebKit::WebPlugin), | |
56 NON_EXPORTED_BASE(public WebKit::WebURLLoaderClient) { | |
57 public: | |
58 WebPluginImpl( | |
59 WebKit::WebFrame* frame, | |
60 const WebKit::WebPluginParams& params, | |
61 const base::FilePath& file_path, | |
62 const base::WeakPtr<WebPluginPageDelegate>& page_delegate); | |
63 virtual ~WebPluginImpl(); | |
64 | |
65 // Helper function for sorting post data. | |
66 static bool SetPostData(WebKit::WebURLRequest* request, | |
67 const char* buf, | |
68 uint32 length); | |
69 | |
70 virtual WebPluginDelegate* delegate(); | |
71 | |
72 private: | |
73 // WebKit::WebPlugin methods: | |
74 virtual bool initialize( | |
75 WebKit::WebPluginContainer* container); | |
76 virtual void destroy(); | |
77 virtual NPObject* scriptableObject(); | |
78 virtual struct _NPP* pluginNPP(); | |
79 virtual bool getFormValue(WebKit::WebString& value); | |
80 virtual void paint( | |
81 WebKit::WebCanvas* canvas, const WebKit::WebRect& paint_rect); | |
82 virtual void updateGeometry( | |
83 const WebKit::WebRect& frame_rect, const WebKit::WebRect& clip_rect, | |
84 const WebKit::WebVector<WebKit::WebRect>& cut_outs, bool is_visible); | |
85 virtual void updateFocus(bool focused); | |
86 virtual void updateVisibility(bool visible); | |
87 virtual bool acceptsInputEvents(); | |
88 virtual bool handleInputEvent( | |
89 const WebKit::WebInputEvent& event, WebKit::WebCursorInfo& cursor_info); | |
90 virtual void didReceiveResponse(const WebKit::WebURLResponse& response); | |
91 virtual void didReceiveData(const char* data, int data_length); | |
92 virtual void didFinishLoading(); | |
93 virtual void didFailLoading(const WebKit::WebURLError& error); | |
94 virtual void didFinishLoadingFrameRequest( | |
95 const WebKit::WebURL& url, void* notify_data); | |
96 virtual void didFailLoadingFrameRequest( | |
97 const WebKit::WebURL& url, void* notify_data, | |
98 const WebKit::WebURLError& error); | |
99 virtual bool isPlaceholder() OVERRIDE; | |
100 | |
101 // WebPlugin implementation: | |
102 virtual void SetWindow(gfx::PluginWindowHandle window) OVERRIDE; | |
103 virtual void SetAcceptsInputEvents(bool accepts) OVERRIDE; | |
104 virtual void WillDestroyWindow(gfx::PluginWindowHandle window) OVERRIDE; | |
105 #if defined(OS_WIN) | |
106 void SetWindowlessData(HANDLE pump_messages_event, | |
107 gfx::NativeViewId dummy_activation_window) { } | |
108 void ReparentPluginWindow(HWND window, HWND parent) { } | |
109 void ReportExecutableMemory(size_t size) { } | |
110 #endif | |
111 virtual void CancelResource(unsigned long id) OVERRIDE; | |
112 virtual void Invalidate() OVERRIDE; | |
113 virtual void InvalidateRect(const gfx::Rect& rect) OVERRIDE; | |
114 virtual NPObject* GetWindowScriptNPObject() OVERRIDE; | |
115 virtual NPObject* GetPluginElement() OVERRIDE; | |
116 virtual bool FindProxyForUrl(const GURL& url, | |
117 std::string* proxy_list) OVERRIDE; | |
118 virtual void SetCookie(const GURL& url, | |
119 const GURL& first_party_for_cookies, | |
120 const std::string& cookie) OVERRIDE; | |
121 virtual std::string GetCookies(const GURL& url, | |
122 const GURL& first_party_for_cookies) OVERRIDE; | |
123 virtual void URLRedirectResponse(bool allow, int resource_id) OVERRIDE; | |
124 #if defined(OS_MACOSX) | |
125 virtual WebPluginAcceleratedSurface* GetAcceleratedSurface( | |
126 gfx::GpuPreference gpu_preference) OVERRIDE; | |
127 virtual void AcceleratedPluginEnabledRendering() OVERRIDE; | |
128 virtual void AcceleratedPluginAllocatedIOSurface(int32 width, | |
129 int32 height, | |
130 uint32 surface_id) OVERRIDE; | |
131 virtual void AcceleratedPluginSwappedIOSurface() OVERRIDE; | |
132 #endif | |
133 | |
134 // Given a (maybe partial) url, completes using the base url. | |
135 GURL CompleteURL(const char* url); | |
136 | |
137 enum RoutingStatus { | |
138 ROUTED, | |
139 NOT_ROUTED, | |
140 INVALID_URL, | |
141 GENERAL_FAILURE | |
142 }; | |
143 | |
144 // Determines the referrer value sent along with outgoing HTTP requests | |
145 // issued by plugins. | |
146 enum Referrer { | |
147 PLUGIN_SRC, | |
148 DOCUMENT_URL, | |
149 NO_REFERRER | |
150 }; | |
151 | |
152 // Given a download request, check if we need to route the output to a frame. | |
153 // Returns ROUTED if the load is done and routed to a frame, NOT_ROUTED or | |
154 // corresponding error codes otherwise. | |
155 RoutingStatus RouteToFrame(const char* url, | |
156 bool is_javascript_url, | |
157 bool popups_allowed, | |
158 const char* method, | |
159 const char* target, | |
160 const char* buf, | |
161 unsigned int len, | |
162 int notify_id, | |
163 Referrer referrer_flag); | |
164 | |
165 // Returns the next avaiable resource id. Returns 0 if the operation fails. | |
166 // It may fail if the page has already been closed. | |
167 unsigned long GetNextResourceId(); | |
168 | |
169 // Initiates HTTP GET/POST requests. | |
170 // Returns true on success. | |
171 bool InitiateHTTPRequest(unsigned long resource_id, | |
172 WebPluginResourceClient* client, | |
173 const GURL& url, | |
174 const char* method, | |
175 const char* buf, | |
176 int len, | |
177 const char* range_info, | |
178 Referrer referrer_flag, | |
179 bool notify_redirects, | |
180 bool check_mixed_scripting); | |
181 | |
182 gfx::Rect GetWindowClipRect(const gfx::Rect& rect); | |
183 | |
184 // Sets the actual Widget for the plugin. | |
185 void SetContainer(WebKit::WebPluginContainer* container); | |
186 | |
187 // Destroys the plugin instance. | |
188 // The response_handle_to_ignore parameter if not NULL indicates the | |
189 // resource handle to be left valid during plugin shutdown. | |
190 void TearDownPluginInstance(WebKit::WebURLLoader* loader_to_ignore); | |
191 | |
192 // WebURLLoaderClient implementation. We implement this interface in the | |
193 // renderer process, and then use the simple WebPluginResourceClient interface | |
194 // to relay the callbacks to the plugin. | |
195 virtual void willSendRequest(WebKit::WebURLLoader* loader, | |
196 WebKit::WebURLRequest& request, | |
197 const WebKit::WebURLResponse& response); | |
198 virtual void didSendData(WebKit::WebURLLoader* loader, | |
199 unsigned long long bytes_sent, | |
200 unsigned long long total_bytes_to_be_sent); | |
201 virtual void didReceiveResponse(WebKit::WebURLLoader* loader, | |
202 const WebKit::WebURLResponse& response); | |
203 | |
204 virtual void didReceiveData(WebKit::WebURLLoader* loader, const char *buffer, | |
205 int data_length, int encoded_data_length); | |
206 virtual void didFinishLoading(WebKit::WebURLLoader* loader, | |
207 double finishTime); | |
208 virtual void didFail(WebKit::WebURLLoader* loader, | |
209 const WebKit::WebURLError& error); | |
210 | |
211 // Helper function to remove the stored information about a resource | |
212 // request given its index in m_clients. | |
213 void RemoveClient(size_t i); | |
214 | |
215 // Helper function to remove the stored information about a resource | |
216 // request given a handle. | |
217 void RemoveClient(WebKit::WebURLLoader* loader); | |
218 | |
219 virtual void HandleURLRequest(const char* url, | |
220 const char *method, | |
221 const char* target, | |
222 const char* buf, | |
223 unsigned int len, | |
224 int notify_id, | |
225 bool popups_allowed, | |
226 bool notify_redirects) OVERRIDE; | |
227 | |
228 virtual void CancelDocumentLoad() OVERRIDE; | |
229 | |
230 virtual void InitiateHTTPRangeRequest(const char* url, | |
231 const char* range_info, | |
232 int pending_request_id) OVERRIDE; | |
233 | |
234 virtual void SetDeferResourceLoading(unsigned long resource_id, | |
235 bool defer) OVERRIDE; | |
236 | |
237 // Ignore in-process plugins mode for this flag. | |
238 virtual bool IsOffTheRecord() OVERRIDE; | |
239 | |
240 // Handles HTTP multipart responses, i.e. responses received with a HTTP | |
241 // status code of 206. | |
242 // Returns false if response is not multipart (may be if we requested | |
243 // single range). | |
244 bool HandleHttpMultipartResponse(const WebKit::WebURLResponse& response, | |
245 WebPluginResourceClient* client); | |
246 | |
247 void HandleURLRequestInternal(const char* url, | |
248 const char* method, | |
249 const char* target, | |
250 const char* buf, | |
251 unsigned int len, | |
252 int notify_id, | |
253 bool popups_allowed, | |
254 Referrer referrer_flag, | |
255 bool notify_redirects, | |
256 bool check_mixed_scripting); | |
257 | |
258 // Tears down the existing plugin instance and creates a new plugin instance | |
259 // to handle the response identified by the loader parameter. | |
260 bool ReinitializePluginForResponse(WebKit::WebURLLoader* loader); | |
261 | |
262 // Delayed task for downloading the plugin source URL. | |
263 void OnDownloadPluginSrcUrl(); | |
264 | |
265 struct ClientInfo; | |
266 | |
267 // Helper functions | |
268 WebPluginResourceClient* GetClientFromLoader(WebKit::WebURLLoader* loader); | |
269 ClientInfo* GetClientInfoFromLoader(WebKit::WebURLLoader* loader); | |
270 | |
271 // Helper function to set the referrer on the request passed in. | |
272 void SetReferrer(WebKit::WebURLRequest* request, Referrer referrer_flag); | |
273 | |
274 // Check for invalid chars like @, ;, \ before the first / (in path). | |
275 bool IsValidUrl(const GURL& url, Referrer referrer_flag); | |
276 | |
277 std::vector<ClientInfo> clients_; | |
278 | |
279 bool windowless_; | |
280 gfx::PluginWindowHandle window_; | |
281 #if defined(OS_MACOSX) | |
282 bool next_io_surface_allocated_; | |
283 int32 next_io_surface_width_; | |
284 int32 next_io_surface_height_; | |
285 uint32 next_io_surface_id_; | |
286 scoped_refptr<cc::IOSurfaceLayer> io_surface_layer_; | |
287 scoped_ptr<WebKit::WebLayer> web_layer_; | |
288 #endif | |
289 bool accepts_input_events_; | |
290 base::WeakPtr<WebPluginPageDelegate> page_delegate_; | |
291 WebKit::WebFrame* webframe_; | |
292 | |
293 WebPluginDelegate* delegate_; | |
294 | |
295 // This is just a weak reference. | |
296 WebKit::WebPluginContainer* container_; | |
297 | |
298 // Unique identifier for this plugin, used to track script objects. | |
299 struct _NPP* npp_; | |
300 | |
301 typedef std::map<WebPluginResourceClient*, | |
302 webkit_glue::MultipartResponseDelegate*> | |
303 MultiPartResponseHandlerMap; | |
304 // Tracks HTTP multipart response handlers instantiated for | |
305 // a WebPluginResourceClient instance. | |
306 MultiPartResponseHandlerMap multi_part_response_map_; | |
307 | |
308 // The plugin source URL. | |
309 GURL plugin_url_; | |
310 | |
311 // Indicates if the download would be initiated by the plugin or us. | |
312 bool load_manually_; | |
313 | |
314 // Indicates if this is the first geometry update received by the plugin. | |
315 bool first_geometry_update_; | |
316 | |
317 // Set to true if the next response error should be ignored. | |
318 bool ignore_response_error_; | |
319 | |
320 // The current plugin geometry and clip rectangle. | |
321 WebPluginGeometry geometry_; | |
322 | |
323 // The location of the plugin on disk. | |
324 base::FilePath file_path_; | |
325 | |
326 // The mime type of the plugin. | |
327 std::string mime_type_; | |
328 | |
329 // Holds the list of argument names and values passed to the plugin. We keep | |
330 // these so that we can re-initialize the plugin if we need to. | |
331 std::vector<std::string> arg_names_; | |
332 std::vector<std::string> arg_values_; | |
333 | |
334 base::WeakPtrFactory<WebPluginImpl> weak_factory_; | |
335 | |
336 DISALLOW_COPY_AND_ASSIGN(WebPluginImpl); | |
337 }; | |
338 | |
339 } // namespace npapi | |
340 } // namespace webkit | |
341 | |
342 #endif // WEBKIT_PLUGINS_NPAPI_WEBPLUGIN_IMPL_H_ | |
OLD | NEW |