From 5d7a7a43c40f2413f6936ddd69794f8550172e09 Mon Sep 17 00:00:00 2001 From: Shannon Booth Date: Sun, 27 Oct 2024 13:41:28 +1300 Subject: [PATCH] LibWeb: Add temp execution context for resolving promise in AudioContext Fixes a crash seen on twitter.com, namely from the 'resume' function. --- Userland/Libraries/LibWeb/WebAudio/AudioContext.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Userland/Libraries/LibWeb/WebAudio/AudioContext.cpp b/Userland/Libraries/LibWeb/WebAudio/AudioContext.cpp index 0e182eeb2f4..aaba40d899c 100644 --- a/Userland/Libraries/LibWeb/WebAudio/AudioContext.cpp +++ b/Userland/Libraries/LibWeb/WebAudio/AudioContext.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -145,6 +146,8 @@ WebIDL::ExceptionOr> AudioContext::resume() if (!start_rendering_audio_graph()) { // 7.4: In case of failure, queue a media element task to execute the following steps: queue_a_media_element_task(JS::create_heap_function(heap(), [&realm, this]() { + HTML::TemporaryExecutionContext context(Bindings::host_defined_environment_settings_object(realm), HTML::TemporaryExecutionContext::CallbacksEnabled::Yes); + // 7.4.1: Reject all promises from [[pending resume promises]] in order, then clear [[pending resume promises]]. for (auto const& promise : m_pending_resume_promises) { WebIDL::reject_promise(realm, promise, JS::js_null()); @@ -160,6 +163,8 @@ WebIDL::ExceptionOr> AudioContext::resume() // 7.5: queue a media element task to execute the following steps: queue_a_media_element_task(JS::create_heap_function(heap(), [&realm, promise, this]() { + HTML::TemporaryExecutionContext context(Bindings::host_defined_environment_settings_object(realm), HTML::TemporaryExecutionContext::CallbacksEnabled::Yes); + // 7.5.1: Resolve all promises from [[pending resume promises]] in order. // 7.5.2: Clear [[pending resume promises]]. Additionally, remove those promises from // [[pending promises]]. @@ -228,6 +233,8 @@ WebIDL::ExceptionOr> AudioContext::suspend() // 7.3: queue a media element task to execute the following steps: queue_a_media_element_task(JS::create_heap_function(heap(), [&realm, promise, this]() { + HTML::TemporaryExecutionContext context(Bindings::host_defined_environment_settings_object(realm), HTML::TemporaryExecutionContext::CallbacksEnabled::Yes); + // 7.3.1: Resolve promise. WebIDL::resolve_promise(realm, promise, JS::js_undefined()); @@ -281,6 +288,8 @@ WebIDL::ExceptionOr> AudioContext::close() // 5.4: queue a media element task to execute the following steps: queue_a_media_element_task(JS::create_heap_function(heap(), [&realm, promise, this]() { + HTML::TemporaryExecutionContext context(Bindings::host_defined_environment_settings_object(realm), HTML::TemporaryExecutionContext::CallbacksEnabled::Yes); + // 5.4.1: Resolve promise. WebIDL::resolve_promise(realm, promise, JS::js_undefined());