srctree

Robin Linden parent 7bca8c9f 4d7d6287
html: Switch to the ScriptData state when a script tag is encountered

inlinesplit
html/parser.cpp added: 23, removed: 3, total 20
@@ -37,7 +37,7 @@ constexpr auto kImmediatelyPopped = std::to_array(
 
} // namespace
 
void Parser::on_token(html2::Tokenizer &, html2::Token &&token) {
void Parser::on_token(html2::Tokenizer &tokenizer, html2::Token &&token) {
if (auto doctype = std::get_if<html2::DoctypeToken>(&token)) {
if (doctype->name.has_value()) {
doc_.doctype = *(doctype->name);
@@ -51,6 +51,10 @@ void Parser::on_token(html2::Tokenizer &, html2::Token &&token) {
return;
}
 
if (start_tag->tag_name == "script"sv) {
tokenizer.set_state(html2::State::ScriptData);
}
 
if (open_elements_.empty() && !seen_html_tag_) {
spdlog::warn("Start tag [{}] encountered before html element was opened", start_tag->tag_name);
doc_.html().name = "html"s;
 
html/parser_test.cpp added: 23, removed: 3, total 20
@@ -6,9 +6,13 @@
 
#include "etest/etest.h"
 
#include <cstddef>
 
using namespace std::literals;
using etest::expect;
using etest::expect_eq;
using etest::require;
using etest::require_eq;
 
int main() {
etest::test("doctype", [] {
@@ -170,5 +174,17 @@ int main() {
expect(p.children.empty());
});
 
etest::test("script is handled correctly", [] {
auto html = html::parse("<script><hello></script>"sv).html();
require_eq(html.children.size(), std::size_t{1});
 
auto script = std::get<dom::Element>(html.children[0]);
expect_eq(script.name, "script"sv);
expect_eq(script.children.size(), std::size_t{1});
 
auto script_content = std::get<dom::Text>(script.children[0]);
expect_eq(script_content.text, "<hello>"sv);
});
 
return etest::run_all_tests();
}