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;