diff options
author | Delan Azabani <dazabani@igalia.com> | 2025-01-30 19:15:35 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-30 11:15:35 +0000 |
commit | 5e9de2cb61fbfd82b27343bf03439838458b9848 (patch) | |
tree | 64574624cda94237bbfc443a29b792229fde0ee2 /components/script/dom/servoparser/prefetch.rs | |
parent | 9eeb602f7afca502753bb8211ab646c952951761 (diff) | |
download | servo-5e9de2cb61fbfd82b27343bf03439838458b9848.tar.gz servo-5e9de2cb61fbfd82b27343bf03439838458b9848.zip |
Include `WebViewId` into EmbedderMsg variants where possible (#35211)
`EmbedderMsg` was previously paired with an implicit
`Option<WebViewId>`, even though almost all variants were either always
`Some` or always `None`, depending on whether there was a `WebView
involved.
This patch adds the `WebViewId` to as many `EmbedderMsg` variants as
possible, so we can call their associated `WebView` delegate methods
without needing to check and unwrap the `Option`. In many cases, this
required more changes to plumb through the `WebViewId`.
Notably, all `Request`s now explicitly need a `WebView` or not, in order
to ensure that it is passed when appropriate.
Signed-off-by: Delan Azabani <dazabani@igalia.com>
Co-authored-by: Martin Robinson <mrobinson@igalia.com>
Diffstat (limited to 'components/script/dom/servoparser/prefetch.rs')
-rw-r--r-- | components/script/dom/servoparser/prefetch.rs | 45 |
1 files changed, 29 insertions, 16 deletions
diff --git a/components/script/dom/servoparser/prefetch.rs b/components/script/dom/servoparser/prefetch.rs index 5e394816f44..c67a90372dc 100644 --- a/components/script/dom/servoparser/prefetch.rs +++ b/components/script/dom/servoparser/prefetch.rs @@ -4,7 +4,8 @@ use std::cell::{Cell, RefCell}; -use base::id::PipelineId; +use base::id::{PipelineId, WebViewId}; +use content_security_policy::Destination; use html5ever::buffer_queue::BufferQueue; use html5ever::tokenizer::states::RawKind; use html5ever::tokenizer::{ @@ -19,10 +20,9 @@ use servo_url::{ImmutableOrigin, ServoUrl}; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::trace::{CustomTraceable, JSTraceable}; use crate::dom::document::{determine_policy_for_token, Document}; -use crate::dom::htmlimageelement::{image_fetch_request, FromPictureOrSrcSet}; use crate::dom::htmlscriptelement::script_fetch_request; +use crate::fetch::create_a_potential_cors_request; use crate::script_module::ScriptFetchOptions; -use crate::stylesheet_loader::stylesheet_fetch_request; #[derive(JSTraceable, MallocSizeOf)] #[cfg_attr(crown, crown::unrooted_must_root_lint::must_root)] @@ -43,6 +43,7 @@ impl Tokenizer { let sink = PrefetchSink { origin: document.origin().immutable().clone(), pipeline_id: document.global().pipeline_id(), + webview_id: document.webview_id(), base_url: RefCell::new(None), document_url: document.url(), referrer: document.global().get_referrer(), @@ -70,6 +71,8 @@ struct PrefetchSink { #[no_trace] pipeline_id: PipelineId, #[no_trace] + webview_id: WebViewId, + #[no_trace] document_url: ServoUrl, #[no_trace] base_url: RefCell<Option<ServoUrl>>, @@ -102,6 +105,7 @@ impl TokenSink for PrefetchSink { .map(|attr| String::from(&attr.value)) .unwrap_or_default(); let request = script_fetch_request( + self.webview_id, url, cors_setting, self.origin.clone(), @@ -124,15 +128,18 @@ impl TokenSink for PrefetchSink { (TagKind::StartTag, &local_name!("img")) if self.prefetching.get() => { if let Some(url) = self.get_url(tag, local_name!("src")) { debug!("Prefetch {} {}", tag.name, url); - let request = image_fetch_request( + let request = create_a_potential_cors_request( + Some(self.webview_id), url, - self.origin.clone(), - self.referrer.clone(), - self.pipeline_id, + Destination::Image, self.get_cors_settings(tag, local_name!("crossorigin")), - self.get_referrer_policy(tag, local_name!("referrerpolicy")), - FromPictureOrSrcSet::No, - ); + None, + self.referrer.clone(), + ) + .origin(self.origin.clone()) + .pipeline_id(Some(self.pipeline_id)) + .referrer_policy(self.get_referrer_policy(tag, local_name!("referrerpolicy"))); + let _ = self .resource_threads .send(CoreResourceMsg::Fetch(request, FetchChannels::Prefetch)); @@ -152,15 +159,21 @@ impl TokenSink for PrefetchSink { .get_attr(tag, local_name!("integrity")) .map(|attr| String::from(&attr.value)) .unwrap_or_default(); - let request = stylesheet_fetch_request( + + // https://html.spec.whatwg.org/multipage/#default-fetch-and-process-the-linked-resource + let request = create_a_potential_cors_request( + Some(self.webview_id), url, + Destination::Style, cors_setting, - self.origin.clone(), - self.pipeline_id, + None, self.referrer.clone(), - referrer_policy, - integrity_metadata, - ); + ) + .origin(self.origin.clone()) + .pipeline_id(Some(self.pipeline_id)) + .referrer_policy(referrer_policy) + .integrity_metadata(integrity_metadata); + let _ = self .resource_threads .send(CoreResourceMsg::Fetch(request, FetchChannels::Prefetch)); |