1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-18 23:25:07 +00:00

LibWeb+Browser: Add ability to run Browser with the new HTML parser

You can now pass "-n" to the browser to use the new HTML parser.
It's not turned on by default since it's still very immature, but this
is a huge step towards bringing it into maturity. :^)
This commit is contained in:
Andreas Kling 2020-05-27 21:57:30 +02:00
parent 08e2907210
commit 2cb50f6750
4 changed files with 30 additions and 4 deletions

View file

@ -59,6 +59,7 @@
namespace Browser { namespace Browser {
extern bool g_use_new_html_parser;
extern String g_home_url; extern String g_home_url;
Tab::Tab() Tab::Tab()
@ -70,6 +71,8 @@ Tab::Tab()
auto& toolbar = m_toolbar_container->add<GUI::ToolBar>(); auto& toolbar = m_toolbar_container->add<GUI::ToolBar>();
m_html_widget = widget.add<Web::HtmlView>(); m_html_widget = widget.add<Web::HtmlView>();
m_html_widget->set_use_new_parser(g_use_new_html_parser);
m_go_back_action = GUI::CommonActions::make_go_back_action([this](auto&) { m_go_back_action = GUI::CommonActions::make_go_back_action([this](auto&) {
m_history.go_back(); m_history.go_back();
update_actions(); update_actions();

View file

@ -28,6 +28,7 @@
#include "InspectorWidget.h" #include "InspectorWidget.h"
#include "Tab.h" #include "Tab.h"
#include "WindowActions.h" #include "WindowActions.h"
#include <LibCore/ArgsParser.h>
#include <LibCore/ConfigFile.h> #include <LibCore/ConfigFile.h>
#include <LibCore/File.h> #include <LibCore/File.h>
#include <LibGUI/AboutDialog.h> #include <LibGUI/AboutDialog.h>
@ -44,6 +45,7 @@ namespace Browser {
static const char* bookmarks_filename = "/home/anon/bookmarks.json"; static const char* bookmarks_filename = "/home/anon/bookmarks.json";
String g_home_url; String g_home_url;
bool g_use_new_html_parser = false;
} }
@ -59,6 +61,13 @@ int main(int argc, char** argv)
return 1; return 1;
} }
const char* specified_url = nullptr;
Core::ArgsParser args_parser;
args_parser.add_option(Browser::g_use_new_html_parser, "Use new HTML parser", "new-parser", 'n');
args_parser.add_positional_argument(specified_url, "URL to open", "url", Core::ArgsParser::Required::No);
args_parser.parse(argc, argv);
GUI::Application app(argc, argv); GUI::Application app(argc, argv);
// Connect to the ProtocolServer immediately so we can drop the "unix" pledge. // Connect to the ProtocolServer immediately so we can drop the "unix" pledge.
@ -174,8 +183,8 @@ int main(int argc, char** argv)
}; };
URL first_url = Browser::g_home_url; URL first_url = Browser::g_home_url;
if (app.args().size() >= 1) if (specified_url)
first_url = URL::create_with_url_or_path(app.args()[0]); first_url = URL::create_with_url_or_path(specified_url);
window_actions.on_create_new_tab = [&] { window_actions.on_create_new_tab = [&] {
create_new_tab(Browser::g_home_url, true); create_new_tab(Browser::g_home_url, true);

View file

@ -47,6 +47,7 @@
#include <LibWeb/HtmlView.h> #include <LibWeb/HtmlView.h>
#include <LibWeb/Layout/LayoutDocument.h> #include <LibWeb/Layout/LayoutDocument.h>
#include <LibWeb/Layout/LayoutNode.h> #include <LibWeb/Layout/LayoutNode.h>
#include <LibWeb/Parser/HTMLDocumentParser.h>
#include <LibWeb/Parser/HTMLParser.h> #include <LibWeb/Parser/HTMLParser.h>
#include <LibWeb/RenderingContext.h> #include <LibWeb/RenderingContext.h>
#include <LibWeb/ResourceLoader.h> #include <LibWeb/ResourceLoader.h>
@ -431,7 +432,7 @@ static String guess_mime_type_based_on_filename(const URL& url)
return "text/plain"; return "text/plain";
} }
static RefPtr<Document> create_document_from_mime_type(const ByteBuffer& data, const URL& url, const String& mime_type, const String& encoding) RefPtr<Document> HtmlView::create_document_from_mime_type(const ByteBuffer& data, const URL& url, const String& mime_type, const String& encoding)
{ {
if (mime_type.starts_with("image/")) if (mime_type.starts_with("image/"))
return create_image_document(data, url); return create_image_document(data, url);
@ -441,8 +442,14 @@ static RefPtr<Document> create_document_from_mime_type(const ByteBuffer& data, c
return create_markdown_document(data, url); return create_markdown_document(data, url);
if (mime_type == "text/gemini") if (mime_type == "text/gemini")
return create_gemini_document(data, url); return create_gemini_document(data, url);
if (mime_type == "text/html") if (mime_type == "text/html") {
if (m_use_new_parser) {
HTMLDocumentParser parser(data);
parser.run(url);
return parser.document();
}
return parse_html_document(data, url, encoding); return parse_html_document(data, url, encoding);
}
return nullptr; return nullptr;
} }

View file

@ -38,6 +38,9 @@ class HtmlView : public GUI::ScrollableWidget {
public: public:
virtual ~HtmlView() override; virtual ~HtmlView() override;
// FIXME: Remove this once the new parser is ready.
void set_use_new_parser(bool use_new_parser) { m_use_new_parser = use_new_parser; }
Document* document(); Document* document();
const Document* document() const; const Document* document() const;
void set_document(Document*); void set_document(Document*);
@ -83,6 +86,8 @@ protected:
private: private:
virtual void did_scroll() override; virtual void did_scroll() override;
RefPtr<Document> create_document_from_mime_type(const ByteBuffer& data, const URL& url, const String& mime_type, const String& encoding);
void run_javascript_url(const String& url); void run_javascript_url(const String& url);
void layout_and_sync_size(); void layout_and_sync_size();
void dump_selection(const char* event_name); void dump_selection(const char* event_name);
@ -92,6 +97,8 @@ private:
bool m_should_show_line_box_borders { false }; bool m_should_show_line_box_borders { false };
bool m_in_mouse_selection { false }; bool m_in_mouse_selection { false };
bool m_use_new_parser { false };
}; };
} }