diff --git a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp
index f47cfb49e9..d8293ef101 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp
@@ -203,9 +203,6 @@ void HTMLScriptElement::prepare_script()
// FIXME: Cryptographic nonce
// FIXME: Check "integrity" attribute
// FIXME: Check "referrerpolicy" attribute
-
- m_parser_inserted = !!m_parser_document;
-
// FIXME: Check fetch options
if (has_attribute(HTML::AttributeNames::src)) {
@@ -254,15 +251,15 @@ void HTMLScriptElement::prepare_script()
}
}
- if ((m_script_type == ScriptType::Classic && has_attribute(HTML::AttributeNames::src) && has_attribute(HTML::AttributeNames::defer) && m_parser_inserted && !has_attribute(HTML::AttributeNames::async))
- || (m_script_type == ScriptType::Module && m_parser_inserted && !has_attribute(HTML::AttributeNames::async))) {
+ if ((m_script_type == ScriptType::Classic && has_attribute(HTML::AttributeNames::src) && has_attribute(HTML::AttributeNames::defer) && is_parser_inserted() && !has_attribute(HTML::AttributeNames::async))
+ || (m_script_type == ScriptType::Module && is_parser_inserted() && !has_attribute(HTML::AttributeNames::async))) {
document().add_script_to_execute_when_parsing_has_finished({}, *this);
when_the_script_is_ready([this] {
m_ready_to_be_parser_executed = true;
});
}
- else if (m_script_type == ScriptType::Classic && has_attribute(HTML::AttributeNames::src) && m_parser_inserted && !has_attribute(HTML::AttributeNames::async)) {
+ else if (m_script_type == ScriptType::Classic && has_attribute(HTML::AttributeNames::src) && is_parser_inserted() && !has_attribute(HTML::AttributeNames::async)) {
document().set_pending_parsing_blocking_script({}, this);
when_the_script_is_ready([this] {
m_ready_to_be_parser_executed = true;
@@ -329,13 +326,15 @@ void HTMLScriptElement::when_the_script_is_ready(Function callback)
m_script_ready_callback = move(callback);
}
-void HTMLScriptElement::inserted_into(Node& parent)
+void HTMLScriptElement::inserted()
{
- // FIXME: It would be nice to have a notification for "node became connected"
- if (is_connected()) {
- prepare_script();
+ if (!is_parser_inserted()) {
+ // FIXME: Only do this if the element was previously not connected.
+ if (is_connected()) {
+ prepare_script();
+ }
}
- HTMLElement::inserted_into(parent);
+ HTMLElement::inserted();
}
}
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h
index 33ab5f7111..79f0e8be63 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h
@@ -48,7 +48,9 @@ public:
void prepare_script(Badge) { prepare_script(); }
void execute_script();
- virtual void inserted_into(Node&) override;
+ bool is_parser_inserted() const { return !!m_parser_document; }
+
+ virtual void inserted() override;
private:
void prepare_script();
@@ -59,7 +61,6 @@ private:
WeakPtr m_preparation_time_document;
bool m_non_blocking { false };
bool m_already_started { false };
- bool m_parser_inserted { false };
bool m_from_an_external_file { false };
bool m_script_ready { false };
bool m_ready_to_be_parser_executed { false };