diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index a36687ab9b..0ac2f3cb10 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -363,6 +363,7 @@ set(SOURCES HTML/Scripting/ModuleMap.cpp HTML/Scripting/ModuleScript.cpp HTML/Scripting/Script.cpp + HTML/Scripting/TemporaryExecutionContext.cpp HTML/Scripting/WindowEnvironmentSettingsObject.cpp HTML/SessionHistoryEntry.cpp HTML/SharedImageRequest.cpp diff --git a/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.cpp b/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.cpp new file mode 100644 index 0000000000..eb2d63d8f1 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.cpp @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2023, Tim Flynn + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Web::HTML { + +TemporaryExecutionContext::TemporaryExecutionContext(EnvironmentSettingsObject& environment_settings) + : m_environment_settings(environment_settings) +{ + m_environment_settings.prepare_to_run_script(); +} + +TemporaryExecutionContext::~TemporaryExecutionContext() +{ + m_environment_settings.clean_up_after_running_script(); +} + +} diff --git a/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.h b/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.h new file mode 100644 index 0000000000..04ece3efe0 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.h @@ -0,0 +1,25 @@ +/* + * Copyright (c) 2023, Tim Flynn + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include + +namespace Web::HTML { + +// When JS is run from outside the context of any user script, we currently do not have a running execution context. +// This results in a crash when we access VM::running_execution_context(). This is a spec issue. Until it is resolved, +// this is a workaround to temporarily push an execution context. +class TemporaryExecutionContext { +public: + explicit TemporaryExecutionContext(EnvironmentSettingsObject&); + ~TemporaryExecutionContext(); + +private: + EnvironmentSettingsObject& m_environment_settings; +}; + +}