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.
This commit is contained in:
Timothy Flynn 2024-04-29 15:46:15 -04:00 committed by Andreas Kling
parent 60ea803b2a
commit ffb48ccd81
Notes: sideshowbarker 2024-07-16 18:26:46 +09:00

View file

@ -4657,24 +4657,18 @@ WebIDL::ExceptionOr<void> 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<JS::NonnullGCPtr<WebIDL::Promise>> {
// 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<JS::NonnullGCPtr<WebIDL::Promise>> {
// 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);
});
}