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;