mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-06-10 18:10:56 +09:00
LibWeb: Set the initiator type for script-initiated CSS requests
Similar to other ad-hoc behavior in this method, we need to handle requests which are not associated with a style sheet. For example: <script> const element = document.createElement('div'); element.style['background'] = 'url(https://foo.com/img.png)'; document.body.appendChild(element); </script> Will not be associated with a style sheet. This is needed to ensure we fire a PerformanceResourceTiming event for this resource load. This is not currently testable in CI, as this event is also gated by HTTP/S requests.
This commit is contained in:
parent
1d63398cbd
commit
0da7441b9b
Notes:
github-actions[bot]
2025-05-06 16:38:32 +00:00
Author: https://github.com/trflynn89
Commit: 0da7441b9b
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4625
Reviewed-by: https://github.com/AtkinsSJ ✅
1 changed files with 15 additions and 7 deletions
|
@ -27,12 +27,12 @@ static WebIDL::ExceptionOr<GC::Ref<Fetch::Infrastructure::Request>> fetch_a_styl
|
||||||
// 2. Let base be sheet’s stylesheet base URL if it is not null, otherwise environmentSettings’s API base URL. [CSSOM]
|
// 2. Let base be sheet’s stylesheet base URL if it is not null, otherwise environmentSettings’s API base URL. [CSSOM]
|
||||||
// AD-HOC: We use the sheet's location if it has no base url. https://github.com/w3c/csswg-drafts/issues/12068
|
// AD-HOC: We use the sheet's location if it has no base url. https://github.com/w3c/csswg-drafts/issues/12068
|
||||||
auto base = sheet_or_document.visit(
|
auto base = sheet_or_document.visit(
|
||||||
[&](GC::Ref<CSSStyleSheet> const& sheet) {
|
[&](GC::Ref<CSSStyleSheet> sheet) {
|
||||||
return sheet->base_url()
|
return sheet->base_url()
|
||||||
.value_or_lazy_evaluated_optional([&sheet] { return sheet->location(); })
|
.value_or_lazy_evaluated_optional([&sheet] { return sheet->location(); })
|
||||||
.value_or_lazy_evaluated([&environment_settings] { return environment_settings.api_base_url(); });
|
.value_or_lazy_evaluated([&environment_settings] { return environment_settings.api_base_url(); });
|
||||||
},
|
},
|
||||||
[](GC::Ref<DOM::Document> const& document) { return document->base_url(); });
|
[](GC::Ref<DOM::Document> document) { return document->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.
|
// 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 url_string = url_value.visit(
|
auto url_string = url_value.visit(
|
||||||
|
@ -66,14 +66,22 @@ static WebIDL::ExceptionOr<GC::Ref<Fetch::Infrastructure::Request>> fetch_a_styl
|
||||||
// 7. If req’s mode is "cors", set req’s referrer to sheet’s location. [CSSOM]
|
// 7. If req’s mode is "cors", set req’s referrer to sheet’s location. [CSSOM]
|
||||||
if (request->mode() == Fetch::Infrastructure::Request::Mode::CORS) {
|
if (request->mode() == Fetch::Infrastructure::Request::Mode::CORS) {
|
||||||
auto location = sheet_or_document.visit(
|
auto location = sheet_or_document.visit(
|
||||||
[](GC::Ref<CSSStyleSheet> const& sheet) { return sheet->location().value(); },
|
[](GC::Ref<CSSStyleSheet> sheet) { return sheet->location().value(); },
|
||||||
[](GC::Ref<DOM::Document> const& document) { return document->url(); });
|
[](GC::Ref<DOM::Document> document) { return document->url(); });
|
||||||
request->set_referrer(move(location));
|
request->set_referrer(move(location));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 8. If sheet’s origin-clean flag is set, set req’s initiator type to "css". [CSSOM]
|
sheet_or_document.visit(
|
||||||
if (auto* sheet = sheet_or_document.get_pointer<GC::Ref<CSSStyleSheet>>(); sheet && (*sheet)->is_origin_clean())
|
[&](GC::Ref<CSSStyleSheet> sheet) {
|
||||||
request->set_initiator_type(Fetch::Infrastructure::Request::InitiatorType::CSS);
|
// 8. 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);
|
||||||
|
},
|
||||||
|
[&](GC::Ref<DOM::Document>) {
|
||||||
|
// AD-HOC: If the resource is not associated with a stylesheet, we must still set an initiator type in order
|
||||||
|
// for this resource to be observable through a PerformanceObserver. WPT relies on this.
|
||||||
|
request->set_initiator_type(Fetch::Infrastructure::Request::InitiatorType::Script);
|
||||||
|
});
|
||||||
|
|
||||||
// 9. Fetch req, with processresponseconsumebody set to processResponse.
|
// 9. Fetch req, with processresponseconsumebody set to processResponse.
|
||||||
// NB: Implemented by caller.
|
// NB: Implemented by caller.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue