mirror of
https://github.com/RGBCube/serenity
synced 2025-05-20 14:05:08 +00:00
Browser: Move actions from Tab to BrowserWindow
Navigation actions (back/forward/home/reload) now live in BrowserWindow instead of being duplicated in every new Tab instance.
This commit is contained in:
parent
aed695d4b2
commit
a743075b9f
4 changed files with 69 additions and 47 deletions
|
@ -153,21 +153,21 @@ void BrowserWindow::build_menus()
|
||||||
},
|
},
|
||||||
this));
|
this));
|
||||||
|
|
||||||
auto go_back_action = GUI::CommonActions::make_go_back_action([this](auto&) { active_tab().go_back(); }, this);
|
m_go_back_action = GUI::CommonActions::make_go_back_action([this](auto&) { active_tab().go_back(); }, this);
|
||||||
auto go_forward_action = GUI::CommonActions::make_go_forward_action([this](auto&) { active_tab().go_forward(); }, this);
|
m_go_forward_action = GUI::CommonActions::make_go_forward_action([this](auto&) { active_tab().go_forward(); }, this);
|
||||||
auto go_home_action = GUI::CommonActions::make_go_home_action([this](auto&) { active_tab().load(g_home_url); }, this);
|
m_go_home_action = GUI::CommonActions::make_go_home_action([this](auto&) { active_tab().load(g_home_url); }, this);
|
||||||
go_home_action->set_status_tip("Go to home page");
|
m_go_home_action->set_status_tip("Go to home page");
|
||||||
auto reload_action = GUI::CommonActions::make_reload_action([this](auto&) { active_tab().reload(); }, this);
|
m_reload_action = GUI::CommonActions::make_reload_action([this](auto&) { active_tab().reload(); }, this);
|
||||||
reload_action->set_status_tip("Reload current page");
|
m_reload_action->set_status_tip("Reload current page");
|
||||||
|
|
||||||
auto& go_menu = menubar->add_menu("&Go");
|
auto& go_menu = menubar->add_menu("&Go");
|
||||||
go_menu.add_action(*go_back_action);
|
go_menu.add_action(*m_go_back_action);
|
||||||
go_menu.add_action(*go_forward_action);
|
go_menu.add_action(*m_go_forward_action);
|
||||||
go_menu.add_action(*go_home_action);
|
go_menu.add_action(*m_go_home_action);
|
||||||
go_menu.add_separator();
|
go_menu.add_separator();
|
||||||
go_menu.add_action(*reload_action);
|
go_menu.add_action(*m_reload_action);
|
||||||
|
|
||||||
auto view_source_action = GUI::Action::create(
|
m_view_source_action = GUI::Action::create(
|
||||||
"View &Source", { Mod_Ctrl, Key_U }, [this](auto&) {
|
"View &Source", { Mod_Ctrl, Key_U }, [this](auto&) {
|
||||||
auto& tab = active_tab();
|
auto& tab = active_tab();
|
||||||
if (tab.m_type == Tab::Type::InProcessWebView) {
|
if (tab.m_type == Tab::Type::InProcessWebView) {
|
||||||
|
@ -180,9 +180,9 @@ void BrowserWindow::build_menus()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
this);
|
this);
|
||||||
view_source_action->set_status_tip("View source code of the current page");
|
m_view_source_action->set_status_tip("View source code of the current page");
|
||||||
|
|
||||||
auto inspect_dom_tree_action = GUI::Action::create(
|
m_inspect_dom_tree_action = GUI::Action::create(
|
||||||
"Inspect &DOM Tree", { Mod_None, Key_F12 }, [this](auto&) {
|
"Inspect &DOM Tree", { Mod_None, Key_F12 }, [this](auto&) {
|
||||||
auto& tab = active_tab();
|
auto& tab = active_tab();
|
||||||
if (tab.m_type == Tab::Type::InProcessWebView) {
|
if (tab.m_type == Tab::Type::InProcessWebView) {
|
||||||
|
@ -202,11 +202,11 @@ void BrowserWindow::build_menus()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
this);
|
this);
|
||||||
inspect_dom_tree_action->set_status_tip("Open DOM inspector window for this page");
|
m_inspect_dom_tree_action->set_status_tip("Open DOM inspector window for this page");
|
||||||
|
|
||||||
auto& inspect_menu = menubar->add_menu("&Inspect");
|
auto& inspect_menu = menubar->add_menu("&Inspect");
|
||||||
inspect_menu.add_action(*view_source_action);
|
inspect_menu.add_action(*m_view_source_action);
|
||||||
inspect_menu.add_action(*inspect_dom_tree_action);
|
inspect_menu.add_action(*m_inspect_dom_tree_action);
|
||||||
|
|
||||||
auto js_console_action = GUI::Action::create(
|
auto js_console_action = GUI::Action::create(
|
||||||
"Open &JS Console", { Mod_Ctrl, Key_I }, [this](auto&) {
|
"Open &JS Console", { Mod_Ctrl, Key_I }, [this](auto&) {
|
||||||
|
@ -440,7 +440,7 @@ void BrowserWindow::set_window_title_for_tab(Tab const& tab)
|
||||||
void BrowserWindow::create_new_tab(URL url, bool activate)
|
void BrowserWindow::create_new_tab(URL url, bool activate)
|
||||||
{
|
{
|
||||||
auto type = Browser::g_single_process ? Browser::Tab::Type::InProcessWebView : Browser::Tab::Type::OutOfProcessWebView;
|
auto type = Browser::g_single_process ? Browser::Tab::Type::InProcessWebView : Browser::Tab::Type::OutOfProcessWebView;
|
||||||
auto& new_tab = m_tab_widget->add_tab<Browser::Tab>("New tab", type);
|
auto& new_tab = m_tab_widget->add_tab<Browser::Tab>("New tab", *this, type);
|
||||||
|
|
||||||
m_tab_widget->set_bar_visible(!is_fullscreen() && m_tab_widget->children().size() > 1);
|
m_tab_widget->set_bar_visible(!is_fullscreen() && m_tab_widget->children().size() > 1);
|
||||||
|
|
||||||
|
|
|
@ -26,12 +26,26 @@ public:
|
||||||
Tab& active_tab();
|
Tab& active_tab();
|
||||||
void create_new_tab(URL, bool activate);
|
void create_new_tab(URL, bool activate);
|
||||||
|
|
||||||
|
GUI::Action& go_back_action() { return *m_go_back_action; }
|
||||||
|
GUI::Action& go_forward_action() { return *m_go_forward_action; }
|
||||||
|
GUI::Action& go_home_action() { return *m_go_home_action; }
|
||||||
|
GUI::Action& reload_action() { return *m_reload_action; }
|
||||||
|
GUI::Action& view_source_action() { return *m_view_source_action; }
|
||||||
|
GUI::Action& inspect_dom_tree_action() { return *m_inspect_dom_tree_action; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit BrowserWindow(CookieJar&, URL);
|
explicit BrowserWindow(CookieJar&, URL);
|
||||||
|
|
||||||
void build_menus();
|
void build_menus();
|
||||||
void set_window_title_for_tab(Tab const&);
|
void set_window_title_for_tab(Tab const&);
|
||||||
|
|
||||||
|
RefPtr<GUI::Action> m_go_back_action;
|
||||||
|
RefPtr<GUI::Action> m_go_forward_action;
|
||||||
|
RefPtr<GUI::Action> m_go_home_action;
|
||||||
|
RefPtr<GUI::Action> m_reload_action;
|
||||||
|
RefPtr<GUI::Action> m_view_source_action;
|
||||||
|
RefPtr<GUI::Action> m_inspect_dom_tree_action;
|
||||||
|
|
||||||
CookieJar& m_cookie_jar;
|
CookieJar& m_cookie_jar;
|
||||||
WindowActions m_window_actions;
|
WindowActions m_window_actions;
|
||||||
RefPtr<GUI::TabWidget> m_tab_widget;
|
RefPtr<GUI::TabWidget> m_tab_widget;
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
#include "Tab.h"
|
#include "Tab.h"
|
||||||
#include "BookmarksBarWidget.h"
|
#include "BookmarksBarWidget.h"
|
||||||
#include "Browser.h"
|
#include "Browser.h"
|
||||||
|
#include "BrowserWindow.h"
|
||||||
#include "ConsoleWidget.h"
|
#include "ConsoleWidget.h"
|
||||||
#include "DownloadWidget.h"
|
#include "DownloadWidget.h"
|
||||||
#include <AK/StringBuilder.h>
|
#include <AK/StringBuilder.h>
|
||||||
|
@ -51,7 +52,7 @@ URL url_from_user_input(const String& input)
|
||||||
|
|
||||||
void Tab::start_download(const URL& url)
|
void Tab::start_download(const URL& url)
|
||||||
{
|
{
|
||||||
auto window = GUI::Window::construct(this->window());
|
auto window = GUI::Window::construct(&this->window());
|
||||||
window->resize(300, 150);
|
window->resize(300, 150);
|
||||||
window->set_title(String::formatted("0% of {}", url.basename()));
|
window->set_title(String::formatted("0% of {}", url.basename()));
|
||||||
window->set_resizable(false);
|
window->set_resizable(false);
|
||||||
|
@ -62,7 +63,7 @@ void Tab::start_download(const URL& url)
|
||||||
|
|
||||||
void Tab::view_source(const URL& url, const String& source)
|
void Tab::view_source(const URL& url, const String& source)
|
||||||
{
|
{
|
||||||
auto window = GUI::Window::construct(this->window());
|
auto window = GUI::Window::construct(&this->window());
|
||||||
auto& editor = window->set_main_widget<GUI::TextEditor>();
|
auto& editor = window->set_main_widget<GUI::TextEditor>();
|
||||||
editor.set_text(source);
|
editor.set_text(source);
|
||||||
editor.set_mode(GUI::TextEditor::ReadOnly);
|
editor.set_mode(GUI::TextEditor::ReadOnly);
|
||||||
|
@ -74,7 +75,7 @@ void Tab::view_source(const URL& url, const String& source)
|
||||||
[[maybe_unused]] auto& unused = window.leak_ref();
|
[[maybe_unused]] auto& unused = window.leak_ref();
|
||||||
}
|
}
|
||||||
|
|
||||||
Tab::Tab(Type type)
|
Tab::Tab(BrowserWindow& window, Type type)
|
||||||
: m_type(type)
|
: m_type(type)
|
||||||
{
|
{
|
||||||
load_from_gml(tab_gml);
|
load_from_gml(tab_gml);
|
||||||
|
@ -89,19 +90,10 @@ Tab::Tab(Type type)
|
||||||
else
|
else
|
||||||
m_web_content_view = webview_container.add<Web::OutOfProcessWebView>();
|
m_web_content_view = webview_container.add<Web::OutOfProcessWebView>();
|
||||||
|
|
||||||
m_go_back_action = GUI::CommonActions::make_go_back_action([this](auto&) { go_back(); }, this);
|
toolbar.add_action(window.go_back_action());
|
||||||
m_go_forward_action = GUI::CommonActions::make_go_forward_action([this](auto&) { go_forward(); }, this);
|
toolbar.add_action(window.go_forward_action());
|
||||||
m_go_home_action = GUI::CommonActions::make_go_home_action([this](auto&) { load(g_home_url); }, this);
|
toolbar.add_action(window.go_home_action());
|
||||||
m_go_home_action->set_status_tip("Go to home page");
|
toolbar.add_action(window.reload_action());
|
||||||
|
|
||||||
toolbar.add_action(*m_go_back_action);
|
|
||||||
toolbar.add_action(*m_go_forward_action);
|
|
||||||
toolbar.add_action(*m_go_home_action);
|
|
||||||
|
|
||||||
m_reload_action = GUI::CommonActions::make_reload_action([this](auto&) { reload(); }, this);
|
|
||||||
m_reload_action->set_status_tip("Reload current page");
|
|
||||||
|
|
||||||
toolbar.add_action(*m_reload_action);
|
|
||||||
|
|
||||||
m_location_box = toolbar.add<GUI::TextBox>();
|
m_location_box = toolbar.add<GUI::TextBox>();
|
||||||
m_location_box->set_placeholder("Address");
|
m_location_box->set_placeholder("Address");
|
||||||
|
@ -277,19 +269,19 @@ Tab::Tab(Type type)
|
||||||
|
|
||||||
m_tab_context_menu = GUI::Menu::construct();
|
m_tab_context_menu = GUI::Menu::construct();
|
||||||
m_tab_context_menu->add_action(GUI::Action::create("&Reload Tab", [this](auto&) {
|
m_tab_context_menu->add_action(GUI::Action::create("&Reload Tab", [this](auto&) {
|
||||||
m_reload_action->activate();
|
this->window().reload_action().activate();
|
||||||
}));
|
}));
|
||||||
m_tab_context_menu->add_action(GUI::Action::create("&Close Tab", [this](auto&) {
|
m_tab_context_menu->add_action(GUI::Action::create("&Close Tab", [this](auto&) {
|
||||||
on_tab_close_request(*this);
|
on_tab_close_request(*this);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
m_page_context_menu = GUI::Menu::construct();
|
m_page_context_menu = GUI::Menu::construct();
|
||||||
m_page_context_menu->add_action(*m_go_back_action);
|
m_page_context_menu->add_action(window.go_back_action());
|
||||||
m_page_context_menu->add_action(*m_go_forward_action);
|
m_page_context_menu->add_action(window.go_forward_action());
|
||||||
m_page_context_menu->add_action(*m_reload_action);
|
m_page_context_menu->add_action(window.reload_action());
|
||||||
m_page_context_menu->add_separator();
|
m_page_context_menu->add_separator();
|
||||||
//m_page_context_menu->add_action(*view_source_action);
|
m_page_context_menu->add_action(window.view_source_action());
|
||||||
//m_page_context_menu->add_action(*inspect_dom_tree_action);
|
m_page_context_menu->add_action(window.inspect_dom_tree_action());
|
||||||
hooks().on_context_menu_request = [&](auto& screen_position) {
|
hooks().on_context_menu_request = [&](auto& screen_position) {
|
||||||
m_page_context_menu->popup(screen_position);
|
m_page_context_menu->popup(screen_position);
|
||||||
};
|
};
|
||||||
|
@ -337,8 +329,11 @@ void Tab::go_forward()
|
||||||
|
|
||||||
void Tab::update_actions()
|
void Tab::update_actions()
|
||||||
{
|
{
|
||||||
m_go_back_action->set_enabled(m_history.can_go_back());
|
auto& window = this->window();
|
||||||
m_go_forward_action->set_enabled(m_history.can_go_forward());
|
if (this != &window.active_tab())
|
||||||
|
return;
|
||||||
|
window.go_back_action().set_enabled(m_history.can_go_back());
|
||||||
|
window.go_forward_action().set_enabled(m_history.can_go_forward());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tab::update_bookmark_button(const String& url)
|
void Tab::update_bookmark_button(const String& url)
|
||||||
|
@ -378,9 +373,11 @@ void Tab::did_become_active()
|
||||||
BookmarksBarWidget::the().remove_from_parent();
|
BookmarksBarWidget::the().remove_from_parent();
|
||||||
m_toolbar_container->add_child(BookmarksBarWidget::the());
|
m_toolbar_container->add_child(BookmarksBarWidget::the());
|
||||||
|
|
||||||
auto is_fullscreen = window()->is_fullscreen();
|
auto is_fullscreen = window().is_fullscreen();
|
||||||
m_toolbar_container->set_visible(!is_fullscreen);
|
m_toolbar_container->set_visible(!is_fullscreen);
|
||||||
m_statusbar->set_visible(!is_fullscreen);
|
m_statusbar->set_visible(!is_fullscreen);
|
||||||
|
|
||||||
|
update_actions();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tab::context_menu_requested(const Gfx::IntPoint& screen_position)
|
void Tab::context_menu_requested(const Gfx::IntPoint& screen_position)
|
||||||
|
@ -412,4 +409,14 @@ void Tab::action_left(GUI::Action&)
|
||||||
m_statusbar->set_override_text({});
|
m_statusbar->set_override_text({});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BrowserWindow const& Tab::window() const
|
||||||
|
{
|
||||||
|
return static_cast<BrowserWindow const&>(*Widget::window());
|
||||||
|
}
|
||||||
|
|
||||||
|
BrowserWindow& Tab::window()
|
||||||
|
{
|
||||||
|
return static_cast<BrowserWindow&>(*Widget::window());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,8 @@ class WebViewHooks;
|
||||||
|
|
||||||
namespace Browser {
|
namespace Browser {
|
||||||
|
|
||||||
|
class BrowserWindow;
|
||||||
|
|
||||||
class Tab final : public GUI::Widget {
|
class Tab final : public GUI::Widget {
|
||||||
C_OBJECT(Tab);
|
C_OBJECT(Tab);
|
||||||
|
|
||||||
|
@ -67,7 +69,10 @@ public:
|
||||||
GUI::AbstractScrollableWidget& view();
|
GUI::AbstractScrollableWidget& view();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
explicit Tab(Type);
|
explicit Tab(BrowserWindow&, Type);
|
||||||
|
|
||||||
|
BrowserWindow const& window() const;
|
||||||
|
BrowserWindow& window();
|
||||||
|
|
||||||
Web::WebViewHooks& hooks();
|
Web::WebViewHooks& hooks();
|
||||||
void update_actions();
|
void update_actions();
|
||||||
|
@ -82,10 +87,6 @@ private:
|
||||||
RefPtr<Web::InProcessWebView> m_page_view;
|
RefPtr<Web::InProcessWebView> m_page_view;
|
||||||
RefPtr<Web::OutOfProcessWebView> m_web_content_view;
|
RefPtr<Web::OutOfProcessWebView> m_web_content_view;
|
||||||
|
|
||||||
RefPtr<GUI::Action> m_go_back_action;
|
|
||||||
RefPtr<GUI::Action> m_go_forward_action;
|
|
||||||
RefPtr<GUI::Action> m_go_home_action;
|
|
||||||
RefPtr<GUI::Action> m_reload_action;
|
|
||||||
RefPtr<GUI::TextBox> m_location_box;
|
RefPtr<GUI::TextBox> m_location_box;
|
||||||
RefPtr<GUI::Button> m_bookmark_button;
|
RefPtr<GUI::Button> m_bookmark_button;
|
||||||
RefPtr<GUI::Window> m_dom_inspector_window;
|
RefPtr<GUI::Window> m_dom_inspector_window;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue