diff options
Diffstat (limited to 'components/script/dom/performanceresourcetiming.rs')
-rw-r--r-- | components/script/dom/performanceresourcetiming.rs | 135 |
1 files changed, 82 insertions, 53 deletions
diff --git a/components/script/dom/performanceresourcetiming.rs b/components/script/dom/performanceresourcetiming.rs index 3afaef5f912..ac7791f9fed 100644 --- a/components/script/dom/performanceresourcetiming.rs +++ b/components/script/dom/performanceresourcetiming.rs @@ -2,17 +2,18 @@ * 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/. */ +use base::cross_process_instant::CrossProcessInstant; use dom_struct::dom_struct; use net_traits::ResourceFetchTiming; use servo_url::ServoUrl; +use time_03::Duration; use crate::dom::bindings::codegen::Bindings::PerformanceBinding::DOMHighResTimeStamp; use crate::dom::bindings::codegen::Bindings::PerformanceResourceTimingBinding::PerformanceResourceTimingMethods; -use crate::dom::bindings::reflector::reflect_dom_object; +use crate::dom::bindings::reflector::{reflect_dom_object, DomObject}; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::globalscope::GlobalScope; -use crate::dom::performance::reduce_timing_resolution; use crate::dom::performanceentry::PerformanceEntry; // TODO UA may choose to limit how many resources are included as PerformanceResourceTiming objects @@ -37,18 +38,30 @@ pub struct PerformanceResourceTiming { entry: PerformanceEntry, initiator_type: InitiatorType, next_hop: Option<DOMString>, - worker_start: f64, - redirect_start: f64, - redirect_end: f64, - fetch_start: f64, - domain_lookup_start: f64, - domain_lookup_end: f64, - connect_start: f64, - connect_end: f64, - secure_connection_start: f64, - request_start: f64, - response_start: f64, - response_end: f64, + #[no_trace] + worker_start: Option<CrossProcessInstant>, + #[no_trace] + redirect_start: Option<CrossProcessInstant>, + #[no_trace] + redirect_end: Option<CrossProcessInstant>, + #[no_trace] + fetch_start: Option<CrossProcessInstant>, + #[no_trace] + domain_lookup_start: Option<CrossProcessInstant>, + #[no_trace] + domain_lookup_end: Option<CrossProcessInstant>, + #[no_trace] + connect_start: Option<CrossProcessInstant>, + #[no_trace] + connect_end: Option<CrossProcessInstant>, + #[no_trace] + secure_connection_start: Option<CrossProcessInstant>, + #[no_trace] + request_start: Option<CrossProcessInstant>, + #[no_trace] + response_start: Option<CrossProcessInstant>, + #[no_trace] + response_end: Option<CrossProcessInstant>, transfer_size: u64, //size in octets encoded_body_size: u64, //size in octets decoded_body_size: u64, //size in octets @@ -66,7 +79,7 @@ impl PerformanceResourceTiming { url: ServoUrl, initiator_type: InitiatorType, next_hop: Option<DOMString>, - fetch_start: f64, + fetch_start: Option<CrossProcessInstant>, ) -> PerformanceResourceTiming { let entry_type = if initiator_type == InitiatorType::Navigation { DOMString::from("navigation") @@ -77,23 +90,23 @@ impl PerformanceResourceTiming { entry: PerformanceEntry::new_inherited( DOMString::from(url.into_string()), entry_type, - 0., - 0., + None, + Duration::ZERO, ), initiator_type, next_hop, - worker_start: 0., - redirect_start: 0., - redirect_end: 0., + worker_start: None, + redirect_start: None, + redirect_end: None, fetch_start, - domain_lookup_end: 0., - domain_lookup_start: 0., - connect_start: 0., - connect_end: 0., - secure_connection_start: 0., - request_start: 0., - response_start: 0., - response_end: 0., + domain_lookup_end: None, + domain_lookup_start: None, + connect_start: None, + connect_end: None, + secure_connection_start: None, + request_start: None, + response_start: None, + response_end: None, transfer_size: 0, encoded_body_size: 0, decoded_body_size: 0, @@ -108,28 +121,32 @@ impl PerformanceResourceTiming { next_hop: Option<DOMString>, resource_timing: &ResourceFetchTiming, ) -> PerformanceResourceTiming { + let duration = match (resource_timing.start_time, resource_timing.response_end) { + (Some(start_time), Some(end_time)) => end_time - start_time, + _ => Duration::ZERO, + }; PerformanceResourceTiming { entry: PerformanceEntry::new_inherited( DOMString::from(url.into_string()), DOMString::from("resource"), - resource_timing.start_time as f64, - resource_timing.response_end as f64 - resource_timing.start_time as f64, + resource_timing.start_time, + duration, ), initiator_type, next_hop, - worker_start: 0., - redirect_start: resource_timing.redirect_start as f64, - redirect_end: resource_timing.redirect_end as f64, - fetch_start: resource_timing.fetch_start as f64, - domain_lookup_start: resource_timing.domain_lookup_start as f64, + worker_start: None, + redirect_start: resource_timing.redirect_start, + redirect_end: resource_timing.redirect_end, + fetch_start: resource_timing.fetch_start, + domain_lookup_start: resource_timing.domain_lookup_start, //TODO (#21260) - domain_lookup_end: 0., - connect_start: resource_timing.connect_start as f64, - connect_end: resource_timing.connect_end as f64, - secure_connection_start: resource_timing.secure_connection_start as f64, - request_start: resource_timing.request_start as f64, - response_start: resource_timing.response_start as f64, - response_end: resource_timing.response_end as f64, + domain_lookup_end: None, + connect_start: resource_timing.connect_start, + connect_end: resource_timing.connect_end, + secure_connection_start: resource_timing.secure_connection_start, + request_start: resource_timing.request_start, + response_start: resource_timing.response_start, + response_end: resource_timing.response_end, transfer_size: 0, encoded_body_size: 0, decoded_body_size: 0, @@ -153,6 +170,18 @@ impl PerformanceResourceTiming { global, ) } + + /// Convert an optional [`CrossProcessInstant`] to a [`DOMHighResTimeStamp`]. If none + /// return a timestamp for [`Self::fetch_start`] instead, so that timestamps are + /// always after that time. + pub(crate) fn to_dom_high_res_time_stamp( + &self, + instant: Option<CrossProcessInstant>, + ) -> DOMHighResTimeStamp { + self.global() + .performance() + .maybe_to_dom_high_res_time_stamp(instant) + } } // https://w3c.github.io/resource-timing/ @@ -180,17 +209,17 @@ impl PerformanceResourceTimingMethods for PerformanceResourceTiming { // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-domainlookupstart fn DomainLookupStart(&self) -> DOMHighResTimeStamp { - reduce_timing_resolution(self.domain_lookup_start) + self.to_dom_high_res_time_stamp(self.domain_lookup_start) } // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-domainlookupend fn DomainLookupEnd(&self) -> DOMHighResTimeStamp { - reduce_timing_resolution(self.domain_lookup_end) + self.to_dom_high_res_time_stamp(self.domain_lookup_end) } // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-secureconnectionstart fn SecureConnectionStart(&self) -> DOMHighResTimeStamp { - reduce_timing_resolution(self.secure_connection_start) + self.to_dom_high_res_time_stamp(self.secure_connection_start) } // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-transfersize @@ -210,41 +239,41 @@ impl PerformanceResourceTimingMethods for PerformanceResourceTiming { // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-requeststart fn RequestStart(&self) -> DOMHighResTimeStamp { - reduce_timing_resolution(self.request_start) + self.to_dom_high_res_time_stamp(self.request_start) } // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-redirectstart fn RedirectStart(&self) -> DOMHighResTimeStamp { - reduce_timing_resolution(self.redirect_start) + self.to_dom_high_res_time_stamp(self.redirect_start) } // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-redirectend fn RedirectEnd(&self) -> DOMHighResTimeStamp { - reduce_timing_resolution(self.redirect_end) + self.to_dom_high_res_time_stamp(self.redirect_end) } // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-responsestart fn ResponseStart(&self) -> DOMHighResTimeStamp { - reduce_timing_resolution(self.response_start) + self.to_dom_high_res_time_stamp(self.response_start) } // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-fetchstart fn FetchStart(&self) -> DOMHighResTimeStamp { - reduce_timing_resolution(self.fetch_start) + self.to_dom_high_res_time_stamp(self.fetch_start) } // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-connectstart fn ConnectStart(&self) -> DOMHighResTimeStamp { - reduce_timing_resolution(self.connect_start) + self.to_dom_high_res_time_stamp(self.connect_start) } // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-connectend fn ConnectEnd(&self) -> DOMHighResTimeStamp { - reduce_timing_resolution(self.connect_end) + self.to_dom_high_res_time_stamp(self.connect_end) } // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-responseend fn ResponseEnd(&self) -> DOMHighResTimeStamp { - reduce_timing_resolution(self.response_end) + self.to_dom_high_res_time_stamp(self.response_end) } } |