diff options
author | Russell Cousineau <miller.time.baby@gmail.com> | 2019-03-24 23:04:17 -0700 |
---|---|---|
committer | Russell Cousineau <miller.time.baby@gmail.com> | 2019-04-19 16:50:38 -0700 |
commit | 2440e0f98ade12cf595fe7c791a1065b29b53d74 (patch) | |
tree | ea5b333151d9580ff8c690994570272f3785d305 /components/script/dom | |
parent | f9c58ccd401253b16916d173df621b1abc27f103 (diff) | |
download | servo-2440e0f98ade12cf595fe7c791a1065b29b53d74.tar.gz servo-2440e0f98ade12cf595fe7c791a1065b29b53d74.zip |
set referrer in window.load_url
- this conforms to follow-hyperlinks spec step 13
- this conforms to window-open spec step 14.3
- replace uses of `referrer_url` with `referrer`
- in Request class, change "no-referrer" to ""
- set websocket fetch referrer to "no-referrer"
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/dedicatedworkerglobalscope.rs | 6 | ||||
-rw-r--r-- | components/script/dom/htmlanchorelement.rs | 15 | ||||
-rwxr-xr-x | components/script/dom/htmlformelement.rs | 3 | ||||
-rw-r--r-- | components/script/dom/htmliframeelement.rs | 5 | ||||
-rw-r--r-- | components/script/dom/htmlmediaelement.rs | 4 | ||||
-rw-r--r-- | components/script/dom/htmlscriptelement.rs | 4 | ||||
-rw-r--r-- | components/script/dom/location.rs | 24 | ||||
-rw-r--r-- | components/script/dom/request.rs | 2 | ||||
-rw-r--r-- | components/script/dom/serviceworkerglobalscope.rs | 6 | ||||
-rw-r--r-- | components/script/dom/websocket.rs | 5 | ||||
-rw-r--r-- | components/script/dom/window.rs | 4 | ||||
-rw-r--r-- | components/script/dom/windowproxy.rs | 18 | ||||
-rw-r--r-- | components/script/dom/workerglobalscope.rs | 3 | ||||
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 8 |
14 files changed, 75 insertions, 32 deletions
diff --git a/components/script/dom/dedicatedworkerglobalscope.rs b/components/script/dom/dedicatedworkerglobalscope.rs index 3713b0820cb..69c4694af5c 100644 --- a/components/script/dom/dedicatedworkerglobalscope.rs +++ b/components/script/dom/dedicatedworkerglobalscope.rs @@ -36,7 +36,7 @@ use js::jsapi::{JSAutoCompartment, JSContext}; use js::jsval::UndefinedValue; use js::rust::HandleValue; use msg::constellation_msg::{PipelineId, TopLevelBrowsingContextId}; -use net_traits::request::{CredentialsMode, Destination, RequestBuilder}; +use net_traits::request::{CredentialsMode, Destination, Referrer, RequestBuilder}; use net_traits::{load_whole_resource, IpcSend}; use script_traits::{TimerEvent, TimerSource, WorkerGlobalScopeInit, WorkerScriptLoadOrigin}; use servo_rand::random; @@ -305,12 +305,14 @@ impl DedicatedWorkerGlobalScope { pipeline_id, } = worker_load_origin; + let referrer = referrer_url.map(|referrer_url| Referrer::ReferrerUrl(referrer_url)); + let request = RequestBuilder::new(worker_url.clone()) .destination(Destination::Worker) .credentials_mode(CredentialsMode::Include) .use_url_credentials(true) .pipeline_id(pipeline_id) - .referrer_url(referrer_url) + .referrer(referrer) .referrer_policy(referrer_policy) .origin(origin); diff --git a/components/script/dom/htmlanchorelement.rs b/components/script/dom/htmlanchorelement.rs index 982b08f3924..9f64a93c0ca 100644 --- a/components/script/dom/htmlanchorelement.rs +++ b/components/script/dom/htmlanchorelement.rs @@ -27,6 +27,7 @@ use crate::dom::urlhelper::UrlHelper; use crate::dom::virtualmethods::VirtualMethods; use dom_struct::dom_struct; use html5ever::{LocalName, Prefix}; +use net_traits::request::Referrer; use num_traits::ToPrimitive; use servo_url::ServoUrl; use std::default::Default; @@ -639,7 +640,7 @@ pub fn follow_hyperlink(subject: &Element, hyperlink_suffix: Option<String>) { // will have been done as part of Step 7 above // in choose_browsing_context/create_auxiliary_browsing_context. - // Step 10, 11, 12, 13. TODO: if parsing the URL failed, navigate to error page. + // Step 10, 11. TODO: if parsing the URL failed, navigate to error page. let attribute = subject.get_attribute(&ns!(), &local_name!("href")).unwrap(); let mut href = attribute.Value(); // Step 11: append a hyperlink suffix. @@ -657,8 +658,16 @@ pub fn follow_hyperlink(subject: &Element, hyperlink_suffix: Option<String>) { .get_attribute_by_name(DOMString::from_string(String::from("referrerpolicy"))) .and_then(|attribute: DomRoot<Attr>| (determine_policy_for_token(&attribute.Value()))); - // Step 13, 14. + // Step 13 + let referrer = match subject.get_attribute(&ns!(), &local_name!("rel")) { + Some(ref link_types) if link_types.Value().contains("noreferrer") => { + Referrer::NoReferrer + }, + _ => Referrer::Client, + }; + + // Step 14 debug!("following hyperlink to {}", url); - target_window.load_url(url, replace, false, referrer_policy); + target_window.load_url(url, replace, false, referrer, referrer_policy); }; } diff --git a/components/script/dom/htmlformelement.rs b/components/script/dom/htmlformelement.rs index 4b1f3611e52..31087dc11df 100755 --- a/components/script/dom/htmlformelement.rs +++ b/components/script/dom/htmlformelement.rs @@ -55,6 +55,7 @@ use html5ever::{LocalName, Prefix}; use hyper::Method; use mime::{self, Mime}; use net_traits::http_percent_encode; +use net_traits::request::Referrer; use script_traits::LoadData; use servo_rand::random; use std::borrow::ToOwned; @@ -400,8 +401,8 @@ impl HTMLFormElement { let mut load_data = LoadData::new( action_components, None, + Some(Referrer::ReferrerUrl(target_document.url())), target_document.get_referrer_policy(), - Some(target_document.url()), ); // Step 22 diff --git a/components/script/dom/htmliframeelement.rs b/components/script/dom/htmliframeelement.rs index 822484a7991..24cea710450 100644 --- a/components/script/dom/htmliframeelement.rs +++ b/components/script/dom/htmliframeelement.rs @@ -30,6 +30,7 @@ use euclid::TypedSize2D; use html5ever::{LocalName, Prefix}; use ipc_channel::ipc; use msg::constellation_msg::{BrowsingContextId, PipelineId, TopLevelBrowsingContextId}; +use net_traits::request::Referrer; use profile_traits::ipc as ProfiledIpc; use script_layout_interface::message::ReflowGoal; use script_traits::IFrameSandboxState::{IFrameSandboxed, IFrameUnsandboxed}; @@ -269,8 +270,8 @@ impl HTMLIFrameElement { let load_data = LoadData::new( url, creator_pipeline_id, + Some(Referrer::ReferrerUrl(document.url())), document.get_referrer_policy(), - Some(document.url()), ); let pipeline_id = self.pipeline_id(); @@ -295,8 +296,8 @@ impl HTMLIFrameElement { let load_data = LoadData::new( url, pipeline_id, + Some(Referrer::ReferrerUrl(document.url().clone())), document.get_referrer_policy(), - Some(document.url().clone()), ); let browsing_context_id = BrowsingContextId::new(); let top_level_browsing_context_id = window.window_proxy().top_level_browsing_context_id(); diff --git a/components/script/dom/htmlmediaelement.rs b/components/script/dom/htmlmediaelement.rs index 51170564be2..c01c1ec1a9e 100644 --- a/components/script/dom/htmlmediaelement.rs +++ b/components/script/dom/htmlmediaelement.rs @@ -64,7 +64,7 @@ use ipc_channel::router::ROUTER; use mime::{self, Mime}; use net_traits::image::base::Image; use net_traits::image_cache::ImageResponse; -use net_traits::request::{CredentialsMode, Destination, RequestBuilder}; +use net_traits::request::{CredentialsMode, Destination, Referrer, RequestBuilder}; use net_traits::{CoreResourceMsg, FetchChannels, FetchMetadata, FetchResponseListener, Metadata}; use net_traits::{NetworkError, ResourceFetchTiming, ResourceTimingType}; use script_layout_interface::HTMLMediaData; @@ -720,7 +720,7 @@ impl HTMLMediaElement { .use_url_credentials(true) .origin(document.origin().immutable().clone()) .pipeline_id(Some(self.global().pipeline_id())) - .referrer_url(Some(document.url())) + .referrer(Some(Referrer::ReferrerUrl(document.url()))) .referrer_policy(document.get_referrer_policy()); let mut current_fetch_context = self.current_fetch_context.borrow_mut(); diff --git a/components/script/dom/htmlscriptelement.rs b/components/script/dom/htmlscriptelement.rs index bf6dbe5b30a..627cfc7e779 100644 --- a/components/script/dom/htmlscriptelement.rs +++ b/components/script/dom/htmlscriptelement.rs @@ -33,7 +33,7 @@ use ipc_channel::ipc; use ipc_channel::router::ROUTER; use js::jsval::UndefinedValue; use net_traits::request::{ - CorsSettings, CredentialsMode, Destination, RequestBuilder, RequestMode, + CorsSettings, CredentialsMode, Destination, Referrer, RequestBuilder, RequestMode, }; use net_traits::{FetchMetadata, FetchResponseListener, Metadata, NetworkError}; use net_traits::{ResourceFetchTiming, ResourceTimingType}; @@ -308,7 +308,7 @@ fn fetch_a_classic_script( }) .origin(doc.origin().immutable().clone()) .pipeline_id(Some(script.global().pipeline_id())) - .referrer_url(Some(doc.url())) + .referrer(Some(Referrer::ReferrerUrl(doc.url()))) .referrer_policy(doc.get_referrer_policy()) .integrity_metadata(integrity_metadata); diff --git a/components/script/dom/location.rs b/components/script/dom/location.rs index aab7213a8f1..d6df671f451 100644 --- a/components/script/dom/location.rs +++ b/components/script/dom/location.rs @@ -13,6 +13,7 @@ use crate::dom::globalscope::GlobalScope; use crate::dom::urlhelper::UrlHelper; use crate::dom::window::Window; use dom_struct::dom_struct; +use net_traits::request::Referrer; use servo_url::{MutableOrigin, ServoUrl}; #[dom_struct] @@ -43,8 +44,9 @@ impl Location { fn set_url_component(&self, value: USVString, setter: fn(&mut ServoUrl, USVString)) { let mut url = self.window.get_url(); + let referrer = Referrer::ReferrerUrl(url.clone()); setter(&mut url, value); - self.window.load_url(url, false, false, None); + self.window.load_url(url, false, false, referrer, None); } fn check_same_origin_domain(&self) -> ErrorResult { @@ -62,7 +64,9 @@ impl Location { // https://html.spec.whatwg.org/multipage/#dom-location-reload pub fn reload_without_origin_check(&self) { - self.window.load_url(self.get_url(), true, true, None); + let url = self.get_url(); + let referrer = Referrer::ReferrerUrl(url.clone()); + self.window.load_url(url, true, true, referrer, None); } #[allow(dead_code)] @@ -79,7 +83,8 @@ impl LocationMethods for Location { // _entry settings object_. let base_url = self.window.get_url(); if let Ok(url) = base_url.join(&url.0) { - self.window.load_url(url, false, false, None); + let referrer = Referrer::ReferrerUrl(base_url.clone()); + self.window.load_url(url, false, false, referrer, None); Ok(()) } else { Err(Error::Syntax) @@ -89,7 +94,9 @@ impl LocationMethods for Location { // https://html.spec.whatwg.org/multipage/#dom-location-reload fn Reload(&self) -> ErrorResult { self.check_same_origin_domain()?; - self.window.load_url(self.get_url(), true, true, None); + let url = self.get_url(); + let referrer = Referrer::ReferrerUrl(url.clone()); + self.window.load_url(url, true, true, referrer, None); Ok(()) } @@ -100,7 +107,8 @@ impl LocationMethods for Location { // _entry settings object_. let base_url = self.window.get_url(); if let Ok(url) = base_url.join(&url.0) { - self.window.load_url(url, true, false, None); + let referrer = Referrer::ReferrerUrl(base_url.clone()); + self.window.load_url(url, true, false, referrer, None); Ok(()) } else { Err(Error::Syntax) @@ -164,11 +172,13 @@ impl LocationMethods for Location { // https://html.spec.whatwg.org/multipage/#dom-location-href fn SetHref(&self, value: USVString) -> ErrorResult { // Note: no call to self.check_same_origin_domain() - let url = match self.window.get_url().join(&value.0) { + let current_url = self.window.get_url(); + let url = match current_url.join(&value.0) { Ok(url) => url, Err(e) => return Err(Error::Type(format!("Couldn't parse URL: {}", e))), }; - self.window.load_url(url, false, false, None); + let referrer = Referrer::ReferrerUrl(current_url.clone()); + self.window.load_url(url, false, false, referrer, None); Ok(()) } diff --git a/components/script/dom/request.rs b/components/script/dom/request.rs index 647845d6835..b777dd0cb56 100644 --- a/components/script/dom/request.rs +++ b/components/script/dom/request.rs @@ -554,7 +554,7 @@ impl RequestMethods for Request { fn Referrer(&self) -> USVString { let r = self.request.borrow(); USVString(match r.referrer { - NetTraitsRequestReferrer::NoReferrer => String::from("no-referrer"), + NetTraitsRequestReferrer::NoReferrer => String::from(""), NetTraitsRequestReferrer::Client => String::from("about:client"), NetTraitsRequestReferrer::ReferrerUrl(ref u) => { let u_c = u.clone(); diff --git a/components/script/dom/serviceworkerglobalscope.rs b/components/script/dom/serviceworkerglobalscope.rs index b217cccad62..6acae53ae05 100644 --- a/components/script/dom/serviceworkerglobalscope.rs +++ b/components/script/dom/serviceworkerglobalscope.rs @@ -30,7 +30,7 @@ use ipc_channel::router::ROUTER; use js::jsapi::{JSAutoCompartment, JSContext, JS_AddInterruptCallback}; use js::jsval::UndefinedValue; use msg::constellation_msg::PipelineId; -use net_traits::request::{CredentialsMode, Destination, RequestBuilder}; +use net_traits::request::{CredentialsMode, Destination, Referrer, RequestBuilder}; use net_traits::{load_whole_resource, CustomResponseMediator, IpcSend}; use script_traits::{ ScopeThings, ServiceWorkerMsg, TimerEvent, WorkerGlobalScopeInit, WorkerScriptLoadOrigin, @@ -281,12 +281,14 @@ impl ServiceWorkerGlobalScope { pipeline_id, } = worker_load_origin; + let referrer = referrer_url.map(|referrer_url| Referrer::ReferrerUrl(referrer_url)); + let request = RequestBuilder::new(script_url.clone()) .destination(Destination::ServiceWorker) .credentials_mode(CredentialsMode::Include) .use_url_credentials(true) .pipeline_id(pipeline_id) - .referrer_url(referrer_url) + .referrer(referrer) .referrer_policy(referrer_policy) .origin(origin); diff --git a/components/script/dom/websocket.rs b/components/script/dom/websocket.rs index b1a61e6b414..794069f5522 100644 --- a/components/script/dom/websocket.rs +++ b/components/script/dom/websocket.rs @@ -31,7 +31,7 @@ use js::jsapi::{JSAutoCompartment, JSObject}; use js::jsval::UndefinedValue; use js::rust::CustomAutoRooterGuard; use js::typedarray::{ArrayBuffer, ArrayBufferView, CreateWith}; -use net_traits::request::{RequestBuilder, RequestMode}; +use net_traits::request::{Referrer, RequestBuilder, RequestMode}; use net_traits::MessageData; use net_traits::{CoreResourceMsg, FetchChannels}; use net_traits::{WebSocketDomAction, WebSocketNetworkEvent}; @@ -203,7 +203,8 @@ impl WebSocket { // Step 8. let request = RequestBuilder::new(url_record) .origin(global.origin().immutable().clone()) - .mode(RequestMode::WebSocket { protocols }); + .mode(RequestMode::WebSocket { protocols }) + .referrer(Some(Referrer::NoReferrer)); let channels = FetchChannels::WebSocket { event_sender: resource_event_sender, diff --git a/components/script/dom/window.rs b/components/script/dom/window.rs index 104060c25ba..a076bce8c95 100644 --- a/components/script/dom/window.rs +++ b/components/script/dom/window.rs @@ -87,6 +87,7 @@ use js::rust::HandleValue; use msg::constellation_msg::PipelineId; use net_traits::image_cache::{ImageCache, ImageResponder, ImageResponse}; use net_traits::image_cache::{PendingImageId, PendingImageResponse}; +use net_traits::request::Referrer; use net_traits::storage_thread::StorageType; use net_traits::{ReferrerPolicy, ResourceThreads}; use num_traits::ToPrimitive; @@ -1716,6 +1717,7 @@ impl Window { url: ServoUrl, replace: bool, force_reload: bool, + referrer: Referrer, referrer_policy: Option<ReferrerPolicy>, ) { let doc = self.Document(); @@ -1781,7 +1783,7 @@ impl Window { self.main_thread_script_chan() .send(MainThreadScriptMsg::Navigate( pipeline_id, - LoadData::new(url, Some(pipeline_id), referrer_policy, Some(doc.url())), + LoadData::new(url, Some(pipeline_id), Some(referrer), referrer_policy), replace, )) .unwrap(); diff --git a/components/script/dom/windowproxy.rs b/components/script/dom/windowproxy.rs index 8a78b661a76..12e726f1752 100644 --- a/components/script/dom/windowproxy.rs +++ b/components/script/dom/windowproxy.rs @@ -45,6 +45,7 @@ use js::JSCLASS_IS_GLOBAL; use msg::constellation_msg::BrowsingContextId; use msg::constellation_msg::PipelineId; use msg::constellation_msg::TopLevelBrowsingContextId; +use net_traits::request::Referrer; use script_traits::{AuxiliaryBrowsingContextLoadInfo, LoadData, NewLayoutInfo, ScriptMsg}; use servo_url::ServoUrl; use std::cell::Cell; @@ -281,8 +282,8 @@ impl WindowProxy { let load_data = LoadData::new( blank_url, None, + Some(Referrer::ReferrerUrl(document.url().clone())), document.get_referrer_policy(), - Some(document.url().clone()), ); let (pipeline_sender, pipeline_receiver) = ipc::channel().unwrap(); let new_layout_info = NewLayoutInfo { @@ -428,9 +429,20 @@ impl WindowProxy { Ok(url) => url, Err(_) => return None, // TODO: throw a "SyntaxError" DOMException. }; - // TODO Step 14.3, handle noreferrer flag + // Step 14.3 + let referrer = if noreferrer { + Referrer::NoReferrer + } else { + Referrer::Client + }; // Step 14.5 - target_window.load_url(url, new, false, target_document.get_referrer_policy()); + target_window.load_url( + url, + new, + false, + referrer, + target_document.get_referrer_policy(), + ); } if noopener { // Step 15 (Dis-owning has been done in create_auxiliary_browsing_context). diff --git a/components/script/dom/workerglobalscope.rs b/components/script/dom/workerglobalscope.rs index 40702c7d346..3c876b9fc50 100644 --- a/components/script/dom/workerglobalscope.rs +++ b/components/script/dom/workerglobalscope.rs @@ -213,9 +213,8 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope { .use_url_credentials(true) .origin(global_scope.origin().immutable().clone()) .pipeline_id(Some(self.upcast::<GlobalScope>().pipeline_id())) - .referrer_url(None) .referrer_policy(None); -; + let (url, source) = match load_whole_resource(request, &global_scope.resource_threads().sender()) { Err(_) => return Err(Error::Network), diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index cb1d0d06196..0b86f0eeb1c 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -59,7 +59,7 @@ use js::jsval::{JSVal, NullValue, UndefinedValue}; use js::rust::wrappers::JS_ParseJSON; use js::typedarray::{ArrayBuffer, CreateWith}; use mime::{self, Mime, Name}; -use net_traits::request::{CredentialsMode, Destination, RequestBuilder, RequestMode}; +use net_traits::request::{CredentialsMode, Destination, Referrer, RequestBuilder, RequestMode}; use net_traits::trim_http_whitespace; use net_traits::CoreResourceMsg::Fetch; use net_traits::{FetchChannels, FetchMetadata, FilteredMetadata}; @@ -653,7 +653,11 @@ impl XMLHttpRequestMethods for XMLHttpRequest { .credentials_mode(credentials_mode) .use_url_credentials(use_url_credentials) .origin(self.global().origin().immutable().clone()) - .referrer_url(self.referrer_url.clone()) + .referrer( + self.referrer_url + .clone() + .map(|referrer_url| Referrer::ReferrerUrl(referrer_url)), + ) .referrer_policy(self.referrer_policy.clone()) .pipeline_id(Some(self.global().pipeline_id())); |