<!--
Copyright 2021 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 WebAuthn 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="EnclaveTransactionType">
  <variant name="" summary="all transactions"/>
  <variant name=".DeviceForget" summary="device/forget"/>
  <variant name=".DeviceRegister" summary="device/register + keys/genpair"/>
  <variant name=".KeysWrapSecrets" summary="keys/wrap"/>
  <variant name=".PasskeyAssert"
      summary="passkeys/assert (with optional UV key)"/>
  <variant name=".PasskeyCreate"
      summary="passkeys/create (with optional UV key)"/>
  <variant name=".RecoveryKeyStoreRewrapPIN"
      summary="recovery_key_store/rewrap"/>
  <variant name=".RecoveryKeyStoreWrapPINAndKeysWrap"
      summary="recovery_key_store/wrap + keys/wrap (compound)"/>
  <variant name=".RecoveryKeyStoreWrapPINAndSecret"
      summary="recovery_key_store/wrap_pin_and_secret"/>
</variants>

<histogram name="WebAuthentication.Android.CredManAvailability" enum="Boolean"
    expires_after="2026-12-31">
  <owner>derinel@google.com</owner>
  <owner>kenrb@chromium.org</owner>
  <summary>
    Records whether Android Credential Management service is available. Recorded
    only for Android 14+, after the first passkey request on the profile.
  </summary>
</histogram>

<histogram name="WebAuthentication.Android.CredManConditionalRequest"
    enum="CredManGetRequestEnum" expires_after="2027-09-06">
  <owner>derinel@google.com</owner>
  <owner>kenrb@chromium.org</owner>
  <summary>
    Records events for Android Credential Management getCredential API for
    conditional UI requests.
  </summary>
</histogram>

<histogram name="WebAuthentication.Android.CredManCreateRequest"
    enum="CredManCreateRequestEnum" expires_after="2026-12-31">
  <owner>derinel@google.com</owner>
  <owner>kenrb@chromium.org</owner>
  <summary>
    Records events for Android Credential Management createCredential API for
    modal requests.
  </summary>
</histogram>

<histogram name="WebAuthentication.Android.CredManModalRequests"
    enum="CredManGetRequestEnum" expires_after="2026-12-31">
  <owner>derinel@google.com</owner>
  <owner>kenrb@chromium.org</owner>
  <summary>
    Records events for Android Credential Management getCredential API for modal
    requests.
  </summary>
</histogram>

<histogram name="WebAuthentication.Android.CredManPrepareRequest"
    enum="CredManPrepareRequestEnum" expires_after="2026-11-01">
  <owner>derinel@google.com</owner>
  <owner>kenrb@chromium.org</owner>
  <summary>
    Records events for Android Credential Management prepareGetCredential API.
  </summary>
</histogram>

<histogram name="WebAuthentication.Android.CredManPrepareRequestDuration"
    units="ms" expires_after="2026-11-15">
  <owner>derinel@google.com</owner>
  <owner>kenrb@chromium.org</owner>
  <summary>
    Records the duration of Android Credential Management prepareGetCredential
    API.
  </summary>
</histogram>

<histogram name="WebAuthentication.Android.GmsCoreGetCredentialsResult"
    enum="GmsCoreGetCredentialsResult" expires_after="2027-02-14">
  <owner>derinel@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the result of getting credentials from GMSCore. This can either use
    the passkey cache service or the FIDO2 APIs.
  </summary>
</histogram>

<histogram name="WebAuthentication.Android.GmsCoreSkippedCacheReason"
    enum="GmsCoreSkippedCacheReason" expires_after="2026-12-31">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    When a credential enumeration is being done for a Webauthn Get request, and
    the GMSCore API is being used (that is, not the CredentialManager API), and
    the credential metadata cache is not in use, then this records the reason
    why the cache is not being used.
  </summary>
</histogram>

<histogram name="WebAuthentication.Android.NonDiscoverableCredentialsFound"
    enum="Boolean" expires_after="2026-12-31">
  <owner>derinel@google.com</owner>
  <owner>kenrb@chromium.org</owner>
  <summary>
    Records whether non-discoverable credentials are found before dispatching
    the request to Android Credential Manager APIs. Recorded only on Android 14
    and above.
  </summary>
</histogram>

<histogram name="WebAuthentication.AutomaticPasskeyUpgrade.Result"
    enum="PasskeyUpgradeResult" expires_after="2027-02-07">
  <owner>martinkr@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the outcome of a WebAuthn conditional create (aka automatic passkey
    upgrade) request on Desktop, including a breakdown of failure conditions.
  </summary>
</histogram>

<histogram name="WebAuthentication.CableV2.TunnelEvent{Server}"
    enum="WebAuthenticationCableV2TunnelEvent" expires_after="2027-02-14">
  <owner>agl@chromium.org</owner>
  <owner>martinkr@google.com</owner>
  <summary>
    Records events that occur during the creation of a caBLEv2 tunnel for
    {Server}.
  </summary>
  <token key="Server">
    <variant name="" summary="any server"/>
    <variant name=".Apple" summary="Apple's tunnel server (cable.auth.com)"/>
    <variant name=".Google" summary="Google's tunnel server (cable.ua5v.com)"/>
    <variant name=".Other" summary="other tunnel servers"/>
  </token>
</histogram>

<histogram name="WebAuthentication.CableV2.TunnelServerError"
    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2027-01-17">
  <owner>agl@chromium.org</owner>
  <owner>martinkr@google.com</owner>
  <summary>
    Records network and HTTP errors when a tunnel server connection fails. (The
    HTTP error takes precedence if it's available.)
  </summary>
</histogram>

<histogram name="WebAuthentication.ChromeOS.GetAssertionStatus"
    enum="WebAuthenticationChromeOSGetAssertionResult"
    expires_after="2026-06-30">
  <owner>martinkr@google.com</owner>
  <owner>hcyang@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the outcome of GetAssertion for the u2df authenticator on Chrome OS.
  </summary>
</histogram>

<histogram name="WebAuthentication.ChromeOS.MakeCredentialStatus"
    enum="WebAuthenticationChromeOSMakeCredentialResult"
    expires_after="2026-06-30">
  <owner>martinkr@google.com</owner>
  <owner>hcyang@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the outcome of MakeCredential for the u2df authenticator on Chrome
    OS.
  </summary>
</histogram>

<histogram name="WebAuthentication.ChromeOS.StartupRecordCount" units="records"
    expires_after="2026-08-09">
  <owner>martinkr@google.com</owner>
  <owner>hcyang@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the number of records of the user's WebAuthn credentials created on
    Chrome OS.
  </summary>
</histogram>

<histogram name="WebAuthentication.Cmtg.BlockedDelay" units="ms"
    expires_after="2026-12-31">
  <owner>nsatragno@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Measures the additional delay the CMTG device key fetch is adding to the
    WebAuthn transaction. Recorded once per transaction when the flow is blocked
    waiting for keys to become ready.
  </summary>
</histogram>

<histogram name="WebAuthentication.CmtgDeviceKeys.RequestDuration" units="ms"
    expires_after="2027-05-15">
  <owner>nsatragno@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the duration of a request to obtain device keys for Credential
    Manager Trust Group (CMTG) key operations from Cryptauth.
  </summary>
</histogram>

<histogram name="WebAuthentication.CmtgDeviceKeys.Result"
    enum="CmtgDeviceKeysResult" expires_after="2027-05-15">
  <owner>nsatragno@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the result of a request to obtain device keys for Credential Manager
    Trust Group (CMTG) key operations from Cryptauth.
  </summary>
</histogram>

<histogram name="WebAuthentication.ConditionalUiPasskeyCount" units="passkeys"
    expires_after="2026-11-01">
  <owner>kenrb@chromium.org</owner>
  <owner>nsatragno@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the number of passkeys available for a Conditional UI get request.
  </summary>
</histogram>

<histogram name="WebAuthentication.CredentialExchange.PasskeyConflictsCount"
    units="passkeys" expires_after="2027-02-01">
  <owner>rgod@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records number of passkeys found on the import list that were conflicting
    with the passkeys already existing in Google Password Manager, i.e. had the
    same user ID and RP ID.
  </summary>
</histogram>

<histogram
    name="WebAuthentication.CredentialExchange.PasskeyConflictsResolvedCount"
    units="passkeys" expires_after="2027-02-01">
  <owner>rgod@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records number of passkeys found on the import list, that were conflicting
    with the passkeys already existing in Google Password Manager and were
    chosen by the user to be imported in a conflict resolution screen.
  </summary>
</histogram>

<histogram name="WebAuthentication.CredentialExchange.PasskeyDuplicatesCount"
    units="passkeys" expires_after="2027-02-01">
  <owner>rgod@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records number of passkeys found on the import list that already existed in
    Google Password Manager, i.e. had the same credential ID.
  </summary>
</histogram>

<histogram name="WebAuthentication.CredentialExchange.PasskeyImportStatus"
    enum="ImportedPasskeyStatus" expires_after="2026-12-21">
  <owner>rgod@google.com</owner>
  <owner>chrome-webauthns@google.com</owner>
  <summary>
    Tracks the individual status of a single passkey entry during import.
    Recorded when it has been checked for errors or missing fields.
  </summary>
</histogram>

<histogram name="WebAuthentication.CredentialExchange.PasskeysImportedCount"
    units="passkeys" expires_after="2027-02-01">
  <owner>rgod@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the number of passkeys successfully imported by the user.
  </summary>
</histogram>

<histogram name="WebAuthentication.CredentialFetchDuration.GmsCore.{Source}"
    units="ms" expires_after="2027-02-14">
  <owner>derinel@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    The duration of a request to obtain a list of credentials for a WebAuthn
    conditional UI Get Assertion request from GMS Core, broken down by the
    source of the credentials. This is only recorded when at least one
    credential is available in the results. This is a sub-histogram of
    WebAuthentication.CredentialFetchDuration.GmsCore and {Source}.
  </summary>
  <token key="Source">
    <variant name="Cache"
        summary="Credentials were fetched from the passkey cache service."/>
    <variant name="CacheFallback"
        summary="Credentials were fetched from the FIDO2 API after the
                 passkey cache service failed."/>
    <variant name="Fido2"
        summary="Credentials were fetched from the FIDO2 API directly."/>
  </token>
</histogram>

<histogram name="WebAuthentication.CredentialFetchDuration.{ApiUsed}"
    units="ms" expires_after="2027-02-07">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    The duration of a request to obtain a list of credentials for a WebAuthn
    conditional UI Get Assertion request, when using the {ApiUsed}. This is only
    recorded when at least one credential is available in the results. This
    complements the duration recorded by
    WebAuthentication.Android.CredManPrepareRequestDuration, which only applies
    to the CredMan API but emits on all requests including when there are no
    results present.
  </summary>
  <token key="ApiUsed">
    <variant name="ChromeOS" summary="ChromeOS platform API"/>
    <variant name="CredMan" summary="Credential Manager API on Android"/>
    <variant name="GmsCore" summary="GMS Core API on Android"/>
    <variant name="ICloudKeychain" summary="ICloud Keychain API"/>
    <variant name="TouchId" summary="Chrome-native Touch ID authenticator"/>
    <variant name="WinHello" summary="Windows Hello API"/>
  </token>
</histogram>

<histogram name="WebAuthentication.CspAllow.Remote" enum="Boolean"
    expires_after="2026-12-31">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records whether a WebAuthn RP ID would be allowed by the document's Content
    Security Policy (specifically connect-src or default-src). Recorded for a
    public key credential request that does not have a matched RP ID and
    therefore is having a Related Origin check performed.
  </summary>
</histogram>

<histogram name="WebAuthentication.CspAllow.{RequestType}" enum="Boolean"
    expires_after="2026-12-31">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records whether a WebAuthn RP ID would be allowed by the document's Content
    Security Policy (specifically connect-src or default-src). Recorded for
    every navigator.credentials.{RequestType}() call that involves a public key
    credential.
  </summary>
  <token key="RequestType">
    <variant name="Create"/>
    <variant name="Get"/>
  </token>
</histogram>

<histogram name="WebAuthentication.DeviceAuthorization.FetchResult"
    enum="DeviceAuthorizationFetchResult" expires_after="2027-05-31">
  <owner>rgod@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the high-level outcome of a device authorization keys fetch request.
  </summary>
</histogram>

<histogram name="WebAuthentication.DeviceAuthorization.HttpStatusOrNetError"
    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2027-05-31">
  <owner>rgod@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the HTTP response code or net error code when fetching device
    authorization keys.
  </summary>
</histogram>

<histogram name="WebAuthentication.Enclave.ActionOutcome.{Action}"
    enum="EnclaveManagerActionOutcome" expires_after="2027-08-01">
  <owner>martinkr@google.com</owner>
  <owner>kenrb@chromium.org</owner>
  <owner>nsatragno@chromium.org</owner>
  <owner>ylahodiuk@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>Records the outcome of the EnclaveManager action {Action}.</summary>
<!-- LINT.IfChange(EnclaveManagerActionForUMA) -->

  <token key="Action">
    <variant name="AddDeviceAndPINToAccount"
        summary="adding a device and PIN to the account"/>
    <variant name="AddDeviceToAccount"
        summary="adding a device to the account"/>
    <variant name="AddICloudRecoveryKey"
        summary="adding an iCloud recovery key"/>
    <variant name="ChangePIN" summary="changing the GPM PIN"/>
    <variant name="ConsiderSecurityDomainState"
        summary="processing security domain state updates"/>
    <variant name="RegisterIfNeeded"
        summary="registering the enclave if needed"/>
    <variant name="SetPIN" summary="setting a GPM PIN"/>
    <variant name="SetupWithPIN" summary="setting up an account with PIN"/>
    <variant name="Unenroll" summary="unenrolling from the enclave"/>
  </token>
<!-- LINT.ThenChange(//chrome/browser/webauthn/enclave_manager.h:EnclaveManagerActionForUMA) -->

</histogram>

<histogram name="WebAuthentication.Enclave.ChangePinEventsV2"
    enum="ChangePinEvent" expires_after="2027-01-17">
  <owner>derinel@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records events related to the GPM PIN Change flow. Recorded after when the
    user clicks on &quot;Change (Google) Password Manager PIN&quot; in password
    manager settings or when the user clicks &quot;Forgot PIN&quot; in the GPM
    PIN dialog.
  </summary>
</histogram>

<histogram name="WebAuthentication.Enclave.GetAccessTokenError"
    enum="GoogleServiceAuthError" expires_after="2026-12-31">
  <owner>ylahodiuk@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the error outcome of fetching an access token for the state machine
    of Enclave Manager. Records either success (in case there were no errors) or
    the specific Gaia error.
  </summary>
</histogram>

<histogram name="WebAuthentication.Enclave.HttpStatusOrNetError"
    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2027-07-20">
  <owner>martinkr@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the net error or HTTP response code when an enclave connection
    fails.
  </summary>
</histogram>

<histogram name="WebAuthentication.Enclave.OpportunisticStoreKeysOutcome"
    enum="EnclaveManagerActionOutcome" expires_after="2027-02-07">
  <owner>ylahodiuk@google.com</owner>
  <owner>nsatragno@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records an outcome of storing a passkey secret from out-of-context and
    opportunistic retrieval.
  </summary>
</histogram>

<histogram name="WebAuthentication.Enclave.PinRenewalActionOutcome"
    enum="EnclaveManagerActionOutcome" expires_after="2027-02-07">
  <owner>agl@google.com</owner>
  <owner>kenrb@chromium.org</owner>
  <owner>nsatragno@chromium.org</owner>
  <owner>ylahodiuk@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>Records an outcome of the PIN renewal action.</summary>
</histogram>

<histogram name="WebAuthentication.Enclave.WebSocketCloseCode"
    enum="WebSocketCloseCode" expires_after="2027-07-20">
  <owner>martinkr@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the WebSocket close code when the connection to the passkey enclave
    is dropped.
  </summary>
</histogram>

<histogram name="WebAuthentication.EnclaveEvent"
    enum="WebAuthenticationEnclaveEvent" expires_after="2027-01-24">
  <owner>agl@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records events related to the enclave (i.e. Google Password Manager passkeys
    on the desktop).
  </summary>
</histogram>

<histogram name="WebAuthentication.EnclaveLoadDuration" units="ms"
    expires_after="2026-12-27">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the time duration that was taken for the Enclave state to load.
  </summary>
</histogram>

<histogram name="WebAuthentication.EnclaveRequestResult.{RequestType}"
    enum="WebAuthenticationEnclaveRequestResult" expires_after="2027-02-07">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the result when the Enclave Authenticator client receives a response
    from the service for a {RequestType} request.
  </summary>
  <token key="RequestType">
    <variant name="DeferredUvKeySubmission"
        summary="deferred UV key submission"/>
    <variant name="GetAssertion" summary="Get Assertion"/>
    <variant name="MakeCredential" summary="Make Credential"/>
  </token>
</histogram>

<histogram
    name="WebAuthentication.EnclaveTransaction{EnclaveTransactionType}.Latency"
    units="ms" expires_after="2027-07-13">
  <owner>martinkr@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the latency of a completed enclave transaction for
    {EnclaveTransactionType}. Measured from when the connection is initiated to
    when the transaction completes.
  </summary>
  <token key="EnclaveTransactionType" variants="EnclaveTransactionType"/>
</histogram>

<histogram
    name="WebAuthentication.EnclaveTransaction{EnclaveTransactionType}.RequestSize"
    units="bytes" expires_after="2027-07-13">
  <owner>martinkr@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the size in bytes of the encrypted request sent to the enclave for
    {EnclaveTransactionType}.
  </summary>
  <token key="EnclaveTransactionType" variants="EnclaveTransactionType"/>
</histogram>

<histogram
    name="WebAuthentication.EnclaveTransaction{EnclaveTransactionType}.ResponseSize"
    units="bytes" expires_after="2027-07-13">
  <owner>martinkr@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the size in bytes of the encrypted response received from the
    enclave for {EnclaveTransactionType}.
  </summary>
  <token key="EnclaveTransactionType" variants="EnclaveTransactionType"/>
</histogram>

<histogram
    name="WebAuthentication.EnclaveTransaction{EnclaveTransactionType}.Result"
    enum="WebAuthenticationEnclaveTransactionResult" expires_after="2027-07-13">
  <owner>martinkr@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the result of an enclave transaction for {EnclaveTransactionType}.
  </summary>
  <token key="EnclaveTransactionType" variants="EnclaveTransactionType"/>
</histogram>

<histogram name="WebAuthentication.GetAssertion.Immediate.EnclaveReady"
    enum="Boolean" expires_after="2027-06-28">
  <owner>derinel@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records whether the enclave was ready to handle an immediate get assertion
    request. Recorded when an immediate get assertion request is triggered and
    the user has passkeys from the enclave authenticator.
  </summary>
</histogram>

<histogram name="WebAuthentication.GetAssertion.Immediate.RejectionReason"
    enum="WebAuthenticationImmediateMediationRejectionReason"
    expires_after="2026-12-31">
  <owner>derinel@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the reason why a WebAuthn get() request with immediate mediation was
    rejected by the browser before showing any UI.
  </summary>
</histogram>

<histogram
    name="WebAuthentication.GetAssertion.Immediate.TimeoutWhileWaitingForUi"
    enum="Boolean" expires_after="2026-12-31">
  <owner>derinel@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records whether the immediate timeout occurred while waiting for UI to be
    shown. Recorded when an immediate get() request is made.
  </summary>
</histogram>

<histogram name="WebAuthentication.GetAssertion.Result"
    enum="WebAuthenticationCredentialRequestResult" expires_after="2027-01-17">
  <owner>nsatragno@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>Records the result of a get assertion request.</summary>
</histogram>

<histogram name="WebAuthentication.GetAssertionRequestTransport"
    enum="WebAuthenticationFidoTransport" expires_after="2026-12-31">
  <owner>kenrb@chromium.org</owner>
  <owner>martinkr@google.com</owner>
  <summary>
    Records the transport used for all WebAuthentication GetAssertion requests
    sent to authenticators. This does not necessarily mean that there was a
    success response from any given authenticator.
  </summary>
</histogram>

<histogram name="WebAuthentication.GetAssertionResponseTransport"
    enum="WebAuthenticationFidoTransport" expires_after="2027-02-14">
  <owner>kenrb@chromium.org</owner>
  <owner>martinkr@google.com</owner>
  <summary>
    Records the transport used when an authenticator responds with success to a
    WebAuthentication GetAssertion request.
  </summary>
</histogram>

<histogram
    name="WebAuthentication.GetCredentials.Immediate.CombinedSelectorActions"
    enum="CombinedSelectorAction" expires_after="2026-12-31">
  <owner>derinel@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records events related to the combined selector sheet. Recorded for a
    navigator.credentials.get() call with mediation = &quot;conditional&quot;
    and when the combined selector is shown.
  </summary>
</histogram>

<histogram name="WebAuthentication.GetCredentials.Immediate.CredentialCount"
    units="credential count" expires_after="2026-12-31">
  <owner>derinel@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the number of credentials displayed in the combined selector sheet.
    Recorded for a navigator.credentials.get() call with mediation =
    &quot;immediate&quot; and when the combined selector is shown.
  </summary>
</histogram>

<histogram
    name="WebAuthentication.GPM.CachedOpportunisticallyRetrievedKeyEvent"
    enum="WebAuthenticationGPMCachedOpportunisticallyRetrievedKeyEvent"
    expires_after="2027-02-07">
  <owner>ylahodiuk@google.com</owner>
  <owner>izuzic@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records events that happen with cached opportunistically retrieved keys (a
    retrieved key is being cached if the key is for a different Gaia ID compared
    to the Gaia ID of the primary account or if the primary account is empty).
  </summary>
</histogram>

<histogram name="WebAuthentication.GPM.GetAssertion"
    enum="GPMGetAssertionEvents" expires_after="2027-02-07">
  <owner>natiahlyi@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records start, success, and failure events for Google Password Manager (GPM)
    passkey authentication attempts (GetAssertion calls). Each event is emitted
    immediately after it occurs. See GPMGetAssertionEvents enum for details.
  </summary>
</histogram>

<histogram
    name="WebAuthentication.GPM.GetAssertion.LargeBlobSucceeded.{Operation}"
    enum="Boolean" expires_after="2026-12-31">
  <owner>kenrb@chromium.org</owner>
  <owner>nsatragno@chromium.org</owner>
  <summary>
    Records whether a Large Blob {Operation} operation succeeded during a
    successful WebAuthn getAssertion request that used the Enclave authenticator
    (Google Password Manager).
  </summary>
  <token key="Operation">
    <variant name="Read" summary="read"/>
    <variant name="Write" summary="write"/>
  </token>
</histogram>

<histogram name="WebAuthentication.GPM.MakeCredential"
    enum="GPMMakeCredentialEvents" expires_after="2027-02-07">
  <owner>natiahlyi@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records start, success, and failure events for Google Password Manager (GPM)
    passkey creation attempts (MakeCredential calls). Each event is emitted
    immediately after it occurs. See GPMMakeCredentialEvents enum for details.
  </summary>
</histogram>

<histogram name="WebAuthentication.GPM.RecoveryEvent"
    enum="WebAuthenticationGPMRecoveryEvent" expires_after="2027-01-03">
  <owner>ylahodiuk@google.com</owner>
  <owner>izuzic@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the type of the key retrieval flow used for retrieving the passkey
    secret.
  </summary>
</histogram>

<histogram name="WebAuthentication.GpmPinStatus" enum="GpmPinAvailability"
    expires_after="2027-03-22">
  <owner>izuzic@google.com</owner>
  <owner>ylahodiuk@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the GPM PIN status on Chrome startup. Recorded on desktop, on Chrome
    startup when enclave manager is loaded. See GpmPinAvailability enum for
    details.
  </summary>
</histogram>

<histogram name="WebAuthentication.IOS.ContentAreaEvent"
    enum="WebAuthenticationIOSContentAreaEvent" expires_after="2027-01-17">
  <owner>rgod@google.com</owner>
  <owner>tmartino@chromium.org</owner>
  <owner>bling-transactions@google.com</owner>
  <summary>
    Logs WebAuthn API interactions in the content area in Chrome on iOS, such as
    a site requesting passkeys, or an assertion being returned by a CPE. Note
    that this is *not* limited to passkeys stored in Chrome. Requests handled by
    any (or no) credential provider are counted here, as well as requests for
    other types of WebAuthn credentials (e.g. security key credentials).
  </summary>
</histogram>

<histogram name="WebAuthentication.IOS.PasskeyParsingError"
    enum="PasskeysParsingError" expires_after="2026-07-14">
  <owner>sinhasourav@google.com</owner>
  <owner>bling-transactions@google.com</owner>
  <summary>
    Records the specific error type encountered when the JavaScript shim fails
    to parse a WebAuthn request.
  </summary>
</histogram>

<histogram name="WebAuthentication.IsUVPlatformAuthenticatorAvailable2"
    enum="Boolean" expires_after="2027-01-03">
  <owner>kenrb@chromium.org</owner>
  <owner>martinkr@google.com</owner>
  <summary>
    Records the result of each Web Authentication
    PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() API
    call.
  </summary>
</histogram>

<histogram
    name="WebAuthentication.MacOS.GetAssertion.LargeBlobSucceeded.{Operation}"
    enum="Boolean" expires_after="2026-12-31">
  <owner>kenrb@chromium.org</owner>
  <owner>nsatragno@chromium.org</owner>
  <summary>
    Records whether a Large Blob {Operation} operation succeeded during a
    WebAuthn getAssertion request on MacOS, using iCloud Keychain.
  </summary>
  <token key="Operation">
    <variant name="Read" summary="read"/>
    <variant name="Write" summary="write"/>
  </token>
</histogram>

<histogram name="WebAuthentication.MacOS.MakeCredentialLargeBlobResult"
    enum="Boolean" expires_after="2026-12-31">
  <owner>kenrb@chromium.org</owner>
  <owner>nsatragno@chromium.org</owner>
  <summary>
    Records if the macOS platform reported large blob support upon request when
    a passkey was created via WebAuthn makeCredential (iCloud Keychain).
  </summary>
</histogram>

<histogram name="WebAuthentication.MacOS.PasskeyPermission"
    enum="WebAuthenticationMacOSPasskeysPermission" expires_after="2026-12-31">
  <owner>agl@chromium.org</owner>
  <owner>martinkr@google.com</owner>
  <summary>
    Records whether Chromium is granted the macOS passkeys permission by users
    when they're prompted for it.
  </summary>
</histogram>

<histogram name="WebAuthentication.MacOS.PlatformAuthenticatorAction"
    enum="WebAuthenticationMacOSPlatformAuthenticatorAction"
    expires_after="2026-12-31">
  <owner>agl@chromium.org</owner>
  <owner>martinkr@google.com</owner>
  <summary>
    Records events from the macOS platform authenticator. Note that
    &quot;success&quot; events are only recorded for transactions that
    previously recorded a &quot;start&quot; event.
  </summary>
</histogram>

<histogram name="WebAuthentication.MakeCredential.ResidentKeyRequirement"
    enum="WebAuthenticationResidentKeyRequirement" expires_after="2026-12-31">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the resident key specification of a make credential request at the
    time the request is initiated. This is taken from the residentKey field, if
    available, or else the requireResidentKey field, if available.
  </summary>
</histogram>

<histogram name="WebAuthentication.MakeCredential.Result"
    enum="WebAuthenticationCredentialRequestResult" expires_after="2027-02-07">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>Records the result of a make credential request.</summary>
</histogram>

<histogram name="WebAuthentication.MakeCredentialResponseTransport"
    enum="WebAuthenticationFidoTransport" expires_after="2026-12-31">
  <owner>kenrb@chromium.org</owner>
  <owner>martinkr@google.com</owner>
  <summary>
    Records the transport used when an authenticator responds with success to a
    WebAuthentication MakeCredential request.
  </summary>
</histogram>

<histogram name="WebAuthentication.MechanismSorter.DeduplicationHappened"
    enum="Boolean" expires_after="2026-12-16">
  <owner>derinel@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    For a given WebAuthn request, records whether any credentials for the same
    account were deduplicated. This is recorded for get requests with immediate
    mediation.
  </summary>
</histogram>

<histogram name="WebAuthentication.MechanismSorter.SelectedMechanismType"
    enum="WebAuthenticationDeduplicatedType" expires_after="2027-01-10">
  <owner>derinel@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the type of the credential that was selected for an account after
    deduplication. This is recorded for each account that had more than one
    credential (i.e. when deduplication happened). This is recorded for get
    requests with immediate mediation.
  </summary>
</histogram>

<histogram name="WebAuthentication.OnboardingEvents" enum="OnboardingEvents"
    expires_after="2027-01-31">
  <owner>natiahlyi@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Recorded when the user interacts with modals in the GPM onboarding flow.
  </summary>
</histogram>

<histogram name="WebAuthentication.PasskeyCount" units="count"
    expires_after="2026-12-27">
  <owner>izuzic@google.com</owner>
  <owner>ylahodiuk@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the number of passkeys stored in Google Password Manager. Recorded
    on desktop, 30s after Chrome startup.
  </summary>
</histogram>

<histogram name="WebAuthentication.PasskeyReadiness" enum="Boolean"
    expires_after="2026-12-27">
  <owner>izuzic@google.com</owner>
  <owner>ylahodiuk@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the readiness state of passkeys stored in Google Password Manager.
    Tracks if Chrome clients are in a passkey ready state. Passkey ready state
    means that the client is able to create and store new passkeys and is able
    to use existing passkeys for signing in. Recorded on desktop, on Chrome
    startup when enclave manager is loaded.
  </summary>
</histogram>

<histogram name="WebAuthentication.PasskeyUnlock.ErrorUi.Event"
    enum="WebAuthenticationPasskeyUnlockErrorUiEvent"
    expires_after="2027-03-22">
  <owner>izuzic@google.com</owner>
  <owner>ylahodiuk@google.com</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records all the events related to the passkey unlock error UI, such as when
    the error UI is shown, hidden or when the user interacts with it. Recorded
    on desktop.
  </summary>
</histogram>

<histogram name="WebAuthentication.PinRenewalEvent"
    enum="WebAuthenticationPinRenewalEvent" expires_after="2027-01-31">
  <owner>agl@google.com</owner>
  <owner>kenrb@chromium.org</owner>
  <summary>Records events related to GPM PIN renewals</summary>
</histogram>

<histogram
    name="WebAuthentication.SignalAllAcceptedCredentialsRemovedGPMPasskey"
    enum="SignalAllAcceptedCredentialsResult" expires_after="2027-02-07">
  <owner>nsatragno@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the result of a website calling
    PublicKeyCredential.signalAllAcceptedCredentials with respect to Google
    Password Manager passkeys.
  </summary>
</histogram>

<histogram name="WebAuthentication.SignalCurrentUserDetailsUpdatedGPMPasskey"
    enum="SignalCurrentUserDetailsResult" expires_after="2026-11-29">
  <owner>nsatragno@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the result of a website calling
    PublicKeyCredential.signalCurrentUserDetails with respect to Google Password
    Manager passkeys.
  </summary>
</histogram>

<histogram name="WebAuthentication.SignalUnknownCredentialRemovedGPMPasskey"
    enum="SignalUnknownCredentialResult" expires_after="2026-11-29">
  <owner>nsatragno@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the result of a website calling
    PublicKeyCredential.signalUnknownCredential with respect to Google Password
    Manager passkeys.
  </summary>
</histogram>

<histogram name="WebAuthentication.U2fSignOperation"
    enum="U2fSignOperationResult" expires_after="2026-12-31">
  <owner>nsatragno@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the result of a WebAuthn get assertion operation on a U2F device.
    This will be logged every time there's a U2F device plugged in, even if the
    user did not interact with it.
  </summary>
</histogram>

<histogram name="WebAuthentication.Windows.FindHelloDialogIterationCount"
    units="iterations" expires_after="2027-06-30">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the number of iterations that it took to find the Windows Hello
    dialog for the purpose of bringing it to the foreground. This dialog is the
    user verification for using or creating a KeyCredential signing key.
  </summary>
</histogram>

<histogram name="WebAuthentication.Windows.ForegroundedWindowsHelloDialog"
    enum="WindowsForegroundedHelloDialog" expires_after="2027-01-03">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the success or failure of attempts to bring the Windows Hello user
    verification dialog to the foreground during a GPM passkey UV operation,
    using or creating a KeyCredential signing key.
  </summary>
</histogram>

<histogram name="WebAuthentication.Windows.KeyCredentialCreation"
    enum="WindowsKeyCredentialCreateResult" expires_after="2026-11-22">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the result of the KeyCredentialManager.RequestCreateAsync method in
    the Windows Runtime API. It is recorded when that method is called, which
    currently only happens following a device registration with the GPM passkey
    enclave service.
  </summary>
</histogram>

<histogram name="WebAuthentication.Windows.KeyCredentialManagerSupported"
    enum="WindowsKeyCredentialManagerSupportResults" expires_after="2026-12-31">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the result of the KeyCredentialManager.IsSupportedAsync method in
    the Windows Runtime API. It is recorded on a low-priority thread at browser
    startup.
  </summary>
</histogram>

<histogram name="WebAuthentication.Windows.KeyCredentialSign"
    enum="WindowsKeyCredentialSignResult" expires_after="2026-12-31">
  <owner>kenrb@chromium.org</owner>
  <owner>chrome-webauthn@google.com</owner>
  <summary>
    Records the result of the KeyCredential.RequestSignAsync method in the
    Windows Runtime API. It is recorded when that method is called, which
    currently only happens when signing a UV passkey request for the GPM passkey
    enclave service.
  </summary>
</histogram>

</histograms>

</histogram-configuration>
