diff options
author | lazyboy@chromium.org <lazyboy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-19 04:16:43 +0000 |
---|---|---|
committer | lazyboy@chromium.org <lazyboy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-19 04:16:43 +0000 |
commit | cb8d7cf2fde4f063e02a7c3e099704a6133b6413 (patch) | |
tree | 2c82b8f303ea1d922d72f5b8b9d52e051c9ebb75 | |
parent | 0e4e07b6d93ea2c9a645323d470316bbf8dd49cd (diff) | |
download | chromium_src-cb8d7cf2fde4f063e02a7c3e099704a6133b6413.zip chromium_src-cb8d7cf2fde4f063e02a7c3e099704a6133b6413.tar.gz chromium_src-cb8d7cf2fde4f063e02a7c3e099704a6133b6413.tar.bz2 |
Show page's context menu for guest (instead of falling back to embedder's ctx menu).
BUG=140315
TEST=Manually: a. with selecting text, copying, with input fields, copy pasting.
b. with <video> elements, play/pause items appear correctly.
c. Does not work: Links are not recognized within guests from blink, so no copy link address yet.
Review URL: https://chromiumcodereview.appspot.com/16466004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@207177 0039d316-1c4b-4281-b951-d872f2087c98
8 files changed, 55 insertions, 26 deletions
diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc index 608688f..e5a8f01 100644 --- a/chrome/browser/tab_contents/render_view_context_menu.cc +++ b/chrome/browser/tab_contents/render_view_context_menu.cc @@ -391,7 +391,11 @@ RenderViewContextMenu::RenderViewContextMenu( protocol_handler_submenu_model_(this), protocol_handler_registry_( ProtocolHandlerRegistryFactory::GetForProfile(profile_)), - command_executed_(false) { + command_executed_(false), + is_guest_(false) { + RenderViewHost* rvh = source_web_contents_->GetRenderViewHost(); + if (rvh && rvh->GetProcess()->IsGuest()) + is_guest_ = true; } RenderViewContextMenu::~RenderViewContextMenu() { @@ -572,6 +576,7 @@ void RenderViewContextMenu::InitMenu() { if (params_.media_type == WebContextMenuData::MediaTypeNone && !has_link && !params_.is_editable && + !is_guest_ && !has_selection) { if (!params_.page_url.is_empty()) { bool is_devtools = IsDevToolsURL(params_.page_url); @@ -623,7 +628,7 @@ void RenderViewContextMenu::InitMenu() { else if (has_selection) AppendCopyItem(); - if (has_selection) { + if (!is_guest_ && has_selection) { AppendSearchProvider(); if (!IsDevToolsURL(params_.page_url)) AppendPrintItem(); @@ -634,16 +639,19 @@ void RenderViewContextMenu::InitMenu() { AppendDeveloperItems(); - if (!print_preview_menu_observer_.get()) { - print_preview_menu_observer_.reset( - new PrintPreviewContextMenuObserver(source_web_contents_)); - } - if (!instant_extended_observer_.get()) { - instant_extended_observer_.reset( - new InstantExtendedContextMenuObserver(source_web_contents_)); + if (!is_guest_) { + if (!print_preview_menu_observer_.get()) { + print_preview_menu_observer_.reset( + new PrintPreviewContextMenuObserver(source_web_contents_)); + } + if (!instant_extended_observer_.get()) { + instant_extended_observer_.reset( + new InstantExtendedContextMenuObserver(source_web_contents_)); + } + + observers_.AddObserver(print_preview_menu_observer_.get()); + observers_.AddObserver(instant_extended_observer_.get()); } - observers_.AddObserver(print_preview_menu_observer_.get()); - observers_.AddObserver(instant_extended_observer_.get()); } const Extension* RenderViewContextMenu::GetExtension() const { diff --git a/chrome/browser/tab_contents/render_view_context_menu.h b/chrome/browser/tab_contents/render_view_context_menu.h index 3a3b18d..a1179a2 100644 --- a/chrome/browser/tab_contents/render_view_context_menu.h +++ b/chrome/browser/tab_contents/render_view_context_menu.h @@ -287,6 +287,13 @@ class RenderViewContextMenu : public ui::SimpleMenuModel::Delegate, // should be notified of menu closing without execution. bool command_executed_; + // Whether or not the menu was triggered for a browser plugin guest. + // Guests are rendered inside chrome apps, but have most of the actions + // that a regular web page has. + // Currently actions/items that are suppressed from guests are: searching, + // printing, speech and instant. + bool is_guest_; + DISALLOW_COPY_AND_ASSIGN(RenderViewContextMenu); }; diff --git a/content/browser/browser_plugin/browser_plugin_guest.cc b/content/browser/browser_plugin/browser_plugin_guest.cc index bf83088..a1ac547 100644 --- a/content/browser/browser_plugin/browser_plugin_guest.cc +++ b/content/browser/browser_plugin/browser_plugin_guest.cc @@ -581,12 +581,11 @@ void BrowserPluginGuest::CloseContents(WebContents* source) { SendMessageToEmbedder(new BrowserPluginMsg_Close(instance_id_)); } -bool BrowserPluginGuest::HandleContextMenu( - const ContextMenuParams& params) { - // TODO(fsamuel): We have a do nothing context menu handler for now until +bool BrowserPluginGuest::HandleContextMenu(const ContextMenuParams& params) { + // TODO(fsamuel): We show the regular page context menu handler for now until // we implement the Apps Context Menu API for Browser Plugin (see // http://crbug.com/140315). - return true; + return false; // Will be handled by WebContentsViewGuest. } void BrowserPluginGuest::HandleKeyboardEvent( diff --git a/content/browser/renderer_host/render_widget_host_view_guest.cc b/content/browser/renderer_host/render_widget_host_view_guest.cc index 13d0f9a..f37f4a4 100644 --- a/content/browser/renderer_host/render_widget_host_view_guest.cc +++ b/content/browser/renderer_host/render_widget_host_view_guest.cc @@ -448,7 +448,7 @@ GdkEventButton* RenderWidgetHostViewGuest::GetLastMouseDown() { } gfx::NativeView RenderWidgetHostViewGuest::BuildInputMethodsGtkMenu() { - return gfx::NativeView(); + return platform_view_->BuildInputMethodsGtkMenu(); } #endif // defined(TOOLKIT_GTK) diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 5ac82c8..784c957 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -1235,11 +1235,14 @@ void WebContentsImpl::Init(const WebContents::CreateParams& params) { GetContentClient()->browser()->GetWebContentsViewDelegate(this); if (browser_plugin_guest_) { + // |render_view_host_delegate_view_| is a WebContentsView* and its + // lifetime is managed by its associated WebContentsImpl. WebContentsViewPort* platform_view = CreateWebContentsView( this, delegate, &render_view_host_delegate_view_); WebContentsViewGuest* rv = new WebContentsViewGuest( - this, browser_plugin_guest_.get(), platform_view); + this, browser_plugin_guest_.get(), platform_view, + render_view_host_delegate_view_); render_view_host_delegate_view_ = rv; view_.reset(rv); } else { diff --git a/content/browser/web_contents/web_contents_view_guest.cc b/content/browser/web_contents/web_contents_view_guest.cc index cc613e7..df142e3 100644 --- a/content/browser/web_contents/web_contents_view_guest.cc +++ b/content/browser/web_contents/web_contents_view_guest.cc @@ -14,6 +14,7 @@ #include "content/browser/web_contents/web_contents_impl.h" #include "content/common/drag_messages.h" #include "content/public/browser/web_contents_delegate.h" +#include "content/public/common/context_menu_params.h" #include "ui/gfx/image/image_skia.h" #include "ui/gfx/point.h" #include "ui/gfx/rect.h" @@ -28,10 +29,12 @@ namespace content { WebContentsViewGuest::WebContentsViewGuest( WebContentsImpl* web_contents, BrowserPluginGuest* guest, - WebContentsViewPort* platform_view) + WebContentsViewPort* platform_view, + RenderViewHostDelegateView* platform_view_delegate_view) : web_contents_(web_contents), guest_(guest), - platform_view_(platform_view) { + platform_view_(platform_view), + platform_view_delegate_view_(platform_view_delegate_view) { } WebContentsViewGuest::~WebContentsViewGuest() { @@ -53,7 +56,11 @@ gfx::NativeWindow WebContentsViewGuest::GetTopLevelNativeWindow() const { } void WebContentsViewGuest::GetContainerBounds(gfx::Rect* out) const { - out->SetRect(0, 0, size_.width(), size_.height()); + // We need embedder container's bounds to calculate our bounds. + guest_->embedder_web_contents()->GetView()->GetContainerBounds(out); + gfx::Point guest_coordinates = guest_->GetScreenCoordinates(gfx::Point()); + out->Offset(guest_coordinates.x(), guest_coordinates.y()); + out->set_size(size_); } void WebContentsViewGuest::SizeContents(const gfx::Size& size) { @@ -181,9 +188,8 @@ void WebContentsViewGuest::GotFocus() { void WebContentsViewGuest::TakeFocus(bool reverse) { } -void WebContentsViewGuest::ShowContextMenu( - const ContextMenuParams& params) { - NOTIMPLEMENTED(); +void WebContentsViewGuest::ShowContextMenu(const ContextMenuParams& params) { + platform_view_delegate_view_->ShowContextMenu(params); } void WebContentsViewGuest::ShowPopupMenu(const gfx::Rect& bounds, diff --git a/content/browser/web_contents/web_contents_view_guest.h b/content/browser/web_contents/web_contents_view_guest.h index baf8ef6..ab395c0 100644 --- a/content/browser/web_contents/web_contents_view_guest.h +++ b/content/browser/web_contents/web_contents_view_guest.h @@ -30,7 +30,8 @@ class CONTENT_EXPORT WebContentsViewGuest // |platform_view|. WebContentsViewGuest(WebContentsImpl* web_contents, BrowserPluginGuest* guest, - WebContentsViewPort* platform_view); + WebContentsViewPort* platform_view, + RenderViewHostDelegateView* platform_view_delegate_view); virtual ~WebContentsViewGuest(); WebContents* web_contents(); @@ -98,6 +99,9 @@ class CONTENT_EXPORT WebContentsViewGuest WebContentsViewPort* platform_view_; gfx::Size size_; + // Delegate view for guest's platform view. + RenderViewHostDelegateView* platform_view_delegate_view_; + DISALLOW_COPY_AND_ASSIGN(WebContentsViewGuest); }; diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc index 92079bf..cd75c23 100644 --- a/content/renderer/browser_plugin/browser_plugin.cc +++ b/content/renderer/browser_plugin/browser_plugin.cc @@ -1508,10 +1508,12 @@ bool BrowserPlugin::acceptsInputEvents() { bool BrowserPlugin::handleInputEvent(const WebKit::WebInputEvent& event, WebKit::WebCursorInfo& cursor_info) { - if (guest_crashed_ || !HasGuestInstanceID() || - event.type == WebKit::WebInputEvent::ContextMenu) + if (guest_crashed_ || !HasGuestInstanceID()) return false; + if (event.type == WebKit::WebInputEvent::ContextMenu) + return true; + const WebKit::WebInputEvent* modified_event = &event; scoped_ptr<WebKit::WebTouchEvent> touch_event; // WebKit gives BrowserPlugin a list of touches that are down, but the browser |