summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2020-05-28 18:55:18 +0200
committerAndreas Kling <kling@serenityos.org>2020-05-28 18:55:18 +0200
commit68b1bdc2346102f49e3563676eb0b3735f653e2c (patch)
tree19174675a11a411114d81f618d76f0de00e00173
parent00b44ab1489332d33e60979d7688145f097bd6e6 (diff)
downloadserenity-68b1bdc2346102f49e3563676eb0b3735f653e2c.zip
LibWeb: Add a way to stop the new HTML parser
Some things are specced to "stop parsing", which basically just means to stop fetching tokens and jump to "The end"
-rw-r--r--Libraries/LibWeb/Parser/HTMLDocumentParser.cpp11
-rw-r--r--Libraries/LibWeb/Parser/HTMLDocumentParser.h3
2 files changed, 11 insertions, 3 deletions
diff --git a/Libraries/LibWeb/Parser/HTMLDocumentParser.cpp b/Libraries/LibWeb/Parser/HTMLDocumentParser.cpp
index 9a85af72a4..323b25919f 100644
--- a/Libraries/LibWeb/Parser/HTMLDocumentParser.cpp
+++ b/Libraries/LibWeb/Parser/HTMLDocumentParser.cpp
@@ -76,6 +76,11 @@ void HTMLDocumentParser::run(const URL& url)
dbg() << "[" << insertion_mode_name() << "] " << token.to_string();
#endif
process_using_the_rules_for(m_insertion_mode, token);
+
+ if (m_stop_parsing) {
+ dbg() << "Stop parsing! :^)";
+ break;
+ }
}
// "The end"
@@ -497,8 +502,8 @@ void HTMLDocumentParser::handle_after_body(HTMLToken& token)
}
if (token.is_end_of_file()) {
- // FIXME: Stop parsing!
- TODO();
+ stop_parsing();
+ return;
}
if (token.is_end_tag() && token.tag_name() == "html") {
@@ -522,7 +527,7 @@ void HTMLDocumentParser::handle_after_after_body(HTMLToken& token)
}
if (token.is_end_of_file()) {
- dbg() << "Stop parsing! :^)";
+ stop_parsing();
return;
}
ASSERT_NOT_REACHED();
diff --git a/Libraries/LibWeb/Parser/HTMLDocumentParser.h b/Libraries/LibWeb/Parser/HTMLDocumentParser.h
index de4c817efb..df98658e4c 100644
--- a/Libraries/LibWeb/Parser/HTMLDocumentParser.h
+++ b/Libraries/LibWeb/Parser/HTMLDocumentParser.h
@@ -94,6 +94,8 @@ private:
void handle_in_row(HTMLToken&);
void handle_in_cell(HTMLToken&);
+ void stop_parsing() { m_stop_parsing = true; }
+
void generate_implied_end_tags(const FlyString& exception = {});
bool stack_of_open_elements_has_element_with_tag_name_in_scope(const FlyString& tag_name);
NonnullRefPtr<Element> create_element_for(HTMLToken&);
@@ -131,6 +133,7 @@ private:
bool m_invoked_via_document_write { false };
bool m_aborted { false };
bool m_parser_pause_flag { false };
+ bool m_stop_parsing { false };
size_t m_script_nesting_level { 0 };
RefPtr<Document> m_document;