summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormiu@chromium.org <miu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-06 13:02:06 +0000
committermiu@chromium.org <miu@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-03-06 13:02:06 +0000
commitade834714a88b886e4a69959d027e188acb48fc2 (patch)
tree7c40997829f21398c7476dd544e3dfbf58d7d779
parent1286c0b07c6c17ecda243f912bde1b5d3a72c48f (diff)
downloadchromium_src-ade834714a88b886e4a69959d027e188acb48fc2.zip
chromium_src-ade834714a88b886e4a69959d027e188acb48fc2.tar.gz
chromium_src-ade834714a88b886e4a69959d027e188acb48fc2.tar.bz2
Fix Flash fullscreen context menu target and position.
This resolves two problems regarding the right-click context menu for Flash fullscreen widgets. First, the WebContentsViewDelegate implementations (for Views and Cocoa) were assuming the event target for the context menu click is always the widget provided by WebContentsView. Flash fullscreen is actually a separate widget. Second, the renderer was trying to be "too smart" by computing the screen coordinates of the context menu itself. This is fixed by removing the offset calculation, which allows the coordinates to be cleanly translated by the windowing toolkit, browser-side. BUG=348965 TEST=Repro steps in bug 348965 result in expected behavior. Review URL: https://codereview.chromium.org/183973027 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@255321 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/ui/cocoa/tab_contents/chrome_web_contents_view_delegate_mac.h3
-rw-r--r--chrome/browser/ui/cocoa/tab_contents/chrome_web_contents_view_delegate_mac.mm14
-rw-r--r--chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.cc18
-rw-r--r--chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.h5
-rw-r--r--content/renderer/pepper/renderer_ppapi_host_impl.cc14
5 files changed, 31 insertions, 23 deletions
diff --git a/chrome/browser/ui/cocoa/tab_contents/chrome_web_contents_view_delegate_mac.h b/chrome/browser/ui/cocoa/tab_contents/chrome_web_contents_view_delegate_mac.h
index 4148a01..2552a87 100644
--- a/chrome/browser/ui/cocoa/tab_contents/chrome_web_contents_view_delegate_mac.h
+++ b/chrome/browser/ui/cocoa/tab_contents/chrome_web_contents_view_delegate_mac.h
@@ -15,6 +15,7 @@ class RenderViewContextMenuMac;
class WebDragBookmarkHandlerMac;
namespace content {
+class RenderWidgetHostView;
class WebContents;
}
@@ -36,6 +37,8 @@ class ChromeWebContentsViewDelegateMac
const content::ContextMenuParams& params) OVERRIDE;
private:
+ content::RenderWidgetHostView* GetActiveRenderWidgetHostView();
+
// The context menu. Callbacks are asynchronous so we need to keep it around.
scoped_ptr<RenderViewContextMenuMac> context_menu_;
diff --git a/chrome/browser/ui/cocoa/tab_contents/chrome_web_contents_view_delegate_mac.mm b/chrome/browser/ui/cocoa/tab_contents/chrome_web_contents_view_delegate_mac.mm
index b2dd787..1caeaea 100644
--- a/chrome/browser/ui/cocoa/tab_contents/chrome_web_contents_view_delegate_mac.mm
+++ b/chrome/browser/ui/cocoa/tab_contents/chrome_web_contents_view_delegate_mac.mm
@@ -43,18 +43,22 @@ void ChromeWebContentsViewDelegateMac::ShowContextMenu(
// the second mouse event arrives. In this case, |ShowContextMenu()| will
// get called multiple times - if so, don't create another context menu.
// TODO(asvitkine): Fix the renderer so that it doesn't do this.
- content::RenderWidgetHostView* widget_view =
- web_contents_->GetRenderWidgetHostView();
+ content::RenderWidgetHostView* widget_view = GetActiveRenderWidgetHostView();
if (widget_view && widget_view->IsShowingContextMenu())
return;
context_menu_.reset(new RenderViewContextMenuMac(
- render_frame_host,
- params,
- web_contents_->GetView()->GetContentNativeView()));
+ render_frame_host, params, widget_view->GetNativeView()));
context_menu_->Init();
}
+content::RenderWidgetHostView*
+ChromeWebContentsViewDelegateMac::GetActiveRenderWidgetHostView() {
+ return web_contents_->GetFullscreenRenderWidgetHostView() ?
+ web_contents_->GetFullscreenRenderWidgetHostView() :
+ web_contents_->GetRenderWidgetHostView();
+}
+
namespace chrome {
content::WebContentsViewDelegate* CreateWebContentsViewDelegate(
diff --git a/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.cc b/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.cc
index fe83cc9..d1da14e 100644
--- a/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.cc
+++ b/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.cc
@@ -137,14 +137,13 @@ void ChromeWebContentsViewDelegateViews::ShowContextMenu(
gfx::Point screen_point(params.x, params.y);
- // Convert from content coordinates to window coordinates.
- aura::Window* web_contents_window =
- web_contents_->GetView()->GetNativeView();
- aura::Window* root_window = web_contents_window->GetRootWindow();
+ // Convert from target window coordinates to root window coordinates.
+ aura::Window* target_window = GetActiveNativeView();
+ aura::Window* root_window = target_window->GetRootWindow();
aura::client::ScreenPositionClient* screen_position_client =
aura::client::GetScreenPositionClient(root_window);
if (screen_position_client) {
- screen_position_client->ConvertPointToScreen(web_contents_window,
+ screen_position_client->ConvertPointToScreen(target_window,
&screen_point);
}
// Enable recursive tasks on the message loop so we can get updates while
@@ -163,9 +162,14 @@ void ChromeWebContentsViewDelegateViews::SizeChanged(const gfx::Size& size) {
sad_tab->GetWidget()->SetBounds(gfx::Rect(size));
}
+aura::Window* ChromeWebContentsViewDelegateViews::GetActiveNativeView() {
+ return web_contents_->GetFullscreenRenderWidgetHostView() ?
+ web_contents_->GetFullscreenRenderWidgetHostView()->GetNativeView() :
+ web_contents_->GetView()->GetNativeView();
+}
+
views::Widget* ChromeWebContentsViewDelegateViews::GetTopLevelWidget() {
- return views::Widget::GetTopLevelWidgetForNativeView(
- web_contents_->GetView()->GetNativeView());
+ return views::Widget::GetTopLevelWidgetForNativeView(GetActiveNativeView());
}
views::FocusManager*
diff --git a/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.h b/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.h
index 018342f..ebdbb3e 100644
--- a/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.h
+++ b/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views.h
@@ -12,6 +12,10 @@
class RenderViewContextMenuViews;
+namespace aura {
+class Window;
+}
+
namespace content {
class WebContents;
class WebDragDestDelegate;
@@ -43,6 +47,7 @@ class ChromeWebContentsViewDelegateViews
virtual void SizeChanged(const gfx::Size& size) OVERRIDE;
private:
+ aura::Window* GetActiveNativeView();
views::Widget* GetTopLevelWidget();
views::FocusManager* GetFocusManager();
void SetInitialFocus();
diff --git a/content/renderer/pepper/renderer_ppapi_host_impl.cc b/content/renderer/pepper/renderer_ppapi_host_impl.cc
index 5014c98..afb5f12 100644
--- a/content/renderer/pepper/renderer_ppapi_host_impl.cc
+++ b/content/renderer/pepper/renderer_ppapi_host_impl.cc
@@ -203,18 +203,10 @@ gfx::Point RendererPpapiHostImpl::PluginPointToRenderFrame(
PP_Instance instance,
const gfx::Point& pt) const {
PepperPluginInstanceImpl* plugin_instance = GetAndValidateInstance(instance);
- if (!plugin_instance)
+ if (!plugin_instance || plugin_instance->flash_fullscreen()) {
+ // Flash fullscreen is special in that it renders into its own separate,
+ // dedicated window. So, do not offset the point.
return pt;
-
- RenderFrameImpl* render_frame = static_cast<RenderFrameImpl*>(
- GetRenderFrameForInstance(instance));
- if (plugin_instance->view_data().is_fullscreen ||
- plugin_instance->flash_fullscreen()) {
- blink::WebRect window_rect = render_frame->GetRenderWidget()->windowRect();
- blink::WebRect screen_rect =
- render_frame->GetRenderWidget()->screenInfo().rect;
- return gfx::Point(pt.x() - window_rect.x + screen_rect.x,
- pt.y() - window_rect.y + screen_rect.y);
}
return gfx::Point(pt.x() + plugin_instance->view_data().rect.point.x,
pt.y() + plugin_instance->view_data().rect.point.y);