<!--
Copyright 2020 The Chromium Authors
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<!--
This file is used to generate a comprehensive list of Navigation histograms
along with a detailed description for each histogram.

For best practices on writing histogram descriptions, see
https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md

Please follow the instructions in the OWNERS file in this directory to find a
reviewer. If no OWNERS file exists, please consider signing up at
go/reviewing-metrics (Googlers only), as all subdirectories are expected to
have an OWNERS file. As a last resort you can send the CL to
chromium-metrics-reviews@google.com.
-->

<histogram-configuration>

<histograms>

<variants name="DuplicateNavTargetScope">
  <variant name="" summary="for all sites"/>
  <variant name=".OnTargetOrigins"
      summary="for navigations to origins in the IgnoreDuplicateNavsOrigins
               feature param"/>
</variants>

<variants name="FrameTypes">
  <variant name="MainFrame"/>
  <variant name="Subframe"/>
</variants>

<variants name="Initiator">
  <variant name=".BrowserInitiated" summary="browser initiated"/>
  <variant name=".RendererInitiated" summary="renderer initiated"/>
</variants>

<variants name="InitiatorType">
  <variant name="All" summary="any"/>
  <variant name="FromAd" summary="ad-initiated"/>
  <variant name="NotFromAd" summary="non-ad-initiated"/>
</variants>

<variants name="NavigationMode">
  <variant name="" summary="both gesture nav mode and 3 button mode"/>
  <variant name=".3ButtonMode" summary="only 3-button mode"/>
  <variant name=".GestureMode" summary="only gesture nav mode"/>
</variants>

<variants name="NavigationProcessType">
  <variant name=".CrossProcess" summary="Cross process navigation."/>
  <variant name=".SameProcess" summary="Same process navigation."/>
</variants>

<variants name="NavigationSite">
  <variant name="" summary="for all sites"/>
  <variant name=".GoogleSearch" summary="for Google Search"/>
</variants>

<variants name="NavigationStage">
  <variant name="Commit"/>
  <variant name="SwapRFH"/>
</variants>

<variants name="NavigationThrottleConditions">
  <variant name="" summary="any kinds of events"/>
  <variant name=".Request" summary="start or redirect request events"/>
</variants>

<variants name="NavigationThrottleEvents">
  <variant name="WillFailRequest"/>
  <variant name="WillProcessResponse"/>
  <variant name="WillRedirectRequest"/>
  <variant name="WillStartRequest"/>
</variants>

<variants name="OffTheRecordStatus">
  <variant name="" summary="for all navigations"/>
  <variant name=".OffTheRecord" summary="for off-the-record navigations"/>
</variants>

<!-- LINT.IfChange(PagePreloadingTriggerType) -->

<variants name="PreloadingTriggerType">
  <variant name=".Embedder_BookmarkBar"/>
  <variant name=".Embedder_DefaultSearchEngine"/>
  <variant name=".Embedder_DirectURLInput"/>
  <variant name=".Embedder_NewTabPage"/>
  <variant name=".Embedder_PrewarmDefaultSearchEngine"/>
  <variant name=".Embedder_WebView"/>
  <variant name=".SpeculationRule"/>
  <variant name=".SpeculationRuleFromAutoSpeculationRules"/>
  <variant name=".SpeculationRuleFromIsolatedWorld"/>
</variants>

<!-- LINT.ThenChange(//tools/metrics/histograms/metadata/page/histograms.xml:PagePreloadingTriggerType) -->

<!-- LINT.IfChange(ProcessReuseOnCOOPType) -->

<variants name="ProcessReuseOnCOOPType">
  <variant name="DifferentSiteInstance"/>
  <variant name="None"/>
  <variant name="Prerender"/>
  <variant name="SameSiteNavigationInSingleWebContents"/>
</variants>

<!-- LINT.ThenChange(//content/browser/renderer_host/render_frame_host_manager.cc:ProcessReuseOnCOOPType) -->

<variants name="RegularOrMHTMLType">
  <variant name="MHTML"/>
  <variant name="Regular"/>
</variants>

<variants name="SiteRelation">
  <variant name="CrossSite"/>
  <variant name="SameSite"/>
</variants>

<variants name="TracedMethod">
  <variant name="AgentSchedulingGroup.CreateFrame"
      summary="AgentSchedulingGroup::CreateFrame()"/>
  <variant name="AgentSchedulingGroup.CreateWebView"
      summary="AgentSchedulingGroup::CreateWebView()"/>
  <variant name="AgentSchedulingGroupHost.RemoveRoute"
      summary="AgentSchedulingGroupHost::RemoveRoute()"/>
  <variant name="Document.DispatchUnloadEvents"
      summary="Document::DispatchUnloadEvents()"/>
  <variant name="DocumentAssociatedDataDestructor"
      summary="DocumentAssociatedData destructor"/>
  <variant name="DocumentLoader.CommitNavigation"
      summary="DocumentLoader::CommitNavigation()"/>
  <variant name="DocumentLoader.DidCommitNavigation"
      summary="DocumentLoader::DidCommitNavigation()"/>
  <variant name="Frame.SwapImpl.CloneState"
      summary="Frame::SwapImpl() cloning state to new LocalFrame"/>
  <variant name="Frame.SwapImpl.CloneState.Page"
      summary="Frame::SwapImpl() cloning state to new LocalFrame's Page"/>
  <variant name="Frame.SwapImpl.Local"
      summary="Frame::SwapImpl() with LocalFrame"/>
  <variant name="Frame.SwapImpl.Remote"
      summary="Frame::SwapImpl() with RemoteFrame"/>
  <variant name="FrameLoader.CommitDocumentLoader"
      summary="FrameLoader::CommitDocumentLoader()"/>
  <variant name="FrameLoader.CommitNavigation"
      summary="FrameLoader::CommitNavigation()"/>
  <variant name="FrameLoader.DetachDocument"
      summary="FrameLoader::DetachDocument()"/>
  <variant
      name="FrameLoader.DispatchUnloadEventAndFillOldDocInfo.CommitInFrame"
      summary="FrameLoader::DispatchUnloadEventAndFillOldDocumentInfoIfNeeded()
               for commiting"/>
  <variant name="FrameLoader.DispatchUnloadEventAndFillOldDocInfo.Other"
      summary="FrameLoader::DispatchUnloadEventAndFillOldDocumentInfoIfNeeded()
               for others"/>
  <variant name="LocalFrame.DetachImpl.Remove"
      summary="LocalFrame::DetachImpl() for removal"/>
  <variant name="LocalFrame.DetachImpl.Swap"
      summary="LocalFrame::DetachImpl() for swapping"/>
  <variant name="LocalFrame.SwapIn" summary="LocalFrame::SwapIn()"/>
  <variant name="PendingDeletionCheckCompletedOnSubtree"
      summary="RenderFrameHostImpl::PendingDeletionCheckCompletedOnSubtree()"/>
  <variant name="ProxyImpl.ReleaseLayerTreeFrameSinkOnImpl"
      summary="ProxyImpl::ReleaseLayerTreeFrameSinkOnImpl()"/>
  <variant name="ProxyMain.ReleaseLayerTreeFrameSink"
      summary="ProxyMain::ReleaseLayerTreeFrameSink()"/>
  <variant name="RenderFrameHostImpl.DeleteRenderFrame"
      summary="RenderFrameHostImpl::DeleteRenderFrame()"/>
  <variant name="RenderFrameImpl.FrameDetached"
      summary="RenderFrameImpl::FrameDetached()"/>
  <variant name="ResetChildren" summary="RenderFrameHostImpl::ResetChildren()"/>
  <variant name="StartPendingDeletionOnSubtree.Detach"
      summary="RenderFrameHostImpl::StartPendingDeletionOnSubtree() for
               detaching"/>
  <variant name="StartPendingDeletionOnSubtree.LoopDetach"
      summary="RenderFrameHostImpl::StartPendingDeletionOnSubtree() for
               swapping, children looping part"/>
  <variant name="StartPendingDeletionOnSubtree.LoopSwappedOut"
      summary="RenderFrameHostImpl::StartPendingDeletionOnSubtree() for
               detaching, children looping part"/>
  <variant name="StartPendingDeletionOnSubtree.SwappedOut"
      summary="RenderFrameHostImpl::StartPendingDeletionOnSubtree() for
               swapping"/>
  <variant name="WebFrameWidgetImpl.Close"
      summary="WebFrameWidgetImpl::Close()"/>
</variants>

<histogram name="BackForwardCache.AllSites.EvictedAfterDocumentRestoredReason"
    enum="BackForwardCacheEvictedAfterDocumentRestoredReason"
    expires_after="2024-07-07">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records the reason why the page is evicted from the back-forward cache but
    after the document is restored. This happens when there is a race between
    eviction and restoring. This also records when the page is restored to
    calculate how often this eviction happens.

    This is recorded for all websites regardless whether back-forward cache is
    enabled or not.
  </summary>
</histogram>

<histogram name="BackForwardCache.AllSites.HistoryNavigationOutcome"
    enum="BackForwardCacheHistoryNavigationOutcome" expires_after="2027-02-14">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When navigating back to a page in the session history, this records whether
    the page was restored from the BackForwardCache or not.

    This is recorded for all websites regardless whether back-forward cache is
    enabled or not.
  </summary>
</histogram>

<histogram
    name="BackForwardCache.AllSites.HistoryNavigationOutcome.BlocklistedFeature"
    enum="WebSchedulerTrackedFeature" expires_after="2027-01-03">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When navigating back to a page in the session history, this records what
    blocklisted features were used when the page was loaded and prevented this
    page from being stored in the back-forward cache. Multiple blocklisted
    features can be recorded for the same page.

    This is recorded for all websites regardless whether back-forward cache is
    enabled or not.
  </summary>
</histogram>

<histogram
    name="BackForwardCache.AllSites.HistoryNavigationOutcome.BrowsingInstanceNotSwappedReason"
    enum="BackForwardCacheBrowsingInstanceNotSwappedReason"
    expires_after="2024-11-17">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When navigating back to a page in the session history and the
    BackForwardCache wasn't used because of the other active WebContents objects
    in the BrowsingInstance, this records the reason why the browsing instance
    wasn't swapped.

    This is recorded for all websites regardless whether back-forward cache is
    enabled or not.
  </summary>
</histogram>

<histogram
    name="BackForwardCache.AllSites.HistoryNavigationOutcome.DisabledForRenderFrameHostReason2"
    enum="BackForwardCacheDisabledForRenderFrameHostReason2"
    expires_after="2024-07-07">
  <owner>fergal@chromium.org</owner>
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    For history navigations, records the reason passed to
    BackForwardCache::DisableForRenderFrameHost calls.

    The metric is recorded when a history navigation commits and emits a sample
    for each reason. Compare this with
    BackForwardCache.HistoryNavigationOutcome, which contains the total number
    of navigations which where not cached

    This is recorded for all websites regardless whether back-forward cache is
    enabled or not.
  </summary>
</histogram>

<histogram
    name="BackForwardCache.AllSites.HistoryNavigationOutcome.NotRestoredReason"
    enum="BackForwardCacheNotRestoredReason" expires_after="2027-01-03">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When navigating back to a page in the session history, record why it wasn't
    restored from the cache. The page might not have entered the back-forward in
    the first place based on the features used, or it might have been evicted
    while being in the cache.

    This is recorded for all websites regardless of whether back-forward cache
    is enabled or not.
  </summary>
</histogram>

<histogram name="BackForwardCache.CCNS.CookieChangeCause"
    enum="CookieChangeCause" expires_after="2026-12-27">
  <owner>leimy@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Logs the cause of a cookie change for a page.

    This is recorded every time when a page receives cookie change if it's
    listening for it.
  </summary>
</histogram>

<histogram name="BackForwardCache.CCNS.CookieChangeInfo.{CountType}"
    units="count" expires_after="2026-10-25">
  <owner>leimy@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Logs the {CountType} cookie change details for a page.

    This is recorded during navigation away from any page configured with
    Cache-Control: no-store, at the moment the browser checks if the page can be
    stored in the BFCache.
  </summary>
  <token key="CountType">
    <variant name="AllCookies"/>
    <variant name="HttpOnlyCookies"/>
  </token>
</histogram>

<histogram name="BackForwardCache.CCNS.JSNetworkRequestIncludesCredentials"
    enum="Boolean" expires_after="2026-12-27">
  <owner>leimy@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Logs the whether ThreadableLoader request includes the credentials.

    This is recorded every time when the ThreadableLoader receives response that
    contains Cache-control: no-store header (i.e. it will potentially evict the
    page which was loaded with Cache-control: no-store from BFCache).
  </summary>
</histogram>

<histogram name="BackForwardCache.EvictedAfterDocumentRestoredReason"
    enum="BackForwardCacheEvictedAfterDocumentRestoredReason"
    expires_after="2024-09-15">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records the reason why the page is evicted from the back-forward cache but
    after the document is restored. This happens when there is a race between
    eviction and restoring. This also records when the page is restored to
    calculate how often this eviction happens.

    This is recorded when back-forward cache is enabled for this navigation
    (back-forward cache feature is enabled and the domain is in the scope of the
    experiment).
  </summary>
</histogram>

<histogram name="BackForwardCache.Eviction.Renderer"
    enum="BackForwardCacheRendererEvictionReason" expires_after="2027-02-14">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records the reason of renderer-initiated back-forward cache eviction.
    Emitted when renderer evicts the page from back-forward cache.
  </summary>
</histogram>

<histogram name="BackForwardCache.Eviction.TimeUntilProcessKilled" units="ms"
    expires_after="2027-02-14">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records the time duration between the last time when the entry goes to the
    back-forward cache and the time when the process is killed.
  </summary>
</histogram>

<histogram
    name="BackForwardCache.Experimental.UnexpectedIPCMessagePostedToCachedFrame.MethodHash"
    enum="MojoInterfaceName" expires_after="2026-05-24">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Track number of times an unexpected IPC message is posted to frames in the
    renderer process while they are frozen in the back-forward cache. IPC tasks
    are denoted by md5 hash of the mojo bindings method name or message hash for
    legacy IPCs.

    Recorded when an IPC task is posted to frames that have already been stored
    in the back-forward cache, after a 15 second delay to account for completion
    of all freezing-related operations.
  </summary>
</histogram>

<histogram
    name="BackForwardCache.Experimental.UnexpectedIPCMessagePostedToCachedFrame.TimeUntilIPCReceived"
    units="ms" expires_after="2024-07-07">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Duration between start of page being stored in the back-forward cache and
    when the unexpected IPC call is received by a frame while in the cache.

    Recorded when an IPC task is posted to frames that have already been stored
    in the back-forward cache, after a 15 second delay to account for completion
    of all freezing-related operations.
  </summary>
</histogram>

<histogram name="BackForwardCache.History.EntryMatch"
    enum="BackForwardCacheEntryMatchResult" expires_after="2027-02-07">
  <owner>annasato@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records the result of matching the committed navigation URL against existing
    entries in BackForwardCache. Records whether the cache was empty, if no
    match was found, if a URL match was found (but with a different history
    index), or if an exact match (URL and history index) was found. Recorded
    when a navigation commits (excluding BackForwardCache restores).
  </summary>
</histogram>

<histogram name="BackForwardCache.History.ForwardEntriesCount" units="entries"
    expires_after="2027-02-07">
  <owner>annasato@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records the number of BackForwardCache entries that are forward of the new
    committed entry. Recorded when a history back navigation commits (including
    navigations restored from BackForwardCache).
  </summary>
</histogram>

<histogram name="BackForwardCache.HistoryNavHasPotentialMatch" enum="Boolean"
    expires_after="2026-05-17">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records whether a history navigation committed a new page that matches a
    page in BFCache (the URL, origin, and security properties match).

    Recorded when a history navigation committed a new page.
  </summary>
</histogram>

<histogram name="BackForwardCache.HistoryNavigationOutcome"
    enum="BackForwardCacheHistoryNavigationOutcome" expires_after="2027-02-14">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When navigating back to a page in the session history, this records whether
    the page was restored from the BackForwardCache or not.

    This is recorded when back-forward cache is enabled for this navigation
    (back-forward cache feature is enabled and the domain is in the scope of the
    experiment).
  </summary>
</histogram>

<histogram name="BackForwardCache.HistoryNavigationOutcome.BlocklistedFeature"
    enum="WebSchedulerTrackedFeature" expires_after="2027-01-03">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When navigating back to a page in the session history, this records what
    blocklisted features were used when the page was loaded and prevented this
    page from being stored in the back-forward cache. Multiple blocklisted
    features can be recorded for the same page.

    This is recorded when back-forward cache is enabled for this navigation
    (back-forward cache feature is enabled and the domain is in the scope of the
    experiment).
  </summary>
</histogram>

<histogram
    name="BackForwardCache.HistoryNavigationOutcome.BrowsingInstanceNotSwappedReason"
    enum="BackForwardCacheBrowsingInstanceNotSwappedReason"
    expires_after="2026-09-13">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When navigating back to a page in the session history and the
    BackForwardCache wasn't used because of the other active WebContents objects
    in the BrowsingInstance, this records the reason why the browsing instance
    wasn't swapped.

    This is recorded when back-forward cache is enabled for this navigation
    (back-forward cache feature is enabled and the domain is in the scope of the
    experiment).
  </summary>
</histogram>

<histogram
    name="BackForwardCache.HistoryNavigationOutcome.DisabledForRenderFrameHostReason2"
    enum="BackForwardCacheDisabledForRenderFrameHostReason2"
    expires_after="2027-01-03">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    For history navigations, records the reason passed to
    BackForwardCache::DisableForRenderFrameHost calls.

    The metric is recorded when a history navigation commits and emits a sample
    for each reason. Compare this with
    BackForwardCache.HistoryNavigationOutcome, which contains the total number
    of navigations which where not cached

    This is recorded for all websites regardless whether back-forward cache is
    enabled or not.
  </summary>
</histogram>

<histogram
    name="BackForwardCache.HistoryNavigationOutcome.DisallowActivationReason"
    enum="InactiveFrameDisallowActivationReason" expires_after="2027-01-24">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    For history navigations, records the reason passed to
    RenderFrameHost::IsInactiveAndDisallowActivation calls.

    The metric is recorded when a history navigation commits and emits a sample
    for each reason. Compare this with
    BackForwardCache.HistoryNavigationOutcome, which contains the total number
    of navigations which where not cached

    This is recorded for all websites regardless whether back-forward cache is
    enabled or not. Warning: this histogram was expired from 2024-07-07 to
    2024-12-04; data may be missing.
  </summary>
</histogram>

<histogram name="BackForwardCache.HistoryNavigationOutcome.NotRestoredReason"
    enum="BackForwardCacheNotRestoredReason" expires_after="2027-02-14">
  <owner>fergal@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When navigating back to a page in the session history, record why it wasn't
    restored from the cache. The page might not have entered the back-forward in
    the first place based on the features used, or it might have been evicted
    while being in the cache.

    This is recorded when back-forward cache is enabled for this navigation
    (back-forward cache feature is enabled and the domain is in the scope of the
    experiment).
  </summary>
</histogram>

<histogram
    name="BackForwardCache.HistoryNavigationOutcome.RelatedActiveContents.Count2"
    units="count" expires_after="2024-09-01">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When navigating back to a page in the session history and the
    BackForwardCache wasn't used because of other active WebContents objects in
    the BrowsingInstance, this records the number of other active pages/related
    active contents using the same BrowsingInstance.
  </summary>
</histogram>

<histogram
    name="BackForwardCache.HistoryNavigationOutcome.RelatedActiveContents.IsPotentiallySyncAccessible2"
    enum="RelatedActiveContentsSyncAccessInfo" expires_after="2024-09-01">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When navigating back to a page in the session history and the
    BackForwardCache wasn't used because of other active WebContents objects in
    the BrowsingInstance, this Records whether the page was potentially
    synchronously accessible by other pages/related active contents using the
    same BrowsingInstance, at the time the page was navigated away from.
  </summary>
</histogram>

<histogram name="BackForwardCache.NewPageNavHasPotentialMatch" enum="Boolean"
    expires_after="2027-02-14">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records whether a non-history non-session-restore non-reload navigation
    committed a new page that matches a page in BFCache (the URL, origin, and
    security properties match).

    Recorded when a non-history non-session-restore non-reload navigation
    committed a new page.
  </summary>
</histogram>

<histogram name="BackForwardCache.NewPageNavHasPotentialMatchWithNoSubframes"
    enum="Boolean" expires_after="2026-04-05">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records whether a non-history non-session-restore non-reload navigation
    committed a new page that matches a page in BFCache (the URL, origin, and
    security properties match) that has no subframes.

    Recorded when a non-history non-session-restore non-reload navigation
    committed a new page.
  </summary>
</histogram>

<histogram name="BackForwardCache.NonRestoredNavigationDirection"
    enum="HistoryNavigationDirection" expires_after="2026-10-11">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When navigating back to a page in the session history that does not restore
    a page from the back/forward cache, this records the history navigation
    direction (back/forward/same entry).

    This is recorded when committing a navigation where the back/forward cache
    is enabled for this navigation (back/forward cache feature is enabled and
    the domain is in the scope of the experiment) but the navigation does not
    restore a page from back/forward cache.
  </summary>
</histogram>

<histogram name="BackForwardCache.PageWithForm.RestoreResult"
    enum="BackForwardCacheHistoryNavigationOutcome" expires_after="2025-02-10">
  <owner>wenyufu@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Record for a page that has form attached is about to restored from the back
    forward cache, to understand the success rate for bfcaching a page that has
    form / input entry attached. This is recorded for page with form attached
    only.

    Recorded during a cross-page history navigation. If a page with form is
    restored from the cache, &quot;PageRestored&quot; will be recorded; if the
    page is not egligible to be restored due to any reason,
    &quot;PageNotRestored&quot; will be recorded.
  </summary>
</histogram>

<histogram name="BackForwardCache.PageWithForm.Storable"
    enum="BackForwardCachePageWithFormStorable" expires_after="2025-02-23">
  <owner>wenyufu@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Record for a page that has form attached is egligible to be stored in back
    forwad cache, to understand the success rate for bfcaching a page that has
    form / input entry attached. This is recorded for page with form attached
    only.

    Recorded when a navigation is committed. If a page has form attached
    &quot;PageSeen&quot; will be recorded; if the page is egligible to be stored
    in the back forward cache, &quot;PageStored&quot; will be recorded.
  </summary>
</histogram>

<histogram name="BackForwardCache.ProcessReuse.{SiteRelation}" units="count"
    expires_after="2024-09-01">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Whether a back/forward cached page shares the same process as the page that
    we're navigating to (i.e. whether the new active page reuses the process of
    the back/forward cached page).

    Recorded when navigating away from a page, after the navigation commits and
    we're about to put the previous page into the back/forward cache.
  </summary>
  <token key="SiteRelation" variants="SiteRelation"/>
</histogram>

<histogram name="BackForwardCache.Pruning.NumberOfBackForwardCacheEntries"
    units="count" expires_after="2026-11-15">
  <owner>leimy@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    The total number of back/forward cache entries before the pruning happens.

    This is recorded when the back/forward cache entries are pruned (e.g. when
    the memory pressure signal is received).
  </summary>
</histogram>

<histogram name="BackForwardCache.Pruning.NumberOfTabsWithBackForwardCache"
    units="count" expires_after="2026-11-15">
  <owner>leimy@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    The total number of tabs that contains at least one non-active main frame
    nodes before the pruning happens.

    This is recorded when the back/forward cache entries are pruned (e.g. when
    the memory pressure signal is received).
  </summary>
</histogram>

<histogram name="BackForwardCache.Restore.NavigationToFirstPaint" units="ms"
    expires_after="2026-12-27">
  <owner>sreejakshetty@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Duration between start of navigation restoring a document from back-forward
    cache and the first paint.

    This is recorded when a history navigation is served from back-forward cache
    but in a foreground tab.
  </summary>
</histogram>

<histogram name="BackForwardCache.RestoredNavigationDirection"
    enum="HistoryNavigationDirection" expires_after="2026-12-27">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When navigating back to a page in the session history that restores a page
    from the back/forward cache, this records the history navigation direction
    (back/forward/same entry).

    This is recorded when committing a navigation where the back/forward cache
    is enabled for this navigation (back/forward cache feature is enabled and
    the domain is in the scope of the experiment) and the navigation restores a
    page from back/forward cache.
  </summary>
</histogram>

<histogram
    name="BackForwardCache.UnexpectedRendererToBrowserMessage.InterfaceName"
    enum="MojoInterfaceName" expires_after="2025-06-22">
  <owner>fergal@google.com</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Hash (base::HashMetricName) of a mojo interface name.

    A sample is recorded for every message the browser receives from a renderer
    for a page that is in the back-forward cache. Logging can be disabled via
    the back-forward cache feature parameter
    &quot;message_handling_when_cached&quot;.

    Renderers should not be sending messages back to the browser for pages that
    are in the back-forward cache. Eventually we will be killing such renderers
    (as we could assume that it is misbehaving because it got compromised). But
    first we must make sure that we are not sending messages by mistake (i.e.
    bugs in the renderer).
  </summary>
</histogram>

<histogram name="Navigation.AndroidSpareRendererNavigationThrottle.DeferTime"
    units="microseconds" expires_after="2026-08-02">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the deferred time caused by the
    AndroidSpareRendererNavigaionThrottle. The UMA is recorded each time
    AndroidSpareRendererNavigationThrottle::WillStartRequest resumes the
    navigation. The UMA will only be sent if the Android spare renderer feature
    and the navigation throttle for the Android spare renderer are enabled. The
    UMA only records metrics on machines with high-resolution clocks.
  </summary>
</histogram>

<histogram
    name="Navigation.AndroidSpareRendererNavigationThrottle.ProcessAliveWhenResume"
    enum="Boolean" expires_after="2026-08-02">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether the renderer process for the navigation is still alive when
    resuming the navigation in AndroidSpareRendererNavigaionThrottle. The UMA is
    recorded each time AndroidSpareRendererNavigationThrottle::WillStartRequest
    resumes the navigation. The UMA will only be sent if the Android spare
    renderer feature and the navigation throttle for the Android spare renderer
    are enabled.
  </summary>
</histogram>

<histogram name="Navigation.AndroidSpareRendererNavigationThrottle.WillDefer"
    enum="Boolean" expires_after="2026-08-02">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records if a navigation is deferred by the
    AndroidSpareRendererNavigaionThrottle. The UMA is recorded each time
    AndroidSpareRendererNavigationThrottle::WillStartRequest is called. The UMA
    will only be sent if the Android spare renderer feature and the navigation
    throttle for the Android spare renderer are enabled.
  </summary>
</histogram>

<histogram name="Navigation.AnonymousIframeIsSandboxed" enum="Boolean"
    expires_after="2023-10-01">
  <owner>arthursonzogni@chromium.org</owner>
  <owner>chrome-security-owp-team@google.com</owner>
  <summary>
    Record whether iframe with the anonymous attribute contains sandboxed
    document or not.
  </summary>
</histogram>

<histogram
    name="Navigation.BackForward.TimeFromOpenBackNavigationMenuToActivateItem"
    units="ms" expires_after="2025-01-05">
  <owner>leimy@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    The time spent between the back navigation menu model's opening and the
    activation of a menu item. This is recorded when the back navigation menu
    model receives signal that indicates the item from the menu is activated.
    See `BackForwardMenuModel::MenuWillShow()` and
    `BackForwardMenuModel::ActivatedAt()` for more details.
  </summary>
</histogram>

<histogram
    name="Navigation.BackForward.TimeFromOpenBackNavigationMenuToCloseMenu"
    units="ms" expires_after="2025-02-10">
  <owner>leimy@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    The time spent between the back navigation menu model's opening and the
    closing. There might or might not be a menu item activation in between. This
    is recorded when the back navigation menu model receives signal that
    indicates it will be closed. See `BackForwardMenuModel::MenuWillShow()` and
    `BackForwardMenuModel::MenuWillClose()` for details.
  </summary>
</histogram>

<histogram name="Navigation.BackToOpener.Clicked" enum="Boolean"
    expires_after="2027-01-03">
  <owner>dljames@chromium.org</owner>
  <owner>xiaqu@microsoft.com</owner>
  <owner>edgecin@microsoft.com</owner>
  <summary>
    Records when the back-to-opener feature is used. This is recorded when the
    user clicks the back button to navigate back to the opener tab.
  </summary>
</histogram>

<histogram name="Navigation.BackToOpener.DestinationTabCloseDuration"
    units="ms" expires_after="2027-01-03">
  <owner>dljames@chromium.org</owner>
  <owner>xiaqu@microsoft.com</owner>
  <owner>edgecin@microsoft.com</owner>
  <summary>
    The time it takes to close the destination tab after the back-to-opener
    action is triggered. This includes any unload prompts that may delay the tab
    closure. Recorded when the WebContents is destroyed (in
    TabCloseObserver::WebContentsDestroyed, which is triggered by
    BackToOpenerController::GoBackToOpener). The value is measured from when
    ClosePage() is called until the WebContents is actually destroyed.
  </summary>
</histogram>

<histogram name="Navigation.BackToOpener.Eligible" enum="Boolean"
    expires_after="2027-04-30">
  <owner>dljames@chromium.org</owner>
  <owner>xiaqu@microsoft.com</owner>
  <owner>edgecin@microsoft.com</owner>
  <summary>
    Records when a back-to-opener relationship is established between a newly
    opened destination tab and its opener tab. This is emitted in
    SetOpenerWebContents when the opener relationship is first created (i.e.
    when a user-initiated navigation from one tab opens a new tab). Use this as
    the denominator with Navigation.BackToOpener.Clicked to compute the trigger
    rate of the back-to-opener feature.
  </summary>
</histogram>

<histogram
    name="Navigation.BeforeUnloadExecutionMode.IsInOutermostMainFrame{SameOrCrossOrigin}"
    enum="BeforeUnloadExecutionMode" expires_after="2027-02-04">
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the execution mode of beforeunload handlers for a navigation.
    Recorded at the time of navigation commit for cross-document
    {SameOrCrossOrigin} outermost main frame navigations. Only recorded for HTTP
    or HTTPS schemes.
  </summary>
  <token key="SameOrCrossOrigin">
    <variant name="" summary=""/>
    <variant name=".CrossOrigin" summary="cross-origin"/>
    <variant name=".SameOrigin" summary="same-origin"/>
  </token>
</histogram>

<histogram name="Navigation.BlurTransitionAnimation.ExitReason"
    enum="BlurTransitionExitReason" expires_after="2027-06-01">
  <owner>evanluo@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records the reason why the navigation blur transition (Android only) was
    terminated. This helps track the success rate and failure modes of the
    transition animation.
  </summary>
</histogram>

<histogram
    name="Navigation.BrowserInitiated.DuplicateNavCookieStatus.UnderThreshold{DuplicateNavTargetScope}"
    enum="DuplicateNavsCookieStatus" expires_after="2027-01-03">
  <owner>annasato@google.com</owner>
  <owner>rakina@google.com</owner>
  <owner>chrome-navigation@google.com</owner>
  <summary>
    Records the cookie change status only for potential duplicate navigations
    where criteria such as URL, initiator, method, and transition match, and
    specifically for those that occurred within the duplicate navigation time
    threshold. It distinguishes whether a CookieChangeListener was missing,
    cookies actually changed since the ongoing navigation started, or cookies
    remained the same. This is recorded {DuplicateNavTargetScope}.
  </summary>
  <token key="DuplicateNavTargetScope" variants="DuplicateNavTargetScope"/>
</histogram>

<histogram name="Navigation.BrowserInitiatedSessionHistoryCount"
    enum="HistoryNavType" expires_after="2026-05-03">
  <owner>liuwilliam@chromium.org</owner>
  <owner>chrome-seamless-core@google.com</owner>
  <summary>
    Counts the different types of browser-initiated session history navigations.
    The counts are recorded when the respective NavigationRequests are first
    created, and before the requests are owned by their respective
    RenderFrameHost. The metric is recorded once per browser-initiated history
    navigation.
  </summary>
</histogram>

<histogram name="Navigation.BrowserMappedUrnUuidInIframeOrFencedFrame"
    enum="NavigationBrowserMappedUrnUuidInIframeOrFencedFrame"
    expires_after="2026-07-11">
  <owner>xiaochenzh@chromium.org</owner>
  <owner>shivanisha@chromium.org</owner>
  <summary>
    For navigation requests with FLEDGE or SharedStorage generated urn:uuid,
    record whether it is rendered in a fenced frame or iframe. Recorded when
    navigation requests begin (i.e. during
    NavigationRequest::BeginNavigation()).
  </summary>
</histogram>

<histogram name="Navigation.CodeCacheTime.{CodeCacheType}" units="ms"
    expires_after="2023-06-15">
  <owner>cduvall@chromium.org</owner>
  <owner>jam@chromium.org</owner>
  <summary>
    Measures how long it takes to fetch from the code cache. Logged every time
    the code cache is fetched for the navigation body or a resource.
  </summary>
  <token key="CodeCacheType">
    <variant name="MainFrame"/>
    <variant name="Resource"/>
    <variant name="Subframe"/>
  </token>
</histogram>

<histogram
    name="Navigation.CommitNavigationWithParams.Time.IsStandardLoadType.IsHTTPOrHTTPS"
    units="microseconds" expires_after="2027-04-01">
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time spent processing RenderFrameImpl::CommitNavigationWithParams() in the
    renderer process. This is recorded on each WebFrameLoadType::kStandard
    navigation for http or https URLs.

    This histogram only records metrics on machines with high-resolution clocks.
  </summary>
</histogram>

<histogram name="Navigation.CommitRenderFrame" units="ms"
    expires_after="2027-01-17">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time it takes for the RenderFrameImpl::CommitNavigation() to run.
    Recorded on every RenderFrameImpl::CommitNavigation() call.
  </summary>
</histogram>

<histogram
    name="Navigation.CommitRenderFrame.OutermostMainFrame.NewNavigation.IsHTTPOrHTTPS"
    units="ms" expires_after="2027-02-07">
  <owner>sisidovski@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The time it takes for the RenderFrameImpl::CommitNavigation() to run on the
    outermost main frame. Recorded on RenderFrameImpl::CommitNavigation() call,
    when it's a new non-(reload/history/restore) navigation for the URL with
    HTTP or HTTPS scheme.
  </summary>
</histogram>

<histogram name="Navigation.CommitRenderFrame.{FrameType}" units="ms"
    expires_after="2027-02-07">
  <owner>sisidovski@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The time it takes for the RenderFrameImpl::CommitNavigation() to run on
    {FrameType}. Recorded on every RenderFrameImpl::CommitNavigation() call.
  </summary>
  <token key="FrameType" variants="FrameTypes"/>
</histogram>

<histogram name="Navigation.CompositorCreationTo{Stage}2" units="ms"
    expires_after="2026-09-06">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records the time duration between the creation of CompositorFrameSink for a
    new RenderWidgetHost to when the navigation that uses that RenderWidgetHost
    reaches {Stage}. Logged when the navigation that uses a new RenderFrameHost
    and RenderWidgetHost reaches both the commit and swap RFH stages and the
    creation of CompositorFrameSink had already been requested at that time.
  </summary>
  <token key="Stage" variants="NavigationStage"/>
</histogram>

<histogram name="Navigation.CompositorRequestedBefore{Stage}2" enum="Boolean"
    expires_after="2026-02-24">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records whether the creation of CompositorFrameSink for a new
    RenderWidgetHost is already requested when the navigation that uses it
    reaches {Stage}. Logged when the navigation that uses the new
    RenderFrameHost and RenderWidgetHost has reached both the commit and swap
    RFH stages.
  </summary>
  <token key="Stage" variants="NavigationStage"/>
</histogram>

<histogram name="Navigation.CreateSpeculativeRFH" units="ms"
    expires_after="2026-11-15">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time it takes for
    RenderFrameHostManager::CreateSpeculativeRenderFrameHost() to run. Recorded
    on every RenderFrameHostManager::CreateSpeculativeRenderFrameHost() call.
  </summary>
</histogram>

<histogram
    name="Navigation.CreateSubresourceProxyingURLLoaderFactoryBundle.Duration"
    units="microseconds" expires_after="2027-07-30">
  <owner>sisidovski@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The time taken to create and clone subresource_proxying_factory_bundle
    during navigation commit in RenderFrameHostImpl::CommitNavigation. Recorded
    for each navigation commit where subresource_loader_factories is present.
    This histogram only records metrics on machines with high-resolution clocks.
  </summary>
</histogram>

<histogram name="Navigation.CSPEmbeddedEnforcement.Outcome"
    enum="NavigationCSPEmbeddedEnforcementOutcome" expires_after="2027-04-22">
  <owner>mkwst@chromium.org</owner>
  <owner>chrome-security@google.com</owner>
  <summary>
    The outcome of Content Security Policy Embedded Enforcement (CSPEE) during
    navigation. Recorded for every navigation that has a required CSP set by its
    embedder (via the 'csp' attribute).

    Possible outcomes include allowing the navigation because it's a local
    scheme, because the 'Allow-CSP-From' header was present and valid, because
    the frame's own CSP subsumed the required policy, or blocking the navigation
    entirely.
  </summary>
</histogram>

<histogram name="Navigation.DeferSpeculativeRFHAction"
    enum="DeferSpeculativeRFHAction" expires_after="2026-04-12">
  <owner>gjc@google.com</owner>
  <owner>rakina@chromium.org</owner>
  <owner>chrome-navigation@google.com</owner>
  <summary>
    Records whether the speculative RFH is deferred when the navigation starts
    and whether a spare render process is warmed up.
  </summary>
</histogram>

<histogram name="Navigation.DelayedCurrentProcessInitByLaunchingSpareFirst"
    enum="Boolean" expires_after="2025-12-31">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether a new spare renderer process is launched when the renderer
    process for the SiteInstance of the current navigation is not ready. The UMA
    is recorded each time `RenderFrameHostManager::GetSiteInstanceForNavigation`
    is called. The UMA records true only if the spare renderer process is
    initialized before the destination process's renderer process.
  </summary>
</histogram>

<histogram name="Navigation.DidCommitSameDocumentNavigation.Duration"
    units="ms" expires_after="2027-02-07">
  <owner>peilinwang@google.com</owner>
  <owner>woa-performance-bugs+jank@google.com</owner>
  <summary>
    Measures the amount of time it takes to call
    RenderFrameHostImpl::DidCommitSameDocumentNavigation(). Logged once per call
    to RenderFrameHostImpl::DidCommitSameDocumentNavigation().
  </summary>
</histogram>

<histogram name="Navigation.DuplicateNavigationsIgnoredCountPerNavigation"
    units="count" expires_after="2027-01-24">
  <owner>annasato@chromium.org</owner>
  <owner>chrome-navigation@google.com</owner>
  <summary>
    Records the number of subsequent duplicate navigation requests that were
    ignored in favor of an ongoing navigation. This is recorded at the time the
    navigation successfully commits.
  </summary>
</histogram>

<histogram name="Navigation.DuringGesture.NavStarted{NavigationMode}"
    enum="Boolean" expires_after="2027-02-07">
  <owner>lazzzis@google.com</owner>
  <owner>liuwilliam@chromium.org</owner>
  <owner>chrome-seamless-core@google.com</owner>
  <summary>
    Record if there is navigation started during a gesture is in progress. This
    records for {NavigationMode} when a gesture is finished. Android only.
  </summary>
  <token key="NavigationMode" variants="NavigationMode"/>
</histogram>

<histogram name="Navigation.Earlyhints.EarlyHintsToResponseStartTime"
    units="ms" expires_after="2026-10-14">
  <owner>bashi@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Time from a navigation request received the first early hints to the
    response started. Recorded per navigation when both early hints and the
    final response are received.
  </summary>
</histogram>

<histogram name="Navigation.Earlyhints.WillStartRequestToEarlyHintsTime"
    units="ms" expires_after="2026-10-14">
  <owner>bashi@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Time from a navigation request will start to the first early hints is
    received. Recorded per navigation when both early hints and the final
    response are received.
  </summary>
</histogram>

<histogram name="Navigation.EarlyRenderFrameHostSwap.HasCommitted"
    enum="Boolean" expires_after="2026-10-04">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <summary>
    If a navigation swaps to the destination RenderFrameHost early, this records
    whether or not the navigation actually ended up committing a document. This
    will be true for most navigations, but false for downloads and 204
    responses. Recorded once for every navigation that performs an early
    RenderFrameHost swap.
  </summary>
</histogram>

<histogram name="Navigation.EarlyRenderFrameHostSwap.IsInOutermostMainFrame"
    enum="BooleanMainFrame" expires_after="2027-02-07">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <summary>
    If a navigation swaps to the destination RenderFrameHost early, this records
    whether the navigation was in an outermost main frame. Recorded once per
    early RenderFrameHost swap.
  </summary>
</histogram>

<histogram name="Navigation.EarlyRenderFrameHostSwapType"
    enum="EarlyRFHSwapType" expires_after="2026-10-25">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <summary>
    This records whether a navigation swapped to the destination RenderFrameHost
    early (prior to commit), as well as the reason for this swap. Recorded once
    at the end of every navigation, when NavigationRequest is destroyed.
  </summary>
</histogram>

<histogram name="Navigation.EngagementTime.HTTP" units="ms"
    expires_after="never">
<!-- expires-never: Underlies a public transparency report graph https://transparencyreport.google.com/https/overview?hl=en -->

  <owner>estark@chromium.org</owner>
  <owner>security-enamel@chromium.org</owner>
  <summary>
    The amount of time that an HTTP page was in the foreground. Recorded on
    every page close/transition. This metric is exposed publicly on the HTTPS
    Transparency Report at
    https://transparencyreport.google.com/https/overview?hl=en.
  </summary>
</histogram>

<histogram name="Navigation.EngagementTime.HTTPS" units="ms"
    expires_after="never">
<!-- expires-never: Underlies a public transparency report graph https://transparencyreport.google.com/https/overview?hl=en -->

  <owner>estark@chromium.org</owner>
  <owner>security-enamel@chromium.org</owner>
  <summary>
    The amount of time that an HTTPS page was in the foreground. Recorded on
    every page close/transition. This metric is exposed publicly on the HTTPS
    Transparency Report at
    https://transparencyreport.google.com/https/overview?hl=en.
  </summary>
</histogram>

<histogram name="Navigation.EngagementTime.Ratio" units="%"
    expires_after="2025-03-09">
  <owner>estark@chromium.org</owner>
  <owner>security-enamel@chromium.org</owner>
  <summary>
    The percentage of time that HTTPS pages were in the foreground, as compared
    to total foreground time. Recorded whenever user metrics are uploaded.
  </summary>
</histogram>

<histogram name="Navigation.Experimental.FastFetch.EligibilityCheckDuration"
    units="microseconds" expires_after="2026-10-01">
  <owner>bashi@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures the synchronous CPU execution time of IsEligibleForFastFetch()
    during BeginNavigationImpl. Recorded unconditionally on all main frame
    navigations. Note that some clients may not have a high resolution timer
    that can send metrics with microsecond precision.
  </summary>
</histogram>

<histogram name="Navigation.Experimental.FastFetch.EligibilityReason"
    enum="FastFetchEligibilityReason" expires_after="2026-10-01">
  <owner>bashi@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the specific eligibility check result (success or first failed
    exclusion condition) at navigation start. Recorded unconditionally on all
    main frame navigations.
  </summary>
</histogram>

<histogram name="Navigation.Experimental.FastFetch.FailedNetError"
    enum="NetErrorCodes" expires_after="2026-10-01">
  <owner>bashi@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the net error code when an eligible navigation fails. Recorded only
    when the navigation fails before commit.
  </summary>
</histogram>

<histogram name="Navigation.Experimental.FastFetch.NavigationOutcome"
    enum="FastFetchNavigationOutcome" expires_after="2026-10-01">
  <owner>bashi@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the final lifecycle disposition of navigations marked eligible
    during Fast Fetch. Committed indicates successful commit to initial URL.
    Failed indicates abort or error before commit.
  </summary>
</histogram>

<histogram name="Navigation.Experimental.FastFetch.OpportunityTime.FetchStart"
    units="ms" expires_after="2027-01-24">
  <owner>bashi@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures elapsed time from eligibility check in BeginNavigationImpl to the
    first fetch start time for eligible navigations.
  </summary>
</histogram>

<histogram name="Navigation.Experimental.FastFetch.OpportunityTime.LoaderStart"
    units="ms" expires_after="2027-01-24">
  <owner>bashi@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures elapsed time from eligibility check in BeginNavigationImpl to
    URLLoader::Start() for eligible navigations.
  </summary>
</histogram>

<histogram name="Navigation.Experimental.FastFetch.SkipThrottles"
    enum="Boolean" expires_after="2026-10-01">
  <owner>bashi@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the skip_throttles value when an eligible navigation fails. Recorded
    only when the navigation fails before commit.
  </summary>
</histogram>

<histogram name="Navigation.FCPFrameSubmissionToSurfaceEmbed" units="ms"
    expires_after="2026-08-09">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records the time between when the first contentful paint frame for a new
    document is received by Viz to when the surface used for the new document
    gets embedded by the browser process. Logged after the first contentful
    frame has been displayed on screen.
  </summary>
</histogram>

<histogram name="Navigation.FCPFrameSubmittedBeforeSurfaceEmbed" enum="Boolean"
    expires_after="2026-02-24">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records whether the first contentful paint frame for a new document was
    received by Viz before the surface used for the document gets embedded by
    the browser process. Logged after the first contentful frame has been
    displayed on screen.
  </summary>
</histogram>

<histogram name="Navigation.FencedFrameBeaconReportingCountSameOrigin"
    units="beacons" expires_after="2026-06-30">
  <owner>xiaochenzh@chromium.org</owner>
  <owner>shivanisha@chromium.org</owner>
  <owner>chrome-fenced-frames-core@google.com</owner>
  <summary>
    Records how many beacons were sent through window.fence.reportEvent() from a
    document that is same-origin to the mapped URL of the FencedFrameConfig
    during the lifetime of the FencedFrameConfig object. This is recorded when
    the FencedFrameConfig object is destroyed and is recorded once per
    FencedFrameConfig instance.
  </summary>
</histogram>

<histogram name="Navigation.GestureTransition.CacheHitOrMissReason"
    enum="NavigationTransitionCacheHitOrMissReason" expires_after="2026-12-20">
  <owner>liuwilliam@google.com</owner>
  <owner>baranerf@google.com</owner>
  <owner>chrome-seamless-core@google.com</owner>
  <summary>
    Counts the occurrence of cache hit or cache miss reasons when the user
    starts a back/forward navigation gesture. This is recorded once per user
    gesture.
  </summary>
</histogram>

<histogram name="Navigation.GestureTransition.CompressionTime" units="ms"
    expires_after="2027-01-17">
  <owner>lizeb@chromium.org</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    The time it takes to compress the navigation screenshot, on a background
    thread. Recorded on Android, each time a navigation screenshot is
    compressed.
  </summary>
</histogram>

<histogram name="Navigation.GestureTransition.Screenshot.SharedImageReceived"
    enum="BooleanReceived" expires_after="2027-01-24">
  <owner>acondor@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Records whether a shared image was received from the GPU process when
    caching a screenshot for navigation transitions. This can happen if the
    surface is deleted before the CopyOutputRequest is satisfied. Recorded each
    time a shared image is received for caching. This is recorded on Android
    only, when the predictive back gesture for web content, using shared images,
    is enabled.
  </summary>
</histogram>

<histogram name="Navigation.GestureTransition.ScreenshotCacheSize" units="MB"
    expires_after="2026-12-20">
  <owner>acondor@google.com</owner>
  <owner>liuwilliam@google.com</owner>
  <owner>baranerf@google.com</owner>
  <owner>chrome-seamless-core@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The amount of memory usage by the screenshots captured for predictive back.
    Recorded at Poisson sampled time intervals continuously, regardless of user
    gesture, with a mean of 5 minutes on Android and 30 minutes on other
    platforms.
  </summary>
</histogram>

<histogram name="Navigation.GestureTransition.{Scenario}"
    enum="NavigationRequestSchemeType" expires_after="M140">
  <owner>lazzzis@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Record the scheme type of the new commit when a new commit happens
    {Scenario}.
  </summary>
  <token key="Scenario">
    <variant name="NewCommitInPrimaryMainFrame"
        summary="in primary main frame"/>
    <variant name="NewCommitWhileDisplayingCanceledAnimation"
        summary="while a canceled animation is displaying"/>
    <variant name="NewCommitWhileDisplayingCrossFadeAnimation"
        summary="while a cross fade animation is displaying"/>
    <variant name="NewCommitWhileWaitingForNewRendererToDraw"
        summary="while waiting for new renderer to draw"/>
  </token>
</histogram>

<histogram name="Navigation.GetFrameHostForNavigation" units="ms"
    expires_after="2027-01-03">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time it takes for RenderFrameHostManager::GetFrameHostForNavigation() to
    run. Recorded on every RenderFrameHostManager::GetFrameHostForNavigation()
    call.
  </summary>
</histogram>

<histogram
    name="Navigation.GetFrameHostForNavigationTime.InDidCreateNavigationRequest.IsHTTPOrHTTPS"
    units="microseconds" expires_after="2027-04-01">
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Time spent processing GetFrameHostForNavigation() in
    RenderFrameHostManager::DidCreateNavigationRequest() that can prepare a
    SpeculativeRenderFrameHost. SpeculativeRenderFrameHost might not be created
    in some cases, but this UMA records such cases as well. This is recorded on
    each navigation if the navigation requires GetFrameHostForNavigation() to be
    called for http or https URLs. Calling GetFrameHostForNavigation() is not
    required for the same document navigations or back/forward cache
    navigations.

    This histogram only records metrics on machines with high-resolution clocks.
  </summary>
</histogram>

<histogram name="Navigation.Guest.IsHTTPOrHTTPS"
    enum="BooleanHttpBasedOrOtherScheme" expires_after="2027-03-21">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <owner>wjmaclean@chromium.org</owner>
  <summary>
    Whether the committing guest navigation targets an HTTP(S) URL. Logged at
    ready-to-commit time for navigations in a webview tag (also known as
    &quot;guest&quot; in process model terminology), excluding same-document
    navigations and errors.
  </summary>
</histogram>

<histogram name="Navigation.Guest.IsMainFrame" enum="BooleanMainFrame"
    expires_after="2027-03-21">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <owner>wjmaclean@chromium.org</owner>
  <summary>
    Whether the committing guest navigation is in a main frame. Logged at
    ready-to-commit time for navigations in a webview tag (also known as
    &quot;guest&quot; in process model terminology), excluding same-document
    navigations and errors.
  </summary>
</histogram>

<histogram name="Navigation.Home.IsChromeInternal" enum="Boolean"
    expires_after="never">
<!-- expires-never: part of top-line metric (internal: go/chrome-browser-nsm) -->

  <owner>mpearson@chromium.org</owner>
  <owner>amaralp@chromium.org</owner>
  <owner>chrome-analysis-team@google.com</owner>
  <summary>
    Emitted every time a user uses a Home button to go to their home page.
    Records whether the page is chrome-internal (most likely the New Tab Page or
    about:blank) or not (most likely an actual web site). For the purpose of
    this histogram, about:, chrome: and chrome-native: are considered
    chrome-internal; everything else is not.

    The user action Navigation.Home.NotChromeInternal is also logged in the case
    that false is logged to this histogram.

    This histogram is of special interest to the chrome-analysis-team@. Do not
    change its semantics or retire it without talking to them first.
  </summary>
</histogram>

<histogram name="Navigation.HostnameHasDeviationCharacters" units="count"
    expires_after="2024-06-30">
  <owner>meacer@chromium.org</owner>
  <owner>chrome-trusty-transport@google.com</owner>
  <summary>
    Counts the number of typed and pasted main frame navigations to hostnames
    that contain characters that are treated differently between IDNA 2003 and
    IDNA 2008, aka deviation characters. Ignores reload navigations.
  </summary>
</histogram>

<histogram name="Navigation.InitiatorType.All" enum="NavigationInitiatorType"
    expires_after="2027-02-07">
  <owner>robertlin@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Records the initiator type of a navigation. Recorded for a standard
    navigation when it commits. For a prerendered navigation, it is recorded
    when the page is activated.
  </summary>
</histogram>

<histogram name="Navigation.InitiatorType.SRP" enum="NavigationInitiatorType"
    expires_after="2027-02-07">
  <owner>robertlin@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Records the initiator type of a SRP navigation. Recorded for a standard SRP
    navigation when it commits. For a prerendered SRP navigation, it is recorded
    when the page is activated.
  </summary>
</histogram>

<histogram name="Navigation.IsGuest" enum="NavigationIsGuest"
    expires_after="2027-03-21">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <owner>wjmaclean@chromium.org</owner>
  <summary>
    Whether the committing navigation is for a webview tag (also known as
    &quot;guest&quot; in process model terminology). Logged at ready-to-commit
    time for every navigation, excluding same-document navigations and errors.
  </summary>
</histogram>

<histogram name="Navigation.IsLockedProcess" enum="NavigationIsLockedProcess"
    expires_after="2027-07-19">
  <owner>alexmos@chromium.org</owner>
  <owner>lukasza@chromium.org</owner>
  <summary>
    Whether the navigation commits in a process that is locked to an origin.
    Logged at ready-to-commit time for every navigation excluding same-document
    navigations and errors.
  </summary>
</histogram>

<histogram name="Navigation.IsLockedProcess.HTTPOrHTTPS"
    enum="NavigationIsLockedProcess" expires_after="2026-07-19">
  <owner>alexmos@chromium.org</owner>
  <owner>lukasza@chromium.org</owner>
  <summary>
    Whether the navigation commits in a process that is locked to an origin.
    Logged at ready-to-commit time for every navigation that commits with a HTTP
    or HTTPS URL scheme, excluding same-document navigations and errors.
  </summary>
</histogram>

<histogram name="Navigation.IsProcessBackgrounded2.{Timing}" enum="Boolean"
    expires_after="2027-04-01">
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records true if the RenderProcess is backgrounded, otherwise records false.
    This is recorded on {Timing} when the URL is HTTP or HTTPS and only when the
    navigation happens in OutermostMainFrame.
  </summary>
  <token key="Timing">
    <variant name="OnCommit" summary="CommitNavigation"/>
    <variant name="OnDOMContentLoaded" summary="DOMContentLoaded"/>
  </token>
</histogram>

<histogram name="Navigation.IsSameBrowsingInstance"
    enum="NavigationIsSameBrowsingInstance" expires_after="2025-05-04">
  <owner>arthursonzogni@chromium.org</owner>
  <owner>clamy@chromium.org</owner>
  <owner>nasko@chromium.org</owner>
  <summary>
    Whether a main frame navigation led to a change of BrowsingInstance or not.
  </summary>
</histogram>

<histogram name="Navigation.IsSameSiteInstance"
    enum="NavigationIsSameSiteInstance" expires_after="2027-01-24">
  <owner>arthursonzogni@chromium.org</owner>
  <owner>clamy@chromium.org</owner>
  <owner>nasko@chromium.org</owner>
  <summary>
    Whether the navigation led to a change of SiteInstance or not.
  </summary>
</histogram>

<histogram name="Navigation.LoadIfNecessaryType"
    enum="NavigationNeedsReloadType" expires_after="never">
<!-- expires-never: Generally useful metric on Android that tracks number of automatic tab reloads and their cause.  -->

  <owner>boliu@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <owner>src/base/android/OWNERS</owner>
  <summary>
    The type of the source of a load from LoadIfNecessary. Recorded when
    LoadIfNecessary starts a page load. For example, on Android,
    kRequestedByClient is recorded when user switch back to a tab with a dead
    renderer, which causes the tab to reload.
  </summary>
</histogram>

<histogram name="Navigation.MainFrame.FrameCount" units="frames"
    expires_after="2023-01-20">
  <owner>michaelpg@chromium.org</owner>
  <owner>yilkal@chromium.org</owner>
  <owner>cros-families-eng@google.com</owner>
  <summary>
    The number of frames that are present in a WebContents. Recorded once when
    the main frame finishes loading.
  </summary>
</histogram>

<histogram name="Navigation.MainFrame.FromAdClick" enum="Boolean"
    expires_after="2026-11-15">
  <owner>yaoxia@chromium.org</owner>
  <owner>jkarlin@chromium.org</owner>
  <owner>chrome-ads-histograms@google.com</owner>
  <summary>
    Records a True boolean value when clicking on an Ad triggers a main frame
    navigation. Recorded when the (renderer-initiated) navigation IPC is
    received by the browser process.
  </summary>
</histogram>

<histogram name="Navigation.MainFrame.MaxFrameCount" units="frames"
    expires_after="2025-02-10">
  <owner>michaelpg@chromium.org</owner>
  <owner>yilkal@chromium.org</owner>
  <owner>cros-families-eng@google.com</owner>
  <summary>
    The maximum number of loaded frames that are present in a WebContents.
    Recorded once when the main frame is moving away from current page. This can
    be when the WebContents is being destroyed or when it starts loading new
    content.
  </summary>
</histogram>

<histogram
    name="Navigation.MainFrame.NewNavigation.IgnoreRestore.IsHTTPOrHTTPS.{DurationFromTo}.Time2"
    units="ms" expires_after="2027-04-01">
  <owner>chikamune@chromium.org</owner>
  <owner>yyanagisawa@chromium.org</owner>
  <owner>kouhei@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Record when (a) the navigation happened in MainFrame, (b) it was a new
    navigation, (c) it was not a session restore, (d) the URL was http or https,
    and (e) the navigation was successfully committed. Measures the duration
    between {DurationFromTo}. This is also included in the trace log.
  </summary>
  <token key="DurationFromTo">
    <variant name="BeginNavigationToLoaderStart"
        summary="when the BeginNavigation starts, to when the
                 NavigationURLLoader starts"/>
    <variant name="FetchStart"
        summary="when the browser is ready to fetch the document using an
                 HTTP(S) request (which is called as fetchStart), to when the
                 first HTTP(S) request is sent"/>
    <variant name="LoaderStartToFetchStart"
        summary="when the NavigationURLLoader starts, to when the browser is
                 ready to fetch the document using an HTTP(S) (or file)
                 request (which is called as fetchStart)"/>
    <variant name="LoaderStartToReceiveResponse"
        summary="when the NavigationURLLoader starts, to when the browser
                 process receives the response (HTTP header)"/>
    <variant name="NavigationStartToBeginNavigation"
        summary="when the navigation starts, to when the BeginNavigation
                 starts"/>
    <variant name="ReceiveHeaders"
        summary="when the first HTTP(S) request is sent, to when the final
                 headers are received in the network service. This duration
                 can involve multiple redirects"/>
    <variant name="ReceiveHeadersToReceiveResponse"
        summary="when the final headers are received in the network service,
                 to when the browser process receives the response (HTTP
                 header)"/>
    <variant name="ReceiveResponseToCommitNavigation"
        summary="when the browser process receives the response (HTTP
                 header), to when the CommitNavigation mojo API is called in
                 the browser process"/>
  </token>
</histogram>

<histogram
    name="Navigation.MainFrame.RendererInitiated.InitiatorFramePresentAtStart"
    enum="BooleanPresent" expires_after="2023-10-01">
  <owner>yaoxia@chromium.org</owner>
  <owner>cammie@chromium.org</owner>
  <summary>
    Whether the initiator frame is present when a renderer-initiated primary
    main frame navigation has started. Recorded for each renderer-initiated
    primary main frame navigation when the navigation has started (i.e. during
    WebContentsObserver::DidStartNavigation()).
  </summary>
</histogram>

<histogram name="Navigation.MainFrame.SiteEngagementLevel"
    enum="SiteEngagementLevel" expires_after="2026-01-18">
  <owner>meacer@chromium.org</owner>
  <owner>security-enamel@chromium.org</owner>
  <summary>
    Site engagement level of the URL of the top frame of a navigation. Only
    counts HTTP or HTTPS URLs and ignores downloads.
  </summary>
</histogram>

<histogram name="Navigation.MainFrame.ThirdPartyCookieBlockingEnabled"
    enum="ThirdPartyCookieBlockState" expires_after="2026-07-26">
  <owner>dullweber@chromium.org</owner>
  <owner>feuunk@chromium.org</owner>
  <summary>
    Records whether third party cookie blocking was enabled for a site. Recorded
    for each main-frame navigation when that navigation commits. Only counts
    HTTP or HTTPS URLs and ignores downloads.
  </summary>
</histogram>

<histogram name="Navigation.MainFrameHasRTLDomain2" enum="Boolean"
    expires_after="2027-04-01">
  <owner>cthomp@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    Whether the main-frame navigation was to a URL with an RTL domain name. This
    is only recorded for finished navigations and not attempts. Warning: this
    histogram was expired from M92 through M95; data may be missing.
  </summary>
</histogram>

<histogram name="Navigation.MainFrameHasRTLDomainDifferentPage2" enum="Boolean"
    expires_after="2027-04-01">
  <owner>cthomp@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    Whether the main-frame navigation was to a URL with an RTL domain name,
    recorded for each main-frame avigation that replaces a document object. This
    is not reported for reference fragment navigations, pushState/replaceState
    or same page history navigation. This is only recorded for finished
    navigations and not attempts.
  </summary>
</histogram>

<histogram name="Navigation.MainFrameProfileType2" enum="BrowserProfileType"
    expires_after="2027-01-03">
  <owner>dullweber@chromium.org</owner>
  <owner>chrome-privacy-core@google.com</owner>
  <summary>
    The browser profile type for each main-frame navigation, recorded after
    navigation completion, including NTP and same-document navigations. To only
    see navigations that replace a document object, take a look at
    Navigation.MainFrameProfileTypeDifferentPage2.
  </summary>
</histogram>

<histogram name="Navigation.MainFrameProfileTypeDifferentPage2"
    enum="BrowserProfileType" expires_after="2027-01-24">
  <owner>dullweber@chromium.org</owner>
  <owner>chrome-privacy-core@google.com</owner>
  <summary>
    The browser profile type for each main-frame navigation that replaces a
    document object. Recorded after navigation completion, including NTP. To see
    all navigations, including same-document navigations, take a look at
    Navigation.MainFrameProfileType2.
  </summary>
</histogram>

<histogram
    name="Navigation.MainframeSameDocumentNavigationCommitToPresentFirstFrame"
    units="ms" expires_after="2027-01-17">
  <owner>liuwilliam@chromium.org</owner>
  <owner>chrome-seamless-core@google.com</owner>
  <summary>
    Records the time to present the first frame since the same-document
    navigation has finished in the mainframe's renderer.
  </summary>
</histogram>

<histogram name="Navigation.MainFrameScheme2" enum="NavigationScheme"
    expires_after="never">
<!-- expires-never: Primary metric for measuring page loads, particularly for security analyses. -->

  <owner>estark@chromium.org</owner>
  <owner>elawrence@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    The scheme of the URL for each main-frame navigation. This is only recorded
    for finished navigations and not attempts. Warning: this histogram was
    expired from 2021-06-01 through M95; data may be missing.
  </summary>
</histogram>

<histogram name="Navigation.MainFrameSchemeDifferentPage2"
    enum="NavigationScheme" expires_after="never">
<!-- expires-never: Underlies a public transparency report graph https://transparencyreport.google.com/https/overview?hl=en -->

  <owner>estark@chromium.org</owner>
  <owner>elawrence@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    The scheme of the URL for each main-frame navigation that replaces a
    document object. This is not reported for reference fragment navigations,
    pushState/replaceState or same page history navigation. This is only
    recorded for finished navigations and not attempts.
  </summary>
</histogram>

<histogram name="Navigation.MainFrameSchemeDifferentPage2NonUniqueHostname"
    enum="NavigationScheme" expires_after="2026-09-06">
  <owner>meacer@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    A subset of MainFrameSchemeDifferentPage2 only recorded for non-unique
    hostnames. The scheme of the URL for each main-frame navigation that
    replaces a document object. This is not reported for reference fragment
    navigations, pushState/replaceState or same page history navigation. This is
    only recorded for finished navigations and not attempts.

    Warning: this histogram was expired from 2024-09-01 to 2025-02-28; data may
    be missing.
  </summary>
</histogram>

<histogram name="Navigation.MainFrameSchemeDifferentPageOTR2"
    enum="NavigationScheme" expires_after="2026-05-24">
  <owner>estark@chromium.org</owner>
  <owner>elawrence@chromium.org</owner>
  <owner>trusty-transport@chromium.org</owner>
  <summary>
    The scheme of the URL for each main-frame navigation that replaces a
    document object while in incognito. This is not reported for reference
    fragment navigations, pushState/replaceState or same page history
    navigation. This is only recorded for finished navigations and not attempts.
  </summary>
</histogram>

<histogram name="Navigation.MainFrameSchemeOTR2" enum="NavigationScheme"
    expires_after="2024-12-15">
  <owner>elawrence@chromium.org</owner>
  <owner>estark@chromium.org</owner>
  <summary>
    The scheme of the URL for each main-frame navigation while in incognito.
    This is only recorded for finished navigations and not attempts. Warning:
    this histogram was expired from 2021-06-01 through M97; data may be missing.
  </summary>
</histogram>

<histogram name="Navigation.OnBeforeUnloadOverheadTime" units="ms"
    expires_after="2027-02-14">
  <owner>clamy@chromium.org</owner>
  <owner>nasko@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Overhead time spent handling the OnBeforeUnload event from the browser
    standpoint. More precisely, it is the total time between dispatch and
    acknowledgment of the BeforeUnload event on the browser side, minus the
    actual time spent executing the BeforeUnload handlers on the renderer side.
  </summary>
</histogram>

<histogram
    name="Navigation.OnBeforeUnloadOverheadTime.BeforeUnloadHandlerRegistered{SyncAsync}"
    units="ms" expires_after="2027-04-01">
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Overhead time spent handling the OnBeforeUnload event from the browser
    standpoint. Recorded only when `for_legacy` is false which means there were
    mojo calls between the browser process and the renderer process. {SyncAsync}
  </summary>
  <token key="SyncAsync">
    <variant name=""
        summary="This is recorded for both synchronous
                 (BeforeUnloadExecutionMode::kDefault) and asynchronous
                 (BeforeUnloadExecutionMode::kAsync) beforeunload execution
                 modes. From M148, this metric includes asynchronous
                 execution data in addition to synchronous data due to the
                 introduction of AsyncBeforeUnload. The duration is expected
                 to decrease."/>
    <variant name=".Async"
        summary="This is recorded only when beforeunload handlers are
                 executed asynchronously (BeforeUnloadExecutionMode::kAsync).
                 This is the queueing delay for running the task with
                 `RenderFrameHostImpl::ProcessBeforeUnloadCompletedFromFrame()`."/>
    <variant name=".Sync"
        summary="This is recorded only when beforeunload handlers are
                 executed synchronously
                 (BeforeUnloadExecutionMode::kDefault). This is the total
                 time between dispatch and acknowledgment of the BeforeUnload
                 event on the browser side, minus the actual time spent
                 executing the BeforeUnload handlers on the renderer side."/>
  </token>
</histogram>

<histogram
    name="Navigation.OnBeforeUnloadOverheadTime.NoBeforeUnloadHandlerRegistered"
    units="ms" expires_after="2027-04-01">
  <owner>hayato@chromium.org</owner>
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Measures the time a posted SendBeforeUnload task spends in the queue before
    execution. It's only recorded when the browser process is already aware that
    no beforeunload handler is registered. Recorded for each SendBeforeUnload
    task (but only when `for_legacy` is true). Emitted when the task runs.
  </summary>
</histogram>

<histogram name="Navigation.OnBeforeUnloadTotalTime" units="ms"
    expires_after="2027-04-01">
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Milliseconds spent to process all the beforeunload events in JavaScript and
    waiting time for beforeunload dialog is closed if necessary. Recorded only
    when a non-reload navigation occurs.
  </summary>
</histogram>

<histogram
    name="Navigation.OnGestureStart.NavigationInProgress{NavigationMode}"
    enum="Boolean" expires_after="2026-09-06">
  <owner>lazzzis@google.com</owner>
  <owner>liuwilliam@chromium.org</owner>
  <owner>chrome-seamless-core@google.com</owner>
  <summary>
    Record if a nav is in progress when a gesture has been just started. This
    records for {NavigationMode} when a gesture has been just started. This
    records once per navigation gesture. Android only.
  </summary>
  <token key="NavigationMode" variants="NavigationMode"/>
</histogram>

<histogram name="Navigation.OriginAgentCluster.Result"
    enum="OriginAgentClusterEndResult" expires_after="2027-06-24">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <summary>
    For every successful cross-document commit, this logs whether or how
    OriginAgentCluster was involved. It tracks whether it was requested, as well
    as whether the isolation was granted, which can be affected by other
    documents in the same browsing context group. If OriginAgentCluster-by-
    default is not enabled, the first four enum values track this state. If
    OriginAgentCluster-by-default is enabled, then the second (disjoint) set of
    six enum values tracks this state, plus the two additional cases where
    OriginAgentCluster was explicitly not requested, and was or wasn't granted.

    Warning: this histogram was expired from 2025/05/18 to 2025/06/24; data may
    be missing.
  </summary>
</histogram>

<histogram name="Navigation.PageLifecycleStateFromNewPageCommit.Duration"
    units="ms" expires_after="2027-04-01">
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures the total running time of the previous page's event handlers such
    as pagehide and visibilitychange when the new page's navigation is
    committed.
  </summary>
</histogram>

<histogram
    name="Navigation.PendingCommit.BlockedCommitCount.{RegularOrMHTMLType}"
    units="count" expires_after="2023-12-31">
  <owner>dcheng@chromium.org</owner>
  <owner>rakina@chromium.org</owner>
  <summary>
    Records how many attempts to assign a final RenderFrameHost for a navigation
    were blocked due to a pre-existing speculative RenderFrameHost being in the
    kPendingCommit state. Collected when the navigation commits in
    DidCommitNavigation().
  </summary>
  <token key="RegularOrMHTMLType" variants="RegularOrMHTMLType"/>
</histogram>

<histogram name="Navigation.PendingCommit.BlockedCount.{RegularOrMHTMLType}"
    units="count" expires_after="2023-12-31">
  <owner>dcheng@chromium.org</owner>
  <owner>rakina@chromium.org</owner>
  <summary>
    Records how many attempts to assign RenderFrameHost (initial or final) for a
    navigation were blocked due to a pre-existing speculative RenderFrameHost
    being in the kPendingCommit state. Collected when the navigation commits in
    DidCommitNavigation().
  </summary>
  <token key="RegularOrMHTMLType" variants="RegularOrMHTMLType"/>
</histogram>

<histogram
    name="Navigation.PendingCommit.DidBlockGetFrameHostForNavigation.{RegularOrMHTMLType}"
    enum="Boolean" expires_after="2023-12-31">
  <owner>dcheng@chromium.org</owner>
  <owner>rakina@chromium.org</owner>
  <summary>
    Records whether any calls to `GetFrameHostForNavigation()` that failed due
    to a pre-existing speculative RenderFrameHost being in the kPendingCommit
    state. Collected when the navigation commits in DidCommitNavigation().
  </summary>
  <token key="RegularOrMHTMLType" variants="RegularOrMHTMLType"/>
</histogram>

<histogram name="Navigation.PendingCommit.Duration.{RegularOrMHTMLType}"
    units="ms" expires_after="2026-03-15">
  <owner>dcheng@chromium.org</owner>
  <owner>rakina@chromium.org</owner>
  <summary>
    Measures the amount of time between the browser asking a speculative
    RenderFrameHost to commit a navigation in the renderer and the commit
    actually being recorded in the browser process. Collected when the
    navigation commits in DidCommitNavigation().
  </summary>
  <token key="RegularOrMHTMLType" variants="RegularOrMHTMLType"/>
</histogram>

<histogram name="Navigation.Preconnect.PreresolveJobQueueingTime" units="ms"
    expires_after="2023-08-08">
  <owner>alexilin@chromium.org</owner>
  <owner>blundell@chromium.org</owner>
  <owner>lizeb@chromium.org</owner>
  <owner>pasko@chromium.org</owner>
  <summary>
    Measures the amount of time that a requested preresolve job spends queueing
    before being executed (e.g., due to a max # of preconnects being in flight).
    Recorded for each presolve job.
  </summary>
</histogram>

<histogram name="Navigation.Preconnect.ResolveHostCallbackQueueingTime"
    units="ms" expires_after="2023-06-04">
  <owner>alexilin@chromium.org</owner>
  <owner>blundell@chromium.org</owner>
  <owner>lizeb@chromium.org</owner>
  <owner>pasko@chromium.org</owner>
  <summary>
    Measures the amount of time that the task corresponding to the completion
    callback for a host resolution performed as part of navigation preconnect
    spent being queued before executing. Recorded for each host resolution.
  </summary>
</histogram>

<histogram name="Navigation.Preconnect.ResolveHostLatency" units="ms"
    expires_after="2023-06-04">
  <owner>alexilin@chromium.org</owner>
  <owner>lizeb@chromium.org</owner>
  <owner>pasko@chromium.org</owner>
  <summary>
    Measures the duration from initiation to completion for a host resolution
    performed as part of navigation preconnect. Recorded for each host
    resolution. Note: Does not capture any delay spent queuing *before*
    initiating the host resolution (e.g., due to a max # of preconnects being in
    flight).
  </summary>
</histogram>

<histogram name="Navigation.Prefetch.CompressedBodySize" units="KB"
    expires_after="2025-04-27">
  <owner>ricea@chromium.org</owner>
  <owner>chikamune@chromium.org</owner>
  <summary>
    Records the size of the response body for prefetch responses that had a
    non-trivial Content-Encoding. This is logged once per successfully completed
    compressed response in PrefetchManager::OnPrefetchFinished(). A response is
    considered compressed when the decoded body length is larger than the
    encoded body length. Compare to Navigation.Prefetch.UncompressedBodySize.
  </summary>
</histogram>

<histogram name="Navigation.Prefetch.IsHttps" enum="Boolean"
    expires_after="2025-04-27">
  <owner>ricea@chromium.org</owner>
  <owner>chikamune@chromium.org</owner>
  <summary>
    Records whether or not a prefetch requested a URL with an https scheme.
    Recorded once for each prefetch performed by PrefetchManager. This is based
    on what the PrefetchManager requested and doesn't take into account
    subsequent internal or external redirects to https.
  </summary>
</histogram>

<histogram
    name="Navigation.Prefetch.IsPrefetchingSRPUrl.{PreloadingEmbedderType}"
    enum="Boolean" expires_after="2026-09-27">
  <owner>robertlin@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    To record whether a prefetching attempt initiated by
    {PreloadingEmbedderType} trigger is trying to prefetch a SRP url or not.

    This is recorded when
    {PreloadingEmbedderType}PreloadPipelineManager::StartPrefetch is called to
    initiate a SPR url.
  </summary>
  <token key="PreloadingEmbedderType">
    <variant name="Embedder_BookmarkBar" summary="BookmarkBar"/>
  </token>
</histogram>

<histogram name="Navigation.Prefetch.PrefetchJobQueueingTime" units="ms"
    expires_after="2023-03-19">
  <owner>blundell@chromium.org</owner>
  <owner>ryansturm@chromium.org</owner>
  <owner>sophiechang@chromium.org</owner>
  <summary>
    Measures the amount of time that a requested prefetch job spends queueing
    before being executed (e.g., due to a max # of prefetches being in flight).
    Recorded for each prefetch job.
  </summary>
</histogram>

<histogram name="Navigation.Prefetch.PrefetchJobQueueLength" units="count"
    expires_after="2023-03-19">
  <owner>blundell@chromium.org</owner>
  <owner>ryansturm@chromium.org</owner>
  <owner>sophiechang@chromium.org</owner>
  <summary>
    Measures the length of the queue of prefetch jobs at the beginning of
    PrefetchManager processing this queue to execute jobs. Recorded each time
    that PrefetchManager processes the queue of pending jobs.
  </summary>
</histogram>

<histogram name="Navigation.Prefetch.UncompressedBodySize" units="KB"
    expires_after="2025-04-27">
  <owner>ricea@chromium.org</owner>
  <owner>chikamune@chromium.org</owner>
  <summary>
    Records the size of the response body for prefetch responses that did not
    use HTTP Content-Encoding compression. This is logged once per successfully
    completed uncompressed response in PrefetchManager::OnPrefetchFinished(). A
    response is considered compressed when the decoded body length is larger
    than the encoded body length. Compare to
    Navigation.Prefetch.CompressedBodySize.
  </summary>
</histogram>

<histogram
    name="Navigation.Prerender.ActivationCommitDeferTime{PreloadingTriggerType}"
    units="ms" expires_after="2027-07-08">
  <owner>nhiroki@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Measures time a PrerenderCommitDeferringCondition defers activation waiting
    to commit an ongoing mainframe prerender navigation. Logged every time a
    PrerenderCommitDeferringCondition defers navigation.

    After 2023/05, this metric is used with PreloadingTriggerType key and
    records even when PrerenderCommitDeferringCondition doesn't delay navigation
    as zero delay. Previously the metric was only used without the key and
    recorded only when PrerenderCommitDeferringCondition deferred navigation.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram
    name="Navigation.Prerender.NoVarySearchCommitDeferTime.{NVSTriggerType}"
    units="ms" expires_after="2027-01-03">
  <owner>lingqi@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Measures time a PrerenderNoVarySearchCommitDeferringCondition defers
    activation waiting to commit an ongoing mainframe prerender navigation.
    Logged whenever a PrerenderNoVarySearchCommitDeferringCondition defers
    navigation.
  </summary>
  <token key="NVSTriggerType">
    <variant name="Embedder_DefaultSearchEngine"/>
    <variant name="Embedder_WebView"/>
    <variant name="SpeculationRule"/>
  </token>
</histogram>

<histogram
    name="Navigation.ProcessNavigationThrottlesTime.WillStartRequest.{FrameType}"
    units="ms" expires_after="2026-03-01">
  <owner>sisidovski@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures the time taken to process regsitered navigation throttles in the
    WillStartRequest event for a {FrameType}. Recorded for every navigation,
    before dispatching the request.
  </summary>
  <token key="FrameType" variants="FrameTypes"/>
</histogram>

<histogram name="Navigation.ProcessReuseOnCOOP.{ProcessReuseOnCOOPType}"
    enum="Boolean" expires_after="2026-11-29">
  <owner>taiyo@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the result of process reuse when swapping Browsing Instances due to
    COOP mismatches on `RenderFrameHostManager::GetSiteInstanceForNavigation()`.

    The outcomes of reuse successes/failures are recorded once per each reuse
    attempt categorized by `ProcessReuseOnCOOPType`. Specifically, 1)
    `DifferentSiteInstance`: Candidate and target SiteInstances differ (e.g.,
    cross-site navigations with speculative RFH) 2)
    `SameSiteNavigationInSingleWebContents`: Same-site navigations with single
    WebContents in the current BrowsingInstance 3) `Prerender`: Prerender's
    initial navigation with new FrameTree. If none of these strategies match,
    the type will be `None`, and the result is recorded as always false.

    For more context, please see crbug.com/40254888, crbug.com/41492112,
    crrev.com/c/6238439/comment/fb22b7bc_c8962d32/.
  </summary>
  <token key="ProcessReuseOnCOOPType" variants="ProcessReuseOnCOOPType"/>
</histogram>

<histogram name="Navigation.QueueTime.{Method}.{FrameType}" units="ms"
    expires_after="2027-02-07">
  <owner>cduvall@chromium.org</owner>
  <owner>yyanagisawa@chromium.org</owner>
  <summary>
    Measures the amount of time the task to run {Method} was queued before
    running. Logged every time {Method} is run for a {FrameType} in
    NavigationURLLoaderImpl with a valid queue time.

    Warning: this histogram was expired after 2023-07-28 and brought back
    2024-05-20; data may be missing.
  </summary>
  <token key="Method">
    <variant name="OnAcceptCHFrameReceived"/>
    <variant name="OnReceiveRedirect"/>
    <variant name="OnReceiveResponse"/>
  </token>
  <token key="FrameType" variants="FrameTypes"/>
</histogram>

<histogram name="Navigation.ReadyToCommitUntilCommit2" units="ms"
    expires_after="2023-03-05">
  <owner>clamy@chromium.org</owner>
  <owner>nasko@chromium.org</owner>
  <summary>
    The time needed to commit a navigation once it is ready to commit. This is
    the time between ReadyToCommit and DidFinishNavigation (for a navigation
    that commits).

    Warning: this histogram was expired after M85 and brought back 2021-04-13;
    data may be missing.
  </summary>
</histogram>

<histogram name="Navigation.RegisterNavigationThrottlesTime.{FrameType}"
    units="ms" expires_after="2027-05-24">
  <owner>sisidovski@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures the time taken to register navigation throttles in
    NavigationThrottleRunner for a {FrameType}. Recorded for every navigation,
    before dispatching the request.
  </summary>
  <token key="FrameType" variants="FrameTypes"/>
</histogram>

<histogram name="Navigation.Renderer.BlockedForFilterURL"
    enum="RendererBlockedURLReason" expires_after="2026-10-25">
  <owner>creis@chromium.org</owner>
  <owner>site-isolation-dev@chromium.org</owner>
  <summary>
    Recorded when RenderFrameImpl::IsValidCommitUrl detects a navigation URL
    that would be blocked by RenderProcessHostImpl::FilterURL and rewrites it to
    about:blank#blocked. See also BrowserRenderProcessHost.BlockedByFilterURL
    for cases caught by the browser process, and https://crbug.com/40066983.
  </summary>
</histogram>

<histogram name="Navigation.Renderer.ProcessReadiness"
    enum="RendererProcessReadiness" expires_after="2026-11-29">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <summary>
    Identifies how ready the renderer process is for processing a
    CommitNavigation IPC by recording whether the process was ready for
    processing IPC when CommitNavigation was sent, and if so, whether all
    prerequisite view/proxy/frame objects were already created. Recorded in the
    renderer at the end of committing a navigation.
  </summary>
</histogram>

<histogram name="Navigation.Renderer.ProcessReadiness.MainFrameOnly"
    enum="RendererProcessReadiness" expires_after="2026-11-29">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <summary>
    Identifies how ready the renderer process is for processing a main frame
    CommitNavigation IPC by recording whether the process was ready for
    processing IPC when CommitNavigation was sent, and if so, whether all
    prerequisite view/proxy/frame objects were already created. Recorded in the
    renderer at the end of committing navigation. Similar to
    Navigation.Renderer.ProcessReadiness, but recorded for main frames only.
    Note that this is not limited to outermost or primary main frames.
  </summary>
</histogram>

<histogram name="Navigation.Renderer.Timeline.{DurationFromTo}.Duration"
    units="ms" expires_after="2027-01-03">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <summary>
    Measures the duration {DurationFromTo}. Recorded at the point when a
    navigation finishes committing in the renderer process, i.e. after
    processing the CommitNavigation message. A corresponding event is also
    emitted for tracing.
  </summary>
  <token key="DurationFromTo">
    <variant name="CommitToDidCommit"
        summary="between when the renderer process receives a
                 CommitNavigation IPC to when the renderer process finishes
                 processing that IPC and sends a DidCommitNavigation reply."/>
    <variant name="CreateChildProxies"
        summary="of creating all proxies for subframes of a given page,
                 possibly including a proxy for the navigating frame if it is
                 a subframe"/>
    <variant name="CreateFrame"
        summary="of creating the provisional local frame in which the
                 navigation is occurring. This frame will be swapped into the
                 frame tree when the navigation commits"/>
    <variant name="CreateView"
        summary="of creating the RenderView for a particular frame tree,
                 which could be a frame tree for the navigating frame or one
                 of the frame trees on its opener chain. This includes the
                 time to create the view's main frame, which could be either
                 a local frame or a remote frame (proxy)"/>
    <variant name="Total"
        summary="between when the navigation starts and when the renderer
                 process finishes processing the navigation commit and sends
                 a DidCommitNavigation reply."/>
    <variant name="WaitingForProcessReady"
        summary="between the navigation start time and when the renderer
                 process has finished initializing and starting its RunLoop.
                 Only recorded for navigations where the navigation started
                 before the RunLoop was ready"/>
  </token>
</histogram>

<histogram name="Navigation.RendererCancellationThrottle.NavigationCancelled"
    enum="Boolean" expires_after="2026-09-13">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    When RendererCancellationThrottle defers navigation, this records whether
    the navigation actually gets cancelled or not.

    Recorded when the RendererCancellationThrottle is destroyed.
  </summary>
</histogram>

<histogram
    name="Navigation.RendererCancellationThrottle.NavigationCancelled.TimeUntilCancel"
    units="ms" expires_after="2026-09-13">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    When RendererCancellationThrottle defers navigation and the navigation
    actually gets cancelled, records the time it takes from defer start to the
    cancellation, which causes the RendererCancellationThrottle to be
    destructed.

    Recorded when the RendererCancellationThrottle is destroyed.
  </summary>
</histogram>

<histogram
    name="Navigation.RendererCancellationThrottle.NotCancelled.TimeoutIsHit"
    enum="Boolean" expires_after="2026-09-13">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    When RendererCancellationThrottle defers navigation and the navigation is
    not cancelled, this records whether the throttle hits the timeout or not
    (the JS task that initiates the navigation finishes earlier than the
    timeout).

    Recorded when either the defer timeout is reached, or when the IPC that
    indicates that JS task that initiates the navigation finishes is received on
    the browser side.
  </summary>
</histogram>

<histogram name="Navigation.RendererCancellationThrottle.TimeUntilWindowEnd"
    units="ms" expires_after="2026-09-13">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time from when the RendererCancellationThrottle defers a navigation
    until it finishes the JS task that initiates the navigation to finish.

    Recorded when the IPC that indicates that JS task that initiates the
    navigation finishes is received on the browser side.
  </summary>
</histogram>

<histogram name="Navigation.RendererCommitDelay.{FrameType}" units="ms"
    expires_after="2027-02-07">
  <owner>cduvall@chromium.org</owner>
  <owner>jam@chromium.org</owner>
  <summary>
    Measures the delay between when the navigation commit was sent by the
    browser to when it is received by the renderer. Recorded for every
    cross-document non-page activation navigation commit.

    Warning: this histogram was expired after 2023-05-05 and brought back
    2024-05-09; data may be missing.
  </summary>
  <token key="FrameType" variants="FrameTypes"/>
</histogram>

<histogram name="Navigation.RendererCommitProcessWaitTime.{FrameType}"
    units="ms" expires_after="2027-02-07">
  <owner>cduvall@chromium.org</owner>
  <owner>jam@chromium.org</owner>
  <summary>
    Measures how long the navigation commit was waiting for the renderer process
    to start before it was able to receive the commit. Recorded for every
    cross-document non-page activation navigation commit which waits on a
    process start.

    Warning: this histogram was expired after 2023-05-05 and brought back
    2024-05-09; data may be missing.
  </summary>
  <token key="FrameType" variants="FrameTypes"/>
</histogram>

<histogram name="Navigation.RendererCommitQueueTime.{FrameType}" units="ms"
    expires_after="2026-02-22">
  <owner>cduvall@chromium.org</owner>
  <owner>jam@chromium.org</owner>
  <summary>
    Measures queue time for the navigation commit mojo task on the renderer
    side. Recorded for every cross-document non-page activation navigation
    commit.

    Warning: this histogram was expired after 2023-05-05 and brought back
    2024-05-09; data may be missing.
  </summary>
  <token key="FrameType" variants="FrameTypes"/>
</histogram>

<histogram name="Navigation.RendererDidNavigateTime.{FrameType}" units="ms"
    expires_after="2023-07-28">
  <owner>cduvall@chromium.org</owner>
  <owner>jam@chromium.org</owner>
  <summary>
    Measures time it takes to call
    NavigationControllerImpl::RendererDidNavigate. Recorded for each navigation
    that is not a same document navigation.
  </summary>
  <token key="FrameType" variants="FrameTypes"/>
</histogram>

<histogram
    name="Navigation.RendererRunLoopStartToFirstCommitNavigation2.{FrameType}"
    units="ms" expires_after="2027-04-01">
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures the duration between a) the start timing of the renderer's RunLoop
    and b) the first CommitNavigation. Recorded on the first navigation commit
    in the renderer process. If the first navigation does not commit http or
    https, this is not recorded.
  </summary>
  <token key="FrameType" variants="FrameTypes"/>
</histogram>

<histogram name="Navigation.RenderFrameDelete" units="ms"
    expires_after="2027-02-07">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time it takes for the RenderFrameImpl::Delete() to run. Recorded on
    every RenderFrameImpl::Delete() call.
  </summary>
</histogram>

<histogram name="Navigation.RenderFrameHostConstructor" units="ms"
    expires_after="2027-02-07">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time it takes for the RenderFrameHost constructor to run. Recorded on
    every RenderFrameHost construction.
  </summary>
</histogram>

<histogram name="Navigation.RenderFrameHostDestructor" units="ms"
    expires_after="2027-02-07">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time it takes for the RenderFrameHost destructor to run. Recorded on
    every RenderFrameHost destruction.
  </summary>
</histogram>

<histogram name="Navigation.RenderViewHostConstructor" units="ms"
    expires_after="2026-03-31">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time it takes for the RenderViewHost constructor to run. Recorded on
    every RenderViewHost construction.
  </summary>
</histogram>

<histogram name="Navigation.RenderViewHostDestructor" units="ms"
    expires_after="2026-05-31">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time it takes for the RenderViewHost destructor to run. Recorded on
    every RenderViewHost destruction.
  </summary>
</histogram>

<histogram name="Navigation.RenderWidgetHostConstructor" units="ms"
    expires_after="2026-03-31">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time it takes for the RenderWidgetHost constructor to run. Recorded on
    every RenderWidgetHost construction.
  </summary>
</histogram>

<histogram name="Navigation.RenderWidgetHostDestructor" units="ms"
    expires_after="2026-03-31">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time it takes for the RenderWidgetHost destructor to run. Recorded on
    every RenderWidgetHost destruction.
  </summary>
</histogram>

<histogram name="Navigation.RequiresDedicatedProcess"
    enum="NavigationRequiresDedicatedProcess" expires_after="2027-06-24">
  <owner>alexmos@chromium.org</owner>
  <owner>lukasza@chromium.org</owner>
  <summary>
    Whether the navigation commits in a SiteInstance that requires a dedicated
    process. Logged at ready-to-commit time for every navigation excluding
    same-document navigations and errors.
  </summary>
</histogram>

<histogram name="Navigation.RequiresDedicatedProcess.HTTPOrHTTPS"
    enum="NavigationRequiresDedicatedProcess" expires_after="2027-06-24">
  <owner>alexmos@chromium.org</owner>
  <owner>lukasza@chromium.org</owner>
  <summary>
    Whether the navigation commits in a SiteInstance that requires a dedicated
    process. Logged at ready-to-commit time for every navigation that commits
    with a HTTP or HTTPS URL scheme, excluding same-document navigations and
    errors.
  </summary>
</histogram>

<histogram name="Navigation.SameDocumentNavigationWithScreenshot"
    enum="Boolean" expires_after="2026-10-25">
  <owner>khushalsagar@chromium.org</owner>
  <owner>liuwilliam@chromium.org</owner>
  <summary>
    Measures the number of same-document navigations which commit in the
    renderer. The metric is recorded each time the renderer commits a navigation
    and tracks whether the navigation is eligible for screenshotting for
    navigation transitions
  </summary>
</histogram>

<histogram name="Navigation.SendCommitNavigationTime.{FrameType}" units="ms"
    expires_after="2023-08-15">
  <owner>cduvall@chromium.org</owner>
  <owner>jam@chromium.org</owner>
  <summary>
    Measures the time RenderFrameHostImpl::SendCommitNavigation takes to run.
    Recorded every time the method executes.
  </summary>
  <token key="FrameType" variants="FrameTypes"/>
</histogram>

<histogram name="Navigation.SpeculativeRFHProcessGone.MayResume" enum="Boolean"
    expires_after="2027-01-17">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Record if the navigation can be potentially resumed when the render process
    is gone for the speculative RenderFrameHost. The UMA is recorded each time
    the render process for the speculative RenderFrameHost is gone and the
    corresponding navigation is not committed yet. The UMA records true if the
    navigation has not processed the network response yet.
  </summary>
</histogram>

<histogram name="Navigation.StartAdjustment.AllFrames"
    enum="NavigationStartAdjustmentType" expires_after="2026-10-11">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records whether an adjustment was made to the start time of a cross-document
    navigation, and what the reason was if so. This metric is recorded each time
    a cross-document navigation finishes. (Same-document navigations never have
    adjustments.) This includes both main frame and subframe navigations, the
    latter of which are less likely to have adjustments. See also
    Navigation.StartAdjustment.MainFrameOnly.
  </summary>
</histogram>

<histogram name="Navigation.StartAdjustment.BeforeUnloadDialog" units="ms"
    expires_after="2026-11-15">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records how many milliseconds the navigation start time was delayed, in
    cases where it was adjusted to after a beforeunload dialog was displayed.
    See also Navigation.StartAdjustment.BeforeUnloadDialog.Percentage.
  </summary>
</histogram>

<histogram name="Navigation.StartAdjustment.BeforeUnloadDialog.Negative"
    units="ms" expires_after="2026-11-15">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records how many milliseconds the navigation start time was unexpectedly
    moved earlier (due to a bug with updating the wrong NavigationRequest), in
    cases where it was adjusted to after a beforeunload dialog was displayed. No
    corresponding percentage is reported in these cases.
  </summary>
</histogram>

<histogram name="Navigation.StartAdjustment.BeforeUnloadDialog.Percentage"
    units="%" expires_after="2026-11-15">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records the percentage of navigation time that was ignored, in cases where
    the start time was adjusted to after a beforeunload dialog was displayed.
  </summary>
</histogram>

<histogram name="Navigation.StartAdjustment.BeforeUnloadHandlers" units="ms"
    expires_after="2026-11-15">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records how many milliseconds the navigation start time was delayed, in
    cases where it was adjusted to after beforeunload handlers ran, when no
    dialog was displayed. See also
    Navigation.StartAdjustment.BeforeUnloadHandlers.Percentage.
  </summary>
</histogram>

<histogram name="Navigation.StartAdjustment.BeforeUnloadHandlers.Negative"
    units="ms" expires_after="2026-11-15">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records how many milliseconds the navigation start time was unexpectedly
    moved earlier (due to a bug with updating the wrong NavigationRequest), in
    cases where it was adjusted to after beforeunload handlers ran, when no
    dialog was displayed. No corresponding percentage is reported in these
    cases.
  </summary>
</histogram>

<histogram name="Navigation.StartAdjustment.BeforeUnloadHandlers.Percentage"
    units="%" expires_after="2026-11-15">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records the percentage of navigation time that was ignored, in cases where
    the start time was adjusted to after beforeunload handlers ran, when no
    dialog was displayed.
  </summary>
</histogram>

<histogram name="Navigation.StartAdjustment.LegacyPostTask" units="ms"
    expires_after="2026-11-15">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records how many milliseconds the navigation start time was delayed, in
    cases where it was adjusted to after a legacy PostTask was run, when no
    beforeunload handlers were registered. See also
    Navigation.StartAdjustment.LegacyPostTask.Percentage.
  </summary>
</histogram>

<histogram name="Navigation.StartAdjustment.LegacyPostTask.Negative" units="ms"
    expires_after="2026-09-13">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records how many milliseconds the navigation start time was unexpectedly
    moved earlier (due to a bug with updating the wrong NavigationRequest), in
    cases where it was adjusted to after a legacy PostTask was run, when no
    beforeunload handlers were registered. No corresponding percentage is
    reported in these cases.
  </summary>
</histogram>

<histogram name="Navigation.StartAdjustment.LegacyPostTask.Percentage"
    units="%" expires_after="2026-11-15">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records the percentage of navigation time that was ignored, in cases where
    the start time was adjusted to after a legacy PostTask was run, when no
    beforeunload handlers were registered.
  </summary>
</histogram>

<histogram name="Navigation.StartAdjustment.MainFrameOnly"
    enum="NavigationStartAdjustmentType" expires_after="2026-10-11">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records whether an adjustment was made to the navigation start time in a
    cross-document navigation targeting a primary main frame, and what the
    reason was if so. This metric is recorded each time a cross-document
    navigation finishes in a primary main frame. (Same-document navigations
    never have adjustments.)
  </summary>
</histogram>

<histogram name="Navigation.StartToCommit{NavigationProcessType}" units="ms"
    expires_after="2027-01-03">
  <owner>nasko@chromium.org</owner>
  <owner>csharrison@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The time delta between the start of a navigation and the time it is
    committed.

    Warning: this histogram was expired after M85 and brought back 2021-04-13;
    data may be missing. {NavigationProcessType}
  </summary>
  <token key="NavigationProcessType" variants="NavigationProcessType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Navigation.SuddenTerminationDisabler.{Origins}"
    enum="NavigationSuddenTerminationDisabler" expires_after="2024-06-30">
  <owner>fergal@chromium.org</owner>
  <owner>rakina@chromium.org</owner>
  <summary>
    Records the combination of mainframe/subframe and what sudden termination
    disablers were present. This is recorded on every cross-document navigation.
    Currently only covers Unload. The SameOrigin variant only considers a frame
    to be same origin as the main frame if it can be reached through a chain of
    same-origin frames. So e.g. in a-&gt;b-&gt;a, the second a is not
    same-origin.
  </summary>
  <token key="Origins">
    <variant name="AllOrigins"/>
    <variant name="SameOrigin"/>
  </token>
</histogram>

<histogram name="Navigation.SurfaceEmbedToFCPFrameSubmission" units="ms"
    expires_after="2026-04-05">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records the time between when the surface used for a new document gets
    embedded by the browser process to when the first contentful paint frame for
    the new document is received by Viz. Logged after the first contentful frame
    has been displayed on screen.
  </summary>
</histogram>

<histogram name="Navigation.ThrottleCount" units="throttles"
    expires_after="2027-02-07">
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures the total count of navigation throttles that are actually
    registered for a navigation request. Recorded per navigation on destructing
    NavigationThrottleRunner.

    Warning: this histogram was expired from 2025-12-01 to 2026-01-06; data may
    be missing.
  </summary>
</histogram>

<histogram name="Navigation.ThrottleDeferredEvent"
    enum="NavigationThrottleEvent" expires_after="2027-02-07">
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the navigation throttle event type that observes DEFER on running
    NavigationThrottles. Recorded per receiving DEFER decision on each throttle
    run to understand the distribution.
  </summary>
</histogram>

<histogram name="Navigation.ThrottleDeferTime.{Event}" units="ms"
    expires_after="2026-12-07">
  <owner>cduvall@chromium.org</owner>
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures time a navigation throttle was deferred when on {Event}. Logged
    every time a throttle defers a navigation.

    Warning: this histogram was expired from 2023-02-11 to 2024-06-17; data may
    be missing.
  </summary>
  <token key="Event" variants="NavigationThrottleEvents"/>
</histogram>

<histogram name="Navigation.ThrottleEventDurationTime.{Event}" units="ms"
    expires_after="2026-12-07">
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures time a navigation throttle runner took to execute all throttles for
    {Event} including suspended duration by DEFERs. Logged every time a
    navigation throttle runner completes processing all throttles for {Event}
    without any objection.
  </summary>
  <token key="Event" variants="NavigationThrottleEvents"/>
</histogram>

<histogram name="Navigation.ThrottleEventExecutionTime.{Event}" units="ms"
    expires_after="2026-12-07">
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures accumulated time a navigation throttle runner took to execute all
    throttles for {Event}. Logged every time a navigation throttle runner
    completes processing all throttles for {Event} without any objection.
  </summary>
  <token key="Event" variants="NavigationThrottleEvents"/>
</histogram>

<histogram name="Navigation.ThrottleExecutionTime.{Event}" units="ms"
    expires_after="2026-12-07">
  <owner>cduvall@chromium.org</owner>
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures time a navigation throttle took to execute {Event}. Logged every
    time a throttle runs.

    Warning: this histogram was expired from 2023-02-11 to 2024-06-17; data may
    be missing.
  </summary>
  <token key="Event" variants="NavigationThrottleEvents"/>
</histogram>

<histogram name="Navigation.ThrottleTotalDeferCount{Condition}"
    units="throttles" expires_after="2027-02-07">
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures total count of deferred requests that a throttle runner asked on
    {Condition} by any throttle per navigation. Recorded per navigation on
    destructing NavigationThrottleRunner.
  </summary>
  <token key="Condition" variants="NavigationThrottleConditions"/>
</histogram>

<histogram name="Navigation.ThrottleTotalDeferTime{Condition}" units="ms"
    expires_after="2027-02-07">
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Measures total duration time that a throttle runner took to wait for
    deferred requests on {Condition} from all throttles. Recorded per navigation
    on destructing NavigationThrottleRunner.
  </summary>
  <token key="Condition" variants="NavigationThrottleConditions"/>
</histogram>

<histogram name="Navigation.Timeline.IgnoredCorrectly.Duration" units="ms"
    expires_after="2027-03-25">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <summary>
    Reports how much time from beforeunload phases 1 and 2 was correctly
    excluded from the Navigation.Timeline.TotalExcludingBeforeUnload.Duration
    metric, so that beforeunload handlers and dialogs would not be counted as
    part of the navigation.

    Recorded at the point when a navigation finishes committing, i.e. finishes
    processing the DidCommitNavigation message. A corresponding event is also
    emitted for tracing.
  </summary>
</histogram>

<histogram name="Navigation.Timeline.IgnoredIncorrectly.Duration" units="ms"
    expires_after="2027-03-25">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <summary>
    Reports how much time navigation guardrail metrics like FCP are incorrectly
    excluding from the navigation duration, due to collecting start times after
    beforeunload phase 1 finishes and possibly adjusting them to after
    beforeunload phase 2 finishes. This excluded time represents actual time the
    user is waiting that is not accounted for in current metrics.

    Recorded at the point when a navigation finishes committing, i.e. finishes
    processing the DidCommitNavigation message. A corresponding event is also
    emitted for tracing.
  </summary>
</histogram>

<histogram name="Navigation.Timeline.IgnoredIncorrectly.MainFrameOnly.Duration"
    units="ms" expires_after="2027-03-25">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <summary>
    Reports how much time navigation guardrail metrics like FCP are incorrectly
    excluding from the navigation duration, due to collecting start times after
    beforeunload phase 1 finishes and possibly adjusting them to after
    beforeunload phase 2 finishes. This excluded time represents actual time the
    user is waiting that is not accounted for in current metrics.

    This metric is recorded each time a cross-document navigation finishes in a
    primary main frame, i.e. finishes processing the DidCommitNavigation
    message. See also Navigation.Timeline.IgnoredIncorrectly.Duration for all
    navigations, including subframes and same-document cases.
  </summary>
</histogram>

<histogram
    name="Navigation.Timeline.IgnoredIncorrectly.MainFrameOnly.Percentage"
    units="%" expires_after="2027-03-25">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records the percentage of navigation time that was incorrectly ignored due
    to setting the start time later than it should be. See also
    Navigation.Timeline.IgnoredIncorrectly.MainFrameOnly.Duration.

    This metric is recorded each time a cross-document navigation finishes in a
    primary main frame, i.e. finishes processing the DidCommitNavigation
    message. See also Navigation.Timeline.IgnoredIncorrectly.Percentage for all
    navigations, including subframes and same-document cases.
  </summary>
</histogram>

<histogram name="Navigation.Timeline.IgnoredIncorrectly.Percentage" units="%"
    expires_after="2027-03-25">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <summary>
    Records the percentage of navigation time that was incorrectly ignored due
    to setting the start time later than it should be. See also
    Navigation.Timeline.IgnoredIncorrectly.Duration.

    Recorded at the point when a navigation finishes committing, i.e. finishes
    processing the DidCommitNavigation message. A corresponding event is also
    emitted for tracing.
  </summary>
</histogram>

<histogram
    name="Navigation.Timeline.InteractionToActualNavigationStart.MainFrameOnly.Duration"
    units="ms" expires_after="2027-04-01">
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Measures the duration from a) the OS-level timestamp of the user input event
    that started a navigation to b) when the &quot;actual&quot; navigation
    starts. Recorded at the point when a navigation finishes committing, i.e.
    finishes processing the DidCommitNavigation message. This is recorded only
    for main frame cross-document navigations where the user interaction
    timestamp is available.
  </summary>
</histogram>

<histogram
    name="Navigation.Timeline.InteractionToNavigationFinished{ExcludingBeforeUnload}.MainFrameOnly.Duration"
    units="ms" expires_after="2027-04-01">
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Measures the duration from a) the OS-level timestamp of the user input event
    that started a navigation to b) when the navigation finishes committing
    {ExcludingBeforeUnload}. This is recorded only for main frame cross-document
    navigations where the user interaction timestamp is available.
  </summary>
  <token key="ExcludingBeforeUnload">
    <variant name="" summary=""/>
    <variant name=".ExcludingBeforeUnload"
        summary=", excluding the time spent running beforeunload handlers"/>
    <variant name=".ExcludingBeforeUnloadDialog"
        summary=", excluding the time spent opening/closing the beforeunload
                 dialogs, but including the time spent running beforeunload
                 handlers"/>
  </token>
</histogram>

<histogram
    name="Navigation.Timeline.Total{ExcludingBeforeUnload}.MainFrameOnly.Duration"
    units="ms" expires_after="2027-03-25">
  <owner>creis@chromium.org</owner>
  <owner>alexmos@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Measures the duration between when the navigation starts to when the browser
    process finishes processing the DidCommitNavigation IPC, at which point the
    navigation is committed{ExcludingBeforeUnload}.

    This metric is recorded each time a cross-document navigation finishes in a
    primary main frame, i.e. finishes processing the DidCommitNavigation
    message. See also Navigation.Timeline.TotalExcludingBeforeUnload.Duration or
    Navigation.Timeline.TotalExcludingBeforeUnloadDialog.Duration for all
    navigations, including subframes and same-document cases.
  </summary>
  <token key="ExcludingBeforeUnload">
    <variant name="ExcludingBeforeUnload"
        summary=", excluding the time spent running any beforeunload
                 handlers/dialogs"/>
    <variant name="ExcludingBeforeUnloadDialog"
        summary=", excluding the time spent opening/closing the beforeunload
                 dialogs, but including the time spent running beforeunload
                 handlers"/>
  </token>
</histogram>

<histogram name="Navigation.Timeline.{DurationFromTo}.Duration" units="ms"
    expires_after="2027-02-07">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Measures the duration between {DurationFromTo}. Recorded at the point when a
    navigation finishes committing, i.e. finishes processing the
    DidCommitNavigation message. A corresponding event is also emitted for
    tracing.
  </summary>
  <token key="DurationFromTo">
    <variant name="BeforeUnloadPhase1"
        summary="the start and end of beforeunload phase 1 in the initiating
                 renderer process, if that phase runs in a given navigation"/>
    <variant name="BeforeUnloadPhase1Dialog"
        summary="the opening and closing the beforeunload dialog for
                 beforeunload phase 1 in the initiating renderer process, if
                 that phase opens the dialog in a given navigation"/>
    <variant name="BeforeUnloadPhase1ToNavigationRequestCreation"
        summary="when beforeunload phase 1 is finished to when the
                 NavigationRequest is created"/>
    <variant name="BeforeUnloadPhase2"
        summary="the start and end of beforeunload phase 2 in the browser
                 process, if that phase runs in a given navigation"/>
    <variant name="BeforeUnloadPhase2Dialog"
        summary="the opening and closing the beforeunload dialog for
                 beforeunload phase 2 in the browser process, if that phase
                 opens the dialog in a given navigation"/>
    <variant name="BeforeUnloadPhase2ToBeginNavigation"
        summary="when beforeunload phase 2 is finished to when
                 NavigationRequest::BeginNavigation() is called"/>
    <variant name="BeginNavigationToCommit"
        summary="when NavigationRequest::BeginNavigation() is called to start
                 the navigation, to when the CommitNavigation message is
                 sent. This is only logged for navigations that don't go
                 through the network stack, such as about:blank navigations
                 or browser-initiated same-document navigations"/>
    <variant name="BeginNavigationToLoaderStart"
        summary="when NavigationRequest::BeginNavigation() is called to when
                 the NavigationURLLoader starts. Represents the browser
                 process initialization work between beforeunload processing
                 and starting the network request"/>
    <variant name="CommitToDidCommit"
        summary="when the CommitNavigation IPC is sent to the renderer
                 process to when its reply is received by
                 RenderFrameHostImpl::DidCommitNavigation"/>
    <variant name="DidCommitToFinish"
        summary="when the browser process receives the DidCommitNavigation
                 IPC to when the browser process finishes processing that
                 IPC, making the navigation committed"/>
    <variant name="FetchStartToReceiveHeaders"
        summary="when fetch of the document via an HTTP(S) request starts, to
                 when the final response headers are received in the network
                 service. This can include redirects"/>
    <variant name="InteractionToActualNavigationStart"
        summary="a) the OS-level timestamp of the user input event that
                 started a navigation to b) when the navigation starts. This
                 is only logged for navigations that a user interaction
                 timestamp is available"/>
    <variant name="LoaderStartToFetchStart"
        summary="when the NavigationURLLoader starts, to when the browser is
                 ready to fetch the document using an HTTP(S) request"/>
    <variant name="LoaderStartToReceiveResponse"
        summary="when the NavigationURLLoader starts to when
                 NavigationRequest::OnResponseStarted() is called"/>
    <variant name="NavigationRequestToBeforeUnloadPhase2"
        summary="when the NavigationRequest is created to when beforeunload
                 phase 2 is started in the browser process. Includes time to
                 pick a target RenderFrameHost, SiteInstance, and process"/>
    <variant name="NavigationRequestToBeginNavigation"
        summary="when the NavigationRequest is created to when
                 NavigationRequest::BeginNavigation() is called. Logged only
                 when no beforeunload handler processing occurs (otherwise,
                 see NavigationRequestToBeforeUnload and
                 BeforeUnloadToBeginNavigation). Includes time to pick a
                 target RenderFrameHost, SiteInstance, and process"/>
    <variant name="ReceiveHeadersToReceiveResponse"
        summary="when the final response headers are received in the network
                 service to when NavigationRequest::OnResponseStarted() is
                 called in the browser process"/>
    <variant name="ReceiveResponseToCommit"
        summary="when NavigationRequest::OnResponseStarted() is called to
                 when the CommitNavigation IPC is sent to the renderer
                 process"/>
    <variant name="RendererCommitToDidCommit"
        summary="when the renderer process receives a CommitNavigation IPC to
                 when the renderer process sends a DidCommitNavigation reply."/>
    <variant name="StartToBeforeUnloadPhase1"
        summary="when the navigation starts, which could be in the renderer
                 process, to when beforeunload phase 1 starts in that process"/>
    <variant name="StartToNavigationRequestCreation"
        summary="when the navigation starts, which could be in the renderer
                 process, to when the NavigationRequest is created"/>
    <variant name="StartToSyncRendererCommit"
        summary="when the navigation starts in the renderer process, to when
                 the renderer process begins a synchronous renderer commit"/>
    <variant name="Total"
        summary="when the navigation starts to when the browser process
                 finishes processing the DidCommitNavigation IPC, at which
                 point the navigation is committed. Includes the time spent
                 running any beforeunload handlers/dialogs"/>
    <variant name="TotalExcludingBeforeUnload"
        summary="when the navigation starts to when the browser process
                 finishes processing the DidCommitNavigation IPC, at which
                 point the navigation is committed. Excludes the time spent
                 running any beforeunload handlers/dialogs"/>
    <variant name="TotalExcludingBeforeUnloadDialog"
        summary="when the navigation starts to when the browser process
                 finishes processing the DidCommitNavigation IPC, at which
                 point the navigation is committed. Excludes the time spent
                 opening/closing the beforeunload dialogs, but includes the
                 time spent running beforeunload handlers"/>
  </token>
</histogram>

<histogram name="Navigation.TimeToActivatePrerender{PreloadingTriggerType}"
    units="ms" expires_after="2027-02-07">
  <owner>nhiroki@chromium.org</owner>
  <owner>sreejakshetty@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    The time needed to commit a navigation using prerender activation. This is
    the time from the beginning of NavigationStart to the end of
    DidCommitPageActivation.

    This metric is logged everytime prerender activation navigation commits.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram name="Navigation.TimeToReadyToCommit2{NavigationProcessType}"
    units="ms" expires_after="2027-02-07">
  <owner>clamy@chromium.org</owner>
  <owner>nasko@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The time delta between the start of a navigation and the time it is ready to
    commit.

    Warning: this histogram was expired after M85 and brought back 2021-04-13;
    data may be missing. {NavigationProcessType}
  </summary>
  <token key="NavigationProcessType" variants="NavigationProcessType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Navigation.Unload" units="ms" expires_after="2027-01-17">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time it takes for RenderFrameHostImpl::Unload() to run. Recorded on
    every RenderFrameHostImpl::Unload() call.
  </summary>
</histogram>

<histogram name="Navigation.URLLoader.HasClientHintsControllerDelegate"
    enum="Boolean" expires_after="2027-01-17">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether a ClientHintsControllerDelegate was available when creating
    a resource request for a navigation. This is part of investigating if the
    delegate is sometimes missing when it should be present.
  </summary>
</histogram>

<histogram name="Navigation.URLLoader.InMainPath" enum="Boolean"
    expires_after="2025-09-25">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records NavigationURLLoader is executed as the main path or not.

    This is recorded on each main resource load on navigation. Multiple events
    will be recorded for redirect cases.
  </summary>
</histogram>

<histogram
    name="Navigation.URLLoader.OnAcceptCHFrameReceived.CriticalHintsMissingStatus"
    enum="CriticalHintsMissingStatus" expires_after="2027-02-14">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    When a server sends an Accept-CH frame, the browser may need to restart the
    navigation to include additional client hints. This can be avoided if the
    network service can determine that all critical hints are already present.
    If the network service cannot determine this, it asks the browser process.
    This histogram is recorded when the browser process checks for missing
    critical hints, and indicates the result.
  </summary>
</histogram>

<histogram
    name="Navigation.URLLoader.OnAcceptCHFrameReceived.EnabledClientHintsMatch"
    enum="BooleanMatched" expires_after="2026-10-18">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether the enabled client hints at resource request creation time
    match the enabled client hints at the time OnAcceptCHFrameReceived is
    called. This is to debug why the Accept-CH offloading optimization is not
    performing as expected.
  </summary>
</histogram>

<histogram
    name="Navigation.URLLoader.OnAcceptCHFrameReceived.EnabledClientHintsMatch.{ClientHintsMismatchType}"
    enum="BooleanMatched" expires_after="2026-10-25">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    As part of the Accept-CH offloading optimization, the browser calculates the
    set of enabled client hints at the start of a navigation. This set can be
    re-evaluated later (e.g., after receiving an `Accept-CH` frame). When the
    initial set of hints does not match the re-evaluated set (recorded as
    'false' in the parent
    `Navigation.URLLoader.OnAcceptCHFrameReceived.EnabledClientHintsMatch`
    histogram), this metric is recorded to identify which part of the
    information differed. Specifically, it records whether the
    {ClientHintsMismatchType} matches.
  </summary>
  <token key="ClientHintsMismatchType">
    <variant name="Hints" summary="the hints vector"/>
    <variant name="IsOutermostMainFrame"
        summary="the is_outermost_main_frame field"/>
    <variant name="Origin" summary="the origin field"/>
  </token>
</histogram>

<histogram name="Navigation.URLLoader.OnAcceptCHFrameReceived.ExecutionTime"
    units="microseconds" expires_after="2027-02-14">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Record the time to execute Accept-CH receiver function in
    NavigationURLLoader. It is recorded just before returning from the
    OnAcceptCHFrameReceived() IPC, and is an elapsed time from the function is
    called to returning. Refer to
    NavigationURLLoaderImpl::OnAcceptCHFrameReceived() for details.

    Note: The metrics is reported from all clients. Some of clients may not have
    high resolution timer that can send metrics with microseconds precision.
  </summary>
</histogram>

<histogram name="Navigation.URLLoader.OnAcceptCHFrameReceived.HintsMismatch"
    enum="WebClientHintsType" expires_after="2026-08-17">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    As part of the Accept-CH offloading optimization, the browser compares the
    set of enabled client hints calculated at the start of a navigation with a
    re-evaluated set from later in the process. When the list of specific hint
    types within these sets does not match (recorded as 'false' in the
    `Navigation.URLLoader.OnAcceptCHFrameReceived.EnabledClientHintsMatch.Hints`
    histogram), this metric is recorded for each hint that is present in one
    list but not the other. This helps identify exactly which client hints are
    causing the mismatch.
  </summary>
</histogram>

<histogram
    name="Navigation.URLLoader.OnAcceptCHFrameReceived.RestartTime{OffTheRecordStatus}"
    units="ms" expires_after="2026-08-09">
  <owner>kouhei@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The time elapsed between the original navigation start and the restarted
    navigation start due to an ACCEPT_CH frame, estimating the additional time
    incurred by an ACCEPT_CH frame restart. This is recorded every time a
    navigation is restarted due to an ACCEPT_CH frame{OffTheRecordStatus}.
  </summary>
  <token key="OffTheRecordStatus" variants="OffTheRecordStatus"/>
</histogram>

<histogram
    name="Navigation.URLLoader.OnAcceptCHFrameReceived.ReturnLocation{OffTheRecordStatus}"
    enum="OnAcceptCHFrameReceivedReturnLocation" expires_after="2027-01-03">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the code location where the Accept-CH receiver function in

    NavigationURLLoader returns. This is recorded each time

    OnAcceptCHFrameReceived is called{OffTheRecordStatus}. Refer to

    NavigationURLLoaderImpl::OnAcceptCHFrameReceived() for details.
  </summary>
  <token key="OffTheRecordStatus" variants="OffTheRecordStatus"/>
</histogram>

<histogram name="Navigation.URLLoader.ParseHeaders.{Case}" units="microseconds"
    expires_after="2026-11-29">
  <owner>yyanagisawa@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the round trip time to parse headers for {Case}.

    Note: The metrics is reported from all clients. Some of clients may not have
    high resolution timer that can send metrics with microseconds precision.
  </summary>
  <token key="Case">
    <variant name="InProcessTime"
        summary="the case network service is the same process with the
                 browser process"/>
    <variant name="RoundTripTimeForNonNetworkResponse"
        summary="non main path to parse the headers with the network
                 service's parse header IPC call"/>
    <variant name="RoundTripTimeForVerify"
        summary="main path to verify the parsed headers with the network
                 service's parse header results"/>
  </token>
</histogram>

<histogram name="Navigation.UserAgentStringType" enum="UserAgentStringType"
    expires_after="2027-02-07">
  <owner>miketaylr@chromium.org</owner>
  <owner>katabolism-finch@google.com</owner>
  <summary>
    The type of the user agent string value sent in the User-Agent header on a
    navigation request. The reduced user agent string is sent when User-Agent
    reduction feature kReduceUserAgentMinorVersion is enabled. This histogram is
    recorded when a NavigationRequest is constructed, prior to sending the
    request to the network stack.
  </summary>
</histogram>

<histogram
    name="Navigation.{InitiatorType}.WastedSpeculativeRFH.CrossOriginIsolationDiffers"
    enum="Boolean" expires_after="2027-02-07">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    For {InitiatorType} navigations that result in wasting a speculative RFH
    that's previously created for the navigation (i.e. when the
    WastedSpeculativeRFHCase metric records kWasted_NowUseCurrentRFH or
    kWasted_NowUseNewSpeculativeRFH), records whether the cross-origin isolation
    state for the wasted speculative RFH and the new RFH differs.

    Recorded on RenderFrameHostManager::GetFrameHostNavigation(), for
    {InitiatorType} navigations that picked a RenderFrameHost that is different
    from the speculative RFH previously created for the navigation.
  </summary>
  <token key="InitiatorType" variants="InitiatorType"/>
</histogram>

<histogram
    name="Navigation.{InitiatorType}.WastedSpeculativeRFH.ProcessDiffers"
    enum="Boolean" expires_after="2025-03-01">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    For {InitiatorType} navigations that result in wasting a speculative RFH
    that's previously created for the navigation (i.e. when the
    WastedSpeculativeRFHCase metric records kWasted_NowUseCurrentRFH or
    kWasted_NowUseNewSpeculativeRFH), records whether the renderer process for
    the wasted speculative RFH and the new RFH differ.

    Recorded on RenderFrameHostManager::GetFrameHostNavigation(), for
    {InitiatorType} navigations that picked a RenderFrameHost that is different
    from a speculative RFH previously created for the navigation.
  </summary>
  <token key="InitiatorType" variants="InitiatorType"/>
</histogram>

<histogram
    name="Navigation.{InitiatorType}.WastedSpeculativeRFH.ReplacementRFHCreatedNewProcess"
    enum="Boolean" expires_after="2027-02-07">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    For {InitiatorType} navigations that result in wasting a speculative RFH
    that's previously created for the navigation (i.e. when the
    WastedSpeculativeRFHCase metric records kWasted_NowUseCurrentRFH or
    kWasted_NowUseNewSpeculativeRFH), records whether a new renderer process is
    created by the RFH that replaces the wasted speculative RFH. These cases add
    latency while waiting for a new process at commit time.

    Recorded on RenderFrameHostManager::GetFrameHostNavigation(), for
    {InitiatorType} navigations that picked a RenderFrameHost that is different
    from the speculative RFH previously created for the navigation.
  </summary>
  <token key="InitiatorType" variants="InitiatorType"/>
</histogram>

<histogram
    name="Navigation.{InitiatorType}.WastedSpeculativeRFH.WastedRFHLikelyCreatedNewProcess"
    enum="Boolean" expires_after="2027-02-07">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    For {InitiatorType} navigations that result in wasting a speculative RFH
    that's previously created for the navigation (i.e. when the
    WastedSpeculativeRFHCase metric records kWasted_NowUseCurrentRFH or
    kWasted_NowUseNewSpeculativeRFH), records whether a new renderer process was
    likely created when creating the wasted speculative RFH. These cases
    indicate a fair amount of work was wasted.

    Recorded on RenderFrameHostManager::GetFrameHostNavigation(), for
    {InitiatorType} navigations that picked a RenderFrameHost that is different
    from the speculative RFH previously created for the navigation.
  </summary>
  <token key="InitiatorType" variants="InitiatorType"/>
</histogram>

<histogram name="Navigation.{InitiatorType}.WastedSpeculativeRFHCase"
    enum="WastedSpeculativeRFHCase" expires_after="2027-02-07">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    Records whether a call to RenderFrameHostManager::GetFrameHostNavigation()
    for {InitiatorType} navigation resulted in &quot;wasting&quot; a speculative
    RFH previously created for the navigation.

    Recorded on {InitiatorType} navigations after picking its RenderFrameHost in
    RenderFrameHostManager::GetFrameHostNavigation(). Note that this can be
    called multiple times for each navigation.
  </summary>
  <token key="InitiatorType" variants="InitiatorType"/>
</histogram>

<histogram name="Navigation.{Stage}.{FrameType}" units="ms"
    expires_after="2027-02-07">
  <owner>cduvall@chromium.org</owner>
  <owner>sisidovski@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Measures the amount of time the {Stage} stage takes in early navigation.
    Logged for any navigation that reaches the stage.

    This was not reported between 2023-05-06 and 2024-06-28.
  </summary>
  <token key="Stage">
    <variant name="BeginNavigationImpl"
        summary="NavigationRequest::BeginNavigationImpl"/>
    <variant name="DidStartLoading" summary="FrameTreeNode::DidStartLoading"/>
    <variant name="LoaderCreateToRequestStart"
        summary="NavigationURLLoaderImpl creation to network request start"/>
    <variant name="WillStartRequestToLoaderStart"
        summary="NavigationRequest::WillStartRequest to
                 NavigationURLLoader::Start"/>
  </token>
  <token key="FrameType" variants="FrameTypes"/>
</histogram>

<histogram name="Navigation.{Stage}ToCompositorCreation" units="ms"
    expires_after="2026-10-04">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records the time duration between when the navigation that uses a new
    RenderWidgetHost reaches {Stage} and when the creation of the
    CompositorFrameSink for the RenderWidgetHost is requested. Logged when the
    compositor is requested and the navigation that created the RenderWidgetHost
    had already reached both the commit and swap RFH stages.
  </summary>
  <token key="Stage" variants="NavigationStage"/>
</histogram>

<histogram name="Navigation.{TracedMethod}" units="ms"
    expires_after="2027-01-31">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-security-architecture@google.com</owner>
  <summary>
    The time it takes to run {TracedMethod}. Recorded everytime {TracedMethod}
    is triggered.
  </summary>
  <token key="TracedMethod" variants="TracedMethod"/>
</histogram>

<histogram
    name="NavigationPredictor.SearchEnginePreconnector.ConsecutiveFailures"
    units="Consecutive failures" expires_after="2027-02-14">
  <owner>suzukikeita@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The number of preconnect failures that happened before a successful
    connection. This is recorded when the `SearchEnginePreconnector` detects a
    connection close of a &quot;long&quot; session (i.e. was not considered as
    short per comparison with the threshold).
  </summary>
</histogram>

<histogram
    name="NavigationPredictor.SearchEnginePreconnector.PreconnectAttemptInterval"
    units="ms" expires_after="2027-02-14">
  <owner>suzukikeita@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The duration between successive preconnect attempts made by the
    `SearchEnginePreconnector`. This is recorded when receiving the
    preconnect-emitting event.
  </summary>
</histogram>

<histogram name="NavigationPredictor.SearchEnginePreconnector.PreconnectDelay"
    units="ms" expires_after="2027-02-14">
  <owner>suzukikeita@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The duration `SearchEnginePreconnector` waits until running the next
    preconnect attempt from the timing when preconnect-emitting event has been
    issued. This is recorded when receiving the preconnect-emitting event and
    when the delay has been calculated.
  </summary>
</histogram>

<histogram
    name="NavigationPredictor.SearchEnginePreconnector.SessionEstablished.ConnectionInfo"
    enum="SSLNegotiatedAlpnProtocol" expires_after="2026-12-27">
  <owner>suzukikeita@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The protocol utilized to establish this connection session for
    SearchEnginePreconnector. Recorded when a preconnected network session has
    been successfully established to the search engine host.
  </summary>
</histogram>

<histogram
    name="NavigationPredictor.SearchEnginePreconnector.SessionEstablished.ConnectionSetupTime"
    units="ms" expires_after="2026-10-11">
  <owner>suzukikeita@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The setup time (connection latency), including TLS and TCP handshakes, to
    successfully construct the network connection session. Recorded in
    milliseconds when the session is successfully established for
    SearchEnginePreconnector.
  </summary>
</histogram>

<histogram
    name="NavigationPredictor.SearchEnginePreconnector.SessionEstablished.Initiator"
    enum="ConnectionEstablishmentInitiator" expires_after="2027-02-07">
  <owner>suzukikeita@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The trigger type of the client (either an active preconnect attempt or a
    standard web request) which led to the connection establishment. Recorded
    when the session has been successfully established for
    SearchEnginePreconnector.
  </summary>
</histogram>

<histogram name="NavigationPredictor.SearchEnginePreconnector.TriggerEvent"
    enum="PreconnectTriggerEvent" expires_after="2027-02-14">
  <owner>suzukikeita@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    The event which triggered a preconnect. This is recorded when each event is
    received by the `SearchEnginePreconnector`.
  </summary>
</histogram>

<histogram name="NavigationSuggestion.Event2" enum="NavigationSuggestionEvent"
    expires_after="2026-07-12">
  <owner>meacer@chromium.org</owner>
  <owner>chrome-secure-web-and-net@chromium.org</owner>
  <summary>
    Tracks events when the currently navigated domain name in a non-incognito
    tab is a lookalike to one of the top 10K domains or a domain that the user
    interacted with, resulting in a navigation suggestion interstitial.

    Before M88, NavigationSuggestion.Event recorded a separate entry for each
    lookalike URL in a redirect chain. E.g. lookalike1.com -&gt; site.com -&gt;
    lookalike2.com recorded two events. This updated histogram only records an
    entry for the first or last URL in the redirect if any of those is a
    lookalike.
  </summary>
</histogram>

<histogram name="NavigationSuggestion.Event2.Incognito"
    enum="NavigationSuggestionEvent" expires_after="2026-02-22">
  <owner>meacer@chromium.org</owner>
  <owner>chrome-secure-web-and-net@chromium.org</owner>
  <summary>
    Tracks events when the currently navigated domain name in an incognito tab
    is a lookalike to one of the top 10K domains or a domain that the user
    interacted with, resulting in a navigation suggestion interstitial.
  </summary>
</histogram>

<histogram
    name="NavigationSuggestion.GetDomainInfoDelayBeforeAllowingNavigation"
    units="ms" expires_after="2026-11-03">
  <owner>meacer@chromium.org</owner>
  <owner>blundell@chromium.org</owner>
  <owner>security-enamel@chromium.org</owner>
  <summary>
    Records the time duration that PerformChecks() spent in calls to
    GetDomainInfo() before the navigation was ultimately allowed to proceed.
    Recorded only for navigations that
    LookalikeUrlNavigationThrottle::PerfomChecks() directly allows to proceed
    (i.e., not those that result in showing interstitials and/or digital asset
    manifest checks).

    Note this histogram was expired between 2024-11 and 2025-09.
  </summary>
</histogram>

<histogram
    name="NavigationSuggestion.IsLookalikeUrlDelayBeforeAllowingNavigation"
    units="ms" expires_after="2026-11-03">
  <owner>meacer@chromium.org</owner>
  <owner>blundell@chromium.org</owner>
  <owner>security-enamel@chromium.org</owner>
  <summary>
    Records the time duration that PerformChecks() spent in calls to
    IsLookalikeUrl() before the navigation was ultimately allowed to proceed.
    Recorded only for navigations that
    LookalikeUrlNavigationThrottle::PerfomChecks() directly allows to proceed
    (i.e., not those that result in showing interstitials and/or digital asset
    manifest checks).

    Note this histogram was expired between 2024-11 and 2025-09.
  </summary>
</histogram>

<histogram
    name="NavigationSuggestion.PerformChecksDelayBeforeAllowingNavigation"
    units="ms" expires_after="2026-08-30">
  <owner>meacer@chromium.org</owner>
  <owner>blundell@chromium.org</owner>
  <owner>security-enamel@chromium.org</owner>
  <summary>
    Records the time duration the navigation was deferred while PerformChecks()
    was executing before the navigation was ultimately allowed to proceed.
    Recorded only for navigations that
    LookalikeUrlNavigationThrottle::PerfomChecks() directly allows to proceed
    (i.e., not those that result in showing interstitials and/or digital asset
    manifest checks).

    Note this histogram was expired between 2024-06 and 2025-09.
  </summary>
</histogram>

<histogram name="NavigationSuggestion.UpdateEngagedSitesDeferTime" units="ms"
    expires_after="2023-01-15">
  <owner>meacer@chromium.org</owner>
  <owner>cduvall@chromium.org</owner>
  <owner>security-enamel@chromium.org</owner>
  <summary>
    Records the time duration the navigation was deferred while waiting for
    engaged sites data. Recorded whenever a navigation is deferred waiting for
    engaged sites.
  </summary>
</histogram>

<histogram name="Navigation{Initiator}.DuplicateNavCookieStatus"
    enum="DuplicateNavsCookieStatus" expires_after="2026-12-20">
  <owner>annasato@google.com</owner>
  <owner>rakina@google.com</owner>
  <owner>chrome-navigation@google.com</owner>
  <summary>
    Records the cookie change status only for potential duplicate navigations
    where criteria such as URL, initiator, method, and transition match. It
    distinguishes whether a CookieChangeListener was missing, cookies actually
    changed since the ongoing navigation started, or cookies remained the same.
  </summary>
  <token key="Initiator" variants="Initiator"/>
</histogram>

<histogram name="Navigation{Initiator}.DuplicateNavigationInputStartPresence2"
    enum="InputStartPresence" expires_after="2027-02-07">
  <owner>annasato@google.com</owner>
  <owner>chrome-navigation@google.com</owner>
  <summary>
    When a new navigation is a duplicate of a currently ongoing navigation,
    where the destination and params are the same, records whether the
    input_start timestamp was available on the new navigation, the old (ongoing)
    navigation, both, or neither.
  </summary>
  <token key="Initiator" variants="Initiator"/>
</histogram>

<histogram
    name="Navigation{Initiator}.DuplicateNavInputTimeDiff2{DuplicateNavTargetScope}"
    units="ms" expires_after="2027-02-07">
  <owner>annasato@google.com</owner>
  <owner>chrome-navigation@google.com</owner>
  <summary>
    When a new navigation is a duplicate of a currently ongoing navigation,
    where the destination and params are the same, records the difference
    between the new navigation's input start time and the ongoing (old)
    navigation's input start time {DuplicateNavTargetScope}.
  </summary>
  <token key="Initiator" variants="Initiator"/>
  <token key="DuplicateNavTargetScope" variants="DuplicateNavTargetScope"/>
</histogram>

<histogram
    name="Navigation{Initiator}.DuplicateNavIsUnderThreshold2{DuplicateNavTargetScope}"
    enum="Boolean" expires_after="2027-01-03">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-navigation@google.com</owner>
  <summary>
    When a new navigation is a duplicate of a currently ongoing navigation,
    where the destination and params are the same, records whether the
    difference between the new navigation's start time and the previous
    navigation's start time is under the threshold defined by
    kDuplicateNavThreshold (defaults to 2s).

    Logged when the new navigation is triggered and about to take the place of
    the old navigation {DuplicateNavTargetScope}.
  </summary>
  <token key="Initiator" variants="Initiator"/>
  <token key="DuplicateNavTargetScope" variants="DuplicateNavTargetScope"/>
</histogram>

<histogram name="Navigation{Initiator}.DuplicateNavOriginMatch" enum="Boolean"
    expires_after="2027-01-03">
  <owner>annasato@google.com</owner>
  <owner>rakina@google.com</owner>
  <owner>chrome-navigation@google.com</owner>
  <summary>
    Records whether a duplicate navigation's URL matches the origins specified
    in IgnoreDuplicateNavsOrigins parameter. This is recorded for both
    browser-initiated and renderer-initiated navigations when the feature
    kIgnoreDuplicateNavs is enabled and an origin list is provided.
  </summary>
  <token key="Initiator" variants="Initiator"/>
</histogram>

<histogram
    name="Navigation{Initiator}.DuplicateNavStartTimeDiff2{DuplicateNavTargetScope}"
    units="ms" expires_after="2027-01-03">
  <owner>rakina@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    When a new navigation is a duplicate of a currently ongoing navigation,
    where the destination and params are the same, records the difference
    between the new navigation's start time and the previous navigation's start
    time.

    Logged when the new navigation is triggered and about to take the place of
    the old navigation {DuplicateNavTargetScope}.
  </summary>
  <token key="Initiator" variants="Initiator"/>
  <token key="DuplicateNavTargetScope" variants="DuplicateNavTargetScope"/>
</histogram>

<histogram
    name="Navigation{Initiator}.IsDuplicateWithoutThresholdCheck2{DuplicateNavTargetScope}"
    enum="Boolean" expires_after="2027-01-03">
  <owner>rakina@chromium.org</owner>
  <owner>chrome-navigation@google.com</owner>
  <summary>
    Whether a new navigation is a duplicate of a currently ongoing navigation,
    where the destination and params are the same. This does not do a navigation
    start threshold check, so this will be true even if the new navigation
    started a long time after the previous navigation.

    Logged when the new navigation is triggered and about to take the place of
    the old navigation {DuplicateNavTargetScope}.
  </summary>
  <token key="Initiator" variants="Initiator"/>
  <token key="DuplicateNavTargetScope" variants="DuplicateNavTargetScope"/>
</histogram>

<histogram name="Navigation{Initiator}.ShouldDispatchBeforeUnload"
    enum="Boolean" expires_after="2027-04-01">
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether a {Initiator} navigation required to use the beforeunload
    logic or not. If using the beforeunload logic in the browser process to post
    a task is necessary for legacy reasons, as described in the code comment of
    RenderFrameHostImpl::SendBeforeUnload(), true will be recorded. This is
    recorded on each {Initiator} navigation.
  </summary>
  <token key="Initiator" variants="Initiator"/>
</histogram>

<histogram
    name="Prerender.CanceledForInactivePageRestriction.DisallowActivationReason{PreloadingTriggerType}"
    enum="InactiveFrameDisallowActivationReason" expires_after="2027-02-07">
  <owner>lingqi@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Warning: this histogram was expired from 2024-03-01 to 2025-02-20, and
    2025-08-01 to 2025-09-16; data may be missing.

    Tracks the prerender cancellations caused by inactive RenderFrameHosts'
    restrictions, recording the reason passed to
    RenderFrameHost::IsInactiveAndDisallowActivation calls.

    This metric is recored when a RenderFrameHost is going to perform some
    actions that are not allowed for a prerendering RenderFrameHost, such as
    showing context menu. At that time, the detailed reason will be passed to
    RenderFrameHost::IsInactiveAndDisallowActivation, which will cancel
    prerendering and record this metric.

    Note: This histogram does not track prerender activation behavior, but to
    analyze PrerenderHostFinalStatus::kInactivePageRestriction.

    Warning: this histogram was expired from 2023-03-01 to 2023-03-29; data may
    be missing.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram
    name="Prerender.Experimental.ActivationHeadersMismatch{PreloadingTriggerType}"
    enum="PrerenderActivationHeaderMismatchType" expires_after="2027-02-07">
  <owner>lingqi@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Breakdown metric for
    PrerenderActivationNavigationParamsMatch::kHttpRequestHeader. We are
    considering whether we should loosen this restriction, so this metric is
    added to figure out the usage of headers during prerender navigation and
    activation navigation. See https://crbug.com/1378921 for more information.

    When we are attempting to activate a prerendered page, we compare the
    prerendered page's NavigationRequest's headers with the incoming
    NavigationRequest's (called activation navigation). If they mismatch,
    PrerenderHost will post a task. The task scans the two headers, and will
    report a mismatching record if it detects any differences between them. It
    records the hashed number of a mismatching header, together with the
    mismatching reason: Missing in prerendering navigation, missing in
    activation navigation, or the values mismatch.

    Warning: this histogram was expired from 2023-01-31 to 2023-03-29; data may
    be missing.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram
    name="Prerender.Experimental.ActivationIPCDelay{PreloadingTriggerType}"
    units="ms" expires_after="2027-02-07">
  <owner>lingqi@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Recorded by WebViewImpl::ActivatePrerenderedPage when renderer process
    starts to ask the receiver end of the prerender activation IPC to process
    this signal, i.e., when this method is invoked. This metric is used to
    measure the delay of when renderer process receives the signal and when it
    can process this signal. Recorded on the main document only.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram
    name="Prerender.Experimental.ActivationNavigationParamsMatch{PreloadingTriggerType}"
    enum="PrerenderActivationNavigationParamsMatch" expires_after="2027-02-07">
  <owner>nhiroki@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Records the mismatched parameters between the prerender initial navigation
    parameters and the prerender activation navigation parameters. Recorded by
    PrerenderHost in the browser process when comparing these two parameters.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram
    name="Prerender.Experimental.ActivationTransitionMismatch{PreloadingTriggerType}"
    enum="PrerenderActivationTransitionMismatchType" expires_after="2025-04-06">
  <owner>nhiroki@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Breakdown metric for PrerenderActivationNavigationParamsMatch::kTransition.

    When we are attempting to activate a prerendered page, we compare the
    prerendered page's NavigationRequest's ui::PageTransition with the incoming
    NavigationRequest's (called activation navigation). If they mismatch, this
    metric records the transition of the activation navigation in
    RecordPrerenderActivationTransition().
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram
    name="Prerender.Experimental.CrossOriginRedirectionProtocolChange{PreloadingTriggerType}"
    enum="PrerenderCrossOriginRedirectionProtocolChange"
    expires_after="2027-01-03">
  <owner>lingqi@chromium.org</owner>
  <owner>nhiroki@chromium.org</owner>
  <owner>src/content/browser/preloading/prerender/OWNERS</owner>
  <summary>
    Warning: this histogram was expired from 2025-08-01 to 2025-09-16; data may
    be missing.

    A breakdown metric for analyzing cross-origin redirection cases during
    embedder-triggered prerendering, Recorded when redirections were caused due
    to HTTP protocol upgrades.

    Note that for now it is not used for prerendering that are triggered by
    speculation rules.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram name="Prerender.Experimental.FoundReusePrerenderHost" enum="Boolean"
    expires_after="2027-01-10">
  <owner>gjc@google.com</owner>
  <owner>chrome-prerendering@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether there is a PrerenderHost can be reused when creating a new
    PrerenderHost. The UMA is recorded each time a new PrerenderHost is
    constructed.
  </summary>
</histogram>

<histogram name="Prerender.Experimental.MatchableHostCountOnActivation"
    units="count" expires_after="2026-11-15">
  <owner>nhiroki@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Records the number of PrerenderHosts that match the potential activation
    navigation. This is recorded when the navigation chooses one of the hosts in
    PrerenderHostRegistry::FindPotentialHostToActivate().
  </summary>
</histogram>

<histogram name="Prerender.Experimental.PredictionStatus.DefaultSearchEngine"
    enum="PrerenderPredictionStatus" expires_after="2026-12-27">
  <owner>nhiroki@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Records the prediction status started by omnibox. In particular, this
    records whether they were used or not. It's recorded when omnibox-initiated
    navigation finishes. Consider it as a success when the prediction is correct
    and note that the activation of prerendering may fail.
  </summary>
</histogram>

<histogram name="Prerender.Experimental.PredictionStatus.DirectUrlInput"
    enum="PrerenderPredictionStatus" expires_after="2025-04-16">
  <owner>nhiroki@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Records the prediction status started by omnibox. In particular, this
    records whether they were used or not. It's recorded when omnibox-initiated
    navigation finishes. Consider it as a success when the prediction is correct
    and note that the activation of prerendering may fail.
  </summary>
</histogram>

<histogram
    name="Prerender.Experimental.PrefetchAheadOfPrerenderFailed.PrefetchStatus{PreloadingTriggerType}"
    enum="PrefetchProxyPrefetchStatus" expires_after="2027-02-07">
  <owner>kenoss@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Status of prefetch ahead of prerender. Recorded by PrerenderHost or
    PrerenderHostRegistry in the browser process when the attempt finishes.
    Recorded only if prerender failed due to prefetch.

    Warning: this histogram was expired from 2025-03-10 to 2026-07-02; data may
    be missing.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram
    name="Prerender.Experimental.PrerenderCancelledInterface{PreloadingTriggerType}"
    enum="PrerenderCancelledInterface" expires_after="2027-02-07">
  <owner>nhiroki@chromium.org</owner>
  <owner>toyoshim@chromium.org</owner>
  <owner>lingqi@chromium.org</owner>
  <summary>
    Mojo interfaces that cause the cancellation of prerendering. Recorded by
    MojoBinderPolicyApplier in the browser process once it receives the binding
    request of a kCancel Mojo interface.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram
    name="Prerender.Experimental.PrerenderCancelledUnknownInterface{PreloadingTriggerType}"
    enum="PrerenderCancelledUnknownInterface" expires_after="2027-02-07">
  <owner>nhiroki@chromium.org</owner>
  <owner>toyoshim@chromium.org</owner>
  <owner>lingqi@chromium.org</owner>
  <summary>
    This histogram tracks the interfaces that
    Prerender.Experimental.PrerenderCancelledInterface fails to track. It is
    needed because:

    * Embedders can set their own policies, so Prerender2 cannot map all of them
    to enums.

    * Channel-associated interfaces' policies are set to kCancel implicitly.
    It's hard to track all of them, especially the newly added
    channel-associated interfaces.

    This sparse histogram allows Prerender2 to record all of these interfaces
    separately.

    It is recored by MojoBinderPolicyApplier in the browser process once it
    receives the binding request of a kCancel Mojo interface and cannot find an
    accurate enum type for this interface.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram
    name="Prerender.Experimental.PrerenderCrossOriginRedirectionMismatch{PreloadingTriggerType}"
    enum="PrerenderCrossOriginRedirectionMismatch" expires_after="2027-01-03">
  <owner>lingqi@chromium.org</owner>
  <owner>nhiroki@chromium.org</owner>
  <owner>src/content/browser/preloading/prerender/OWNERS</owner>
  <summary>
    Warning: this histogram was expired from 2024-06-01 to 2024-08-06; data may
    be missing.

    A breakdown metric for analyzing cross-origin redirection cases during
    embedder-triggered prerendering. Recorded when the embedder-triggered
    prerendering was redirected to another origin that differs from the initial
    one.

    The cases are encoded into 3 bits(scheme mismatch, host mismatch, port
    mismatch).

    Note that for now it is not used for prerendering that are triggered by
    speculation rules.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram
    name="Prerender.Experimental.PrerenderHostFinalStatus{PreloadingTriggerType}"
    enum="PrerenderHostFinalStatus" expires_after="2027-02-07">
  <owner>nhiroki@chromium.org</owner>
  <owner>toyoshim@chromium.org</owner>
  <owner>lingqi@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Final status for a prerendering attempt. Recorded by PrerenderHost or
    PrerenderHostRegistry in the browser process when the attempt finishes.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram
    name="Prerender.Experimental.PrerenderLoadingFailureError{PreloadingTriggerType}"
    enum="NetErrorCodes" expires_after="2027-02-07">
  <owner>lingqi@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Net error code is recorded by PrerenderCancellationReason when a prerender
    host is canceled due to kDidFailLoad.

    This metric is used to monitor whether preload cache intercepting logic
    causes extra page loading errors. Similar to
    PageLoad.Internal.Prerender2.ActivatedPageLoaderStatus{PreloadingTriggerType},
    but used to track the loading status of not activated prerendered pages.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram name="Prerender.Experimental.PrerenderProcessReuseAvailability"
    enum="PrerenderProcessReuseAvailability" expires_after="2027-07-05">
  <owner>gjc@google.com</owner>
  <owner>chrome-prerendering@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether there is a PrerenderHost matching the navigation or under
    the same origin or same host as the navigation so that its renderer process
    can be reused. The UMA is recorded when the navigation chooses one of the
    hosts in PrerenderHostRegistry::FindPotentialHostToActivate().
  </summary>
</histogram>

<histogram name="Prerender.Experimental.PrewarmDecision"
    enum="PrerenderPrewarmDecision" expires_after="2027-02-07">
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the decision whether PrerenderManager can start prewarming in the
    current context and settings. This decision is made and recorded per each
    prewarm request.
  </summary>
</histogram>

<histogram
    name="Prerender.Experimental.ReceivedPrerendersPerPrimaryPageChangedCount2{PreloadingTriggerType}{EagernessCategory}"
    units="count" expires_after="2025-08-24">
  <owner>taiyo@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Records the number of received speculation rules prerender triggers with
    eagerness per primary page changed, classified with their eagerness. This is
    coutend per PrerendererImpl::MaybePrerender and recorded when primary page
    is changed and PrerendererImpl::CancelStartedPrerenders is called.

    Note that this metric only records where PreloadingTriggerType is
    SpeculationRule and SpeculationRuleFromIsolatedWorld.

    See https://crbug.com/40287486 for the history of the histogram changes.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
  <token key="EagernessCategory">
    <variant name=".Conservative"/>
    <variant name=".Eager2"/>
    <variant name=".Immediate2"/>
    <variant name=".Moderate"/>
  </token>
</histogram>

<histogram
    name="Prerender.Experimental.ReusePrerenderHost.PrerenderHostCount.Failed"
    units="count" expires_after="2027-01-10">
  <owner>suzukikeita@google.com</owner>
  <owner>gjc@google.com</owner>
  <owner>chrome-prerendering@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the number of PrerenderHosts when we failed to find a reuseable
    PrerenderHost. The UMA is recorded each time a new PrerenderHost is
    constructed and we failed to find a reuseable PrerenderHost.
  </summary>
</histogram>

<histogram name="Prerender.Experimental.Search.ResponseReuseCount"
    units="count" expires_after="2027-02-14">
  <owner>lingqi@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Warning: this histogram was expired from 2023-11-20 to 2024-02-27; data may
    be missing.

    Recorded by StreamingSearchPrefetchURLLoader in its destructor. This
    instance is created per (non-duplicated) prefetch attempt. The destructor
    runs upon:

    - Case 1: A prefetched response is deleted upon expiration or network error.

    - Case 2: A prefetched response deletes itself after finishing serving to
    navigations. This will be executed asynchronously.

    See comments in StreamingSearchPrefetchURLLoader for more information.

    Indicates the number of prerendering DSE navigation that one prefetched
    response served to. In most cases, it should record 0 (which means the
    loader does not serve to any prerendering navigations) or 1 (served to one
    prerender). And we will track the count that is greater than 2 to determine
    whether the loader should be designed to target multiple serving
    destinations.

    This number should be quite small (0 or 1 in most cases), so the count is
    capped at 9 and put into 10 buckets, from 0 to 9.
  </summary>
</histogram>

<histogram
    name="Prerender.Experimental.WaitingForHeadersFinishedReason{PreloadingTriggerType}"
    enum="PrerenderWaitingForHeadersFinishedReason" expires_after="2026-09-09">
  <owner>nhiroki@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    Finished reason of waiting for the No-Vary-Search header. Recorded by
    PrerenderHost in the browser process when the header is received, the
    timeout timer runs, or cancellation happens.
  </summary>
  <token key="PreloadingTriggerType" variants="PreloadingTriggerType"/>
</histogram>

<histogram name="Prerender.IsPrerenderingSRPUrl.{PreloadingEmbedderType}"
    enum="Boolean" expires_after="2027-02-07">
  <owner>robertlin@chromium.org</owner>
  <owner>chrome-prerendering@google.com</owner>
  <summary>
    To record whether a prerendering attempt initiated by prerender
    {PreloadingEmbedderType} trigger is trying to prerender a SRP url or not.

    This is recorded when
    {PreloadingEmbedderType}PreloadPipelineManager::StartPrerender is called to
    initiate a SPR url, which is the list of affected prerender triggers in
    https://crbug.com/40066983.
  </summary>
  <token key="PreloadingEmbedderType">
    <variant name="Embedder_BookmarkBar" summary="BookmarkBar"/>
    <variant name="Embedder_NewTabPage" summary="NewTabPage"/>
  </token>
</histogram>

<histogram name="Prerender.PrerenderLoadComplete" enum="BooleanSuccess"
    expires_after="2027-01-05">
  <owner>gambard@chromium.org</owner>
  <owner>justincohen@chromium.org</owner>
  <summary>
    Whether the load was completed when the pre-render was used. If the
    prerender is cancelled, this is not logged. Only on iOS.
  </summary>
</histogram>

<histogram name="Prerender.PrerenderTimeSaved" units="ms"
    expires_after="2027-07-13">
  <owner>gambard@chromium.org</owner>
  <owner>justincohen@chromium.org</owner>
  <summary>
    This is the time from when a prerendered page begins to load to when it is
    swapped in as the main page load or to when the pre-loaded page is fully
    loaded, whichever came first. Recorded when the swap occurs, only on iOS.
  </summary>
</histogram>

<histogram name="Prerender.{PrerenderSource}FinalStatus"
    enum="PrerenderFinalStatus" expires_after="2027-01-03">
  <owner>ryansturm@chromium.org</owner>
  <owner>tbansal@chromium.org</owner>
  <summary>
    Final status for prerender pages - either success, or why it was canceled.

    {PrerenderSource}
  </summary>
  <token key="PrerenderSource">
    <variant name="" summary="All prerenders."/>
    <variant name="gws_" summary="GWS triggered prerender."/>
    <variant name="navigationpredictor_"
        summary="Triggered by the NavigationPredictor."/>
    <variant name="none_"
        summary="No origin; in the case of prefetch TTFCP this is when no
                 prefetch was involved."/>
    <variant name="web_" summary="Link triggered prerender."/>
    <variant name="webcross_"
        summary="Link triggered prerender, rel=prerender, cross domain."/>
    <variant name="webnext_" summary="Link triggered prerender, rel=next."/>
    <variant name="websame_"
        summary="Link triggered prerender, rel=prerender, same domain."/>
  </token>
</histogram>

</histograms>

</histogram-configuration>
