diff --git a/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp b/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp index b7bc502001..7f1c19cd2c 100644 --- a/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp +++ b/Userland/Libraries/LibWeb/Loader/ResourceLoader.cpp @@ -137,10 +137,17 @@ static void emit_signpost(String const& message, int id) static size_t resource_id = 0; -void ResourceLoader::load(LoadRequest& request, Function const& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback) +void ResourceLoader::load(LoadRequest& request, Function const& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback, Optional timeout) { auto& url = request.url(); request.start_timer(); + RefPtr protocol_request; + if (timeout.has_value() && timeout.value() > 0) { + m_timer = Core::Timer::create_single_shot(timeout.value(), [&protocol_request] { + protocol_request->stop(); + }); + m_timer->start(); + } auto id = resource_id++; auto url_for_logging = sanitized_url_for_logging(url); @@ -241,7 +248,7 @@ void ResourceLoader::load(LoadRequest& request, Functionstart_request(request.method(), url, headers, request.body(), proxy); + protocol_request = m_connector->start_request(request.method(), url, headers, request.body(), proxy); if (!protocol_request) { auto start_request_failure_msg = "Failed to initiate load"sv; log_failure(request, start_request_failure_msg); @@ -250,6 +257,7 @@ void ResourceLoader::load(LoadRequest& request, Functionon_buffered_request_finish = [this, success_callback = move(success_callback), error_callback = move(error_callback), log_success, log_failure, request, &protocol_request = *protocol_request](bool success, auto, auto& response_headers, auto status_code, ReadonlyBytes payload) { --m_pending_loads; if (on_load_counter_change) @@ -287,11 +295,11 @@ void ResourceLoader::load(LoadRequest& request, Function const& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback) +void ResourceLoader::load(const AK::URL& url, Function const& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback, Optional timeout) { LoadRequest request; request.set_url(url); - load(request, move(success_callback), move(error_callback)); + load(request, move(success_callback), move(error_callback), timeout); } bool ResourceLoader::is_port_blocked(int port) diff --git a/Userland/Libraries/LibWeb/Loader/ResourceLoader.h b/Userland/Libraries/LibWeb/Loader/ResourceLoader.h index 986447316a..8fa058cf7c 100644 --- a/Userland/Libraries/LibWeb/Loader/ResourceLoader.h +++ b/Userland/Libraries/LibWeb/Loader/ResourceLoader.h @@ -13,6 +13,7 @@ #include #include #include +#include #include namespace Web { @@ -69,8 +70,8 @@ public: RefPtr load_resource(Resource::Type, LoadRequest&); - void load(LoadRequest&, Function const& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback = nullptr); - void load(const AK::URL&, Function const& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback = nullptr); + void load(LoadRequest&, Function const& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback = nullptr, Optional timeout = {}); + void load(const AK::URL&, Function const& response_headers, Optional status_code)> success_callback, Function status_code)> error_callback = nullptr, Optional timeout = {}); ResourceLoaderConnector& connector() { return *m_connector; } @@ -98,6 +99,7 @@ private: HashTable> m_active_requests; NonnullRefPtr m_connector; String m_user_agent; + RefPtr m_timer; }; } diff --git a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp index f307692e63..aea9f154b4 100644 --- a/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp +++ b/Userland/Libraries/LibWeb/XHR/XMLHttpRequest.cpp @@ -637,7 +637,8 @@ DOM::ExceptionOr XMLHttpRequest::send(String body) xhr.set_ready_state(ReadyState::Done); xhr.set_status(status_code.value_or(0)); xhr.dispatch_event(DOM::Event::create(HTML::EventNames::error)); - }); + }, + m_timeout); } else { TODO(); }