From 1dddefa7379e6f64be551399ef79e83a6feabe95 Mon Sep 17 00:00:00 2001 From: Kemal Zebari Date: Tue, 20 Dec 2022 23:28:00 -0800 Subject: [PATCH] Browser: Introduce action for opening bookmarks in a new window This change introduces an action to bookmarks that allows them to be opened in a new browser window. This is done by accessing any bookmark's context menu and pressing "Open in New Window". --- .../Applications/Browser/BookmarksBarWidget.cpp | 15 +++++++++++---- .../Applications/Browser/BookmarksBarWidget.h | 9 +++++---- Userland/Applications/Browser/BrowserWindow.cpp | 11 ++++++++++- Userland/Applications/Browser/BrowserWindow.h | 1 + Userland/Applications/Browser/Tab.cpp | 6 ++++-- Userland/Applications/Browser/Tab.h | 1 + 6 files changed, 32 insertions(+), 11 deletions(-) diff --git a/Userland/Applications/Browser/BookmarksBarWidget.cpp b/Userland/Applications/Browser/BookmarksBarWidget.cpp index 3d9a0756ee3..acbb3bd8ea3 100644 --- a/Userland/Applications/Browser/BookmarksBarWidget.cpp +++ b/Userland/Applications/Browser/BookmarksBarWidget.cpp @@ -125,7 +125,7 @@ BookmarksBarWidget::BookmarksBarWidget(DeprecatedString const& bookmarks_file, b auto default_action = GUI::Action::create( "&Open", g_icon_bag.go_to, [this](auto&) { if (on_bookmark_click) - on_bookmark_click(m_context_menu_url, OpenInNewTab::No); + on_bookmark_click(m_context_menu_url, Open::InSameTab); }, this); m_context_menu_default_action = default_action; @@ -133,7 +133,14 @@ BookmarksBarWidget::BookmarksBarWidget(DeprecatedString const& bookmarks_file, b m_context_menu->add_action(GUI::Action::create( "Open in New &Tab", g_icon_bag.new_tab, [this](auto&) { if (on_bookmark_click) - on_bookmark_click(m_context_menu_url, OpenInNewTab::Yes); + on_bookmark_click(m_context_menu_url, Open::InNewTab); + }, + this)); + m_context_menu->add_action(GUI::Action::create( + "Open in New Window", g_icon_bag.new_window, [this](auto&) { + if (on_bookmark_click) { + on_bookmark_click(m_context_menu_url, Open::InNewWindow); + } }, this)); m_context_menu->add_separator(); @@ -205,12 +212,12 @@ void BookmarksBarWidget::model_did_update(unsigned) button.on_click = [title, url, this](auto) { if (on_bookmark_click) - on_bookmark_click(url, OpenInNewTab::No); + on_bookmark_click(url, Open::InSameTab); }; button.on_middle_mouse_click = [title, url, this](auto) { if (on_bookmark_click) - on_bookmark_click(url, OpenInNewTab::Yes); + on_bookmark_click(url, Open::InNewTab); }; button.on_context_menu_request = [this, url](auto& context_menu_event) { diff --git a/Userland/Applications/Browser/BookmarksBarWidget.h b/Userland/Applications/Browser/BookmarksBarWidget.h index 7cbcd62bc03..461e615ebf8 100644 --- a/Userland/Applications/Browser/BookmarksBarWidget.h +++ b/Userland/Applications/Browser/BookmarksBarWidget.h @@ -26,12 +26,13 @@ public: GUI::Model* model() { return m_model.ptr(); } const GUI::Model* model() const { return m_model.ptr(); } - enum class OpenInNewTab { - Yes, - No + enum class Open { + InNewTab, + InSameTab, + InNewWindow }; - Function on_bookmark_click; + Function on_bookmark_click; Function on_bookmark_hover; bool contains_bookmark(DeprecatedString const& url); diff --git a/Userland/Applications/Browser/BrowserWindow.cpp b/Userland/Applications/Browser/BrowserWindow.cpp index fd0ec32095f..5dbe4665b1a 100644 --- a/Userland/Applications/Browser/BrowserWindow.cpp +++ b/Userland/Applications/Browser/BrowserWindow.cpp @@ -109,7 +109,7 @@ BrowserWindow::BrowserWindow(CookieJar& cookie_jar, URL url) }; m_window_actions.on_create_new_window = [this] { - GUI::Process::spawn_or_show_error(this, "/bin/Browser"sv); + create_new_window(g_home_url); }; m_window_actions.on_next_tab = [this] { @@ -583,6 +583,10 @@ void BrowserWindow::create_new_tab(URL url, bool activate) }); }; + new_tab.on_window_open_request = [this](auto& url) { + create_new_window(url); + }; + new_tab.on_get_all_cookies = [this](auto& url) { return m_cookie_jar.get_all_cookies(url); }; @@ -631,6 +635,11 @@ void BrowserWindow::create_new_tab(URL url, bool activate) m_tab_widget->set_active_widget(&new_tab); } +void BrowserWindow::create_new_window(URL url) +{ + GUI::Process::spawn_or_show_error(this, "/bin/Browser"sv, Array { url.to_deprecated_string() }); +} + void BrowserWindow::content_filters_changed() { tab_widget().for_each_child_of_type([](auto& tab) { diff --git a/Userland/Applications/Browser/BrowserWindow.h b/Userland/Applications/Browser/BrowserWindow.h index 82882d51597..5c9691c751b 100644 --- a/Userland/Applications/Browser/BrowserWindow.h +++ b/Userland/Applications/Browser/BrowserWindow.h @@ -29,6 +29,7 @@ public: GUI::TabWidget& tab_widget(); Tab& active_tab(); void create_new_tab(URL, bool activate); + void create_new_window(URL); GUI::Action& go_back_action() { return *m_go_back_action; } GUI::Action& go_forward_action() { return *m_go_forward_action; } diff --git a/Userland/Applications/Browser/Tab.cpp b/Userland/Applications/Browser/Tab.cpp index da59152a70f..d6f32ed3f63 100644 --- a/Userland/Applications/Browser/Tab.cpp +++ b/Userland/Applications/Browser/Tab.cpp @@ -580,9 +580,11 @@ void Tab::update_bookmark_button(DeprecatedString const& url) void Tab::did_become_active() { - BookmarksBarWidget::the().on_bookmark_click = [this](auto& url, auto open_in_new_tab) { - if (open_in_new_tab == BookmarksBarWidget::OpenInNewTab::Yes) + BookmarksBarWidget::the().on_bookmark_click = [this](auto& url, auto open) { + if (open == BookmarksBarWidget::Open::InNewTab) on_tab_open_request(url); + else if (open == BookmarksBarWidget::Open::InNewWindow) + on_window_open_request(url); else load(url); }; diff --git a/Userland/Applications/Browser/Tab.h b/Userland/Applications/Browser/Tab.h index 8f2bd484ea2..f5d076f1fe3 100644 --- a/Userland/Applications/Browser/Tab.h +++ b/Userland/Applications/Browser/Tab.h @@ -63,6 +63,7 @@ public: Function on_tab_open_request; Function on_tab_close_request; Function on_tab_close_other_request; + Function on_window_open_request; Function on_favicon_change; Function(AK::URL const& url)> on_get_all_cookies; Function(AK::URL const& url, DeprecatedString const& name)> on_get_named_cookie;