Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(329)

Side by Side Diff: webkit/glue/plugins/webplugin_delegate_impl.h

Issue 19413: Linux plugins WIP. (Closed)
Patch Set: review comments Created 11 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webkit/glue/plugins/plugin_host.cc ('k') | webkit/glue/plugins/webplugin_delegate_impl_gtk.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef WEBKIT_GLUE_PLUGIN_WEBPLUGIN_DELEGATE_IMPL_H__ 5 #ifndef WEBKIT_GLUE_PLUGIN_WEBPLUGIN_DELEGATE_IMPL_H__
6 #define WEBKIT_GLUE_PLUGIN_WEBPLUGIN_DELEGATE_IMPL_H__ 6 #define WEBKIT_GLUE_PLUGIN_WEBPLUGIN_DELEGATE_IMPL_H__
7 7
8 #include "build/build_config.h"
9
8 #include <string> 10 #include <string>
9 #include <list> 11 #include <list>
10 12
11 #include "base/file_path.h" 13 #include "base/file_path.h"
12 #include "base/gfx/native_widget_types.h" 14 #include "base/gfx/native_widget_types.h"
13 #include "base/ref_counted.h" 15 #include "base/ref_counted.h"
14 #include "base/task.h" 16 #include "base/task.h"
15 #include "third_party/npapi/bindings/npapi.h" 17 #include "third_party/npapi/bindings/npapi.h"
16 #include "webkit/glue/webplugin_delegate.h" 18 #include "webkit/glue/webplugin_delegate.h"
17 #include "webkit/glue/webcursor.h" 19 #include "webkit/glue/webcursor.h"
18 20
19 namespace NPAPI { 21 namespace NPAPI {
20 class PluginInstance; 22 class PluginInstance;
21 }; 23 };
22 24
23 // An implementation of WebPluginDelegate that proxies all calls to 25 // An implementation of WebPluginDelegate that proxies all calls to
24 // the plugin process. 26 // the plugin process.
25 class WebPluginDelegateImpl : public WebPluginDelegate { 27 class WebPluginDelegateImpl : public WebPluginDelegate {
26 public: 28 public:
27 static WebPluginDelegateImpl* Create(const FilePath& filename, 29 static WebPluginDelegateImpl* Create(const FilePath& filename,
28 const std::string& mime_type, 30 const std::string& mime_type,
29 gfx::NativeView containing_view); 31 gfx::NativeView containing_view);
32 #if defined(OS_WIN)
30 static bool IsPluginDelegateWindow(HWND window); 33 static bool IsPluginDelegateWindow(HWND window);
31 static bool GetPluginNameFromWindow(HWND window, std::wstring *plugin_name); 34 static bool GetPluginNameFromWindow(HWND window, std::wstring *plugin_name);
32 35
33 // Returns true if the window handle passed in is that of the dummy 36 // Returns true if the window handle passed in is that of the dummy
34 // activation window for windowless plugins. 37 // activation window for windowless plugins.
35 static bool IsDummyActivationWindow(HWND window); 38 static bool IsDummyActivationWindow(HWND window);
39 #endif // OS_WIN)
36 40
37 // WebPluginDelegate implementation 41 // WebPluginDelegate implementation
38 virtual void PluginDestroyed(); 42 virtual void PluginDestroyed();
39 virtual bool Initialize(const GURL& url, 43 virtual bool Initialize(const GURL& url,
40 char** argn, 44 char** argn,
41 char** argv, 45 char** argv,
42 int argc, 46 int argc,
43 WebPlugin* plugin, 47 WebPlugin* plugin,
44 bool load_manually); 48 bool load_manually);
45 virtual void UpdateGeometry(const gfx::Rect& window_rect, 49 virtual void UpdateGeometry(const gfx::Rect& window_rect,
46 const gfx::Rect& clip_rect); 50 const gfx::Rect& clip_rect);
51 #if defined(OS_WIN)
47 virtual void Paint(HDC hdc, const gfx::Rect& rect); 52 virtual void Paint(HDC hdc, const gfx::Rect& rect);
48 virtual void Print(HDC hdc); 53 virtual void Print(HDC hdc);
54 #else
55 // TODO(port): temporary workaround.
56 virtual void Paint(void* dc, const gfx::Rect& rect);
57 virtual void Print(void* dc);
58 #endif
49 virtual void SetFocus(); // only called when windowless 59 virtual void SetFocus(); // only called when windowless
50 // only called when windowless 60 // only called when windowless
51 virtual bool HandleEvent(NPEvent* event, 61 virtual bool HandleEvent(NPEvent* event,
52 WebCursor* cursor); 62 WebCursor* cursor);
53 virtual NPObject* GetPluginScriptableObject(); 63 virtual NPObject* GetPluginScriptableObject();
54 virtual void DidFinishLoadWithReason(NPReason reason); 64 virtual void DidFinishLoadWithReason(NPReason reason);
55 virtual int GetProcessId(); 65 virtual int GetProcessId();
56 66
57 virtual void FlushGeometryUpdates() { 67 virtual void FlushGeometryUpdates() {
58 } 68 }
(...skipping 16 matching lines...) Expand all
75 bool notify_needed, 85 bool notify_needed,
76 void *notify_data, 86 void *notify_data,
77 void* stream); 87 void* stream);
78 88
79 virtual void URLRequestRouted(const std::string&url, bool notify_needed, 89 virtual void URLRequestRouted(const std::string&url, bool notify_needed,
80 void* notify_data); 90 void* notify_data);
81 bool windowless() const { return windowless_ ; } 91 bool windowless() const { return windowless_ ; }
82 gfx::Rect rect() const { return window_rect_; } 92 gfx::Rect rect() const { return window_rect_; }
83 gfx::Rect clip_rect() const { return clip_rect_; } 93 gfx::Rect clip_rect() const { return clip_rect_; }
84 94
95 #if defined(OS_WIN)
85 enum PluginQuirks { 96 enum PluginQuirks {
86 PLUGIN_QUIRK_SETWINDOW_TWICE = 1, 97 PLUGIN_QUIRK_SETWINDOW_TWICE = 1,
87 PLUGIN_QUIRK_THROTTLE_WM_USER_PLUS_ONE = 2, 98 PLUGIN_QUIRK_THROTTLE_WM_USER_PLUS_ONE = 2,
88 PLUGIN_QUIRK_DONT_CALL_WND_PROC_RECURSIVELY = 4, 99 PLUGIN_QUIRK_DONT_CALL_WND_PROC_RECURSIVELY = 4,
89 PLUGIN_QUIRK_DONT_SET_NULL_WINDOW_HANDLE_ON_DESTROY = 8, 100 PLUGIN_QUIRK_DONT_SET_NULL_WINDOW_HANDLE_ON_DESTROY = 8,
90 PLUGIN_QUIRK_DONT_ALLOW_MULTIPLE_INSTANCES = 16, 101 PLUGIN_QUIRK_DONT_ALLOW_MULTIPLE_INSTANCES = 16,
91 PLUGIN_QUIRK_DIE_AFTER_UNLOAD = 32, 102 PLUGIN_QUIRK_DIE_AFTER_UNLOAD = 32,
92 PLUGIN_QUIRK_PATCH_TRACKPOPUP_MENU = 64, 103 PLUGIN_QUIRK_PATCH_TRACKPOPUP_MENU = 64,
93 PLUGIN_QUIRK_PATCH_SETCURSOR = 128, 104 PLUGIN_QUIRK_PATCH_SETCURSOR = 128,
94 PLUGIN_QUIRK_BLOCK_NONSTANDARD_GETURL_REQUESTS = 256, 105 PLUGIN_QUIRK_BLOCK_NONSTANDARD_GETURL_REQUESTS = 256,
95 }; 106 };
107 #endif
96 108
97 int quirks() { return quirks_; } 109 int quirks() { return quirks_; }
98 110
99 private: 111 private:
100 WebPluginDelegateImpl(gfx::NativeView containing_view, 112 WebPluginDelegateImpl(gfx::NativeView containing_view,
101 NPAPI::PluginInstance *instance); 113 NPAPI::PluginInstance *instance);
102 ~WebPluginDelegateImpl(); 114 ~WebPluginDelegateImpl();
103 115
104 //-------------------------- 116 //--------------------------
105 // used for windowed plugins 117 // used for windowed plugins
106 void WindowedUpdateGeometry(const gfx::Rect& window_rect, 118 void WindowedUpdateGeometry(const gfx::Rect& window_rect,
107 const gfx::Rect& clip_rect); 119 const gfx::Rect& clip_rect);
108 // Create the native window. 120 // Create the native window.
109 // Returns true if the window is created (or already exists). 121 // Returns true if the window is created (or already exists).
110 // Returns false if unable to create the window. 122 // Returns false if unable to create the window.
111 bool WindowedCreatePlugin(); 123 bool WindowedCreatePlugin();
112 124
113 // Destroy the native window. 125 // Destroy the native window.
114 void WindowedDestroyWindow(); 126 void WindowedDestroyWindow();
115 127
116 // Reposition the native window to be in sync with the given geometry. 128 // Reposition the native window to be in sync with the given geometry.
117 // Returns true if the native window has moved or been clipped differently. 129 // Returns true if the native window has moved or been clipped differently.
118 bool WindowedReposition(const gfx::Rect& window_rect, 130 bool WindowedReposition(const gfx::Rect& window_rect,
119 const gfx::Rect& clip_rect); 131 const gfx::Rect& clip_rect);
120 132
121 // Tells the plugin about the current state of the window. 133 // Tells the plugin about the current state of the window.
122 // See NPAPI NPP_SetWindow for more information. 134 // See NPAPI NPP_SetWindow for more information.
123 void WindowedSetWindow(); 135 void WindowedSetWindow();
124 136
137 #if defined(OS_WIN)
125 // Registers the window class for our window 138 // Registers the window class for our window
126 ATOM RegisterNativeWindowClass(); 139 ATOM RegisterNativeWindowClass();
127 140
128 // Our WndProc functions. 141 // Our WndProc functions.
129 static LRESULT CALLBACK DummyWindowProc( 142 static LRESULT CALLBACK DummyWindowProc(
130 HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); 143 HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
131 static LRESULT CALLBACK NativeWndProc( 144 static LRESULT CALLBACK NativeWndProc(
132 HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); 145 HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
133 static LRESULT CALLBACK FlashWindowlessWndProc( 146 static LRESULT CALLBACK FlashWindowlessWndProc(
134 HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); 147 HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
135 148
136 // Used for throttling Flash messages. 149 // Used for throttling Flash messages.
137 static void ClearThrottleQueueForWindow(HWND window); 150 static void ClearThrottleQueueForWindow(HWND window);
138 static void OnThrottleMessage(); 151 static void OnThrottleMessage();
139 static void ThrottleMessage(WNDPROC proc, HWND hwnd, UINT message, 152 static void ThrottleMessage(WNDPROC proc, HWND hwnd, UINT message,
140 WPARAM wParam, LPARAM lParam); 153 WPARAM wParam, LPARAM lParam);
154 #endif
141 155
142 //---------------------------- 156 //----------------------------
143 // used for windowless plugins 157 // used for windowless plugins
144 void WindowlessUpdateGeometry(const gfx::Rect& window_rect, 158 void WindowlessUpdateGeometry(const gfx::Rect& window_rect,
145 const gfx::Rect& clip_rect); 159 const gfx::Rect& clip_rect);
160 #if defined(OS_WIN)
146 void WindowlessPaint(HDC hdc, const gfx::Rect& rect); 161 void WindowlessPaint(HDC hdc, const gfx::Rect& rect);
162 #else
163 // TODO(port): implement.
164 void WindowlessPaint(void* dc, const gfx::Rect& rect);
165 #endif
147 166
148 // Tells the plugin about the current state of the window. 167 // Tells the plugin about the current state of the window.
149 // See NPAPI NPP_SetWindow for more information. 168 // See NPAPI NPP_SetWindow for more information.
150 void WindowlessSetWindow(bool force_set_window); 169 void WindowlessSetWindow(bool force_set_window);
151 170
152 171
153 //----------------------------------------- 172 //-----------------------------------------
154 // used for windowed and windowless plugins 173 // used for windowed and windowless plugins
155 174
156 NPAPI::PluginInstance* instance() { return instance_.get(); } 175 NPAPI::PluginInstance* instance() { return instance_.get(); }
157 176
158 // Closes down and destroys our plugin instance. 177 // Closes down and destroys our plugin instance.
159 void DestroyInstance(); 178 void DestroyInstance();
160 179
161 // used for windowed plugins 180 // used for windowed plugins
162 HWND windowed_handle_; 181 gfx::NativeView windowed_handle_;
182 #if defined(OS_WIN)
163 bool windowed_did_set_window_; 183 bool windowed_did_set_window_;
164 gfx::Rect windowed_last_pos_; 184 gfx::Rect windowed_last_pos_;
185 #endif
165 186
187 #if defined(OS_WIN)
166 // this is an optimization to avoid calling SetWindow to the plugin 188 // this is an optimization to avoid calling SetWindow to the plugin
167 // when it is not necessary. Initially, we need to call SetWindow, 189 // when it is not necessary. Initially, we need to call SetWindow,
168 // and after that we only need to call it when the geometry changes. 190 // and after that we only need to call it when the geometry changes.
169 // use this flag to indicate whether we really need it or not. 191 // use this flag to indicate whether we really need it or not.
170 bool windowless_needs_set_window_; 192 bool windowless_needs_set_window_;
193 #endif
171 194
172 // used by windowed and windowless plugins 195 // used by windowed and windowless plugins
173 bool windowless_; 196 bool windowless_;
174 197
175 WebPlugin* plugin_; 198 WebPlugin* plugin_;
176 scoped_refptr<NPAPI::PluginInstance> instance_; 199 scoped_refptr<NPAPI::PluginInstance> instance_;
177 200
201 #if defined(OS_WIN)
178 // Original wndproc before we subclassed. 202 // Original wndproc before we subclassed.
179 WNDPROC plugin_wnd_proc_; 203 WNDPROC plugin_wnd_proc_;
180 204
181 // Used to throttle WM_USER+1 messages in Flash. 205 // Used to throttle WM_USER+1 messages in Flash.
182 uint32 last_message_; 206 uint32 last_message_;
183 bool is_calling_wndproc; 207 bool is_calling_wndproc;
208 #endif // OS_WIN
184 209
185 HWND parent_; 210 gfx::NativeView parent_;
186 NPWindow window_; 211 NPWindow window_;
187 gfx::Rect window_rect_; 212 gfx::Rect window_rect_;
188 gfx::Rect clip_rect_; 213 gfx::Rect clip_rect_;
189 std::vector<gfx::Rect> cutout_rects_; 214 std::vector<gfx::Rect> cutout_rects_;
190 int quirks_; 215 int quirks_;
191 216
217 #if defined(OS_WIN)
192 // Windowless plugins don't have keyboard focus causing issues with the 218 // Windowless plugins don't have keyboard focus causing issues with the
193 // plugin not receiving keyboard events if the plugin enters a modal 219 // plugin not receiving keyboard events if the plugin enters a modal
194 // loop like TrackPopupMenuEx or MessageBox, etc. 220 // loop like TrackPopupMenuEx or MessageBox, etc.
195 // This is a basic issue with windows activation and focus arising due to 221 // This is a basic issue with windows activation and focus arising due to
196 // the fact that these windows are created by different threads. Activation 222 // the fact that these windows are created by different threads. Activation
197 // and focus are thread specific states, and if the browser has focus, 223 // and focus are thread specific states, and if the browser has focus,
198 // the plugin may not have focus. 224 // the plugin may not have focus.
199 // To fix a majority of these activation issues we create a dummy visible 225 // To fix a majority of these activation issues we create a dummy visible
200 // child window to which we set focus whenever the windowless plugin 226 // child window to which we set focus whenever the windowless plugin
201 // receives a WM_LBUTTONDOWN/WM_RBUTTONDOWN message via NPP_HandleEvent. 227 // receives a WM_LBUTTONDOWN/WM_RBUTTONDOWN message via NPP_HandleEvent.
202 HWND dummy_window_for_activation_; 228 HWND dummy_window_for_activation_;
203 bool CreateDummyWindowForActivation(); 229 bool CreateDummyWindowForActivation();
204 230
205 // Returns true if the event passed in needs to be tracked for a potential 231 // Returns true if the event passed in needs to be tracked for a potential
206 // modal loop. 232 // modal loop.
207 static bool ShouldTrackEventForModalLoops(NPEvent* event); 233 static bool ShouldTrackEventForModalLoops(NPEvent* event);
208 234
209 // The message filter hook procedure, which tracks modal loops entered by 235 // The message filter hook procedure, which tracks modal loops entered by
210 // a plugin in the course of a NPP_HandleEvent call. 236 // a plugin in the course of a NPP_HandleEvent call.
211 static LRESULT CALLBACK HandleEventMessageFilterHook(int code, WPARAM wParam, 237 static LRESULT CALLBACK HandleEventMessageFilterHook(int code, WPARAM wParam,
212 LPARAM lParam); 238 LPARAM lParam);
213 239 #endif
214 // Called by the message filter hook when the plugin enters a modal loop. 240 // Called by the message filter hook when the plugin enters a modal loop.
215 void OnModalLoopEntered(); 241 void OnModalLoopEntered();
216 242
217 // Returns true if the message passed in corresponds to a user gesture. 243 // Returns true if the message passed in corresponds to a user gesture.
218 static bool IsUserGestureMessage(unsigned int message); 244 static bool IsUserGestureMessage(unsigned int message);
219 245
220 // Indicates the end of a user gesture period. 246 // Indicates the end of a user gesture period.
221 void OnUserGestureEnd(); 247 void OnUserGestureEnd();
222 248
249 // The url with which the plugin was instantiated.
250 std::string plugin_url_;
251
252 #if defined(OS_WIN)
223 // Handle to the message filter hook 253 // Handle to the message filter hook
224 HHOOK handle_event_message_filter_hook_; 254 HHOOK handle_event_message_filter_hook_;
225 255
226 // Event which is set when the plugin enters a modal loop in the course 256 // Event which is set when the plugin enters a modal loop in the course
227 // of a NPP_HandleEvent call. 257 // of a NPP_HandleEvent call.
228 HANDLE handle_event_pump_messages_event_; 258 HANDLE handle_event_pump_messages_event_;
229 259
230 // Holds the depth of the HandleEvent callstack. 260 // Holds the depth of the HandleEvent callstack.
231 int handle_event_depth_; 261 int handle_event_depth_;
232 262
233 // This flag indicates whether we started tracking a user gesture message. 263 // This flag indicates whether we started tracking a user gesture message.
234 bool user_gesture_message_posted_; 264 bool user_gesture_message_posted_;
235 265
236 // Runnable Method Factory used to invoke the OnUserGestureEnd method 266 // Runnable Method Factory used to invoke the OnUserGestureEnd method
237 // asynchronously. 267 // asynchronously.
238 ScopedRunnableMethodFactory<WebPluginDelegateImpl> user_gesture_msg_factory_; 268 ScopedRunnableMethodFactory<WebPluginDelegateImpl> user_gesture_msg_factory_;
239 269
240 // The url with which the plugin was instantiated.
241 std::string plugin_url_;
242
243 // The plugin module handle. 270 // The plugin module handle.
244 HMODULE plugin_module_handle_; 271 HMODULE plugin_module_handle_;
245 272
246 // TrackPopupMenu interceptor. Parameters are the same as the Win32 function 273 // TrackPopupMenu interceptor. Parameters are the same as the Win32 function
247 // TrackPopupMenu. 274 // TrackPopupMenu.
248 static BOOL WINAPI TrackPopupMenuPatch(HMENU menu, unsigned int flags, int x, 275 static BOOL WINAPI TrackPopupMenuPatch(HMENU menu, unsigned int flags, int x,
249 int y, int reserved, HWND window, 276 int y, int reserved, HWND window,
250 const RECT* rect); 277 const RECT* rect);
251 278
252 // SetCursor interceptor for windowless plugins. 279 // SetCursor interceptor for windowless plugins.
253 static HCURSOR WINAPI SetCursorPatch(HCURSOR cursor); 280 static HCURSOR WINAPI SetCursorPatch(HCURSOR cursor);
254 281
255 // Holds the current cursor set by the windowless plugin. 282 // Holds the current cursor set by the windowless plugin.
256 WebCursor current_windowless_cursor_; 283 WebCursor current_windowless_cursor_;
284 #endif
257 285
258 DISALLOW_EVIL_CONSTRUCTORS(WebPluginDelegateImpl); 286 DISALLOW_EVIL_CONSTRUCTORS(WebPluginDelegateImpl);
259 }; 287 };
260 288
261 #endif // #ifndef WEBKIT_GLUE_PLUGIN_WEBPLUGIN_DELEGATE_IMPL_H__ 289 #endif // #ifndef WEBKIT_GLUE_PLUGIN_WEBPLUGIN_DELEGATE_IMPL_H__
262 290
OLDNEW
« no previous file with comments | « webkit/glue/plugins/plugin_host.cc ('k') | webkit/glue/plugins/webplugin_delegate_impl_gtk.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698