mirror of
https://github.com/servo/servo.git
synced 2025-07-23 07:13:52 +01:00
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"
This commit is contained in:
parent
f9c58ccd40
commit
2440e0f98a
21 changed files with 94 additions and 58 deletions
|
@ -12,7 +12,7 @@ use ipc_channel::ipc;
|
||||||
use ipc_channel::router::ROUTER;
|
use ipc_channel::router::ROUTER;
|
||||||
use msg::constellation_msg::PipelineId;
|
use msg::constellation_msg::PipelineId;
|
||||||
use net::http_loader::{set_default_accept, set_default_accept_language};
|
use net::http_loader::{set_default_accept, set_default_accept_language};
|
||||||
use net_traits::request::{Destination, RequestBuilder};
|
use net_traits::request::{Destination, Referrer, RequestBuilder};
|
||||||
use net_traits::response::ResponseInit;
|
use net_traits::response::ResponseInit;
|
||||||
use net_traits::{CoreResourceMsg, FetchChannels, FetchMetadata, FetchResponseMsg};
|
use net_traits::{CoreResourceMsg, FetchChannels, FetchMetadata, FetchResponseMsg};
|
||||||
use net_traits::{IpcSend, NetworkError, ResourceThreads};
|
use net_traits::{IpcSend, NetworkError, ResourceThreads};
|
||||||
|
@ -109,7 +109,10 @@ impl NetworkListener {
|
||||||
.url_list
|
.url_list
|
||||||
.push(metadata.final_url.clone());
|
.push(metadata.final_url.clone());
|
||||||
|
|
||||||
self.request_builder.referrer_url = metadata.referrer.clone();
|
self.request_builder.referrer = metadata
|
||||||
|
.referrer
|
||||||
|
.clone()
|
||||||
|
.map(|referrer_url| Referrer::ReferrerUrl(referrer_url));
|
||||||
self.request_builder.referrer_policy = metadata.referrer_policy;
|
self.request_builder.referrer_policy = metadata.referrer_policy;
|
||||||
|
|
||||||
self.res_init = Some(ResponseInit {
|
self.res_init = Some(ResponseInit {
|
||||||
|
|
|
@ -162,7 +162,7 @@ pub struct RequestBuilder {
|
||||||
pub use_url_credentials: bool,
|
pub use_url_credentials: bool,
|
||||||
pub origin: ImmutableOrigin,
|
pub origin: ImmutableOrigin,
|
||||||
// XXXManishearth these should be part of the client object
|
// XXXManishearth these should be part of the client object
|
||||||
pub referrer_url: Option<ServoUrl>,
|
pub referrer: Option<Referrer>,
|
||||||
pub referrer_policy: Option<ReferrerPolicy>,
|
pub referrer_policy: Option<ReferrerPolicy>,
|
||||||
pub pipeline_id: Option<PipelineId>,
|
pub pipeline_id: Option<PipelineId>,
|
||||||
pub redirect_mode: RedirectMode,
|
pub redirect_mode: RedirectMode,
|
||||||
|
@ -188,7 +188,7 @@ impl RequestBuilder {
|
||||||
credentials_mode: CredentialsMode::Omit,
|
credentials_mode: CredentialsMode::Omit,
|
||||||
use_url_credentials: false,
|
use_url_credentials: false,
|
||||||
origin: ImmutableOrigin::new_opaque(),
|
origin: ImmutableOrigin::new_opaque(),
|
||||||
referrer_url: None,
|
referrer: None,
|
||||||
referrer_policy: None,
|
referrer_policy: None,
|
||||||
pipeline_id: None,
|
pipeline_id: None,
|
||||||
redirect_mode: RedirectMode::Follow,
|
redirect_mode: RedirectMode::Follow,
|
||||||
|
@ -265,8 +265,8 @@ impl RequestBuilder {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn referrer_url(mut self, referrer_url: Option<ServoUrl>) -> RequestBuilder {
|
pub fn referrer(mut self, referrer: Option<Referrer>) -> RequestBuilder {
|
||||||
self.referrer_url = referrer_url;
|
self.referrer = referrer;
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -313,11 +313,7 @@ impl RequestBuilder {
|
||||||
request.credentials_mode = self.credentials_mode;
|
request.credentials_mode = self.credentials_mode;
|
||||||
request.use_url_credentials = self.use_url_credentials;
|
request.use_url_credentials = self.use_url_credentials;
|
||||||
request.cache_mode = self.cache_mode;
|
request.cache_mode = self.cache_mode;
|
||||||
request.referrer = if let Some(url) = self.referrer_url {
|
request.referrer = self.referrer.unwrap_or(Referrer::Client);
|
||||||
Referrer::ReferrerUrl(url)
|
|
||||||
} else {
|
|
||||||
Referrer::NoReferrer
|
|
||||||
};
|
|
||||||
request.referrer_policy = self.referrer_policy;
|
request.referrer_policy = self.referrer_policy;
|
||||||
request.redirect_mode = self.redirect_mode;
|
request.redirect_mode = self.redirect_mode;
|
||||||
let mut url_list = self.url_list;
|
let mut url_list = self.url_list;
|
||||||
|
|
|
@ -36,7 +36,7 @@ use js::jsapi::{JSAutoCompartment, JSContext};
|
||||||
use js::jsval::UndefinedValue;
|
use js::jsval::UndefinedValue;
|
||||||
use js::rust::HandleValue;
|
use js::rust::HandleValue;
|
||||||
use msg::constellation_msg::{PipelineId, TopLevelBrowsingContextId};
|
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 net_traits::{load_whole_resource, IpcSend};
|
||||||
use script_traits::{TimerEvent, TimerSource, WorkerGlobalScopeInit, WorkerScriptLoadOrigin};
|
use script_traits::{TimerEvent, TimerSource, WorkerGlobalScopeInit, WorkerScriptLoadOrigin};
|
||||||
use servo_rand::random;
|
use servo_rand::random;
|
||||||
|
@ -305,12 +305,14 @@ impl DedicatedWorkerGlobalScope {
|
||||||
pipeline_id,
|
pipeline_id,
|
||||||
} = worker_load_origin;
|
} = worker_load_origin;
|
||||||
|
|
||||||
|
let referrer = referrer_url.map(|referrer_url| Referrer::ReferrerUrl(referrer_url));
|
||||||
|
|
||||||
let request = RequestBuilder::new(worker_url.clone())
|
let request = RequestBuilder::new(worker_url.clone())
|
||||||
.destination(Destination::Worker)
|
.destination(Destination::Worker)
|
||||||
.credentials_mode(CredentialsMode::Include)
|
.credentials_mode(CredentialsMode::Include)
|
||||||
.use_url_credentials(true)
|
.use_url_credentials(true)
|
||||||
.pipeline_id(pipeline_id)
|
.pipeline_id(pipeline_id)
|
||||||
.referrer_url(referrer_url)
|
.referrer(referrer)
|
||||||
.referrer_policy(referrer_policy)
|
.referrer_policy(referrer_policy)
|
||||||
.origin(origin);
|
.origin(origin);
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ use crate::dom::urlhelper::UrlHelper;
|
||||||
use crate::dom::virtualmethods::VirtualMethods;
|
use crate::dom::virtualmethods::VirtualMethods;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
use html5ever::{LocalName, Prefix};
|
use html5ever::{LocalName, Prefix};
|
||||||
|
use net_traits::request::Referrer;
|
||||||
use num_traits::ToPrimitive;
|
use num_traits::ToPrimitive;
|
||||||
use servo_url::ServoUrl;
|
use servo_url::ServoUrl;
|
||||||
use std::default::Default;
|
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
|
// will have been done as part of Step 7 above
|
||||||
// in choose_browsing_context/create_auxiliary_browsing_context.
|
// 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 attribute = subject.get_attribute(&ns!(), &local_name!("href")).unwrap();
|
||||||
let mut href = attribute.Value();
|
let mut href = attribute.Value();
|
||||||
// Step 11: append a hyperlink suffix.
|
// 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")))
|
.get_attribute_by_name(DOMString::from_string(String::from("referrerpolicy")))
|
||||||
.and_then(|attribute: DomRoot<Attr>| (determine_policy_for_token(&attribute.Value())));
|
.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);
|
debug!("following hyperlink to {}", url);
|
||||||
target_window.load_url(url, replace, false, referrer_policy);
|
target_window.load_url(url, replace, false, referrer, referrer_policy);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,6 +55,7 @@ use html5ever::{LocalName, Prefix};
|
||||||
use hyper::Method;
|
use hyper::Method;
|
||||||
use mime::{self, Mime};
|
use mime::{self, Mime};
|
||||||
use net_traits::http_percent_encode;
|
use net_traits::http_percent_encode;
|
||||||
|
use net_traits::request::Referrer;
|
||||||
use script_traits::LoadData;
|
use script_traits::LoadData;
|
||||||
use servo_rand::random;
|
use servo_rand::random;
|
||||||
use std::borrow::ToOwned;
|
use std::borrow::ToOwned;
|
||||||
|
@ -400,8 +401,8 @@ impl HTMLFormElement {
|
||||||
let mut load_data = LoadData::new(
|
let mut load_data = LoadData::new(
|
||||||
action_components,
|
action_components,
|
||||||
None,
|
None,
|
||||||
|
Some(Referrer::ReferrerUrl(target_document.url())),
|
||||||
target_document.get_referrer_policy(),
|
target_document.get_referrer_policy(),
|
||||||
Some(target_document.url()),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
// Step 22
|
// Step 22
|
||||||
|
|
|
@ -30,6 +30,7 @@ use euclid::TypedSize2D;
|
||||||
use html5ever::{LocalName, Prefix};
|
use html5ever::{LocalName, Prefix};
|
||||||
use ipc_channel::ipc;
|
use ipc_channel::ipc;
|
||||||
use msg::constellation_msg::{BrowsingContextId, PipelineId, TopLevelBrowsingContextId};
|
use msg::constellation_msg::{BrowsingContextId, PipelineId, TopLevelBrowsingContextId};
|
||||||
|
use net_traits::request::Referrer;
|
||||||
use profile_traits::ipc as ProfiledIpc;
|
use profile_traits::ipc as ProfiledIpc;
|
||||||
use script_layout_interface::message::ReflowGoal;
|
use script_layout_interface::message::ReflowGoal;
|
||||||
use script_traits::IFrameSandboxState::{IFrameSandboxed, IFrameUnsandboxed};
|
use script_traits::IFrameSandboxState::{IFrameSandboxed, IFrameUnsandboxed};
|
||||||
|
@ -269,8 +270,8 @@ impl HTMLIFrameElement {
|
||||||
let load_data = LoadData::new(
|
let load_data = LoadData::new(
|
||||||
url,
|
url,
|
||||||
creator_pipeline_id,
|
creator_pipeline_id,
|
||||||
|
Some(Referrer::ReferrerUrl(document.url())),
|
||||||
document.get_referrer_policy(),
|
document.get_referrer_policy(),
|
||||||
Some(document.url()),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
let pipeline_id = self.pipeline_id();
|
let pipeline_id = self.pipeline_id();
|
||||||
|
@ -295,8 +296,8 @@ impl HTMLIFrameElement {
|
||||||
let load_data = LoadData::new(
|
let load_data = LoadData::new(
|
||||||
url,
|
url,
|
||||||
pipeline_id,
|
pipeline_id,
|
||||||
|
Some(Referrer::ReferrerUrl(document.url().clone())),
|
||||||
document.get_referrer_policy(),
|
document.get_referrer_policy(),
|
||||||
Some(document.url().clone()),
|
|
||||||
);
|
);
|
||||||
let browsing_context_id = BrowsingContextId::new();
|
let browsing_context_id = BrowsingContextId::new();
|
||||||
let top_level_browsing_context_id = window.window_proxy().top_level_browsing_context_id();
|
let top_level_browsing_context_id = window.window_proxy().top_level_browsing_context_id();
|
||||||
|
|
|
@ -64,7 +64,7 @@ use ipc_channel::router::ROUTER;
|
||||||
use mime::{self, Mime};
|
use mime::{self, Mime};
|
||||||
use net_traits::image::base::Image;
|
use net_traits::image::base::Image;
|
||||||
use net_traits::image_cache::ImageResponse;
|
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::{CoreResourceMsg, FetchChannels, FetchMetadata, FetchResponseListener, Metadata};
|
||||||
use net_traits::{NetworkError, ResourceFetchTiming, ResourceTimingType};
|
use net_traits::{NetworkError, ResourceFetchTiming, ResourceTimingType};
|
||||||
use script_layout_interface::HTMLMediaData;
|
use script_layout_interface::HTMLMediaData;
|
||||||
|
@ -720,7 +720,7 @@ impl HTMLMediaElement {
|
||||||
.use_url_credentials(true)
|
.use_url_credentials(true)
|
||||||
.origin(document.origin().immutable().clone())
|
.origin(document.origin().immutable().clone())
|
||||||
.pipeline_id(Some(self.global().pipeline_id()))
|
.pipeline_id(Some(self.global().pipeline_id()))
|
||||||
.referrer_url(Some(document.url()))
|
.referrer(Some(Referrer::ReferrerUrl(document.url())))
|
||||||
.referrer_policy(document.get_referrer_policy());
|
.referrer_policy(document.get_referrer_policy());
|
||||||
|
|
||||||
let mut current_fetch_context = self.current_fetch_context.borrow_mut();
|
let mut current_fetch_context = self.current_fetch_context.borrow_mut();
|
||||||
|
|
|
@ -33,7 +33,7 @@ use ipc_channel::ipc;
|
||||||
use ipc_channel::router::ROUTER;
|
use ipc_channel::router::ROUTER;
|
||||||
use js::jsval::UndefinedValue;
|
use js::jsval::UndefinedValue;
|
||||||
use net_traits::request::{
|
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::{FetchMetadata, FetchResponseListener, Metadata, NetworkError};
|
||||||
use net_traits::{ResourceFetchTiming, ResourceTimingType};
|
use net_traits::{ResourceFetchTiming, ResourceTimingType};
|
||||||
|
@ -308,7 +308,7 @@ fn fetch_a_classic_script(
|
||||||
})
|
})
|
||||||
.origin(doc.origin().immutable().clone())
|
.origin(doc.origin().immutable().clone())
|
||||||
.pipeline_id(Some(script.global().pipeline_id()))
|
.pipeline_id(Some(script.global().pipeline_id()))
|
||||||
.referrer_url(Some(doc.url()))
|
.referrer(Some(Referrer::ReferrerUrl(doc.url())))
|
||||||
.referrer_policy(doc.get_referrer_policy())
|
.referrer_policy(doc.get_referrer_policy())
|
||||||
.integrity_metadata(integrity_metadata);
|
.integrity_metadata(integrity_metadata);
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ use crate::dom::globalscope::GlobalScope;
|
||||||
use crate::dom::urlhelper::UrlHelper;
|
use crate::dom::urlhelper::UrlHelper;
|
||||||
use crate::dom::window::Window;
|
use crate::dom::window::Window;
|
||||||
use dom_struct::dom_struct;
|
use dom_struct::dom_struct;
|
||||||
|
use net_traits::request::Referrer;
|
||||||
use servo_url::{MutableOrigin, ServoUrl};
|
use servo_url::{MutableOrigin, ServoUrl};
|
||||||
|
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
|
@ -43,8 +44,9 @@ impl Location {
|
||||||
|
|
||||||
fn set_url_component(&self, value: USVString, setter: fn(&mut ServoUrl, USVString)) {
|
fn set_url_component(&self, value: USVString, setter: fn(&mut ServoUrl, USVString)) {
|
||||||
let mut url = self.window.get_url();
|
let mut url = self.window.get_url();
|
||||||
|
let referrer = Referrer::ReferrerUrl(url.clone());
|
||||||
setter(&mut url, value);
|
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 {
|
fn check_same_origin_domain(&self) -> ErrorResult {
|
||||||
|
@ -62,7 +64,9 @@ impl Location {
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-reload
|
// https://html.spec.whatwg.org/multipage/#dom-location-reload
|
||||||
pub fn reload_without_origin_check(&self) {
|
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)]
|
#[allow(dead_code)]
|
||||||
|
@ -79,7 +83,8 @@ impl LocationMethods for Location {
|
||||||
// _entry settings object_.
|
// _entry settings object_.
|
||||||
let base_url = self.window.get_url();
|
let base_url = self.window.get_url();
|
||||||
if let Ok(url) = base_url.join(&url.0) {
|
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(())
|
Ok(())
|
||||||
} else {
|
} else {
|
||||||
Err(Error::Syntax)
|
Err(Error::Syntax)
|
||||||
|
@ -89,7 +94,9 @@ impl LocationMethods for Location {
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-reload
|
// https://html.spec.whatwg.org/multipage/#dom-location-reload
|
||||||
fn Reload(&self) -> ErrorResult {
|
fn Reload(&self) -> ErrorResult {
|
||||||
self.check_same_origin_domain()?;
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,7 +107,8 @@ impl LocationMethods for Location {
|
||||||
// _entry settings object_.
|
// _entry settings object_.
|
||||||
let base_url = self.window.get_url();
|
let base_url = self.window.get_url();
|
||||||
if let Ok(url) = base_url.join(&url.0) {
|
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(())
|
Ok(())
|
||||||
} else {
|
} else {
|
||||||
Err(Error::Syntax)
|
Err(Error::Syntax)
|
||||||
|
@ -164,11 +172,13 @@ impl LocationMethods for Location {
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-location-href
|
// https://html.spec.whatwg.org/multipage/#dom-location-href
|
||||||
fn SetHref(&self, value: USVString) -> ErrorResult {
|
fn SetHref(&self, value: USVString) -> ErrorResult {
|
||||||
// Note: no call to self.check_same_origin_domain()
|
// 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,
|
Ok(url) => url,
|
||||||
Err(e) => return Err(Error::Type(format!("Couldn't parse URL: {}", e))),
|
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(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -554,7 +554,7 @@ impl RequestMethods for Request {
|
||||||
fn Referrer(&self) -> USVString {
|
fn Referrer(&self) -> USVString {
|
||||||
let r = self.request.borrow();
|
let r = self.request.borrow();
|
||||||
USVString(match r.referrer {
|
USVString(match r.referrer {
|
||||||
NetTraitsRequestReferrer::NoReferrer => String::from("no-referrer"),
|
NetTraitsRequestReferrer::NoReferrer => String::from(""),
|
||||||
NetTraitsRequestReferrer::Client => String::from("about:client"),
|
NetTraitsRequestReferrer::Client => String::from("about:client"),
|
||||||
NetTraitsRequestReferrer::ReferrerUrl(ref u) => {
|
NetTraitsRequestReferrer::ReferrerUrl(ref u) => {
|
||||||
let u_c = u.clone();
|
let u_c = u.clone();
|
||||||
|
|
|
@ -30,7 +30,7 @@ use ipc_channel::router::ROUTER;
|
||||||
use js::jsapi::{JSAutoCompartment, JSContext, JS_AddInterruptCallback};
|
use js::jsapi::{JSAutoCompartment, JSContext, JS_AddInterruptCallback};
|
||||||
use js::jsval::UndefinedValue;
|
use js::jsval::UndefinedValue;
|
||||||
use msg::constellation_msg::PipelineId;
|
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 net_traits::{load_whole_resource, CustomResponseMediator, IpcSend};
|
||||||
use script_traits::{
|
use script_traits::{
|
||||||
ScopeThings, ServiceWorkerMsg, TimerEvent, WorkerGlobalScopeInit, WorkerScriptLoadOrigin,
|
ScopeThings, ServiceWorkerMsg, TimerEvent, WorkerGlobalScopeInit, WorkerScriptLoadOrigin,
|
||||||
|
@ -281,12 +281,14 @@ impl ServiceWorkerGlobalScope {
|
||||||
pipeline_id,
|
pipeline_id,
|
||||||
} = worker_load_origin;
|
} = worker_load_origin;
|
||||||
|
|
||||||
|
let referrer = referrer_url.map(|referrer_url| Referrer::ReferrerUrl(referrer_url));
|
||||||
|
|
||||||
let request = RequestBuilder::new(script_url.clone())
|
let request = RequestBuilder::new(script_url.clone())
|
||||||
.destination(Destination::ServiceWorker)
|
.destination(Destination::ServiceWorker)
|
||||||
.credentials_mode(CredentialsMode::Include)
|
.credentials_mode(CredentialsMode::Include)
|
||||||
.use_url_credentials(true)
|
.use_url_credentials(true)
|
||||||
.pipeline_id(pipeline_id)
|
.pipeline_id(pipeline_id)
|
||||||
.referrer_url(referrer_url)
|
.referrer(referrer)
|
||||||
.referrer_policy(referrer_policy)
|
.referrer_policy(referrer_policy)
|
||||||
.origin(origin);
|
.origin(origin);
|
||||||
|
|
||||||
|
|
|
@ -31,7 +31,7 @@ use js::jsapi::{JSAutoCompartment, JSObject};
|
||||||
use js::jsval::UndefinedValue;
|
use js::jsval::UndefinedValue;
|
||||||
use js::rust::CustomAutoRooterGuard;
|
use js::rust::CustomAutoRooterGuard;
|
||||||
use js::typedarray::{ArrayBuffer, ArrayBufferView, CreateWith};
|
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::MessageData;
|
||||||
use net_traits::{CoreResourceMsg, FetchChannels};
|
use net_traits::{CoreResourceMsg, FetchChannels};
|
||||||
use net_traits::{WebSocketDomAction, WebSocketNetworkEvent};
|
use net_traits::{WebSocketDomAction, WebSocketNetworkEvent};
|
||||||
|
@ -203,7 +203,8 @@ impl WebSocket {
|
||||||
// Step 8.
|
// Step 8.
|
||||||
let request = RequestBuilder::new(url_record)
|
let request = RequestBuilder::new(url_record)
|
||||||
.origin(global.origin().immutable().clone())
|
.origin(global.origin().immutable().clone())
|
||||||
.mode(RequestMode::WebSocket { protocols });
|
.mode(RequestMode::WebSocket { protocols })
|
||||||
|
.referrer(Some(Referrer::NoReferrer));
|
||||||
|
|
||||||
let channels = FetchChannels::WebSocket {
|
let channels = FetchChannels::WebSocket {
|
||||||
event_sender: resource_event_sender,
|
event_sender: resource_event_sender,
|
||||||
|
|
|
@ -87,6 +87,7 @@ use js::rust::HandleValue;
|
||||||
use msg::constellation_msg::PipelineId;
|
use msg::constellation_msg::PipelineId;
|
||||||
use net_traits::image_cache::{ImageCache, ImageResponder, ImageResponse};
|
use net_traits::image_cache::{ImageCache, ImageResponder, ImageResponse};
|
||||||
use net_traits::image_cache::{PendingImageId, PendingImageResponse};
|
use net_traits::image_cache::{PendingImageId, PendingImageResponse};
|
||||||
|
use net_traits::request::Referrer;
|
||||||
use net_traits::storage_thread::StorageType;
|
use net_traits::storage_thread::StorageType;
|
||||||
use net_traits::{ReferrerPolicy, ResourceThreads};
|
use net_traits::{ReferrerPolicy, ResourceThreads};
|
||||||
use num_traits::ToPrimitive;
|
use num_traits::ToPrimitive;
|
||||||
|
@ -1716,6 +1717,7 @@ impl Window {
|
||||||
url: ServoUrl,
|
url: ServoUrl,
|
||||||
replace: bool,
|
replace: bool,
|
||||||
force_reload: bool,
|
force_reload: bool,
|
||||||
|
referrer: Referrer,
|
||||||
referrer_policy: Option<ReferrerPolicy>,
|
referrer_policy: Option<ReferrerPolicy>,
|
||||||
) {
|
) {
|
||||||
let doc = self.Document();
|
let doc = self.Document();
|
||||||
|
@ -1781,7 +1783,7 @@ impl Window {
|
||||||
self.main_thread_script_chan()
|
self.main_thread_script_chan()
|
||||||
.send(MainThreadScriptMsg::Navigate(
|
.send(MainThreadScriptMsg::Navigate(
|
||||||
pipeline_id,
|
pipeline_id,
|
||||||
LoadData::new(url, Some(pipeline_id), referrer_policy, Some(doc.url())),
|
LoadData::new(url, Some(pipeline_id), Some(referrer), referrer_policy),
|
||||||
replace,
|
replace,
|
||||||
))
|
))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
|
@ -45,6 +45,7 @@ use js::JSCLASS_IS_GLOBAL;
|
||||||
use msg::constellation_msg::BrowsingContextId;
|
use msg::constellation_msg::BrowsingContextId;
|
||||||
use msg::constellation_msg::PipelineId;
|
use msg::constellation_msg::PipelineId;
|
||||||
use msg::constellation_msg::TopLevelBrowsingContextId;
|
use msg::constellation_msg::TopLevelBrowsingContextId;
|
||||||
|
use net_traits::request::Referrer;
|
||||||
use script_traits::{AuxiliaryBrowsingContextLoadInfo, LoadData, NewLayoutInfo, ScriptMsg};
|
use script_traits::{AuxiliaryBrowsingContextLoadInfo, LoadData, NewLayoutInfo, ScriptMsg};
|
||||||
use servo_url::ServoUrl;
|
use servo_url::ServoUrl;
|
||||||
use std::cell::Cell;
|
use std::cell::Cell;
|
||||||
|
@ -281,8 +282,8 @@ impl WindowProxy {
|
||||||
let load_data = LoadData::new(
|
let load_data = LoadData::new(
|
||||||
blank_url,
|
blank_url,
|
||||||
None,
|
None,
|
||||||
|
Some(Referrer::ReferrerUrl(document.url().clone())),
|
||||||
document.get_referrer_policy(),
|
document.get_referrer_policy(),
|
||||||
Some(document.url().clone()),
|
|
||||||
);
|
);
|
||||||
let (pipeline_sender, pipeline_receiver) = ipc::channel().unwrap();
|
let (pipeline_sender, pipeline_receiver) = ipc::channel().unwrap();
|
||||||
let new_layout_info = NewLayoutInfo {
|
let new_layout_info = NewLayoutInfo {
|
||||||
|
@ -428,9 +429,20 @@ impl WindowProxy {
|
||||||
Ok(url) => url,
|
Ok(url) => url,
|
||||||
Err(_) => return None, // TODO: throw a "SyntaxError" DOMException.
|
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
|
// 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 {
|
if noopener {
|
||||||
// Step 15 (Dis-owning has been done in create_auxiliary_browsing_context).
|
// Step 15 (Dis-owning has been done in create_auxiliary_browsing_context).
|
||||||
|
|
|
@ -213,9 +213,8 @@ impl WorkerGlobalScopeMethods for WorkerGlobalScope {
|
||||||
.use_url_credentials(true)
|
.use_url_credentials(true)
|
||||||
.origin(global_scope.origin().immutable().clone())
|
.origin(global_scope.origin().immutable().clone())
|
||||||
.pipeline_id(Some(self.upcast::<GlobalScope>().pipeline_id()))
|
.pipeline_id(Some(self.upcast::<GlobalScope>().pipeline_id()))
|
||||||
.referrer_url(None)
|
|
||||||
.referrer_policy(None);
|
.referrer_policy(None);
|
||||||
;
|
|
||||||
let (url, source) =
|
let (url, source) =
|
||||||
match load_whole_resource(request, &global_scope.resource_threads().sender()) {
|
match load_whole_resource(request, &global_scope.resource_threads().sender()) {
|
||||||
Err(_) => return Err(Error::Network),
|
Err(_) => return Err(Error::Network),
|
||||||
|
|
|
@ -59,7 +59,7 @@ use js::jsval::{JSVal, NullValue, UndefinedValue};
|
||||||
use js::rust::wrappers::JS_ParseJSON;
|
use js::rust::wrappers::JS_ParseJSON;
|
||||||
use js::typedarray::{ArrayBuffer, CreateWith};
|
use js::typedarray::{ArrayBuffer, CreateWith};
|
||||||
use mime::{self, Mime, Name};
|
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::trim_http_whitespace;
|
||||||
use net_traits::CoreResourceMsg::Fetch;
|
use net_traits::CoreResourceMsg::Fetch;
|
||||||
use net_traits::{FetchChannels, FetchMetadata, FilteredMetadata};
|
use net_traits::{FetchChannels, FetchMetadata, FilteredMetadata};
|
||||||
|
@ -653,7 +653,11 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
|
||||||
.credentials_mode(credentials_mode)
|
.credentials_mode(credentials_mode)
|
||||||
.use_url_credentials(use_url_credentials)
|
.use_url_credentials(use_url_credentials)
|
||||||
.origin(self.global().origin().immutable().clone())
|
.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())
|
.referrer_policy(self.referrer_policy.clone())
|
||||||
.pipeline_id(Some(self.global().pipeline_id()));
|
.pipeline_id(Some(self.global().pipeline_id()));
|
||||||
|
|
||||||
|
|
|
@ -94,10 +94,6 @@ impl Drop for FetchCanceller {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn from_referrer_to_referrer_url(request: &NetTraitsRequest) -> Option<ServoUrl> {
|
|
||||||
request.referrer.to_url().map(|url| url.clone())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn request_init_from_request(request: NetTraitsRequest) -> RequestBuilder {
|
fn request_init_from_request(request: NetTraitsRequest) -> RequestBuilder {
|
||||||
RequestBuilder {
|
RequestBuilder {
|
||||||
method: request.method.clone(),
|
method: request.method.clone(),
|
||||||
|
@ -118,7 +114,7 @@ fn request_init_from_request(request: NetTraitsRequest) -> RequestBuilder {
|
||||||
.origin()
|
.origin()
|
||||||
.immutable()
|
.immutable()
|
||||||
.clone(),
|
.clone(),
|
||||||
referrer_url: from_referrer_to_referrer_url(&request),
|
referrer: Some(request.referrer.clone()),
|
||||||
referrer_policy: request.referrer_policy,
|
referrer_policy: request.referrer_policy,
|
||||||
pipeline_id: request.pipeline_id,
|
pipeline_id: request.pipeline_id,
|
||||||
redirect_mode: request.redirect_mode,
|
redirect_mode: request.redirect_mode,
|
||||||
|
|
|
@ -3336,7 +3336,7 @@ impl ScriptThread {
|
||||||
.credentials_mode(CredentialsMode::Include)
|
.credentials_mode(CredentialsMode::Include)
|
||||||
.use_url_credentials(true)
|
.use_url_credentials(true)
|
||||||
.pipeline_id(Some(id))
|
.pipeline_id(Some(id))
|
||||||
.referrer_url(load_data.referrer_url)
|
.referrer(load_data.referrer)
|
||||||
.referrer_policy(load_data.referrer_policy)
|
.referrer_policy(load_data.referrer_policy)
|
||||||
.headers(load_data.headers)
|
.headers(load_data.headers)
|
||||||
.body(load_data.data)
|
.body(load_data.data)
|
||||||
|
|
|
@ -22,7 +22,7 @@ use ipc_channel::ipc;
|
||||||
use ipc_channel::router::ROUTER;
|
use ipc_channel::router::ROUTER;
|
||||||
use mime::{self, Mime};
|
use mime::{self, Mime};
|
||||||
use net_traits::request::{
|
use net_traits::request::{
|
||||||
CorsSettings, CredentialsMode, Destination, RequestBuilder, RequestMode,
|
CorsSettings, CredentialsMode, Destination, Referrer, RequestBuilder, RequestMode,
|
||||||
};
|
};
|
||||||
use net_traits::{
|
use net_traits::{
|
||||||
FetchMetadata, FetchResponseListener, FilteredMetadata, Metadata, NetworkError, ReferrerPolicy,
|
FetchMetadata, FetchResponseListener, FilteredMetadata, Metadata, NetworkError, ReferrerPolicy,
|
||||||
|
@ -326,7 +326,7 @@ impl<'a> StylesheetLoader<'a> {
|
||||||
})
|
})
|
||||||
.origin(document.origin().immutable().clone())
|
.origin(document.origin().immutable().clone())
|
||||||
.pipeline_id(Some(self.elem.global().pipeline_id()))
|
.pipeline_id(Some(self.elem.global().pipeline_id()))
|
||||||
.referrer_url(Some(document.url()))
|
.referrer(Some(Referrer::ReferrerUrl(document.url())))
|
||||||
.referrer_policy(referrer_policy)
|
.referrer_policy(referrer_policy)
|
||||||
.integrity_metadata(integrity_metadata);
|
.integrity_metadata(integrity_metadata);
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,7 @@ use msg::constellation_msg::{BrowsingContextId, HistoryStateId, PipelineId};
|
||||||
use msg::constellation_msg::{PipelineNamespaceId, TopLevelBrowsingContextId, TraversalDirection};
|
use msg::constellation_msg::{PipelineNamespaceId, TopLevelBrowsingContextId, TraversalDirection};
|
||||||
use net_traits::image::base::Image;
|
use net_traits::image::base::Image;
|
||||||
use net_traits::image_cache::ImageCache;
|
use net_traits::image_cache::ImageCache;
|
||||||
|
use net_traits::request::Referrer;
|
||||||
use net_traits::storage_thread::StorageType;
|
use net_traits::storage_thread::StorageType;
|
||||||
use net_traits::{FetchResponseMsg, ReferrerPolicy, ResourceThreads};
|
use net_traits::{FetchResponseMsg, ReferrerPolicy, ResourceThreads};
|
||||||
use pixels::PixelFormat;
|
use pixels::PixelFormat;
|
||||||
|
@ -139,10 +140,10 @@ pub struct LoadData {
|
||||||
pub data: Option<Vec<u8>>,
|
pub data: Option<Vec<u8>>,
|
||||||
/// The result of evaluating a javascript scheme url.
|
/// The result of evaluating a javascript scheme url.
|
||||||
pub js_eval_result: Option<JsEvalResult>,
|
pub js_eval_result: Option<JsEvalResult>,
|
||||||
|
/// The referrer.
|
||||||
|
pub referrer: Option<Referrer>,
|
||||||
/// The referrer policy.
|
/// The referrer policy.
|
||||||
pub referrer_policy: Option<ReferrerPolicy>,
|
pub referrer_policy: Option<ReferrerPolicy>,
|
||||||
/// The referrer URL.
|
|
||||||
pub referrer_url: Option<ServoUrl>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The result of evaluating a javascript scheme url.
|
/// The result of evaluating a javascript scheme url.
|
||||||
|
@ -160,8 +161,8 @@ impl LoadData {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
url: ServoUrl,
|
url: ServoUrl,
|
||||||
creator_pipeline_id: Option<PipelineId>,
|
creator_pipeline_id: Option<PipelineId>,
|
||||||
|
referrer: Option<Referrer>,
|
||||||
referrer_policy: Option<ReferrerPolicy>,
|
referrer_policy: Option<ReferrerPolicy>,
|
||||||
referrer_url: Option<ServoUrl>,
|
|
||||||
) -> LoadData {
|
) -> LoadData {
|
||||||
LoadData {
|
LoadData {
|
||||||
url: url,
|
url: url,
|
||||||
|
@ -170,8 +171,8 @@ impl LoadData {
|
||||||
headers: HeaderMap::new(),
|
headers: HeaderMap::new(),
|
||||||
data: None,
|
data: None,
|
||||||
js_eval_result: None,
|
js_eval_result: None,
|
||||||
|
referrer: referrer,
|
||||||
referrer_policy: referrer_policy,
|
referrer_policy: referrer_policy,
|
||||||
referrer_url: referrer_url,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,5 @@
|
||||||
[request-init-001.sub.html]
|
[request-init-001.sub.html]
|
||||||
type: testharness
|
type: testharness
|
||||||
[Check referrer init value of and associated getter]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
||||||
[Check referrerPolicy init value of and associated getter]
|
[Check referrerPolicy init value of and associated getter]
|
||||||
expected: FAIL
|
expected: FAIL
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue