CARVIEW |
Resource Timing Level 2
W3C Working Draft
- This version:
- https://www.w3.org/TR/2018/WD-resource-timing-2-20180517/
- Latest published version:
- https://www.w3.org/TR/resource-timing-2/
- Latest editor's draft:
- https://w3c.github.io/resource-timing/
- Previous version:
- https://www.w3.org/TR/2018/WD-resource-timing-2-20180516/
- Editors:
- Todd Reifsteck (Microsoft Corp.)
- Ilya Grigorik (Google)
- Arvind Jain (Google Inc.) (Until December 2014)
- Jatinder Mann (Microsoft Corp.) (Until February 2014)
- Zhiheng Wang (Google Inc.) (Until July 2012)
- Anderson Quach (Microsoft Corp.) (Until March 2011)
- Participate:
- GitHub w3c/resource-timing
- File a bug
- Commit history
- Pull requests
- Implementation:
- Can I use Resource Timing?
Copyright © 2018 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
Abstract
This specification defines an interface for web applications to access the complete timing information for resources in a document.
Status of This Document
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at https://www.w3.org/TR/.
Implementers SHOULD be aware that this document is not stable. Implementers who are not taking part in the discussions are likely to find the specification changing out from under them in incompatible ways. Vendors interested in implementing this document before it eventually reaches the Candidate Recommendation stage SHOULD join the aforementioned mailing lists and take part in the discussions.
This document was published by the Web Performance Working Group as a Working Draft.
This document is intended to become a W3C Recommendation.
Comments regarding this document are welcome. Please send them to
public-web-perf@w3.org
(subscribe,
archives)
with [ResourceTiming]
at the start of your email's subject.
Publication as a Working Draft does not imply endorsement by the W3C Membership. This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
This document was produced by a group operating under the W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
This document is governed by the 1 February 2018 W3C Process Document.
1. Introduction
This section is non-normative.
User latency is an important quality benchmark for Web
Applications. While JavaScript-based mechanisms can provide
comprehensive instrumentation for user latency measurements within
an application, in many cases, they are unable to provide a
complete end-to-end latency picture. This document introduces the
PerformanceResourceTiming
interface to allow JavaScript
mechanisms to collect complete timing information related to
resources on a document. Navigation Timing 2
[NAVIGATION-TIMING-2] extends this specification to provide
additional timing information associated with a navigation.
For example, the following JavaScript shows a simple attempt to measure the time it takes to fetch a resource:
<!doctype html>
<html>
<head>
</head>
<body onload="loadResources()">
<script>
function loadResources()
{
var start = new Date().getTime();
var image1 = new Image();
var resourceTiming = function() {
var now = new Date().getTime();
var latency = now - start;
alert("End to end resource fetch: " + latency);
};
image1.onload = resourceTiming;
image1.src = 'https://www.w3.org/Icons/w3c_main.png';
}
</script>
<img src="https://www.w3.org/Icons/w3c_home.png">
</body>
</html>
Though this script can measure the time it takes to fetch a resource, it cannot break down the time spent in various phases. Further, the script cannot easily measure the time it takes to fetch resources described in markup.
To address the need for complete information on user experience,
this document introduces the PerformanceResourceTiming
interface. This interface allows JavaScript mechanisms to provide
complete client-side latency measurements within applications. With
this interface, the previous example can be modified to measure a
user's perceived load time of a resource.
The following script calculates the amount of time it takes to
fetch every resource in the page, even those defined in markup.
This example assumes that this page is hosted on
https://www.w3.org. One could further measure the amount of time it
takes in every phase of fetching a resource with the
PerformanceResourceTiming
interface.
<!doctype html>
<html>
<head>
</head>
<body onload="loadResources()">
<script>
function loadResources()
{
var image1 = new Image();
image1.onload = resourceTiming;
image1.src = 'https://www.w3.org/Icons/w3c_main.png';
}
function resourceTiming()
{
var resourceList = window.performance.getEntriesByType("resource");
for (i = 0; i < resourceList.length; i++)
{
if (resourceList[i].initiatorType == "img")
{
alert("End to end resource fetch: " + (resourceList[i].responseEnd - resourceList[i].startTime));
}
}
}
</script>
<img id="image0" src="https://www.w3.org/Icons/w3c_home.png">
</body>
</html>
2. Conformance
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The key words MAY, MUST, MUST NOT, SHOULD, and SHOULD NOT are to be interpreted as described in [RFC2119].
Requirements phrased in the imperative as part of algorithms (such as "strip any leading space characters" or "return false and abort these steps") are to be interpreted with the meaning of the key word ("MUST", "SHOULD", "MAY", etc) used in introducing the algorithm.
Some conformance requirements are phrased as requirements on attributes, methods or objects. Such requirements are to be interpreted as requirements on user agents.
Conformance requirements phrased as algorithms or specific steps may be implemented in any manner, so long as the end result is equivalent. (In particular, the algorithms defined in this specification are intended to be easy to follow, and not intended to be performant.)
The IDL fragments in this specification must be interpreted as required for conforming IDL fragments, as described in the [WEBIDL-1] specification.
3. Terminology
The construction "a Foo
object", where
Foo
is actually an interface, is sometimes used
instead of the more accurate "an object implementing the interface
Foo
.
The term DOM is used to refer to the API set made available to scripts in Web applications, and does not necessarily imply the existence of an actual Document object or of any other Node objects as defined in the [DOM] specification.
A DOM attribute is said to be getting when its value is being retrieved (such as by author script), and is said to be setting when a new value is assigned to it.
The term JavaScript is used to refer to ECMA262, rather than the official term ECMAScript, since the term JavaScript is more widely known. [ECMASCRIPT]
The term resource is used to refer to elements and any other user-initiated fetches throughout this specification. For example, a resource could originate from XMLHttpRequest objects [XHR], HTML elements [HTML] such as iframe, img, script, object, embed, and link with the link type of stylesheet, and SVG elements [SVG11] such as svg.
The term cross-origin is used to mean non same origin.
The term current document refers to the document associated with the Window object's newest Document object.
Throughout this work, all time values are measured in milliseconds since the start of navigation of the document [HR-TIME-2]. For example, the start of navigation of the document occurs at time 0.
The term current time refers to the number of milliseconds since the start of navigation of the document until the current moment in time.
This definition of time is based on the High Resolution Time specification [HR-TIME-2] and is different from the definition of time used in the Navigation Timing specification [NAVIGATION-TIMING-2], where time is measured in milliseconds since midnight of January 1, 1970 (UTC).
4. Resource Timing
4.1 Introduction
This section is non-normative.
The PerformanceResourceTiming
interface facilitates
timing measurement of downloadable resources. For example, this
interface is available for XMLHttpRequest objects
[XHR], HTML elements [HTML] such as iframe, img, script, object, embed, and link with the link type of
stylesheet, and SVG
elements [SVG11] such as svg.
4.2 Resources Included in the PerformanceResourceTiming
Interface
All resources fetched
by the current browsing
or worker [WORKERS] context's MUST be included as
PerformanceResourceTiming
objects in the Performance
Timeline of the relevant context. Resources that are retrieved
from relevant
application caches or local resources MUST be included as
PerformanceResourceTiming
objects in the Performance
Timeline [PERFORMANCE-TIMELINE-2]. Resources for which the
fetch was initiated, but
was later aborted (e.g. due to a network error) MAY be included as
PerformanceResourceTiming
objects in the Performance
Timeline and MUST contain initialized attribute values for
processed substeps of the processing
model.
The rest of this section is non-normative.
Examples:
- If the same canonical URL is used as the
src
attribute of two HTMLIMG
elements, the fetch of the resource initiated by the first HTMLIMG
element SHOULD be included as aPerformanceResourceTiming
object in the Performance Timeline. The user agent might not re-request the URL for the second HTMLIMG
element, instead using the existing download it initiated for the first HTMLIMG
element. In this case, the fetch of the resource by the firstIMG
element would be the only occurrence in the Performance Timeline. - If the
src
attribute of a HTMLIMG
element is changed via script, both the fetch of the original resource as well as the fetch of the new URL would be included asPerformanceResourceTiming
objects in the Performance Timeline. - If an HTML
IFRAME
element is added via markup without specifying asrc
attribute, the user agent may load theabout:blank
document for theIFRAME
. If at a later time thesrc
attribute is changed dynamically via script, the user agent may fetch the new URL resource for theIFRAME
. In this case, only the fetch of the new URL would be included as aPerformanceResourceTiming
object in the Performance Timeline. - If an
XMLHttpRequest
is generated twice for the same canonical URL, both fetches of the resource would be included as aPerformanceResourceTiming
object in the Performance Timeline. This is because the fetch of the resource for the secondXMLHttpRequest
cannot reuse the download issued for the firstXMLHttpRequest
. - If an HTML
IFRAME
element is included on the page, then only the resource requested byIFRAME
src
attribute is included as aPerformanceResourceTiming
object in the Performance Timeline. Sub-resources requested by theIFRAME
document will be included in theIFRAME
document's Performance Timeline and not the parent document's Performance Timeline. - If an HTML
IMG
element has adata: URI
as its source [RFC2397], then this resource will not be included as aPerformanceResourceTiming
object in the Performance Timeline. By definitiondata: URI
contains embedded data and does not require a fetch. - If a resource fetch
was aborted due to a networking error (e.g. DNS, TCP, or TLS
error), then the fetch MAY be included as a
PerformanceResourceTiming
object in the Performance Timeline with initialized attribute values up to the point of failure - e.g. a TCP handshake error should report DNS timestamps for the request, and so on. - If a resource fetch is
aborted because it failed a fetch precondition (e.g. mixed content,
CORS restriction, CSP policy, etc), then this resource SHOULD NOT
not be included as a
PerformanceResourceTiming
object in the Performance Timeline.
4.3 The PerformanceResourceTiming
Interface
The PerformanceResourceTiming
interface participates in
the Performance
Timeline and extends the following attributes of the
PerformanceEntry
interface:
- name
- This attribute MUST return the resolved URL of the requested resource. This attribute MUST NOT change even if the fetch redirected to a different URL.
- entryType
- The entryType attribute MUST return the DOMString
"
resource
". - startTime
- The startTime attribute MUST return a DOMHighResTimeStamp
[HR-TIME-2] with the time immediately before the user agent
starts to queue the resource for fetching. If there are
HTTP redirects or equivalent when
fetching the resource, and if all the redirects or equivalent are
from the same origin as the
current document or the timing allow check algorithm passes,
this attribute MUST return the same value as
redirectStart
. Otherwise, this attribute MUST return the same value asfetchStart
. - duration
- The duration attribute MUST return a DOMHighResTimeStamp equal
to the difference between
responseEnd
and startTime, respectively.
[Exposed=(Window,Worker)]
interface PerformanceResourceTiming
: PerformanceEntry {
readonly attribute DOMString initiatorType
;
readonly attribute DOMString nextHopProtocol
;
readonly attribute DOMHighResTimeStamp workerStart
;
readonly attribute DOMHighResTimeStamp redirectStart
;
readonly attribute DOMHighResTimeStamp redirectEnd
;
readonly attribute DOMHighResTimeStamp fetchStart
;
readonly attribute DOMHighResTimeStamp domainLookupStart
;
readonly attribute DOMHighResTimeStamp domainLookupEnd
;
readonly attribute DOMHighResTimeStamp connectStart
;
readonly attribute DOMHighResTimeStamp connectEnd
;
readonly attribute DOMHighResTimeStamp secureConnectionStart
;
readonly attribute DOMHighResTimeStamp requestStart
;
readonly attribute DOMHighResTimeStamp responseStart
;
readonly attribute DOMHighResTimeStamp responseEnd
;
readonly attribute unsigned long long transferSize
;
readonly attribute unsigned long long encodedBodySize
;
readonly attribute unsigned long long decodedBodySize
;
[Default] object toJSON
();
};
When toJSON
is called, run [WEBIDL]'s default toJSON
operation.
On getting, the
initiatorType
attribute MUST return one of the following
DOMString
values:
- The same value as the
localName
of thatelement
[DOM], if the request is a result of processing theelement
; - "css", if the request is a result of processing a
CSS
url()
directive [CSS-SYNTAX-3], such as@import url()
orbackground: url()
; - "navigation", if the request is a navigation request;
- "xmlhttprequest", if the request is a result of processing an XMLHttpRequest object [XHR];
- "fetch", if the request is the result of processing the Fetch method [FETCH];
- "beacon", if the request is the result of processing the sendBeacon method [BEACON];
- "other", if none of the above conditions match.
On getting, the
attribute nextHopProtocol
returns the network protocol
used to fetch the resource, as identified by the ALPN Protocol ID
[RFC7301]; resources retrieved from relevant application caches
or local resources, return an empty string. The registry for
protocol identifiers lists the possible values for the
ALPN Protocol IDs. When a proxy is configured, if a tunnel
connection is established then this attribute MUST return the ALPN
Protocol ID of the tunneled protocol, otherwise it MUST return the
ALPN Protocol ID of the first hop to the proxy. In order to have
precisely one way to represent any ALPN protocol ID, the following
additional constraints apply: octets in the ALPN protocol MUST NOT
be percent-encoded if they are valid token characters except "%",
and when using percent-encoding, uppercase hex digits MUST be
used.
Note that the nextHopProtocol
attribute is
intended to identify the network protocol in use for the fetch
regardless of how it was actually negotiated; that is, even if ALPN
is not used to negotiate the network protocol, this attribute still
uses the ALPN Protocol ID's to indicate the protocol in use.
On getting, the
workerStart
attribute MUST return as follows:
-
If the current browsing or worker context's have an active worker [service-workers-1]:
- the time immediately before the user agent fires an event named `fetch` at the active worker if the worker is available.
- the time immediately before the user agent runs the worker required to service the request.
- zero, otherwise.
On getting, the
redirectStart
attribute MUST return as follows:
- The time immediately before the user agent starts to fetch the resource that initiates the redirect, if there are HTTP redirects or equivalent when fetching the resource and all the redirects or equivalent pass the timing allow check algorithm.
- zero, otherwise.
On getting, the
redirectEnd
attribute MUST return as follows:
- The time immediately after receiving the last byte of the response of the last redirect, if there are HTTP redirects or equivalent when fetching the resource and all the redirects or equivalent pass the timing allow check algorithm.
- zero, otherwise.
On getting, the
fetchStart
attribute MUST return as follows:
- The time immediately before the user agent starts to fetch the final resource in the redirection, if there are HTTP redirects or equivalent.
- The time immediately before the user agent starts to fetch the resource otherwise.
On getting, the
domainLookupStart
attribute MUST return as follows:
- The same value as
fetchStart
, if a persistent connection [RFC7230] is used or the resource is retrieved from relevant application caches or local resources. - The time immediately after the user agent before the domain data retrieval from the domain information cache, if the user agent has the domain information in cache.
- The time immediately before the user agent starts the domain name lookup for the resource, if the last non-redirected fetch of the resource passes the timing allow check algorithm.
- zero, otherwise.
On getting, the
domainLookupEnd
attribute MUST return as follows:
- The same value as
fetchStart
, if a persistent connection [RFC7230] is used or the resource is retrieved from relevant application caches or local resources. - The time immediately after the user agent ends the domain data retrieval from the domain information cache, if the user agent has the domain information in cache.
- The time immediately before the user agent finishes the domain name lookup for the resource, if the last non-redirected fetch of the resource passes the timing allow check algorithm.
- zero, otherwise.
On getting, the
connectStart
attribute MUST return as follows:
- The same value as
fetchStart
, if a persistent connection [RFC7230] is used or the resource is retrieved from relevant application caches or local resources. - The time immediately before the user agent start establishing
the connection to the server to retrieve the resource, if the last
non-redirected fetch of
the resource passes the timing allow check algorithm.
If the transport connection fails and the user agent reopens a connection,
connectStart
SHOULD return the corresponding value of the new connection. - zero, otherwise.
On getting, the
connectEnd
attribute MUST return as follows:
- The same value as
fetchStart
, if a persistent connection [RFC7230] is used or the resource is retrieved from relevant application caches or local resources. - The time immediately after the user agent finish establishing
the connection to the server to retrieve the resource, if the last
non-redirected fetch of
the resource passes the timing allow check algorithm.
The returned time MUST include the time interval to establish the transport connection, as well as other time intervals such as SSL handshake and SOCKS authentication.
If the transport connection fails and the user agent reopens a connection,
connectEnd
SHOULD return the corresponding value of the new connection. - zero, otherwise.
On getting, the
secureConnectionStart
attribute MUST return as
follows:
- The same value as
fetchStart
, if a persistent connection [RFC7230] is used or the resource is retrieved from relevant application caches or local resources. - The time immediately before the user agent starts the handshake process to secure the current connection, if a secure transport is used and the last non-redirected fetch of the resource passes the timing allow check algorithm.
- zero, otherwise.
On getting, the
requestStart
attribute MUST return as follows:
- The time immediately before the user agent starts requesting
the resource from the server, or from relevant application caches
or from local resources, if the last non-redirected fetch of the resource passes the
timing allow check algorithm.
If the transport connection fails after a request is sent and the user agent reopens a connection and resend the request,
requestStart
MUST return the corresponding values of the new request. - zero, otherwise.
On getting, the
responseStart
attribute MUST return as follows:
- The time immediately after the user agent's HTTP parser receives the first byte of the response (e.g. frame header bytes for HTTP/2, or response status line for HTTP/1.x) from relevant application caches, or from local resources or from the server if the last non-redirected fetch of the resource passes the timing allow check algorithm.
- zero, otherwise.
On getting, the
responseEnd
attribute MUST return as follows:
- The time immediately after the user agent receives the last byte of the response or immediately before the transport connection is closed, whichever comes first. The resource here can be received either from relevant application caches, local resources, or from the server.
- The time immediately before the user agent aborts the fetch due to a network error.
On getting, the
transferSize
attribute MUST return as follows:
- the size, in octets received from a HTTP-network fetch, consumed by
the response header fields and the response payload body [RFC7230] if the last
non-redirected fetch of
the resource passes the timing allow check algorithm.
If there are HTTP redirects or equivalent when navigating and if all the redirects or equivalent are from the same origin [RFC6454], this attribute SHOULD include the HTTP overhead of incurred redirects.
This attribute SHOULD include HTTP overhead (such as HTTP/1.1 chunked encoding and whitespace around header fields, including newlines, and HTTP/2 frame overhead, along with other server-to-client frames on the same stream), but SHOULD NOT include lower-layer protocol overhead (such as TLS [RFC5246]or TCP).
Note - zero otherwise, including for resources retrieved from relevant application caches or from local resources.
On getting, the
encodedBodySize
attribute MUST return as follows:
- The size, in octets, received from a HTTP-network-or-cache fetch, of the payload body [RFC7230], prior to removing any applied content-codings [RFC7231], if the last non-redirected fetch of the resource passes the timing allow check algorithm.
- The size, in octets, of the payload body prior to removing any applied content-codings if the resource is retrieved from relevant application caches or from local resources.
- zero, otherwise.
On getting, the
decodedBodySize
attribute MUST return as follows:
- The size, in octets, received from a HTTP-network-or-cache fetch, of the message body [RFC7230], after removing any applied content-codings [RFC7231], if the last non-redirected fetch of the resource passes the timing allow check algorithm.
- The size, in octets, of the payload after removing any applied content-codings, if the resource is retrieved from relevant application caches or from local resources.
- zero, otherwise.
4.4 Extensions to the Performance
Interface
The user agent MAY choose to limit how many resources are
included as PerformanceResourceTiming
objects in the
Performance
Timeline [PERFORMANCE-TIMELINE-2]. This section extends the
Performance
interface to allow controls over the number of
PerformanceResourceTiming
objects stored.
The recommended minimum number of
PerformanceResourceTiming
objects is 150, though this may be
changed by the user agent. setResourceTimingBufferSize
can be called to
request a change to this limit.
Each ECMAScript global environment has:
- a resource timing buffer size limit which should initially be 150 or greater.
- a resource timing buffer current size which is initially 0.
- a resource timing buffer full flag which is initially false.
partial interface Performance
{
void clearResourceTimings
();
void setResourceTimingBufferSize
(unsigned long maxSize);
attribute EventHandler onresourcetimingbufferfull
;
};
The Performance
interface is defined in
[HR-TIME-2].
The method clearResourceTimings
runs the following
steps:
- remove all
PerformanceResourceTiming
objects in the performance entry buffer. - set resource timing buffer current size to 0.
- set resource timing buffer full flag to false.
The setResourceTimingBufferSize
method runs the
following steps:
- Set resource timing buffer size limit to the
maxSize parameter. If the maxSize parameter is less
than resource timing buffer current size, no
PerformanceResourceTiming
objects are to be removed from the performance entry buffer. - If the maxSize parameter is greater than resource timing buffer current size, set resource timing buffer full flag to false.
The attribute onresourcetimingbufferfull
is the event
handler for the resourcetimingbufferfull event described
below.
To add a PerformanceResourceTiming entry (new entry) in the performance entry buffer, run the following steps:
- If resource timing buffer current size is less than
resource timing buffer size limit, run the following
substeps:
- Add new entry to the performance entry buffer.
- Increase resource timing buffer current size by 1.
- If resource timing buffer current size is greater than
or equal to resource timing buffer size limit and the
resource timing buffer full flag is false, run the following
substeps:
- Set the resource timing buffer full flag to true.
- Fire an event
named
resourcetimingbufferfull
at the Performance object, with itsbubbles
attribute initialized to true.
4.5 Cross-origin Resources
Cross-origin resources
MUST be included as PerformanceResourceTiming
objects in the
Performance
Timeline. If the timing allow check algorithm fails for
a cross-origin resource, these attributes of its
PerformanceResourceTiming
object MUST be set to zero:
redirectStart
, redirectEnd
, domainLookupStart
,
domainLookupEnd
, connectStart
, connectEnd
,
requestStart
, responseStart
,
secureConnectionStart
, transferSize
,
encodedBodySize
and decodedBodySize
.
Server-side applications may return the Timing-Allow-Origin HTTP response header to allow the User Agent to fully expose, to the document origin(s) specified, the values of attributes that would have been zero due to the cross-origin restrictions previously specified in this section.
4.5.1 Timing-Allow-Origin
Response Header
The Timing-Allow-Origin HTTP response header field can be used to communicate a policy indicating origin(s) that are allowed to see values of attributes that would have been zero due to the cross-origin restrictions. The header's value is represented by the following ABNF [RFC5234] (using List Extension, [RFC7230]):
Timing-Allow-Origin = 1#( origin-or-null / wildcard )
The sender MAY generate multiple Timing-Allow-Origin header fields. The recipient MAY combine multiple Timing-Allow-Origin header fields by appending each subsequent field value to the combined field value in order, separated by a comma.
The timing allow check algorithm, which checks whether a resource's timing information can be shared with the current document, is as follows:
-
If the resource is same origin, return
pass
. -
If the Timing-Allow-Origin header value list contains a case-sensitive match for the value of the
origin
of the current document, or a wildcard ("*
"), returnpass
. - Return
fail
.
5. Process
5.1 Processing Model
The following graph illustrates the timing attributes defined by the PerformanceResourceTiming interface. Attributes in parenthesis may not be available when fetching resources from different origins. User agents may perform internal processing in between timings, which allow for non-normative intervals between timings.
PerformanceResourceTiming
interface. Attributes in
parenthesis indicate that they may not be available if the resource
does not pass the timing allow check algorithm.For each resource fetched by the current browsing context, excluding resources
fetched by cross-origin stylesheets fetched with
no-cors
policy, perform the following steps:
Above cross-origin exclusion should be defined via Fetch registry: CSS needs to be defined in terms of Fetch and set some kind of "opaque request flag" for no-CORS CSS subresources. In turn, Resource Timing should interface with Fetch registry to surface resource fetch events.
- Create a new
PerformanceResourceTiming
object and set entryType to the DOMStringresource
. - Immediately before the user agent starts to queue the resource
for retrieval, record the current time in startTime,
and set
nextHopProtocol
to the empty DOMString. - Record the initiator of the resource in
initiatorType
. - Record the resolved URL
of the requested resource in name. If there is an
active
worker ([service-workers-1]) matching the current browsing
or worker context's, immediately before the user agent
runs the
worker record the time as
workerStart
, or if the worker is already available, immediately before the event named `fetch` is fired at the active worker record the time asworkerStart
. Otherwise, if there is no matching service worker registration, setworkerStart
value to zero. - Immediately before a user agent
starts the fetching process, record the current time
as
fetchStart
. LetdomainLookupStart
,domainLookupEnd
,connectStart
andconnectEnd
be the same value asfetchStart
. - If the user agent is to reuse the data from another existing or completed fetch initiated from the current document, abort the remaining steps.
- If the last non-redirected fetch of the resource fails the
timing allow check, the user agent MUST set
redirectStart
,redirectEnd
,domainLookupStart
,domainLookupEnd
,connectStart
,connectEnd
,requestStart
,responseStart
andsecureConnectionStart
to zero and go to step 16. - Let
domainLookupStart
,domainLookupEnd
,connectStart
andconnectEnd
be the same value asfetchStart
. - If the resource is fetched from the relevant application cache or local resources, including the HTTP cache [RFC7234], go to step 14.
- If no domain lookup is required, go to step 12. Otherwise, immediately before a
user agent starts the domain name lookup, record the time as
domainLookupStart
. - Record the time as
domainLookupEnd
immediately after the domain name lookup is successfully done. A user agent may need multiple retries before that. If the domain name lookup fails and resource passes the timing allow check record the time asdomainLookupEnd
and go to step 17. - If a persistent transport
connection is used to fetch the resource, let
connectStart
andconnectEnd
be the same value ofdomainLookupEnd
. Otherwise, record the time asconnectStart
immediately before initiating the connection to the server and record the time asconnectEnd
immediately after the connection to the server or the proxy is established. A user agent may need multiple retries before this time. Once connection is established set the value ofnextHopProtocol
to the ALPN ID used by the connection. If a connection can not be established, record the time up to the connection failure asconnectEnd
and go to step 17. - The user agent MUST set the
secureConnectionStart
attribute as follows:- When a secure transport is used, the user agent MUST record the
time as
secureConnectionStart
immediately before the handshake process to secure the connection. - When a secure transport is not used, the user agent MUST set
the value of
secureConnectionStart
to 0.
- When a secure transport is used, the user agent MUST record the
time as
- Immediately before a user
agent starts sending the request for the resource, record the
current time as
requestStart
. - Record the time as
responseStart
immediately after the user agent receives the first byte of the response. - Record the time as
responseEnd
immediately after receiving the last byte of the response.- Return to step 12 if the user agent fails to send the request or receive the entire response, and needs to reopen the connection.
- Set the value of
transferSize
,encodedBodySize
,decodedBodySize
to corresponding values, subject to timing allow check algorithm.
- If
responseEnd
is not set, set it to the current time. Record the difference betweenresponseEnd
and startTime in duration. - If the fetched resource results in an HTTP redirect or
equivalent, then
- If the current resource and the redirected resource are not
from the same origin as the
current document, and the timing allow check
algorithm fails for either resource, set
redirectStart
andredirectEnd
to 0. Then, return to step 5 with the new resource. - If the value of redirectStart is not set, let it be the value of fetchStart.
- Let redirectEnd be the value of responseEnd.
- Set all the attributes in the
PerformanceResourceTiming
object to 0 except startTime,redirectStart
,redirectEnd
, andinitiatorType
. - Return to step 5 with the new resource.
- If the current resource and the redirected resource are not
from the same origin as the
current document, and the timing allow check
algorithm fails for either resource, set
- Queue
the
PerformanceResourceTiming
object. - Add the
PerformanceResourceTiming
object to the performance entry buffer.
This specification does not
specify whether steps 20 and 21 should run before or after the
load
event of the resource—see issue 82 for
related discussion.
Discussion: https://www.w3.org/2016/11/30-webperf-minutes.html
Background: #55. In #79 we added a note to flag the implementation differences across browsers. Ideally, we should aim to converge on a consistent implementation:
- It would be great to get some interop tests to identify where/how existing implementations differ on whether the entry is made available before or after the load event.
- Real-world telemetry on how often developers rely on querying entry from within onload would, also, be very helpful.
5.2 Monotonic Clock
The value of the timing attributes MUST monotonically increase to ensure timing attributes are not skewed by adjustments to the system clock while fetching the resource. The difference between any two chronologically recorded timing attributes MUST never be negative. For all resources, including subdocument resources, the user agent MUST record the system clock at the beginning of the root document navigation and define subsequent timing attributes in terms of a monotonic clock measuring time elapsed from the beginning of the navigation.
6. Privacy and Security
This section is non-normative.
The PerformanceResourceTiming
interface exposes timing
information for a resource to any web page or worker that has
requested that resource. To limit the access to the
PerformanceResourceTiming
interface, the same origin policy is enforced by default
and certain attributes are set to zero, as described in 4.5 Cross-origin Resources. Resource providers can
explicitly allow all timing information to be collected for a
resource by adding the Timing-Allow-Origin HTTP response
header, which specifies the domains that are allowed to access the
timing information.
Statistical fingerprinting is a privacy concern where a
malicious web site may determine whether a user has visited a
third-party web site by measuring the timing of cache hits and
misses of resources in the third-party web site. Though the
PerformanceResourceTiming
interface gives timing information
for resources in a document, the cross-origin restrictions prevent
making this privacy concern any worse than it is today using the
load event on resources to measure timing to determine cache hits
and misses.
A. Acknowledgments
Thanks to Anne Van Kesteren, Annie Sullivan, Arvind Jain, Boris Zbarsky, Darin Fisher, Jason Weber, Jonas Sicking, James Simonsen, Karen Anderson, Kyle Scholz, Nic Jansma, Philippe Le Hegaret, Sigbjørn Vik, Steve Souders, Todd Reifsteck, Tony Gentilcore and William Chan for their contributions to this work.
B. References
B.1 Normative references
- [BEACON]
- Beacon. Ilya Grigorik; Alois Reitbauer; Arvind Jain; Jatinder Mann. W3C. 13 April 2017. W3C Candidate Recommendation. URL: https://www.w3.org/TR/beacon/
- [CSS-SYNTAX-3]
- CSS Syntax Module Level 3. Tab Atkins Jr.; Simon Sapin. W3C. 20 February 2014. W3C Candidate Recommendation. URL: https://www.w3.org/TR/css-syntax-3/
- [DOM]
- DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
- [FETCH]
- Fetch Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://fetch.spec.whatwg.org/
- [HR-TIME-2]
- High Resolution Time Level 2. Ilya Grigorik; James Simonsen; Jatinder Mann. W3C. 1 March 2018. W3C Candidate Recommendation. URL: https://www.w3.org/TR/hr-time-2/
- [HTML]
- HTML Standard. Anne van Kesteren; Domenic Denicola; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
- [HTML5]
- HTML5. Ian Hickson; Robin Berjon; Steve Faulkner; Travis Leithead; Erika Doyle Navara; Theresa O'Connor; Silvia Pfeiffer. W3C. 27 March 2018. W3C Recommendation. URL: https://www.w3.org/TR/html5/
- [PERFORMANCE-TIMELINE-2]
- Performance Timeline Level 2. Ilya Grigorik; Jatinder Mann; Zhiheng Wang. W3C. 8 December 2016. W3C Candidate Recommendation. URL: https://www.w3.org/TR/performance-timeline-2/
- [RFC2119]
- Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://tools.ietf.org/html/rfc2119
- [RFC2397]
- The "data" URL scheme. L. Masinter. IETF. August 1998. Proposed Standard. URL: https://tools.ietf.org/html/rfc2397
- [RFC5234]
- Augmented BNF for Syntax Specifications: ABNF. D. Crocker, Ed.; P. Overell. IETF. January 2008. Internet Standard. URL: https://tools.ietf.org/html/rfc5234
- [RFC6454]
- The Web Origin Concept. A. Barth. IETF. December 2011. Proposed Standard. URL: https://tools.ietf.org/html/rfc6454
- [RFC7230]
- Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing. R. Fielding, Ed.; J. Reschke, Ed.. IETF. June 2014. Proposed Standard. URL: https://tools.ietf.org/html/rfc7230
- [RFC7231]
- Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content. R. Fielding, Ed.; J. Reschke, Ed.. IETF. June 2014. Proposed Standard. URL: https://tools.ietf.org/html/rfc7231
- [RFC7234]
- Hypertext Transfer Protocol (HTTP/1.1): Caching. R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. IETF. June 2014. Proposed Standard. URL: https://tools.ietf.org/html/rfc7234
- [RFC7301]
- Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension. S. Friedl; A. Popov; A. Langley; E. Stephan. IETF. July 2014. Proposed Standard. URL: https://tools.ietf.org/html/rfc7301
- [service-workers-1]
- Service Workers 1. Alex Russell; Jungkee Song; Jake Archibald; Marijn Kruisselbrink. W3C. 2 November 2017. W3C Working Draft. URL: https://www.w3.org/TR/service-workers-1/
- [SVG11]
- Scalable Vector Graphics (SVG) 1.1 (Second Edition). Erik Dahlström; Patrick Dengler; Anthony Grasso; Chris Lilley; Cameron McCormack; Doug Schepers; Jonathan Watt; Jon Ferraiolo; Jun Fujisawa; Dean Jackson et al. W3C. 16 August 2011. W3C Recommendation. URL: https://www.w3.org/TR/SVG11/
- [WEBIDL]
- Web IDL. Cameron McCormack; Boris Zbarsky; Tobie Langel. W3C. 15 December 2016. W3C Editor's Draft. URL: https://heycam.github.io/webidl/
- [WEBIDL-1]
- WebIDL Level 1. Cameron McCormack. W3C. 15 December 2016. W3C Recommendation. URL: https://www.w3.org/TR/2016/REC-WebIDL-1-20161215/
- [WORKERS]
- Web Workers. Ian Hickson. W3C. 24 September 2015. W3C Working Draft. URL: https://www.w3.org/TR/workers/
- [XHR]
- XMLHttpRequest Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://xhr.spec.whatwg.org/
B.2 Informative references
- [ECMASCRIPT]
- ECMAScript Language Specification. Ecma International. URL: https://tc39.github.io/ecma262/
- [NAVIGATION-TIMING-2]
- Navigation Timing Level 2. Ilya Grigorik; Tobin Titus; Jatinder Mann; Arvind Jain. W3C. 5 December 2017. W3C Working Draft. URL: https://www.w3.org/TR/navigation-timing-2/
- [RFC5246]
- The Transport Layer Security (TLS) Protocol Version 1.2. T. Dierks; E. Rescorla. IETF. August 2008. Proposed Standard. URL: https://tools.ietf.org/html/rfc5246