aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/servoparser/prefetch.rs
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2019-10-07 18:39:36 -0400
committerGitHub <noreply@github.com>2019-10-07 18:39:36 -0400
commit75548f40c622f8bc2b3ec6b212fd4b378fcdc22f (patch)
treeb4843908c3ef75018418760a317a7289489bd831 /components/script/dom/servoparser/prefetch.rs
parent95f65cdd3139651ac267494f47cc3ed1f2df9fae (diff)
parent6dd40962ea707dc0e02676fccd9156efa314141d (diff)
downloadservo-75548f40c622f8bc2b3ec6b212fd4b378fcdc22f.tar.gz
servo-75548f40c622f8bc2b3ec6b212fd4b378fcdc22f.zip
Auto merge of #24340 - jdm:image-cache-cors, r=Manishearth
Allow using CORS filtered image responses as WebGL textures More specifically, this makes the "is this image same origin?" check consider the CORS status of the original response, rather than relying on an overly-strict "is this image's response's URL same-origin with a particular global?" check. To do this, we make the image cache double keyed based on the requested URL as well as the requesting origin, and store the CORS status of the eventual response with the final image that eventually gets sent to the HTMLImageElement consumer. --- - [x] `./mach build -d` does not report any errors - [x] `./mach test-tidy` does not report any errors - [x] These changes fix #24330 and fix #24368 - [x] There are tests for these changes <!-- Reviewable:start --> --- This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/24340) <!-- Reviewable:end -->
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") {