From 0db82b3133b25711cf021c46a9bc78b510fea163 Mon Sep 17 00:00:00 2001 From: Tim Ledbetter Date: Tue, 16 Jun 2026 22:01:08 +0100 Subject: [PATCH] LibWebView+UI/Qt: Reuse an existing history tab when viewing history Previously, the "View History" action always opened a new tab. We now switch to an existing `about:history` tab when one exists in the active window and fall back to opening a new tab otherwise. --- Libraries/LibWebView/Application.cpp | 3 ++- Libraries/LibWebView/Application.h | 1 + UI/Qt/Application.cpp | 7 +++++++ UI/Qt/Application.h | 1 + UI/Qt/BrowserWindow.cpp | 12 ++++++++++++ UI/Qt/BrowserWindow.h | 1 + 6 files changed, 24 insertions(+), 1 deletion(-) diff --git a/Libraries/LibWebView/Application.cpp b/Libraries/LibWebView/Application.cpp index e9c51593e9..b7d3dd4061 100644 --- a/Libraries/LibWebView/Application.cpp +++ b/Libraries/LibWebView/Application.cpp @@ -1524,7 +1524,8 @@ void Application::initialize_actions() m_history_menu = Menu::create("History"sv); m_history_menu->add_action(Action::create("View History"sv, ActionID::ViewHistory, [this]() { - open_url_in_new_tab(URL::about_history(), Web::HTML::ActivateTab::Yes); + if (!activate_tab_with_url(URL::about_history())) + open_url_in_new_tab(URL::about_history(), Web::HTML::ActivateTab::Yes); })); m_inspect_menu = Menu::create("Inspect"sv); diff --git a/Libraries/LibWebView/Application.h b/Libraries/LibWebView/Application.h index 8aafc24839..8102287ae1 100644 --- a/Libraries/LibWebView/Application.h +++ b/Libraries/LibWebView/Application.h @@ -110,6 +110,7 @@ public: virtual Optional active_web_view() const { return {}; } virtual Optional open_blank_new_tab(Web::HTML::ActivateTab) const { return {}; } + virtual bool activate_tab_with_url(URL::URL const&) const { return false; } void open_url_in_new_tab(URL::URL const&, Web::HTML::ActivateTab) const; void open_bookmark_in_new_tab(String const& bookmark_id, Web::HTML::ActivateTab) const; diff --git a/UI/Qt/Application.cpp b/UI/Qt/Application.cpp index 1fdb1cb5db..10db079bfc 100644 --- a/UI/Qt/Application.cpp +++ b/UI/Qt/Application.cpp @@ -177,6 +177,13 @@ Optional Application::open_blank_new_tab(Web::HTML return tab.view(); } +bool Application::activate_tab_with_url(URL::URL const& url) const +{ + if (!m_active_window) + return false; + return m_active_window->activate_tab_with_url(url); +} + void Application::open_url_in_new_window(URL::URL const& url) { this->new_window({ url }); diff --git a/UI/Qt/Application.h b/UI/Qt/Application.h index 152287d179..d3e130dec4 100644 --- a/UI/Qt/Application.h +++ b/UI/Qt/Application.h @@ -46,6 +46,7 @@ private: virtual Optional active_web_view() const override; virtual Optional open_blank_new_tab(Web::HTML::ActivateTab) const override; + virtual bool activate_tab_with_url(URL::URL const&) const override; virtual void open_url_in_new_window(URL::URL const& url) override; virtual Optional ask_user_for_download_path(StringView file) const override; diff --git a/UI/Qt/BrowserWindow.cpp b/UI/Qt/BrowserWindow.cpp index 5cd33dd7d4..f8106c8791 100644 --- a/UI/Qt/BrowserWindow.cpp +++ b/UI/Qt/BrowserWindow.cpp @@ -715,6 +715,18 @@ void BrowserWindow::activate_tab(int index) m_tabs_container->set_current_index(index); } +bool BrowserWindow::activate_tab_with_url(URL::URL const& url) +{ + for (int index = 0; index < m_tabs_container->count(); ++index) { + auto* tab = m_tabs_container->tab(index); + if (tab && tab->view().url() == url) { + m_tabs_container->set_current_index(index); + return true; + } + } + return false; +} + void BrowserWindow::definitely_close_tab(int index) { auto* tab = m_tabs_container->tab(index); diff --git a/UI/Qt/BrowserWindow.h b/UI/Qt/BrowserWindow.h index 0785016be2..85e55e905d 100644 --- a/UI/Qt/BrowserWindow.h +++ b/UI/Qt/BrowserWindow.h @@ -103,6 +103,7 @@ public: Tab& create_new_tab(Web::HTML::ActivateTab activate_tab); Tab* current_tab() const { return m_current_tab; } + bool activate_tab_with_url(URL::URL const&); FullscreenMode& fullscreen_mode(); QMenu& hamburger_menu() const { return *m_hamburger_menu; }