diff options
Diffstat (limited to 'components/script/dom')
19 files changed, 93 insertions, 43 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..1b5f991ac8e 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(); @@ -1300,7 +1300,8 @@ impl HTMLMediaElement { } } }, - PlayerEvent::Error => { + PlayerEvent::Error(ref error) => { + error!("Player error: {:?}", error); self.error.set(Some(&*MediaError::new( &*window_from_node(self), MEDIA_ERR_DECODE, 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/performanceresourcetiming.rs b/components/script/dom/performanceresourcetiming.rs index 4fd7c38f1b9..9726f2c04e4 100644 --- a/components/script/dom/performanceresourcetiming.rs +++ b/components/script/dom/performanceresourcetiming.rs @@ -66,7 +66,6 @@ pub struct PerformanceResourceTiming { // TODO(#21260): domain_lookup_end // TODO(#21261): connect_start // TODO(#21262): connect_end -// TODO(#21263): response_end impl PerformanceResourceTiming { pub fn new_inherited( url: ServoUrl, @@ -126,7 +125,7 @@ impl PerformanceResourceTiming { secure_connection_start: 0., request_start: resource_timing.request_start as f64, response_start: resource_timing.response_start as f64, - response_end: 0., + response_end: resource_timing.response_end as f64, } } @@ -175,7 +174,6 @@ impl PerformanceResourceTimingMethods for PerformanceResourceTiming { // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-requeststart fn RequestStart(&self) -> DOMHighResTimeStamp { - // TODO Finite::wrap(self.request_start) } @@ -186,7 +184,6 @@ impl PerformanceResourceTimingMethods for PerformanceResourceTiming { // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-responsestart fn ResponseStart(&self) -> DOMHighResTimeStamp { - // TODO Finite::wrap(self.response_start) } @@ -199,4 +196,9 @@ impl PerformanceResourceTimingMethods for PerformanceResourceTiming { fn ConnectEnd(&self) -> DOMHighResTimeStamp { Finite::wrap(self.connect_end) } + + // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-responseend + fn ResponseEnd(&self) -> DOMHighResTimeStamp { + Finite::wrap(self.response_end) + } } 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/testbindingproxy.rs b/components/script/dom/testbindingproxy.rs index 46134a3393f..3b352acb097 100644 --- a/components/script/dom/testbindingproxy.rs +++ b/components/script/dom/testbindingproxy.rs @@ -5,13 +5,13 @@ // check-tidy: no specs after this line use crate::dom::bindings::codegen::Bindings::TestBindingProxyBinding::TestBindingProxyMethods; -use crate::dom::bindings::reflector::Reflector; use crate::dom::bindings::str::DOMString; +use crate::dom::testbinding::TestBinding; use dom_struct::dom_struct; #[dom_struct] pub struct TestBindingProxy { - reflector_: Reflector, + testbinding_: TestBinding, } impl TestBindingProxyMethods for TestBindingProxy { diff --git a/components/script/dom/webidls/PerformanceResourceTiming.webidl b/components/script/dom/webidls/PerformanceResourceTiming.webidl index df4bb747908..9fdd9c845da 100644 --- a/components/script/dom/webidls/PerformanceResourceTiming.webidl +++ b/components/script/dom/webidls/PerformanceResourceTiming.webidl @@ -22,7 +22,7 @@ interface PerformanceResourceTiming : PerformanceEntry { // readonly attribute DOMHighResTimeStamp secureConnectionStart; readonly attribute DOMHighResTimeStamp requestStart; readonly attribute DOMHighResTimeStamp responseStart; - // readonly attribute DOMHighResTimeStamp responseEnd; + readonly attribute DOMHighResTimeStamp responseEnd; /// readonly attribute unsigned long long transferSize; /// readonly attribute unsigned long long encodedBodySize; /// readonly attribute unsigned long long decodedBodySize; diff --git a/components/script/dom/webidls/Window.webidl b/components/script/dom/webidls/Window.webidl index 1679fa42887..81ffee9283e 100644 --- a/components/script/dom/webidls/Window.webidl +++ b/components/script/dom/webidls/Window.webidl @@ -72,9 +72,6 @@ Window implements GlobalEventHandlers; Window implements WindowEventHandlers; -[NoInterfaceObject] -interface WindowProxy {}; - // https://html.spec.whatwg.org/multipage/#Window-partial partial interface Window { void captureEvents(); diff --git a/components/script/dom/webidls/WindowProxy.webidl b/components/script/dom/webidls/WindowProxy.webidl new file mode 100644 index 00000000000..897f86c295b --- /dev/null +++ b/components/script/dom/webidls/WindowProxy.webidl @@ -0,0 +1,7 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +// https://html.spec.whatwg.org/multipage/#the-windowproxy-exotic-object +[NoInterfaceObject] +interface WindowProxy {}; 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 43f072ddbe0..e57e27fd8c4 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; @@ -1726,6 +1727,7 @@ impl Window { url: ServoUrl, replace: bool, force_reload: bool, + referrer: Referrer, referrer_policy: Option<ReferrerPolicy>, ) { let doc = self.Document(); @@ -1791,7 +1793,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())); |