diff --git a/components/net/fetch/methods.rs b/components/net/fetch/methods.rs index 12aff01e9a4..4022ca6b9bb 100644 --- a/components/net/fetch/methods.rs +++ b/components/net/fetch/methods.rs @@ -23,6 +23,7 @@ use net_traits::filemanager_thread::RelativePos; use net_traits::request::{CredentialsMode, Destination, Referrer, Request, RequestMode}; use net_traits::request::{Origin, ResponseTainting, Window}; use net_traits::response::{Response, ResponseBody, ResponseType}; +use net_traits::ResourceAttribute; use net_traits::{FetchTaskTarget, NetworkError, ReferrerPolicy, ResourceFetchTiming}; use servo_url::ServoUrl; use std::borrow::Cow; @@ -88,6 +89,12 @@ pub type DoneChannel = Option<(Sender, Receiver)>; /// [Fetch](https://fetch.spec.whatwg.org#concept-fetch) pub fn fetch(request: &mut Request, target: Target, context: &FetchContext) { + // Step 7 of https://w3c.github.io/resource-timing/#processing-model + context + .timing + .lock() + .unwrap() + .set_attribute(ResourceAttribute::FetchStart); fetch_with_cors_cache(request, &mut CorsCache::new(), target, context); } diff --git a/components/net/http_loader.rs b/components/net/http_loader.rs index 1290d7754b3..0bd5a2c11b7 100644 --- a/components/net/http_loader.rs +++ b/components/net/http_loader.rs @@ -560,8 +560,6 @@ pub fn http_fetch( request.service_workers_mode = ServiceWorkersMode::None; } - // Substep 3 - // TODO(#21258) maybe set fetch_start (if this is the last resource) // Generally, we use a persistent connection, so we will also set other PerformanceResourceTiming // attributes to this as well (domain_lookup_start, domain_lookup_end, connect_start, connect_end, // secure_connection_start) @@ -695,6 +693,13 @@ pub fn http_redirect_fetch( Some(Ok(url)) => url, }; + // Step 1 of https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-fetchstart + context + .timing + .lock() + .unwrap() + .set_attribute(ResourceAttribute::FetchStart); + // Step 5 if request.redirect_count >= 20 { return Response::network_error(NetworkError::Internal("Too many redirects".into())); diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index 60377851ef4..6a38b0a8cc9 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -447,6 +447,7 @@ pub struct ResourceFetchTiming { pub redirect_count: u16, pub request_start: u64, pub response_start: u64, + pub fetch_start: u64, // pub response_end: u64, // pub redirect_start: u64, // pub redirect_end: u64, @@ -458,6 +459,7 @@ pub enum ResourceAttribute { RedirectCount(u16), RequestStart, ResponseStart, + FetchStart, } #[derive(Clone, Copy, Debug, Deserialize, MallocSizeOf, PartialEq, Serialize)] @@ -475,6 +477,7 @@ impl ResourceFetchTiming { redirect_count: 0, request_start: 0, response_start: 0, + fetch_start: 0, } } @@ -485,6 +488,7 @@ impl ResourceFetchTiming { ResourceAttribute::RedirectCount(count) => self.redirect_count = count, ResourceAttribute::RequestStart => self.request_start = precise_time_ns(), ResourceAttribute::ResponseStart => self.response_start = precise_time_ns(), + ResourceAttribute::FetchStart => self.fetch_start = precise_time_ns(), } } } diff --git a/components/script/dom/performanceresourcetiming.rs b/components/script/dom/performanceresourcetiming.rs index c4e45d74406..1a3022af1c4 100644 --- a/components/script/dom/performanceresourcetiming.rs +++ b/components/script/dom/performanceresourcetiming.rs @@ -78,7 +78,7 @@ impl PerformanceResourceTiming { entry: PerformanceEntry::new_inherited( DOMString::from(url.into_string()), DOMString::from("resource"), - fetch_start, + 0., 0., ), initiator_type: initiator_type, @@ -118,7 +118,7 @@ impl PerformanceResourceTiming { worker_start: 0., redirect_start: 0., redirect_end: 0., - fetch_start: 0., + fetch_start: resource_timing.fetch_start as f64, domain_lookup_start: 0., domain_lookup_end: 0., connect_start: 0., @@ -184,4 +184,9 @@ impl PerformanceResourceTimingMethods for PerformanceResourceTiming { // TODO Finite::wrap(self.response_start) } + + // https://w3c.github.io/resource-timing/#dom-performanceresourcetiming-fetchstart + fn FetchStart(&self) -> DOMHighResTimeStamp { + Finite::wrap(self.fetch_start) + } } diff --git a/components/script/dom/webidls/PerformanceResourceTiming.webidl b/components/script/dom/webidls/PerformanceResourceTiming.webidl index ae5d541af0b..b63f341b1c9 100644 --- a/components/script/dom/webidls/PerformanceResourceTiming.webidl +++ b/components/script/dom/webidls/PerformanceResourceTiming.webidl @@ -6,6 +6,7 @@ * https://w3c.github.io/resource-timing/ */ +// https://w3c.github.io/resource-timing/#sec-performanceresourcetiming [Exposed=(Window,Worker)] interface PerformanceResourceTiming : PerformanceEntry { readonly attribute DOMString initiatorType; @@ -13,7 +14,7 @@ interface PerformanceResourceTiming : PerformanceEntry { // readonly attribute DOMHighResTimeStamp workerStart; // readonly attribute DOMHighResTimeStamp redirectStart; // readonly attribute DOMHighResTimeStamp redirectEnd; - // readonly attribute DOMHighResTimeStamp fetchStart; + readonly attribute DOMHighResTimeStamp fetchStart; // readonly attribute DOMHighResTimeStamp domainLookupStart; // readonly attribute DOMHighResTimeStamp domainLookupEnd; // readonly attribute DOMHighResTimeStamp connectStart; @@ -27,9 +28,3 @@ interface PerformanceResourceTiming : PerformanceEntry { /// readonly attribute unsigned long long decodedBodySize; // [Default] object toJSON(); }; - -// partial interface Performance { -// void clearResourceTimings(); -// void setResourceTimingBufferSize(unsigned long maxSize); -// attribute EventHandler onresourcetimingbufferfull; -// }; diff --git a/tests/wpt/metadata/resource-timing/idlharness.any.js.ini b/tests/wpt/metadata/resource-timing/idlharness.any.js.ini index 8d744df9562..b1347bdd5ce 100644 --- a/tests/wpt/metadata/resource-timing/idlharness.any.js.ini +++ b/tests/wpt/metadata/resource-timing/idlharness.any.js.ini @@ -41,9 +41,6 @@ [PerformanceResourceTiming interface: attribute secureConnectionStart] expected: FAIL - [PerformanceResourceTiming interface: attribute fetchStart] - expected: FAIL - [PerformanceResourceTiming interface: resource must inherit property "secureConnectionStart" with the proper type] expected: FAIL @@ -83,9 +80,6 @@ [PerformanceResourceTiming interface: attribute domainLookupEnd] expected: FAIL - [PerformanceResourceTiming interface: resource must inherit property "fetchStart" with the proper type] - expected: FAIL - [PerformanceResourceTiming interface: attribute redirectStart] expected: FAIL @@ -175,9 +169,6 @@ [PerformanceResourceTiming interface: attribute secureConnectionStart] expected: FAIL - [PerformanceResourceTiming interface: attribute fetchStart] - expected: FAIL - [PerformanceResourceTiming interface: attribute workerStart] expected: FAIL