mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 23:50:19 +00:00
LibWeb: Support loading file:// URLs via fetch (through ResourceLoader)
This builds on the existing ad-hoc ResourceLoader code for HTTP fetches which works for files as well. This also includes a test that checks that stylesheets loaded with the "file" URL scheme actually work.
This commit is contained in:
parent
652676fdc1
commit
d005b1ad1b
Notes:
sideshowbarker
2024-07-18 01:43:16 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/d005b1ad1b Pull-request: https://github.com/SerenityOS/serenity/pull/17996 Reviewed-by: https://github.com/linusg ✅
5 changed files with 17 additions and 5 deletions
4
Tests/LibWeb/Layout/expected/link-sheet.txt
Normal file
4
Tests/LibWeb/Layout/expected/link-sheet.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
Viewport <#document> at (0,0) content-size 800x600 children: not-inline
|
||||||
|
BlockContainer <html> at (0,0) content-size 800x16 children: not-inline
|
||||||
|
BlockContainer <body> at (8,8) content-size 784x0 children: not-inline
|
||||||
|
BlockContainer <div#foo> at (0,0) content-size 123x456 positioned children: not-inline
|
7
Tests/LibWeb/Layout/input/link-sheet.css
Normal file
7
Tests/LibWeb/Layout/input/link-sheet.css
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#foo {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 123px;
|
||||||
|
height: 456px;
|
||||||
|
}
|
1
Tests/LibWeb/Layout/input/link-sheet.html
Normal file
1
Tests/LibWeb/Layout/input/link-sheet.html
Normal file
|
@ -0,0 +1 @@
|
||||||
|
<!DOCTYPE html><head><link rel="stylesheet" href="link-sheet.css"></head><body><div id="foo">
|
|
@ -722,8 +722,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> scheme_fetch(JS::Realm& r
|
||||||
else if (request->current_url().scheme() == "file"sv) {
|
else if (request->current_url().scheme() == "file"sv) {
|
||||||
// For now, unfortunate as it is, file: URLs are left as an exercise for the reader.
|
// For now, unfortunate as it is, file: URLs are left as an exercise for the reader.
|
||||||
// When in doubt, return a network error.
|
// When in doubt, return a network error.
|
||||||
// FIXME: Support 'file://' URLs
|
return TRY(nonstandard_resource_loader_file_or_http_network_fetch(realm, fetch_params));
|
||||||
return PendingResponse::create(vm, request, Infrastructure::Response::network_error(vm, "Request has 'file:' URL which is currently unsupported"sv));
|
|
||||||
}
|
}
|
||||||
// -> HTTP(S) scheme
|
// -> HTTP(S) scheme
|
||||||
else if (Infrastructure::is_http_or_https_scheme(request->current_url().scheme())) {
|
else if (Infrastructure::is_http_or_https_scheme(request->current_url().scheme())) {
|
||||||
|
@ -1392,7 +1391,7 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> http_network_or_cache_fet
|
||||||
|
|
||||||
// 2. Let forwardResponse be the result of running HTTP-network fetch given httpFetchParams, includeCredentials,
|
// 2. Let forwardResponse be the result of running HTTP-network fetch given httpFetchParams, includeCredentials,
|
||||||
// and isNewConnectionFetch.
|
// and isNewConnectionFetch.
|
||||||
pending_forward_response = TRY(nonstandard_resource_loader_http_network_fetch(realm, *http_fetch_params, include_credentials, is_new_connection_fetch));
|
pending_forward_response = TRY(nonstandard_resource_loader_file_or_http_network_fetch(realm, *http_fetch_params, include_credentials, is_new_connection_fetch));
|
||||||
} else {
|
} else {
|
||||||
pending_forward_response = PendingResponse::create(vm, request, Infrastructure::Response::create(vm));
|
pending_forward_response = PendingResponse::create(vm, request, Infrastructure::Response::create(vm));
|
||||||
}
|
}
|
||||||
|
@ -1598,7 +1597,8 @@ static void log_response(auto const& status_code, auto const& headers, auto cons
|
||||||
|
|
||||||
// https://fetch.spec.whatwg.org/#concept-http-network-fetch
|
// https://fetch.spec.whatwg.org/#concept-http-network-fetch
|
||||||
// Drop-in replacement for 'HTTP-network fetch', but obviously non-standard :^)
|
// Drop-in replacement for 'HTTP-network fetch', but obviously non-standard :^)
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> nonstandard_resource_loader_http_network_fetch(JS::Realm& realm, Infrastructure::FetchParams const& fetch_params, IncludeCredentials include_credentials, IsNewConnectionFetch is_new_connection_fetch)
|
// It also handles file:// URLs since those can also go through ResourceLoader.
|
||||||
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> nonstandard_resource_loader_file_or_http_network_fetch(JS::Realm& realm, Infrastructure::FetchParams const& fetch_params, IncludeCredentials include_credentials, IsNewConnectionFetch is_new_connection_fetch)
|
||||||
{
|
{
|
||||||
dbgln_if(WEB_FETCH_DEBUG, "Fetch: Running 'non-standard HTTP-network fetch' with: fetch_params @ {}", &fetch_params);
|
dbgln_if(WEB_FETCH_DEBUG, "Fetch: Running 'non-standard HTTP-network fetch' with: fetch_params @ {}", &fetch_params);
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,6 @@ WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> scheme_fetch(JS::Realm&,
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> http_fetch(JS::Realm&, Infrastructure::FetchParams const&, MakeCORSPreflight make_cors_preflight = MakeCORSPreflight::No);
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> http_fetch(JS::Realm&, Infrastructure::FetchParams const&, MakeCORSPreflight make_cors_preflight = MakeCORSPreflight::No);
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> http_redirect_fetch(JS::Realm&, Infrastructure::FetchParams const&, Infrastructure::Response&);
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> http_redirect_fetch(JS::Realm&, Infrastructure::FetchParams const&, Infrastructure::Response&);
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> http_network_or_cache_fetch(JS::Realm&, Infrastructure::FetchParams const&, IsAuthenticationFetch is_authentication_fetch = IsAuthenticationFetch::No, IsNewConnectionFetch is_new_connection_fetch = IsNewConnectionFetch::No);
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> http_network_or_cache_fetch(JS::Realm&, Infrastructure::FetchParams const&, IsAuthenticationFetch is_authentication_fetch = IsAuthenticationFetch::No, IsNewConnectionFetch is_new_connection_fetch = IsNewConnectionFetch::No);
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> nonstandard_resource_loader_http_network_fetch(JS::Realm&, Infrastructure::FetchParams const&, IncludeCredentials include_credentials = IncludeCredentials::No, IsNewConnectionFetch is_new_connection_fetch = IsNewConnectionFetch::No);
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> nonstandard_resource_loader_file_or_http_network_fetch(JS::Realm&, Infrastructure::FetchParams const&, IncludeCredentials include_credentials = IncludeCredentials::No, IsNewConnectionFetch is_new_connection_fetch = IsNewConnectionFetch::No);
|
||||||
WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> cors_preflight_fetch(JS::Realm&, Infrastructure::Request&);
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<PendingResponse>> cors_preflight_fetch(JS::Realm&, Infrastructure::Request&);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue