aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/servoparser/prefetch.rs
diff options
context:
space:
mode:
authorJosh Matthews <josh@joshmatthews.net>2019-10-03 17:36:02 -0400
committerJosh Matthews <josh@joshmatthews.net>2019-10-04 15:08:40 -0400
commit1df8d57dc6adcf56c22b45053b3d2eca904d17d3 (patch)
treece2ba8d6672925a95d551a0ece8ee9e279332e3e /components/script/dom/servoparser/prefetch.rs
parent583536c9406e685405d5b28da99dd8cab94c7d66 (diff)
downloadservo-1df8d57dc6adcf56c22b45053b3d2eca904d17d3.tar.gz
servo-1df8d57dc6adcf56c22b45053b3d2eca904d17d3.zip
Support CORS attributes for image elements.
Diffstat (limited to 'components/script/dom/servoparser/prefetch.rs')
-rw-r--r--components/script/dom/servoparser/prefetch.rs23
1 files changed, 19 insertions, 4 deletions
diff --git a/components/script/dom/servoparser/prefetch.rs b/components/script/dom/servoparser/prefetch.rs
index a2977cc15b1..716be8b0f51 100644
--- a/components/script/dom/servoparser/prefetch.rs
+++ b/components/script/dom/servoparser/prefetch.rs
@@ -4,8 +4,8 @@
use crate::dom::bindings::reflector::DomObject;
use crate::dom::bindings::trace::JSTraceable;
-use crate::dom::document::Document;
-use crate::dom::htmlimageelement::image_fetch_request;
+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::stylesheet_loader::stylesheet_fetch_request;
use html5ever::buffer_queue::BufferQueue;
@@ -123,7 +123,14 @@ impl TokenSink for PrefetchSink {
(TagKind::StartTag, local_name!("img")) if self.prefetching => {
if let Some(url) = self.get_url(tag, local_name!("src")) {
debug!("Prefetch {} {}", tag.name, url);
- let request = image_fetch_request(url, self.origin.clone(), self.pipeline_id);
+ let request = image_fetch_request(
+ url,
+ self.origin.clone(),
+ self.pipeline_id,
+ self.get_cors_settings(tag, local_name!("crossorigin")),
+ self.get_referrer_policy(tag, LocalName::from("referrerpolicy")),
+ FromPictureOrSrcSet::No,
+ );
let _ = self
.resource_threads
.send(CoreResourceMsg::Fetch(request, FetchChannels::Prefetch));
@@ -137,6 +144,8 @@ impl TokenSink for PrefetchSink {
debug!("Prefetch {} {}", tag.name, url);
let cors_setting =
self.get_cors_settings(tag, local_name!("crossorigin"));
+ let referrer_policy =
+ self.get_referrer_policy(tag, LocalName::from("referrerpolicy"));
let integrity_metadata = self
.get_attr(tag, local_name!("integrity"))
.map(|attr| String::from(&attr.value))
@@ -147,7 +156,7 @@ impl TokenSink for PrefetchSink {
self.origin.clone(),
self.pipeline_id,
self.referrer.clone(),
- self.referrer_policy,
+ referrer_policy,
integrity_metadata,
);
let _ = self
@@ -191,6 +200,12 @@ impl PrefetchSink {
ServoUrl::parse_with_base(Some(base), &attr.value).ok()
}
+ fn get_referrer_policy(&self, tag: &Tag, name: LocalName) -> Option<ReferrerPolicy> {
+ self.get_attr(tag, name)
+ .and_then(|attr| determine_policy_for_token(&*attr.value))
+ .or(self.referrer_policy)
+ }
+
fn get_cors_settings(&self, tag: &Tag, name: LocalName) -> Option<CorsSettings> {
let crossorigin = self.get_attr(tag, name)?;
if crossorigin.value.eq_ignore_ascii_case("anonymous") {