HTTP/2 302
x-cloud-trace-context: bbe12ca10e1d1c4adc352bc333b9ebea
location: /en-US/docs/Web/API/Navigation_timing_API
via: 1.1 google, 1.1 varnish, 1.1 varnish, 1.1 varnish, 1.1 varnish
accept-ranges: bytes
cache-control: no-store
server: Google Frontend
content-type: text/plain; charset=utf-8
date: Sun, 28 Dec 2025 21:50:19 GMT
x-served-by: cache-bfi-krnt7300021-BFI, cache-bfi-krnt7300058-BFI, cache-sin-wsss1830097-SIN, cache-bom-vanm7210068-BOM
x-cache: MISS, MISS, MISS, MISS
x-cache-hits: 0, 0, 0, 0
x-timer: S1766958619.453911,VS0,VE384
vary: Accept
content-length: 63
HTTP/2 301
server: Google Frontend
location: /en-US/docs/Web/API/Performance_API/Navigation_timing
via: 1.1 google, 1.1 varnish, 1.1 varnish, 1.1 varnish
x-cloud-trace-context: b8df2d67b849f201a7cca0cbfa627abd
cache-control: max-age=2592000,public
content-type: text/plain; charset=utf-8
accept-ranges: bytes
age: 607060
date: Sun, 28 Dec 2025 21:50:19 GMT
x-served-by: cache-sin-wsss1830090-SIN, cache-sin-wsss1830075-SIN, cache-bom-vanm7210068-BOM
x-cache: MISS, HIT, HIT
x-cache-hits: 0, 2, 0
x-timer: S1766958620.851419,VS0,VE1
vary: Accept
content-length: 87
HTTP/2 200
x-goog-stored-content-length: 146546
x-goog-metageneration: 1
referrer-policy: strict-origin-when-cross-origin
expires: Sun, 28 Dec 2025 21:24:10 GMT
x-goog-hash: crc32c=IkdjCA==, md5=aKjfcvrbMjuviJfySjDkgQ==
content-security-policy: default-src 'self'; script-src 'report-sample' 'self' 'wasm-unsafe-eval' https://www.google-analytics.com/analytics.js https://*.googletagmanager.com assets.codepen.io production-assets.codepen.io https://js.stripe.com 'sha256-XNBp89FG76amD8BqrJzyflxOF9PaWPqPqvJfKZPCv7M=' 'sha256-YCNoU9DNiinACbd8n6UPyB/8vj0kXvhkOni9/06SuYw=' 'sha256-PZjP7OR6mBEtnvXIZfCZ5PuOlxoDF1LDZL8aj8c42rw='; script-src-elem 'report-sample' 'self' 'wasm-unsafe-eval' https://www.google-analytics.com/analytics.js https://*.googletagmanager.com assets.codepen.io production-assets.codepen.io https://js.stripe.com 'sha256-XNBp89FG76amD8BqrJzyflxOF9PaWPqPqvJfKZPCv7M=' 'sha256-YCNoU9DNiinACbd8n6UPyB/8vj0kXvhkOni9/06SuYw=' 'sha256-PZjP7OR6mBEtnvXIZfCZ5PuOlxoDF1LDZL8aj8c42rw='; style-src 'report-sample' 'self' 'unsafe-inline'; object-src 'none'; base-uri 'self'; connect-src 'self' developer.allizom.org bcd.developer.allizom.org bcd.developer.mozilla.org updates.developer.allizom.org updates.developer.mozilla.org https://*.google-analytics.com https://*.analytics.google.com https://*.googletagmanager.com https://incoming.telemetry.mozilla.org https://observatory-api.mdn.allizom.net https://observatory-api.mdn.mozilla.net https://api.github.com/search/issues stats.g.doubleclick.net https://api.stripe.com; font-src 'self'; frame-src 'self' mdn.github.io *.mdnplay.dev *.mdnyalp.dev *.play.test.mdn.allizom.net https://v2.scrimba.com https://scrimba.com jsfiddle.net www.youtube-nocookie.com codepen.io survey.alchemer.com https://js.stripe.com; img-src 'self' data: *.githubusercontent.com *.googleusercontent.com *.gravatar.com mozillausercontent.com firefoxusercontent.com profile.stage.mozaws.net profile.accounts.firefox.com developer.mozilla.org mdn.dev wikipedia.org upload.wikimedia.org https://mdn.github.io/shared-assets/ https://mdn.dev/ https://*.google-analytics.com https://*.googletagmanager.com www.gstatic.com; manifest-src 'self'; media-src 'self' archive.org videos.cdn.mozilla.net https://mdn.github.io/shared-assets/; child-src 'self'; worker-src 'self';
x-goog-meta-goog-reserved-file-mtime: 1766882943
x-frame-options: DENY
x-goog-stored-content-encoding: identity
x-goog-generation: 1766884186000510
via: 1.1 google, 1.1 varnish, 1.1 varnish, 1.1 varnish, 1.1 varnish
server: Google Frontend
origin-trial: AxVILwizhbMjxFeHOn1P3R8niO1RJY/smaK4B4d1rLzc1gTaxtXMSaTi+FoigYgCw40uFRDwFcEAeqDR+vVLOW4AAABfeyJvcmlnaW4iOiJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZyIsImZlYXR1cmUiOiJQcml2YXRlQXR0cmlidXRpb25WMiIsImV4cGlyeSI6MTc0MjA3OTYwMH0=
last-modified: Sun, 28 Dec 2025 01:09:46 GMT
x-goog-storage-class: STANDARD
x-cloud-trace-context: fa380ff9e6bdb301bcd075a70fa74062
x-content-type-options: nosniff
content-type: text/html
etag: "68a8df72fadb323baf8897f24a30e481"
cache-control: public, max-age=3600
x-guploader-uploadid: AHVrFxP0IVogQ9n7AeYAuP3y6im9C3itKBdWTtxCGCtY10arB44wZAT45NtcjRPiVkvndLkXHszEpGQ
strict-transport-security: max-age=63072000
content-encoding: gzip
accept-ranges: bytes
age: 757
date: Sun, 28 Dec 2025 21:50:20 GMT
x-served-by: cache-bfi-kbfi7400069-BFI, cache-bfi-kbfi7400098-BFI, cache-sin-wsat1880066-SIN, cache-bom-vanm7210068-BOM
x-cache: MISS, HIT, HIT, MISS
x-cache-hits: 0, 1, 1, 0
x-timer: S1766958620.865742,VS0,VE157
vary: Accept-Encoding
content-length: 19572
Navigation timing - Web APIs | MDN
Figure 1. Navigation timestamps (source ).
The document navigation timestamps (in addition to those from Resource Timing ) are:
startTime : Always 0.
unloadEventStart : (if there is a previous document) the timestamp immediately before the current document's unload event handler starts.
unloadEventEnd : (if there is a previous document) the timestamp immediately after the current document's unload event handler completes.
domInteractive : timestamp when DOM construction is finished and interaction with it from JavaScript is possible.
domContentLoadedEventStart : timestamp immediately before the current document's DOMContentLoaded event handler starts.
domContentLoadedEventEnd : timestamp immediately after the current document's DOMContentLoaded event handler completes.
domComplete : timestamp when the document and all sub-resources have finished loading.
loadEventStart : timestamp immediately before the current document's load event handler starts.
loadEventEnd : timestamp immediately after the current document's load event handler completes.
The PerformanceNavigationTiming interface provides additional properties such as redirectCount returning the number of redirects and type indicating the type of navigation.
The domContentLoadedEventEnd and domContentLoadedEventStart timestamps can be used to measure how long it takes to process the DOMContentLoaded event handler.
This example uses a PerformanceObserver , which notifies the caller about new navigation performance entries as they are recorded in the browser's performance timeline. The example uses the buffered option to access entries that were recorded before the observer was created.
const observer = new PerformanceObserver((list) => {
list.getEntries().forEach((entry) => {
const domContentLoadedTime =
entry.domContentLoadedEventEnd - entry.domContentLoadedEventStart;
console.log(
`${entry.name}: DOMContentLoaded processing time: ${domContentLoadedTime}ms`,
);
});
});
observer.observe({ type: "navigation", buffered: true });
For more examples, see the property pages in the PerformanceNavigationTiming reference documentation.