diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index b80be222bb6..18c88e6243e 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -35,7 +35,7 @@ extern crate websocket; use cookie_rs::Cookie; use filemanager_thread::FileManagerThreadMsg; use heapsize::HeapSizeOf; -use hyper::header::{ContentType, Headers}; +use hyper::header::{ContentType, Headers, ReferrerPolicy as ReferrerPolicyHeader}; use hyper::http::RawStatus; use hyper::mime::{Attr, Mime}; use hyper_serde::Serde; @@ -133,6 +133,29 @@ pub enum ReferrerPolicy { StrictOriginWhenCrossOrigin, } +impl<'a> From<&'a ReferrerPolicyHeader> for ReferrerPolicy { + fn from(policy: &'a ReferrerPolicyHeader) -> Self { + match *policy { + ReferrerPolicyHeader::NoReferrer => + ReferrerPolicy::NoReferrer, + ReferrerPolicyHeader::NoReferrerWhenDowngrade => + ReferrerPolicy::NoReferrerWhenDowngrade, + ReferrerPolicyHeader::SameOrigin => + ReferrerPolicy::SameOrigin, + ReferrerPolicyHeader::Origin => + ReferrerPolicy::Origin, + ReferrerPolicyHeader::OriginWhenCrossOrigin => + ReferrerPolicy::OriginWhenCrossOrigin, + ReferrerPolicyHeader::UnsafeUrl => + ReferrerPolicy::UnsafeUrl, + ReferrerPolicyHeader::StrictOrigin => + ReferrerPolicy::StrictOrigin, + ReferrerPolicyHeader::StrictOriginWhenCrossOrigin => + ReferrerPolicy::StrictOriginWhenCrossOrigin, + } + } +} + #[derive(Deserialize, Serialize)] pub enum FetchResponseMsg { // todo: should have fields for transmitted/total bytes diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index 57cdd7044c4..dd522b9cb2a 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -57,7 +57,7 @@ use dom::window::{ReflowReason, Window}; use dom::worker::TrustedWorkerAddress; use euclid::Rect; use euclid::point::Point2D; -use hyper::header::{ContentType, HttpDate, LastModified}; +use hyper::header::{ContentType, HttpDate, LastModified, Headers}; use hyper::header::ReferrerPolicy as ReferrerPolicyHeader; use hyper::mime::{Mime, SubLevel, TopLevel}; use hyper_serde::Serde; @@ -97,6 +97,7 @@ use servo_config::opts; use servo_url::ServoUrl; use std::cell::Cell; use std::collections::{hash_map, HashMap, HashSet}; +use std::ops::Deref; use std::option::Option; use std::ptr; use std::rc::Rc; @@ -1761,28 +1762,11 @@ impl ScriptThread { None => None, }; - let referrer_policy = if let Some(headers) = metadata.headers { - headers.get::().map(|h| match *h { - ReferrerPolicyHeader::NoReferrer => - ReferrerPolicy::NoReferrer, - ReferrerPolicyHeader::NoReferrerWhenDowngrade => - ReferrerPolicy::NoReferrerWhenDowngrade, - ReferrerPolicyHeader::SameOrigin => - ReferrerPolicy::SameOrigin, - ReferrerPolicyHeader::Origin => - ReferrerPolicy::Origin, - ReferrerPolicyHeader::OriginWhenCrossOrigin => - ReferrerPolicy::OriginWhenCrossOrigin, - ReferrerPolicyHeader::UnsafeUrl => - ReferrerPolicy::UnsafeUrl, - ReferrerPolicyHeader::StrictOrigin => - ReferrerPolicy::StrictOrigin, - ReferrerPolicyHeader::StrictOriginWhenCrossOrigin => - ReferrerPolicy::StrictOriginWhenCrossOrigin, - }) - } else { - None - }; + let referrer_policy = metadata.headers + .as_ref() + .map(Serde::deref) + .and_then(Headers::get::) + .map(ReferrerPolicy::from); let document = Document::new(&window, Some(&browsing_context),