summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlazyboy@chromium.org <lazyboy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-19 04:16:43 +0000
committerlazyboy@chromium.org <lazyboy@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-19 04:16:43 +0000
commitcb8d7cf2fde4f063e02a7c3e099704a6133b6413 (patch)
tree2c82b8f303ea1d922d72f5b8b9d52e051c9ebb75
parent0e4e07b6d93ea2c9a645323d470316bbf8dd49cd (diff)
downloadchromium_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
-rw-r--r--chrome/browser/tab_contents/render_view_context_menu.cc30
-rw-r--r--chrome/browser/tab_contents/render_view_context_menu.h7
-rw-r--r--content/browser/browser_plugin/browser_plugin_guest.cc7
-rw-r--r--content/browser/renderer_host/render_widget_host_view_guest.cc2
-rw-r--r--content/browser/web_contents/web_contents_impl.cc5
-rw-r--r--content/browser/web_contents/web_contents_view_guest.cc18
-rw-r--r--content/browser/web_contents/web_contents_view_guest.h6
-rw-r--r--content/renderer/browser_plugin/browser_plugin.cc6
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