Index: chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc |
diff --git a/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc b/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc |
index c6d910b7be8eb052689f3573a0aa722ee0841aa2..7b1dda5eb4bcaa7a8401193562fb19d5b8a67944 100644 |
--- a/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc |
+++ b/chrome/browser/guest_view/web_view/chrome_web_view_guest_delegate.cc |
@@ -39,7 +39,18 @@ bool ChromeWebViewGuestDelegate::HandleContextMenu( |
ContextMenuDelegate::FromWebContents(guest_web_contents()); |
DCHECK(menu_delegate); |
- pending_menu_ = menu_delegate->BuildMenu(guest_web_contents(), params); |
+ content::ContextMenuParams new_params = params; |
+ // The only case where |context_menu_position_| is not initialized is the case |
+ // where the input event is directly sent to the guest WebContents without |
+ // ever going throught the embedder and BrowserPlugin's |
+ // RenderWidgetHostViewGuest. This only happens in some tests, e.g., |
+ // WebViewInteractiveTest.ContextMenuParamCoordinates. |
+ if (context_menu_position_) { |
+ new_params.x = context_menu_position_->x(); |
+ new_params.y = context_menu_position_->y(); |
+ } |
+ |
+ pending_menu_ = menu_delegate->BuildMenu(guest_web_contents(), new_params); |
// It's possible for the returned menu to be null, so early out to avoid |
// a crash. TODO(wjmaclean): find out why it's possible for this to happen |
// in the first place, and if it's an error. |
@@ -139,4 +150,12 @@ void ChromeWebViewGuestDelegate::OnAccessibilityStatusChanged( |
} |
#endif |
+void ChromeWebViewGuestDelegate::SetContextMenuPosition( |
+ const gfx::Point& position) { |
+ if (context_menu_position_ == nullptr) |
+ context_menu_position_.reset(new gfx::Point()); |
+ |
+ *context_menu_position_ = position; |
+} |
+ |
} // namespace extensions |