Serenity Operating System
at master 65 lines 1.9 kB view raw
1/* 2 * Copyright (c) 2022, Linus Groh <linusg@serenityos.org> 3 * 4 * SPDX-License-Identifier: BSD-2-Clause 5 */ 6 7#include <LibJS/Heap/Heap.h> 8#include <LibJS/Runtime/VM.h> 9#include <LibWeb/Fetch/Fetching/PendingResponse.h> 10#include <LibWeb/Fetch/Infrastructure/HTTP/Requests.h> 11#include <LibWeb/Platform/EventLoopPlugin.h> 12 13namespace Web::Fetch::Fetching { 14 15JS::NonnullGCPtr<PendingResponse> PendingResponse::create(JS::VM& vm, JS::NonnullGCPtr<Infrastructure::Request> request) 16{ 17 return vm.heap().allocate_without_realm<PendingResponse>(request); 18} 19 20JS::NonnullGCPtr<PendingResponse> PendingResponse::create(JS::VM& vm, JS::NonnullGCPtr<Infrastructure::Request> request, JS::NonnullGCPtr<Infrastructure::Response> response) 21{ 22 return vm.heap().allocate_without_realm<PendingResponse>(request, response); 23} 24 25PendingResponse::PendingResponse(JS::NonnullGCPtr<Infrastructure::Request> request, JS::GCPtr<Infrastructure::Response> response) 26 : m_request(request) 27 , m_response(response) 28{ 29 m_request->add_pending_response({}, *this); 30} 31 32void PendingResponse::visit_edges(JS::Cell::Visitor& visitor) 33{ 34 Base::visit_edges(visitor); 35 visitor.visit(m_request); 36 visitor.visit(m_response); 37} 38 39void PendingResponse::when_loaded(Callback callback) 40{ 41 VERIFY(!m_callback); 42 m_callback = move(callback); 43 if (m_response) 44 run_callback(); 45} 46 47void PendingResponse::resolve(JS::NonnullGCPtr<Infrastructure::Response> response) 48{ 49 VERIFY(!m_response); 50 m_response = response; 51 if (m_callback) 52 run_callback(); 53} 54 55void PendingResponse::run_callback() 56{ 57 VERIFY(m_callback); 58 VERIFY(m_response); 59 Platform::EventLoopPlugin::the().deferred_invoke([strong_this = JS::make_handle(*this)] { 60 strong_this->m_callback(*strong_this->m_response); 61 strong_this->m_request->remove_pending_response({}, *strong_this.ptr()); 62 }); 63} 64 65}