From 11963f6434c2049c1937617ea18969a496c6216e Mon Sep 17 00:00:00 2001 From: "stuartmorgan@chromium.org" Date: Fri, 17 Sep 2010 20:52:18 +0000 Subject: 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 --- chrome/renderer/render_view.cc | 8 +++++--- chrome/renderer/render_view.h | 7 ++----- chrome/renderer/webplugin_delegate_proxy.cc | 18 +++++++----------- chrome/renderer/webplugin_delegate_proxy.h | 6 +++--- 4 files changed, 17 insertions(+), 22 deletions(-) (limited to 'chrome/renderer') 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::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 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. -- cgit v1.1