<!--
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 Browser 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="CookieAccessReceiver">
  <variant name="NavigationRequest"/>
  <variant name="RenderFrameHost"/>
  <variant name="StoragePartitionImpl"/>
</variants>

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

<variants name="NoSpareRendererReason">
  <variant name="MemoryPressure"/>
  <variant name="NotEnabled"/>
  <variant name="NotYetCreated"/>
  <variant name="NotYetCreatedAfterWarmup"/>
  <variant name="NotYetCreatedFirstLaunch"/>
  <variant name="OnceBackgrounded"/>
  <variant name="ProcessExited"/>
  <variant name="ProcessHostDestroyed"/>
  <variant name="ProcessLimit"/>
  <variant name="TakenByPreviousNavigation"/>
  <variant name="Timeout"/>
</variants>

<!-- LINT.ThenChange(//content/browser/renderer_host/spare_render_process_host_manager_impl.h:NoSpareRendererReason) -->

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

<variants name="SidePanelAnimationType">
  <variant name="Close" summary="close animation"/>
  <variant name="Open" summary="open animation"/>
  <variant name="OpenWithContentTransition" summary="tab to panel animation"/>
</variants>

<!-- LINT.ThenChange(//chrome/browser/ui/side_panel/side_panel_metrics.cc:SidePanelAnimationType) -->

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

<variants name="SidePanelEntry">
  <variant name="AboutThisSite" summary="about this site"/>
  <variant name="Assistant" summary="assistant"/>
  <variant name="Bookmarks" summary="bookmarks"/>
  <variant name="Comments" summary="comments"/>
  <variant name="Companion" summary="companion"/>
  <variant name="ContextualTasks" summary="contextual tasks"/>
  <variant name="CustomizeChrome" summary="customize chrome"/>
  <variant name="Extension" summary="extension"/>
  <variant name="Feed" summary="feed"/>
  <variant name="Geic" summary="geic"/>
  <variant name="Glic" summary="glic"/>
  <variant name="History" summary="history"/>
  <variant name="HistoryClusters" summary="history clusters"/>
  <variant name="Lens" summary="lens"/>
  <variant name="LensOverlayResults" summary="lens overlay results"/>
  <variant name="MerchantTrust" summary="merchant trust"/>
  <variant name="Performance" summary="performance"/>
  <variant name="ReadAnything" summary="read anything"/>
  <variant name="ReadingList" summary="reading list"/>
  <variant name="ShoppingInsights" summary="shopping insights"/>
  <variant name="SidePanelDev" summary="side panel dev feature"/>
  <variant name="SideSearch" summary="side search"/>
  <variant name="TabsFromOtherDevices" summary="tabs from other devices"/>
  <variant name="TestTabScopedEntry" summary="test tab scoped entry"/>
  <variant name="WebView" summary="web view"/>
</variants>

<!-- LINT.ThenChange(//chrome/browser/ui/side_panel/side_panel_entry_id.h:SIDE_PANEL_ENTRY_IDS) -->

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

<variants name="SidePanelType">
  <variant name="SidePanel" summary="content height side panel"/>
  <variant name="SidePanelToolbarHeight" summary="toolbar height side panel"/>
</variants>

<!-- LINT.ThenChange(//chrome/browser/ui/side_panel/side_panel_metrics.h:SidePanelType) -->

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

<variants name="SpareProcessMaybeTakeAction">
  <variant name="CannotAddThrottle"/>
  <variant name="MismatchedBrowserContext"/>
  <variant name="MismatchedStoragePartition"/>
  <variant name="NoSparePresent"/>
  <variant name="RefusedByEmbedder"/>
  <variant name="RefusedBySiteInstance"/>
  <variant name="RefusedForJitMismatch"/>
  <variant name="RefusedForPdfContent"/>
  <variant name="RefusedForV8OptimizationMismatch"/>
  <variant name="RefusedNonNavigation"/>
  <variant name="SpareTaken"/>
</variants>

<!-- LINT.ThenChange(//tools/metrics/histograms/metadata/browser/enums.xml:SpareProcessMaybeTakeAction) -->

<variants name="TabSwitchingType">
  <variant name="" summary="Aggregation of all tab states."/>
  <variant name=".NoSavedFrames_Loaded"
      summary="Tab has no saved frame in the cache but is already loaded."/>
  <variant name=".NoSavedFrames_NotLoaded"
      summary="Tab has no saved frame in the cache and is not loaded."/>
  <variant name=".WithSavedFrames"
      summary="Tab has a saved frame in the cache."/>
</variants>

<histogram name="Browser.Actions.PinnedActionsCount" units="actions"
    expires_after="2027-01-03">
  <owner>corising@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records the number of actions that are currently pinned to the toolbar. This
    is emitted every time the user pins or unpins an action to the toolbar.
  </summary>
</histogram>

<histogram name="Browser.Cfm.Artemis.EnqueuedPayloadSize" units="bytes"
    expires_after="2027-08-01">
  <owner>ntsirakis@google.com</owner>
  <owner>kdgwill@google.com</owner>
  <owner>core-devices@google.com</owner>
  <summary>
    Size of enqueued payload. Only recorded on initial enqueue attempt; skipped
    during retries.
  </summary>
</histogram>

<histogram name="Browser.Cfm.Artemis.LoggerServiceResponse"
    enum="CfmArtemisLoggerResponse" expires_after="2027-08-01">
  <owner>ntsirakis@google.com</owner>
  <owner>kdgwill@google.com</owner>
  <owner>core-devices@google.com</owner>
  <summary>Response from CfM logger service after enqueue attempt.</summary>
</histogram>

<histogram name="Browser.Cfm.Artemis.NumberOfRetriesBeforeSuccessfulEnqueue"
    units="retries" expires_after="2027-08-01">
  <owner>ntsirakis@google.com</owner>
  <owner>kdgwill@google.com</owner>
  <owner>core-devices@google.com</owner>
  <summary>
    Number of retry attempts before we successfully enqueue a record. Should be
    zero for the majority of cases.
  </summary>
</histogram>

<histogram name="Browser.Cfm.Artemis.PayloadQueueSize" units="payloads"
    expires_after="2027-08-01">
  <owner>ntsirakis@google.com</owner>
  <owner>kdgwill@google.com</owner>
  <owner>core-devices@google.com</owner>
  <summary>
    The current queue size, recorded after every successful enqueue.
  </summary>
</histogram>

<histogram name="Browser.Cfm.Artemis.SetupStatus" enum="CfmArtemisSetupStatus"
    expires_after="2027-08-01">
  <owner>ntsirakis@google.com</owner>
  <owner>kdgwill@google.com</owner>
  <owner>core-devices@google.com</owner>
  <summary>
    Recorded during initial one-time setup steps. Any failures logged will imply
    that Artemis is effectively disabled. This should skew heavily towards
    kSetupSucceeded.
  </summary>
</histogram>

<histogram name="Browser.Cfm.Artemis.TimeSinceLastSuccessfulEnqueue" units="ms"
    expires_after="2027-08-01">
  <owner>ntsirakis@google.com</owner>
  <owner>kdgwill@google.com</owner>
  <owner>core-devices@google.com</owner>
  <summary>The time elapsed between successful enqueue attempts.</summary>
</histogram>

<histogram name="Browser.Cfm.Artemis.TimeWaitedBeforeEnqueueRetry" units="ms"
    expires_after="2027-08-01">
  <owner>ntsirakis@google.com</owner>
  <owner>kdgwill@google.com</owner>
  <owner>core-devices@google.com</owner>
  <summary>
    The delay performed before a given enqueue retry after a failure.
  </summary>
</histogram>

<histogram name="Browser.ChromeOS.HatsStatus" enum="HatsStatus"
    expires_after="2027-01-24">
  <owner>aalsum@chromium.org</owner>
  <owner>chromeos-data-eng@google.com</owner>
  <summary>
    Records the stage up to which the user interacted with the HaTS Chrome OS
    survey. This is needed in addition to the Hats metrics data since Chrome OS
    relies on client side logic to roll the dice for device selection. This is
    recorded when the Hats pipeline ends processing, which is usually when the
    controller is destroyed.
  </summary>
</histogram>

<histogram
    name="Browser.CookieAccessObserver.{CookieAccessReceiver}.Duration.Subsampled"
    units="microseconds" expires_after="2026-11-29">
  <owner>acondor@chromium.org</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Records the latency of CookieAccessObserver's callbacks.

    Subsampled to 1/100.

    Not reported for clients with low-resolution clocks.
  </summary>
</histogram>

<histogram name="Browser.DarkModeStatus" enum="DarkModeStatus"
    expires_after="2027-01-24">
  <owner>lgrey@chromium.org</owner>
  <owner>robliao@chromium.org</owner>
  <summary>
    Whether the user's system is in dark mode, light mode, or if this choice is
    unavailable due to lack of system support. Updated every UMA upload.
  </summary>
</histogram>

<histogram name="Browser.ERP.CachedEventsCountExp" units="events"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Reflects cached events count: presents number of times a single event is
    received and placed in cache. Per-event count is incremented every time an
    event is added/replaced in the cache, and the metrics sample is recorded
    once the event is confirmed by the server (and thus won't be accepted for
    upload anymore). Expected to be 1 for the majority of the events, although
    small number of re-uploads is allowed. Counter for an event that has not
    been confirmed by the server yet will not be presented in UMA even if
    received and cached multiple times; since ERP guarantees delivery, this
    would only be a temporary state. Counter is inexact, since it may be reset
    in the rare cases that the uploader memory usage reaches its limit. To see
    how common that is, look at the histogram
    Browser.ERP.UploadMemoryUsagePercent.
  </summary>
</histogram>

<histogram name="Browser.ERP.ConfigFileParsingError"
    enum="EnterpriseCloudReportingStatusCode" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when RecordHandlerImpl catches an error while trying to parse the
    configuration file that was sent from the reporting server.
  </summary>
</histogram>

<histogram name="Browser.ERP.ConfigFileSignatureVerificationError"
    enum="EnterpriseCloudReportingStatusCode" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when ConfigurationFileController encounters an error while trying
    to verify the signature and the signed message received from the reporting
    server.
  </summary>
</histogram>

<histogram name="Browser.ERP.DataLossErrorReason"
    enum="DataLossErrorReasonBrowser" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded once each time reporting::error::DATA_LOSS is returned in the
    browser. There is a 1:1 relationship between the UMA values and error
    messages used with reporting::error::DATA_LOSS so that we can understand
    exactly which parts of the code are failing.
  </summary>
</histogram>

<histogram name="Browser.ERP.EnqueueFailureDestination"
    enum="EnterpriseCloudReportingDestination" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when ReportQueue::Enqueue is called to post an event or metric to
    ERP. It counts occurences of the reporting destination for the record
    enqueue that failed.
  </summary>
</histogram>

<histogram name="Browser.ERP.EnqueueSuccessDestination"
    enum="EnterpriseCloudReportingDestination" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when ReportQueue::Enqueue is called to post an event or metric to
    ERP. It counts occurences of the reporting destination for the record
    enqueue that succeeded.
  </summary>
</histogram>

<histogram name="Browser.ERP.EventEnqueueResult"
    enum="EnterpriseCloudReportingStatusCode" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when ReportQueue::Enqueue is called to post an event to ERP. It
    counts occurrences of the call returning success or each possible error
    Status.
  </summary>
</histogram>

<histogram name="Browser.ERP.EventEnqueueResult.{Destination}"
    enum="EnterpriseCloudReportingStatusCode" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when ReportQueue::Enqueue is called to post an event to ERP. It
    counts occurrences of the call returning success or each possible error
    status for the {Destination} destination.
  </summary>
  <token key="Destination">
    <variant name="ADDED_REMOVED_EVENTS"/>
    <variant name="ARC_INSTALL"/>
    <variant name="BROWSER_LAUNCH"/>
    <variant name="CHROME_BROWSER_ENTERPRISE"/>
    <variant name="CRASH_EVENTS"/>
    <variant name="CRD_EVENTS"/>
    <variant name="CROS_SECURITY_AGENT"/>
    <variant name="CROS_SECURITY_NETWORK"/>
    <variant name="CROS_SECURITY_PROCESS"/>
    <variant name="CROS_SECURITY_USER"/>
    <variant name="DLP_EVENTS"/>
    <variant name="EVENT_METRIC"/>
    <variant name="EXTENSION_INSTALL"/>
    <variant name="EXTENSIONS_WORKFLOW"/>
    <variant name="HEARTBEAT_EVENT"/>
    <variant name="INFO_METRIC"/>
    <variant name="KIOSK_HEARTBEAT_EVENTS"/>
    <variant name="LEGACY_TECH"/>
    <variant name="LOCK_UNLOCK_EVENTS"/>
    <variant name="LOG_UPLOAD"/>
    <variant name="LOGIN_LOGOUT_EVENTS"/>
    <variant name="MEET_DEVICE_TELEMETRY"/>
    <variant name="OS_EVENTS"/>
    <variant name="PERIPHERAL_EVENTS"/>
    <variant name="POLICY_VALIDATION"/>
    <variant name="PRINT_JOBS"/>
    <variant name="REPORTING_RECORD"/>
    <variant name="SUSPICIOUS_EVENTS"/>
    <variant name="TELEMETRY_METRIC"/>
    <variant name="UNDEFINED_DESTINATION"/>
    <variant name="UPLOAD_EVENTS"/>
    <variant name="WEB_PROTECT"/>
  </token>
</histogram>

<histogram name="Browser.ERP.EventsUploadCountExp" units="uploads"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Reflects events upload count: presents number of times a single event is
    sent to the server. Per-event count is incremented every time the event is
    sent, and the metrics value is recorded in UMA once the event is confirmed
    by the server (and thus won't be sent anymore). Expected to be 1 for the
    majority of the events, although minor duplication is allowed. Counter for
    an event that has not been confirmed by the server yet will not be presented
    in UMA even if uploaded multiple times; since ERP guarantees delivery, this
    would only be a temporary state. Counter is inexact, since it may be reset
    in the rare cases that the uploader memory usage reaches its limit. To see
    how common that is, look at the histogram
    Browser.ERP.UploadMemoryUsagePercent.
  </summary>
</histogram>

<histogram name="Browser.ERP.EventUploadSizeAdjustment.{Param}" units="bytes"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    {Param} informed by the Missive daemon. Updated every time the Missive
    daemon requests uploading.
  </summary>
  <token key="Param">
    <variant name="MaxUploadSize"
        summary="The maximum upload size computed based on new events rate
                 and remaining storage capacity"/>
    <variant name="NewEventsRate"
        summary="The size of events enqueued every second"/>
    <variant name="RemainingStorageCapacity"
        summary="The remaining storage capacity"/>
  </token>
</histogram>

<histogram name="Browser.ERP.FilteredOutEvents" enum="BooleanFiltered"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Records whether an event is filtered out by FilteredReportQueue.
  </summary>
</histogram>

<histogram name="Browser.ERP.MetricsReporting.EventMetricEnqueued"
    enum="EnterpriseCloudReportingMetricEventType" expires_after="2024-12-04">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when the MetricEventObserverManager enqueues an event metric. It
    counts occurences of the event type that was extracted from the event
    payload.
  </summary>
</histogram>

<histogram name="Browser.ERP.MetricsReporting.{MetricCollector}NoMetricData"
    enum="EnterpriseCloudReportingDestination" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when {MetricCollector}::OnMetricDataCollected is triggered from
    samplers with no metric data to report. It counts occurences of the
    reporting destination configured with the collector's report queue.
  </summary>
  <token key="MetricCollector">
    <variant name="ManualCollector"/>
    <variant name="OneShotCollector"/>
    <variant name="PeriodicCollector"/>
  </token>
</histogram>

<histogram name="Browser.ERP.MissiveClientDbusError"
    enum="EnterpriseReportingMissiveClientDbusError" expires_after="2026-02-22">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when the Missive client receives a response from sending a record
    to the Missive daemon over dBus. There are four types of responses. OK
    indicates no error. SERVICE_UNAVAILABLE indicates Missive client is not
    connected to dBus and did not attempt to send the record. NO_RESPONSE
    indicates Missive client thinks it's connected to dBus and attempted to send
    the record over dBus but received no response from the Missive daemon.
    UNKNOWN indicates an unknown error occurred.
  </summary>
</histogram>

<histogram name="Browser.ERP.PsrResult" enum="EnterpriseReportingPsrResult"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Records the result of obtaining PSR info from healthd in the metrics
    pipeline.
  </summary>
</histogram>

<histogram name="Browser.ERP.RateLimitedEvents" enum="BooleanAccepted"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Records whether an event is accepted by ReportQueue rate limiter.
  </summary>
</histogram>

<histogram name="Browser.ERP.RecordProcessedByServer" enum="Boolean"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when we send an encrypted record and receive a valid response from
    the server (i.e. no network errors). True if the server processed the
    record. False if the server found some error with the record. Note that this
    may return False even if Browser.ERP.(Un)ManagedUploadEncryptedReport
    doesn't report a server error, because the server errors it refers to are
    for DM server requests which are not reporting specific.
  </summary>
</histogram>

<histogram name="Browser.ERP.RecordsPerUploadFromNonChromeosDevice"
    units="records" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when uploading records to the reporting server from a non-ChromeOS
    device (i.e. using the realtime reporting pipeline). Counts the number of
    records batched into a single upload request from a {ManagementStatus}
    device. Uploads containing zero records will not be included as those are
    just encryption key requests.
  </summary>
</histogram>

<histogram name="Browser.ERP.RecordsPerUploadFrom{ManagementStatus}Device"
    units="records" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded when uploading records to the reporting server. Counts the number
    of records batched into a single upload request from a {ManagementStatus}
    device. Uploads containing zero records will not be included as those are
    just encryption key requests.
  </summary>
  <token key="ManagementStatus">
    <variant name="Managed" summary="managed"/>
    <variant name="Unmanaged" summary="unmanaged"/>
  </token>
</histogram>

<histogram name="Browser.ERP.ResponsePayloadSize" units="bytes"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    The size of ERP's response payload as a JSON string when upload is
    successful. Updated every time when an upload succeeds AND at least one hour
    has passed since the last update AND 9 more uploads have succeeded since the
    last update.
  </summary>
</histogram>

<histogram name="Browser.ERP.RetryEnqueueRecordStatus"
    enum="EnterpriseCloudReportingStatusCode" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Success or failure status of enqueuing a record to Missive after failing to
    enqueue at least once due to Missive unavailablity. Recorded once the
    enqueue succeeds or times out.
  </summary>
</histogram>

<histogram name="Browser.ERP.SingleRequestPayloadSize" units="bytes"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    The size of ERP's request payload as a JSON string when upload is
    successful. Updated every time when an upload succeeds.
  </summary>
</histogram>

<histogram name="Browser.ERP.TimeSpentRetryingEnqueueRecord" units="ms"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Amount of time spent re-trying to enqueue a record to Missive after failing
    to enqueue at least once due to Missive unavailablity. Recorded once the
    enqueue succeeds or times out.
  </summary>
</histogram>

<histogram name="Browser.ERP.UnavailableErrorReason"
    enum="UnavailableErrorReasonBrowser" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Recorded once each time reporting::error::UNAVAILABLE is returned in the
    browser. There is a 1:1 relationship between the UMA values and error
    messages used with reporting::error::UNAVAILABLE so that we can understand
    exactly which parts of the code are failing.
  </summary>
</histogram>

<histogram name="Browser.ERP.UnuploadedCrashShouldNotReportReason"
    enum="EnterpriseReportingUnuploadedCrashShouldNotReportReason"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    The reason that an unuploaded crash is determined that it should or should
    not be reported in crash reporting. It is recorded every time an unuploaded
    crash is received from healthd. The primary purpose is to monitor how
    frequently old unuploaded crashes are not reported because a maximum number
    of saved local IDs has been reached.
  </summary>
</histogram>

<histogram name="Browser.ERP.UnusualEnqueueTimestamp" enum="Boolean"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Would only be true. Recorded whenever an unusual timestamp is encountered
    when enqueuing a record, which will be rejected.
  </summary>
</histogram>

<histogram name="Browser.ERP.UploadMemoryUsagePercent" units="%"
    expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Records memory usage by event uploader as a percent of total memory
    allocated for the client-side events upload handling. Metric is recorded
    every time a new upload request is received and stored in memory.
  </summary>
</histogram>

<histogram name="Browser.ERP.{ManagementStatus}UploadEncryptedReport"
    enum="EnterpriseDMServerRequestSuccess" expires_after="2027-05-01">
  <owner>nancylanxiao@google.com</owner>
  <owner>xanth@google.com</owner>
  <owner>domfc@google.com</owner>
  <owner>cbe-cep-eng@google.com</owner>
  <summary>
    Status of a completed ERP upload request from a {ManagementStatus} device.
    Either successful, with a failure or with a server error. Recorded when a
    response from the server is received.
  </summary>
  <token key="ManagementStatus">
    <variant name="Managed" summary="managed"/>
    <variant name="Unmanaged" summary="unmanaged"/>
  </token>
</histogram>

<histogram name="Browser.ERP.{Param}PayloadSizePerHour" units="KiB"
    expires_after="2026-07-19">
  <owner>djzhang@google.com</owner>
  <owner>jdudder@google.com</owner>
  <owner>cros-reporting-team@google.com</owner>
  <summary>
    The accumulated size per hour of ERP's {Param} payload as JSON strings when
    upload is successful. Updated every hour.
  </summary>
  <token key="Param">
    <variant name="Request" summary="request"/>
    <variant name="Response" summary="response"/>
  </token>
</histogram>

<histogram name="Browser.MainThreadsCongestion.1MinAfterResume" units="janks"
    expires_after="2027-01-17">
  <owner>kawasin@google.com</owner>
  <owner>baseos-perf@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This metric is a specialized subset of the `Browser.MainThreadsCongestion`
    metric, designed to capture the metrics specifically during the first minute
    after a device resumes from suspend. After the main message loop starts, the
    calculation for Browser.MainThreadsCongestion is done on a periodic 30
    second interval. Any calculations that occur within a minute of resuming
    will also emit this metric. Each 30 second duration is divided into 100ms
    intervals. This metric counts the number of these intervals that were
    &quot;congested&quot;. An interval is congested if during it the UI or IO
    thread executes an &quot;important&quot; task that was queued more than 100
    ms ago, or a non-important task or a native event handler that started
    executing more than 100 ms ago. See
    https://docs.google.com/document/d/1vDSGFvJblh7yJ3U3RVB_7qZLubyfTbQdQjuN1GoUNkc/edit
    for more details.

    This is supported by ChromeOS only.
  </summary>
</histogram>

<histogram
    name="Browser.MainThreadsCongestion.ExtensionContentScripts.{NumExtensions}"
    units="janks" expires_after="2025-04-27">
  <owner>joenotcharles@google.com</owner>
  <owner>catan-team@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This metric is emitted every 30 seconds after main message loop start, when
    there is user activity. Each 30 second duration is divided into 100ms
    intervals. This metric counts the number of these intervals that were
    &quot;congested&quot;. An interval is congested if during it the UI or IO
    thread executes an &quot;important&quot; task that was queued more than 100
    ms ago, or a non-important task or a native event handler that started
    executing more than 100 ms ago. See
    https://docs.google.com/document/d/1vDSGFvJblh7yJ3U3RVB_7qZLubyfTbQdQjuN1GoUNkc/edit
    for more details.

    This metric is split by the estimated number of extensions that ran content
    scripts in the pages that were visible during the interval. It is only
    recorded if there were visible pages. This version is used for
    {NumExtensions}.
  </summary>
  <token key="NumExtensions">
    <variant name="0" summary="0 extensions"/>
    <variant name="1" summary="1 extension"/>
    <variant name="2" summary="2 or 3 extensions"/>
    <variant name="4" summary="4 to 7 extensions"/>
    <variant name="8" summary="8 to 15 extensions"/>
    <variant name="16" summary="16 or more extensions"/>
  </token>
</histogram>

<histogram name="Browser.MainThreadsCongestion.LowMemory" units="janks"
    expires_after="2027-01-03">
  <owner>vovoy@chromium.org</owner>
  <owner>chromeos-memory@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This metric is emitted every 30 seconds after main message loop start, when
    there is user activity. Each 30 second duration is divided into 100ms
    intervals. This metric counts the number of these intervals that were
    &quot;congested&quot;. An interval is congested if during it the UI or IO
    thread executes an &quot;important&quot; task that was queued more than 100
    ms ago, or a non-important task or a native event handler that started
    executing more than 100 ms ago. See
    https://docs.google.com/document/d/1vDSGFvJblh7yJ3U3RVB_7qZLubyfTbQdQjuN1GoUNkc/edit
    for more details.

    This metric is only recorded if the available physical memory is below a
    threshold based on Memory.Experimental.AvailableMemoryPercent 10 percentile.
  </summary>
</histogram>

<histogram name="Browser.MainThreadsCongestion.Used" units="janks"
    expires_after="2027-01-10">
  <owner>pmonette@chromium.org</owner>
  <owner>catan-team@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This metric is emitted every 30 seconds after main message loop start, when
    there is user activity. Each 30 second duration is divided into 100ms
    intervals. This metric counts the number of these intervals that were
    &quot;congested&quot;. An interval is congested if during it the UI or IO
    thread executes an &quot;important&quot; task that was queued more than 100
    ms ago, or a non-important task or a native event handler that started
    executing more than 100 ms ago. See
    https://docs.google.com/document/d/1vDSGFvJblh7yJ3U3RVB_7qZLubyfTbQdQjuN1GoUNkc/edit
    for more details.

    This metric is only recorded if Chrome is either visible, playing audio, or
    capturing video.
  </summary>
</histogram>

<histogram name="Browser.MainThreadsCongestion{Phase}" units="janks"
    expires_after="never">
<!-- expires-never: guiding metric (internal: go/chrome-browser-guiding-metrics) -->

  <owner>etienneb@chromium.org</owner>
  <owner>gab@chromium.org</owner>
  <owner>chrome-analysis-team@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This metric is emitted every 30 seconds after main message loop start, when
    there is user activity. Each 30 second duration is divided into 100ms
    intervals. This metric counts the number of these intervals that were
    &quot;congested&quot;. An interval is congested if during it the UI or IO
    thread executes an &quot;important&quot; task that was queued more than 100
    ms ago, or a non-important task or a native event handler that started
    executing more than 100 ms ago. See
    https://docs.google.com/document/d/1vDSGFvJblh7yJ3U3RVB_7qZLubyfTbQdQjuN1GoUNkc/edit
    for more details.

    This metrics graduated from
    Browser.Responsiveness.JankyIntervalsPerThirtySeconds(1,2,3) and their
    history might be useful to understand how we got here.

    Suffixed phases can be useful as diagnosis metrics. This phase represents:
    {Phase}

    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>
  <token key="Phase">
    <variant name=""
        summary="Default view, includes all congested intervals after
                 OnFirstIdle()."/>
    <variant name=".Initial" summary="The first interval after OnFirstIdle()."/>
    <variant name=".Periodic" summary="All intervals but .Initial"/>
    <variant name=".RunningOnly"
        summary="Diagnostic metric which ignores queuing congestion."/>
    <variant name=".RunningOnly.Initial"
        summary="The first interval, before first idle and ignoring queuing
                 congestion."/>
    <variant name=".RunningOnly.Periodic"
        summary="All RunningOnly intervals but the first one."/>
  </token>
</histogram>

<histogram name="Browser.MainThreadsCongestion{UsageScenario}" units="janks"
    expires_after="2027-02-07">
  <owner>pmonette@chromium.org</owner>
  <owner>catan-team@chromium.org</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    This metric is emitted every 30 seconds after main message loop start, when
    there is user activity. Each 30 second duration is divided into 100ms
    intervals. This metric counts the number of these intervals that were
    &quot;congested&quot;. An interval is congested if during it the UI or IO
    thread executes an &quot;important&quot; task that was queued more than 100
    ms ago, or a non-important task or a native event handler that started
    executing more than 100 ms ago. See
    https://docs.google.com/document/d/1vDSGFvJblh7yJ3U3RVB_7qZLubyfTbQdQjuN1GoUNkc/edit
    for more details.

    This metric is split by usage scenarios (go/chrome_power_use_per_scenario).
    This version is recorded for {UsageScenario}.
  </summary>
  <token key="UsageScenario">
<!--
  Variants describing the usage scenario for a time interval. Consider updating
  both "UsageScenario" and "UsageScenario10Sec" in
  tools/metrics/histograms/metadata/power/histograms.xml when updating this.
-->

    <variant name=".AllTabsHidden_Audio"
        summary="intervals during which there was no visible tab and no video
                 capture, but there was audio"/>
    <variant name=".AllTabsHidden_NoVideoCaptureOrAudio"
        summary="intervals during which there was no visible tab, no video
                 capture and no audio"/>
    <variant name=".AllTabsHidden_VideoCapture"
        summary="intervals during which there was no visible tab, but there
                 was video capture"/>
    <variant name=".Audio"
        summary="intervals during which there was audio and at least 1
                 visible tab, but there was no video playback or video
                 capture"/>
    <variant name=".EmbeddedVideo_NoNavigation"
        summary="intervals during which a video played in a visible tab and
                 there was no navigation and no video capture"/>
    <variant name=".EmbeddedVideo_WithNavigation"
        summary="intervals during which a video played in a visible tab and
                 there was a navigation, but no video capture"/>
    <variant name=".FullscreenVideo"
        summary="intervals during which a video played in fullscreen and
                 there was no video capture"/>
    <variant name=".Interaction"
        summary="intervals during which there was at least 1 visible tab and
                 a user interaction, but no navigation, audio, video playback
                 or video capture"/>
    <variant name=".Navigation"
        summary="intervals during which there was at least 1 visible tab and
                 a navigation, but no audio, video playback or video capture"/>
    <variant name=".Passive"
        summary="intervals during which there was at least 1 visible tab, but
                 no user interaction, navigation, audio, video playback or
                 video capture"/>
    <variant name=".VideoCapture"
        summary="intervals during which there was at least 1 visible tab and
                 video capture"/>
    <variant name=".ZeroWindow"
        summary="intervals during which there was no window"/>
  </token>
</histogram>

<histogram
    name="Browser.Memory.Experimental.MemoryPressureOnProcessKill.{ProcessType}.{MetricName}"
    units="MB" expires_after="2026-05-31">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records memory pressure metrics when a process is killed. The UMA is
    recorded only on the Android platform when a process kill matching the type
    happens. The metric is only available on Android experiment groups under the
    feature kUserLevelMemoryPressureSignalMetricsOnly. Details: {ProcessType} -
    {MetricName}
  </summary>
  <token key="ProcessType">
    <variant name="Gpu" summary="GPU process kill"/>
    <variant name="VisibleRenderer" summary="Visible renderer process kill"/>
  </token>
  <token key="MetricName">
    <variant name="AvailableMemory" summary="Available memory"/>
    <variant name="TotalPrivateFootprint"
        summary="Total private memory footprint"/>
    <variant name="TotalProcessCount" summary="Total process count"/>
    <variant name="VisibleRendererCount" summary="Visible renderer count"/>
  </token>
</histogram>

<histogram name="Browser.OverlayScrollbarsEnabled" enum="BooleanEnabled"
    expires_after="2027-08-01">
  <owner>flackr@chromium.org</owner>
  <owner>chrome-a11y-core@google.com</owner>
  <summary>
    Whether overlay scrollbars are enabled by the operating system settings on
    desktop platforms (Mac, Linux, Windows, ChromeOS). Updated every UMA upload.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.Capture.CompressedOnDiskSize" units="KB"
    expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records the size of a compressed on-disk capture for the paint preview after
    a proto is written to disk if compressed.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.Capture.NumberOfFramesCaptured"
    units="units" expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records the number of frames captured by a paint preview if it succeeded.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.Capture.Success" enum="BooleanSuccess"
    expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records a boolean indicating whether a capture attempt was successful.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.Capture.TotalCaptureDuration" units="ms"
    expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records the total time spent capturing a paint preview of a page. This
    includes capture and serialization of all frames and IPC time.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.Player.CompositorProcessStartedCorrectly"
    enum="BooleanSuccess" expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records if the paint preview compositor process started correctly.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.Player.CompositorProcessStartupTime"
    units="ms" expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records the time it took to start the paint preview compositor process.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.Player.LinkClicked" enum="BooleanSuccess"
    expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>Records when a link is clicked in the paint preview player.</summary>
</histogram>

<histogram name="Browser.PaintPreview.Player.TimeToFirstBitmap" units="ms"
    expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records the time taken to from the request to start the compositor process
    to the first bitmap being loaded.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.TabbedPlayer.CompositorFailureReason"
    enum="TabbedPaintPreviewCompositorFailureReason" expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records the the reason for exiting the compositor process for the
    TabbedPaintPreviewPlayer. Recorded when the compositor returns an error or
    disconnects.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.TabbedPlayer.ExitCause"
    enum="TabbedPaintPreviewExitCause" expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records the the reason for exiting TabbedPaintPreviewPlayer. Recorded when
    paint preview is removed.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.TabbedPlayer.FirstPaintBeforeTabLoad"
    enum="Boolean" expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records whether paint preview was drawn before the tab finished loading.
    Recorded when tab has finished loading.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.TabbedPlayer.HadCapture" enum="Boolean"
    expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records whether a paint preview exists. Recorded when attempting to show a
    preview on startup. This in conjuction with CompositorFailureReason gives
    the total number of failures to show a paint preview.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.TabbedPlayer.SnackbarCount" units="units"
    expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records the number of times that the upgrade snackbar was shown in a session
    of TabbedPaintPreviewPlayer. Recorded when paint preview is removed.
  </summary>
</histogram>

<histogram name="Browser.PaintPreview.TabbedPlayer.TimeToFirstBitmap"
    units="ms" expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records the time taken to from actvity creation to the first bitmap being
    shown. Recorded on first paint preview paint event.
  </summary>
</histogram>

<histogram
    name="Browser.PaintPreview.TabbedPlayer.UpTime{TabbedPaintPreviewPlayerUptime}"
    units="ms" expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <owner>chrome-fdt@google.com</owner>
  <summary>
    Records the length of the time that a session of TabbedPaintPreviewPlayer
    lasts. Recorded when paint preview is removed.
    {TabbedPaintPreviewPlayerUptime}
  </summary>
  <token key="TabbedPaintPreviewPlayerUptime">
    <variant name=".RemovedByCompositorFailure"
        summary="Removed by compositor failure"/>
    <variant name=".RemovedByLinkClick" summary="Removed by link click"/>
    <variant name=".RemovedByNavigation" summary="Removed by navigation"/>
    <variant name=".RemovedByPullToRefresh"
        summary="Removed by pull to refresh"/>
    <variant name=".RemovedBySnackBar" summary="Removed by SnackBar"/>
    <variant name=".RemovedOnAccessibilityNotSupported"
        summary="Removed on accessibility not supported"/>
    <variant name=".RemovedOnLoad" summary="Removed on load"/>
    <variant name=".RemovedOnOfflineAvailable"
        summary="Removed on offline page available"/>
    <variant name=".RemovedOnTabDestroy" summary="Removed on tab destroy"/>
    <variant name=".RemovedOnTabHidden" summary="Removed on tab hidden"/>
  </token>
</histogram>

<histogram name="Browser.PaintPreview.TabService.DiskUsageAtStartup" units="KB"
    expires_after="2027-02-09">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    Records the total disk usage by the Paint Preview Tab Service at startup of
    the profile keyed service.
  </summary>
</histogram>

<histogram name="Browser.Responsiveness.IOJanksTotalPerMinute" units="janks"
    expires_after="2026-11-15">
  <owner>gab@chromium.org</owner>
  <owner>olivierli@chromium.org</owner>
  <summary>
    Similar to Browser.Responsiveness.IOJankyIntervalsPerMinute but sums janky
    events across all foreground threads over the monitored minute rather than
    considering each interval a boolean. This aims to cover a blind spot of
    IOJankyIntervalsPerMinute as it cannot see an improvement where we unblock
    19/20 threads performing I/O. Not reported across system sleep. More details
    @ https://bit.ly/chrome-io-jank-metric
  </summary>
</histogram>

<histogram name="Browser.Responsiveness.IOJankyIntervalsPerMinute"
    units="janks" expires_after="2027-01-17">
  <owner>gab@chromium.org</owner>
  <owner>olivierli@chromium.org</owner>
  <summary>
    This metric is emitted every minute. It reports a number between 0 and 60
    which corresponds to the number of 1 second intervals during the monitored
    minute to which a stalled foreground thread
    ScopedBlockingCall(BlockingType::MAY_BLOCK) was attributed. A stalled call
    is first attributed to the interval in which it began, and is attributed to
    a number of intervals equal to the length of the call, rounded to the
    nearest second. (Before http://crrev.com/c/2314873, the length was truncated
    rather than rounded.) This aims to capture moments where the main thread is
    responsive but the application is not (because things aren't loading). Not
    reported across system sleep. More details @
    https://bit.ly/chrome-io-jank-metric
  </summary>
</histogram>

<histogram name="Browser.Shortcuts.TriggeredCommandId"
    enum="MappedChromeCommandId" expires_after="2027-06-01">
  <owner>dljames@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records the browser command ID (from chrome_command_ids.h) whenever a
    registered keyboard shortcut is pressed (excluding auto-repeat events).

    Note: Command IDs in chrome_command_ids.h are not strictly guaranteed to be
    stable version-to-version. When analyzing historical trends across multiple
    milestones, filter by specific Chrome milestone versions.
  </summary>
</histogram>

<histogram name="Browser.SupportTool.SupportToolWebUIAction"
    enum="SupportToolWebUIActionType" expires_after="2025-04-06">
  <owner>iremuguz@google.com</owner>
  <owner>chromeos-commercial-supportability@google.com</owner>
  <summary>
    Reports the actions that the user takes when they use chrome://support-tool
    WebUI. These actions include the page navigation and data collection
    details. This metric is used to measure the usage rate of Support Tool
    features.
  </summary>
</histogram>

<histogram name="Browser.TabDragging.DragAmongTabsPresentationTime" units="ms"
    expires_after="2024-09-01">
  <owner>robliao@chromium.org</owner>
  <owner>yuhengh@chromium.org</owner>
  <summary>
    Compositor presentation time when dragging tabs left or right to a different
    index. This metric is used to measure tab dragging performance. Record on
    the next compositor frame when the data is collected.
  </summary>
</histogram>

<histogram name="Browser.TabDragging.DragToNewBrowserPresentationTime"
    units="ms" expires_after="2023-12-07">
  <owner>robliao@chromium.org</owner>
  <owner>yuhengh@chromium.org</owner>
  <summary>
    Compositor presentation time when dragging tabs out to a new browser. This
    metric is used to measure tab dragging performance. Record on the next
    compositor frame when the data is collected.
  </summary>
</histogram>

<histogram name="Browser.TabDragging.PresentationTime" units="ms"
    expires_after="2023-12-07">
  <owner>robliao@chromium.org</owner>
  <owner>yuhengh@chromium.org</owner>
  <summary>
    Compositor presentation time when dragging tabs. This metric is used to
    measure tab dragging performance. Record on the next compositor frame when
    the data is collected.
  </summary>
</histogram>

<histogram name="Browser.TabDragging.PresentationTimeMax" units="ms"
    expires_after="2024-06-30">
  <owner>robliao@chromium.org</owner>
  <owner>yuhengh@chromium.org</owner>
  <summary>
    Maxinum compositor presentation time when dragging tabs. This metric is used
    to measure tab dragging performance. Record after a drag and drop session is
    ended.
  </summary>
</histogram>

<histogram name="Browser.Tabs.TabShowReason.BothTabSwitchingAndBfcache"
    enum="Boolean" expires_after="2027-04-02">
  <owner>joenotcharles@google.com</owner>
  <owner>catan-team@chromium.org</owner>
  <summary>
    Recorded when a tab is shown. Records whether both the tab switching and
    bfcache restore show reasons are set. This is used to understand if there is
    any overlap between these two events.
  </summary>
</histogram>

<histogram name="Browser.Tabs.TabSwitchResult3{TabSwitchingType}"
    enum="TabSwitchResult2" expires_after="2027-01-10">
  <owner>fdoray@chromium.org</owner>
  <owner>joenotcharles@google.com</owner>
  <owner>catan-team@chromium.org</owner>
  <summary>
    Whether a frame was presented after a tab switch event. Recorded based on
    the destination tab state when the tab switch starts: {TabSwitchingType}
  </summary>
  <token key="TabSwitchingType" variants="TabSwitchingType"/>
</histogram>

<histogram name="Browser.Tabs.TotalIncompleteSwitchDuration3{TabSwitchingType}"
    units="ms" expires_after="2027-02-07">
  <owner>fdoray@chromium.org</owner>
  <owner>jonross@chromium.org</owner>
  <owner>joenotcharles@google.com</owner>
  <owner>catan-team@chromium.org</owner>
  <summary>
    The time between a tab switch input event timestamp and when the tab is
    hidden, if no frame is presented in the meantime. Recorded based on the
    destination tab state when the tab switch starts: {TabSwitchingType}
  </summary>
  <token key="TabSwitchingType" variants="TabSwitchingType"/>
</histogram>

<histogram name="Browser.Tabs.TotalSwitchDuration3{TabSwitchingType}"
    units="ms" expires_after="never">
  <owner>jonross@chromium.org</owner>
  <owner>joenotcharles@google.com</owner>
  <owner>catan-team@chromium.org</owner>
  <owner>chrome-ds@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The time between the input event timestamp and the frame presentation time
    on a tab switch. Recorded based on the destination tab state when the tab
    switch starts: {TabSwitchingType}

    This histogram is of special interest to the chrome-ds@. Do not change its
    semantics or retire it without talking to them first.
  </summary>
  <token key="TabSwitchingType" variants="TabSwitchingType"/>
</histogram>

<histogram name="Browser.UpdaterWebUI.HistoryFilterChanged"
    enum="UpdaterWebUIHistoryFilterCategory" expires_after="2027-03-27">
  <owner>noahrose@google.com</owner>
  <owner>src/chrome/updater/OWNERS</owner>
  <summary>
    Recorded when the user changes any of the filters on the chrome://updater
    history page.
  </summary>
</histogram>

<histogram name="Browser.UpdaterWebUI.InstallPathLinkClicked"
    enum="UpdaterWebUIInstallPathTarget" expires_after="2027-03-27">
  <owner>noahrose@google.com</owner>
  <owner>src/chrome/updater/OWNERS</owner>
  <summary>
    Recorded when the user clicks an install path link on the chrome://updater
    page. Sliced by the type of path being followed (per-system updater,
    per-user updater, or Chrome Enterprise Companion App).
  </summary>
</histogram>

<histogram name="Browser.WindowCount.Guest" units="units"
    expires_after="2027-02-07">
  <owner>rhalavati@chromium.org</owner>
  <owner>chrome-privacy-core@google.com</owner>
  <summary>
    Number of open guest windows at the same time. Recorded when a new guest
    window is created. Please note that this metric double counts the lower
    numbers, meaning that if user opens three windows (without closing any in
    between), then buckets 1, 2, and 3 will all be incremented in turn.
  </summary>
</histogram>

<histogram name="Browser.WindowCount.Incognito" units="units"
    expires_after="2027-01-17">
  <owner>rhalavati@chromium.org</owner>
  <owner>chrome-privacy-core@google.com</owner>
  <summary>
    Number of open incognito windows at the same time. Recorded when a new
    incognito window is created. Please note that this metric double counts the
    lower numbers, meaning that if user opens three windows (without closing any
    in between), then buckets 1, 2, and 3 will all be incremented in turn.
  </summary>
</histogram>

<histogram
    name="BrowserRenderProcessHost.AvailableMemory.SpareRenderer.{ProcessType}ProcessKillWithin{Time}"
    units="MB" expires_after="2026-12-16">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the size of the available memory before the spare renderer creation,
    if a process kill happens shortly afterwards. The UMA is recorded only on
    the Android platform when a process kill matching the type happens within
    {Time} after a spare renderer creation. Details: {ProcessType}
  </summary>
  <token key="ProcessType">
    <variant name="Gpu" summary="GPU process kills"/>
    <variant name="Visible" summary="Visible renderer process kills"/>
    <variant name="Waived" summary="Waived renderer process kills"/>
  </token>
  <token key="Time">
    <variant name="1s" summary="1 second"/>
    <variant name="5s" summary="5 seconds"/>
  </token>
</histogram>

<histogram
    name="BrowserRenderProcessHost.AvailableMemoryBeforeCreation.SpareRenderer"
    units="MB" expires_after="2027-01-31">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Recorded the size of the available memory when before creating the spare
    renderer. The UMA is recorded only on the Android platform before the
    creation of a spare renderer.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.BlockedByFilterURL"
    enum="RenderProcessHostBlockedURLReason" expires_after="2026-09-27">
  <owner>creis@chromium.org</owner>
  <owner>site-isolation-dev@chromium.org</owner>
  <summary>
    Recorded when RenderProcessHostImpl::FilterURL detects a disallowed URL sent
    by the renderer process and rewrites it to about:blank#blocked. See also
    Navigation.Renderer.BlockedForFilterURL for cases caught earlier in the
    renderer process, and https://crbug.com/40066983.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.ChildCodeIntegrityFailures"
    enum="RendererType" expires_after="never">
<!-- expires-never: For monitoring stability regressions. -->

  <owner>wfh@chromium.org</owner>
  <owner>chrome-stability-core@google.com</owner>
  <summary>
    Count of renderer process terminations due to a code integrity failure,
    grouped by type. This is only reported on Windows.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.ChildCrashes" enum="RendererType"
    expires_after="never">
<!-- expires-never: For monitoring stability regressions. -->

  <owner>wfh@chromium.org</owner>
  <owner>chrome-stability-core@google.com</owner>
  <summary>Count of renderer process crashes grouped by type.</summary>
</histogram>

<histogram name="BrowserRenderProcessHost.ChildKills" enum="RendererType"
    expires_after="never">
<!-- expires-never: For monitoring stability regressions. -->

  <owner>wfh@chromium.org</owner>
  <owner>chrome-stability-core@google.com</owner>
  <summary>Count of renderer process kills grouped by type.</summary>
</histogram>

<histogram name="BrowserRenderProcessHost.ChildKills.OOM" enum="RendererType"
    expires_after="never">
<!-- expires-never: For monitoring stability regressions. -->

  <owner>oshima@chromium.org</owner>
  <owner>chrome-stability-core@google.com</owner>
  <summary>
    Out of BrowserRenderProcessHost.ChildKills, numer of kills due to SIGKILL,
    which is a strong signal of out of memory on Chrome OS, grouped by renderer
    type.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.ChildLaunchFailureCodes"
    enum="LaunchErrorCodes" expires_after="never">
<!-- expires-never: For monitoring stability regressions. -->

  <owner>wfh@chromium.org</owner>
  <owner>chrome-stability-core@google.com</owner>
  <summary>
    The launch error codes for failed renderer process launches.

    In M129 we are more accurately tracking renderer process launch failures,
    and expect to find a significant spike in volume.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.ChildLaunchFailures"
    enum="RendererType" expires_after="never">
<!-- expires-never: For monitoring stability regressions. -->

  <owner>wfh@chromium.org</owner>
  <owner>chrome-stability-core@google.com</owner>
  <summary>
    Count of renderer process launch failures grouped by type.

    In M129 we are more accurately tracking renderer process launch failures,
    and expect to find a significant spike in volume.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.Cleanup.DelayReason"
    enum="RenderProcessHostDelayShutdownReason" expires_after="2025-04-13">
  <owner>mych@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Recorded whenever a RenderProcessHost is cleaned up, with the reason the
    cleanup fails or is delayed, or kNoDelay if it succeeded quickly.

    The total count of this histogram should be equal to
    BrowserRenderProcessHost.Cleanup.Total.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.Cleanup.Total" enum="Boolean"
    expires_after="2024-04-28">
  <owner>mych@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records true when an attempt is made to clean up a RenderProcessHost.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.DisconnectedAlive"
    enum="RendererType" expires_after="never">
<!-- expires-never: For monitoring stability regressions. -->

  <owner>wfh@chromium.org</owner>
  <owner>chrome-stability-core@google.com</owner>
  <summary>
    Count of renderer process crashes that we miscounted because we took the
    exit code too early. Grouped by type.
  </summary>
</histogram>

<histogram
    name="BrowserRenderProcessHost.ExistingRendererIsInitializedAndNotDead"
    enum="Boolean" expires_after="2027-01-03">
  <owner>cduvall@chromium.org</owner>
  <owner>swarm-team@google.com</owner>
  <summary>
    Whether the existing renderer used is alive. Recorded when
    RenderProcessHostImpl::GetProcessHostForSiteInstance uses an existing
    renderer.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.FastShutdownIfPossible.DelayReason"
    enum="RenderProcessHostDelayShutdownReason" expires_after="2027-01-17">
  <owner>mych@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Recorded on every attempt to fast-shutdown a RenderProcessHost. The value is
    kNoDelay on success, or the reason it couldn't take place otherwise.

    Warning: this histogram was expired from 2024-04-29 to 2024-12-09; data may
    be missing.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.FastShutdownIfPossible.Total"
    enum="Boolean" expires_after="2025-06-29">
  <owner>mych@chromium.org</owner>
  <owner>bfcache-dev@chromium.org</owner>
  <summary>
    Records true when an attempt is made to fast shutdown a RenderProcessHost.

    Warning: this histogram was expired from 2024-04-29 to 2024-12-09; data may
    be missing.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.LabeledInTaskManager"
    enum="BooleanLabeledRendererTask" expires_after="2024-06-30">
  <owner>creis@chromium.org</owner>
  <owner>avi@chromium.org</owner>
  <summary>
    Reports false each time the Task Manager displays an unlabeled renderer
    process using the fallback task provider, indicating that a type of renderer
    process is missing a task provider, which is a bug. For comparison, this
    reports true when renderer processes are properly labeled by a primary task
    provider. These values are only reported when the Task Manager is open. This
    can be removed when no unlabeled cases remain, per https://crbug.com/739782.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.MaxOutermostMainFrames"
    units="frames" expires_after="2026-09-06">
  <owner>dtapuska@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the maximum number of outermost main frames that were hosted in the
    process. This is logged when the RenderProcessHost is destroyed.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.NoSparePresentReason2"
    enum="NoSpareRendererReason" expires_after="2027-01-17">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the reason for there being no spare renderer present when calling
    SpareRenderProcessHostManagerImpl::MaybeTakeSpare. The UMA is recorded when
    kNoSparePresent is recorded in the UMA
    BrowserRenderProcessHost.SpareProcessMaybeTakeAction.
  </summary>
</histogram>

<histogram
    name="BrowserRenderProcessHost.NoSpareRenderer.AllocationSource.{NoSpareRendererReason}"
    enum="ProcessAllocationSource" expires_after="2027-01-17">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the detailed allocation source of the process when calling
    SpareRenderProcessHostManagerImpl::MaybeTakeSpare if there is no spare
    renderer. The UMA is recorded when the corresponding NoSpareRendererReason
    is recorded in the UMA BrowserRenderProcessHost.NoSparePresentReason2.
  </summary>
  <token key="NoSpareRendererReason" variants="NoSpareRendererReason"/>
</histogram>

<histogram
    name="BrowserRenderProcessHost.NoSpareRenderer.ForCOOP.{NoSpareRendererReason}"
    enum="Boolean" expires_after="2026-09-20">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether the process creation is caused by a COOP header when calling
    SpareRenderProcessHostManagerImpl::MaybeTakeSpare if there is no spare
    renderer. The UMA is recorded when NavigationRequest is recorded in the UMA
    BrowserRenderProcessHost.NoSpareRenderer.AllocationSource.{NoSpareRendererReason}.
  </summary>
  <token key="NoSpareRendererReason" variants="NoSpareRendererReason"/>
</histogram>

<histogram
    name="BrowserRenderProcessHost.NoSpareRenderer.NavigationStage.{NoSpareRendererReason}"
    enum="ProcessAllocationNavigationStage" expires_after="2026-09-13">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the detailed navigation stage of the process when calling
    SpareRenderProcessHostManagerImpl::MaybeTakeSpare if there is no spare
    renderer. The UMA is recorded when NavigationRequest is recorded in the UMA
    BrowserRenderProcessHost.NoSpareRenderer.AllocationSource.{NoSpareRendererReason}.
  </summary>
  <token key="NoSpareRendererReason" variants="NoSpareRendererReason"/>
</histogram>

<histogram name="BrowserRenderProcessHost.ProcessPerSiteMainFrameLimit"
    units="frames" expires_after="M135">
  <owner>dtapuska@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the number of outermost main frames that were hosted in the process
    when it was determined no more should be placed in the process for the
    ProcessPerSite algorithm. This is recorded only when this limit is first
    crossed for each RenderProcessHost.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.ReuseExistingProcess.ReusePolicy"
    enum="ProcessReusePolicy" expires_after="2027-01-17">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the process reuse policy when a SiteInstance reuses an existing
    process. Recorded when RenderProcessHostImpl::GetProcessHostForSiteInstance
    is called and the site instance is assigned a process by reusing an existing
    process.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SiteInstanceRenderProcessAssignment"
    enum="SiteInstanceProcessAssignment" expires_after="2027-01-10">
  <owner>ziadyoussef@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records how the main frame's SiteInstance was assigned a renderer process.
    Recorded when RenderProcessHostImpl::GetProcessHostForSiteInstance is
    called.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareCount" units="spares"
    expires_after="2025-08-24">
  <owner>pmonette@chromium.org</owner>
  <owner>catan-team@chromium.org</owner>
  <summary>Count of spare renderers. Recorded every 2 minutes.</summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareProcessDelayTime" units="ms"
    expires_after="2026-01-18">
  <owner>kerenzhu@chromium.org</owner>
  <owner>dayeung@chromium.org</owner>
  <owner>robliao@chromium.org</owner>
  <owner>tluk@chromium.org</owner>
  <summary>
    Records the time elapsed from the initiation of the spare process warm-up to
    the actual creation of the process.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareProcessEvictedOtherSpare"
    enum="Boolean" expires_after="2027-02-07">
  <owner>jam@chromium.org</owner>
  <owner>cduvall@chromium.org</owner>
  <summary>
    Records true if SpareRenderProcessHostManager::WarmupSpare evicted an
    existing spare process that had a different BrowserContext, or false if
    there wasn't an existing spare process.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareProcessMaybeTakeAction"
    enum="SpareProcessMaybeTakeAction" expires_after="2027-02-07">
  <owner>alexmos@chromium.org</owner>
  <owner>lukasza@chromium.org</owner>
  <summary>
    Records what happens when an attempt is made to use a spare
    RenderProcessHost - logs that either the attempt succeeded or why it failed.
  </summary>
</histogram>

<histogram
    name="BrowserRenderProcessHost.SpareProcessMaybeTakeAction.NavigationRequest"
    enum="SpareProcessMaybeTakeAction" expires_after="2027-01-17">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records what happens when an attempt is made to use a spare
    RenderProcessHost during a navigation request. The UMA logs that either the
    attempt succeeded or why it failed.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareProcessMaybeTakeTime"
    units="seconds" expires_after="2027-01-24">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the time elapsed from the creation of a spare renderer to the point
    when the browser tries to take a spare renderer. The UMA is recorded each
    time when the browser tries to take a spare renderer. The timer will not be
    reset if the spare renderer timeouts and will be recorded even if the spare
    renderer is no longer present. The behavior is designed to collect data
    about the appropriate value of the spare renderer timeout.
  </summary>
</histogram>

<histogram
    name="BrowserRenderProcessHost.SpareProcessMaybeTakeTime.{SpareProcessMaybeTakeAction}"
    units="seconds" expires_after="2027-02-07">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Categorize the BrowserRenderProcessHost.SpareProcessMaybeTakeTime by the
    SpareProcessMaybeTakeAction. The UMA is recorded each time when the browser
    try to take a spare renderer.
  </summary>
  <token key="SpareProcessMaybeTakeAction"
      variants="SpareProcessMaybeTakeAction"/>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareProcessRefusedByEmbedderReason"
    enum="SpareProcessRefusedByEmbedderReason" expires_after="2026-05-03">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the detailed reason if the spare process cannot be taken because of
    RefusedByEmbedder.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareProcessStartupTime" units="ms"
    expires_after="2027-01-31">
  <owner>kerenzhu@chromium.org</owner>
  <owner>dayeung@chromium.org</owner>
  <owner>robliao@chromium.org</owner>
  <owner>tluk@chromium.org</owner>
  <summary>
    Records the time elapsed from the creation of the spare process to the point
    when the process becomes ready. This does not include the scheduled delay
    time (see SpareProcessDelayTime).
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareRendererDispatchResult"
    enum="SpareRendererDispatchResult" expires_after="2027-01-03">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records how a spare renderer process is used or destroyed. The UMA is
    recorded when the spare renderer is used by navigation or destroyed because
    of timeout or resource limit.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareRendererPreviouslyTaken.ForCOOP"
    enum="Boolean" expires_after="2026-03-08">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether the process creation is caused by a COOP header in the
    previous successful call to
    SpareRenderProcessHostManagerImpl::MaybeTakeSpare when the same function is
    called and there is no spare renderer. The UMA is recorded when
    TakenByPreviousNavigation is recorded in the UMA
    BrowserRenderProcessHost.NoSparePresentReason2 and NavigationRequest is
    recorded in the UMA
    BrowserRenderProcessHost.SpareRendererPreviouslyTaken.Source.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareRendererPreviouslyTaken.Source"
    enum="ProcessAllocationSource" expires_after="2026-03-08">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the allocation source of the previous successful call to
    SpareRenderProcessHostManagerImpl::MaybeTakeSpare when the same function is
    called and there is no spare renderer. The UMA is recorded when
    TakenByPreviousNavigation is recorded in the UMA
    BrowserRenderProcessHost.NoSparePresentReason2.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareRendererPreviouslyTaken.Stage"
    enum="ProcessAllocationNavigationStage" expires_after="2026-01-04">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the navigation stage of the previous successful call to
    SpareRenderProcessHostManagerImpl::MaybeTakeSpare when the same function is
    called and there is no spare renderer. The UMA is recorded when
    TakenByPreviousNavigation is recorded in the UMA
    BrowserRenderProcessHost.NoSparePresentReason2 and NavigationRequest is
    recorded in the UMA
    BrowserRenderProcessHost.SpareRendererPreviouslyTaken.Source.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareRendererTaken.IsReady"
    enum="BooleanReady" expires_after="2027-01-17">
  <owner>pmonette@chromium.org</owner>
  <owner>catan-team@chromium.org</owner>
  <summary>
    Records whether or not the spare was ready at the time it was taken.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SpareRendererTaken.TimeSinceCreation"
    units="seconds" expires_after="2027-01-17">
  <owner>pmonette@chromium.org</owner>
  <owner>catan-team@chromium.org</owner>
  <summary>
    Records the time delta since the spare RenderProcessHost was created at the
    time it is taken.
  </summary>
</histogram>

<histogram
    name="BrowserRenderProcessHost.SpareRendererTakenInSameNavigation.ForCOOP"
    enum="Boolean" expires_after="2026-03-15">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether the current process allocation is caused by a COOP header if
    the current allocation fails and the previous allocation takes the spare
    renderer in the same navigation. The UMA is recorded if both
    BrowserRenderProcessHost.SpareRendererPreviouslyTaken.Stage and
    BrowserRenderProcessHost.NoSpareRenderer.NavigationStage.{NoSpareRendererReason}
    are recorded and the render process allocation happens in the same
    navigation.
  </summary>
</histogram>

<histogram
    name="BrowserRenderProcessHost.SpareRendererTakenInSameNavigation.StageCombination"
    enum="ProcessAllocationNavigationStageCombination"
    expires_after="2026-05-10">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records whether a combination of the previous and the current navigation
    stage if the allocation of the spare renderer fails and the previous
    allocation takes the spare renderer in the same navigation. The value is
    calculated by { 100 * PREVIOUS_STAGE + CURRENT_STAGE }. The UMA is recorded
    if both BrowserRenderProcessHost.SpareRendererPreviouslyTaken.Stage and
    BrowserRenderProcessHost.NoSpareRenderer.NavigationStage.{NoSpareRendererReason}
    are recorded and the render process allocation happens in the same
    navigation.
  </summary>
</histogram>

<histogram
    name="BrowserRenderProcessHost.SubframeProcessReuseThreshold.TotalFrames"
    units="frames" expires_after="2026-11-29">
  <owner>alexmos@chromium.org</owner>
  <owner>creis@chromium.org</owner>
  <owner>wjmaclean@chromium.org</owner>
  <summary>
    Records the total number of frames at the time the subframe memory threshold
    is exceeded and the process is not reused. Only recorded the first time that
    the threshold is exceeded in code that picks a process for a particular
    SiteInstance.
  </summary>
</histogram>

<histogram
    name="BrowserRenderProcessHost.SuspendedChild.KernelExecutionRecorded"
    enum="BooleanRecorded" expires_after="never">
<!-- expires-never: For monitoring stability regressions. -->

  <owner>wfh@chromium.org</owner>
  <owner>chrome-stability-core@google.com</owner>
  <summary>
    Whether or not kernel-mode execution was recorded for a suspended renderer
    process. This is recorded after process creation but before process
    resumption. This is recorded for every sandboxed Renderer process launched
    on Windows only.
  </summary>
</histogram>

<histogram name="BrowserRenderProcessHost.SuspendedChild.UserExecutionRecorded"
    enum="BooleanRecorded" expires_after="never">
<!-- expires-never: For monitoring stability regressions. -->

  <owner>wfh@chromium.org</owner>
  <owner>chrome-stability-core@google.com</owner>
  <summary>
    Whether or not user-mode execution was recorded for a suspended renderer
    process. This is recorded after process creation but before process
    resumption. This is recorded for every sandboxed Renderer process launched
    on Windows only.
  </summary>
</histogram>

<histogram name="BrowserScheduler.UIThread.TaskOffCpuDuration" units="ms"
    expires_after="2027-01-17">
  <owner>anandrv@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Records the duration spent off-CPU by tasks running on the browser UI
    thread. Recorded with 0.001 probability when a task scheduled on the main
    thread finishes running.
  </summary>
</histogram>

<histogram name="BrowserScheduler.UIThread.TaskOnCpuDuration" units="ms"
    expires_after="2027-01-17">
  <owner>anandrv@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Records the duration spent on-CPU by tasks running on the browser UI thread.
    Recorded with 0.001 probability when a task scheduled on the main thread
    finishes running.
  </summary>
</histogram>

<histogram name="BrowserScheduler.UIThread.TaskOnCpuPercentage" units="%"
    expires_after="2027-01-17">
  <owner>anandrv@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Records the percentage of wall time spent on-CPU by tasks running on the
    browser UI thread. Recorded with 0.001 probability when a task scheduled on
    the main thread finishes running.
  </summary>
</histogram>

<histogram name="BrowserServices.TwaOpenTime.V2" units="ms"
    expires_after="2024-09-01">
  <owner>peconn@chromium.org</owner>
  <owner>peter@chromium.org</owner>
  <summary>
    Triggered when a TrustedWebActivity is paused, recording the time since it
    had been resumed.
  </summary>
</histogram>

<histogram name="BrowserServices.VerificationResult"
    enum="BrowserServicesVerificationResult" expires_after="2026-12-16">
  <owner>peconn@chromium.org</owner>
  <owner>peter@chromium.org</owner>
  <summary>
    The result of Digital Asset Link verification performed when starting a
    Trusted Web Activity.

    Warning: this histogram was expired from M114 to 2024-10-10; data may be
    missing.
  </summary>
</histogram>

<histogram name="BrowserServices.VerificationTime.Offline" units="ms"
    expires_after="2027-02-14">
  <owner>peconn@chromium.org</owner>
  <owner>peter@chromium.org</owner>
  <summary>
    Triggered when Trusted Web Activity verification completes. Records how long
    it takes the device to realise it is offline and fall back to the cached
    result.

    Warning: this histogram was expired from 2024-09-15 to 2024-10-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="BrowserServices.VerificationTime.Online" units="ms"
    expires_after="2026-12-16">
  <owner>peconn@chromium.org</owner>
  <owner>peter@chromium.org</owner>
  <summary>
    Triggered when Trusted Web Activity verification completes. Records how long
    verification took when online.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.AlternativeBrowser" enum="BrowserType"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Records which browser the Legacy Browser Support feature is configured to
    open (which defaults to IE). Recorded on browser startup, and when the value
    changes. Only measured when Legacy Browser Support is enabled via the
    BrowserSwitcher* policies. Desktop Chrome only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.CacheFile.MkDirSuccess" enum="BooleanSuccess"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Records whether the &quot;AppData/Local/Google/BrowserSwitcher&quot;
    directory was successfully created. Windows only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.CacheFile.MkTempSuccess" enum="BooleanSuccess"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Records whether a temp file in
    &quot;AppData/Local/Google/BrowserSwitcher&quot; the directory was
    successfully created. Windows only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.CacheFile.MoveSuccess" enum="BooleanSuccess"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Records whether the temp file in
    &quot;AppData/Local/Google/BrowserSwitcher&quot; directory was successfully
    moved to its final destination (&quot;cache.dat&quot;) after writing its
    contents. Windows only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.ChromeLaunch.IsFromBrowserSwitcher"
    enum="Boolean" expires_after="2025-01-12">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Whether or not Chrome was launched by the Legacy Browser Support for Edge
    extension's native host. This indicates an automatic Edge=&gt;Chrome or
    IE=&gt;Chrome transition. Recorded whenever Chrome is launched by any means.
    Only recorded on Windows.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.Decision" enum="BooleanBrowserSwitch"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    On navigation and redirect, whether to switch browsers or not. Only measured
    when Legacy Browser Support is enabled via the BrowserSwitcher* policies.
    When this is true, Chrome attempts to launch an alternative browser
    (typically IE) with the navigation URL. Desktop Chrome only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.DecisionTime" units="ms"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    On navigation and redirect, records how long it took to compute a decision
    (stay in Chrome/open in IE). Only measured when Legacy Browser Support is
    enabled via the BrowserSwitcher* policies. Desktop Chrome only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.ExternalGreylistSize" units="rules"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Number of rules that come from an external greylist XML file. Measured when
    the sitelist is loaded during browser startup. Desktop Chrome only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.ExternalSitelistSize" units="rules"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Number of rules that come from an external sitelist XML file. Measured when
    the sitelist is loaded during browser startup. Desktop Chrome only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.GreylistSize" units="rules"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Number of rules in the BrowserSwitcherUrlGreylist policy. Measured when the
    policy is loaded. Desktop Chrome only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.GreylistWildcard" enum="BooleanPresent"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Whether there is a wildcard (&quot;*&quot;) rule in the
    BrowserSwitcherUrlGreylist policy. Measured when the
    BrowserSwitcherUrlGreylist policy gets updated. Desktop Chrome only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.IeemSitelistSize" units="rules"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Number of rules that come from Internet Explorer Enterprise Mode's sitelist.
    Measured when the sitelist is loaded during browser startup. Windows only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.LaunchSuccess" enum="BooleanSuccess"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Records whether an attempt to launch an alternate browser failed or
    succeeded. Desktop Chrome only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.LaunchTime" units="ms"
    expires_after="2026-12-27">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Records how long it took to launch an alternate browser (regardless of
    whether it failed or succeeded). Desktop Chrome only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.UrlListSize" units="rules"
    expires_after="2026-11-01">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Number of rules in the BrowserSwitcherUrlList policy. Measured when the
    policy gets updated. Desktop Chrome only.
  </summary>
</histogram>

<histogram name="BrowserSwitcher.UrlListWildcard" enum="BooleanPresent"
    expires_after="2027-01-03">
  <owner>nicolaso@chromium.org</owner>
  <owner>pastarmovj@chromium.org</owner>
  <summary>
    Whether there is a wildcard (&quot;*&quot;) rule in the
    BrowserSwitcherUrlList policy. Measured when the BrowserSwitcherUrlList
    policy gets updated. Desktop Chrome only.
  </summary>
</histogram>

<histogram name="DigitalAssetLinks.NumFingerprints" units="NumFingerprints"
    expires_after="M116">
  <owner>swestphal@chromium.org</owner>
  <owner>rayankans@chromium.org</owner>
  <summary>
    Records the number of fingerprints in assetlinks.json for every performed
    Digital Asset Link validation with a valid `sha256_cert_fingerprints`-entry.
  </summary>
</histogram>

<histogram name="InfoBar.Centralized.{Action}" enum="InfoBarIdentifier"
    expires_after="2027-07-13">
  <owner>musalmaan@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records when a desktop infobar centralized under the new centralization
    framework triggers a specific {Action}.

    Each bucket in this sparse histogram corresponds to a unique
    InfoBarIdentifier, and the count reflects the number of times that specific
    infobar triggered the {Action}.

    Recorded once per event to track user engagement and health of migrated
    infobars under the centralization framework.
  </summary>
  <token key="Action">
    <variant name="Accept" summary="Accept/OK button click action"/>
    <variant name="Cancel" summary="Cancel button click action"/>
    <variant name="Dismiss" summary="Dismissal action"/>
    <variant name="Ignored"
        summary="Infobar went away without any user interaction, e.g. on tab
                 close or navigation expiry"/>
    <variant name="LinkClicked" summary="Link click action"/>
    <variant name="Show" summary="Show/display action"/>
  </token>
</histogram>

<histogram name="InfoBar.CountAtShow" units="InfoBars" expires_after="never">
<!-- expires-never: Required as long as infobars exist. -->

  <owner>koretadaniel@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records how many infobars were visible at the moment a new infobar was
    shown. This is recorded any time a new infobar is shown. The maximum bucket
    for this metric is set to 10. It is less plausible to have 10 infobars at
    the same time, so this maximum value will help to capture all the lower
    buckets distinctly.
  </summary>
</histogram>

<histogram name="InfoBar.Prioritization.QueueSize" units="InfoBars"
    expires_after="2027-01-03">
  <owner>koretadaniel@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records the infobars pending queue size at a time of showing a new infobar.
    The maximum bucket for this metric is set to 50.
  </summary>
</histogram>

<histogram name="InfoBar.Prioritization.Starved" enum="InfoBarIdentifier"
    expires_after="2027-02-07">
  <owner>koretadaniel@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records the identifier of pending infobars that were discarded (starved)
    when the InfobarManager was reset or the tab was closed.
  </summary>
</histogram>

<histogram name="InfoBar.Prioritization.StarvedCount" units="InfoBars"
    expires_after="2027-01-03">
  <owner>koretadaniel@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records the number of pending infobars that were discarded (starved) when
    the InfobarManager was reset or the tab was closed.
  </summary>
</histogram>

<histogram name="InfoBar.Prioritization.{Priority}WaitTime" units="ms"
    expires_after="2027-02-07">
  <owner>koretadaniel@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    The time elapsed between an infobar being added to the prioritization queue
    and it being promoted to visible status.
  </summary>
  <token key="Priority">
    <variant name="CriticalSecurity" summary="Critical Security priority"/>
    <variant name="Default" summary="Default priority"/>
    <variant name="Low" summary="Low priority"/>
  </token>
</histogram>

<histogram name="InfoBar.Shown" enum="InfoBarIdentifier" expires_after="never">
<!-- expires-never: Required as long as infobars exist. -->

  <owner>rkaplow@chromium.org</owner>
  <summary>
    Records how many times a particular infobar was shown to the user. On
    Android, the infobar may be partially hidden due to stacking. On desktop, a
    tab with a visible infobar will increment this histogram every time the user
    switches away from the tab and back to it with the infobar still visible.
  </summary>
</histogram>

<histogram name="InfoBar.Shown.Hidden" enum="InfoBarIdentifier"
    expires_after="never">
<!-- expires-never: Required as long as infobars exist. -->

  <owner>mdjones@chromium.org</owner>
  <summary>
    Records how many times a particular infobar was displayed in a hidden state
    due to at least one other infobar existing. If there are no existing
    infobars, but the user scrolls at the exact moment a new infobar is added,
    the infobar may be hidden, but not recorded in this metric. Reliably
    triggering and detecting this combination is tricky so it isn't done. Only
    recorded on Android.
  </summary>
</histogram>

<histogram name="InfoBar.Shown.Hiding" enum="InfoBarIdentifier"
    expires_after="never">
<!-- expires-never: Required as long as infobars exist. -->

  <owner>mdjones@chromium.org</owner>
  <summary>
    Records how many times a particular infobar was visible and hiding a new
    infobar behind it. Only recorded on Android.
  </summary>
</histogram>

<histogram name="InfoBar.Shown.Visible" enum="InfoBarIdentifier"
    expires_after="never">
<!-- expires-never: Required as long as infobars exist. -->

  <owner>mdjones@chromium.org</owner>
  <summary>
    Records how many times a particular infobar was displayed in a visible state
    due to no other infobars existing. If there are no existing infobars, but
    the user scrolls at the exact moment a new infobar is added, the infobar may
    be hidden, but recorded here as visible. Reliably triggering and detecting
    this combination is tricky so it isn't done. Only recorded on Android.
  </summary>
</histogram>

<histogram name="SidePanel.Android.{SidePanelEntry}.OnWillAutoClose"
    enum="Boolean" expires_after="2027-01-31">
  <owner>mschillaci@google.com</owner>
  <owner>linyuh@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records when the side panel has been automatically closed because the window
    was resized to be too small. Recorded when the user resizes the window.
  </summary>
  <token key="SidePanelEntry" variants="SidePanelEntry"/>
</histogram>

<histogram name="SidePanel.Android.{SidePanelEntry}.OnWillAutoRestore"
    enum="Boolean" expires_after="2027-01-31">
  <owner>mschillaci@google.com</owner>
  <owner>linyuh@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records when the side panel has been automatically restored because the
    window was resized to be big enough again. Recorded when the user resizes
    the window.
  </summary>
  <token key="SidePanelEntry" variants="SidePanelEntry"/>
</histogram>

<histogram name="SidePanel.ReadAnything.ShownDurationMax1Day" units="ms"
    expires_after="2026-12-27">
  <owner>alfredohiguera@google.com</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records how long the ReadAnything side panel entry was open for (capped at
    24 hours). It is recorded in SidePanelEntry::OnEntryHidden when the entry is
    hidden (ie. switching entries or the side panel closing). This is similar to
    SidePanel.ReadAnything.ShownDuration but with a longer duration cap.
  </summary>
</histogram>

<histogram name="{SidePanelType}.OpenDuration" units="ms"
    expires_after="2027-02-07">
  <owner>corising@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records how long the {SidePanelType} was open for (capped at 1 hour)
    starting when the {SidePanelType} is triggered to be opened. Note this might
    be different than when the {SidePanelType} becomes visible due to delays for
    loading content. Recorded when the {SidePanelType} is closed.
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
</histogram>

<histogram name="{SidePanelType}.OpenOrChangeEntryTrigger"
    enum="SidePanelOpenTrigger" expires_after="2027-01-27">
  <owner>corising@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Logs the UI location from which the {SidePanelType} is triggered to be
    opened or to change the entry shown. Recorded when the {SidePanelType} is
    shown or the entry changed and a trigger is provided.
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
</histogram>

<histogram name="{SidePanelType}.OpenTrigger" enum="SidePanelOpenTrigger"
    expires_after="2027-01-31">
  <owner>corising@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Logs the UI location from which the {SidePanelType} is triggered to be
    opened. Recorded when the {SidePanelType} is shown and a trigger is
    provided.
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
</histogram>

<histogram name="{SidePanelType}.ResizedWidth" units="px"
    expires_after="2027-02-14">
  <owner>emshack@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records the width of the side panel contents after the side panel was
    resized.
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
</histogram>

<histogram name="{SidePanelType}.ResizedWidthPercentage"
    units="% of window width" expires_after="2026-12-16">
  <owner>emshack@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records the width of the side panel contents as a percentage of the browser
    window width after the side panel was resized.
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
</histogram>

<histogram name="{SidePanelType}.TimeOfLongestAnimationStep" units="ms"
    expires_after="2026-10-11">
  <owner>corising@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records elapsed time between animation steps for the longest step in a side
    panel open or close animation.

    OBSOLETE.

    See: SidePanelType.SidePanelAnimationType.TimeOfLongestAnimationStep below.
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
</histogram>

<histogram name="{SidePanelType}.{SidePanelAnimationType}.AnimationFPS"
    units="fps" expires_after="2027-02-14">
  <owner>corising@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records the frames per second for the side panel animation. This is recorded
    after each side panel animation is completed when the side panel opens or
    closes.
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
  <token key="SidePanelAnimationType" variants="SidePanelAnimationType"/>
</histogram>

<histogram
    name="{SidePanelType}.{SidePanelAnimationType}.TimeOfLongestAnimationStep"
    units="ms" expires_after="2027-01-24">
  <owner>corising@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records elapsed time between animation steps for the longest step in a side
    panel open or close animation.
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
  <token key="SidePanelAnimationType" variants="SidePanelAnimationType"/>
</histogram>

<histogram name="{SidePanelType}.{SidePanelEntry}.ResizedWidth" units="px"
    expires_after="2027-02-14">
  <owner>emshack@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records the width of the side panel contents after the side panel was
    resized, while the {SidePanelEntry} side panel entry was displayed.
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
  <token key="SidePanelEntry" variants="SidePanelEntry"/>
</histogram>

<histogram name="{SidePanelType}.{SidePanelEntry}.ResizedWidthPercentage"
    units="% of window width" expires_after="2027-02-14">
  <owner>emshack@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records the width of the side panel contents as a percentage of the browser
    window width after the side panel was resized, while the {SidePanelEntry}
    side panel entry was displayed.
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
  <token key="SidePanelEntry" variants="SidePanelEntry"/>
</histogram>

<histogram name="{SidePanelType}.{SidePanelEntry}.ShownDuration" units="ms"
    expires_after="2027-01-31">
  <owner>corising@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records how long the {SidePanelEntry} side panel entry was open for (capped
    at 1 hour). This is recorded in SidePanelEntry::OnEntryHidden when the entry
    is hidden (ie. switching entries or the side panel closing).
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
  <token key="SidePanelEntry" variants="SidePanelEntry"/>
</histogram>

<histogram name="{SidePanelType}.{SidePanelEntry}.ShowTriggered"
    enum="SidePanelOpenTrigger" expires_after="2027-02-07">
  <owner>corising@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records how a {SidePanelType} entry is triggered to be shown. (i.e. by
    toolbar button, by commbobox selection). This is recorded when a new
    {SidePanelType} entry is triggered to be shown regardless any
    {SidePanelType} entry is currently open.
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
  <token key="SidePanelEntry" variants="SidePanelEntry"/>
</histogram>

<histogram name="{SidePanelType}.{SidePanelEntry}.TimeFromEntryTriggerToShown"
    units="ms" expires_after="2027-01-10">
  <owner>corising@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records elapsed time between when the {SidePanelEntry} side panel entry
    triggered to be shown and when it was shown.
  </summary>
  <token key="SidePanelType" variants="SidePanelType"/>
  <token key="SidePanelEntry" variants="SidePanelEntry"/>
</histogram>

</histograms>

</histogram-configuration>
