diff --git a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp
index 735a5b11a0..95e2bbb8b0 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp
+++ b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2020, Andreas Kling
+ * Copyright (c) 2018-2021, Andreas Kling
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -12,8 +12,10 @@
#include
#include
#include
+#include
#include
#include
+#include
#include
namespace Web::HTML {
@@ -49,9 +51,9 @@ void HTMLScriptElement::execute_script()
return;
}
- // FIXME: 3. If the script's script is null for scriptElement, then fire an event named error at scriptElement, and return.
- if (m_source_text.is_null()) {
- dbgln("HTMLScriptElement: Refusing to run script because the script source is null.");
+ // 3. If the script's script is null for scriptElement, then fire an event named error at scriptElement, and return.
+ if (!m_script) {
+ dbgln("HTMLScriptElement: Refusing to run script because the script's script is null.");
dispatch_event(DOM::Event::create(HTML::EventNames::error));
return;
}
@@ -79,8 +81,8 @@ void HTMLScriptElement::execute_script()
else
dbgln_if(HTML_SCRIPT_DEBUG, "HTMLScriptElement: Running inline script");
- // FIXME: 3. Run the classic script given by the script's script for scriptElement.
- document().run_javascript(m_source_text, m_script_filename);
+ // 3. Run the classic script given by the script's script for scriptElement.
+ verify_cast(*m_script).run();
// Set document's currentScript attribute to oldCurrentScript.
document().set_current_script({}, old_current_script);
@@ -297,7 +299,14 @@ void HTMLScriptElement::prepare_script()
dbgln("HTMLScriptElement: Failed to load {}", url);
return;
}
- m_source_text = String::copy(data);
+ // FIXME: This is a hack to ensure that there's a global object.
+ document().interpreter();
+
+ // FIXME: This is all ad-hoc and needs work.
+ auto script = ClassicScript::create(data, *document().window().wrapper(), URL());
+
+ // When the chosen algorithm asynchronously completes, set the script's script to the result. At that time, the script is ready.
+ m_script = script;
script_became_ready();
},
[this](auto&, auto) {
@@ -315,9 +324,16 @@ void HTMLScriptElement::prepare_script()
// 2. Switch on the script's type:
if (m_script_type == ScriptType::Classic) {
// -> "classic"
- // FIXME: 1. Let script be the result of creating a classic script using source text, settings object, base URL, and options.
- // FIXME: 2. Set the script's script to script.
- m_source_text = source_text;
+ // 1. Let script be the result of creating a classic script using source text, settings object, base URL, and options.
+
+ // FIXME: This is a hack to ensure that there's a global object.
+ document().interpreter();
+
+ // FIXME: Pass settings, base URL and options.
+ auto script = ClassicScript::create(source_text, *document().window().wrapper(), URL());
+
+ // 2. Set the script's script to script.
+ m_script = script;
// 3. The script is ready.
script_became_ready();
diff --git a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h
index 2157a2f894..cf09e27bbc 100644
--- a/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h
+++ b/Userland/Libraries/LibWeb/HTML/HTMLScriptElement.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2018-2020, Andreas Kling
+ * Copyright (c) 2018-2021, Andreas Kling
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -8,6 +8,7 @@
#include
#include
+#include
namespace Web::HTML {
@@ -61,8 +62,9 @@ private:
Function m_script_ready_callback;
- String m_source_text;
String m_script_filename;
+
+ RefPtr