diff options
author | stuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-01 15:54:26 +0000 |
---|---|---|
committer | stuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-01 15:54:26 +0000 |
commit | d8fd6faa7cdccb77c2d496e1ebb9d5f1b9ede717 (patch) | |
tree | 0916603cd5a2125c522bdd4d3666d4090ca5a83e /chrome | |
parent | 74f4183d376412c21943477c4f721b4838c01117 (diff) | |
download | chromium_src-d8fd6faa7cdccb77c2d496e1ebb9d5f1b9ede717.zip chromium_src-d8fd6faa7cdccb77c2d496e1ebb9d5f1b9ede717.tar.gz chromium_src-d8fd6faa7cdccb77c2d496e1ebb9d5f1b9ede717.tar.bz2 |
Propagate window focus changes to plugins on the Mac
This gives plugins mostly correct window activation information; there are still a few loose ends like initial focus state and changes that happen while plugins are in background tabs, but those will be handled in follow-up bugs.
BUG=31847
TEST=Plugins that are in background windows should act accordingly (e.g., Silverlight hover effects shouldn't trigger)
Review URL: http://codereview.chromium.org/549194
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37694 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome')
-rw-r--r-- | chrome/common/plugin_messages_internal.h | 5 | ||||
-rw-r--r-- | chrome/plugin/webplugin_delegate_stub.cc | 9 | ||||
-rw-r--r-- | chrome/plugin/webplugin_delegate_stub.h | 5 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 18 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 12 | ||||
-rw-r--r-- | chrome/renderer/webplugin_delegate_proxy.cc | 14 | ||||
-rw-r--r-- | chrome/renderer/webplugin_delegate_proxy.h | 4 |
7 files changed, 67 insertions, 0 deletions
diff --git a/chrome/common/plugin_messages_internal.h b/chrome/common/plugin_messages_internal.h index f65816c..7c10168 100644 --- a/chrome/common/plugin_messages_internal.h +++ b/chrome/common/plugin_messages_internal.h @@ -225,6 +225,11 @@ IPC_BEGIN_MESSAGES(Plugin) bool /* handled */, WebCursor /* cursor type*/) +#if defined(OS_MACOSX) + IPC_SYNC_MESSAGE_ROUTED1_0(PluginMsg_SetWindowFocus, + bool /* has_focus */) +#endif + IPC_SYNC_MESSAGE_ROUTED2_0(PluginMsg_WillSendRequest, unsigned long /* id */, GURL /* url */) diff --git a/chrome/plugin/webplugin_delegate_stub.cc b/chrome/plugin/webplugin_delegate_stub.cc index 1764366..253d7cf 100644 --- a/chrome/plugin/webplugin_delegate_stub.cc +++ b/chrome/plugin/webplugin_delegate_stub.cc @@ -121,6 +121,9 @@ void WebPluginDelegateStub::OnMessageReceived(const IPC::Message& msg) { IPC_MESSAGE_HANDLER(PluginMsg_UpdateGeometrySync, OnUpdateGeometry) IPC_MESSAGE_HANDLER(PluginMsg_SendJavaScriptStream, OnSendJavaScriptStream) +#if defined(OS_MACOSX) + IPC_MESSAGE_HANDLER(PluginMsg_SetWindowFocus, OnSetWindowFocus) +#endif IPC_MESSAGE_HANDLER(PluginMsg_DidReceiveManualResponse, OnDidReceiveManualResponse) IPC_MESSAGE_HANDLER(PluginMsg_DidReceiveManualData, OnDidReceiveManualData) @@ -331,6 +334,12 @@ void WebPluginDelegateStub::OnSendJavaScriptStream(const GURL& url, delegate_->SendJavaScriptStream(url, result, success, notify_id); } +#if defined(OS_MACOSX) +void WebPluginDelegateStub::OnSetWindowFocus(bool has_focus) { + delegate_->SetWindowHasFocus(has_focus); +} +#endif + void WebPluginDelegateStub::OnDidReceiveManualResponse( const GURL& url, const PluginMsg_DidReceiveResponseParams& params) { diff --git a/chrome/plugin/webplugin_delegate_stub.h b/chrome/plugin/webplugin_delegate_stub.h index ddc8632..5728fdd 100644 --- a/chrome/plugin/webplugin_delegate_stub.h +++ b/chrome/plugin/webplugin_delegate_stub.h @@ -77,6 +77,11 @@ class WebPluginDelegateStub : public IPC::Channel::Listener, const std::string& result, bool success, int notify_id); + +#if defined(OS_MACOSX) + void OnSetWindowFocus(bool has_focus); +#endif + void OnDidReceiveManualResponse( const GURL& url, const PluginMsg_DidReceiveResponseParams& params); diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index 5eea4b3..388d934 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -399,6 +399,16 @@ void RenderView::PluginCrashed(const FilePath& plugin_path) { Send(new ViewHostMsg_CrashedPlugin(routing_id_, plugin_path)); } +#if defined(OS_MACOSX) +void RenderView::RegisterPluginDelegate(WebPluginDelegateProxy* delegate) { + plugin_delegates_.insert(delegate); +} + +void RenderView::UnregisterPluginDelegate(WebPluginDelegateProxy* delegate) { + plugin_delegates_.erase(delegate); +} +#endif + void RenderView::Init(gfx::NativeViewId parent_hwnd, int32 opener_id, const RendererPreferences& renderer_prefs, @@ -3752,6 +3762,14 @@ void RenderView::OnSetBackground(const SkBitmap& background) { void RenderView::OnSetActive(bool active) { if (webview()) webview()->setIsActive(active); + +#if defined(OS_MACOSX) + std::set<WebPluginDelegateProxy*>::iterator plugin_it; + for (plugin_it = plugin_delegates_.begin(); + plugin_it != plugin_delegates_.end(); ++plugin_it) { + (*plugin_it)->SetWindowFocus(active); + } +#endif } void RenderView::SendExtensionRequest(const std::string& name, diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index 3523238..25d598f 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -399,6 +399,11 @@ class RenderView : public RenderWidget, // Called when a plugin has crashed. void PluginCrashed(const FilePath& plugin_path); +#if defined(OS_MACOSX) + void RegisterPluginDelegate(WebPluginDelegateProxy* delegate); + void UnregisterPluginDelegate(WebPluginDelegateProxy* delegate); +#endif + // Called from JavaScript window.external.AddSearchProvider() to add a // keyword for a provider described in the given OpenSearch document. void AddSearchProvider(const std::string& url); @@ -1061,6 +1066,13 @@ class RenderView : public RenderWidget, TextTranslatorImpl text_translator_; scoped_ptr<PageTranslator> page_translator_; +#if defined(OS_MACOSX) + // All the currently active plugin delegates for this RenderView; kept so that + // we can enumerate them to send updates about things like window location + // or tab focus and visibily. These are non-owning references. + std::set<WebPluginDelegateProxy*> plugin_delegates_; +#endif + DISALLOW_COPY_AND_ASSIGN(RenderView); }; diff --git a/chrome/renderer/webplugin_delegate_proxy.cc b/chrome/renderer/webplugin_delegate_proxy.cc index 83666d5..94ddc2a 100644 --- a/chrome/renderer/webplugin_delegate_proxy.cc +++ b/chrome/renderer/webplugin_delegate_proxy.cc @@ -175,6 +175,10 @@ void WebPluginDelegateProxy::PluginDestroyed() { if (window_) WillDestroyWindow(); +#if defined(OS_MACOSX) + render_view_->UnregisterPluginDelegate(this); +#endif + if (channel_host_) { Send(new PluginMsg_DestroyInstance(instance_id_)); @@ -288,6 +292,10 @@ bool WebPluginDelegateProxy::Initialize(const GURL& url, IPC::Message* msg = new PluginMsg_Init(instance_id_, params, &result); Send(msg); +#if defined(OS_MACOSX) + render_view_->RegisterPluginDelegate(this); +#endif + return result; } @@ -850,6 +858,12 @@ int WebPluginDelegateProxy::GetProcessId() { return channel_host_->peer_pid(); } +#if defined(OS_MACOSX) +void WebPluginDelegateProxy::SetWindowFocus(bool window_has_focus) { + Send(new PluginMsg_SetWindowFocus(instance_id_, window_has_focus)); +} +#endif // OS_MACOSX + void WebPluginDelegateProxy::OnSetWindow(gfx::PluginWindowHandle window) { windowless_ = !window; window_ = window; diff --git a/chrome/renderer/webplugin_delegate_proxy.h b/chrome/renderer/webplugin_delegate_proxy.h index 510f977..7df5838 100644 --- a/chrome/renderer/webplugin_delegate_proxy.h +++ b/chrome/renderer/webplugin_delegate_proxy.h @@ -71,6 +71,10 @@ class WebPluginDelegateProxy WebKit::WebCursorInfo* cursor); virtual int GetProcessId(); +#if defined(OS_MACOSX) + virtual void SetWindowFocus(bool window_has_focus); +#endif + // IPC::Channel::Listener implementation: virtual void OnMessageReceived(const IPC::Message& msg); void OnChannelError(); |