From 3bbad4d4614ed1cfff36e3d4373453f888bbd3b1 Mon Sep 17 00:00:00 2001 From: Jay Harris Date: Wed, 18 Feb 2026 15:01:43 +1300 Subject: [PATCH] [AI Chat]: Fix open in New Tab from sidebar (#33963) --- .../ai_chat/ai_chat_side_panel_web_view.cc | 36 +++++++++++++++++++ .../ai_chat/ai_chat_side_panel_web_view.h | 6 ++++ 2 files changed, 42 insertions(+) diff --git a/browser/ui/views/side_panel/ai_chat/ai_chat_side_panel_web_view.cc b/browser/ui/views/side_panel/ai_chat/ai_chat_side_panel_web_view.cc index 5b52e91814b..1243d970088 100644 --- a/browser/ui/views/side_panel/ai_chat/ai_chat_side_panel_web_view.cc +++ b/browser/ui/views/side_panel/ai_chat/ai_chat_side_panel_web_view.cc @@ -15,11 +15,13 @@ #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator_params.h" #include "chrome/browser/ui/browser_window/public/browser_window_features.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface_iterator.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/side_panel/side_panel_entry_id.h" #include "chrome/browser/ui/views/side_panel/side_panel_ui.h" #include "chrome/browser/ui/views/side_panel/side_panel_web_ui_view.h" #include "components/grit/brave_components_strings.h" +#include "content/public/browser/browser_context.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/base/page_transition_types.h" #include "ui/base/window_open_disposition.h" @@ -30,6 +32,23 @@ using SidePanelWebUIViewT_AIChatUI = SidePanelWebUIViewT; BEGIN_TEMPLATE_METADATA(SidePanelWebUIViewT_AIChatUI, SidePanelWebUIViewT) END_METADATA +namespace { +BrowserWindowInterface* FindNormalBrowser( + const content::BrowserContext* context) { + BrowserWindowInterface* normal_browser = nullptr; + ForEachCurrentBrowserWindowInterfaceOrderedByActivation( + [&](BrowserWindowInterface* browser) { + if (browser->GetType() == BrowserWindowInterface::TYPE_NORMAL && + browser->GetProfile() == context) { + normal_browser = browser; + return false; // stop iterating + } + return true; // continue iterating + }); + return normal_browser; +} +} // namespace + // static std::unique_ptr AIChatSidePanelWebView::CreateView( Profile* profile, @@ -111,3 +130,20 @@ content::WebContents* AIChatSidePanelWebView::AddNewContents( return params.navigated_or_inserted_contents; } + +content::WebContents* AIChatSidePanelWebView::OpenURLFromTab( + content::WebContents* source, + const content::OpenURLParams& params, + base::OnceCallback + navigation_handle_callback) { + auto* browser = FindNormalBrowser(source->GetBrowserContext()); + if (browser && + (params.disposition == WindowOpenDisposition::NEW_FOREGROUND_TAB || + params.disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB || + params.disposition == WindowOpenDisposition::NEW_WINDOW || + params.disposition == WindowOpenDisposition::OFF_THE_RECORD)) { + return browser->OpenURL(params, std::move(navigation_handle_callback)); + } + return WebUIContentsWrapper::Host::OpenURLFromTab( + source, params, std::move(navigation_handle_callback)); +} diff --git a/browser/ui/views/side_panel/ai_chat/ai_chat_side_panel_web_view.h b/browser/ui/views/side_panel/ai_chat/ai_chat_side_panel_web_view.h index 1cdd5aeb848..fe6d4ee4e11 100644 --- a/browser/ui/views/side_panel/ai_chat/ai_chat_side_panel_web_view.h +++ b/browser/ui/views/side_panel/ai_chat/ai_chat_side_panel_web_view.h @@ -42,6 +42,12 @@ class AIChatSidePanelWebView : public SidePanelWebUIViewT { bool user_gesture, bool* was_blocked) override; + content::WebContents* OpenURLFromTab( + content::WebContents* source, + const content::OpenURLParams& params, + base::OnceCallback + navigation_handle_callback) override; + private: // This callback is invoked multiple times, so we need to ensure that // focus is set only once with `should_focus_`.