From 1358fe85b03a4c0428bf620965742f052b782723 Mon Sep 17 00:00:00 2001 From: Andrew Kaster Date: Thu, 18 Jan 2024 13:04:52 -0700 Subject: [PATCH] LibWeb: Add option to TemporaryExecutionContext to prepare for callbacks In the cases where spec authors have us directly interact with promises in a task source context, we need to prepare the backup settings object stack as well as push an actual execution context to the JS VM. --- Userland/Libraries/LibWeb/HTML/Navigation.cpp | 2 +- .../LibWeb/HTML/Scripting/TemporaryExecutionContext.cpp | 7 ++++++- .../LibWeb/HTML/Scripting/TemporaryExecutionContext.h | 8 +++++++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Userland/Libraries/LibWeb/HTML/Navigation.cpp b/Userland/Libraries/LibWeb/HTML/Navigation.cpp index 6d8634a071..2e3be11bdd 100644 --- a/Userland/Libraries/LibWeb/HTML/Navigation.cpp +++ b/Userland/Libraries/LibWeb/HTML/Navigation.cpp @@ -1067,7 +1067,7 @@ bool Navigation::inner_navigate_event_firing_algorithm( // 31. Prepare to run script given navigation's relevant settings object. // NOTE: There's a massive spec note here - TemporaryExecutionContext execution_context { relevant_settings_object(*this) }; + TemporaryExecutionContext execution_context { relevant_settings_object(*this), TemporaryExecutionContext::CallbacksEnabled::Yes }; // 32. If event's interception state is not "none": if (event->interception_state() != NavigateEvent::InterceptionState::None) { diff --git a/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.cpp b/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.cpp index eb2d63d8f1..831743a286 100644 --- a/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.cpp +++ b/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.cpp @@ -9,15 +9,20 @@ namespace Web::HTML { -TemporaryExecutionContext::TemporaryExecutionContext(EnvironmentSettingsObject& environment_settings) +TemporaryExecutionContext::TemporaryExecutionContext(EnvironmentSettingsObject& environment_settings, CallbacksEnabled callbacks_enabled) : m_environment_settings(environment_settings) + , m_callbacks_enabled(callbacks_enabled) { m_environment_settings.prepare_to_run_script(); + if (m_callbacks_enabled == CallbacksEnabled::Yes) + m_environment_settings.prepare_to_run_callback(); } TemporaryExecutionContext::~TemporaryExecutionContext() { m_environment_settings.clean_up_after_running_script(); + if (m_callbacks_enabled == CallbacksEnabled::Yes) + m_environment_settings.clean_up_after_running_callback(); } } diff --git a/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.h b/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.h index 04ece3efe0..e331efe9f3 100644 --- a/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.h +++ b/Userland/Libraries/LibWeb/HTML/Scripting/TemporaryExecutionContext.h @@ -15,11 +15,17 @@ namespace Web::HTML { // this is a workaround to temporarily push an execution context. class TemporaryExecutionContext { public: - explicit TemporaryExecutionContext(EnvironmentSettingsObject&); + enum class CallbacksEnabled { + No, + Yes, + }; + + explicit TemporaryExecutionContext(EnvironmentSettingsObject&, CallbacksEnabled = CallbacksEnabled::No); ~TemporaryExecutionContext(); private: EnvironmentSettingsObject& m_environment_settings; + CallbacksEnabled m_callbacks_enabled { CallbacksEnabled::No }; }; }