diff --git a/Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp b/Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp index 5bad1c6adf7..7cdcfcea6e2 100644 --- a/Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp +++ b/Userland/Libraries/LibWeb/Fetch/Fetching/Fetching.cpp @@ -603,7 +603,7 @@ WebIDL::ExceptionOr fetch_response_handover(JS::Realm& realm, Infrastructu }); // 4. Let processResponseEndOfBodyTask be the following steps: - auto process_response_end_of_body_task = [&fetch_params, &response] { + auto process_response_end_of_body_task = JS::create_heap_function(vm.heap(), [&fetch_params, &response] { // 1. Set fetchParams’s request’s done flag. fetch_params.request()->set_done(true); @@ -621,7 +621,7 @@ WebIDL::ExceptionOr fetch_response_handover(JS::Realm& realm, Infrastructu if (fetch_params.request()->initiator_type().has_value() && &client->global_object() == task_destination_global_object->ptr()) fetch_params.controller()->report_timing(client->global_object()); } - }; + }); // FIXME: Handle 'parallel queue' task destination auto task_destination = fetch_params.task_destination().get>(); @@ -636,9 +636,9 @@ WebIDL::ExceptionOr fetch_response_handover(JS::Realm& realm, Infrastructu // 4. If fetchParams’s process response is non-null, then queue a fetch task to run fetchParams’s process response // given response, with fetchParams’s task destination. if (fetch_params.algorithms()->process_response()) { - Infrastructure::queue_fetch_task(fetch_params.controller(), task_destination, [&fetch_params, &response]() { + Infrastructure::queue_fetch_task(fetch_params.controller(), task_destination, JS::create_heap_function(vm.heap(), [&fetch_params, &response]() { fetch_params.algorithms()->process_response()(response); - }); + })); } // 5. Let internalResponse be response, if response is a network error; otherwise response’s internal response. @@ -674,9 +674,9 @@ WebIDL::ExceptionOr fetch_response_handover(JS::Realm& realm, Infrastructu // 3. If internalResponse's body is null, then queue a fetch task to run processBody given null, with // fetchParams’s task destination. if (!internal_response->body()) { - Infrastructure::queue_fetch_task(fetch_params.controller(), task_destination, [process_body = move(process_body)]() { + Infrastructure::queue_fetch_task(fetch_params.controller(), task_destination, JS::create_heap_function(vm.heap(), [process_body = move(process_body)]() { process_body({}); - }); + })); } // 4. Otherwise, fully read internalResponse body given processBody, processBodyError, and fetchParams’s task // destination. diff --git a/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Bodies.cpp b/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Bodies.cpp index 0702a58d9f9..0a8e9571f63 100644 --- a/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Bodies.cpp +++ b/Userland/Libraries/LibWeb/Fetch/Infrastructure/HTTP/Bodies.cpp @@ -72,20 +72,20 @@ WebIDL::ExceptionOr Body::fully_read(JS::Realm& realm, Web::Fetch::Infrast auto task_destination_object = task_destination.get>(); // 2. Let successSteps given a byte sequence bytes be to queue a fetch task to run processBody given bytes, with taskDestination. - auto success_steps = [process_body = move(process_body), task_destination_object = JS::make_handle(task_destination_object)](ByteBuffer const& bytes) mutable -> ErrorOr { + auto success_steps = [&realm, process_body = move(process_body), task_destination_object = JS::make_handle(task_destination_object)](ByteBuffer const& bytes) mutable -> ErrorOr { // Make a copy of the bytes, as the source of the bytes may disappear between the time the task is queued and executed. auto bytes_copy = TRY(ByteBuffer::copy(bytes)); - queue_fetch_task(*task_destination_object, [process_body = move(process_body), bytes_copy = move(bytes_copy)]() { + queue_fetch_task(*task_destination_object, JS::create_heap_function(realm.heap(), [process_body = move(process_body), bytes_copy = move(bytes_copy)]() { process_body(move(bytes_copy)); - }); + })); return {}; }; // 3. Let errorSteps optionally given an exception exception be to queue a fetch task to run processBodyError given exception, with taskDestination. - auto error_steps = [process_body_error = move(process_body_error), task_destination_object = JS::make_handle(task_destination_object)](JS::GCPtr exception) mutable { - queue_fetch_task(*task_destination_object, [process_body_error = move(process_body_error), exception = JS::make_handle(exception)]() { + auto error_steps = [&realm, process_body_error = move(process_body_error), task_destination_object = JS::make_handle(task_destination_object)](JS::GCPtr exception) mutable { + queue_fetch_task(*task_destination_object, JS::create_heap_function(realm.heap(), [process_body_error = move(process_body_error), exception = JS::make_handle(exception)]() { process_body_error(*exception); - }); + })); }; // 4. Let reader be the result of getting a reader for body’s stream. If that threw an exception, then run errorSteps with that exception and return. diff --git a/Userland/Libraries/LibWeb/Fetch/Infrastructure/Task.cpp b/Userland/Libraries/LibWeb/Fetch/Infrastructure/Task.cpp index 87ee44ebd34..38af834ffe3 100644 --- a/Userland/Libraries/LibWeb/Fetch/Infrastructure/Task.cpp +++ b/Userland/Libraries/LibWeb/Fetch/Infrastructure/Task.cpp @@ -11,25 +11,25 @@ namespace Web::Fetch::Infrastructure { // https://fetch.spec.whatwg.org/#queue-a-fetch-task -int queue_fetch_task(JS::Object& task_destination, Function algorithm) +int queue_fetch_task(JS::Object& task_destination, JS::NonnullGCPtr> algorithm) { // FIXME: 1. If taskDestination is a parallel queue, then enqueue algorithm to taskDestination. // 2. Otherwise, queue a global task on the networking task source with taskDestination and algorithm. - auto& vm = task_destination.vm(); - return HTML::queue_global_task(HTML::Task::Source::Networking, task_destination, JS::create_heap_function(vm.heap(), move(algorithm))); + return HTML::queue_global_task(HTML::Task::Source::Networking, task_destination, algorithm); } // AD-HOC: This overload allows tracking the queued task within the fetch controller so that we may cancel queued tasks // when the spec indicates that we must stop an ongoing fetch. -int queue_fetch_task(JS::NonnullGCPtr fetch_controller, JS::Object& task_destination, Function algorithm) +int queue_fetch_task(JS::NonnullGCPtr fetch_controller, JS::Object& task_destination, JS::NonnullGCPtr> algorithm) { auto fetch_task_id = fetch_controller->next_fetch_task_id(); - int event_id = queue_fetch_task(task_destination, [fetch_controller, fetch_task_id, algorithm = move(algorithm)]() { + auto& heap = task_destination.heap(); + int event_id = queue_fetch_task(task_destination, JS::create_heap_function(heap, [fetch_controller, fetch_task_id, algorithm]() { fetch_controller->fetch_task_complete(fetch_task_id); - algorithm(); - }); + algorithm->function()(); + })); fetch_controller->fetch_task_queued(fetch_task_id, event_id); return event_id; diff --git a/Userland/Libraries/LibWeb/Fetch/Infrastructure/Task.h b/Userland/Libraries/LibWeb/Fetch/Infrastructure/Task.h index 451ca758add..1c094f43b50 100644 --- a/Userland/Libraries/LibWeb/Fetch/Infrastructure/Task.h +++ b/Userland/Libraries/LibWeb/Fetch/Infrastructure/Task.h @@ -17,7 +17,7 @@ namespace Web::Fetch::Infrastructure { // FIXME: 'or a parallel queue' using TaskDestination = Variant>; -int queue_fetch_task(JS::Object&, Function); -int queue_fetch_task(JS::NonnullGCPtr, JS::Object&, Function); +int queue_fetch_task(JS::Object&, JS::NonnullGCPtr>); +int queue_fetch_task(JS::NonnullGCPtr, JS::Object&, JS::NonnullGCPtr>); }