Index: content/child/npapi/webplugin_delegate_impl.h |
diff --git a/content/child/npapi/webplugin_delegate_impl.h b/content/child/npapi/webplugin_delegate_impl.h |
index 3ed44c4728697ceaf49b2b3d2d2c414f02105f8f..f07256bba6b476349c003b084f8f2acb677e1d93 100644 |
--- a/content/child/npapi/webplugin_delegate_impl.h |
+++ b/content/child/npapi/webplugin_delegate_impl.h |
@@ -45,6 +45,10 @@ |
class WebPluginAcceleratedSurface; |
class ExternalDragTracker; |
#endif // OS_MACOSX |
+ |
+#if defined(OS_WIN) |
+class WebPluginIMEWin; |
+#endif // OS_WIN |
// An implementation of WebPluginDelegate that runs in the plugin process, |
// proxied from the renderer by WebPluginDelegateProxy. |
@@ -107,6 +111,21 @@ |
// Informs the plugin that the view it is in has gained or lost focus. |
void SetContentAreaHasFocus(bool has_focus); |
+#if defined(OS_WIN) |
+ // Informs the plugin that an IME has changed its status. |
+ void ImeCompositionUpdated(const base::string16& text, |
+ const std::vector<int>& clauses, |
+ const std::vector<int>& target, |
+ int cursor_position); |
+ |
+ // Informs the plugin that IME composition has completed./ If |text| is empty, |
+ // IME was cancelled. |
+ void ImeCompositionCompleted(const base::string16& text); |
+ |
+ // Returns the IME status retrieved from a plugin. |
+ bool GetIMEStatus(int* input_type, gfx::Rect* caret_rect); |
+#endif |
+ |
#if defined(OS_MACOSX) && !defined(USE_AURA) |
// Informs the plugin that the geometry has changed, as with UpdateGeometry, |
// but also includes the new buffer context for that new geometry. |
@@ -156,6 +175,20 @@ |
// Called by DestroyInstance(), used for platform-specific destruction. |
void PlatformDestroyInstance(); |
+#if defined(OS_WIN) |
+ // Our WndProc functions. |
+ static LRESULT CALLBACK FlashWindowlessWndProc( |
+ HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); |
+ static LRESULT CALLBACK DummyWindowProc( |
+ HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); |
+ |
+ // Used for throttling Flash messages. |
+ static void ClearThrottleQueueForWindow(HWND window); |
+ static void OnThrottleMessage(); |
+ static void ThrottleMessage(WNDPROC proc, HWND hwnd, UINT message, |
+ WPARAM wParam, LPARAM lParam); |
+#endif |
+ |
//---------------------------- |
// used for windowless plugins |
void WindowlessUpdateGeometry(const gfx::Rect& window_rect, |
@@ -194,12 +227,67 @@ |
WebPlugin* plugin_; |
scoped_refptr<PluginInstance> instance_; |
+#if defined(OS_WIN) |
+ // An IME emulator used by a windowless plugin to retrieve IME data through |
+ // IMM32 functions. |
+ scoped_ptr<WebPluginIMEWin> plugin_ime_; |
+#endif // defined(OS_WIN) |
+ |
NPWindow window_; |
gfx::Rect window_rect_; |
gfx::Rect clip_rect_; |
int quirks_; |
-#if defined(OS_MACOSX) && !defined(USE_AURA) |
+#if defined(OS_WIN) |
+ // Windowless plugins don't have keyboard focus causing issues with the |
+ // plugin not receiving keyboard events if the plugin enters a modal |
+ // loop like TrackPopupMenuEx or MessageBox, etc. |
+ // This is a basic issue with windows activation and focus arising due to |
+ // the fact that these windows are created by different threads. Activation |
+ // and focus are thread specific states, and if the browser has focus, |
+ // the plugin may not have focus. |
+ // To fix a majority of these activation issues we create a dummy visible |
+ // child window to which we set focus whenever the windowless plugin |
+ // receives a WM_LBUTTONDOWN/WM_RBUTTONDOWN message via NPP_HandleEvent. |
+ |
+ HWND dummy_window_for_activation_; |
+ HWND dummy_window_parent_; |
+ WNDPROC old_dummy_window_proc_; |
+ bool CreateDummyWindowForActivation(); |
+ |
+ // Returns true if the event passed in needs to be tracked for a potential |
+ // modal loop. |
+ static bool ShouldTrackEventForModalLoops(NPEvent* event); |
+ |
+ // The message filter hook procedure, which tracks modal loops entered by |
+ // a plugin in the course of a NPP_HandleEvent call. |
+ static LRESULT CALLBACK HandleEventMessageFilterHook(int code, WPARAM wParam, |
+ LPARAM lParam); |
+ |
+ // TrackPopupMenu interceptor. Parameters are the same as the Win32 function |
+ // TrackPopupMenu. |
+ static BOOL WINAPI TrackPopupMenuPatch(HMENU menu, unsigned int flags, int x, |
+ int y, int reserved, HWND window, |
+ const RECT* rect); |
+ |
+ // SetCursor interceptor for windowless plugins. |
+ static HCURSOR WINAPI SetCursorPatch(HCURSOR cursor); |
+ |
+ // RegEnumKeyExW interceptor. |
+ static LONG WINAPI RegEnumKeyExWPatch( |
+ HKEY key, DWORD index, LPWSTR name, LPDWORD name_size, LPDWORD reserved, |
+ LPWSTR class_name, LPDWORD class_size, PFILETIME last_write_time); |
+ |
+ // GetProcAddress intercepter for windowless plugins. |
+ static FARPROC WINAPI GetProcAddressPatch(HMODULE module, LPCSTR name); |
+ |
+ // WindowFromPoint patch for Flash windowless plugins. When flash receives |
+ // mouse move messages it calls the WindowFromPoint API to eventually convert |
+ // the mouse coordinates to screen. We need to return the dummy plugin parent |
+ // window for Aura to ensure that these conversions occur correctly. |
+ static HWND WINAPI WindowFromPointPatch(POINT point); |
+ |
+#elif defined(OS_MACOSX) && !defined(USE_AURA) |
// Sets window_rect_ to |rect| |
void SetPluginRect(const gfx::Rect& rect); |
// Sets content_area_origin to |origin| |
@@ -251,6 +339,15 @@ |
// The url with which the plugin was instantiated. |
std::string plugin_url_; |
+ |
+#if defined(OS_WIN) |
+ // Handle to the message filter hook |
+ HHOOK handle_event_message_filter_hook_; |
+ |
+ // Event which is set when the plugin enters a modal loop in the course |
+ // of a NPP_HandleEvent call. |
+ HANDLE handle_event_pump_messages_event_; |
+#endif |
// Holds the depth of the HandleEvent callstack. |
int handle_event_depth_; |