summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-17 20:52:18 +0000
committerstuartmorgan@chromium.org <stuartmorgan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-09-17 20:52:18 +0000
commit11963f6434c2049c1937617ea18969a496c6216e (patch)
tree2a223075d498d0fb0333791a3c696ef678cf1abc /chrome/renderer
parente0e5ec3b07e3bc676055321bbb3985a801011719 (diff)
downloadchromium_src-11963f6434c2049c1937617ea18969a496c6216e.zip
chromium_src-11963f6434c2049c1937617ea18969a496c6216e.tar.gz
chromium_src-11963f6434c2049c1937617ea18969a496c6216e.tar.bz2
Extend improved windowless plugin focus handling to all platforms
Uses the same two-state focus tracking that the Mac currently uses on Windows and Linux as well, so focus is updated correctly when the content area itself gains and loses focus. BUG=55607 TEST=Windowless plugins should handle key events when focused on all platforms. Review URL: http://codereview.chromium.org/3418016 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@59845 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/render_view.cc8
-rw-r--r--chrome/renderer/render_view.h7
-rw-r--r--chrome/renderer/webplugin_delegate_proxy.cc18
-rw-r--r--chrome/renderer/webplugin_delegate_proxy.h6
4 files changed, 17 insertions, 22 deletions
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc
index 9f1fcb6..83510b0 100644
--- a/chrome/renderer/render_view.cc
+++ b/chrome/renderer/render_view.cc
@@ -597,14 +597,15 @@ WebPlugin* RenderView::CreatePluginNoCheck(WebFrame* frame,
return CreateNPAPIPlugin(frame, params, info.path, mime_type);
}
-#if defined(OS_MACOSX)
void RenderView::RegisterPluginDelegate(WebPluginDelegateProxy* delegate) {
plugin_delegates_.insert(delegate);
// If the renderer is visible, set initial visibility and focus state.
if (!is_hidden()) {
+#if defined(OS_MACOSX)
delegate->SetContainerVisibility(true);
if (webview() && webview()->isActive())
delegate->SetWindowFocus(true);
+#endif
if (has_focus())
delegate->SetContentAreaFocus(true);
}
@@ -613,7 +614,6 @@ void RenderView::RegisterPluginDelegate(WebPluginDelegateProxy* delegate) {
void RenderView::UnregisterPluginDelegate(WebPluginDelegateProxy* delegate) {
plugin_delegates_.erase(delegate);
}
-#endif
void RenderView::Init(gfx::NativeViewId parent_hwnd,
int32 opener_id,
@@ -5632,6 +5632,7 @@ void RenderView::OnWasRestored(bool needs_repainting) {
(*plugin_it)->SetContainerVisibility(true);
}
}
+#endif // OS_MACOSX
void RenderView::OnSetFocus(bool enable) {
RenderWidget::OnSetFocus(enable);
@@ -5640,15 +5641,16 @@ void RenderView::OnSetFocus(bool enable) {
std::set<WebPluginDelegateProxy*>::iterator plugin_it;
for (plugin_it = plugin_delegates_.begin();
plugin_it != plugin_delegates_.end(); ++plugin_it) {
+#if defined(OS_MACOSX)
// RenderWidget's call to setFocus can cause the underlying webview's
// activation state to change just like a call to setIsActive.
if (enable)
(*plugin_it)->SetWindowFocus(true);
+#endif
(*plugin_it)->SetContentAreaFocus(enable);
}
}
}
-#endif // OS_MACOSX
void RenderView::EnsureDocumentTag() {
// TODO(darin): There's actually no reason for this to be here. We should
diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h
index 0013ee9..01f9655 100644
--- a/chrome/renderer/render_view.h
+++ b/chrome/renderer/render_view.h
@@ -318,10 +318,10 @@ class RenderView : public RenderWidget,
int32 height,
TransportDIB::Handle transport_dib);
void AcceleratedSurfaceBuffersSwapped(gfx::PluginWindowHandle window);
+#endif
void RegisterPluginDelegate(WebPluginDelegateProxy* delegate);
void UnregisterPluginDelegate(WebPluginDelegateProxy* delegate);
-#endif
// IPC::Channel::Listener implementation -------------------------------------
@@ -610,9 +610,8 @@ class RenderView : public RenderWidget,
virtual void DidFlushPaint();
virtual void DidHandleKeyEvent();
virtual void DidHandleMouseEvent(const WebKit::WebMouseEvent& event);
-
-#if OS_MACOSX
virtual void OnSetFocus(bool enable);
+#if OS_MACOSX
virtual void OnWasHidden();
virtual void OnWasRestored(bool needs_repainting);
#endif
@@ -1218,12 +1217,10 @@ class RenderView : public RenderWidget,
PepperPluginDelegateImpl pepper_delegate_;
-#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
// A list of all Pepper v1 plugins that we've created that haven't been
// destroyed yet. Pepper v2 plugins are tracked by the pepper_delegate_.
diff --git a/chrome/renderer/webplugin_delegate_proxy.cc b/chrome/renderer/webplugin_delegate_proxy.cc
index a5490af..2dd4581 100644
--- a/chrome/renderer/webplugin_delegate_proxy.cc
+++ b/chrome/renderer/webplugin_delegate_proxy.cc
@@ -204,10 +204,8 @@ void WebPluginDelegateProxy::PluginDestroyed() {
if (window_)
WillDestroyWindow();
-#if defined(OS_MACOSX)
if (render_view_)
render_view_->UnregisterPluginDelegate(this);
-#endif
if (channel_host_) {
Send(new PluginMsg_DestroyInstance(instance_id_));
@@ -384,9 +382,7 @@ 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;
}
@@ -983,19 +979,19 @@ int WebPluginDelegateProxy::GetProcessId() {
return channel_host_->peer_pid();
}
-#if defined(OS_MACOSX)
-void WebPluginDelegateProxy::SetWindowFocus(bool window_has_focus) {
- IPC::Message* msg = new PluginMsg_SetWindowFocus(instance_id_,
- window_has_focus);
+void WebPluginDelegateProxy::SetContentAreaFocus(bool has_focus) {
+ IPC::Message* msg = new PluginMsg_SetContentAreaFocus(instance_id_,
+ has_focus);
// Make sure focus events are delivered in the right order relative to
// sync messages they might interact with (Paint, HandleEvent, etc.).
msg->set_unblock(true);
Send(msg);
}
-void WebPluginDelegateProxy::SetContentAreaFocus(bool has_focus) {
- IPC::Message* msg = new PluginMsg_SetContentAreaFocus(instance_id_,
- has_focus);
+#if defined(OS_MACOSX)
+void WebPluginDelegateProxy::SetWindowFocus(bool window_has_focus) {
+ IPC::Message* msg = new PluginMsg_SetWindowFocus(instance_id_,
+ window_has_focus);
// Make sure focus events are delivered in the right order relative to
// sync messages they might interact with (Paint, HandleEvent, etc.).
msg->set_unblock(true);
diff --git a/chrome/renderer/webplugin_delegate_proxy.h b/chrome/renderer/webplugin_delegate_proxy.h
index 1660556..0cabc1b 100644
--- a/chrome/renderer/webplugin_delegate_proxy.h
+++ b/chrome/renderer/webplugin_delegate_proxy.h
@@ -78,12 +78,12 @@ class WebPluginDelegateProxy
WebKit::WebCursorInfo* cursor);
virtual int GetProcessId();
-#if defined(OS_MACOSX)
- // Informs the plugin that its enclosing window has gained or lost focus.
- virtual void SetWindowFocus(bool window_has_focus);
// Informs the plugin that its containing content view has gained or lost
// first responder status.
virtual void SetContentAreaFocus(bool has_focus);
+#if defined(OS_MACOSX)
+ // Informs the plugin that its enclosing window has gained or lost focus.
+ virtual void SetWindowFocus(bool window_has_focus);
// Informs the plugin that its container (window/tab) has changed visibility.
virtual void SetContainerVisibility(bool is_visible);
// Informs the plugin that its enclosing window's frame has changed.