From b2059f288acba385d91cec0cc86135605bf477cf Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 6 Jun 2023 10:21:42 +0200 Subject: [PATCH] fix: account for `BrowserView` bounds in setting autofill popup bounds (#38489) --- shell/browser/electron_autofill_driver.cc | 25 ++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/shell/browser/electron_autofill_driver.cc b/shell/browser/electron_autofill_driver.cc index 951422d16d4f..eb1555a23995 100644 --- a/shell/browser/electron_autofill_driver.cc +++ b/shell/browser/electron_autofill_driver.cc @@ -11,6 +11,7 @@ #include "content/public/browser/render_widget_host_view.h" #include "shell/browser/api/electron_api_web_contents.h" #include "shell/browser/javascript_environment.h" +#include "shell/browser/native_browser_view.h" #include "shell/browser/native_window.h" namespace electron { @@ -36,7 +37,11 @@ void AutofillDriver::ShowAutofillPopup( v8::HandleScope scope(isolate); auto* web_contents = api::WebContents::From( content::WebContents::FromRenderFrameHost(render_frame_host_)); - if (!web_contents || !web_contents->owner_window()) + if (!web_contents) + return; + + auto* owner_window = web_contents->owner_window(); + if (!owner_window) return; auto* embedder = web_contents->embedder(); @@ -55,9 +60,23 @@ void AutofillDriver::ShowAutofillPopup( embedder_frame_host = embedder->web_contents()->GetPrimaryMainFrame(); } + // Ensure that if the WebContents belongs to a BrowserView, + // the popup is positioned relative to the BrowserView's bounds. + for (NativeBrowserView* bv : owner_window->browser_views()) { + auto* iwc = bv->GetInspectableWebContents(); + if (!iwc) + continue; + + auto* awc = api::WebContents::From(iwc->GetWebContents()); + if (awc == web_contents) { + auto bv_origin = bv->GetBounds().origin(); + popup_bounds.Offset(gfx::Vector2dF(bv_origin.x(), bv_origin.y())); + break; + } + } + autofill_popup_->CreateView(render_frame_host_, embedder_frame_host, osr, - web_contents->owner_window()->content_view(), - popup_bounds); + owner_window->content_view(), popup_bounds); autofill_popup_->SetItems(values, labels); }