summaryrefslogtreecommitdiffstats
path: root/chrome
diff options
context:
space:
mode:
authorstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-01 15:54:26 +0000
committerstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-01 15:54:26 +0000
commitd8fd6faa7cdccb77c2d496e1ebb9d5f1b9ede717 (patch)
tree0916603cd5a2125c522bdd4d3666d4090ca5a83e /chrome
parent74f4183d376412c21943477c4f721b4838c01117 (diff)
downloadchromium_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.h5
-rw-r--r--chrome/plugin/webplugin_delegate_stub.cc9
-rw-r--r--chrome/plugin/webplugin_delegate_stub.h5
-rw-r--r--chrome/renderer/render_view.cc18
-rw-r--r--chrome/renderer/render_view.h12
-rw-r--r--chrome/renderer/webplugin_delegate_proxy.cc14
-rw-r--r--chrome/renderer/webplugin_delegate_proxy.h4
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();