From 2c9dfadb21e3eee05e248a5c4a5c46381dcaa1e5 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 19 Mar 2022 14:22:46 +0100 Subject: [PATCH] LibWeb: Don't delay document "load" event for unclosed script tags We previously had a bug where markup with unclosed script tags caused the document load event to be delayed indefinitely. Fix this by only marking script elements as delaying the load event once we encounter the script end tag. --- Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp | 3 +++ Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h | 2 ++ Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp | 5 +++++ 3 files changed, 10 insertions(+) diff --git a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp index e7c10dc074..84d3736220 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp @@ -29,7 +29,10 @@ HTMLScriptElement::~HTMLScriptElement() = default; void HTMLScriptElement::set_parser_document(Badge, DOM::Document& document) { m_parser_document = document; +} +void HTMLScriptElement::begin_delaying_document_load_event(Badge, DOM::Document& document) +{ // https://html.spec.whatwg.org/multipage/scripting.html#concept-script-script // The user agent must delay the load event of the element's node document until the script is ready. m_document_load_event_delayer.emplace(document); diff --git a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h index 97ef29e642..a104e41ece 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h @@ -42,6 +42,8 @@ public: void set_source_line_number(Badge, size_t source_line_number) { m_source_line_number = source_line_number; } + void begin_delaying_document_load_event(Badge, DOM::Document&); + private: void prepare_script(); void script_became_ready(); diff --git a/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp b/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp index 2541298c7b..a2b41c4540 100644 --- a/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp +++ b/Userland/Libraries/LibWeb/HTML/Parser/HTMLParser.cpp @@ -2093,6 +2093,11 @@ void HTMLParser::handle_text(HTMLToken& token) flush_character_insertions(); NonnullRefPtr script = verify_cast(current_node()); + + // The document's "load" event is delayed until every script becomes ready. + // See HTMLScriptElement internals for how readiness is determined. + script->begin_delaying_document_load_event({}, *m_document); + (void)m_stack_of_open_elements.pop(); m_insertion_mode = m_original_insertion_mode; // Let the old insertion point have the same value as the current insertion point.