← Chrome 151 reference

v151 · navigation · behavior change · shipped

Navigation: Ignore duplicate navigations

Limited availability

  • Chrome · enabled by default 151
  • Edge · no separate signal
  • Firefox · no signal
  • Safari · no signal

This deduplication behavior is Chromium-only today: the Mozilla and WebKit standards-position threads are both recorded as “no signal”, and the HTML Standard pull request is still open. The Navigation API itself is separate and Baseline newly available (Chrome 102, Firefox 147, Safari 26.2 per webstatus.dev).

Prevents an ongoing navigation from being unnecessarily canceled by a new, identical navigation that is initiated in quick succession. This optimization improves performance and the user experience by not wasting resources on a duplicate request, which can be caused by accidental double-clicks.

Specification in flight The normative change is whatwg/html PR #11765, which is open, not merged (verified 2026-07-28) — Chrome ships the behavior ahead of the merged spec. Details on this page cite the PR text at commit 7aa3db5 (PR preview) and may shift in review; the 3-second threshold and the cookie carve-out are the two areas reviewers have explicitly probed.

at a glance

At a glance
What changesA duplicate navigation — one that exactly matches an in-flight navigation on the same navigable and starts less than 3 seconds after it — is dropped instead of canceling and replacing the ongoing navigation
WhereThe navigate algorithm in the HTML Standard (all navigation types: link clicks, location.href assignments, window.open(), navigation.navigate(), reloads) — history traversals use a different algorithm and are not affected
Window3 seconds between navigation start times (Chromium experimented with 1 s, 2 s, and 3 s and chose 3 s for the best latency reduction)
Web-observable effectsMostly silent: the first navigation simply completes. Observable via WebDriver BiDi navigation failed (status "canceled") for automation, and via navigation timing showing the first attempt's start time
Chrome statusEnabled by default in Chrome 151 (the milestone listing is authoritative, verified 2026-07-28)
Chromium gatekIgnoreDuplicateNavsFEATURE_ENABLED_BY_DEFAULT, with feature params (threshold, initiator-type skips, origin allowlist)
ChromeStatus5137490012930048 — Navigation: Ignore duplicate navigations
Source: chromestatus.com/feature/5137490012930048; whatwg/html PR #11765; whatwg/html issue #11743, July 2026.

why it exists

Users sometimes navigate to the same URL in quick succession — typically an accidental double-click on a link, or clicking a link again because the page appears not to respond. Because a new navigation takes precedence over an older one, the second navigation cancels the in-flight one: any response already on the wire is wasted, and the user's wait restarts from zero even though the first request may have been nearly complete. Chromium experimented with this optimization alongside a partner and saw significant latency improvements; ignoring the duplicate lets the first navigation finish undisturbed.

Source: whatwg/html issue #11743 — proposal; ChromeStatus motivation.

the deduplication decision (syntax / algorithm entry point)

The change inserts a deduplication step into the navigate algorithm, after the point where navigations that are downloads or that return a 404-style early exit are handled and before the new navigation is recorded as the navigable's ongoing navigation:

  1. Capture navigationStartTime at the top of navigate (the unsafe shared current time).
  2. If the navigable's ongoing navigation is non-null, compare the new navigation against the stored navigation initiation snapshot params (the match conditions below).
  3. If all match conditions hold, the new navigation is a duplicate: invoke WebDriver BiDi navigation failed for it with status "canceled" and return early — the ongoing navigation is left untouched and proceeds to completion.
  4. Otherwise, store a fresh snapshot from the new navigation's parameters, reset navigation conditions potentially changed to false, and continue the navigation as normal.
Source: whatwg/html PR #11765 diff (rendered PR preview, browsing-the-web.html), July 2026.

match conditions (inputs compared)

A new navigation is a duplicate of the ongoing navigation only when every one of these is true (comparison is against the snapshot captured when the ongoing navigation started):

Duplicate-match conditions (all must hold)
ConditionMeaning / consequence
URLs equalThe new navigation's URL equals the snapshot's URL
Initiator origins same originThe new navigation's initiator origin snapshot is same origin with the snapshot's initiator origin (null initiators and cross-origin re-triggers never deduplicate)
Both document resources nullNeither navigation carries a document resource (excludes e.g. srcdoc-style supplied content)
Same history handling behaviorIdentical NavigationHistoryBehavior ("push" vs "replace" never deduplicate)
Both form data entry lists nullForm submissions are never deduplicated (a form POST/GET carries an entry list)
Same referrer policyIdentical referrer policy
Same user navigation involvementIdentical user navigation involvement (e.g. browser-UI vs activation-behavior vs none)
Start-time delta < 3 sThe new navigation's start time minus the snapshot's start time is less than 3 seconds
Conditions unchangedThe navigable's navigation conditions potentially changed boolean is false (see the cookie carve-out)
Source: whatwg/html PR #11765 diff — deduplication step in navigate.

navigation initiation snapshot params (the stored state)

To make the comparison possible, the PR adds a navigation initiation snapshot params struct to each navigable, captured at the start of every non-duplicated navigation. Its items:

navigation initiation snapshot params — struct items
ItemTypeCaptured from
URLa URLthe navigation's URL
initiator originan origin or nullthe navigation's initiator origin snapshot
document resourcea string or nullthe navigation's document resource
history handling behaviora NavigationHistoryBehaviorthe navigation's history handling
entry listan entry list or nullthe navigation's form data entry list
referrer policya referrer policythe navigation's referrer policy
user navigation involvementa user navigation involvementthe navigation's user involvement
navigation start timea numberthe unsafe shared current time at navigation start

The snapshot is stored per navigable (top-level traversables and child navigables such as iframes deduplicate independently) and is overwritten on every navigation that is not itself dropped as a duplicate — so a third identical navigation within the window is still compared against the surviving first navigation's snapshot.

Source: whatwg/html PR #11765 diff — struct definition and snapshot-update step.

Comparing request headers — including cookies — between the two navigations was considered and rejected during design: headers are only assembled deep inside Fetch, and comparing cookie values could disclose whether an HttpOnly cookie changed between the two attempts. Instead, the PR adds a per-navigable boolean, navigation conditions potentially changed (initially false):

The residual risk the design accepts: state changes that are not visible to these setters (a cookie written by an unrelated fetch's Set-Cookie response, or a server-side change between the two attempts) do not block deduplication — the 3-second window bounds how stale the reused navigation can be.

Source: whatwg/html PR #11765 diff (cookie setter + boolean); design discussion in issue #11743 (annevk / noamr / rakina thread, October 2025); Chromium follow-ups CL 7082102 and CL 7787900 (don't ignore when cookies changed).

what a developer can observe

Observable effects of a deduplicated navigation
Page behaviorThe duplicate navigation is a silent no-op: no second fetch, no second Document, no second navigate event. The surviving (first) navigation completes and its document loads
Navigation timingThe loaded document's Navigation Timing start time reflects the first attempt — user-perceived latency is measured from the initial click, not the accidental second one (called out in the proposal as the intended observable difference)
WebDriver BiDibrowsingContext.navigationFailed fires for the dropped navigation with status "canceled", so automation does not hang waiting for a navigation that was silently dropped
navigation.navigate() promisesOpen spec question. The proposal says an ignored duplicate made via the Navigation API should reject its promise, but PR #11765 as written contains no Navigation-API promise steps (the author noted a need to inform the Navigation API about an aborted navigation not yet owned by the navigable). Treat promise behavior for deduplicated navigate() calls as unspecified until the PR resolves it
Source: whatwg/html issue #11743; PR #11765 diff (BiDi step).

edge cases and exclusions (error / non-dedup paths)

Source: whatwg/html PR #11765 diff — match conditions and early return.

context and exposure

This is a browser-engine behavior change with no new web-facing API surface: no interfaces, methods, properties, or flags for developers to call or feature-detect. It applies to every navigable (top-level and child) and every navigation type routed through navigate, independent of secure context, permissions policy, or document state, subject only to the match conditions. Chromium gates it with the kIgnoreDuplicateNavs base feature (enabled by default), which exposes Finch/feature params: duplicate_nav_threshold (default 3000 ms), skip_ignore_browser_initiated_navs (default false), skip_ignore_renderer_initiated_navs (default false), and an origin allowlist; a separate modifier kIgnoreDuplicateNavsOnlyWithUserGesture (restricting dedup to user-gesture initiations) exists but is disabled by default.

Source: Chromium content_features.cc (fetched 2026-07-28); CL 5856811 — browser-side expansion (merged).

lifecycle and timing

Ordering within a navigable: (1) a navigation starts and records its snapshot; (2) for the next 3 seconds, identical new navigations are dropped; (3) the first navigation that is not dropped — different parameters, window expired, or conditions changed — overwrites the snapshot and resets the boolean, starting a fresh dedup epoch. There is no queue, retry, or cancellation callback for the dropped navigation; idempotency is the design goal (repeating an identical navigation is defined to be redundant). Chromium's 1 s / 2 s / 3 s experiments chose 3 s for latency wins, and a reviewer note (zcorpan) flags that divergent per-browser thresholds would be an interop hazard — one reason the threshold is written into the spec PR rather than left implementation-defined.

Source: issue #11743 discussion; PR #11765 diff.

examples

Live example from the Chrome Platform Showcase — rapidly click the same navigation link and watch the duplicate get ignored while a PerformanceObserver tracks navigation counts (also: timing comparison). Source: chrome-platform-showcase (both routes HEAD-checked 200, 2026-07-28)

Observing the behavior from a page — the loaded document's timing starts at the first attempt:

// After a double-click navigation to this page, the deduplicated
// second attempt does not restart the clock:
const [nav] = performance.getEntriesByType("navigation");
console.log(nav.startTime, nav.type); // first attempt's start, "navigate"

// There is no web-platform signal that a duplicate was dropped;
// automation sees it via WebDriver BiDi:
// browsingContext.navigationFailed → status: "canceled"
Source: issue #11743 (timing observability); WebDriver BiDi — navigation failed.

browser compatibility

There is no BCD entry or webstatus feature for this deduplication change (checked 2026-07-28) — the table below uses the ChromeStatus ship data for the change itself (interim, labelled), and cites BCD api/Navigation.json for the surrounding Navigation API baseline.

Compatibility — deduplication behavior (ChromeStatus interim data)
BrowserDedup behaviorEvidence
Chrome151+ — Enabled by defaultMilestone 151 listing (verified 2026-07-28); kIgnoreDuplicateNavs enabled by default in content_features.cc
EdgeNo separate signal (Chromium-based)No public statement recorded on the ChromeStatus entry
FirefoxNo signalmozilla/standards-positions #1307
SafariNo signalWebKit/standards-positions #563; an Apple reviewer raised a network-topology concern in the proposal thread
For reference — Navigation API baseline (BCD api/Navigation.json)
BrowserNavigation API
Chrome102+
Edgemirrors Chrome
Firefox147+
Safari26.2+
Source: BCD api/Navigation.json; webstatus.dev — navigation (Baseline newly available); vendor threads linked in-table.

security and privacy

Source: whatwg/html issue #11743 — full design discussion.

specifications

SpecificationStatus
whatwg/html PR #11765 — Navigation: Add optimization to ignore duplicate navigations (preview)Open (verified 2026-07-28); one-implementer interest so far
HTML Standard — navigateLiving Standard (the algorithm the PR modifies)
WebDriver BiDi — navigation failedW3C draft (signal reused by the PR)

see also