From 68b1bdc2346102f49e3563676eb0b3735f653e2c Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 28 May 2020 18:55:18 +0200 Subject: [PATCH] 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" --- Libraries/LibWeb/Parser/HTMLDocumentParser.cpp | 11 ++++++++--- Libraries/LibWeb/Parser/HTMLDocumentParser.h | 3 +++ 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 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 m_document;