summaryrefslogtreecommitdiff
path: root/Applications/Browser
diff options
context:
space:
mode:
Diffstat (limited to 'Applications/Browser')
-rw-r--r--Applications/Browser/BookmarksBarWidget.cpp241
-rw-r--r--Applications/Browser/BookmarksBarWidget.h81
-rw-r--r--Applications/Browser/Browser.h35
-rw-r--r--Applications/Browser/BrowserConsoleClient.cpp130
-rw-r--r--Applications/Browser/BrowserConsoleClient.h60
-rw-r--r--Applications/Browser/BrowserWindow.gml15
-rw-r--r--Applications/Browser/CMakeLists.txt19
-rw-r--r--Applications/Browser/ConsoleWidget.cpp169
-rw-r--r--Applications/Browser/ConsoleWidget.h57
-rw-r--r--Applications/Browser/DownloadWidget.cpp182
-rw-r--r--Applications/Browser/DownloadWidget.h61
-rw-r--r--Applications/Browser/History.cpp73
-rw-r--r--Applications/Browser/History.h54
-rw-r--r--Applications/Browser/InspectorWidget.cpp94
-rw-r--r--Applications/Browser/InspectorWidget.h53
-rw-r--r--Applications/Browser/Tab.cpp550
-rw-r--r--Applications/Browser/Tab.gml22
-rw-r--r--Applications/Browser/Tab.h123
-rw-r--r--Applications/Browser/WindowActions.cpp82
-rw-r--r--Applications/Browser/WindowActions.h59
-rw-r--r--Applications/Browser/main.cpp254
21 files changed, 0 insertions, 2414 deletions
diff --git a/Applications/Browser/BookmarksBarWidget.cpp b/Applications/Browser/BookmarksBarWidget.cpp
deleted file mode 100644
index ef9af48a60..0000000000
--- a/Applications/Browser/BookmarksBarWidget.cpp
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright (c) 2020, Emanuel Sprung <emanuel.sprung@gmail.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "BookmarksBarWidget.h"
-#include <LibGUI/Action.h>
-#include <LibGUI/BoxLayout.h>
-#include <LibGUI/Button.h>
-#include <LibGUI/Event.h>
-#include <LibGUI/JsonArrayModel.h>
-#include <LibGUI/Menu.h>
-#include <LibGUI/Model.h>
-#include <LibGUI/Widget.h>
-#include <LibGUI/Window.h>
-#include <LibGfx/Palette.h>
-
-namespace Browser {
-
-static BookmarksBarWidget* s_the;
-
-BookmarksBarWidget& BookmarksBarWidget::the()
-{
- return *s_the;
-}
-
-BookmarksBarWidget::BookmarksBarWidget(const String& bookmarks_file, bool enabled)
-{
- s_the = this;
- set_layout<GUI::HorizontalBoxLayout>();
- layout()->set_spacing(0);
-
- set_fixed_height(20);
-
- if (!enabled)
- set_visible(false);
-
- m_additional = GUI::Button::construct();
- m_additional->set_button_style(Gfx::ButtonStyle::CoolBar);
- m_additional->set_text(">");
- m_additional->set_fixed_size(14, 20);
- m_additional->set_focus_policy(GUI::FocusPolicy::TabFocus);
- m_additional->on_click = [this](auto) {
- if (m_additional_menu) {
- m_additional_menu->popup(m_additional->relative_position().translated(relative_position().translated(m_additional->window()->position())));
- }
- };
-
- m_separator = GUI::Widget::construct();
-
- m_context_menu = GUI::Menu::construct();
- auto default_action = GUI::Action::create("Open", [this](auto&) {
- if (on_bookmark_click)
- on_bookmark_click(m_context_menu_url, Mod_None);
- });
- m_context_menu_default_action = default_action;
- m_context_menu->add_action(default_action);
- m_context_menu->add_action(GUI::Action::create("Open in new tab", [this](auto&) {
- if (on_bookmark_click)
- on_bookmark_click(m_context_menu_url, Mod_Ctrl);
- }));
- m_context_menu->add_action(GUI::Action::create("Delete", [this](auto&) {
- remove_bookmark(m_context_menu_url);
- }));
-
- Vector<GUI::JsonArrayModel::FieldSpec> fields;
- fields.empend("title", "Title", Gfx::TextAlignment::CenterLeft);
- fields.empend("url", "Url", Gfx::TextAlignment::CenterRight);
- set_model(GUI::JsonArrayModel::create(bookmarks_file, move(fields)));
- model()->update();
-}
-
-BookmarksBarWidget::~BookmarksBarWidget()
-{
- if (m_model)
- m_model->unregister_client(*this);
-}
-
-void BookmarksBarWidget::set_model(RefPtr<GUI::Model> model)
-{
- if (model == m_model)
- return;
- if (m_model)
- m_model->unregister_client(*this);
- m_model = move(model);
- m_model->register_client(*this);
-}
-
-void BookmarksBarWidget::resize_event(GUI::ResizeEvent& event)
-{
- Widget::resize_event(event);
- update_content_size();
-}
-
-void BookmarksBarWidget::model_did_update(unsigned)
-{
- remove_all_children();
-
- m_bookmarks.clear();
-
- int width = 0;
- for (int item_index = 0; item_index < model()->row_count(); ++item_index) {
-
- auto title = model()->index(item_index, 0).data().to_string();
- auto url = model()->index(item_index, 1).data().to_string();
-
- Gfx::IntRect rect { width, 0, font().width(title) + 32, height() };
-
- auto& button = add<GUI::Button>();
- m_bookmarks.append(button);
-
- button.set_button_style(Gfx::ButtonStyle::CoolBar);
- button.set_text(title);
- button.set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/filetype-html.png"));
- button.set_fixed_size(font().width(title) + 32, 20);
- button.set_relative_rect(rect);
- button.set_focus_policy(GUI::FocusPolicy::TabFocus);
- button.set_tooltip(url);
-
- button.on_click = [title, url, this](auto modifiers) {
- if (on_bookmark_click)
- on_bookmark_click(url, modifiers);
- };
-
- button.on_context_menu_request = [this, url](auto& context_menu_event) {
- m_context_menu_url = url;
- m_context_menu->popup(context_menu_event.screen_position(), m_context_menu_default_action);
- };
-
- width += rect.width();
- }
-
- add_child(*m_separator);
- add_child(*m_additional);
-
- update_content_size();
- update();
-}
-
-void BookmarksBarWidget::update_content_size()
-{
- int x_position = 0;
- m_last_visible_index = -1;
-
- for (size_t i = 0; i < m_bookmarks.size(); ++i) {
- auto& bookmark = m_bookmarks.at(i);
- if (x_position + bookmark.width() > width()) {
- m_last_visible_index = i;
- break;
- }
- bookmark.set_x(x_position);
- bookmark.set_visible(true);
- x_position += bookmark.width();
- }
-
- if (m_last_visible_index < 0) {
- m_additional->set_visible(false);
- } else {
- // hide all items > m_last_visible_index and create new bookmarks menu for them
- m_additional->set_visible(true);
- m_additional_menu = GUI::Menu::construct("Additional Bookmarks");
- for (size_t i = m_last_visible_index; i < m_bookmarks.size(); ++i) {
- auto& bookmark = m_bookmarks.at(i);
- bookmark.set_visible(false);
- m_additional_menu->add_action(GUI::Action::create(bookmark.text(),
- Gfx::Bitmap::load_from_file("/res/icons/16x16/filetype-html.png"),
- [&](auto&) {
- bookmark.on_click(0);
- }));
- }
- }
-}
-
-bool BookmarksBarWidget::contains_bookmark(const String& url)
-{
- for (int item_index = 0; item_index < model()->row_count(); ++item_index) {
-
- auto item_title = model()->index(item_index, 0).data().to_string();
- auto item_url = model()->index(item_index, 1).data().to_string();
- if (item_url == url) {
- return true;
- }
- }
- return false;
-}
-
-bool BookmarksBarWidget::remove_bookmark(const String& url)
-{
- for (int item_index = 0; item_index < model()->row_count(); ++item_index) {
-
- auto item_title = model()->index(item_index, 0).data().to_string();
- auto item_url = model()->index(item_index, 1).data().to_string();
- if (item_url == url) {
- auto& json_model = *static_cast<GUI::JsonArrayModel*>(model());
-
- const auto item_removed = json_model.remove(item_index);
- if (item_removed)
- json_model.store();
-
- return item_removed;
- }
- }
-
- return false;
-}
-bool BookmarksBarWidget::add_bookmark(const String& url, const String& title)
-{
- Vector<JsonValue> values;
- values.append(title);
- values.append(url);
-
- auto& json_model = *static_cast<GUI::JsonArrayModel*>(model());
- if (json_model.add(move(values))) {
- json_model.store();
- return true;
- }
- return false;
-}
-
-}
diff --git a/Applications/Browser/BookmarksBarWidget.h b/Applications/Browser/BookmarksBarWidget.h
deleted file mode 100644
index 2eeed8fec5..0000000000
--- a/Applications/Browser/BookmarksBarWidget.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2020, Emanuel Sprung <emanuel.sprung@gmail.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <LibGUI/Forward.h>
-#include <LibGUI/Model.h>
-#include <LibGUI/Widget.h>
-
-namespace Browser {
-
-class BookmarksBarWidget final
- : public GUI::Widget
- , private GUI::ModelClient {
- C_OBJECT(BookmarksBarWidget);
-
-public:
- static BookmarksBarWidget& the();
-
- virtual ~BookmarksBarWidget() override;
-
- void set_model(RefPtr<GUI::Model>);
- GUI::Model* model() { return m_model.ptr(); }
- const GUI::Model* model() const { return m_model.ptr(); }
-
- Function<void(const String& url, unsigned modifiers)> on_bookmark_click;
- Function<void(const String&, const String&)> on_bookmark_hover;
-
- bool contains_bookmark(const String& url);
- bool remove_bookmark(const String& url);
- bool add_bookmark(const String& url, const String& title);
-
-private:
- BookmarksBarWidget(const String&, bool enabled);
-
- // ^GUI::ModelClient
- virtual void model_did_update(unsigned) override;
-
- // ^GUI::Widget
- virtual void resize_event(GUI::ResizeEvent&) override;
-
- void update_content_size();
-
- RefPtr<GUI::Model> m_model;
- RefPtr<GUI::Button> m_additional;
- RefPtr<GUI::Widget> m_separator;
- RefPtr<GUI::Menu> m_additional_menu;
-
- RefPtr<GUI::Menu> m_context_menu;
- RefPtr<GUI::Action> m_context_menu_default_action;
- String m_context_menu_url;
-
- NonnullRefPtrVector<GUI::Button> m_bookmarks;
-
- int m_last_visible_index { -1 };
-};
-
-}
diff --git a/Applications/Browser/Browser.h b/Applications/Browser/Browser.h
deleted file mode 100644
index a4a4eefe1f..0000000000
--- a/Applications/Browser/Browser.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (c) 2020, the SerenityOS developers.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <AK/String.h>
-
-namespace Browser {
-
-extern String g_home_url;
-
-}
diff --git a/Applications/Browser/BrowserConsoleClient.cpp b/Applications/Browser/BrowserConsoleClient.cpp
deleted file mode 100644
index ce1dd7e5cb..0000000000
--- a/Applications/Browser/BrowserConsoleClient.cpp
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (c) 2020, Hunter Salyer <thefalsehonesty@gmail.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "BrowserConsoleClient.h"
-#include "ConsoleWidget.h"
-#include <AK/StringBuilder.h>
-#include <LibGUI/BoxLayout.h>
-#include <LibGUI/JSSyntaxHighlighter.h>
-#include <LibGUI/TextBox.h>
-#include <LibWeb/DOM/DocumentType.h>
-#include <LibWeb/DOM/ElementFactory.h>
-#include <LibWeb/DOM/Text.h>
-#include <LibWeb/DOMTreeModel.h>
-#include <LibWeb/HTML/HTMLBodyElement.h>
-
-namespace Browser {
-
-JS::Value BrowserConsoleClient::log()
-{
- m_console_widget.print_html(vm().join_arguments());
- return JS::js_undefined();
-}
-
-JS::Value BrowserConsoleClient::info()
-{
- StringBuilder html;
- html.append("<span class=\"info\">");
- html.append("(i) ");
- html.append(vm().join_arguments());
- html.append("</span>");
- m_console_widget.print_html(html.string_view());
- return JS::js_undefined();
-}
-
-JS::Value BrowserConsoleClient::debug()
-{
- StringBuilder html;
- html.append("<span class=\"debug\">");
- html.append("(d) ");
- html.append(vm().join_arguments());
- html.append("</span>");
- m_console_widget.print_html(html.string_view());
- return JS::js_undefined();
-}
-
-JS::Value BrowserConsoleClient::warn()
-{
- StringBuilder html;
- html.append("<span class=\"warn\">");
- html.append("(w) ");
- html.append(vm().join_arguments());
- html.append("</span>");
- m_console_widget.print_html(html.string_view());
- return JS::js_undefined();
-}
-
-JS::Value BrowserConsoleClient::error()
-{
- StringBuilder html;
- html.append("<span class=\"error\">");
- html.append("(e) ");
- html.append(vm().join_arguments());
- html.append("</span>");
- m_console_widget.print_html(html.string_view());
- return JS::js_undefined();
-}
-
-JS::Value BrowserConsoleClient::clear()
-{
- m_console_widget.clear_output();
- return JS::js_undefined();
-}
-
-JS::Value BrowserConsoleClient::trace()
-{
- StringBuilder html;
- html.append(vm().join_arguments());
- auto trace = get_trace();
- for (auto& function_name : trace) {
- if (function_name.is_empty())
- function_name = "&lt;anonymous&gt;";
- html.appendff(" -> {}<br>", function_name);
- }
- m_console_widget.print_html(html.string_view());
- return JS::js_undefined();
-}
-
-JS::Value BrowserConsoleClient::count()
-{
- auto label = vm().argument_count() ? vm().argument(0).to_string_without_side_effects() : "default";
- auto counter_value = m_console.counter_increment(label);
- m_console_widget.print_html(String::formatted("{}: {}", label, counter_value));
- return JS::js_undefined();
-}
-
-JS::Value BrowserConsoleClient::count_reset()
-{
- auto label = vm().argument_count() ? vm().argument(0).to_string_without_side_effects() : "default";
- if (m_console.counter_reset(label)) {
- m_console_widget.print_html(String::formatted("{}: 0", label));
- } else {
- m_console_widget.print_html(String::formatted("\"{}\" doesn't have a count", label));
- }
- return JS::js_undefined();
-}
-
-}
diff --git a/Applications/Browser/BrowserConsoleClient.h b/Applications/Browser/BrowserConsoleClient.h
deleted file mode 100644
index e87f6e32b0..0000000000
--- a/Applications/Browser/BrowserConsoleClient.h
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2020, Hunter Salyer <thefalsehonesty@gmail.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <LibGUI/Widget.h>
-#include <LibJS/Console.h>
-#include <LibJS/Forward.h>
-#include <LibWeb/InProcessWebView.h>
-
-namespace Browser {
-
-class ConsoleWidget;
-
-class BrowserConsoleClient final : public JS::ConsoleClient {
-public:
- BrowserConsoleClient(JS::Console& console, ConsoleWidget& console_widget)
- : ConsoleClient(console)
- , m_console_widget(console_widget)
- {
- }
-
-private:
- virtual JS::Value log() override;
- virtual JS::Value info() override;
- virtual JS::Value debug() override;
- virtual JS::Value warn() override;
- virtual JS::Value error() override;
- virtual JS::Value clear() override;
- virtual JS::Value trace() override;
- virtual JS::Value count() override;
- virtual JS::Value count_reset() override;
-
- ConsoleWidget& m_console_widget;
-};
-
-}
diff --git a/Applications/Browser/BrowserWindow.gml b/Applications/Browser/BrowserWindow.gml
deleted file mode 100644
index f6ec7ef1af..0000000000
--- a/Applications/Browser/BrowserWindow.gml
+++ /dev/null
@@ -1,15 +0,0 @@
-@GUI::Widget {
- name: "browser"
- fill_with_background_color: true
-
- layout: @GUI::VerticalBoxLayout {
- spacing: 2
- }
-
- @GUI::TabWidget {
- name: "tab_widget"
- container_padding: 0
- uniform_tabs: true
- text_alignment: "CenterLeft"
- }
-}
diff --git a/Applications/Browser/CMakeLists.txt b/Applications/Browser/CMakeLists.txt
deleted file mode 100644
index 4652ec8b11..0000000000
--- a/Applications/Browser/CMakeLists.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-compile_gml(BrowserWindow.gml BrowserWindowGML.h browser_window_gml)
-compile_gml(Tab.gml TabGML.h tab_gml)
-
-set(SOURCES
- BookmarksBarWidget.cpp
- BrowserConsoleClient.cpp
- ConsoleWidget.cpp
- DownloadWidget.cpp
- History.cpp
- InspectorWidget.cpp
- main.cpp
- Tab.cpp
- WindowActions.cpp
- BrowserWindowGML.h
- TabGML.h
-)
-
-serenity_app(Browser ICON app-browser)
-target_link_libraries(Browser LibWeb LibProtocol LibGUI LibDesktop)
diff --git a/Applications/Browser/ConsoleWidget.cpp b/Applications/Browser/ConsoleWidget.cpp
deleted file mode 100644
index 55c545dc55..0000000000
--- a/Applications/Browser/ConsoleWidget.cpp
+++ /dev/null
@@ -1,169 +0,0 @@
-/*
- * Copyright (c) 2020, Hunter Salyer <thefalsehonesty@gmail.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ConsoleWidget.h"
-#include <AK/StringBuilder.h>
-#include <LibGUI/BoxLayout.h>
-#include <LibGUI/Button.h>
-#include <LibGUI/JSSyntaxHighlighter.h>
-#include <LibGUI/TextBox.h>
-#include <LibGfx/FontDatabase.h>
-#include <LibJS/Interpreter.h>
-#include <LibJS/MarkupGenerator.h>
-#include <LibJS/Parser.h>
-#include <LibJS/Runtime/Error.h>
-#include <LibWeb/DOM/DocumentType.h>
-#include <LibWeb/DOM/ElementFactory.h>
-#include <LibWeb/DOM/Text.h>
-#include <LibWeb/DOMTreeModel.h>
-#include <LibWeb/HTML/HTMLBodyElement.h>
-
-namespace Browser {
-
-ConsoleWidget::ConsoleWidget()
-{
- set_layout<GUI::VerticalBoxLayout>();
- set_fill_with_background_color(true);
-
- auto base_document = Web::DOM::Document::create();
- base_document->append_child(adopt(*new Web::DOM::DocumentType(base_document)));
- auto html_element = base_document->create_element("html");
- base_document->append_child(html_element);
- auto head_element = base_document->create_element("head");
- html_element->append_child(head_element);
- auto body_element = base_document->create_element("body");
- html_element->append_child(body_element);
- m_output_container = body_element;
-
- m_output_view = add<Web::InProcessWebView>();
- m_output_view->set_document(base_document);
-
- auto& bottom_container = add<GUI::Widget>();
- bottom_container.set_layout<GUI::HorizontalBoxLayout>();
- bottom_container.set_fixed_height(22);
-
- m_input = bottom_container.add<GUI::TextBox>();
- m_input->set_syntax_highlighter(make<GUI::JSSyntaxHighlighter>());
- // FIXME: Syntax Highlighting breaks the cursor's position on non fixed-width fonts.
- m_input->set_font(Gfx::FontDatabase::default_fixed_width_font());
- m_input->set_history_enabled(true);
-
- m_input->on_return_pressed = [this] {
- auto js_source = m_input->text();
-
- // FIXME: An is_blank check to check if there is only whitespace would probably be preferable.
- if (js_source.is_empty())
- return;
-
- m_input->add_current_text_to_history();
- m_input->clear();
-
- print_source_line(js_source);
-
- auto parser = JS::Parser(JS::Lexer(js_source));
- auto program = parser.parse_program();
-
- StringBuilder output_html;
- if (parser.has_errors()) {
- auto error = parser.errors()[0];
- auto hint = error.source_location_hint(js_source);
- if (!hint.is_empty())
- output_html.append(String::formatted("<pre>{}</pre>", escape_html_entities(hint)));
- m_interpreter->vm().throw_exception<JS::SyntaxError>(m_interpreter->global_object(), error.to_string());
- } else {
- m_interpreter->run(m_interpreter->global_object(), *program);
- }
-
- if (m_interpreter->exception()) {
- output_html.append("Uncaught exception: ");
- output_html.append(JS::MarkupGenerator::html_from_value(m_interpreter->exception()->value()));
- print_html(output_html.string_view());
-
- m_interpreter->vm().clear_exception();
- return;
- }
-
- print_html(JS::MarkupGenerator::html_from_value(m_interpreter->vm().last_value()));
- };
-
- set_focus_proxy(m_input);
-
- auto& clear_button = bottom_container.add<GUI::Button>();
- clear_button.set_fixed_size(22, 22);
- clear_button.set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/delete.png"));
- clear_button.set_tooltip("Clear the console output");
- clear_button.on_click = [this](auto) {
- clear_output();
- };
-}
-
-ConsoleWidget::~ConsoleWidget()
-{
-}
-
-void ConsoleWidget::set_interpreter(WeakPtr<JS::Interpreter> interpreter)
-{
- if (m_interpreter.ptr() == interpreter.ptr())
- return;
-
- m_interpreter = interpreter;
- m_console_client = make<BrowserConsoleClient>(interpreter->global_object().console(), *this);
- interpreter->global_object().console().set_client(*m_console_client.ptr());
-
- clear_output();
-}
-
-void ConsoleWidget::print_source_line(const StringView& source)
-{
- StringBuilder html;
- html.append("<span class=\"repl-indicator\">");
- html.append("&gt; ");
- html.append("</span>");
-
- html.append(JS::MarkupGenerator::html_from_source(source));
-
- print_html(html.string_view());
-}
-
-void ConsoleWidget::print_html(const StringView& line)
-{
- auto paragraph = m_output_container->document().create_element("p");
- paragraph->set_inner_html(line);
-
- m_output_container->append_child(paragraph);
- m_output_container->document().invalidate_layout();
- m_output_container->document().update_layout();
-
- m_output_view->scroll_to_bottom();
-}
-
-void ConsoleWidget::clear_output()
-{
- m_output_container->remove_all_children();
- m_output_view->update();
-}
-
-}
diff --git a/Applications/Browser/ConsoleWidget.h b/Applications/Browser/ConsoleWidget.h
deleted file mode 100644
index 813ceed2ed..0000000000
--- a/Applications/Browser/ConsoleWidget.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2020, Hunter Salyer <thefalsehonesty@gmail.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "BrowserConsoleClient.h"
-#include "History.h"
-#include <LibGUI/Widget.h>
-#include <LibJS/Forward.h>
-#include <LibWeb/InProcessWebView.h>
-
-namespace Browser {
-
-class ConsoleWidget final : public GUI::Widget {
- C_OBJECT(ConsoleWidget)
-public:
- virtual ~ConsoleWidget();
-
- void set_interpreter(WeakPtr<JS::Interpreter>);
- void print_source_line(const StringView&);
- void print_html(const StringView&);
- void clear_output();
-
-private:
- ConsoleWidget();
-
- RefPtr<GUI::TextBox> m_input;
- RefPtr<Web::InProcessWebView> m_output_view;
- RefPtr<Web::DOM::Element> m_output_container;
- WeakPtr<JS::Interpreter> m_interpreter;
- OwnPtr<BrowserConsoleClient> m_console_client;
-};
-
-}
diff --git a/Applications/Browser/DownloadWidget.cpp b/Applications/Browser/DownloadWidget.cpp
deleted file mode 100644
index 39d931e216..0000000000
--- a/Applications/Browser/DownloadWidget.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "DownloadWidget.h"
-#include <AK/NumberFormat.h>
-#include <AK/SharedBuffer.h>
-#include <AK/StringBuilder.h>
-#include <LibCore/File.h>
-#include <LibCore/FileStream.h>
-#include <LibCore/StandardPaths.h>
-#include <LibDesktop/Launcher.h>
-#include <LibGUI/BoxLayout.h>
-#include <LibGUI/Button.h>
-#include <LibGUI/ImageWidget.h>
-#include <LibGUI/Label.h>
-#include <LibGUI/MessageBox.h>
-#include <LibGUI/ProgressBar.h>
-#include <LibGUI/Window.h>
-#include <LibProtocol/Client.h>
-#include <LibWeb/Loader/ResourceLoader.h>
-#include <math.h>
-
-namespace Browser {
-
-DownloadWidget::DownloadWidget(const URL& url)
- : m_url(url)
-{
- {
- StringBuilder builder;
- builder.append(Core::StandardPaths::downloads_directory());
- builder.append('/');
- builder.append(m_url.basename());
- m_destination_path = builder.to_string();
- }
-
- m_elapsed_timer.start();
- m_download = Web::ResourceLoader::the().protocol_client().start_download("GET", url.to_string());
- ASSERT(m_download);
- m_download->on_progress = [this](Optional<u32> total_size, u32 downloaded_size) {
- did_progress(total_size.value(), downloaded_size);
- };
-
- {
- auto file_or_error = Core::File::open(m_destination_path, Core::IODevice::WriteOnly);
- if (file_or_error.is_error()) {
- GUI::MessageBox::show(window(), String::formatted("Cannot open {} for writing", m_destination_path), "Download failed", GUI::MessageBox::Type::Error);
- window()->close();
- return;
- }
- m_output_file_stream = make<Core::OutputFileStream>(*file_or_error.value());
- }
-
- m_download->on_finish = [this](bool success, auto) { did_finish(success); };
- m_download->stream_into(*m_output_file_stream);
-
- set_fill_with_background_color(true);
- auto& layout = set_layout<GUI::VerticalBoxLayout>();
- layout.set_margins({ 4, 4, 4, 4 });
-
- auto& animation_container = add<GUI::Widget>();
- animation_container.set_fixed_height(32);
- auto& animation_layout = animation_container.set_layout<GUI::HorizontalBoxLayout>();
-
- auto& browser_image = animation_container.add<GUI::ImageWidget>();
- browser_image.load_from_file("/res/graphics/download-animation.gif");
- animation_layout.add_spacer();
-
- auto& source_label = add<GUI::Label>(String::formatted("From: {}", url));
- source_label.set_text_alignment(Gfx::TextAlignment::CenterLeft);
- source_label.set_fixed_height(16);
-
- m_progress_bar = add<GUI::ProgressBar>();
- m_progress_bar->set_fixed_height(20);
-
- m_progress_label = add<GUI::Label>();
- m_progress_label->set_text_alignment(Gfx::TextAlignment::CenterLeft);
- m_progress_label->set_fixed_height(16);
-
- auto& destination_label = add<GUI::Label>(String::formatted("To: {}", m_destination_path));
- destination_label.set_text_alignment(Gfx::TextAlignment::CenterLeft);
- destination_label.set_fixed_height(16);
-
- auto& button_container = add<GUI::Widget>();
- auto& button_container_layout = button_container.set_layout<GUI::HorizontalBoxLayout>();
- button_container_layout.add_spacer();
- m_cancel_button = button_container.add<GUI::Button>("Cancel");
- m_cancel_button->set_fixed_size(100, 22);
- m_cancel_button->on_click = [this](auto) {
- bool success = m_download->stop();
- ASSERT(success);
- window()->close();
- };
-
- m_close_button = button_container.add<GUI::Button>("OK");
- m_close_button->set_enabled(false);
- m_close_button->set_fixed_size(100, 22);
- m_close_button->on_click = [this](auto) {
- window()->close();
- };
-}
-
-DownloadWidget::~DownloadWidget()
-{
-}
-
-void DownloadWidget::did_progress(Optional<u32> total_size, u32 downloaded_size)
-{
- m_progress_bar->set_min(0);
- if (total_size.has_value()) {
- int percent = roundf(((float)downloaded_size / (float)total_size.value()) * 100.0f);
- window()->set_progress(percent);
- m_progress_bar->set_max(total_size.value());
- } else {
- m_progress_bar->set_max(0);
- }
- m_progress_bar->set_value(downloaded_size);
-
- {
- StringBuilder builder;
- builder.append("Downloaded ");
- builder.append(human_readable_size(downloaded_size));
- builder.appendff(" in {} sec", m_elapsed_timer.elapsed() / 1000);
- m_progress_label->set_text(builder.to_string());
- }
-
- {
- StringBuilder builder;
- if (total_size.has_value()) {
- int percent = roundf(((float)downloaded_size / (float)total_size.value()) * 100);
- builder.appendff("{}%", percent);
- } else {
- builder.append(human_readable_size(downloaded_size));
- }
- builder.append(" of ");
- builder.append(m_url.basename());
- window()->set_title(builder.to_string());
- }
-}
-
-void DownloadWidget::did_finish(bool success)
-{
- dbgln("did_finish, success={}", success);
-
- m_close_button->set_enabled(true);
- m_cancel_button->set_text("Open in Folder");
- m_cancel_button->on_click = [this](auto) {
- Desktop::Launcher::open(URL::create_with_file_protocol(Core::StandardPaths::downloads_directory()));
- window()->close();
- };
- m_cancel_button->update();
-
- if (!success) {
- GUI::MessageBox::show(window(), String::formatted("Download failed for some reason"), "Download failed", GUI::MessageBox::Type::Error);
- window()->close();
- return;
- }
-}
-
-}
diff --git a/Applications/Browser/DownloadWidget.h b/Applications/Browser/DownloadWidget.h
deleted file mode 100644
index 44fc21c60d..0000000000
--- a/Applications/Browser/DownloadWidget.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <AK/URL.h>
-#include <LibCore/ElapsedTimer.h>
-#include <LibCore/FileStream.h>
-#include <LibGUI/ProgressBar.h>
-#include <LibGUI/Widget.h>
-#include <LibProtocol/Download.h>
-
-namespace Browser {
-
-class DownloadWidget final : public GUI::Widget {
- C_OBJECT(DownloadWidget);
-
-public:
- virtual ~DownloadWidget() override;
-
-private:
- explicit DownloadWidget(const URL&);
-
- void did_progress(Optional<u32> total_size, u32 downloaded_size);
- void did_finish(bool success);
-
- URL m_url;
- String m_destination_path;
- RefPtr<Protocol::Download> m_download;
- RefPtr<GUI::ProgressBar> m_progress_bar;
- RefPtr<GUI::Label> m_progress_label;
- RefPtr<GUI::Button> m_cancel_button;
- RefPtr<GUI::Button> m_close_button;
- OwnPtr<Core::OutputFileStream> m_output_file_stream;
- Core::ElapsedTimer m_elapsed_timer;
-};
-
-}
diff --git a/Applications/Browser/History.cpp b/Applications/Browser/History.cpp
deleted file mode 100644
index cecf28477c..0000000000
--- a/Applications/Browser/History.cpp
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "History.h"
-
-namespace Browser {
-
-void History::dump() const
-{
- dbgln("Dump {} items(s)", m_items.size());
- int i = 0;
- for (auto& item : m_items) {
- dbgln("[{}] {} {}", i, item, m_current == i ? '*' : ' ');
- ++i;
- }
-}
-
-void History::push(const URL& url)
-{
- m_items.shrink(m_current + 1);
- m_items.append(url);
- m_current++;
-}
-
-URL History::current() const
-{
- if (m_current == -1)
- return {};
- return m_items[m_current];
-}
-
-void History::go_back()
-{
- ASSERT(can_go_back());
- m_current--;
-}
-
-void History::go_forward()
-{
- ASSERT(can_go_forward());
- m_current++;
-}
-
-void History::clear()
-{
- m_items = {};
- m_current = -1;
-}
-
-}
diff --git a/Applications/Browser/History.h b/Applications/Browser/History.h
deleted file mode 100644
index 84fc4151d7..0000000000
--- a/Applications/Browser/History.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <AK/URL.h>
-#include <AK/Vector.h>
-
-namespace Browser {
-
-class History {
-public:
- void dump() const;
-
- void push(const URL&);
- URL current() const;
-
- void go_back();
- void go_forward();
-
- bool can_go_back() { return m_current > 0; }
- bool can_go_forward() { return m_current + 1 < static_cast<int>(m_items.size()); }
-
- void clear();
-
-private:
- Vector<URL> m_items;
- int m_current { -1 };
-};
-
-}
diff --git a/Applications/Browser/InspectorWidget.cpp b/Applications/Browser/InspectorWidget.cpp
deleted file mode 100644
index 7e9111e513..0000000000
--- a/Applications/Browser/InspectorWidget.cpp
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "InspectorWidget.h"
-#include <LibGUI/BoxLayout.h>
-#include <LibGUI/Splitter.h>
-#include <LibGUI/TabWidget.h>
-#include <LibGUI/TableView.h>
-#include <LibGUI/TreeView.h>
-#include <LibWeb/DOM/Document.h>
-#include <LibWeb/DOM/Element.h>
-#include <LibWeb/DOMTreeModel.h>
-#include <LibWeb/LayoutTreeModel.h>
-#include <LibWeb/StylePropertiesModel.h>
-
-namespace Browser {
-
-void InspectorWidget::set_inspected_node(Web::DOM::Node* node)
-{
- m_document->set_inspected_node(node);
- if (node && node->is_element()) {
- auto& element = downcast<Web::DOM::Element>(*node);
- if (element.specified_css_values()) {
- m_style_table_view->set_model(Web::StylePropertiesModel::create(*element.specified_css_values()));
- m_computed_style_table_view->set_model(Web::StylePropertiesModel::create(*element.computed_style()));
- }
- } else {
- m_style_table_view->set_model(nullptr);
- m_computed_style_table_view->set_model(nullptr);
- }
-}
-
-InspectorWidget::InspectorWidget()
-{
- set_layout<GUI::VerticalBoxLayout>();
- auto& splitter = add<GUI::VerticalSplitter>();
-
- auto& top_tab_widget = splitter.add<GUI::TabWidget>();
-
- m_dom_tree_view = top_tab_widget.add_tab<GUI::TreeView>("DOM");
- m_dom_tree_view->on_selection = [this](auto& index) {
- auto* node = static_cast<Web::DOM::Node*>(index.internal_data());
- set_inspected_node(node);
- };
-
- m_layout_tree_view = top_tab_widget.add_tab<GUI::TreeView>("Layout");
- m_layout_tree_view->on_selection = [this](auto& index) {
- auto* node = static_cast<Web::Layout::Node*>(index.internal_data());
- set_inspected_node(node->dom_node());
- };
-
- auto& bottom_tab_widget = splitter.add<GUI::TabWidget>();
-
- m_style_table_view = bottom_tab_widget.add_tab<GUI::TableView>("Styles");
- m_computed_style_table_view = bottom_tab_widget.add_tab<GUI::TableView>("Computed");
-}
-
-InspectorWidget::~InspectorWidget()
-{
-}
-
-void InspectorWidget::set_document(Web::DOM::Document* document)
-{
- if (m_document == document)
- return;
- m_document = document;
- m_dom_tree_view->set_model(Web::DOMTreeModel::create(*document));
- m_layout_tree_view->set_model(Web::LayoutTreeModel::create(*document));
-}
-
-}
diff --git a/Applications/Browser/InspectorWidget.h b/Applications/Browser/InspectorWidget.h
deleted file mode 100644
index 37f0f95754..0000000000
--- a/Applications/Browser/InspectorWidget.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <LibGUI/Widget.h>
-#include <LibWeb/Forward.h>
-
-namespace Browser {
-
-class InspectorWidget final : public GUI::Widget {
- C_OBJECT(InspectorWidget)
-public:
- virtual ~InspectorWidget();
-
- void set_document(Web::DOM::Document*);
-
-private:
- InspectorWidget();
-
- void set_inspected_node(Web::DOM::Node*);
-
- RefPtr<GUI::TreeView> m_dom_tree_view;
- RefPtr<GUI::TreeView> m_layout_tree_view;
- RefPtr<GUI::TableView> m_style_table_view;
- RefPtr<GUI::TableView> m_computed_style_table_view;
- RefPtr<Web::DOM::Document> m_document;
-};
-
-}
diff --git a/Applications/Browser/Tab.cpp b/Applications/Browser/Tab.cpp
deleted file mode 100644
index ea23d61d73..0000000000
--- a/Applications/Browser/Tab.cpp
+++ /dev/null
@@ -1,550 +0,0 @@
-/*
- * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "Tab.h"
-#include "BookmarksBarWidget.h"
-#include "Browser.h"
-#include "ConsoleWidget.h"
-#include "DownloadWidget.h"
-#include "InspectorWidget.h"
-#include "WindowActions.h"
-#include <AK/StringBuilder.h>
-#include <Applications/Browser/TabGML.h>
-#include <LibGUI/Action.h>
-#include <LibGUI/Application.h>
-#include <LibGUI/BoxLayout.h>
-#include <LibGUI/Button.h>
-#include <LibGUI/Clipboard.h>
-#include <LibGUI/Menu.h>
-#include <LibGUI/MenuBar.h>
-#include <LibGUI/StatusBar.h>
-#include <LibGUI/TabWidget.h>
-#include <LibGUI/TextBox.h>
-#include <LibGUI/ToolBar.h>
-#include <LibGUI/ToolBarContainer.h>
-#include <LibGUI/Window.h>
-#include <LibJS/Interpreter.h>
-#include <LibWeb/CSS/Parser/CSSParser.h>
-#include <LibWeb/DOM/Element.h>
-#include <LibWeb/DOMTreeModel.h>
-#include <LibWeb/Dump.h>
-#include <LibWeb/InProcessWebView.h>
-#include <LibWeb/Layout/BlockBox.h>
-#include <LibWeb/Layout/InitialContainingBlockBox.h>
-#include <LibWeb/Layout/InlineNode.h>
-#include <LibWeb/Layout/Node.h>
-#include <LibWeb/Loader/ResourceLoader.h>
-#include <LibWeb/OutOfProcessWebView.h>
-#include <LibWeb/Page/Frame.h>
-
-namespace Browser {
-
-URL url_from_user_input(const String& input)
-{
- auto url = URL(input);
- if (url.is_valid())
- return url;
-
- StringBuilder builder;
- builder.append("http://");
- builder.append(input);
- return URL(builder.build());
-}
-
-static void start_download(const URL& url)
-{
- auto window = GUI::Window::construct();
- window->resize(300, 150);
- window->set_title(String::formatted("0% of {}", url.basename()));
- window->set_resizable(false);
- window->set_main_widget<DownloadWidget>(url);
- window->show();
- [[maybe_unused]] auto& unused = window.leak_ref();
-}
-
-Tab::Tab(Type type)
- : m_type(type)
-{
- load_from_gml(tab_gml);
-
- m_toolbar_container = *find_descendant_of_type_named<GUI::ToolBarContainer>("toolbar_container");
- auto& toolbar = *find_descendant_of_type_named<GUI::ToolBar>("toolbar");
-
- auto& webview_container = *find_descendant_of_type_named<GUI::Widget>("webview_container");
-
- if (m_type == Type::InProcessWebView)
- m_page_view = webview_container.add<Web::InProcessWebView>();
- else
- m_web_content_view = webview_container.add<Web::OutOfProcessWebView>();
-
- m_go_back_action = GUI::CommonActions::make_go_back_action([this](auto&) { go_back(); }, this);
- m_go_forward_action = GUI::CommonActions::make_go_forward_action([this](auto&) { go_forward(); }, this);
-
- toolbar.add_action(*m_go_back_action);
- toolbar.add_action(*m_go_forward_action);
-
- toolbar.add_action(GUI::CommonActions::make_go_home_action([this](auto&) { load(g_home_url); }, this));
- m_reload_action = GUI::CommonActions::make_reload_action([this](auto&) { reload(); }, this);
-
- toolbar.add_action(*m_reload_action);
-
- m_location_box = toolbar.add<GUI::TextBox>();
- m_location_box->set_placeholder("Address");
-
- m_location_box->on_return_pressed = [this] {
- auto url = url_from_user_input(m_location_box->text());
- load(url);
- view().set_focus(true);
- };
-
- m_location_box->add_custom_context_menu_action(GUI::Action::create("Paste & Go", [this](auto&) {
- m_location_box->set_text(GUI::Clipboard::the().data());
- m_location_box->on_return_pressed();
- }));
-
- m_bookmark_button = toolbar.add<GUI::Button>();
- m_bookmark_button->set_button_style(Gfx::ButtonStyle::CoolBar);
- m_bookmark_button->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/bookmark-contour.png"));
- m_bookmark_button->set_fixed_size(22, 22);
-
- m_bookmark_button->on_click = [this](auto) {
- auto url = this->url().to_string();
- if (BookmarksBarWidget::the().contains_bookmark(url)) {
- BookmarksBarWidget::the().remove_bookmark(url);
- } else {
- BookmarksBarWidget::the().add_bookmark(url, m_title);
- }
- update_bookmark_button(url);
- };
-
- hooks().on_load_start = [this](auto& url) {
- m_location_box->set_icon(nullptr);
- m_location_box->set_text(url.to_string());
-
- // don't add to history if back or forward is pressed
- if (!m_is_history_navigation)
- m_history.push(url);
- m_is_history_navigation = false;
-
- update_actions();
- update_bookmark_button(url.to_string());
- };
-
- hooks().on_link_click = [this](auto& url, auto& target, unsigned modifiers) {
- if (target == "_blank" || modifiers == Mod_Ctrl) {
- on_tab_open_request(url);
- } else {
- load(url);
- }
- };
-
- m_link_context_menu = GUI::Menu::construct();
- auto link_default_action = GUI::Action::create("Open", [this](auto&) {
- hooks().on_link_click(m_link_context_menu_url, "", 0);
- });
- m_link_context_menu->add_action(link_default_action);
- m_link_context_menu_default_action = link_default_action;
- m_link_context_menu->add_action(GUI::Action::create("Open in new tab", [this](auto&) {
- hooks().on_link_click(m_link_context_menu_url, "_blank", 0);
- }));
- m_link_context_menu->add_separator();
- m_link_context_menu->add_action(GUI::Action::create("Copy link", [this](auto&) {
- GUI::Clipboard::the().set_plain_text(m_link_context_menu_url.to_string());
- }));
- m_link_context_menu->add_separator();
- m_link_context_menu->add_action(GUI::Action::create("Download", [this](auto&) {
- start_download(m_link_context_menu_url);
- }));
-
- 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, m_link_context_menu_default_action);
- };
-
- m_image_context_menu = GUI::Menu::construct();
- m_image_context_menu->add_action(GUI::Action::create("Open image", [this](auto&) {
- hooks().on_link_click(m_image_context_menu_url, "", 0);
- }));
- m_image_context_menu->add_action(GUI::Action::create("Open image in new tab", [this](auto&) {
- hooks().on_link_click(m_image_context_menu_url, "_blank", 0);
- }));
- m_image_context_menu->add_separator();
- m_image_context_menu->add_action(GUI::Action::create("Copy image", [this](auto&) {
- if (m_image_context_menu_bitmap.is_valid())
- GUI::Clipboard::the().set_bitmap(*m_image_context_menu_bitmap.bitmap());
- }));
- m_image_context_menu->add_action(GUI::Action::create("Copy image URL", [this](auto&) {
- GUI::Clipboard::the().set_plain_text(m_image_context_menu_url.to_string());
- }));
- m_image_context_menu->add_separator();
- m_image_context_menu->add_action(GUI::Action::create("Download", [this](auto&) {
- start_download(m_image_context_menu_url);
- }));
-
- hooks().on_image_context_menu_request = [this](auto& image_url, auto& screen_position, const Gfx::ShareableBitmap& shareable_bitmap) {
- m_image_context_menu_url = image_url;
- m_image_context_menu_bitmap = shareable_bitmap;
- m_image_context_menu->popup(screen_position);
- };
-
- hooks().on_link_middle_click = [this](auto& href, auto&, auto) {
- hooks().on_link_click(href, "_blank", 0);
- };
-
- hooks().on_title_change = [this](auto& title) {
- if (title.is_null()) {
- m_title = url().to_string();
- } else {
- m_title = title;
- }
- if (on_title_change)
- on_title_change(m_title);
- };
-
- hooks().on_favicon_change = [this](auto& icon) {
- m_icon = icon;
- m_location_box->set_icon(&icon);
- if (on_favicon_change)
- on_favicon_change(icon);
- };
-
- // 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&) {
- m_location_box->select_all();
- m_location_box->set_focus(true);
- },
- this);
-
- m_statusbar = *find_descendant_of_type_named<GUI::StatusBar>("statusbar");
-
- hooks().on_link_hover = [this](auto& url) {
- if (url.is_valid())
- m_statusbar->set_text(url.to_string());
- else
- m_statusbar->set_text("");
- };
-
- hooks().on_url_drop = [this](auto& url) {
- load(url);
- };
-
- m_menubar = GUI::MenuBar::construct();
-
- auto& app_menu = m_menubar->add_menu("Browser");
- app_menu.add_action(WindowActions::the().create_new_tab_action());
- app_menu.add_action(GUI::Action::create(
- "Close tab", { Mod_Ctrl, Key_W }, Gfx::Bitmap::load_from_file("/res/icons/16x16/close-tab.png"), [this](auto&) {
- on_tab_close_request(*this);
- },
- this));
-
- app_menu.add_action(*m_reload_action);
- app_menu.add_separator();
- app_menu.add_action(GUI::CommonActions::make_quit_action([](auto&) {
- GUI::Application::the()->quit();
- }));
-
- auto& view_menu = m_menubar->add_menu("View");
- view_menu.add_action(GUI::CommonActions::make_fullscreen_action(
- [this](auto&) {
- window()->set_fullscreen(!window()->is_fullscreen());
-
- auto is_fullscreen = window()->is_fullscreen();
- auto* tab_widget = static_cast<GUI::TabWidget*>(parent_widget());
- tab_widget->set_bar_visible(!is_fullscreen && tab_widget->children().size() > 1);
- m_toolbar_container->set_visible(!is_fullscreen);
- m_statusbar->set_visible(!is_fullscreen);
- },
- this));
-
- auto view_source_action = GUI::Action::create(
- "View source", { Mod_Ctrl, Key_U }, [this](auto&) {
- 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_mode(GUI::TextEditor::ReadOnly);
- editor.set_ruler_visible(true);
- window->resize(640, 480);
- window->set_title(url);
- window->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/filetype-text.png"));
- window->show();
- [[maybe_unused]] auto& unused = 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_type == Type::InProcessWebView) {
- if (!m_dom_inspector_window) {
- m_dom_inspector_window = GUI::Window::construct();
- m_dom_inspector_window->resize(300, 500);
- m_dom_inspector_window->set_title("DOM inspector");
- m_dom_inspector_window->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/inspector-object.png"));
- 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();
- }
- },
- this);
-
- auto& inspect_menu = m_menubar->add_menu("Inspect");
- inspect_menu.add_action(*view_source_action);
- inspect_menu.add_action(*inspect_dom_tree_action);
-
- inspect_menu.add_action(GUI::Action::create(
- "Open JS Console", { Mod_Ctrl, Key_I }, [this](auto&) {
- if (m_type == Type::InProcessWebView) {
- if (!m_console_window) {
- m_console_window = GUI::Window::construct();
- m_console_window->resize(500, 300);
- m_console_window->set_title("JS Console");
- m_console_window->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/filetype-javascript.png"));
- 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();
- }
- },
- this));
-
- auto& debug_menu = m_menubar->add_menu("Debug");
- debug_menu.add_action(GUI::Action::create(
- "Dump DOM tree", [this](auto&) {
- 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&) {
- 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&) {
- if (m_type == Type::InProcessWebView) {
- for (auto& sheet : m_page_view->document()->style_sheets().sheets()) {
- Web::dump_sheet(sheet);
- }
- } else {
- TODO();
- }
- },
- this));
- debug_menu.add_action(GUI::Action::create("Dump history", { Mod_Ctrl, Key_H }, [&](auto&) {
- m_history.dump();
- }));
- debug_menu.add_separator();
- auto line_box_borders_action = GUI::Action::create_checkable(
- "Line box borders", [this](auto& action) {
- 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);
- debug_menu.add_action(line_box_borders_action);
-
- debug_menu.add_separator();
- debug_menu.add_action(GUI::Action::create("Collect garbage", { Mod_Ctrl | Mod_Shift, Key_G }, [this](auto&) {
- if (m_type == Type::InProcessWebView) {
- if (auto* document = m_page_view->document()) {
- document->interpreter().heap().collect_garbage(JS::Heap::CollectionType::CollectGarbage, true);
- }
- } else {
- TODO();
- }
- }));
-
- auto& bookmarks_menu = m_menubar->add_menu("Bookmarks");
- bookmarks_menu.add_action(WindowActions::the().show_bookmarks_bar_action());
-
- auto& help_menu = m_menubar->add_menu("Help");
- help_menu.add_action(WindowActions::the().about_action());
-
- m_tab_context_menu = GUI::Menu::construct();
- m_tab_context_menu->add_action(GUI::Action::create("Reload Tab", [this](auto&) {
- m_reload_action->activate();
- }));
- m_tab_context_menu->add_action(GUI::Action::create("Close Tab", [this](auto&) {
- on_tab_close_request(*this);
- }));
-
- m_page_context_menu = GUI::Menu::construct();
- m_page_context_menu->add_action(*m_go_back_action);
- m_page_context_menu->add_action(*m_go_forward_action);
- m_page_context_menu->add_action(*m_reload_action);
- 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);
- hooks().on_context_menu_request = [&](auto& screen_position) {
- m_page_context_menu->popup(screen_position);
- };
-}
-
-Tab::~Tab()
-{
-}
-
-void Tab::load(const URL& url, LoadType load_type)
-{
- m_is_history_navigation = (load_type == LoadType::HistoryNavigation);
-
- 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::go_back()
-{
- m_history.go_back();
- update_actions();
- load(m_history.current(), LoadType::HistoryNavigation);
-}
-
-void Tab::go_forward()
-{
- m_history.go_forward();
- update_actions();
- load(m_history.current(), LoadType::HistoryNavigation);
-}
-
-void Tab::update_actions()
-{
- m_go_back_action->set_enabled(m_history.can_go_back());
- m_go_forward_action->set_enabled(m_history.can_go_forward());
-}
-
-void Tab::update_bookmark_button(const String& url)
-{
- if (BookmarksBarWidget::the().contains_bookmark(url)) {
- m_bookmark_button->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/bookmark-filled.png"));
- m_bookmark_button->set_tooltip("Remove Bookmark");
- } else {
- m_bookmark_button->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/bookmark-contour.png"));
- m_bookmark_button->set_tooltip("Add Bookmark");
- }
-}
-
-void Tab::did_become_active()
-{
- Web::ResourceLoader::the().on_load_counter_change = [this] {
- if (Web::ResourceLoader::the().pending_loads() == 0) {
- m_statusbar->set_text("");
- return;
- }
- m_statusbar->set_text(String::formatted("Loading ({} pending resources...)", Web::ResourceLoader::the().pending_loads()));
- };
-
- BookmarksBarWidget::the().on_bookmark_click = [this](auto& url, unsigned modifiers) {
- if (modifiers & Mod_Ctrl)
- on_tab_open_request(url);
- else
- load(url);
- };
-
- BookmarksBarWidget::the().on_bookmark_hover = [this](auto&, auto& url) {
- m_statusbar->set_text(url);
- };
-
- BookmarksBarWidget::the().remove_from_parent();
- m_toolbar_container->add_child(BookmarksBarWidget::the());
-
- auto is_fullscreen = window()->is_fullscreen();
- m_toolbar_container->set_visible(!is_fullscreen);
- m_statusbar->set_visible(!is_fullscreen);
-
- GUI::Application::the()->set_menubar(m_menubar);
-}
-
-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.gml b/Applications/Browser/Tab.gml
deleted file mode 100644
index 24c7456d77..0000000000
--- a/Applications/Browser/Tab.gml
+++ /dev/null
@@ -1,22 +0,0 @@
-@GUI::Widget {
- layout: @GUI::VerticalBoxLayout {
- }
-
- @GUI::ToolBarContainer {
- name: "toolbar_container"
-
- @GUI::ToolBar {
- name: "toolbar"
- }
- }
-
- @GUI::Widget {
- name: "webview_container"
- layout: @GUI::VerticalBoxLayout {
- }
- }
-
- @GUI::StatusBar {
- name: "statusbar"
- }
-}
diff --git a/Applications/Browser/Tab.h b/Applications/Browser/Tab.h
deleted file mode 100644
index 79f86e4931..0000000000
--- a/Applications/Browser/Tab.h
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "History.h"
-#include <AK/URL.h>
-#include <LibGUI/Widget.h>
-#include <LibGfx/ShareableBitmap.h>
-#include <LibHTTP/HttpJob.h>
-#include <LibWeb/Forward.h>
-
-namespace Web {
-class OutOfProcessWebView;
-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;
-
- enum class LoadType {
- Normal,
- HistoryNavigation,
- };
-
- void load(const URL&, LoadType = LoadType::Normal);
- void reload();
- void go_back();
- void go_forward();
-
- void did_become_active();
- void context_menu_requested(const Gfx::IntPoint& screen_position);
-
- Function<void(String)> on_title_change;
- Function<void(const URL&)> on_tab_open_request;
- Function<void(Tab&)> on_tab_close_request;
- Function<void(const Gfx::Bitmap&)> on_favicon_change;
-
- const String& title() const { return m_title; }
- const Gfx::Bitmap* icon() const { return m_icon; }
-
- GUI::Widget& view();
-
-private:
- explicit Tab(Type);
-
- Web::WebViewHooks& hooks();
- void update_actions();
- void update_bookmark_button(const String& url);
-
- Type m_type;
-
- History m_history;
-
- RefPtr<Web::InProcessWebView> m_page_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_reload_action;
- RefPtr<GUI::TextBox> m_location_box;
- RefPtr<GUI::Button> m_bookmark_button;
- RefPtr<GUI::Window> m_dom_inspector_window;
- RefPtr<GUI::Window> m_console_window;
- RefPtr<GUI::StatusBar> m_statusbar;
- RefPtr<GUI::MenuBar> m_menubar;
- RefPtr<GUI::ToolBarContainer> m_toolbar_container;
-
- RefPtr<GUI::Menu> m_link_context_menu;
- RefPtr<GUI::Action> m_link_context_menu_default_action;
- URL m_link_context_menu_url;
-
- RefPtr<GUI::Menu> m_image_context_menu;
- Gfx::ShareableBitmap m_image_context_menu_bitmap;
- URL m_image_context_menu_url;
-
- RefPtr<GUI::Menu> m_tab_context_menu;
- RefPtr<GUI::Menu> m_page_context_menu;
-
- String m_title;
- RefPtr<const Gfx::Bitmap> m_icon;
-
- bool m_is_history_navigation { false };
-};
-
-URL url_from_user_input(const String& input);
-
-}
diff --git a/Applications/Browser/WindowActions.cpp b/Applications/Browser/WindowActions.cpp
deleted file mode 100644
index ca0b12bd84..0000000000
--- a/Applications/Browser/WindowActions.cpp
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "WindowActions.h"
-#include <LibGUI/Icon.h>
-#include <LibGUI/Window.h>
-#include <LibGfx/Bitmap.h>
-
-namespace Browser {
-
-static WindowActions* s_the;
-
-WindowActions& WindowActions::the()
-{
- ASSERT(s_the);
- return *s_the;
-}
-
-WindowActions::WindowActions(GUI::Window& window)
-{
- ASSERT(!s_the);
- s_the = this;
- m_create_new_tab_action = GUI::Action::create(
- "New tab", { Mod_Ctrl, Key_T }, Gfx::Bitmap::load_from_file("/res/icons/16x16/new-tab.png"), [this](auto&) {
- if (on_create_new_tab)
- on_create_new_tab();
- },
- &window);
-
- m_next_tab_action = GUI::Action::create(
- "Next tab", { Mod_Ctrl, Key_PageDown }, [this](auto&) {
- if (on_next_tab)
- on_next_tab();
- },
- &window);
-
- m_previous_tab_action = GUI::Action::create(
- "Previous tab", { Mod_Ctrl, Key_PageUp }, [this](auto&) {
- if (on_previous_tab)
- on_previous_tab();
- },
- &window);
-
- m_about_action = GUI::Action::create(
- "About Browser", GUI::Icon::default_icon("app-browser").bitmap_for_size(16), [this](const GUI::Action&) {
- if (on_about)
- on_about();
- },
- &window);
- m_show_bookmarks_bar_action = GUI::Action::create_checkable(
- "Show bookmarks bar",
- [this](auto& action) {
- if (on_show_bookmarks_bar)
- on_show_bookmarks_bar(action);
- },
- &window);
-}
-
-}
diff --git a/Applications/Browser/WindowActions.h b/Applications/Browser/WindowActions.h
deleted file mode 100644
index 3212321837..0000000000
--- a/Applications/Browser/WindowActions.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <LibGUI/Action.h>
-
-namespace Browser {
-
-class WindowActions {
-public:
- static WindowActions& the();
-
- WindowActions(GUI::Window&);
-
- Function<void()> on_create_new_tab;
- Function<void()> on_next_tab;
- Function<void()> on_previous_tab;
- Function<void()> on_about;
- Function<void(GUI::Action&)> on_show_bookmarks_bar;
-
- GUI::Action& create_new_tab_action() { return *m_create_new_tab_action; }
- GUI::Action& next_tab_action() { return *m_next_tab_action; }
- GUI::Action& previous_tab_action() { return *m_previous_tab_action; }
- GUI::Action& about_action() { return *m_about_action; }
- GUI::Action& show_bookmarks_bar_action() { return *m_show_bookmarks_bar_action; }
-
-private:
- RefPtr<GUI::Action> m_create_new_tab_action;
- RefPtr<GUI::Action> m_next_tab_action;
- RefPtr<GUI::Action> m_previous_tab_action;
- RefPtr<GUI::Action> m_about_action;
- RefPtr<GUI::Action> m_show_bookmarks_bar_action;
-};
-
-}
diff --git a/Applications/Browser/main.cpp b/Applications/Browser/main.cpp
deleted file mode 100644
index d83b68f5f4..0000000000
--- a/Applications/Browser/main.cpp
+++ /dev/null
@@ -1,254 +0,0 @@
-/*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "BookmarksBarWidget.h"
-#include "Browser.h"
-#include "InspectorWidget.h"
-#include "Tab.h"
-#include "WindowActions.h"
-#include <AK/StringBuilder.h>
-#include <Applications/Browser/BrowserWindowGML.h>
-#include <LibCore/ArgsParser.h>
-#include <LibCore/ConfigFile.h>
-#include <LibCore/File.h>
-#include <LibCore/StandardPaths.h>
-#include <LibDesktop/Launcher.h>
-#include <LibGUI/AboutDialog.h>
-#include <LibGUI/Application.h>
-#include <LibGUI/BoxLayout.h>
-#include <LibGUI/Icon.h>
-#include <LibGUI/TabWidget.h>
-#include <LibGUI/Window.h>
-#include <LibGfx/Bitmap.h>
-#include <LibWeb/Loader/ContentFilter.h>
-#include <LibWeb/Loader/ResourceLoader.h>
-#include <stdio.h>
-#include <stdlib.h>
-
-namespace Browser {
-
-String g_home_url;
-bool g_multi_process = false;
-
-static String bookmarks_file_path()
-{
- StringBuilder builder;
- builder.append(Core::StandardPaths::config_directory());
- builder.append("/bookmarks.json");
- return builder.to_string();
-}
-
-}
-
-int main(int argc, char** argv)
-{
- if (getuid() == 0) {
- warnln("Refusing to run as root");
- return 1;
- }
-
- if (pledge("stdio shared_buffer accept unix cpath rpath wpath fattr sendfd recvfd", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- const char* specified_url = nullptr;
-
- Core::ArgsParser args_parser;
- args_parser.add_option(Browser::g_multi_process, "Multi-process mode", "multi-process", 'm');
- args_parser.add_positional_argument(specified_url, "URL to open", "url", Core::ArgsParser::Required::No);
- args_parser.parse(argc, argv);
-
- auto app = GUI::Application::construct(argc, argv);
-
- // Connect to the ProtocolServer immediately so we can drop the "unix" pledge.
- Web::ResourceLoader::the();
-
- // Connect to LaunchServer immediately and let it know that we won't ask for anything other than opening
- // the user's downloads directory.
- // FIXME: This should go away with a standalone download manager at some point.
- if (!Desktop::Launcher::add_allowed_url(URL::create_with_file_protocol(Core::StandardPaths::downloads_directory()))
- || !Desktop::Launcher::seal_allowlist()) {
- warnln("Failed to set up allowed launch URLs");
- return 1;
- }
-
- if (pledge("stdio shared_buffer accept unix cpath rpath wpath sendfd recvfd", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- if (unveil("/home", "rwc") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil("/res", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil("/etc/passwd", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil("/tmp/portal/image", "rw") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil("/tmp/portal/webcontent", "rw") < 0) {
- perror("unveil");
- return 1;
- }
-
- unveil(nullptr, nullptr);
-
- auto app_icon = GUI::Icon::default_icon("app-browser");
-
- auto m_config = Core::ConfigFile::get_for_app("Browser");
- Browser::g_home_url = m_config->read_entry("Preferences", "Home", "about:blank");
-
- auto ad_filter_list_or_error = Core::File::open(String::formatted("{}/BrowserContentFilters.txt", Core::StandardPaths::config_directory()), Core::IODevice::ReadOnly);
- if (!ad_filter_list_or_error.is_error()) {
- auto& ad_filter_list = *ad_filter_list_or_error.value();
- while (!ad_filter_list.eof()) {
- auto line = ad_filter_list.read_line();
- if (line.is_empty())
- continue;
- Web::ContentFilter::the().add_pattern(line);
- }
- }
-
- bool bookmarksbar_enabled = true;
- auto bookmarks_bar = Browser::BookmarksBarWidget::construct(Browser::bookmarks_file_path(), bookmarksbar_enabled);
-
- auto window = GUI::Window::construct();
- window->resize(640, 480);
- window->set_icon(app_icon.bitmap_for_size(16));
- window->set_title("Browser");
-
- auto& widget = window->set_main_widget<GUI::Widget>();
- widget.load_from_gml(browser_window_gml);
-
- auto& tab_widget = *widget.find_descendant_of_type_named<GUI::TabWidget>("tab_widget");
-
- auto default_favicon = Gfx::Bitmap::load_from_file("/res/icons/16x16/filetype-html.png");
- ASSERT(default_favicon);
-
- tab_widget.on_change = [&](auto& active_widget) {
- auto& tab = static_cast<Browser::Tab&>(active_widget);
- window->set_title(String::formatted("{} - Browser", tab.title()));
- tab.did_become_active();
- };
-
- tab_widget.on_middle_click = [&](auto& clicked_widget) {
- auto& tab = static_cast<Browser::Tab&>(clicked_widget);
- tab.on_tab_close_request(tab);
- };
-
- tab_widget.on_context_menu_request = [&](auto& clicked_widget, const GUI::ContextMenuEvent& context_menu_event) {
- auto& tab = static_cast<Browser::Tab&>(clicked_widget);
- tab.context_menu_requested(context_menu_event.screen_position());
- };
-
- Browser::WindowActions window_actions(*window);
-
- Function<void(URL url, bool activate)> create_new_tab;
- create_new_tab = [&](auto url, auto activate) {
- auto type = Browser::g_multi_process ? Browser::Tab::Type::OutOfProcessWebView : 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);
-
- new_tab.on_title_change = [&](auto title) {
- tab_widget.set_tab_title(new_tab, title);
- if (tab_widget.active_widget() == &new_tab)
- window->set_title(String::formatted("{} - Browser", title));
- };
-
- new_tab.on_favicon_change = [&](auto& bitmap) {
- tab_widget.set_tab_icon(new_tab, &bitmap);
- };
-
- new_tab.on_tab_open_request = [&](auto& url) {
- create_new_tab(url, true);
- };
-
- new_tab.on_tab_close_request = [&](auto& tab) {
- tab_widget.deferred_invoke([&](auto&) {
- tab_widget.remove_tab(tab);
- tab_widget.set_bar_visible(!window->is_fullscreen() && tab_widget.children().size() > 1);
- if (tab_widget.children().is_empty())
- app->quit();
- });
- };
-
- new_tab.load(url);
-
- dbgln("Added new tab {:p}, loading {}", &new_tab, url);
-
- if (activate)
- tab_widget.set_active_widget(&new_tab);
- };
-
- URL first_url = Browser::g_home_url;
- if (specified_url) {
- if (Core::File::exists(specified_url)) {
- first_url = URL::create_with_file_protocol(Core::File::real_path_for(specified_url));
- } else {
- first_url = Browser::url_from_user_input(specified_url);
- }
- }
-
- window_actions.on_create_new_tab = [&] {
- create_new_tab(Browser::g_home_url, true);
- };
-
- window_actions.on_next_tab = [&] {
- tab_widget.activate_next_tab();
- };
-
- window_actions.on_previous_tab = [&] {
- tab_widget.activate_previous_tab();
- };
-
- window_actions.on_about = [&] {
- GUI::AboutDialog::show("Browser", app_icon.bitmap_for_size(32), window);
- };
-
- window_actions.on_show_bookmarks_bar = [&](auto& action) {
- Browser::BookmarksBarWidget::the().set_visible(action.is_checked());
- };
- window_actions.show_bookmarks_bar_action().set_checked(bookmarksbar_enabled);
-
- create_new_tab(first_url, true);
- window->show();
-
- return app->exec();
-}