@@ -257,6 +257,50 @@ void ResourceLoader::handle_file_load_request(LoadRequest& request, FileHandler
257257 on_load_counter_change ();
258258}
259259
260+ template <typename Callback>
261+ void ResourceLoader::handle_about_load_request (LoadRequest const & request, Callback callback)
262+ {
263+ auto const & url = request.url ().value ();
264+
265+ dbgln_if (SPAM_DEBUG, " Loading about: URL {}" , url);
266+
267+ HTTP::HeaderMap response_headers;
268+ response_headers.set (" Content-Type" sv, " text/html; charset=UTF-8" sv);
269+
270+ // FIXME: Implement timing info for about requests.
271+ Requests::RequestTimingInfo timing_info {};
272+
273+ auto serialized_path = URL::percent_decode (url.serialize_path ());
274+
275+ // About version page
276+ if (serialized_path == " version" ) {
277+ auto version_page = MUST (load_about_version_page ());
278+ callback (version_page.bytes (), timing_info, response_headers);
279+ return ;
280+ }
281+
282+ // Other about static HTML pages
283+ auto target_file = ByteString::formatted (" {}.html" , serialized_path);
284+
285+ auto about_directory = MUST (Core::Resource::load_from_uri (" resource://ladybird/about-pages" _string));
286+ if (about_directory->children ().contains_slow (target_file.view ())) {
287+ auto resource = Core::Resource::load_from_uri (ByteString::formatted (" resource://ladybird/about-pages/{}" , target_file));
288+ if (!resource.is_error ()) {
289+ auto const & buffer = resource.value ()->data ();
290+ ReadonlyBytes data (buffer.data (), buffer.size ());
291+ callback (data, timing_info, response_headers);
292+ return ;
293+ }
294+ }
295+
296+ Platform::EventLoopPlugin::the ().deferred_invoke (GC::create_function (
297+ m_heap,
298+ [callback, timing_info, response_headers = move (response_headers)]() mutable {
299+ auto buffer = ByteString::empty ().to_byte_buffer ();
300+ callback (buffer.bytes (), timing_info, response_headers);
301+ }));
302+ }
303+
260304void ResourceLoader::load (LoadRequest& request, GC::Root<SuccessCallback> success_callback, GC::Root<ErrorCallback> error_callback, Optional<u32 > timeout, GC::Root<TimeoutCallback> timeout_callback)
261305{
262306 auto const & url = request.url ().value ();
@@ -288,39 +332,10 @@ void ResourceLoader::load(LoadRequest& request, GC::Root<SuccessCallback> succes
288332 };
289333
290334 if (url.scheme () == " about" ) {
291- dbgln_if (SPAM_DEBUG, " Loading about: URL {}" , url);
292- log_success (request);
293-
294- HTTP::HeaderMap response_headers;
295- response_headers.set (" Content-Type" , " text/html; charset=UTF-8" );
296-
297- // FIXME: Implement timing info for about requests.
298- Requests::RequestTimingInfo fixme_implement_timing_info {};
299-
300- auto serialized_path = URL::percent_decode (url.serialize_path ());
301-
302- // About version page
303- if (serialized_path == " version" ) {
304- success_callback->function ()(MUST (load_about_version_page ()).bytes (), fixme_implement_timing_info, response_headers, {}, {});
305- return ;
306- }
307-
308- // Other about static HTML pages
309- auto target_file = ByteString::formatted (" {}.html" , serialized_path);
310-
311- auto about_directory = MUST (Core::Resource::load_from_uri (" resource://ladybird/about-pages" _string));
312- if (about_directory->children ().contains_slow (target_file.view ())) {
313- auto resource = Core::Resource::load_from_uri (ByteString::formatted (" resource://ladybird/about-pages/{}" , target_file));
314- if (!resource.is_error ()) {
315- auto data = resource.value ()->data ();
316- success_callback->function ()(data, fixme_implement_timing_info, response_headers, {}, {});
317- return ;
318- }
319- }
320-
321- Platform::EventLoopPlugin::the ().deferred_invoke (GC::create_function (m_heap, [success_callback, response_headers = move (response_headers), fixme_implement_timing_info = move (fixme_implement_timing_info)] {
322- success_callback->function ()(ByteString::empty ().to_byte_buffer (), fixme_implement_timing_info, response_headers, {}, {});
323- }));
335+ handle_about_load_request (request, [success_callback, request](ReadonlyBytes data, Requests::RequestTimingInfo const & timing_info, HTTP::HeaderMap const & response_headers) {
336+ log_success (request);
337+ success_callback->function ()(data, timing_info, response_headers, {}, {});
338+ });
324339 return ;
325340 }
326341
@@ -474,6 +489,16 @@ void ResourceLoader::load_unbuffered(LoadRequest& request, GC::Root<OnHeadersRec
474489 return ;
475490 }
476491
492+ if (url.scheme () == " about" sv) {
493+ handle_about_load_request (request, [on_headers_received, on_data_received, on_complete, request](ReadonlyBytes data, Requests::RequestTimingInfo const & timing_info, HTTP::HeaderMap const & response_headers) {
494+ log_success (request);
495+ on_headers_received->function ()(response_headers, {}, {});
496+ on_data_received->function ()(data);
497+ on_complete->function ()(true , timing_info, {});
498+ });
499+ return ;
500+ }
501+
477502 if (url.scheme () == " file" sv) {
478503 handle_file_load_request (
479504 request,
0 commit comments