diff --git a/Libraries/LibWeb/DOM/HTMLScriptElement.cpp b/Libraries/LibWeb/DOM/HTMLScriptElement.cpp index 6a69f9724b7..f66a96d5f77 100644 --- a/Libraries/LibWeb/DOM/HTMLScriptElement.cpp +++ b/Libraries/LibWeb/DOM/HTMLScriptElement.cpp @@ -115,6 +115,17 @@ void HTMLScriptElement::inserted_into(Node& new_parent) document().interpreter().run(*program); } +void HTMLScriptElement::execute_script() +{ + auto parser = JS::Parser(JS::Lexer(m_script_source)); + auto program = parser.parse_program(); + if (parser.has_errors()) { + parser.print_errors(); + return; + } + document().interpreter().run(*program); +} + void HTMLScriptElement::prepare_script(Badge) { if (m_already_started) @@ -216,13 +227,15 @@ void HTMLScriptElement::prepare_script(Badge) } else { - ASSERT_NOT_REACHED(); + // Immediately execute the script block, even if other scripts are already executing. + execute_script(); } } void HTMLScriptElement::script_became_ready() { - ASSERT(m_script_ready_callback); + if (!m_script_ready_callback) + return; m_script_ready_callback(); m_script_ready_callback = nullptr; } diff --git a/Libraries/LibWeb/DOM/HTMLScriptElement.h b/Libraries/LibWeb/DOM/HTMLScriptElement.h index 8374372a9c8..96c65a173c5 100644 --- a/Libraries/LibWeb/DOM/HTMLScriptElement.h +++ b/Libraries/LibWeb/DOM/HTMLScriptElement.h @@ -48,6 +48,7 @@ public: private: void script_became_ready(); void when_the_script_is_ready(Function); + void execute_script(); WeakPtr m_parser_document; WeakPtr m_preparation_time_document;