HTTP/2 302
x-cloud-trace-context: 698ab2c9067fe4928ffd94a0719aa732
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: Wed, 31 Dec 2025 13:41:43 GMT
x-served-by: cache-bfi-krnt7300104-BFI, cache-bfi-krnt7300058-BFI, cache-sin-wsss1830097-SIN, cache-bom-vanm7210047-BOM
x-cache: MISS, MISS, MISS, MISS
x-cache-hits: 0, 0, 0, 0
x-timer: S1767188503.371698,VS0,VE299
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: 836944
date: Wed, 31 Dec 2025 13:41:43 GMT
x-served-by: cache-sin-wsss1830090-SIN, cache-sin-wsss1830075-SIN, cache-bom-vanm7210047-BOM
x-cache: MISS, HIT, HIT
x-cache-hits: 0, 2, 0
x-timer: S1767188504.684406,VS0,VE1
vary: Accept
content-length: 87
HTTP/2 200
via: 1.1 google, 1.1 varnish, 1.1 varnish, 1.1 varnish, 1.1 varnish
x-goog-stored-content-length: 146552
server: Google Frontend
content-type: text/html
x-goog-generation: 1767144100738058
x-guploader-uploadid: AHVrFxNnTEYoNalCf-1uYY4NarZw4ftAE4f8CoJSDv6jih_XDDdtTm1g5dv1D6cVVNGAGf37Zu6XFW8
cache-control: public, max-age=3600
x-frame-options: DENY
x-goog-storage-class: STANDARD
etag: "0ac8dcabea01bbf485332b00fa1e5887"
strict-transport-security: max-age=63072000
x-goog-hash: crc32c=Yda01g==, md5=Csjcq+oBu/SFMysA+h5Yhw==
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: 1767141891
x-goog-stored-content-encoding: identity
x-cloud-trace-context: 127d599ad3cbcb0155cdb1cf0e132963
last-modified: Wed, 31 Dec 2025 01:21:40 GMT
expires: Wed, 31 Dec 2025 12:36:36 GMT
referrer-policy: strict-origin-when-cross-origin
x-content-type-options: nosniff
x-goog-metageneration: 1
origin-trial: AxVILwizhbMjxFeHOn1P3R8niO1RJY/smaK4B4d1rLzc1gTaxtXMSaTi+FoigYgCw40uFRDwFcEAeqDR+vVLOW4AAABfeyJvcmlnaW4iOiJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZyIsImZlYXR1cmUiOiJQcml2YXRlQXR0cmlidXRpb25WMiIsImV4cGlyeSI6MTc0MjA3OTYwMH0=
content-encoding: gzip
accept-ranges: bytes
age: 1192
date: Wed, 31 Dec 2025 13:41:43 GMT
x-served-by: cache-bfi-kbfi7400053-BFI, cache-bfi-kbfi7400098-BFI, cache-sin-wsat1880066-SIN, cache-bom-vanm7210047-BOM
x-cache: MISS, HIT, HIT, MISS
x-cache-hits: 0, 0, 1, 0
x-timer: S1767188504.698839,VS0,VE57
vary: Accept-Encoding
content-length: 19571
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.