diff --git a/Libraries/LibWeb/Parser/HTMLDocumentParser.cpp b/Libraries/LibWeb/Parser/HTMLDocumentParser.cpp index 91c2910db3..ebb5d6e1ec 100644 --- a/Libraries/LibWeb/Parser/HTMLDocumentParser.cpp +++ b/Libraries/LibWeb/Parser/HTMLDocumentParser.cpp @@ -206,6 +206,23 @@ void HTMLDocumentParser::handle_in_head(HTMLToken& token) return; } + if (token.is_doctype()) { + PARSE_ERROR(); + return; + } + + if (token.is_start_tag() && token.tag_name() == "html") { + process_using_the_rules_for(InsertionMode::InBody, token); + return; + } + + if (token.is_start_tag() && token.tag_name().is_one_of("base", "basefont", "bgsound", "link")) { + insert_html_element(token); + m_stack_of_open_elements.pop(); + token.acknowledge_self_closing_flag_if_set(); + return; + } + if (token.is_start_tag() && token.tag_name() == "title") { insert_html_element(token); m_tokenizer.switch_to({}, HTMLTokenizer::State::RCDATA); @@ -245,9 +262,7 @@ void HTMLDocumentParser::handle_in_head(HTMLToken& token) if (token.is_start_tag() && token.tag_name() == "meta") { auto element = insert_html_element(token); m_stack_of_open_elements.pop(); - if (token.is_self_closing()) { - ASSERT_NOT_REACHED(); - } + token.acknowledge_self_closing_flag_if_set(); return; } if (token.is_end_tag() && token.tag_name() == "head") { diff --git a/Libraries/LibWeb/Parser/HTMLToken.h b/Libraries/LibWeb/Parser/HTMLToken.h index aeeb92e0d2..b309638378 100644 --- a/Libraries/LibWeb/Parser/HTMLToken.h +++ b/Libraries/LibWeb/Parser/HTMLToken.h @@ -92,6 +92,18 @@ public: return m_tag.self_closing; } + bool has_acknowledged_self_closing_flag() const + { + ASSERT(is_self_closing()); + return m_tag.self_closing_acknowledged; + } + + void acknowledge_self_closing_flag_if_set() + { + if (is_self_closing()) + m_tag.self_closing_acknowledged = true; + } + Type type() const { return m_type; } String to_string() const; @@ -117,6 +129,7 @@ private: struct { StringBuilder tag_name; bool self_closing { false }; + bool self_closing_acknowledged { false }; Vector attributes; } m_tag;