diff options
author | Andreas Kling <kling@serenityos.org> | 2020-07-06 21:46:37 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-07-06 21:46:37 +0200 |
commit | d8be535579534188c216f61787b633ed00ddacf1 (patch) | |
tree | 4b0cf7723e42072d9be1bcb223036aef9ed7b99a | |
parent | 49b9a0a66538ecc15247519e82fc43faff8c1d80 (diff) | |
download | serenity-d8be535579534188c216f61787b633ed00ddacf1.zip |
Browser+LibWeb: Pave the way for using WebContentView in Browser
This commit sets everything up, but we still always instantiate a plain
Web::PageView in Browser::Tab..
-rw-r--r-- | Applications/Browser/Tab.cpp | 203 | ||||
-rw-r--r-- | Applications/Browser/Tab.h | 24 | ||||
-rw-r--r-- | Applications/Browser/main.cpp | 8 | ||||
-rw-r--r-- | Libraries/LibWeb/PageView.cpp | 9 | ||||
-rw-r--r-- | Libraries/LibWeb/WebContentView.cpp | 1 | ||||
-rw-r--r-- | Libraries/LibWeb/WebContentView.h | 3 |
6 files changed, 176 insertions, 72 deletions
diff --git a/Applications/Browser/Tab.cpp b/Applications/Browser/Tab.cpp index 6e92d020ec..1d5929c47b 100644 --- a/Applications/Browser/Tab.cpp +++ b/Applications/Browser/Tab.cpp @@ -56,6 +56,7 @@ #include <LibWeb/Loader/ResourceLoader.h> #include <LibWeb/PageView.h> #include <LibWeb/Parser/CSSParser.h> +#include <LibWeb/WebContentView.h> namespace Browser { @@ -73,20 +74,25 @@ URL url_from_user_input(const String& input) return URL(builder.build()); } -Tab::Tab() +Tab::Tab(Type type) + : m_type(type) { auto& widget = *this; set_layout<GUI::VerticalBoxLayout>(); m_toolbar_container = widget.add<GUI::ToolBarContainer>(); auto& toolbar = m_toolbar_container->add<GUI::ToolBar>(); - m_page_view = widget.add<Web::PageView>(); + + if (m_type == Type::InProcessWebView) + m_page_view = widget.add<Web::PageView>(); + else + m_web_content_view = widget.add<WebContentView>(); m_go_back_action = GUI::CommonActions::make_go_back_action([this](auto&) { m_history.go_back(); update_actions(); TemporaryChange<bool> change(m_should_push_loads_to_history, false); - m_page_view->load(m_history.current()); + load(m_history.current()); }, this); @@ -94,7 +100,7 @@ Tab::Tab() m_history.go_forward(); update_actions(); TemporaryChange<bool> change(m_should_push_loads_to_history, false); - m_page_view->load(m_history.current()); + load(m_history.current()); }, this); @@ -102,14 +108,15 @@ Tab::Tab() toolbar.add_action(*m_go_forward_action); toolbar.add_action(GUI::CommonActions::make_go_home_action([this](auto&) { - m_page_view->load(g_home_url); + load(g_home_url); }, this)); - m_reload_action = GUI::CommonActions::make_reload_action([this](auto&) { - TemporaryChange<bool> change(m_should_push_loads_to_history, false); - m_page_view->reload(); - }, + m_reload_action = GUI::CommonActions::make_reload_action( + [this](auto&) { + TemporaryChange<bool> change(m_should_push_loads_to_history, false); + reload(); + }, this); toolbar.add_action(*m_reload_action); @@ -120,8 +127,8 @@ Tab::Tab() m_location_box->on_return_pressed = [this] { auto url = url_from_user_input(m_location_box->text()); - m_page_view->load(url); - m_page_view->set_focus(true); + load(url); + view().set_focus(true); }; m_location_box->add_custom_context_menu_action(GUI::Action::create("Paste & Go", [this](auto&) { @@ -136,7 +143,7 @@ Tab::Tab() m_bookmark_button->set_preferred_size(22, 22); m_bookmark_button->on_click = [this](auto) { - auto url = m_page_view->document()->url().to_string(); + auto url = this->url().to_string(); if (BookmarksBarWidget::the().contains_bookmark(url)) { BookmarksBarWidget::the().remove_bookmark(url); } else { @@ -145,7 +152,7 @@ Tab::Tab() update_bookmark_button(url); }; - m_page_view->on_load_start = [this](auto& url) { + hooks().on_load_start = [this](auto& url) { m_location_box->set_icon(nullptr); m_location_box->set_text(url.to_string()); if (m_should_push_loads_to_history) @@ -154,20 +161,20 @@ Tab::Tab() update_bookmark_button(url.to_string()); }; - m_page_view->on_link_click = [this](auto& url, auto& target, unsigned modifiers) { + hooks().on_link_click = [this](auto& url, auto& target, unsigned modifiers) { if (target == "_blank" || modifiers == Mod_Ctrl) { on_tab_open_request(url); } else { - m_page_view->load(url); + load(url); } }; m_link_context_menu = GUI::Menu::construct(); m_link_context_menu->add_action(GUI::Action::create("Open", [this](auto&) { - m_page_view->on_link_click(m_link_context_menu_url, "", 0); + hooks().on_link_click(m_link_context_menu_url, "", 0); })); m_link_context_menu->add_action(GUI::Action::create("Open in new tab", [this](auto&) { - m_page_view->on_link_click(m_link_context_menu_url, "_blank", 0); + hooks().on_link_click(m_link_context_menu_url, "_blank", 0); })); m_link_context_menu->add_action(GUI::Action::create("Copy link", [this](auto&) { GUI::Clipboard::the().set_data(m_link_context_menu_url.to_string()); @@ -184,7 +191,7 @@ Tab::Tab() (void)window.leak_ref(); })); - m_page_view->on_link_context_menu_request = [this](auto& url, auto& screen_position) { + hooks().on_link_context_menu_request = [this](auto& url, auto& screen_position) { m_link_context_menu_url = url; m_link_context_menu->popup(screen_position); }; @@ -193,9 +200,9 @@ Tab::Tab() hooks().on_link_click(href, "_blank", 0); }; - m_page_view->on_title_change = [this](auto& title) { + hooks().on_title_change = [this](auto& title) { if (title.is_null()) { - m_title = m_page_view->document()->url().to_string(); + m_title = url().to_string(); } else { m_title = title; } @@ -203,19 +210,22 @@ Tab::Tab() on_title_change(m_title); }; - m_page_view->on_favicon_change = [this](auto& icon) { + hooks().on_favicon_change = [this](auto& icon) { m_icon = icon; m_location_box->set_icon(&icon); if (on_favicon_change) on_favicon_change(icon); }; - m_page_view->on_set_document = [this](auto* document) { - if (document && m_console_window) { - auto* console_widget = static_cast<ConsoleWidget*>(m_console_window->main_widget()); - console_widget->set_interpreter(document->interpreter().make_weak_ptr()); - } - }; + // FIXME: Support JS console in multi-process mode. + if (m_type == Type::InProcessWebView) { + hooks().on_set_document = [this](auto* document) { + if (document && m_console_window) { + auto* console_widget = static_cast<ConsoleWidget*>(m_console_window->main_widget()); + console_widget->set_interpreter(document->interpreter().make_weak_ptr()); + } + }; + } auto focus_location_box_action = GUI::Action::create( "Focus location box", { Mod_Ctrl, Key_L }, [this](auto&) { @@ -226,15 +236,15 @@ Tab::Tab() m_statusbar = widget.add<GUI::StatusBar>(); - m_page_view->on_link_hover = [this](auto& url) { + hooks().on_link_hover = [this](auto& url) { if (url.is_valid()) m_statusbar->set_text(url.to_string()); else m_statusbar->set_text(""); }; - m_page_view->on_url_drop = [this](auto& url) { - m_page_view->load(url); + hooks().on_url_drop = [this](auto& url) { + load(url); }; m_menubar = GUI::MenuBar::construct(); @@ -268,33 +278,41 @@ Tab::Tab() auto view_source_action = GUI::Action::create( "View source", { Mod_Ctrl, Key_U }, [this](auto&) { - ASSERT(m_page_view->document()); - auto url = m_page_view->document()->url().to_string(); - auto source = m_page_view->document()->source(); - auto window = GUI::Window::construct(); - auto& editor = window->set_main_widget<GUI::TextEditor>(); - editor.set_text(source); - editor.set_readonly(true); - editor.set_ruler_visible(true); - window->set_rect(150, 150, 640, 480); - window->set_title(url); - window->show(); - (void)window.leak_ref(); + if (m_type == Type::InProcessWebView) { + ASSERT(m_page_view->document()); + auto url = m_page_view->document()->url().to_string(); + auto source = m_page_view->document()->source(); + auto window = GUI::Window::construct(); + auto& editor = window->set_main_widget<GUI::TextEditor>(); + editor.set_text(source); + editor.set_readonly(true); + editor.set_ruler_visible(true); + window->set_rect(150, 150, 640, 480); + window->set_title(url); + window->show(); + (void)window.leak_ref(); + } else { + TODO(); + } }, this); auto inspect_dom_tree_action = GUI::Action::create( "Inspect DOM tree", { Mod_None, Key_F12 }, [this](auto&) { - if (!m_dom_inspector_window) { - m_dom_inspector_window = GUI::Window::construct(); - m_dom_inspector_window->set_rect(100, 100, 300, 500); - m_dom_inspector_window->set_title("DOM inspector"); - m_dom_inspector_window->set_main_widget<InspectorWidget>(); + if (m_type == Type::InProcessWebView) { + if (!m_dom_inspector_window) { + m_dom_inspector_window = GUI::Window::construct(); + m_dom_inspector_window->set_rect(100, 100, 300, 500); + m_dom_inspector_window->set_title("DOM inspector"); + m_dom_inspector_window->set_main_widget<InspectorWidget>(); + } + auto* inspector_widget = static_cast<InspectorWidget*>(m_dom_inspector_window->main_widget()); + inspector_widget->set_document(m_page_view->document()); + m_dom_inspector_window->show(); + m_dom_inspector_window->move_to_front(); + } else { + TODO(); } - auto* inspector_widget = static_cast<InspectorWidget*>(m_dom_inspector_window->main_widget()); - inspector_widget->set_document(m_page_view->document()); - m_dom_inspector_window->show(); - m_dom_inspector_window->move_to_front(); }, this); @@ -304,42 +322,62 @@ Tab::Tab() inspect_menu.add_action(GUI::Action::create( "Open JS Console", { Mod_Ctrl, Key_I }, [this](auto&) { - if (!m_console_window) { - m_console_window = GUI::Window::construct(); - m_console_window->set_rect(100, 100, 500, 300); - m_console_window->set_title("JS Console"); - m_console_window->set_main_widget<ConsoleWidget>(); + if (m_type == Type::InProcessWebView) { + if (!m_console_window) { + m_console_window = GUI::Window::construct(); + m_console_window->set_rect(100, 100, 500, 300); + m_console_window->set_title("JS Console"); + m_console_window->set_main_widget<ConsoleWidget>(); + } + auto* console_widget = static_cast<ConsoleWidget*>(m_console_window->main_widget()); + console_widget->set_interpreter(m_page_view->document()->interpreter().make_weak_ptr()); + m_console_window->show(); + m_console_window->move_to_front(); + } else { + TODO(); } - auto* console_widget = static_cast<ConsoleWidget*>(m_console_window->main_widget()); - console_widget->set_interpreter(m_page_view->document()->interpreter().make_weak_ptr()); - m_console_window->show(); - m_console_window->move_to_front(); }, this)); auto& debug_menu = m_menubar->add_menu("Debug"); debug_menu.add_action(GUI::Action::create( "Dump DOM tree", [this](auto&) { - Web::dump_tree(*m_page_view->document()); + if (m_type == Type::InProcessWebView) { + Web::dump_tree(*m_page_view->document()); + } else { + TODO(); + } }, this)); debug_menu.add_action(GUI::Action::create( "Dump Layout tree", [this](auto&) { - Web::dump_tree(*m_page_view->document()->layout_node()); + if (m_type == Type::InProcessWebView) { + Web::dump_tree(*m_page_view->document()->layout_node()); + } else { + TODO(); + } }, this)); debug_menu.add_action(GUI::Action::create( "Dump Style sheets", [this](auto&) { - for (auto& sheet : m_page_view->document()->style_sheets().sheets()) { - dump_sheet(sheet); + if (m_type == Type::InProcessWebView) { + for (auto& sheet : m_page_view->document()->style_sheets().sheets()) { + dump_sheet(sheet); + } + } else { + TODO(); } }, this)); debug_menu.add_separator(); auto line_box_borders_action = GUI::Action::create_checkable( "Line box borders", [this](auto& action) { - m_page_view->set_should_show_line_box_borders(action.is_checked()); - m_page_view->update(); + if (m_type == Type::InProcessWebView) { + m_page_view->set_should_show_line_box_borders(action.is_checked()); + m_page_view->update(); + } else { + TODO(); + } }, this); line_box_borders_action->set_checked(false); @@ -366,7 +404,7 @@ Tab::Tab() m_page_context_menu->add_separator(); m_page_context_menu->add_action(*view_source_action); m_page_context_menu->add_action(*inspect_dom_tree_action); - m_page_view->on_context_menu_request = [&](auto& screen_position) { + hooks().on_context_menu_request = [&](auto& screen_position) { m_page_context_menu->popup(screen_position); }; } @@ -377,7 +415,22 @@ Tab::~Tab() void Tab::load(const URL& url) { - m_page_view->load(url); + if (m_type == Type::InProcessWebView) + m_page_view->load(url); + else + m_web_content_view->load(url); +} + +URL Tab::url() const +{ + if (m_type == Type::InProcessWebView) + return m_page_view->url(); + return m_web_content_view->url(); +} + +void Tab::reload() +{ + load(url()); } void Tab::update_actions() @@ -411,7 +464,7 @@ void Tab::did_become_active() if (modifiers & Mod_Ctrl) on_tab_open_request(url); else - m_page_view->load(url); + load(url); }; BookmarksBarWidget::the().on_bookmark_hover = [this](auto&, auto& url) { @@ -433,4 +486,16 @@ void Tab::context_menu_requested(const Gfx::IntPoint& screen_position) m_tab_context_menu->popup(screen_position); } +GUI::Widget& Tab::view() +{ + if (m_type == Type::InProcessWebView) + return *m_page_view; + return *m_web_content_view; +} + +Web::WebViewHooks& Tab::hooks() +{ + if (m_type == Type::InProcessWebView) + return *m_page_view; + return *m_web_content_view;} } diff --git a/Applications/Browser/Tab.h b/Applications/Browser/Tab.h index ddf285675a..5bc0b1f2cd 100644 --- a/Applications/Browser/Tab.h +++ b/Applications/Browser/Tab.h @@ -32,15 +32,29 @@ #include <LibHTTP/HttpJob.h> #include <LibWeb/Forward.h> +class WebContentView; + +namespace Web { +class WebViewHooks; +} + namespace Browser { class Tab final : public GUI::Widget { C_OBJECT(Tab); public: + enum class Type { + InProcessWebView, + OutOfProcessWebView, + }; + virtual ~Tab() override; + URL url() const; + void load(const URL&); + void reload(); void did_become_active(); void context_menu_requested(const Gfx::IntPoint& screen_position); @@ -53,14 +67,22 @@ public: const String& title() const { return m_title; } const Gfx::Bitmap* icon() const { return m_icon; } + GUI::Widget& view(); + private: - Tab(); + explicit Tab(Type); + Web::WebViewHooks& hooks(); void update_actions(); void update_bookmark_button(const String& url); + Type m_type; + History<URL> m_history; + RefPtr<Web::PageView> m_page_view; + RefPtr<WebContentView> m_web_content_view; + RefPtr<GUI::Action> m_go_back_action; RefPtr<GUI::Action> m_go_forward_action; RefPtr<GUI::Action> m_reload_action; diff --git a/Applications/Browser/main.cpp b/Applications/Browser/main.cpp index 20f9e2a74d..945c7d7f6d 100644 --- a/Applications/Browser/main.cpp +++ b/Applications/Browser/main.cpp @@ -105,6 +105,11 @@ int main(int argc, char** argv) return 1; } + if (unveil("/tmp/portal/webcontent", "rw") < 0) { + perror("unveil"); + return 1; + } + unveil(nullptr, nullptr); auto m_config = Core::ConfigFile::get_for_app("Browser"); @@ -151,7 +156,8 @@ int main(int argc, char** argv) Function<void(URL url, bool activate)> create_new_tab; create_new_tab = [&](auto url, auto activate) { - auto& new_tab = tab_widget.add_tab<Browser::Tab>("New tab"); + auto type = Browser::Tab::Type::InProcessWebView; + auto& new_tab = tab_widget.add_tab<Browser::Tab>("New tab", type); tab_widget.set_bar_visible(!window->is_fullscreen() && tab_widget.children().size() > 1); tab_widget.set_tab_icon(new_tab, default_favicon); diff --git a/Libraries/LibWeb/PageView.cpp b/Libraries/LibWeb/PageView.cpp index 03bdaa70a8..2f2b34430f 100644 --- a/Libraries/LibWeb/PageView.cpp +++ b/Libraries/LibWeb/PageView.cpp @@ -368,9 +368,16 @@ void PageView::keydown_event(GUI::KeyEvent& event) event.accept(); } +URL PageView::url() const +{ + if (page().main_frame().document()) + return {}; + return page().main_frame().document()->url(); +} + void PageView::reload() { - load(page().main_frame().document()->url()); + load(url()); } void PageView::load_html(const StringView& html, const URL& url) diff --git a/Libraries/LibWeb/WebContentView.cpp b/Libraries/LibWeb/WebContentView.cpp index 67ceffecd8..f5851e50ac 100644 --- a/Libraries/LibWeb/WebContentView.cpp +++ b/Libraries/LibWeb/WebContentView.cpp @@ -43,6 +43,7 @@ WebContentView::~WebContentView() void WebContentView::load(const URL& url) { + m_url = url; client().post_message(Messages::WebContentServer::LoadURL(url)); } diff --git a/Libraries/LibWeb/WebContentView.h b/Libraries/LibWeb/WebContentView.h index b607909ab2..a96d5316ce 100644 --- a/Libraries/LibWeb/WebContentView.h +++ b/Libraries/LibWeb/WebContentView.h @@ -41,6 +41,7 @@ class WebContentView final public: virtual ~WebContentView() override; + URL url() const { return m_url; } void load(const URL&); void notify_server_did_layout(Badge<WebContentClient>, const Gfx::IntSize& content_size); @@ -71,6 +72,8 @@ private: WebContentClient& client(); + URL m_url; + RefPtr<WebContentClient> m_client; RefPtr<Gfx::Bitmap> m_front_bitmap; RefPtr<Gfx::Bitmap> m_back_bitmap; |