From 1a242d8a5001e96f2ef779409c62c0952921f0f7 Mon Sep 17 00:00:00 2001 From: Aravind Gollakota Date: Tue, 12 Jul 2016 23:50:00 -0700 Subject: [PATCH] script: Obtain referrer policy from header --- components/script/dom/document.rs | 25 +++++++++++++++---- components/script/dom/domimplementation.rs | 1 + components/script/dom/domparser.rs | 2 ++ components/script/dom/node.rs | 3 ++- components/script/dom/xmldocument.rs | 1 + components/script/dom/xmlhttprequest.rs | 1 + components/script/parse/html.rs | 2 +- components/script/script_thread.rs | 28 ++++++++++++++++++---- 8 files changed, 52 insertions(+), 11 deletions(-) diff --git a/components/script/dom/document.rs b/components/script/dom/document.rs index 44a8e2231ea..90ac86f602a 100644 --- a/components/script/dom/document.rs +++ b/components/script/dom/document.rs @@ -1633,7 +1633,8 @@ impl Document { last_modified: Option, source: DocumentSource, doc_loader: DocumentLoader, - referrer: Option) + referrer: Option, + referrer_policy: Option) -> Document { let url = url.unwrap_or_else(|| Url::parse("about:blank").unwrap()); @@ -1652,6 +1653,17 @@ impl Document { Origin::opaque_identifier() }; + // TODO: we currently default to Some(NoReferrer) instead of None (i.e. unset) + // for an important reason. Many of the methods by which a referrer policy is communicated + // are currently unimplemented, and so in such cases we may be ignoring the desired policy. + // If the default were left unset, then in Step 7 of the Fetch algorithm we adopt + // no-referrer-when-downgrade. However, since we are potentially ignoring a stricter + // referrer policy, this might be passing too much info. Hence, we default to the + // strictest policy, which is no-referrer. + // Once other delivery methods are implemented, make the unset case really + // unset (i.e. None). + let referrer_policy = referrer_policy.or(Some(ReferrerPolicy::NoReferrer)); + Document { node: Node::new_document_node(), window: JS::from_ref(window), @@ -1718,9 +1730,8 @@ impl Document { https_state: Cell::new(HttpsState::None), touchpad_pressure_phase: Cell::new(TouchpadPressurePhase::BeforeClick), origin: origin, - //TODO - setting this for now so no Referer header set - referrer_policy: Cell::new(Some(ReferrerPolicy::NoReferrer)), referrer: referrer, + referrer_policy: Cell::new(referrer_policy), } } @@ -1738,6 +1749,7 @@ impl Document { None, DocumentSource::NotFromParser, docloader, + None, None)) } @@ -1749,7 +1761,8 @@ impl Document { last_modified: Option, source: DocumentSource, doc_loader: DocumentLoader, - referrer: Option) + referrer: Option, + referrer_policy: Option) -> Root { let document = reflect_dom_object(box Document::new_inherited(window, browsing_context, @@ -1759,7 +1772,8 @@ impl Document { last_modified, source, doc_loader, - referrer), + referrer, + referrer_policy), GlobalRef::Window(window), DocumentBinding::Wrap); { @@ -1824,6 +1838,7 @@ impl Document { None, DocumentSource::NotFromParser, DocumentLoader::new(&self.loader()), + None, None); new_doc.appropriate_template_contents_owner_document.set(Some(&new_doc)); new_doc diff --git a/components/script/dom/domimplementation.rs b/components/script/dom/domimplementation.rs index 1e29ce324b3..824cc0b88cf 100644 --- a/components/script/dom/domimplementation.rs +++ b/components/script/dom/domimplementation.rs @@ -130,6 +130,7 @@ impl DOMImplementationMethods for DOMImplementation { None, DocumentSource::NotFromParser, loader, + None, None); { diff --git a/components/script/dom/domparser.rs b/components/script/dom/domparser.rs index e47492d87e5..3964c84abcb 100644 --- a/components/script/dom/domparser.rs +++ b/components/script/dom/domparser.rs @@ -69,6 +69,7 @@ impl DOMParserMethods for DOMParser { None, DocumentSource::FromParser, loader, + None, None); parse_html(document.r(), s, url, ParseContext::Owner(None)); document.set_ready_state(DocumentReadyState::Complete); @@ -84,6 +85,7 @@ impl DOMParserMethods for DOMParser { None, DocumentSource::NotFromParser, loader, + None, None); parse_xml(document.r(), s, url, xml::ParseContext::Owner(None)); Ok(document) diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index 03ec5496efa..5cb2ac540c4 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -1721,7 +1721,8 @@ impl Node { let document = Document::new(window, None, Some((*document.url()).clone()), is_html_doc, None, - None, DocumentSource::NotFromParser, loader, None); + None, DocumentSource::NotFromParser, loader, + None, None); Root::upcast::(document) }, NodeTypeId::Element(..) => { diff --git a/components/script/dom/xmldocument.rs b/components/script/dom/xmldocument.rs index 52ebce5f55c..5f6b6e1919c 100644 --- a/components/script/dom/xmldocument.rs +++ b/components/script/dom/xmldocument.rs @@ -42,6 +42,7 @@ impl XMLDocument { last_modified, source, doc_loader, + None, None), } } diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 532c4d2ec1c..ed254f8c007 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -1242,6 +1242,7 @@ impl XMLHttpRequest { None, DocumentSource::FromParser, docloader, + None, None) } diff --git a/components/script/parse/html.rs b/components/script/parse/html.rs index e1109cfc008..659772b851b 100644 --- a/components/script/parse/html.rs +++ b/components/script/parse/html.rs @@ -280,7 +280,7 @@ pub fn parse_html_fragment(context_node: &Node, None, None, DocumentSource::FromParser, loader, - None); + None, None); // Step 2. document.set_quirks_mode(context_document.quirks_mode()); diff --git a/components/script/script_thread.rs b/components/script/script_thread.rs index aeed396fbb1..1c58226a718 100644 --- a/components/script/script_thread.rs +++ b/components/script/script_thread.rs @@ -51,8 +51,8 @@ use dom::worker::TrustedWorkerAddress; use euclid::Rect; use euclid::point::Point2D; use gfx_traits::LayerId; -use hyper::header::{ContentType, HttpDate}; -use hyper::header::{Headers, LastModified}; +use hyper::header::{ContentType, Headers, HttpDate, LastModified}; +use hyper::header::{ReferrerPolicy as ReferrerPolicyHeader}; use hyper::method::Method; use hyper::mime::{Mime, SubLevel, TopLevel}; use ipc_channel::ipc::{self, IpcSender}; @@ -65,7 +65,7 @@ use js::jsval::UndefinedValue; use js::rust::Runtime; use mem::heap_size_of_self_and_children; use msg::constellation_msg::{FrameType, LoadData, PanicMsg, PipelineId, PipelineNamespace}; -use msg::constellation_msg::{SubpageId, WindowSizeType}; +use msg::constellation_msg::{ReferrerPolicy, SubpageId, WindowSizeType}; use net_traits::LoadData as NetLoadData; use net_traits::bluetooth_thread::BluetoothMethodMsg; use net_traits::image_cache_thread::{ImageCacheChan, ImageCacheResult, ImageCacheThread}; @@ -1716,6 +1716,25 @@ 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::NoRefWhenDowngrade, + ReferrerPolicyHeader::SameOrigin => + ReferrerPolicy::SameOrigin, + ReferrerPolicyHeader::Origin => + ReferrerPolicy::Origin, + ReferrerPolicyHeader::OriginWhenCrossOrigin => + ReferrerPolicy::OriginWhenCrossOrigin, + ReferrerPolicyHeader::UnsafeUrl => + ReferrerPolicy::UnsafeUrl, + }) + } else { + None + }; + let document = Document::new(window.r(), Some(&browsing_context), Some(final_url.clone()), @@ -1724,7 +1743,8 @@ impl ScriptThread { last_modified, DocumentSource::FromParser, loader, - referrer); + referrer, + referrer_policy); if using_new_context { browsing_context.init(&document); } else {