diff --git a/Libraries/LibWeb/Parser/HTMLDocumentParser.cpp b/Libraries/LibWeb/Parser/HTMLDocumentParser.cpp index 51088e300f..84be5dd5e0 100644 --- a/Libraries/LibWeb/Parser/HTMLDocumentParser.cpp +++ b/Libraries/LibWeb/Parser/HTMLDocumentParser.cpp @@ -207,6 +207,11 @@ void HTMLDocumentParser::handle_in_head(HTMLToken& token) return; } + if (token.is_start_tag() && ((token.tag_name() == "noscript" && m_scripting_enabled) || token.tag_name() == "noframes" || token.tag_name() == "style")) { + parse_generic_raw_text_element(token); + return; + } + if (token.is_start_tag() && token.tag_name() == "meta") { auto element = insert_html_element(token); m_stack_of_open_elements.pop(); @@ -228,6 +233,14 @@ void HTMLDocumentParser::handle_in_head_noscript(HTMLToken&) ASSERT_NOT_REACHED(); } +void HTMLDocumentParser::parse_generic_raw_text_element(HTMLToken& token) +{ + insert_html_element(token); + m_tokenizer.switch_to({}, HTMLTokenizer::State::RAWTEXT); + m_original_insertion_mode = m_insertion_mode; + m_insertion_mode = InsertionMode::Text; +} + void HTMLDocumentParser::insert_character(u32 data) { auto adjusted_insertion_location = find_appropriate_place_for_inserting_node(); diff --git a/Libraries/LibWeb/Parser/HTMLDocumentParser.h b/Libraries/LibWeb/Parser/HTMLDocumentParser.h index f74d018876..437e6c1cc8 100644 --- a/Libraries/LibWeb/Parser/HTMLDocumentParser.h +++ b/Libraries/LibWeb/Parser/HTMLDocumentParser.h @@ -99,6 +99,7 @@ private: void insert_comment(HTMLToken&); void reconstruct_the_active_formatting_elements(); void process_using_the_rules_for(InsertionMode, HTMLToken&); + void parse_generic_raw_text_element(HTMLToken&); InsertionMode m_insertion_mode { InsertionMode::Initial }; InsertionMode m_original_insertion_mode { InsertionMode::Initial }; @@ -112,6 +113,7 @@ private: bool m_foster_parenting { false }; bool m_frameset_ok { true }; bool m_parsing_fragment { false }; + bool m_scripting_enabled { true }; RefPtr m_document; RefPtr m_head_element; diff --git a/Libraries/LibWeb/Parser/HTMLTokenizer.cpp b/Libraries/LibWeb/Parser/HTMLTokenizer.cpp index a364fc8af6..98d6948cb5 100644 --- a/Libraries/LibWeb/Parser/HTMLTokenizer.cpp +++ b/Libraries/LibWeb/Parser/HTMLTokenizer.cpp @@ -827,6 +827,94 @@ Optional HTMLTokenizer::next_token() } END_STATE + BEGIN_STATE(RAWTEXT) + { + ON('<') + { + SWITCH_TO(RAWTEXTLessThanSign); + } + ON(0) + { + TODO(); + } + ON_EOF + { + EMIT_EOF; + } + ANYTHING_ELSE + { + EMIT_CURRENT_CHARACTER; + } + } + END_STATE + + BEGIN_STATE(RAWTEXTLessThanSign) + { + ON('/') + { + m_temporary_buffer.clear(); + SWITCH_TO(RAWTEXTEndTagOpen); + } + ANYTHING_ELSE + { + EMIT_CHARACTER('<'); + RECONSUME_IN(RAWTEXT); + } + } + END_STATE + + BEGIN_STATE(RAWTEXTEndTagOpen) + { + ON_ASCII_ALPHA + { + create_new_token(HTMLToken::Type::EndTag); + RECONSUME_IN(RAWTEXTEndTagName); + } + ANYTHING_ELSE + { + // FIXME: Emit a U+003C LESS-THAN SIGN character token and a U+002F SOLIDUS character token. Reconsume in the RAWTEXT state. + TODO(); + } + } + END_STATE + + BEGIN_STATE(RAWTEXTEndTagName) + { + ON_WHITESPACE + { + TODO(); + } + ON('/') + { + TODO(); + } + ON('>') + { + if (!current_end_tag_token_is_appropriate()) { + // FIXME: Otherwise, treat it as per the "anything else" entry below. + TODO(); + } + SWITCH_TO_AND_EMIT_CURRENT_TOKEN(Data); + } + ON_ASCII_UPPER_ALPHA + { + m_current_token.m_tag.tag_name.append(tolower(current_input_character.value())); + m_temporary_buffer.append(current_input_character.value()); + continue; + } + ON_ASCII_LOWER_ALPHA + { + m_current_token.m_tag.tag_name.append(current_input_character.value()); + m_temporary_buffer.append(current_input_character.value()); + continue; + } + ANYTHING_ELSE + { + TODO(); + } + } + END_STATE + default: ASSERT_NOT_REACHED(); }