mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-04-25 14:05:15 +00:00
URL::basic_parse has a subtle bug where the resulting URL is not set to valid when StateOveride is provided and the URL parser early returns a valid URL. This has not surfaced as a problem so far, as the only users of the state override API provide an already valid URL buffer and also ignore the result of basic parsing with a state override. However, this bug surfaces implementing the URL pattern spec, which as part of URL canonicalization: * Provides a dummy URL record * Basic URL parses that URL with state override * Checks the result of the URL parser to validate the URL While we could set URL validity on every early return of the URL parser during state override, it has been a long standing FIXME around the code to try and remove the awkward validity state of the URL class. So this commit makes the first stage of this change by migrating the basic parser API to return Optional, which also happens to make this subtle issue not a problem any more.
62 lines
3.1 KiB
C++
62 lines
3.1 KiB
C++
/*
|
||
* Copyright (c) 2024, Sam Atkins <sam@ladybird.org>
|
||
*
|
||
* SPDX-License-Identifier: BSD-2-Clause
|
||
*/
|
||
|
||
#include <LibURL/Parser.h>
|
||
#include <LibWeb/CSS/CSSStyleSheet.h>
|
||
#include <LibWeb/CSS/Fetch.h>
|
||
#include <LibWeb/Fetch/Fetching/Fetching.h>
|
||
|
||
namespace Web::CSS {
|
||
|
||
// https://drafts.csswg.org/css-values-4/#fetch-a-style-resource
|
||
void fetch_a_style_resource(String const& url_value, CSSStyleSheet const& sheet, Fetch::Infrastructure::Request::Destination destination, CorsMode cors_mode, Fetch::Infrastructure::FetchAlgorithms::ProcessResponseConsumeBodyFunction process_response)
|
||
{
|
||
auto& vm = sheet.vm();
|
||
|
||
// 1. Let environmentSettings be sheet’s relevant settings object.
|
||
auto& environment_settings = HTML::relevant_settings_object(sheet);
|
||
|
||
// 2. Let base be sheet’s stylesheet base URL if it is not null, otherwise environmentSettings’s API base URL. [CSSOM]
|
||
auto base = sheet.base_url().value_or(environment_settings.api_base_url());
|
||
|
||
// 3. Let parsedUrl be the result of the URL parser steps with urlValue’s url and base. If the algorithm returns an error, return.
|
||
auto parsed_url = URL::Parser::basic_parse(url_value, base);
|
||
if (!parsed_url.has_value())
|
||
return;
|
||
|
||
// 4. Let req be a new request whose url is parsedUrl, whose destination is destination, mode is corsMode,
|
||
// origin is environmentSettings’s origin, credentials mode is "same-origin", use-url-credentials flag is set,
|
||
// client is environmentSettings, and whose referrer is environmentSettings’s API base URL.
|
||
auto request = Fetch::Infrastructure::Request::create(vm);
|
||
request->set_url(parsed_url.release_value());
|
||
request->set_destination(destination);
|
||
request->set_mode(cors_mode == CorsMode::Cors ? Fetch::Infrastructure::Request::Mode::CORS : Fetch::Infrastructure::Request::Mode::NoCORS);
|
||
request->set_origin(environment_settings.origin());
|
||
request->set_credentials_mode(Fetch::Infrastructure::Request::CredentialsMode::SameOrigin);
|
||
request->set_use_url_credentials(true);
|
||
request->set_client(&environment_settings);
|
||
request->set_referrer(environment_settings.api_base_url());
|
||
|
||
// 5. Apply any URL request modifier steps that apply to this request.
|
||
// FIXME: No specs seem to define these yet. When they do, implement them.
|
||
|
||
// 6. If req’s mode is "cors", set req’s referrer to sheet’s location. [CSSOM]
|
||
if (request->mode() == Fetch::Infrastructure::Request::Mode::CORS) {
|
||
// FIXME: sheet's location is an optional string, what do we do here?
|
||
}
|
||
|
||
// 7. If sheet’s origin-clean flag is set, set req’s initiator type to "css". [CSSOM]
|
||
if (sheet.is_origin_clean())
|
||
request->set_initiator_type(Fetch::Infrastructure::Request::InitiatorType::CSS);
|
||
|
||
// 8. Fetch req, with processresponseconsumebody set to processResponse.
|
||
Fetch::Infrastructure::FetchAlgorithms::Input fetch_algorithms_input {};
|
||
fetch_algorithms_input.process_response_consume_body = move(process_response);
|
||
|
||
(void)Fetch::Fetching::fetch(environment_settings.realm(), request, Fetch::Infrastructure::FetchAlgorithms::create(vm, move(fetch_algorithms_input)));
|
||
}
|
||
|
||
}
|