| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 CONTENT_CHILD_NPAPI_WEBPLUGIN_DELEGATE_IMPL_H_ | 5 #ifndef CONTENT_CHILD_NPAPI_WEBPLUGIN_DELEGATE_IMPL_H_ | 
| 6 #define CONTENT_CHILD_NPAPI_WEBPLUGIN_DELEGATE_IMPL_H_ | 6 #define CONTENT_CHILD_NPAPI_WEBPLUGIN_DELEGATE_IMPL_H_ | 
| 7 | 7 | 
| 8 #include <stdint.h> | 8 #include <stdint.h> | 
| 9 | 9 | 
| 10 #include <string> | 10 #include <string> | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 39 | 39 | 
| 40 namespace content { | 40 namespace content { | 
| 41 class PluginInstance; | 41 class PluginInstance; | 
| 42 class WebPlugin; | 42 class WebPlugin; | 
| 43 | 43 | 
| 44 #if defined(OS_MACOSX) | 44 #if defined(OS_MACOSX) | 
| 45 class WebPluginAcceleratedSurface; | 45 class WebPluginAcceleratedSurface; | 
| 46 class ExternalDragTracker; | 46 class ExternalDragTracker; | 
| 47 #endif  // OS_MACOSX | 47 #endif  // OS_MACOSX | 
| 48 | 48 | 
| 49 #if defined(OS_WIN) |  | 
| 50 class WebPluginIMEWin; |  | 
| 51 #endif  // OS_WIN |  | 
| 52 |  | 
| 53 // An implementation of WebPluginDelegate that runs in the plugin process, | 49 // An implementation of WebPluginDelegate that runs in the plugin process, | 
| 54 // proxied from the renderer by WebPluginDelegateProxy. | 50 // proxied from the renderer by WebPluginDelegateProxy. | 
| 55 class WebPluginDelegateImpl : public WebPluginDelegate { | 51 class WebPluginDelegateImpl : public WebPluginDelegate { | 
| 56  public: | 52  public: | 
| 57   enum PluginQuirks { | 53   enum PluginQuirks { | 
| 58     PLUGIN_QUIRK_SETWINDOW_TWICE = 1,  // Win32 | 54     PLUGIN_QUIRK_SETWINDOW_TWICE = 1,  // Win32 | 
| 59     PLUGIN_QUIRK_THROTTLE_WM_USER_PLUS_ONE = 2,  // Win32 | 55     PLUGIN_QUIRK_THROTTLE_WM_USER_PLUS_ONE = 2,  // Win32 | 
| 60     PLUGIN_QUIRK_DONT_CALL_WND_PROC_RECURSIVELY = 4,  // Win32 | 56     PLUGIN_QUIRK_DONT_CALL_WND_PROC_RECURSIVELY = 4,  // Win32 | 
| 61     PLUGIN_QUIRK_DONT_SET_NULL_WINDOW_HANDLE_ON_DESTROY = 8,  // Win32 | 57     PLUGIN_QUIRK_DONT_SET_NULL_WINDOW_HANDLE_ON_DESTROY = 8,  // Win32 | 
| 62     PLUGIN_QUIRK_DONT_ALLOW_MULTIPLE_INSTANCES = 16,  // Win32 | 58     PLUGIN_QUIRK_DONT_ALLOW_MULTIPLE_INSTANCES = 16,  // Win32 | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 104 | 100 | 
| 105   // Returns the path for the library implementing this plugin. | 101   // Returns the path for the library implementing this plugin. | 
| 106   base::FilePath GetPluginPath(); | 102   base::FilePath GetPluginPath(); | 
| 107 | 103 | 
| 108   // Returns a combination of PluginQuirks. | 104   // Returns a combination of PluginQuirks. | 
| 109   int GetQuirks() const { return quirks_; } | 105   int GetQuirks() const { return quirks_; } | 
| 110 | 106 | 
| 111   // Informs the plugin that the view it is in has gained or lost focus. | 107   // Informs the plugin that the view it is in has gained or lost focus. | 
| 112   void SetContentAreaHasFocus(bool has_focus); | 108   void SetContentAreaHasFocus(bool has_focus); | 
| 113 | 109 | 
| 114 #if defined(OS_WIN) |  | 
| 115   // Informs the plugin that an IME has changed its status. |  | 
| 116   void ImeCompositionUpdated(const base::string16& text, |  | 
| 117                              const std::vector<int>& clauses, |  | 
| 118                              const std::vector<int>& target, |  | 
| 119                              int cursor_position); |  | 
| 120 |  | 
| 121   // Informs the plugin that IME composition has completed./ If |text| is empty, |  | 
| 122   // IME was cancelled. |  | 
| 123   void ImeCompositionCompleted(const base::string16& text); |  | 
| 124 |  | 
| 125   // Returns the IME status retrieved from a plugin. |  | 
| 126   bool GetIMEStatus(int* input_type, gfx::Rect* caret_rect); |  | 
| 127 #endif |  | 
| 128 |  | 
| 129 #if defined(OS_MACOSX) && !defined(USE_AURA) | 110 #if defined(OS_MACOSX) && !defined(USE_AURA) | 
| 130   // Informs the plugin that the geometry has changed, as with UpdateGeometry, | 111   // Informs the plugin that the geometry has changed, as with UpdateGeometry, | 
| 131   // but also includes the new buffer context for that new geometry. | 112   // but also includes the new buffer context for that new geometry. | 
| 132   void UpdateGeometryAndContext(const gfx::Rect& window_rect, | 113   void UpdateGeometryAndContext(const gfx::Rect& window_rect, | 
| 133                                 const gfx::Rect& clip_rect, | 114                                 const gfx::Rect& clip_rect, | 
| 134                                 gfx::NativeDrawingContext context); | 115                                 gfx::NativeDrawingContext context); | 
| 135   // Informs the delegate that the plugin called NPN_Invalidate*. Used as a | 116   // Informs the delegate that the plugin called NPN_Invalidate*. Used as a | 
| 136   // trigger for Core Animation drawing. | 117   // trigger for Core Animation drawing. | 
| 137   void PluginDidInvalidate(); | 118   void PluginDidInvalidate(); | 
| 138   // Returns the delegate currently processing events. | 119   // Returns the delegate currently processing events. | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
| 168   WebPluginDelegateImpl(WebPlugin* plugin, PluginInstance* instance); | 149   WebPluginDelegateImpl(WebPlugin* plugin, PluginInstance* instance); | 
| 169   ~WebPluginDelegateImpl() override; | 150   ~WebPluginDelegateImpl() override; | 
| 170 | 151 | 
| 171   // Called by Initialize() for platform-specific initialization. | 152   // Called by Initialize() for platform-specific initialization. | 
| 172   // If this returns false, the plugin shouldn't be started--see Initialize(). | 153   // If this returns false, the plugin shouldn't be started--see Initialize(). | 
| 173   bool PlatformInitialize(); | 154   bool PlatformInitialize(); | 
| 174 | 155 | 
| 175   // Called by DestroyInstance(), used for platform-specific destruction. | 156   // Called by DestroyInstance(), used for platform-specific destruction. | 
| 176   void PlatformDestroyInstance(); | 157   void PlatformDestroyInstance(); | 
| 177 | 158 | 
| 178 #if defined(OS_WIN) |  | 
| 179   // Our WndProc functions. |  | 
| 180   static LRESULT CALLBACK FlashWindowlessWndProc( |  | 
| 181       HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); |  | 
| 182   static LRESULT CALLBACK DummyWindowProc( |  | 
| 183       HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); |  | 
| 184 |  | 
| 185   // Used for throttling Flash messages. |  | 
| 186   static void ClearThrottleQueueForWindow(HWND window); |  | 
| 187   static void OnThrottleMessage(); |  | 
| 188   static void ThrottleMessage(WNDPROC proc, HWND hwnd, UINT message, |  | 
| 189       WPARAM wParam, LPARAM lParam); |  | 
| 190 #endif |  | 
| 191 |  | 
| 192   //---------------------------- | 159   //---------------------------- | 
| 193   // used for windowless plugins | 160   // used for windowless plugins | 
| 194   void WindowlessUpdateGeometry(const gfx::Rect& window_rect, | 161   void WindowlessUpdateGeometry(const gfx::Rect& window_rect, | 
| 195                                 const gfx::Rect& clip_rect); | 162                                 const gfx::Rect& clip_rect); | 
| 196   void WindowlessPaint(gfx::NativeDrawingContext hdc, const gfx::Rect& rect); | 163   void WindowlessPaint(gfx::NativeDrawingContext hdc, const gfx::Rect& rect); | 
| 197 | 164 | 
| 198   // Tells the plugin about the current state of the window. | 165   // Tells the plugin about the current state of the window. | 
| 199   // See NPAPI NPP_SetWindow for more information. | 166   // See NPAPI NPP_SetWindow for more information. | 
| 200   void WindowlessSetWindow(); | 167   void WindowlessSetWindow(); | 
| 201 | 168 | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 220 | 187 | 
| 221 | 188 | 
| 222   // Note: on Mac OS X, the only time the windowed handle is non-zero | 189   // Note: on Mac OS X, the only time the windowed handle is non-zero | 
| 223   // is the case of accelerated rendering, which uses a fake window handle to | 190   // is the case of accelerated rendering, which uses a fake window handle to | 
| 224   // identify itself back to the browser. It still performs all of its | 191   // identify itself back to the browser. It still performs all of its | 
| 225   // work offscreen. | 192   // work offscreen. | 
| 226 | 193 | 
| 227   WebPlugin* plugin_; | 194   WebPlugin* plugin_; | 
| 228   scoped_refptr<PluginInstance> instance_; | 195   scoped_refptr<PluginInstance> instance_; | 
| 229 | 196 | 
| 230 #if defined(OS_WIN) |  | 
| 231   // An IME emulator used by a windowless plugin to retrieve IME data through |  | 
| 232   // IMM32 functions. |  | 
| 233   scoped_ptr<WebPluginIMEWin> plugin_ime_; |  | 
| 234 #endif  // defined(OS_WIN) |  | 
| 235 |  | 
| 236   NPWindow window_; | 197   NPWindow window_; | 
| 237   gfx::Rect window_rect_; | 198   gfx::Rect window_rect_; | 
| 238   gfx::Rect clip_rect_; | 199   gfx::Rect clip_rect_; | 
| 239   int quirks_; | 200   int quirks_; | 
| 240 | 201 | 
| 241 #if defined(OS_WIN) | 202 #if defined(OS_MACOSX) && !defined(USE_AURA) | 
| 242   // Windowless plugins don't have keyboard focus causing issues with the |  | 
| 243   // plugin not receiving keyboard events if the plugin enters a modal |  | 
| 244   // loop like TrackPopupMenuEx or MessageBox, etc. |  | 
| 245   // This is a basic issue with windows activation and focus arising due to |  | 
| 246   // the fact that these windows are created by different threads. Activation |  | 
| 247   // and focus are thread specific states, and if the browser has focus, |  | 
| 248   // the plugin may not have focus. |  | 
| 249   // To fix a majority of these activation issues we create a dummy visible |  | 
| 250   // child window to which we set focus whenever the windowless plugin |  | 
| 251   // receives a WM_LBUTTONDOWN/WM_RBUTTONDOWN message via NPP_HandleEvent. |  | 
| 252 |  | 
| 253   HWND dummy_window_for_activation_; |  | 
| 254   HWND dummy_window_parent_; |  | 
| 255   WNDPROC old_dummy_window_proc_; |  | 
| 256   bool CreateDummyWindowForActivation(); |  | 
| 257 |  | 
| 258   // Returns true if the event passed in needs to be tracked for a potential |  | 
| 259   // modal loop. |  | 
| 260   static bool ShouldTrackEventForModalLoops(NPEvent* event); |  | 
| 261 |  | 
| 262   // The message filter hook procedure, which tracks modal loops entered by |  | 
| 263   // a plugin in the course of a NPP_HandleEvent call. |  | 
| 264   static LRESULT CALLBACK HandleEventMessageFilterHook(int code, WPARAM wParam, |  | 
| 265                                                        LPARAM lParam); |  | 
| 266 |  | 
| 267   // TrackPopupMenu interceptor. Parameters are the same as the Win32 function |  | 
| 268   // TrackPopupMenu. |  | 
| 269   static BOOL WINAPI TrackPopupMenuPatch(HMENU menu, unsigned int flags, int x, |  | 
| 270                                          int y, int reserved, HWND window, |  | 
| 271                                          const RECT* rect); |  | 
| 272 |  | 
| 273   // SetCursor interceptor for windowless plugins. |  | 
| 274   static HCURSOR WINAPI SetCursorPatch(HCURSOR cursor); |  | 
| 275 |  | 
| 276   // RegEnumKeyExW interceptor. |  | 
| 277   static LONG WINAPI RegEnumKeyExWPatch( |  | 
| 278       HKEY key, DWORD index, LPWSTR name, LPDWORD name_size, LPDWORD reserved, |  | 
| 279       LPWSTR class_name, LPDWORD class_size, PFILETIME last_write_time); |  | 
| 280 |  | 
| 281   // GetProcAddress intercepter for windowless plugins. |  | 
| 282   static FARPROC WINAPI GetProcAddressPatch(HMODULE module, LPCSTR name); |  | 
| 283 |  | 
| 284   // WindowFromPoint patch for Flash windowless plugins. When flash receives |  | 
| 285   // mouse move messages it calls the WindowFromPoint API to eventually convert |  | 
| 286   // the mouse coordinates to screen. We need to return the dummy plugin parent |  | 
| 287   // window for Aura to ensure that these conversions occur correctly. |  | 
| 288   static HWND WINAPI WindowFromPointPatch(POINT point); |  | 
| 289 |  | 
| 290 #elif defined(OS_MACOSX) && !defined(USE_AURA) |  | 
| 291   // Sets window_rect_ to |rect| | 203   // Sets window_rect_ to |rect| | 
| 292   void SetPluginRect(const gfx::Rect& rect); | 204   void SetPluginRect(const gfx::Rect& rect); | 
| 293   // Sets content_area_origin to |origin| | 205   // Sets content_area_origin to |origin| | 
| 294   void SetContentAreaOrigin(const gfx::Point& origin); | 206   void SetContentAreaOrigin(const gfx::Point& origin); | 
| 295   // Updates everything that depends on the plugin's absolute screen location. | 207   // Updates everything that depends on the plugin's absolute screen location. | 
| 296   void PluginScreenLocationChanged(); | 208   void PluginScreenLocationChanged(); | 
| 297   // Updates anything that depends on plugin visibility. | 209   // Updates anything that depends on plugin visibility. | 
| 298   void PluginVisibilityChanged(); | 210   void PluginVisibilityChanged(); | 
| 299 | 211 | 
| 300   // Starts an IME session. | 212   // Starts an IME session. | 
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 333 | 245 | 
| 334   // Called by the message filter hook when the plugin enters a modal loop. | 246   // Called by the message filter hook when the plugin enters a modal loop. | 
| 335   void OnModalLoopEntered(); | 247   void OnModalLoopEntered(); | 
| 336 | 248 | 
| 337   // Returns true if the message passed in corresponds to a user gesture. | 249   // Returns true if the message passed in corresponds to a user gesture. | 
| 338   static bool IsUserGesture(const blink::WebInputEvent& event); | 250   static bool IsUserGesture(const blink::WebInputEvent& event); | 
| 339 | 251 | 
| 340   // The url with which the plugin was instantiated. | 252   // The url with which the plugin was instantiated. | 
| 341   std::string plugin_url_; | 253   std::string plugin_url_; | 
| 342 | 254 | 
| 343 #if defined(OS_WIN) |  | 
| 344   // Handle to the message filter hook |  | 
| 345   HHOOK handle_event_message_filter_hook_; |  | 
| 346 |  | 
| 347   // Event which is set when the plugin enters a modal loop in the course |  | 
| 348   // of a NPP_HandleEvent call. |  | 
| 349   HANDLE handle_event_pump_messages_event_; |  | 
| 350 #endif |  | 
| 351 |  | 
| 352   // Holds the depth of the HandleEvent callstack. | 255   // Holds the depth of the HandleEvent callstack. | 
| 353   int handle_event_depth_; | 256   int handle_event_depth_; | 
| 354 | 257 | 
| 355   // Holds the current cursor set by the windowless plugin. | 258   // Holds the current cursor set by the windowless plugin. | 
| 356   WebCursor current_windowless_cursor_; | 259   WebCursor current_windowless_cursor_; | 
| 357 | 260 | 
| 358   // Set to true initially and indicates if this is the first npp_setwindow | 261   // Set to true initially and indicates if this is the first npp_setwindow | 
| 359   // call received by the plugin. | 262   // call received by the plugin. | 
| 360   bool first_set_window_call_; | 263   bool first_set_window_call_; | 
| 361 | 264 | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 378   // asynchronously. | 281   // asynchronously. | 
| 379   base::WeakPtrFactory<WebPluginDelegateImpl> user_gesture_msg_factory_; | 282   base::WeakPtrFactory<WebPluginDelegateImpl> user_gesture_msg_factory_; | 
| 380 #endif | 283 #endif | 
| 381 | 284 | 
| 382   DISALLOW_COPY_AND_ASSIGN(WebPluginDelegateImpl); | 285   DISALLOW_COPY_AND_ASSIGN(WebPluginDelegateImpl); | 
| 383 }; | 286 }; | 
| 384 | 287 | 
| 385 }  // namespace content | 288 }  // namespace content | 
| 386 | 289 | 
| 387 #endif  // CONTENT_CHILD_NPAPI_WEBPLUGIN_DELEGATE_IMPL_H_ | 290 #endif  // CONTENT_CHILD_NPAPI_WEBPLUGIN_DELEGATE_IMPL_H_ | 
| OLD | NEW | 
|---|