aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom
diff options
context:
space:
mode:
authorRussell Cousineau <miller.time.baby@gmail.com>2019-03-24 23:04:17 -0700
committerRussell Cousineau <miller.time.baby@gmail.com>2019-04-19 16:50:38 -0700
commit2440e0f98ade12cf595fe7c791a1065b29b53d74 (patch)
treeea5b333151d9580ff8c690994570272f3785d305 /components/script/dom
parentf9c58ccd401253b16916d173df621b1abc27f103 (diff)
downloadservo-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.rs6
-rw-r--r--components/script/dom/htmlanchorelement.rs15
-rwxr-xr-xcomponents/script/dom/htmlformelement.rs3
-rw-r--r--components/script/dom/htmliframeelement.rs5
-rw-r--r--components/script/dom/htmlmediaelement.rs4
-rw-r--r--components/script/dom/htmlscriptelement.rs4
-rw-r--r--components/script/dom/location.rs24
-rw-r--r--components/script/dom/request.rs2
-rw-r--r--components/script/dom/serviceworkerglobalscope.rs6
-rw-r--r--components/script/dom/websocket.rs5
-rw-r--r--components/script/dom/window.rs4
-rw-r--r--components/script/dom/windowproxy.rs18
-rw-r--r--components/script/dom/workerglobalscope.rs3
-rw-r--r--components/script/dom/xmlhttprequest.rs8
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()));