Browse Source

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"
Andreas Kling 5 years ago
parent
commit
68b1bdc234

+ 8 - 3
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();

+ 3 - 0
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;