Skip to content

Commit 1f4b53d

Browse files
kalenikaliaksandrtrflynn89
authored andcommitted
LibWeb: Implement :about protocol support for load_unbuffered()
Preparation work before enabling unbuffered fetching by default.
1 parent 2fd7b70 commit 1f4b53d

File tree

2 files changed

+60
-33
lines changed

2 files changed

+60
-33
lines changed

Libraries/LibWeb/Loader/ResourceLoader.cpp

Lines changed: 58 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
260304
void 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,

Libraries/LibWeb/Loader/ResourceLoader.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ class WEB_API ResourceLoader : public Core::EventReceiver {
8080
};
8181
template<typename FileHandler, typename ErrorHandler>
8282
void handle_file_load_request(LoadRequest& request, FileHandler on_file, ErrorHandler on_error);
83+
template<typename Callback>
84+
void handle_about_load_request(LoadRequest const& request, Callback callback);
8385

8486
RefPtr<Requests::Request> start_network_request(LoadRequest const&);
8587
void handle_network_response_headers(LoadRequest const&, HTTP::HeaderMap const&);

0 commit comments

Comments
 (0)