From ffb48ccd81bbdef515ad8c538e1167520e5cbe60 Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Mon, 29 Apr 2024 15:46:15 -0400 Subject: [PATCH] LibWeb: Ensure TransformStream's transform/flush callbacks do not throw Unlike what the comments here currently indicate, these callbacks do only return a Promise, and thus cannot throw. --- .../LibWeb/Streams/AbstractOperations.cpp | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp index d0761d91e40..4508d8d5968 100644 --- a/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp +++ b/Userland/Libraries/LibWeb/Streams/AbstractOperations.cpp @@ -4657,24 +4657,18 @@ WebIDL::ExceptionOr set_up_transform_stream_default_controller_from_transf // callback this value transformer. if (transformer_dict.transform) { transform_algorithm = JS::create_heap_function(realm.heap(), [controller, &realm, transformer, callback = transformer_dict.transform](JS::Value chunk) -> WebIDL::ExceptionOr> { - // Note: callback does not return a promise, so invoke_callback may return an abrupt completion - auto result = WebIDL::invoke_callback(*callback, transformer, chunk, controller); - if (result.is_error()) - return WebIDL::create_rejected_promise(realm, *result.release_value()); - - return WebIDL::create_resolved_promise(realm, *result.release_value()); + // Note: callback returns a promise, so invoke_callback will never return an abrupt completion + auto result = MUST(WebIDL::invoke_callback(*callback, transformer, chunk, controller)).release_value(); + return WebIDL::create_resolved_promise(realm, result); }); } // 5. If transformerDict["flush"] exists, set flushAlgorithm to an algorithm which returns the result of invoking // transformerDict["flush"] with argument list « controller » and callback this value transformer. if (transformer_dict.flush) { flush_algorithm = JS::create_heap_function(realm.heap(), [&realm, transformer, callback = transformer_dict.flush, controller]() -> WebIDL::ExceptionOr> { - // Note: callback does not return a promise, so invoke_callback may return an abrupt completion - auto result = WebIDL::invoke_callback(*callback, transformer, controller); - if (result.is_error()) { - return WebIDL::create_rejected_promise(realm, *result.release_value()); - } - return WebIDL::create_resolved_promise(realm, *result.release_value()); + // Note: callback returns a promise, so invoke_callback will never return an abrupt completion + auto result = MUST(WebIDL::invoke_callback(*callback, transformer, controller)).release_value(); + return WebIDL::create_resolved_promise(realm, result); }); }