LibWeb: Move ad hoc CallbackType helper method to CallbackType header
Abstract operations of a stream does not seem like the correct home for this function.
This commit is contained in:
parent
93f258deb7
commit
99073c0561
Notes:
github-actions[bot]
2024-12-11 14:12:23 +00:00
Author: https://github.com/shannonbooth Commit: https://github.com/LadybirdBrowser/ladybird/commit/99073c0561d Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/2831 Reviewed-by: https://github.com/kennethmyhra ✅ Reviewed-by: https://github.com/trflynn89
7 changed files with 29 additions and 28 deletions
|
@ -5302,21 +5302,6 @@ WebIDL::ExceptionOr<JS::Value> structured_clone(JS::Realm& realm, JS::Value valu
|
|||
return TRY(HTML::structured_deserialize(vm, serialized, realm));
|
||||
}
|
||||
|
||||
// Non-standard function to aid in converting a user-provided function into a WebIDL::Callback. This is essentially
|
||||
// what the Bindings generator would do at compile time, but at runtime instead.
|
||||
JS::ThrowCompletionOr<GC::Root<WebIDL::CallbackType>> property_to_callback(JS::VM& vm, JS::Value value, JS::PropertyKey const& property_key, WebIDL::OperationReturnsPromise operation_returns_promise)
|
||||
{
|
||||
auto property = TRY(value.get(vm, property_key));
|
||||
|
||||
if (property.is_undefined())
|
||||
return GC::Root<WebIDL::CallbackType> {};
|
||||
|
||||
if (!property.is_function())
|
||||
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAFunction, property.to_string_without_side_effects());
|
||||
|
||||
return vm.heap().allocate<WebIDL::CallbackType>(property.as_object(), HTML::incumbent_realm(), operation_returns_promise);
|
||||
}
|
||||
|
||||
// https://streams.spec.whatwg.org/#set-up-readable-byte-stream-controller-from-underlying-source
|
||||
WebIDL::ExceptionOr<void> set_up_readable_byte_stream_controller_from_underlying_source(ReadableStream& stream, JS::Value underlying_source, UnderlyingSource const& underlying_source_dict, double high_water_mark)
|
||||
{
|
||||
|
|
|
@ -179,8 +179,6 @@ bool can_transfer_array_buffer(JS::ArrayBuffer const& array_buffer);
|
|||
WebIDL::ExceptionOr<JS::Value> clone_as_uint8_array(JS::Realm&, WebIDL::ArrayBufferView&);
|
||||
WebIDL::ExceptionOr<JS::Value> structured_clone(JS::Realm&, JS::Value value);
|
||||
|
||||
JS::ThrowCompletionOr<GC::Root<WebIDL::CallbackType>> property_to_callback(JS::VM& vm, JS::Value value, JS::PropertyKey const& property_key, WebIDL::OperationReturnsPromise);
|
||||
|
||||
// https://streams.spec.whatwg.org/#value-with-size
|
||||
struct ValueWithSize {
|
||||
JS::Value value;
|
||||
|
|
|
@ -19,10 +19,10 @@ JS::ThrowCompletionOr<Transformer> Transformer::from_value(JS::VM& vm, JS::Value
|
|||
auto& object = value.as_object();
|
||||
|
||||
Transformer transformer {
|
||||
.start = TRY(property_to_callback(vm, value, "start", WebIDL::OperationReturnsPromise::No)),
|
||||
.transform = TRY(property_to_callback(vm, value, "transform", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.flush = TRY(property_to_callback(vm, value, "flush", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.cancel = TRY(property_to_callback(vm, value, "cancel", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.start = TRY(WebIDL::property_to_callback(vm, value, "start", WebIDL::OperationReturnsPromise::No)),
|
||||
.transform = TRY(WebIDL::property_to_callback(vm, value, "transform", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.flush = TRY(WebIDL::property_to_callback(vm, value, "flush", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.cancel = TRY(WebIDL::property_to_callback(vm, value, "cancel", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.readable_type = {},
|
||||
.writable_type = {},
|
||||
};
|
||||
|
|
|
@ -19,10 +19,10 @@ JS::ThrowCompletionOr<UnderlyingSink> UnderlyingSink::from_value(JS::VM& vm, JS:
|
|||
auto& object = value.as_object();
|
||||
|
||||
UnderlyingSink underlying_sink {
|
||||
.start = TRY(property_to_callback(vm, value, "start", WebIDL::OperationReturnsPromise::No)),
|
||||
.write = TRY(property_to_callback(vm, value, "write", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.close = TRY(property_to_callback(vm, value, "close", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.abort = TRY(property_to_callback(vm, value, "abort", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.start = TRY(WebIDL::property_to_callback(vm, value, "start", WebIDL::OperationReturnsPromise::No)),
|
||||
.write = TRY(WebIDL::property_to_callback(vm, value, "write", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.close = TRY(WebIDL::property_to_callback(vm, value, "close", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.abort = TRY(WebIDL::property_to_callback(vm, value, "abort", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.type = {},
|
||||
};
|
||||
|
||||
|
|
|
@ -22,9 +22,9 @@ JS::ThrowCompletionOr<UnderlyingSource> UnderlyingSource::from_value(JS::VM& vm,
|
|||
auto& object = value.as_object();
|
||||
|
||||
UnderlyingSource underlying_source {
|
||||
.start = TRY(property_to_callback(vm, value, "start", WebIDL::OperationReturnsPromise::No)),
|
||||
.pull = TRY(property_to_callback(vm, value, "pull", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.cancel = TRY(property_to_callback(vm, value, "cancel", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.start = TRY(WebIDL::property_to_callback(vm, value, "start", WebIDL::OperationReturnsPromise::No)),
|
||||
.pull = TRY(WebIDL::property_to_callback(vm, value, "pull", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.cancel = TRY(WebIDL::property_to_callback(vm, value, "cancel", WebIDL::OperationReturnsPromise::Yes)),
|
||||
.type = {},
|
||||
.auto_allocate_chunk_size = {},
|
||||
};
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
*/
|
||||
|
||||
#include <LibJS/Runtime/Object.h>
|
||||
#include <LibJS/Runtime/VM.h>
|
||||
#include <LibWeb/HTML/Scripting/Environments.h>
|
||||
#include <LibWeb/WebIDL/CallbackType.h>
|
||||
|
||||
|
@ -26,4 +27,19 @@ void CallbackType::visit_edges(Cell::Visitor& visitor)
|
|||
visitor.visit(callback_context);
|
||||
}
|
||||
|
||||
// Non-standard function to aid in converting a user-provided function into a WebIDL::Callback. This is essentially
|
||||
// what the Bindings generator would do at compile time, but at runtime instead.
|
||||
JS::ThrowCompletionOr<GC::Root<CallbackType>> property_to_callback(JS::VM& vm, JS::Value value, JS::PropertyKey const& property_key, OperationReturnsPromise operation_returns_promise)
|
||||
{
|
||||
auto property = TRY(value.get(vm, property_key));
|
||||
|
||||
if (property.is_undefined())
|
||||
return GC::Root<CallbackType> {};
|
||||
|
||||
if (!property.is_function())
|
||||
return vm.throw_completion<JS::TypeError>(JS::ErrorType::NotAFunction, property.to_string_without_side_effects());
|
||||
|
||||
return vm.heap().allocate<CallbackType>(property.as_object(), HTML::incumbent_realm(), operation_returns_promise);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -39,4 +39,6 @@ private:
|
|||
virtual void visit_edges(Cell::Visitor&) override;
|
||||
};
|
||||
|
||||
JS::ThrowCompletionOr<GC::Root<WebIDL::CallbackType>> property_to_callback(JS::VM& vm, JS::Value value, JS::PropertyKey const& property_key, WebIDL::OperationReturnsPromise);
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue