From 1e0d855fdf2cbf9689c0663326a86bec96cf6eb2 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 20 May 2021 22:00:31 +0200 Subject: [PATCH] TextEditor: Don't launch a WebContent process until it's needed The HTML and Markdown preview modes both use an OutOfProcessWebView to render the preview pane, and we were instantiating this view from GML. This caused us to always spawn a WebContent process alongside every TextEditor instance. Fix this by deferring the OOPWV construction until we actually need it. This makes launching TextEditor on a text file quite a bit faster. :^) --- .../Applications/TextEditor/MainWidget.cpp | 56 ++++++++++++------- Userland/Applications/TextEditor/MainWidget.h | 3 + .../TextEditor/TextEditorWindow.gml | 7 ++- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/Userland/Applications/TextEditor/MainWidget.cpp b/Userland/Applications/TextEditor/MainWidget.cpp index a893d511eb7..0f3cfe8068b 100644 --- a/Userland/Applications/TextEditor/MainWidget.cpp +++ b/Userland/Applications/TextEditor/MainWidget.cpp @@ -67,23 +67,6 @@ MainWidget::MainWidget() window()->set_modified(modified); }; - m_page_view = *find_descendant_of_type_named("webview"); - m_page_view->on_link_hover = [this](auto& url) { - if (url.is_valid()) - m_statusbar->set_text(url.to_string()); - else - update_statusbar(); - }; - m_page_view->on_link_click = [&](auto& url, auto&, unsigned) { - if (!Desktop::Launcher::open(url)) { - GUI::MessageBox::show( - window(), - String::formatted("The link to '{}' could not be opened.", url), - "Failed to open link", - GUI::MessageBox::Type::Error); - } - }; - m_find_replace_widget = *find_descendant_of_type_named("find_replace_widget"); m_find_widget = *find_descendant_of_type_named("find_widget"); m_replace_widget = *find_descendant_of_type_named("replace_widget"); @@ -347,6 +330,30 @@ MainWidget::~MainWidget() { } +Web::OutOfProcessWebView& MainWidget::ensure_web_view() +{ + if (!m_page_view) { + auto& web_view_container = *find_descendant_of_type_named("web_view_container"); + m_page_view = web_view_container.add(); + m_page_view->on_link_hover = [this](auto& url) { + if (url.is_valid()) + m_statusbar->set_text(url.to_string()); + else + update_statusbar(); + }; + m_page_view->on_link_click = [&](auto& url, auto&, unsigned) { + if (!Desktop::Launcher::open(url)) { + GUI::MessageBox::show( + window(), + String::formatted("The link to '{}' could not be opened.", url), + "Failed to open link", + GUI::MessageBox::Type::Error); + } + }; + } + return *m_page_view; +} + void MainWidget::initialize_menubar(GUI::Menubar& menubar) { auto& file_menu = menubar.add_menu("&File"); @@ -691,6 +698,15 @@ void MainWidget::drop_event(GUI::DropEvent& event) } } +void MainWidget::set_web_view_visible(bool visible) +{ + if (!visible && !m_page_view) + return; + ensure_web_view(); + auto& web_view_container = *find_descendant_of_type_named("web_view_container"); + web_view_container.set_visible(visible); +} + void MainWidget::set_preview_mode(PreviewMode mode) { if (m_preview_mode == mode) @@ -699,15 +715,15 @@ void MainWidget::set_preview_mode(PreviewMode mode) if (m_preview_mode == PreviewMode::HTML) { m_html_preview_action->set_checked(true); - m_page_view->set_visible(true); + set_web_view_visible(true); update_html_preview(); } else if (m_preview_mode == PreviewMode::Markdown) { m_markdown_preview_action->set_checked(true); - m_page_view->set_visible(true); + set_web_view_visible(true); update_markdown_preview(); } else { m_no_preview_action->set_checked(true); - m_page_view->set_visible(false); + set_web_view_visible(false); } } diff --git a/Userland/Applications/TextEditor/MainWidget.h b/Userland/Applications/TextEditor/MainWidget.h index 301cb84f804..bc26b57fe7a 100644 --- a/Userland/Applications/TextEditor/MainWidget.h +++ b/Userland/Applications/TextEditor/MainWidget.h @@ -48,6 +48,9 @@ private: void update_html_preview(); void update_statusbar(); + Web::OutOfProcessWebView& ensure_web_view(); + void set_web_view_visible(bool); + virtual void drop_event(GUI::DropEvent&) override; RefPtr m_editor; diff --git a/Userland/Applications/TextEditor/TextEditorWindow.gml b/Userland/Applications/TextEditor/TextEditorWindow.gml index 91c2db28d68..3d7b06f1beb 100644 --- a/Userland/Applications/TextEditor/TextEditorWindow.gml +++ b/Userland/Applications/TextEditor/TextEditorWindow.gml @@ -19,9 +19,12 @@ name: "editor" } - @Web::OutOfProcessWebView { - name: "webview" + @GUI::Widget { + name: "web_view_container" visible: false + + layout: @GUI::VerticalBoxLayout { + } } }