Index: content/browser/web_contents/web_contents_impl.cc |
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc |
index bfae0c2414406717893f98f7a8df07f750eac9a3..9c23bb86eae1a6a2f4e96b8355c01f1ff6311112 100644 |
--- a/content/browser/web_contents/web_contents_impl.cc |
+++ b/content/browser/web_contents/web_contents_impl.cc |
@@ -1597,13 +1597,19 @@ void WebContentsImpl::ReplicatePageFocus(bool is_focused) { |
frame_tree_.ReplicatePageFocus(is_focused); |
} |
-RenderWidgetHostImpl* WebContentsImpl::GetFocusedRenderWidgetHost() { |
+RenderWidgetHostImpl* WebContentsImpl::GetFocusedRenderWidgetHost( |
+ RenderWidgetHostImpl* receiving_widget) { |
if (!SiteIsolationPolicy::AreCrossProcessFramesPossible()) |
- return GetMainFrame()->GetRenderWidgetHost(); |
+ return receiving_widget; |
+ |
+ // Events for widgets other than the main frame (e.g., popup menus) should be |
+ // forwarded directly to the widget they arrived on. |
+ if (receiving_widget != GetMainFrame()->GetRenderWidgetHost()) |
+ return receiving_widget; |
FrameTreeNode* focused_frame = frame_tree_.GetFocusedFrame(); |
if (!focused_frame) |
- return GetMainFrame()->GetRenderWidgetHost(); |
+ return receiving_widget; |
return RenderWidgetHostImpl::From( |
focused_frame->current_frame_host()->GetView()->GetRenderWidgetHost()); |