diff options
-rw-r--r-- | chrome/app/framework.order | 1 | ||||
-rw-r--r-- | chrome/browser/plugin_carbon_interpose_mac.cc | 5 | ||||
-rw-r--r-- | chrome/plugin/plugin_interpose_util_mac.h | 3 | ||||
-rw-r--r-- | chrome/plugin/plugin_interpose_util_mac.mm | 5 | ||||
-rw-r--r-- | webkit/glue/plugins/webplugin_delegate_impl.h | 6 | ||||
-rw-r--r-- | webkit/glue/plugins/webplugin_delegate_impl_mac.mm | 19 |
6 files changed, 35 insertions, 4 deletions
diff --git a/chrome/app/framework.order b/chrome/app/framework.order index 814cecc..7ef7343 100644 --- a/chrome/app/framework.order +++ b/chrome/app/framework.order @@ -28,6 +28,7 @@ __ZN22mac_plugin_interposing33NotifyBrowserOfPluginSelectWindowEj6CGRectb __ZN22mac_plugin_interposing31NotifyBrowserOfPluginShowWindowEj6CGRectb __ZN22mac_plugin_interposing31NotifyBrowserOfPluginHideWindowEj6CGRect __ZN22mac_plugin_interposing28NotifyPluginOfSetThemeCursorEP21WebPluginDelegateImplm +__ZN22mac_plugin_interposing23GetPluginWindowHasFocusEPK21WebPluginDelegateImpl __ZN23FakePluginWindowTrackerC1Ev __ZN23FakePluginWindowTrackerC2Ev __ZN23FakePluginWindowTracker14SharedInstanceEv diff --git a/chrome/browser/plugin_carbon_interpose_mac.cc b/chrome/browser/plugin_carbon_interpose_mac.cc index adbba7e..def2515 100644 --- a/chrome/browser/plugin_carbon_interpose_mac.cc +++ b/chrome/browser/plugin_carbon_interpose_mac.cc @@ -19,10 +19,7 @@ static bool IsModalWindow(WindowRef window) { } static bool IsContainingWindowActive(const WebPluginDelegateImpl* delegate) { - // TODO(stuartmorgan): We need a way to find out if the delegate is in the - // active window; for now we just lie and always say yes so plugins don't - // throw events away. - return true; + return mac_plugin_interposing::GetPluginWindowHasFocus(delegate); } static CGRect CGRectForWindow(WindowRef window) { diff --git a/chrome/plugin/plugin_interpose_util_mac.h b/chrome/plugin/plugin_interpose_util_mac.h index deabe6c..4942bb6 100644 --- a/chrome/plugin/plugin_interpose_util_mac.h +++ b/chrome/plugin/plugin_interpose_util_mac.h @@ -42,6 +42,9 @@ void NotifyBrowserOfPluginHideWindow(uint32 window_id, CGRect bounds); void NotifyPluginOfSetThemeCursor(WebPluginDelegateImpl* delegate, ThemeCursor cursor); +// Returns true if the window containing the given plugin delegate is focused. +bool GetPluginWindowHasFocus(const WebPluginDelegateImpl* delegate); + } // namespace MacPluginInterpose #endif // CHROME_PLUGIN_PLUGIN_INTERPOSE_UTIL_MAC_H_ diff --git a/chrome/plugin/plugin_interpose_util_mac.mm b/chrome/plugin/plugin_interpose_util_mac.mm index f919c2b..801efbe 100644 --- a/chrome/plugin/plugin_interpose_util_mac.mm +++ b/chrome/plugin/plugin_interpose_util_mac.mm @@ -75,6 +75,11 @@ void NotifyPluginOfSetThemeCursor(WebPluginDelegateImpl* delegate, delegate->SetThemeCursor(cursor); } +__attribute__((visibility("default"))) +bool GetPluginWindowHasFocus(const WebPluginDelegateImpl* delegate) { + return delegate->GetWindowHasFocus(); +} + } // namespace mac_plugin_interposing #pragma mark - diff --git a/webkit/glue/plugins/webplugin_delegate_impl.h b/webkit/glue/plugins/webplugin_delegate_impl.h index a246f60..209a38a 100644 --- a/webkit/glue/plugins/webplugin_delegate_impl.h +++ b/webkit/glue/plugins/webplugin_delegate_impl.h @@ -133,6 +133,10 @@ class WebPluginDelegateImpl : public webkit_glue::WebPluginDelegate { void SetFocusNotifier(void (*notifier)(WebPluginDelegateImpl*)) { focus_notifier_ = notifier; } + // Informs the plugin that the window it is in has gained or lost focus. + void SetWindowHasFocus(bool has_focus); + // Returns whether or not the window the plugin is in has focus. + bool GetWindowHasFocus() const { return containing_window_has_focus_; } // Informs the delegate that the plugin set a Carbon ThemeCursor. void SetThemeCursor(ThemeCursor cursor); // Informs the delegate that the plugin set a Cocoa NSCursor. @@ -355,6 +359,8 @@ class WebPluginDelegateImpl : public webkit_glue::WebPluginDelegate { bool have_focus_; // A function to call when we want to accept keyboard focus void (*focus_notifier_)(WebPluginDelegateImpl* notifier); + + bool containing_window_has_focus_; #endif // Called by the message filter hook when the plugin enters a modal loop. diff --git a/webkit/glue/plugins/webplugin_delegate_impl_mac.mm b/webkit/glue/plugins/webplugin_delegate_impl_mac.mm index 2d6fdc6..b469ac7 100644 --- a/webkit/glue/plugins/webplugin_delegate_impl_mac.mm +++ b/webkit/glue/plugins/webplugin_delegate_impl_mac.mm @@ -102,6 +102,7 @@ WebPluginDelegateImpl::WebPluginDelegateImpl( last_mouse_y_(0), have_focus_(false), focus_notifier_(NULL), + containing_window_has_focus_(false), handle_event_depth_(0), user_gesture_message_posted_(this), user_gesture_msg_factory_(this) { @@ -387,6 +388,11 @@ void WebPluginDelegateImpl::WindowlessSetWindow(bool force_set_window) { NPError err = instance()->NPP_SetWindow(&window_); + // TODO(stuartmorgan): Once we are getting window information via IPC, use + // that to set the right value. For now, just pretend plugins are always in + // active windows so they don't throw away events. + SetWindowHasFocus(true); + DCHECK(err == NPERR_NO_ERROR); } @@ -436,6 +442,19 @@ void WebPluginDelegateImpl::SetFocus() { FocusNotify(this); } +void WebPluginDelegateImpl::SetWindowHasFocus(bool has_focus) { + containing_window_has_focus_ = has_focus; + + if (instance()->event_model() == NPEventModelCocoa) { + ScopedActiveDelegate active_delegate(this); + NPCocoaEvent focus_event; + memset(&focus_event, 0, sizeof(focus_event)); + focus_event.type = NPCocoaEventWindowFocusChanged; + focus_event.data.focus.hasFocus = has_focus; + instance()->NPP_HandleEvent(reinterpret_cast<NPEvent*>(&focus_event)); + } +} + void WebPluginDelegateImpl::SetThemeCursor(ThemeCursor cursor) { current_windowless_cursor_.InitFromThemeCursor(cursor); } |