From ebce48327846c3ff04f8f17e63dada9b42a1b5e8 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sun, 3 Nov 2024 19:38:21 +0100 Subject: [PATCH] LibWeb: Add spec comments to the "in head noscript" parser state --- .../LibWeb/HTML/Parser/HTMLParser.cpp | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp b/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp index d28d0d00c5e..4365e0d4a13 100644 --- a/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp +++ b/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp @@ -1089,42 +1089,72 @@ AnythingElse: process_using_the_rules_for(m_insertion_mode, token); } +// https://html.spec.whatwg.org/multipage/parsing.html#parsing-main-inheadnoscript void HTMLParser::handle_in_head_noscript(HTMLToken& token) { + // -> A DOCTYPE token if (token.is_doctype()) { + // Parse error. Ignore the token. log_parse_error(); return; } + // -> A start tag whose tag name is "html" if (token.is_start_tag() && token.tag_name() == HTML::TagNames::html) { + // Process the token using the rules for the "in body" insertion mode. process_using_the_rules_for(InsertionMode::InBody, token); return; } + // -> An end tag whose tag name is "noscript" if (token.is_end_tag() && token.tag_name() == HTML::TagNames::noscript) { + // Pop the current node (which will be a noscript element) from the stack of open elements; + // the new current node will be a head element. (void)m_stack_of_open_elements.pop(); + + // Switch the insertion mode to "in head". m_insertion_mode = InsertionMode::InHead; return; } - if (token.is_parser_whitespace() || token.is_comment() || (token.is_start_tag() && token.tag_name().is_one_of(HTML::TagNames::basefont, HTML::TagNames::bgsound, HTML::TagNames::link, HTML::TagNames::meta, HTML::TagNames::noframes, HTML::TagNames::style))) { + // -> A character token that is one of U+0009 CHARACTER TABULATION, U+000A LINE FEED (LF), U+000C FORM FEED (FF), U+000D CARRIAGE RETURN (CR), or U+0020 SPACE + // -> A comment token + // -> A start tag whose tag name is one of: "basefont", "bgsound", "link", "meta", "noframes", "style" + if (token.is_parser_whitespace() + || token.is_comment() + || (token.is_start_tag() && token.tag_name().is_one_of(HTML::TagNames::basefont, HTML::TagNames::bgsound, HTML::TagNames::link, HTML::TagNames::meta, HTML::TagNames::noframes, HTML::TagNames::style))) { + // Process the token using the rules for the "in head" insertion mode. process_using_the_rules_for(InsertionMode::InHead, token); return; } + // -> An end tag whose tag name is "br" if (token.is_end_tag() && token.tag_name() == HTML::TagNames::br) { + // Act as described in the "anything else" entry below. goto AnythingElse; } - if (token.is_start_tag() && token.tag_name().is_one_of(HTML::TagNames::head, HTML::TagNames::noscript)) { + // -> A start tag whose tag name is one of: "head", "noscript" + // -> Any other end tag + if ((token.is_start_tag() && token.tag_name().is_one_of(HTML::TagNames::head, HTML::TagNames::noscript)) + || token.is_end_tag()) { + // Parse error. Ignore the token. log_parse_error(); return; } + // -> Anything else AnythingElse: + // Parse error. log_parse_error(); + + // Pop the current node (which will be a noscript element) from the stack of open elements; the new current node will be a head element. (void)m_stack_of_open_elements.pop(); + + // Switch the insertion mode to "in head". m_insertion_mode = InsertionMode::InHead; + + // Reprocess the token. process_using_the_rules_for(m_insertion_mode, token); }