<!--
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 Extensions 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="ChannelType">
  <variant name=""
      summary="However, this is the overall metric for all channel types."/>
  <variant name=".ConnectChannel" summary="Specifically connect() channel."/>
  <variant name=".NativeChannel"
      summary="Specifically native messaging channel."/>
  <variant name=".SendMessageChannel"
      summary="Specifically sendMessage() channel."/>
  <variant name=".SendRequestChannel"
      summary="Specifically sendRequest() channel."/>
</variants>

<variants name="DeclarativeNetRequestLoadRulesetRequestSource">
  <variant name="OnExtensionLoad"
      summary="Ruleset load triggered when the extension was loaded."/>
  <variant name="UpdateDynamicRules"
      summary="Ruleset load was triggered when the extension made an API call
               to update its dynamic rules."/>
  <variant name="UpdateEnabledStaticRulesets"
      summary="Ruleset load was triggered when the extension made an API call
               to update its set of enabled static rulesets."/>
</variants>

<variants name="DeclarativeNetRequestRegexRulesetSize">
  <variant name="15To100Rules" summary="15 to 100 regex rules"/>
  <variant name="100To500Rules" summary="100 to 500 regex rules"/>
  <variant name="LessThan15Rules" summary="less than 15 regex rules"/>
  <variant name="Over500Rules" summary="Over 500 regex rules"/>
</variants>

<variants name="DeclarativeNetRequestRulesetSize">
  <variant name="1000To10000Rules" summary="1,000 to 10,000 rules"/>
  <variant name="10000To30000Rules" summary="10,000 to 30,000 rules"/>
  <variant name="30000To100000Rules" summary="30,000 to 100,000 rules"/>
  <variant name="100000To300000Rules" summary="100,000 to 300,000 rules"/>
  <variant name="LessThan1000Rules" summary="less than 1,000 rules"/>
  <variant name="Over300000Rules" summary="over 300,000 rules"/>
</variants>

<variants name="DeveloperModeState">
  <variant name="DeveloperModeOff" summary="developer mode off"/>
  <variant name="DeveloperModeOn" summary="developer mode on"/>
</variants>

<variants name="ExtensionFunctionExecutionTime">
  <variant name=".1msTo5ms"
      summary="Execution took between 1ms and 5ms (tolerable)."/>
  <variant name=".5msTo10ms"
      summary="Execution took between 5ms and 10ms (slow)."/>
  <variant name=".LessThan1ms" summary="Execution took less than 1ms (fast)."/>
  <variant name=".Over10ms" summary="Execution took over 10ms (glacial)."/>
  <variant name=".Over270s"
      summary="Execution took over 4 and half minutes, close to timeout."/>
</variants>

<variants name="ExtensionsBackgroundCompileScriptState">
  <variant name="Success"
      summary="Script was successfully compiled in the background."/>
  <variant name="TimedOut"
      summary="Main thread timed out while waiting for background compilation
               to finish."/>
</variants>

<variants name="ExtensionState">
  <variant name=".Disabled" summary="disabled"/>
  <variant name=".Enabled" summary="enabled"/>
</variants>

<variants name="ManifestLocationGroup">
  <variant name="Component"
      summary="component extension(s) (ManifestLocations kComponent and
               kExternalComponent)"/>
  <variant name="External"
      summary="external extension(s) (ManifestLocations kExternalPref,
               kExternalPrefDownload, and kExternalRegistry)"/>
  <variant name="Internal"
      summary="internal extension(s) (ManifestLocation::kInternal; likely
               user-installed)"/>
  <variant name="Policy"
      summary="policy-installed extension(s) (ManifestLocations
               kExternalPolicy and kExternalPolicyDownload)"/>
  <variant name="Unpacked"
      summary="unpacked and developer extension(s) (ManifestLocations
               kCommandLine and kUnpacked)"/>
</variants>

<variants name="NativeMessagingSource">
  <variant name=".Extension" summary="the extension to the native app"/>
  <variant name=".NativeApp" summary="the native app to the extension"/>
</variants>

<!--
This is emitted for two scenarios when a worker may be unregistered:

  1. due to an extension update to potentially unregistering the old worker or

  2. due to the extension being deactivated (due to disable, uninstall, or
  terminate)

  #1 and #2 can both occur for an extension update.

  #2 can occur independently outside of an extension update.
-->

<variants name="UnregistrationType">
  <variant name=""
      summary="This metric is emitted in the #1 (update) and #2 (deactivate
               extension) scenarios. Note: in the scenario of an extension
               update that has a worker (either as a background context or
               registered via the Web API) to a worker-based extension this
               metric may be double counted as true. This is because two
               unregistrations requests are submitted and both will succeed.
               This metric can also emit false expectedly when updating from
               an MV2 extension with no workers registered."/>
  <variant name="_AddExtension"
      summary="This metric is only emitted in the #1 (update) scenario. Note:
               This metric can expectedly emit false when updating from an
               MV2 extension with no workers registered (either as a
               background context, or registered via the web API). This is
               because //extensions attempts to unregister a worker
               regardless to ensure that those registered via the web API
               (which //extensions doesn't track) are unregistered on update
               to prepare for the updated version's worker to be registered."/>
  <variant name="_DeactivateExtension"
      summary="This metric is only emitted in the #2 (deactivate extension)
               scenario when the worker is the current worker activation."/>
</variants>

<variants name="UserType">
  <variant name=".NonUser"
      summary="&quot;non-user&quot; profiles (profiles where people can't
               install extensions, specifically profiles that can have only
               have non-component extensions installed)"/>
  <variant name=".User"
      summary="&quot;user&quot; profiles (profiles where people can install
               extensions, specifically profiles that can have non-component
               extensions installed)"/>
</variants>

<variants name="VerifiedFileType">
  <variant name=".BackgroundPage" summary="Extension background page"/>
  <variant name=".BackgroundScript" summary="Extension background script"/>
  <variant name=".ContentScript" summary="Content script"/>
  <variant name=".MiscFile" summary="Any other verified file"/>
  <variant name=".MiscHtmlFile"
      summary="Miscellaneous html file (e.g. loaded in a tab)"/>
  <variant name=".MiscJsFile"
      summary="Miscellaneous js file (e.g. loaded in a tab)"/>
  <variant name=".ServiceWorkerScript"
      summary="Extension service worker script"/>
</variants>

<histogram name="ExtensionBlacklist.BlacklistInstalled"
    enum="ExtensionLocation" expires_after="2027-05-11">
  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    The number of extensions that were blocklisted when already installed,
    grouped by Extension::Location. Logged when ExtensionService blockists and
    unloads an installed extension.

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

<histogram name="ExtensionBlacklist.BlockCRX" enum="ExtensionLocation"
    expires_after="2027-01-17">
  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    The number of extensions that have been blocked from installing grouped by
    Extension::Location. Logged when ExtensionService refuses to install a
    blocklisted extension.
  </summary>
</histogram>

<histogram name="ExtensionBlacklist.SilentInstall" enum="ExtensionLocation"
    expires_after="2027-05-11">
  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    The number of extensions that have been silently installed in a blocklisted
    state, grouped by Extension::Location. Logged when ExtensionService installs
    a blocklisted extension without blocking it (ExtensionBlacklist.BlockCRX
    would be logged otherwise). Typically this will be when a user has a
    blocklisted extension synced.

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

<histogram name="ExtensionBlacklist.UnblacklistInstalled"
    enum="ExtensionLocation" expires_after="2027-01-17">
  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    The number of extensions that were unblocklisted when installed, grouped by
    Extension::Location. Logged when ExtensionService unblocklists and loads a
    blocklisted extension.

    Warning: this histogram was expired from 2024-07-28 to 2025-11-13; data may
    be missing.
  </summary>
</histogram>

<histogram name="ExtensionContentHashFetcher.CreateHashesTime" units="ms"
    expires_after="never">
<!-- expires-never: Used for monitoring extension content verification latency. -->

  <owner>lazyboy@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The time taken to create the computed_hashes.json file for an extension.
    This happens once for each extension after we get signed values of the
    expected root node of a tree hashes for each file from the webstore; we then
    compute the individual block level hashes of the actual files and cache them
    in computed_hashes.json (assuming we don't detect any mismatches).
  </summary>
</histogram>

<histogram name="ExtensionInstall.ExtensionMustRemainDisabled.Result"
    enum="Boolean" expires_after="2027-06-17">
  <owner>ydago@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records whether an extension must remain disabled. Recorded when
    ExtensionService checks if an extension must remain disabled.
  </summary>
</histogram>

<histogram name="ExtensionInstall.IsExtensionAllowed.Result"
    enum="IsExtensionAllowedResult" expires_after="2027-06-17">
  <owner>ydago@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records the result of checking if an extension is allowed to be installed.
    Recorded when ExtensionService checks if an extension is allowed.
  </summary>
</histogram>

<histogram name="ExtensionInstall.UserCanInstall.PolicyFetchResult"
    enum="IsExtensionAllowedResult" expires_after="2027-06-17">
  <owner>ydago@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records the result of fetching the extension install policy. Recorded when
    ExtensionService checks if a user can install an extension.
  </summary>
</histogram>

<histogram name="ExtensionInstall.UserCanInstall.PolicyFetchTime" units="ms"
    expires_after="2027-06-17">
  <owner>ydago@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records the time it takes to fetch the extension install policy. Recorded
    when ExtensionService checks if a user can install an extension.
  </summary>
</histogram>

<histogram name="ExtensionInstall.UserMayLoadExtension.Result" enum="Boolean"
    expires_after="2026-06-05">
  <owner>ydago@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records whether a user may load an extension. Recorded when ExtensionService
    checks if a user may load an extension.
  </summary>
</histogram>

<histogram name="Extensions.Action.SetBadgeTextLength" units="bytes"
    expires_after="2027-02-07">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>bershanskyi@gmail.com</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The length (in bytes) of the badge text string provided to
    action.setBadgeText(). Recorded each time an extension calls the method
    successfully.
  </summary>
</histogram>

<histogram name="Extensions.Action.SetTitleLength" units="bytes"
    expires_after="M155">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>bershanskyi@gmail.com</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The length (in bytes) of the title string provided to action.setTitle().
    Recorded each time an extension calls the method successfully.
  </summary>
</histogram>

<histogram name="Extensions.AlarmManager.AlarmsMaxNameLength"
    enum="ExtensionAlarmsNameLength" expires_after="2026-12-27">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>bershanskyi@gmail.com</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The length of the longest alarm name (in characters) an extension has set.
    It is emitted every time an extension is loaded (during user profile load).
    It is not emitted for extensions that do not have any saved alarms on
    extension load.
  </summary>
</histogram>

<histogram name="Extensions.AppLaunch" enum="AppLaunch"
    expires_after="2027-02-14">
  <owner>benwells@chromium.org</owner>
  <owner>dominickn@chromium.org</owner>
  <owner>tapted@chromium.org</owner>
  <summary>
    The number of times v1 apps are launched grouped by
    extension_misc::AppLaunchBuckets. See also Apps.AppLaunch for v2 apps. Note
    this was changed in 2023-02 to no longer count web app launches.
  </summary>
</histogram>

<histogram name="Extensions.AppLocation2" enum="ExtensionLocation"
    expires_after="2024-01-01">
  <owner>benwells@chromium.org</owner>
  <owner>tapted@chromium.org</owner>
  <summary>
    The number of apps loaded on profile open time grouped by
    Extension::Location.
  </summary>
</histogram>

<histogram
    name="Extensions.BackgroundCompileInjectedScripts.EligibleScriptsCount"
    units="count" expires_after="2026-11-01">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <owner>emromero@microsoft.com</owner>
  <summary>
    Number of scripts to be injected at document start that were eligible for
    background compilation.

    Emitted when `extensions_features::kExtensionsBackgroundCompilation` is
    enabled, the navigation is ready to commit, and the scripts have started
    streaming to v8 for compilation.
  </summary>
</histogram>

<histogram
    name="Extensions.BackgroundCompileInjectedScripts.EligibleScriptsPercentage"
    units="%" expires_after="2026-11-01">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <owner>emromero@microsoft.com</owner>
  <summary>
    Number of scripts injected at document start that were eligible for
    background compilation, as a percentage of all scripts injected at document
    start.

    Emitted at the same time as
    Extensions.BackgroundCompileInjectedScripts.EligibleScriptsCount.
  </summary>
</histogram>

<histogram
    name="Extensions.BackgroundCompileInjectedScripts.ScriptCompilationTime{State}"
    units="ms" expires_after="2026-11-01">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <owner>emromero@microsoft.com</owner>
  <summary>
    Time taken to compile an extension JS script injected at document start that
    was compiled in a background thread.

    Emitted asynchronously on the main thread immediately after the background
    thread completes script compilation. The background worker calls Run(), then
    posts EmitCompilationHistograms() back to the main thread via
    PostNonNestableTask().
  </summary>
  <token key="State" variants="ExtensionsBackgroundCompileScriptState"/>
</histogram>

<histogram name="Extensions.BackgroundCompileInjectedScripts.ScriptSize{State}"
    units="count" expires_after="2026-11-01">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <owner>emromero@microsoft.com</owner>
  <summary>
    Number of characters of an extension JS script injected at document start
    that was compiled in a background thread.

    Emitted simultaneously with ScriptCompilationTime{State}.
  </summary>
  <token key="State" variants="ExtensionsBackgroundCompileScriptState"/>
</histogram>

<histogram name="Extensions.BackgroundHostCreatedForExtension"
    enum="BackgroundHostCreatedForExtensionValues" expires_after="2024-05-19">
  <owner>fdoray@chromium.org</owner>
  <owner>catan-team@chromium.org</owner>
  <summary>
    Recorded when a background host is created for an extension. The value
    indicates for which extension the host was created.

    The breakdown of extensions that make up the &quot;Other extension&quot;
    bucket can be derived from the LoadCountsPerTopLevelDocument UKM event. To
    compare UKM event counts with UMA sample counts, use this formula:

    count of UKM events for a given extension * count of samples in the
    &quot;Other extension&quot; bucket of this histogram / count of UKM events
    for all extensions

    Extensions bundled with Chrome have dedicated values in this histogram
    because they are not synced and therefore not reported through UKM.
  </summary>
</histogram>

<histogram name="Extensions.BackgroundPageLoadTime2" units="ms"
    expires_after="2024-02-11">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The time taken for an extension's persistent background page to load its
    initial URL.
  </summary>
</histogram>

<histogram name="Extensions.BackgroundPageType2"
    enum="ExtensionBackgroundPageType" expires_after="never">
<!-- expires-never: Used for monitoring user extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The type (if any) of background page the extension has. Recorded for
    installed extensions on profile open for &quot;user profiles&quot; (profiles
    where people can install extensions, specifically profiles that can have
    non-component extensions installed.
  </summary>
</histogram>

<histogram name="Extensions.BadMessageFunctionName" enum="ExtensionFunctions"
    expires_after="never">
<!-- expires-never: Monitoring core extension system health. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of times each Extension function call sends a bad message,
    killing the renderer. This may indicate a bug in that API's implementation
    on the renderer. Note a similar, aggregate metric is BadMessageTerminate_EFD
    which counts the number of bad messages that are sent overall.
  </summary>
</histogram>

<histogram name="Extensions.BadSyncDataReason" enum="BadSyncDataReason"
    expires_after="never">
<!-- expires-never: Monitoring core extension system health. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The reason a valid ExtensionSyncData could not be parsed from a SyncData
    received from sync.
  </summary>
</histogram>

<histogram name="Extensions.CommandLineInstalled" units="count"
    expires_after="2027-01-24">
  <owner>richche@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records when a command-line extension is installed. Emitted on every profile
    open only for &quot;user profiles&quot; (profiles where people can install
    extensions, specifically profiles that can have non-component extensions
    installed).
  </summary>
</histogram>

<histogram name="Extensions.CommandLineManifestSettingsOverride"
    enum="ManifestSettingsOverrideType" expires_after="2027-01-24">
  <owner>richche@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the default search engine, new tab page, both, or none of the
    overrides in a command-line extension's manifest when installed. Emitted on
    every profile open only for &quot;user profiles&quot; (profiles where people
    can install extensions, specifically profiles that can have non-component
    extensions installed).
  </summary>
</histogram>

<histogram name="Extensions.ContentScripts.ContentScriptLength" units="KB"
    expires_after="2024-11-22">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The size, in KB, of a content script that is loaded successfully from a
    file. Recorded when the content of a user script object is set.
  </summary>
</histogram>

<histogram name="Extensions.ContentScripts.DynamicContentScriptsLengthPerLoad"
    units="KB" expires_after="2024-12-02">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The size, in KB, of all newly loaded dynamic content scripts for one
    extension. Recorded when a script load containing at least one new dynamic
    content script finishes.
  </summary>
</histogram>

<histogram name="Extensions.ContentScripts.ManifestContentScriptsLengthPerLoad"
    units="KB" expires_after="2024-12-02">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The size, in KB, of all newly loaded manifest content scripts for one
    extension. Recorded when a script load containing at least one new manifest
    content script finishes.
  </summary>
</histogram>

<histogram
    name="Extensions.ContentSettings.PrimaryPatternMatchesExtensionOrigin"
    enum="ContentType" expires_after="2025-12-28">
  <owner>estark@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    An entry is emitted each time an extension sets a content setting whose
    primary pattern matches the Chrome extension origin. This will be used to
    determine if the ability to set content settings for Chrome extension
    origins can be deprecated.

    This happens on profile startup (for stored settings) and each time an
    extension calls chrome.contentSettings[type].set(...).
  </summary>
</histogram>

<histogram
    name="Extensions.ContentSettings.PrimaryPatternUniqueSecondaryPatternDifferent"
    enum="ContentType" expires_after="2025-02-28">
  <owner>erikchen@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    An entry is emitted each time an extension sets a content setting whose
    primary pattern is unique and secondary pattern is a different unique.

    This happens on profile startup (for stored settings) and each time an
    extension calls chrome.contentSettings[type].set(...).
  </summary>
</histogram>

<histogram
    name="Extensions.ContentSettings.PrimaryPatternUniqueSecondaryPatternIdentical"
    enum="ContentType" expires_after="2024-07-07">
  <owner>erikchen@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    An entry is emitted each time an extension sets a content setting whose
    primary pattern is unique and secondary pattern is identical to the primary
    pattern.

    This happens on profile startup (for stored settings) and each time an
    extension calls chrome.contentSettings[type].set(...).
  </summary>
</histogram>

<histogram
    name="Extensions.ContentSettings.PrimaryPatternUniqueSecondaryPatternWildcard"
    enum="ContentType" expires_after="2025-11-30">
  <owner>erikchen@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    An entry is emitted each time an extension sets a content setting whose
    primary pattern is unique and secondary pattern is a wildcard.

    This happens on profile startup (for stored settings) and each time an
    extension calls chrome.contentSettings[type].set(...).
  </summary>
</histogram>

<histogram
    name="Extensions.ContentSettings.PrimaryPatternWildcardSecondaryPatternUnique"
    enum="ContentType" expires_after="2025-02-28">
  <owner>erikchen@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    An entry is emitted each time an extension sets a content setting whose
    primary pattern is a wildcard and whose secondary pattern is unique.

    This happens on profile startup (for stored settings) and each time an
    extension calls chrome.contentSettings[type].set(...).
  </summary>
</histogram>

<histogram
    name="Extensions.ContentSettings.PrimaryPatternWildcardSecondaryPatternWildcard"
    enum="ContentType" expires_after="2025-11-30">
  <owner>erikchen@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    An entry is emitted each time an extension sets a content setting whose
    primary and secondary pattern are both wildcard.

    This happens on profile startup (for stored settings) and each time an
    extension calls chrome.contentSettings[type].set(...).
  </summary>
</histogram>

<histogram
    name="Extensions.ContentSettings.SecondaryPatternMatchesExtensionOrigin"
    enum="ContentType" expires_after="2025-02-28">
  <owner>estark@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    An entry is emitted each time an extension sets a content setting whose
    secondary pattern matches the Chrome extension origin. This will be used to
    determine if the ability to set content settings for Chrome extension
    origins can be deprecated.

    This happens on profile startup (for stored settings) and each time an
    extension calls chrome.contentSettings[type].set(...).
  </summary>
</histogram>

<histogram name="Extensions.ContentVerification.ComputeHashesOnInstallResult"
    enum="BooleanSuccess" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Whether or not computed_hashes.json file was successfully generated and
    written during extension installation. Recorded during installation of an
    extension if hashes computing was requested for this specifix extension.
    Hashes computing on installation is used for off-store policy-based
    extensions since we need them to be checked against corruption and cannot
    use Chrome Web Store for source of hashes.
  </summary>
</histogram>

<histogram name="Extensions.ContentVerification.ComputeHashesOnInstallTime"
    units="ms" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The time taken to successfully create the computed_hashes.json file for an
    extension upon installation. The histogram is collected with
    &amp;Extensions.ContentVerification.ComputeHashesOnInstallResult&amp; (in
    case of success).
  </summary>
</histogram>

<histogram name="Extensions.ContentVerification.FetchFailureError"
    enum="CombinedHttpResponseAndNetErrorCode" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Error info for fetching verified_contents.json. Recorded when the file
    wasn't available locally and we failed to fetch it from network. Note that
    OK may also be reported in some cases, for example, when file was
    successfully fetched, but is incorrect.
  </summary>
</histogram>

<histogram name="Extensions.ContentVerification.FetchResult"
    enum="BooleanSuccess" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Whether or not fetching verified_contents.json succeeded. Recorded when the
    file wasn't available locally and we needed to fetch it from network.

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

<histogram name="Extensions.ContentVerification.VerifyFailedOnFileType"
    enum="VerifiedFileType" expires_after="2027-08-19">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The type of file content verification failed to verify. Emitted at the time
    content verification fails, once per file that failed.
  </summary>
</histogram>

<histogram
    name="Extensions.ContentVerification.VerifyFailedOnFile{VerifiedFileType}"
    enum="ContentVerifyJobResult" expires_after="2027-08-19">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The content verification failure reason for why a {VerifiedFileType} failed.
    Emitted when content verification fails for a {VerifiedFileType}.
  </summary>
  <token key="VerifiedFileType" variants="VerifiedFileType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Extensions.ContentVerification.VerifyJobResult"
    enum="ContentVerifyJobResult" expires_after="2027-08-19">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Reports the result of a given content verification job succeeded for any
    extension (independent of manifest version). Emitted when the job is
    complete. A content verification job is started for a given extension
    resource request.
  </summary>
</histogram>

<histogram name="Extensions.ContextMenuAction"
    enum="ExtensionContextMenuAction" expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the action taken by the user from the extension icon context menu.
  </summary>
</histogram>

<histogram name="Extensions.CookieAPIPartitionKeyWellFormatted"
    enum="BooleanEnabled" expires_after="2027-04-30">
  <owner>arichiv@google.com</owner>
  <owner>src/net/cookies/OWNERS</owner>
  <summary>
    Emits when a valid partitionKey argument is supplied to chrome.cookies APIs
    getting/editing cookies.

    The enum value is true when the partitonKey is 'well formatted' (identical
    to a SchemefulSite) and false when the partitonKey is otherwise coercible.
  </summary>
</histogram>

<histogram name="Extensions.CorruptExtensionDisabledReason"
    enum="ContentVerifyJobResult" expires_after="2026-12-27">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The reason why an extension was detected to be corrupted. Recorded each time
    an extension is disabled due to corruption detection.

    Warning: this histogram was expired from 2022-12 to 2023-11, and 2024-011 to
    2025-12; data will be missing during these timeframes.
  </summary>
</histogram>

<histogram name="Extensions.CorruptExtensionTotalDisables2" units="units"
    expires_after="never">
<!-- expires-never: Used for monitoring corrupt extensions. -->

  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Logged once on profile open for &quot;user profiles&quot; (profiles where
    people can install extensions, specifically profiles that can have
    non-component extensions installed. This is the value of a counter that is
    incremented anytime we disable a corrupted extension because its content
    didn't match an expected content hash.
  </summary>
</histogram>

<histogram name="Extensions.CorruptPolicyExtensionDetected3"
    enum="ExtensionPolicyReinstallReason" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Fires when we suspect corruption in an enterprise policy forced install
    extension and begin the process of reinstalling it, saving reason of such
    suspection. Compare to CorruptPolicyExtensionResolved to judge success rate.
    Note that if extension was not reinstalled in the session when corruption
    was found, it will be detected again (possible several times, every session
    start will trigger a detection until the extension will be fixed), but as
    CORRUPTION_DETECTED_IN_PRIOR_SESSION.
  </summary>
</histogram>

<histogram name="Extensions.CorruptPolicyExtensionResolved" units="ms"
    expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>extensions-core@chromium.org</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Fires when we've successfully reinstalled a corrupt enterprise policy
    force-installed extension, with a value indicating how long it took
    end-to-end to complete the reinstall (including download time).
  </summary>
</histogram>

<histogram name="Extensions.CWSInfoService.FetchSuccess" enum="BooleanSuccess"
    expires_after="never">
<!-- expires-never: used to monitor the health of CWS metadata fetch service -->

  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records whether the overall extension metadata fetch from the Chrome Web
    Store (CWS) succeeded or not. This is recorded once for a metadata fetch
    (which can include multiple network requests). Metadata fetches occur
    periodically (default period is 24 hours). But they can also occur
    on-demand, for example, when new extensions are installed.
  </summary>
</histogram>

<histogram name="Extensions.CWSInfoService.MetadataChanged"
    enum="BooleanChanged" expires_after="never">
<!-- expires-never: used to monitor the health of CWS metadata fetch service -->

  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records whether the extension metadata retrieved from the Chrome Web Store
    (CWS) by the latest metadata fetch is different from that currently saved.
    This difference can result from store metadata changing, for example an
    extension getting unpublished. Metadata is also changed when data for newly
    installed extensions is retrieved for the first time.
  </summary>
</histogram>

<histogram name="Extensions.CWSInfoService.NetworkResponseCodeOrError"
    enum="CombinedHttpResponseAndNetErrorCode" expires_after="never">
<!-- expires-never: used to monitor the health of CWS metadata fetch service -->

  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the network result for an individual network request within a
    metadata fetch.
  </summary>
</histogram>

<histogram name="Extensions.CWSInfoService.NetworkRetriesTillSuccess"
    units="retries" expires_after="never">
<!-- expires-never: used to monitor the health of CWS metadata fetch service -->

  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Counts how many retries were needed to successfully complete an individual
    request within a metadata fetch. This is emitted only for a successful
    request. Requests are made in batches at every metadata fetch interval
    (default is 24 hours).
  </summary>
</histogram>

<histogram name="Extensions.CWSInfoService.NumRequestsInFetch" units="requests"
    expires_after="never">
<!-- expires-never: used to monitor the health of CWS metadata fetch service -->

  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the number of individual network requests made to retrieve metadata
    for all installed extensions. Each request is limited to a small number of
    extension ids (default is 3) so multiple requests are necessary when the
    number of installed extensions is greater than the per-request limit. This
    histogram is emitted before sending the first request in a metadata fetch.
    It is recorded regardless of whether the metadata fetch succeeds or fails.
  </summary>
</histogram>

<histogram name="Extensions.Database.Local.ErrorByOperation"
    enum="ExtensionsDatabaseOperation" expires_after="2027-01-03">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records the operation being attempted when a chrome.storage.local (LevelDB)
    database error occurs. It is emitted during the execution of a storage API
    call from an extension.
  </summary>
</histogram>

<histogram name="Extensions.Database.Local.RestoreStatus"
    enum="BackingStoreRestoreStatus" expires_after="2027-01-03">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The result of a repair attempt on a corrupted chrome.storage.local LevelDB
    database. This is emitted during an open or read operation if the underlying
    database is found to be corrupted.
  </summary>
</histogram>

<histogram
    name="Extensions.Database.Local.StatusCodeByOperation.{StorageOperation}"
    enum="ValueStoreStatusCode" expires_after="2027-02-07">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The high-level ValueStore status of chrome.storage.local.{StorageOperation}
    operations on the extensions database. It is emitted during the execution of
    a storage API call by an extension, regardless of whether the operation
    succeeded or failed.
  </summary>
  <token key="StorageOperation">
    <variant name="clear"/>
    <variant name="get"/>
    <variant name="remove"/>
    <variant name="set"/>
  </token>
</histogram>

<histogram name="Extensions.Database.Open{ExtensionsDatabaseOpen}"
    enum="LevelDBStatus" expires_after="never">
<!-- expires-never: core storage metric; consumed in separate dashboard (go/chrome-storage-dashboard) -->

  <owner>dmurph@chromium.org</owner>
  <owner>pwnall@chromium.org</owner>
  <summary>
    The result of an open attempt to an Extensions database.
    {ExtensionsDatabaseOpen}
  </summary>
  <token key="ExtensionsDatabaseOpen">
    <variant name=""/>
    <variant name=".Rules" summary="Rules backing stores"/>
    <variant name=".Scripts" summary="Scripts backing stores"/>
    <variant name=".Settings" summary="Settings backing stores"/>
    <variant name=".State" summary="State backing stores"/>
    <variant name=".WebAppsLockScreen" summary="Web apps lock screen stores"/>
  </token>
</histogram>

<histogram name="Extensions.DaysSinceInstall" units="days"
    expires_after="2027-05-11">
  <owner>richche@google.com</owner>
  <owner>anunoy@chromium.org</owner>
  <summary>
    How many days ago an extension was first installed. Recorded during the
    InstalledLoader::RecordExtensionsMetrics function. Buckets are every 91 days
    which approximately corresponds to a fourth of a year.
  </summary>
</histogram>

<histogram name="Extensions.DaysSinceLastUpdate" units="days"
    expires_after="2027-05-11">
  <owner>richche@google.com</owner>
  <owner>anunoy@chromium.org</owner>
  <summary>
    How many days ago an extension was updated. Recorded during the
    InstalledLoader::RecordExtensionsMetrics function. Buckets are every 91 days
    which approximately corresponds to a fourth of a year.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeAPIFunctionCalls"
    enum="DeclarativeAPIFunctionType" expires_after="never">
<!-- expires-never: For monitoring usage of declarative APIs. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Number of calls to the declarative API extension functions. This includes
    the declarativeContent and declarativeWebRequest APIs. Emitted when the
    extension function is called.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeContentActionCreated"
    enum="DeclarativeContentActionType" expires_after="2026-10-12">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Number of times declarative content actions types are created. Emitted each
    time a new declarative content action type is created for an extension.
  </summary>
</histogram>

<histogram
    name="Extensions.DeclarativeNetRequest.AddRulesetCalledTwiceInSuccession"
    enum="BooleanSuccess" expires_after="2027-01-24">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Indicates whether a RulesetManager::AddRuleset() follows another call for
    the same extension. Recorded for every RulesetManager::AddRuleset() call.
    The intended behavior is that there are no such redundant calls. See
    crbug.com/358617943.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.CreateVerifiedMatcherTime"
    units="ms" expires_after="2027-01-21">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Measures the time taken to load a single indexed ruleset in the browser
    process for an extension. This includes reading the indexed ruleset file and
    verifying it. Emitted whenever a single file-backed extension ruleset is
    loaded.
  </summary>
</histogram>

<histogram
    name="Extensions.DeclarativeNetRequest.EvaluateBeforeRequestTime.SingleExtension2"
    units="microseconds" expires_after="2026-12-21">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Time taken to evaluate the action for a network request for a single
    extension ruleset for rules matched before the request is sent. Emitted for
    each network request that is visible to the extension. This is only emitted
    for users with high resolution clocks.
  </summary>
</histogram>

<histogram
    name="Extensions.DeclarativeNetRequest.EvaluateHeadersReceivedTime.SingleExtension2"
    units="microseconds" expires_after="2026-12-30">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Time taken to evaluate the action for a network request for a single
    extension ruleset for rules matched after a request's response headers have
    been received. Emitted for each network request that is visible to the
    extension. This is only emitted for users with high resolution clocks.

    Note: this histogram was expired from 2025-06-30 to 2025-08-28; data may be
    missing.
  </summary>
</histogram>

<histogram
    name="Extensions.DeclarativeNetRequest.EvaluateRequestTime.AllExtensions3"
    units="microseconds" expires_after="2027-02-14">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Time taken to evaluate the action to take for the network request as per the
    Declarative Net Request API. This includes the time taken to evaluate all
    the extension rulesets. Emitted for non-sensitive network requests seen by
    the Extension System when there is at least one active extension ruleset.
    This is only emitted for users with high resolution clocks.

    Note: this histogram was expired from 2025-02-02 to 2025-03-25; data may be
    missing.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.IndexAndPersistRulesTime"
    units="ms" expires_after="2027-02-07">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Time taken to index and persist to disk the deserialized json rules provided
    by an extension manifest for the Declarative Net Request API. This is
    emitted whenever a packaged extension with a declarative ruleset is
    installed or updated.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.IsLargeRegexRule"
    enum="RegexRuleStatus" expires_after="2026-09-17">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Logs whether a regex rule wasn't indexed since it exceeded the per-rule
    memory limit. Emitted for every regex rule an extension adds.

    Note: this histogram was expired from 2025-03-17 to 2025-03-25; data may be
    missing.
  </summary>
</histogram>

<histogram
    name="Extensions.DeclarativeNetRequest.LoadRulesetExtensionVersionMatch.{LoadRulesetRequestSource}"
    enum="BooleanSuccess" expires_after="2027-02-07">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Emitted when an extension ruleset has finished loading for the Declarative
    Net Request API. Records if the extension version at the start of the
    ruleset load matches the version at the end.
  </summary>
  <token key="LoadRulesetRequestSource"
      variants="DeclarativeNetRequestLoadRulesetRequestSource"/>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.LoadRulesetResult"
    enum="LoadRulesetResult" expires_after="2027-01-17">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the result of loading an extension ruleset for the Declarative Net
    Request API. Emitted whenever a single extension ruleset is loaded.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.ManifestEnabledRulesCount2"
    units="rules" expires_after="2026-12-27">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of enabled indexed declarative rules provided by an extension
    manifest for the Declarative Net Request API. This is emitted whenever a
    packaged extension with a declarative ruleset is installed or updated.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.ReadDynamicRulesJSONStatus"
    enum="ReadDynamicRulesJSONStatus" expires_after="2026-12-01">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Indicates the result of reading the dynamic JSON rules for an extension from
    the disk. Logged whenever an extension calls the getDynamicRules extension
    function or when it updates the dynamic rules through a call to
    addDynamicRules or removeDynamicRules. Note: this histogram was expired from
    2023-06-01 to 2023-09-01; data may be missing.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.RedirectAction"
    enum="DeclarativeNetRequestRedirectType" expires_after="2026-12-31">
  <owner>quarz@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Logs the type of redirect action when a request is redirected by the
    Declarative Net Request API. Logged whenever a navigation or resource
    request is redirected.
  </summary>
</histogram>

<histogram
    name="Extensions.DeclarativeNetRequest.RedundantSetReadyToExecuteApiCalls"
    enum="BooleanSuccess" expires_after="2026-09-15">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Indicates whether
    RulesMonitorService::ApiCallQueue::SetReadyToExecuteApiCalls() has already
    been called before. Recorded on each call of SetReadyToExecuteApiCalls().
    The intended behavior is that there are no redundant
    SetReadyToExecuteApiCalls() calls. See crbug.com/358617943.
  </summary>
</histogram>

<histogram
    name="Extensions.DeclarativeNetRequest.RegexRulesBeforeRequestActionTime.{RegexRulesetSize}"
    units="microseconds" expires_after="2026-10-04">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    The time taken to evaluate regex rules for a single declarativeNetRequest
    ruleset where the ruleset has {RegexRulesetSize}, before the request was
    sent. Emitted once per ruleset per evaluated request. This is recorded only
    for clients with high-resolution clocks.
  </summary>
  <token key="RegexRulesetSize"
      variants="DeclarativeNetRequestRegexRulesetSize"/>
</histogram>

<histogram
    name="Extensions.DeclarativeNetRequest.RegexRulesEvaluationPercentage"
    units="%" expires_after="2026-12-01">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    For a single declarativeNetRequest ruleset, the percent of the total amount
    of time spent on evaluating regex rules, before the request was sent (in the
    onBeforeRequest stage). Emitted once per ruleset per evaluated request if
    the ruleset has at least one regex rule.
  </summary>
</histogram>

<histogram
    name="Extensions.DeclarativeNetRequest.RegexRulesHeadersReceivedActionTime.{RegexRulesetSize}"
    units="microseconds" expires_after="2026-12-01">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    The time taken to evaluate regex rules for a single declarativeNetRequest
    ruleset where the ruleset has {RegexRulesetSize}, after the request has
    received response headers. Emitted once per ruleset per evaluated request.
    This is recorded only for clients with high-resolution clocks.
  </summary>
  <token key="RegexRulesetSize"
      variants="DeclarativeNetRequestRegexRulesetSize"/>
</histogram>

<histogram
    name="Extensions.DeclarativeNetRequest.RegexRulesHeadersReceivedEvaluationPercentage"
    units="%" expires_after="2026-12-01">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    For a single declarativeNetRequest ruleset, the percent of the total amount
    of time spent on evaluating regex rules, after the request has received
    response headers. Emitted once per ruleset per evaluated request if the
    ruleset has at least one regex rule.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.RegexRuleSize" units="bytes"
    expires_after="2026-12-01">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Logs the size of a regex rule in bytes, including rules that exceed the
    per-rule memory limit that aren't indexed. Note that any rules above 100Kb
    are recorded as 100Kb. Emitted for every regex rule an extension adds.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.RequestHeaderAdded"
    enum="WebRequest.RequestHeader" expires_after="never">
<!-- expires-never: For monitoring Core API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the request header added by extensions using the
    DeclarativeNetRequest API. Recorded for each network request during the
    OnBeforeSendHeaders stage. Multiple samples can be recorded per request.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.RequestHeaderChanged"
    enum="WebRequest.RequestHeader" expires_after="never">
<!-- expires-never: For monitoring Core API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the request header modified by extensions using the
    DeclarativeNetRequest API. Recorded for each network request during the
    OnBeforeSendHeaders stage. Multiple samples can be recorded per request.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.RequestHeaderRemoved"
    enum="WebRequest.RequestHeader" expires_after="never">
<!-- expires-never: For monitoring Core API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the request header removed by extensions using the
    DeclarativeNetRequest API. Recorded for each network request during the
    OnBeforeSendHeaders stage. Multiple samples can be recorded per request.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.ResponseHeaderAdded"
    enum="WebRequest.RequestHeader" expires_after="never">
<!-- expires-never: For monitoring Core API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the response header added by extensions using the
    DeclarativeNetRequest API. Recorded for each network request during the
    OnHeadersReceived stage. Multiple samples can be recorded per request.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.ResponseHeaderChanged"
    enum="WebRequest.RequestHeader" expires_after="never">
<!-- expires-never: For monitoring Core API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the response header modified by extensions using the
    DeclarativeNetRequest API. Recorded for each network request during the
    OnHeadersReceived stage. Multiple samples can be recorded per request.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.ResponseHeaderRemoved"
    enum="WebRequest.RequestHeader" expires_after="never">
<!-- expires-never: For monitoring Core API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the response header removed by extensions using the
    DeclarativeNetRequest API. Recorded for each network request during the
    OnHeadersReceived stage. Multiple samples can be recorded per request.
  </summary>
</histogram>

<histogram
    name="Extensions.DeclarativeNetRequest.RulesetMatchingBeforeRequestActionTime.{RulesetSize}"
    units="microseconds" expires_after="2027-06-01">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    The time taken to determine the appropriate declarativeNetRequest action for
    a given request from a single ruleset in an extension where the ruleset has
    {RulesetSize}, before the request was sent. This is recorded only for
    clients with high-resolution clocks.
  </summary>
  <token key="RulesetSize" variants="DeclarativeNetRequestRulesetSize"/>
</histogram>

<histogram
    name="Extensions.DeclarativeNetRequest.RulesetMatchingHeadersReceivedActionTime.{RulesetSize}"
    units="microseconds" expires_after="2027-06-01">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    The time taken to determine the appropriate declarativeNetRequest action for
    a given request from a single ruleset in an extension where the ruleset has
    {RulesetSize}, after the request has received response headers. This is
    recorded only for clients with high-resolution clocks.
  </summary>
  <token key="RulesetSize" variants="DeclarativeNetRequestRulesetSize"/>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.RulesetReindexSuccessful"
    enum="BooleanSuccess" expires_after="2026-09-08">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Indicates whether reindexing of a Declarative Net Request ruleset was
    successful. Called whenever a JSON ruleset for an extension is reindexed,
    e.g. on ruleset corruption. Note: this is emitted for both static and
    dynamic rulesets.
  </summary>
</histogram>

<histogram name="Extensions.DeclarativeNetRequest.UpdateDynamicRulesStatus"
    enum="UpdateDynamicRulesStatus" expires_after="never">
<!-- expires-never: Used for monitoring core extension API health. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Indicates the result of an extension function call to add or remove dynamic
    rules. Logged every time an extension calls the addDynamicRules or
    removeDynamicRules extension function. Note: this histogram was expired from
    2023-06-26 to 2023-09-01; data may be missing.
  </summary>
</histogram>

<histogram name="Extensions.DeveloperModeEnabled" enum="Boolean"
    expires_after="2027-01-17">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Logged once on profile open for &quot;user profiles&quot; (profiles where
    people can install extensions, specifically profiles that can have
    non-component extensions installed). This emits true if the user has
    extension developer mode enabled. Note: this is only on profile open, so if
    a user either 1) later enables dev mode or 2) enables dev mode after profile
    start and disables it before the next profile start we emit false once in
    either scenario.
  </summary>
</histogram>

<histogram name="Extensions.DeveloperModeStatusEnabled" enum="Boolean"
    expires_after="2027-02-07">
  <owner>richche@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    The current developer mode status of the main profile. Recorded for all UMA
    logs at upload time by the ExtensionsMetricsProvider.

    This is also used as the &quot;Extensions Developer Mode Status&quot; filter
    in the UMA dashboard.
  </summary>
</histogram>

<histogram name="Extensions.DidCreateScriptContext_Blessed" units="ms"
    expires_after="2026-11-15">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Part of the suite of Extensions.DidCreateScriptContext_* metrics. Records
    the time taken to install Extension JavaScript bindings per blessed
    extension context (chrome-extension://... origins within Extension
    processes, like background pages, options pages, popups).
  </summary>
</histogram>

<histogram name="Extensions.DidCreateScriptContext_BlessedWebPage" units="ms"
    expires_after="2026-11-15">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Part of the suite of Extensions.DidCreateScriptContext_* metrics. Records
    the time taken to install Extension JavaScript bindings per blessed web page
    context (hosted apps).
  </summary>
</histogram>

<histogram name="Extensions.DidCreateScriptContext_ContentScript" units="ms"
    expires_after="2027-01-17">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Part of the suite of Extensions.DidCreateScriptContext_* metrics. Records
    the time taken to install Extension JavaScript bindings per content script
    context.
  </summary>
</histogram>

<histogram name="Extensions.DidCreateScriptContext_LockScreenExtension"
    units="units" expires_after="2026-11-15">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Part of the suite of Extensions.DidCreateScriptContext_* metrics. Records
    the time taken to install Extension JavaScript bindings per content script
    context. This histogram measures the time to install Extension Javascript
    bindings in a context for a platform app enabled on the Chrome OS lock
    screen.
  </summary>
</histogram>

<histogram name="Extensions.DidCreateScriptContext_Unblessed" units="ms"
    expires_after="2026-11-15">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Part of the suite of Extensions.DidCreateScriptContext_* metrics. Records
    the time taken to install Extension JavaScript bindings per unblessed
    extension context (chrome-extension://... origins hosted in iframes).
  </summary>
</histogram>

<histogram name="Extensions.DidCreateScriptContext_Unspecified" units="ms"
    expires_after="2026-11-15">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Part of the suite of Extensions.DidCreateScriptContext_* metrics. Records
    the time taken to install Extension JavaScript bindings in an unknown type
    of context (this should never happen other than in bizarre circumstances).
  </summary>
</histogram>

<histogram name="Extensions.DidCreateScriptContext_WebPage" units="ms"
    expires_after="2026-11-15">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Part of the suite of Extensions.DidCreateScriptContext_* metrics. Records
    the time taken to install Extension JavaScript bindings per web page context
    (just the chrome.app, chrome.webstore, and possibly chrome.runtime APIs).
  </summary>
</histogram>

<histogram name="Extensions.DidCreateScriptContext_WebUI" units="ms"
    expires_after="2026-11-15">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Part of the suite of Extensions.DidCreateScriptContext_* metrics. Records
    the time taken to install Extension JavaScript bindings per WebUI context
    (chrome://extensions and so forth).
  </summary>
</histogram>

<histogram name="Extensions.Disabled2" units="units" expires_after="never">
<!-- expires-never: Used for monitoring user extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of extensions that are disabled at browser profile open for
    &quot;user profiles&quot; (profiles where people can install extensions,
    specifically profiles that can have non-component extensions installed).
  </summary>
</histogram>

<histogram name="Extensions.DisabledForPermissions2" units="units"
    expires_after="never">
<!-- expires-never: Used for monitoring user extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of extensions that are disabled at browser profile open for
    &quot;user profiles&quot; (profiles where people can install extensions,
    specifically profiles that can have non-component extensions installed) due
    to permissions increases.
  </summary>
</histogram>

<histogram name="Extensions.DisableReason" enum="ExtensionDisableReason"
    expires_after="2022-08-28">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The count of disabled extensions on profile open grouped by disble reason
    from disable_reason::DisableReason. When an extension is disabled, it can be
    for one or more reasons (although typically just one), so the sum of these
    may be greater than 'Extensions.Disabled' which is a count of the number of
    unique extensions that are disabled.
  </summary>
</histogram>

<histogram name="Extensions.DisableReason2" enum="ExtensionDisableReason"
    expires_after="2027-01-03">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The count of disabled extensions on profile open for &quot;user
    profiles&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed). Grouped by
    disable reason from disable_reason::DisableReason. When an extension is
    disabled, it can be for one or more reasons (although typically just one),
    so the sum of these may be greater than 'Extensions.Disabled' which is a
    count of the number of unique extensions that are disabled.
  </summary>
</histogram>

<histogram name="Extensions.EsbAllowlistOmahaAttribute"
    enum="ExtensionAllowlistOmahaAttributeValue" expires_after="2023-10-01">
  <owner>jeffcyr@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Reports the value of the Safe Browsing CRX allowlist custom omaha attribute
    when an update check occurs for an extension.
  </summary>
</histogram>

<histogram name="Extensions.EventPageActiveTime2" units="ms"
    expires_after="never">
<!-- expires-never: Monitoring core extensions platform behavior. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The time between an extension's event page loading its first URL and the
    event page later shutting down.
  </summary>
</histogram>

<histogram name="Extensions.EventPageLoadTime2" units="ms"
    expires_after="never">
<!-- expires-never: Monitoring core extensions platform behavior. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The time taken for an extension's event page to load its initial URL.
  </summary>
</histogram>

<histogram
    name="Extensions.Events.DidDispatchToAckSucceed.{BackgroundContextType}"
    enum="Boolean" expires_after="never">
<!-- expires-never: Monitors core extension system health. -->

  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records whether an event dispatched through the event router was acked by
    the renderer within a 5 minute threshold for background context of type
    {BackgroundContextType}. Emits true shortly after extensions browser code
    receives the ack from the renderer if within that threshold. Emits false if
    that ack hasn't occurred within the threshold. The 5 minute upper bound was
    chosen based on when the majority of events are ack'd.
  </summary>
  <token key="BackgroundContextType">
    <variant name="ExtensionPage"
        summary="event page. However, unlike for other contexts that only
                 emit if the the event fired in the background page of the
                 extension, this will emit for all events that run in the
                 event page extension renderer process (event page, tabs,
                 popups, etc.). Note: this should not be used to perfectly
                 compare against other contexts like service workers where
                 the above is not true. But we are presuming that since the
                 other pages that run in the process are persistent, they
                 will generally never be stale and so won't skew the data
                 significantly in the failure case and are therefore mostly
                 comparable."/>
    <variant name="ExtensionPersistentPage"
        summary="persistent background page. However, unlike for other
                 contexts that only emit if the the event fired in the
                 background page of the extension, this will emit for all
                 events that run in the persistent background page extension
                 renderer process (background page, tabs, popups, etc.).
                 Note: this should not be used to perfectly compare against
                 other contexts like service workers where the above is not
                 true. But we are presuming that since the other pages that
                 run in the process are persistent, they will generally never
                 be stale and so won't skew the data significantly in the
                 failure case and are therefore mostly comparable."/>
    <variant name="ExtensionServiceWorker3"
        summary="service worker. Replaced previous version because values
                 were temporarily inaccurate due to a bug in logging 2024-04"/>
  </token>
</histogram>

<histogram name="Extensions.Events.Dispatch" enum="ExtensionEvents"
    expires_after="never">
<!-- expires-never: Monitoring core extensions platform behavior. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>Recorded every time an event is dispatched to an extension.</summary>
</histogram>

<histogram
    name="Extensions.Events.DispatchToAckLongTime.{BackgroundContextType}"
    units="ms" expires_after="never">
<!-- expires-never: Monitors core extension system health. -->

  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records the time it took for the event to be sent to the event router for
    dispatch for background page of type {BackgroundContextType}. Reports
    samples at milliseconds granualarity up to 1 day. This is meant to
    investigate an appropriate time maximum for
    Extensions.Events.DispatchToAckTime.{BackgroundContextType}. It does not
    include any requests that utilize the EventRouter::DispatchEventToSender()
    event routing flow (some web request API, and web view API events).
  </summary>
  <token key="BackgroundContextType">
    <variant name="ExtensionServiceWorker2"
        summary="service worker. Emitted shortly after extensions browser
                 code receives the ack from the renderer that it fired the
                 event in the service worker. &quot;shortly&quot; because
                 there is a function call between the receipt by the browser
                 and recording the value. Note: this may include some amount
                 of execution time of the extension service worker JS
                 listener. Replaced previous version because values were
                 inaccurate due to a bug with recording the dispatch start
                 time 2023-08"/>
  </token>
</histogram>

<histogram
    name="Extensions.Events.DispatchToAckTime.ExtensionEventPage3{ContextActive}"
    units="microseconds" expires_after="never">
<!-- expires-never: Monitors core extension system health. -->

  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records the time it took for the event to be sent to the event router for
    dispatch for background page of type event page{ContextActive}. Emitted when
    extensions browser code receives receives an ack from the renderer that it
    fired the event in the event page. It only counts events that ran in a event
    page background script, other listeners in the extension renderer that can
    receive the event are not counted. Reports samples at microseconds
    granualarity up to 5 minutes. Values over 5 minutes are bucketed together
    since no ack is expected to take longer than that. 5 minutes was decided
    since that is the maximum for extension service worker event lifetime. This
    is recorded only for clients with high-resolution clocks. It does not
    include any requests that utilize the EventRouter::DispatchEventToSender()
    event routing flow (some web request API, and web view API events).

    Note: Previous version replaced October, 2023 because values were inaccurate
    due to a bug where we recorded this metric for all events for an extension,
    rather that just for those that ran in the lazy background page script.
  </summary>
  <token key="ContextActive">
    <variant name="" summary=""/>
    <variant name=".Active"
        summary="and in status active. Active means that the background
                 script was started and ready to receive events when the
                 event was dispatched"/>
    <variant name=".Inactive"
        summary="and in status inactive. Inactive means that the background
                 script was not started and not ready to receive events when
                 the event was dispatched"/>
  </token>
</histogram>

<histogram
    name="Extensions.Events.DispatchToAckTime.ExtensionPersistentBackgroundPage"
    units="microseconds" expires_after="never">
<!-- expires-never: Monitors core extension system health. -->

  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Note: Separate from
    Extensions.Events.DispatchToAckTime.{BackgroundContextType}{ContextActive}
    because PersistentBackgroundPages are always active (and thus don't need a
    ContextActive variant).

    Records the time it took for the event to be sent to the event router for
    dispatch for background page of type persistent background page. Emitted
    shortly after extensions browser code receives the ack from the renderer
    that it fired the event in the persistent background page.
    &quot;shortly&quot; because there is an IPC call between dispatching the
    event in the renderer and the acknowledgement by the browser side that emits
    the value. Reports samples at microseconds granualarity up to 5 minutes.
    Values over 5 minutes are bucketed together since no ack is expected to take
    longer than that. 5 minutes was decided since that is the maximum for
    extension service worker event lifetime. This is recorded only for clients
    with high-resolution clocks. It does not include any requests that utilize
    the EventRouter::DispatchEventToSender() event routing flow (some web
    request API, and web view API events).
  </summary>
</histogram>

<histogram
    name="Extensions.Events.DispatchToAckTime.ExtensionServiceWorker2{ContextActive}"
    units="microseconds" expires_after="never">
<!-- expires-never: Monitors core extension system health. -->

  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records the time it took for the event to be sent to the event router for
    dispatch for a background page of type service worker{ContextActive}.
    Emitted shortly after extensions browser code receives the ack from the
    renderer that it fired the event in the service worker. &quot;shortly&quot;
    because there is a function call between the receipt by the browser and
    recording the value. Note: this may include some amount of execution time of
    the extension service worker JS listener. Reports samples at microseconds
    granualarity up to 5 minutes. Values over 5 minutes are bucketed together
    since no ack is expected to take longer than that. 5 minutes was decided
    since that is the maximum for extension service worker event lifetime. This
    is recorded only for clients with high-resolution clocks. It does not
    include any requests that utilize the EventRouter::DispatchEventToSender()
    event routing flow (some web request API, and web view API events).

    If the extension was unloaded when the event was dispatched, the worker is
    considered inactive.

    Note: this histogram was incremented May, 2024 since it additionally started
    emmitting when the extension is unloaded.
  </summary>
  <token key="ContextActive">
    <variant name="" summary=""/>
    <variant name=".Active3"
        summary="and in status active. Active means that the background
                 script was started and ready to receive and run events (both
                 //content browser notification and extension renderer JS
                 global evaluation completed) when the event was dispatched"/>
    <variant name=".Inactive3"
        summary="and in status inactive. Inactive means that the background
                 script was not started and not ready to receive and run
                 events (either the //content browser notification or
                 extension renderer JS global evaluation did not complete)
                 when the event was dispatched"/>
  </token>
</histogram>

<histogram name="Extensions.Events.DispatchToComponent" enum="ExtensionEvents"
    expires_after="never">
<!-- expires-never: Monitoring core extensions platform behavior. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded every time an event is dispatched to a *component* extension.
    Otherwise identical to Extensions.Events.Dispatched.
  </summary>
</histogram>

<histogram name="Extensions.Events.DispatchWithPersistentBackgroundPage"
    enum="ExtensionEvents" expires_after="never">
<!-- expires-never: Monitoring core extensions platform behavior. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded every time an event is dispatched to an extension with a persistent
    background page. The event may or may not have been dispatched to the
    background page itself, for example it may have been dispatched to its
    popup. When this metric is recorded, Extensions.Events.Dispatch will also be
    recorded.
  </summary>
</histogram>

<histogram name="Extensions.Events.DispatchWithRunningEventPage"
    enum="ExtensionEvents" expires_after="never">
<!-- expires-never: Monitoring core extensions platform behavior. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded every time an event is dispatched to an extension with an event
    page that was already running (i.e. at some point had been woken from its
    suspended state, see Extensions.Events.DispatchWithSuspendedEventPage). The
    event may or may not have been dispatched to the event page itself, for
    example it may have been dispatched to its popup. When this metric is
    recorded, Extensions.Events.Dispatch will also be recorded.
  </summary>
</histogram>

<histogram name="Extensions.Events.DispatchWithServiceWorkerBackground"
    enum="ExtensionEvents" expires_after="2024-11-20">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded every time an event is dispatched to a service worker based
    extension background context. When this metric is recorded,
    Extensions.Events.Dispatch will also be recorded.

    Warning: this histogram was expired from 2022-12 to 2023-11; data will be
    missing during this timeframe.
  </summary>
</histogram>

<histogram name="Extensions.Events.DispatchWithSuspendedEventPage"
    enum="ExtensionEvents" expires_after="never">
<!-- expires-never: Monitoring core extensions platform behavior. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded every time an event is dispatched to an extension with an event
    page that was suspended. This implies that firing this event woke up the
    event page. The event may or may not have been dispatched to the event page
    itself, for example it may have been dispatched to its popup, but regardless
    it will wake the event page. When this metric is recorded,
    Extensions.Events.Dispatch will also be recorded.
  </summary>
</histogram>

<histogram name="Extensions.Events.ServiceWorkerDispatchFailed.Event"
    enum="ExtensionEvents" expires_after="2025-10-26">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Emits the event type that failed when
    Extensions.Events.DidDispatchToAckSucceed.ExtensionServiceWorker2 == false.
  </summary>
</histogram>

<histogram
    name="Extensions.Events.ServiceWorkerDispatchFailed.StartExternalRequestOk"
    enum="Boolean" expires_after="2025-10-26">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Emits whether the ServiceWorkerContext::StartingExternalRequest() succeeded
    or failed when
    Extensions.Events.DidDispatchToAckSucceed.ExtensionServiceWorker2 == false.

    Note there is missing data during 2024-04 since the metric was not emitting
    temporarily.
  </summary>
</histogram>

<histogram
    name="Extensions.Events.ServiceWorkerDispatchFailed.StartExternalRequestResult"
    enum="ServiceWorkerExternalRequestResult" expires_after="2025-10-26">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Emits the ServiceWorkerExternalRequestResult when
    Extensions.Events.ServiceWorkerDispatchFailed.StartExternalRequestOk ==
    false.
  </summary>
</histogram>

<histogram name="Extensions.ExtensionAddDisabledRemotelyReason2"
    enum="ExtensionUpdateCheckDataKey" expires_after="2027-05-11">
  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Recorded when a new violation is retrieved from Omaha for an extension. The
    new violation reason is retrieved from the update service data key reasons
    during an update check for extensions. This metric was added in M92 to
    replace the old version, because the logic of logging greylisted extensions
    has changed.

    Warning: this histogram was expired from 2024-08-11 to 2025-11-13; data may
    be missing.
  </summary>
</histogram>

<histogram name="Extensions.ExtensionCacheCount" units="units"
    expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Number of cached extensions on disk. Reported on Chrome OS during user
    session start.
  </summary>
</histogram>

<histogram name="Extensions.ExtensionCacheSize" units="MB"
    expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Total size of .crx files in cache on disk. Reported on Chrome OS during user
    session start.
  </summary>
</histogram>

<histogram name="Extensions.ExtensionDisabledRemotely2"
    enum="ExtensionUpdateCheckDataKey" expires_after="2027-01-17">
  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Recorded when an extension that was previously enabled is disabled due to a
    new violation retrieved from Omaha. This is recorded when the violation is
    detected when Chrome checks for an update for the extension. This metric was
    added in M92 to replace the old version, because the logic of logging
    greylisted extensions has changed.

    Warning: this histogram was expired from 2024-08-11 to 2025-11-13; data may
    be missing.
  </summary>
</histogram>

<histogram name="Extensions.ExtensionInstalled" units="units"
    expires_after="never">
<!-- expires-never: Monitoring core extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>
    Emitted when an extension is downloaded by the user (including webstore
    installs).
  </summary>
</histogram>

<histogram name="Extensions.ExtensionInstalled.NewFromWebstore" units="count"
    expires_after="2027-01-24">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Counts when an extension is downloaded by the user from the webstore and no
    currently installed extensions (if any) were installed from the webstore.
    Emitted after an extension has successfully finished installing.
  </summary>
</histogram>

<histogram name="Extensions.ExtensionLocation2" enum="ExtensionLocation"
    expires_after="never">
<!-- expires-never: Monitoring core extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The install location for a given extension. Recorded once per enabled
    extension on profile initialization for &quot;user profiles&quot; (profiles
    where people can install extensions, specifically profiles that can have
    non-component extensions installed).
  </summary>
</histogram>

<histogram name="Extensions.ExtensionReenabledRemotely" units="count"
    expires_after="2027-01-17">
  <owner>richche@chromium.org</owner>
  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Recorded when an extension that was previously only disabled remotely is
    re-enabled remotely during an update service session.
  </summary>
</histogram>

<histogram name="Extensions.ExtensionReenabledRemotely{BlocklistState}"
    units="count" expires_after="2027-05-11">
  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Recorded when a {BlocklistState} extension that was previously only disabled
    remotely is re-enabled remotely during an update service session.

    Warning: this histogram was expired from 2024-06-18 to 2025-11-13; data may
    be missing.
  </summary>
  <token key="BlocklistState">
    <variant name="ForPolicyViolation" summary="policy violation"/>
    <variant name="ForPotentiallyUWS" summary="potentially unwanted"/>
  </token>
</histogram>

<histogram name="Extensions.ExternalItemState" enum="ExternalItemState"
    expires_after="2026-05-11">
  <owner>anunoy@chromium.org</owner>
  <summary>
    The number of sideloaded apps/extensions loaded on profile open grouped by
    enabled/disabled state.

    Histogram is in the process of being removed in favor of its incremented
    version that emits only on profile open for &quot;user&quot; profiles
    (profiles where people can install extensions, specifically profiles that
    can have non-component extensions installed).

    Warning: this histogram was expired from 2023-07-07 to 2025-11-13; data may
    be missing.
  </summary>
</histogram>

<histogram name="Extensions.ExternalItemState2" enum="ExternalItemState"
    expires_after="2027-05-11">
  <owner>anunoy@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of sideloaded apps/extensions loaded on profile open for
    &quot;user profiles&quot; (profiles where people can install extensions,
    specifically profiles that can have non-component extensions installed).
    Grouped by enabled/disabled state.
  </summary>
</histogram>

<histogram name="Extensions.FileAccessAllowed2" units="Number of extensions"
    expires_after="never">
<!-- expires-never: Used for monitoring user extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of extensions (and friends) that could have been given access to
    the file:// scheme, and were, for users that have at least one extension
    that could have been given access. This excludes anything that doesn't show
    up in chrome://extensions (platform apps, hosted apps, component
    extensions), policy-installed extensions, and unpacked extensions. Logged
    once per profile open for &quot;user profiles&quot; (profiles where people
    can install extensions, specifically profiles that can have non-component
    extensions installed). See also Extensions.FileAccessNotAllowed.
  </summary>
</histogram>

<histogram name="Extensions.FileAccessNotAllowed2" units="Number of extensions"
    expires_after="never">
<!-- expires-never: Used for monitoring user extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of extensions (and friends) that could have been given access to
    the file:// scheme, but weren't, for users that have at least one extension
    that could have been given access. This excludes anything that doesn't show
    up in chrome://extensions (platform apps, hosted apps, component
    extensions), policy-installed extensions, and unpacked extensions. Logged
    once per profile open for &quot;user profiles&quot; (profiles where people
    can install extensions, specifically profiles that can have non-component
    extensions installed). See also Extensions.FileAccessAllowed.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledAndBlockListed" units="count"
    expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Number of enterprise policy forced extensions that are blocklisted and thus
    not loaded 5 minutes after profile creation if at least one of policy forced
    extensions is not yet enabled.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledCacheStatus"
    enum="ExtensionInstallationDownloadingCacheStatus" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <summary>
    Status of cache entry about enterprise policy forced extension. Recorded for
    each forced extension.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledCreationStage"
    enum="ExtensionInstallCreationStage" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    The last known intermediate stage of extension when the extension
    installation stage if CREATED if failure reason was not recorded
    (installation of an extension was neither yet finished nor failed). Recorded
    for each forced extension that failed to install after 5 minutes. Recorded
    together with &quot;Extensions.ForceInstalledTimedOutCount&quot; histogram,
    but for every extension not installed at the moment.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledDownloadingStage"
    enum="ExtensionInstallationDownloadingStage" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    The last known downloading stage of extension downloading process if failure
    reason was not recorded and installing stage is DOWNLOADING, so it's
    specification of Extensions.ForceInstalledStage. Recorded for each forced
    extension that failed to install after 5 minutes. Recorded together with
    &quot;Extensions.ForceInstalledTimedOutCount&quot; histogram, but for every
    extension not installed at the moment.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledFailureCacheStatus"
    enum="ExtensionInstallationDownloadingCacheStatus" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Status of cache entry about enterprise policy forced extension which failed
    to install. Recorded for each forced extension that failed to install after
    5 minutes. Recorded together with
    &quot;Extensions.ForceInstalledTimedOutCount&quot; histogram, but for every
    extension not installed at the moment.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledFailureCrxInstallError"
    enum="ExtensionInstallationCrxInstallError" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Detailed reason why CRX installation failed for enterprise policy forced
    extensions. Recorded for each forced extension that failed to install after
    5 minutes with Extensions.{OffStore,Webstore}_ForceInstalledFailureReason3
    equal to CRX_INSTALL_ERROR_*.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledFailureManifestInvalidAppStatusError"
    enum="ManifestInvalidAppStatusError" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    The detailed reason why enterprise policy forced extensions had failed to
    install because fetched update manifest was invalid due to app status error.
    Recorded for each forced extension that failed to install after 5 minutes
    with Extensions.ForceInstalledFailureReason2 equal to MANIFEST_INVALID and
    Extensions.ForceInstalledFailureManifestInvalidErrorDetail2 equal to
    BAD_APP_STATUS.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledFailureNoUpdatesInfo"
    enum="ExtensionNoUpdatesInfo" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    The info field in the update manifest fetched from the server for enterprise
    policy forced extensions. Recorded for each forced extension for which the
    server responds with no updates and an empty CRX fetch url. Recorded for
    each forced extension that failed to install after 5 minutes with
    Extensions.{OffStore,WebStore}_ForceInstalledFailureReason3 equal to
    CRX_FETCH_URL_EMPTY.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledFailureSandboxUnpackFailureReason2"
    enum="ExtensionUnpackFailureReason" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    The reason why enterprise policy forced extensions had failed to unpack.
    Recorded for each forced extension that failed to install after 5 minutes
    with Extensions.ForceInstalledFailureReason3 equal to
    CRX_INSTALL_ERROR_SANDBOXED_UNPACKER_FAILURE.

    Replaced Extensions.ForceInstalledFailureSandboxUnpackFailureReason because
    the enum values were not in sync with the C++ enums.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledFailureSessionType{FailureReason}"
    enum="SessionType" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    The type of session in case enterprise policy forced extensions were not
    installed. Recorded for each force installed extension which failed to
    install after 5 minutes. Supported only on ChromeOS and recorded only if
    there is an active user. {FailureReason}
  </summary>
  <token key="FailureReason">
    <variant name="" summary="Any type of failure"/>
    <variant name=".ExtensionStuckInInitialCreationStage"
        summary="Extensions stuck in
                 NOTIFIED_FROM_MANAGEMENT_INITIAL_CREATION_FORCED stage.
                 Replaced &quot;.ExtensionStuckInCreatedStage&quot; variant
                 as the histogram collects data about extensions stuck in
                 NOTIFIED_FROM_MANAGEMENT_INITIAL_CREATION_FORCED stage but
                 the name suggested that the data is collected for extensions
                 stuck in CREATED stage."/>
  </token>
</histogram>

<histogram
    name="Extensions.ForceInstalledFailureStuckInInitialCreationStageAreExtensionsEnabled"
    enum="BooleanEnabled" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Records whether the extensions are enabled or not. Recorded for each forced
    extension that failed to install after 5 minutes with
    Extensions.ForceInstalledCreationStage equal to
    NOTIFIED_FROM_MANAGEMENT_INITIAL_CREATION_FORCED.

    Replaced
    &quot;Extensions.ForceInstalledFailureStuckInCreatedStageAreExtensionsEnabled&quot;
    because the histogram collects data about extensions stuck in
    NOTIFIED_FROM_MANAGEMENT_INITIAL_CREATION_FORCED stage but the name
    suggested that the data is collected for extensions stuck in CREATED stage.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledFailureWithCrxHeaderInvalidIsCWS"
    enum="IsForceInstalledExtensionFailedWithCrxHeaderInvalidFromCWSBoolean"
    expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Records whether the extension is from the Chrome Web Store or not. Recorded
    for each forced extension that failed to install after 5 minutes with
    Extensions.ForceInstalledFailureSandboxUnpackFailureReason equal to
    CRX_HEADER_INVALID.
  </summary>
</histogram>

<histogram
    name="Extensions.ForceInstalledFailureWithCrxHeaderInvalidIsFromCache"
    enum="BooleanCacheHit" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Records whether the extension is downloaded from cache or not. Recorded for
    each forced extension that failed to install after 5 minutes with
    Extensions.ForceInstalledFailureSandboxUnpackFailureReason equal to
    CRX_HEADER_INVALID.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledLoadTime" units="ms"
    expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    The amount of time elapsed during installation of enterprise policy forced
    extensions.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledManagementAuthorityTrustworthiness"
    enum="ManagementAuthorityTrustworthiness" expires_after="2027-01-17">
  <owner>richche@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the higher of two values, trust level for the machine or that of the
    user profile. The trust level is determined by the management authority,
    such as local device, non-local, cryptographically verifiable policy source,
    etc. This histogram is emitted when all the force-installed extensions are
    ready to use. Recorded for only Windows and Mac.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledNotLoadedDisableReason"
    enum="ExtensionDisableReason" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Records the disable reason for the enterpise policy forced extensions.
    Recorded for each forced extension that installed but failed to load after 5
    minutes. If the extension is not disabled, it records
    DisableReason::DISABLE_NONE.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledPreInstalledDeprecatedAppOpenUrl"
    enum="ExtensionForceInstalledPreInstalledDeprecatedSite"
    expires_after="2026-03-08">
  <owner>erikchen@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Called once each time the user clicks the accept button on the
    force-installed, pre-installed deprecated apps dialog. This results in the
    browser opening a new tab with a URL to one of 6 pre-defined sites.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledReadyTime" units="ms"
    expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    The amount of time elapsed for enterprise policy forced extensions to become
    ready for use.
  </summary>
</histogram>

<histogram
    name="Extensions.ForceInstalledSessionsWithNonMisconfigurationFailureOccured"
    enum="Boolean" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Records whether there was a possible non-misconfiguration failure for the
    enterprise policy forced extensions. Records true if in a session at least
    one forced extension failed to install after 5 minutes with a
    non-misconfiguration failure and false when all the forced extensions which
    failed to install after 5 minutes failed due to some misconfiguration.
    Recorded together with &quot;Extensions.ForceInstalledTimedOutCount&quot;
    histogram.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledStage2"
    enum="ExtensionInstallationStage" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    The last known stage of extension installation process if failure reason was
    not recorded (installation of an extension was neither yet finished nor
    failed). Recorded for each forced extension that failed to install after 5
    minutes. Recorded together with
    &quot;Extensions.ForceInstalledTimedOutCount&quot; histogram, but for every
    extension not installed at the moment.

    Replaced Extensions.ForceInstalledStage because the stages that were used
    for used for investigation of CREATED stage are moved to a new enum.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledTimedOutAndNotInstalledCount"
    units="units" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Number of enterprise policy forced extensions that are not installed after 5
    minutes if at least one of policy forced extensions is not yet enabled.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledTimedOutCount" units="units"
    expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Number of enterprise policy forced extensions that are not loaded after 5
    minutes timeout, while might be already installed.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalledTime{ExtensionInstallStages}"
    units="ms" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    The amount of time elapsed during different stage of the installation
    process for the enterprise policy forced extensions.
    {ExtensionInstallStages}
  </summary>
  <token key="ExtensionInstallStages">
    <variant name=".CheckingExpectationsStartTo.FinalizingStart"
        summary="Time taken to perform the expectations checks to confirm
                 that the extension can be installed."/>
    <variant name=".CopyingStartTo.UnpackingStart"
        summary="(OBSOLETE: Replaced by VerificationStartTo.UnpackingStart)
                 Time taken to complete copying of extension archive into the
                 working directory"/>
    <variant name=".CopyingStartTo.VerificationStart"
        summary="Time taken to complete copying of extension archive into the
                 working directory"/>
    <variant name=".DownloadingStartTo.ManifestDownloadComplete"
        summary="Time taken to complete download of update manifest"/>
    <variant name=".FinalizingStartTo.CRXInstallComplete"
        summary="Time taken to complete the installation of the unpacked
                 extension."/>
    <variant name=".ManifestDownloadCompleteTo.CRXDownloadComplete"
        summary="Time taken to complete download of CRX"/>
    <variant name=".UnpackingStartTo.CheckingExpectationsStart"
        summary="Time taken to complete the unpacking of the extension
                 archive."/>
    <variant name=".VerificationStartTo.CopyingStart"
        summary="(OBSOLETE: Replaced by CopyingStartTo.VerificationStart)
                 Time taken to complete signature verification of CRX"/>
    <variant name=".VerificationStartTo.UnpackingStart"
        summary="Time taken to complete signature verification of CRX"/>
  </token>
</histogram>

<histogram name="Extensions.ForceInstalledTotalCandidateCount" units="units"
    expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Total amount of extensions in force installed list. Gets recorded on profile
    open (which happens on every startup and when user logs in) and tries to
    load extensions. Number of records should correspond to the sum of records
    in &quot;Extensions.ForceInstalledLoadTime&quot; and records in
    &quot;Extensions.ForceInstalledTimedOutAndNotInstalledCount&quot;.
  </summary>
</histogram>

<histogram name="Extensions.ForceInstalled{ErrorType}FetchTries"
    units="retries" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Number of fetch retries made when enterprise policy forced extensions failed
    to install with {ErrorType}. Recorded for each forced extension that failed
    to install after 5 minutes with
    Extensions.`OffStore,Webstore`_ForceInstalledFailureReason3 equal to
    {ErrorType}.
  </summary>
  <token key="ErrorType">
    <variant name="" summary="CRX_FETCH_FAILED failure reason."/>
    <variant name="CrxFetchRetry" summary="CRX_DOWNLOAD_RETRY stage."/>
    <variant name="ManifestFetchFailed"
        summary="MANIFEST_FETCH_FAILED failure reason."/>
    <variant name="ManifestFetchRetry"
        summary="MANIFEST_DOWNLOAD_RETRY stage."/>
  </token>
</histogram>

<histogram name="Extensions.ForceInstalled{ErrorType}NetworkErrorCode"
    enum="NetErrorCodes" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    Network error code for the last retry attempt when CRX fetch failed for
    enterprise policy forced extensions failed to install due to {ErrorType}.
    Recorded for each forced extension that failed to install after 5 minutes
    with Extensions.`OffStore,WebStore`_ForceInstalledFailureReason3 equal to
    {ErrorType}.
  </summary>
  <token key="ErrorType">
    <variant name="" summary="CRX_FETCH_FAILED failure reason."/>
    <variant name="CrxFetchRetry" summary="CRX_DOWNLOAD_RETRY stage."/>
    <variant name="ManifestFetchFailed"
        summary="MANIFEST_FETCH_FAILED failure reason."/>
    <variant name="ManifestFetchRetry"
        summary="MANIFEST_DOWNLOAD_RETRY stage."/>
  </token>
</histogram>

<histogram name="Extensions.FromWebstoreInconsistency2"
    enum="ExtensionFromWebstoreInconcistencyEnum" expires_after="2027-05-11">
  <owner>anunoy@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Number of apps/extensions loaded on profile open with an inconsistent
    &quot;from webstore&quot; state for &quot;user profiles&quot; (profiles
    where people can install extensions, specifically profiles that can have
    non-component extensions installed). This means an item that is flagged as
    from_webstore, but with either a non-webstore update_url or an external
    install location.

    Warning: this histogram was expired from 2025-03-02 to 2025-11-13; data may
    be missing.
  </summary>
</histogram>

<histogram name="Extensions.Functions.ComponentExtensionCalls"
    enum="ExtensionFunctions" expires_after="never">
<!-- expires-never: Used for monitoring extension API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when a component extension calls an extension API. Recorded once
    per function call. See also Extensions.Functions.WebUICalls,
    Extensions.Functions.WebUIUntrustedCalls,
    Extensions.Functions.NonExtensionWebPageCalls and
    Extensions.Functions.ExtensionCalls.
  </summary>
</histogram>

<histogram
    name="Extensions.Functions.DeveloperPrivate.NoSuchExtensionErrorThrown"
    enum="ExtensionFunctions" expires_after="2026-08-02">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when an error is thrown from a developerPrivate API function when
    there is no extension with the specified ID found. Used to pinpoint which
    functions may be causing most crashes as seen in crbug.com/431205004 when
    this error is thrown.
  </summary>
</histogram>

<histogram name="Extensions.Functions.DidSandboxedComponentExtensionAPICall"
    enum="Boolean" expires_after="2025-09-30">
  <owner>wjmaclean@chromium.org</owner>
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when a component extension calls an extension API from within a
    sandboxed frame. Recorded once per function call to track how often API
    functions are called within sandboxed frames. See
    Extensions.Functions.ComponentExtensionCalls, for comparison with the total
    number of calls from a component extension to an extension API.
  </summary>
</histogram>

<histogram name="Extensions.Functions.DidSandboxedExtensionAPICall"
    enum="Boolean" expires_after="2026-09-27">
  <owner>wjmaclean@chromium.org</owner>
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when a non-component extension calls an extension API from within a
    sandboxed frame. Recorded once per function call to track how often API
    functions are called within sandboxed frames. See
    Extensions.Functions.ExtensionCalls, for comparison with the total number of
    calls from a non-component extension to an extension API.
  </summary>
</histogram>

<histogram name="Extensions.Functions.ExtensionCalls" enum="ExtensionFunctions"
    expires_after="never">
<!-- expires-never: Used for monitoring extension API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when a non-component extension calls an extension API. Recorded
    once per function call. See also Extensions.Functions.WebUICalls,
    Extensions.Functions.WebUIUntrustedCalls,
    Extensions.Functions.NonExtensionWebPageCalls and
    Extensions.Functions.ComponentExtensionCalls.
  </summary>
</histogram>

<histogram name="Extensions.Functions.ExtensionMV3Calls"
    enum="ExtensionFunctions" expires_after="2027-02-07">
  <owner>tjudkins@chromium.org</owner>
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when a manifest V3 extension calls an extension API. Note that the
    function would also be included in either
    Extensions.Functions.ExtensionCalls or
    Extensions.Functions.ComponentExtensionCalls histogram.
  </summary>
</histogram>

<histogram name="Extensions.Functions.ExtensionServiceWorkerCalls"
    enum="ExtensionFunctions" expires_after="2023-02-12">
  <owner>lazyboy@chromium.org</owner>
  <owner>dbertoni@chromium.org</owner>
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when an extension service worker calls an extension API. Note that
    the function would also be included in either
    Extensions.Functions.ExtensionCalls or
    Extensions.Functions.ComponentExtensionCalls histogram.
  </summary>
</histogram>

<histogram
    name="Extensions.Functions.FailedTime{ExtensionFunctionExecutionTime}"
    enum="ExtensionFunctions" expires_after="never">
<!-- expires-never: Used for monitoring extension API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when an extension function call fails and finishes execution. The
    suffix indicates the exact bucket the function is in. See also
    Extensions.Functions.FailedTotalExecutionTime.
    {ExtensionFunctionExecutionTime}
  </summary>
  <token key="ExtensionFunctionExecutionTime"
      variants="ExtensionFunctionExecutionTime">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Extensions.Functions.HandleResponseElapsedTime" units="ms"
    expires_after="never">
<!-- expires-never: Used for monitoring extension API performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The amount of time it takes to handle a response for an extension API
    request. Recorded on the renderer side once we receive the response IPC from
    the browser and have deserialized the arguments and passed them to the JS
    context. Only recorded if the response is successfully handled.
  </summary>
</histogram>

<histogram name="Extensions.Functions.NonExtensionWebPageCalls"
    enum="ExtensionFunctions" expires_after="never">
<!-- expires-never: Used for monitoring extension API usage. -->

  <owner>tjudkins@chromium.org</owner>
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when a Web Page context not associated with an extension calls an
    extension API. Generally extension APIs are only exposed to extensions or
    WebUI, but there are rare cases where an API is exposed to a web page not
    associated with an extension e.g. the Chrome Webstore. Recorded once per
    function call. See also Extensions.Functions.WebUICalls,
    Extensions.Functions.WebUIUntrustedCalls,
    Extensions.Functions.ComponentExtensionCalls and
    Extensions.Functions.ExtensionCalls.
  </summary>
</histogram>

<histogram name="Extensions.Functions.StartRequestElapsedTime" units="ms"
    expires_after="never">
<!-- expires-never: Used for monitoring extension API performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The amount of time it takes to start an extension API request. Recorded on
    the renderer side after we perform JS pre-processing, but includes all
    serialization and dispatching. Only recorded if the request is successfully
    dispatched.
  </summary>
</histogram>

<histogram
    name="Extensions.Functions.SucceededTime{ExtensionFunctionExecutionTime}"
    enum="ExtensionFunctions" expires_after="never">
<!-- expires-never: Used for monitoring extension API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when an extension function call succeeds and finishes execution.
    The suffix indicates the exact bucket the function is in. See also
    Extensions.Functions.SucceededTotalExecutionTime.
    {ExtensionFunctionExecutionTime}
  </summary>
  <token key="ExtensionFunctionExecutionTime"
      variants="ExtensionFunctionExecutionTime">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Extensions.Functions.SucceededTotalExecutionTime" units="ms"
    expires_after="2027-02-14">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The total amount of time it took to execute an extension function that
    succeeded from the time the extension function is called to the time the
    function responds. Note that since some extension functions are inherently
    slow (anything that requires user interaction, for instance), this is not a
    definitive source for function performance.
  </summary>
</histogram>

<histogram name="Extensions.Functions.SynchronousExecutionTime" units="ms"
    expires_after="2027-02-21">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The synchronous amount of time an extension function takes. Note that many
    extension functions run asynchronously; see also
    Extensions.Functions.[Succeeded|Failed]TotalExecutionTime.
  </summary>
</histogram>

<histogram name="Extensions.Functions.WebUICalls" enum="ExtensionFunctions"
    expires_after="never">
<!-- expires-never: Used for monitoring extension API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when a WebUI context calls an extension API. Recorded once per
    function call. See also Extensions.Functions.WebUIUntrustedCalls,
    Extensions.Functions.NonExtensionWebPageCalls,
    Extensions.Functions.ComponentExtensionCalls and
    Extensions.Functions.ExtensionCalls.
  </summary>
</histogram>

<histogram name="Extensions.Functions.WebUIUntrustedCalls"
    enum="ExtensionFunctions" expires_after="never">
<!-- expires-never: Used for monitoring extension API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when a WebUI context calls an extension API. Recorded once per
    function call. See also Extensions.Functions.WebUICalls,
    Extensions.Functions.NonExtensionWebPageCalls,
    Extensions.Functions.ComponentExtensionCalls and
    Extensions.Functions.ExtensionCalls.
  </summary>
</histogram>

<histogram name="Extensions.GoogleDocOffline.AvailabilityOnResourceRequest"
    enum="GoogleDocsExtensionAvailablity" expires_after="2023-06-18">
  <owner>arabm@chromium.org</owner>
  <owner>chrome-incognito@google.com</owner>
  <summary>
    This histogram records requests to use resources from Google Docs Offline
    extension, along with whether the extension has been available or not and
    the request has been done from incognito mode or not. Note that this request
    is double counted for the imports.
  </summary>
</histogram>

<histogram name="Extensions.Greylist.Disabled" enum="ExtensionLocation"
    expires_after="2027-05-11">
  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Emits the Extension::Location of a newly-disabled greylisted extension.
    Logged when SafeBrowsingVerdictHandler greylists and disables an installed
    extension.

    Warning: this histogram was expired from 2024-09-07 to 2025-11-13; data may
    be missing.
  </summary>
</histogram>

<histogram name="Extensions.Greylist.Enabled" enum="ExtensionLocation"
    expires_after="2027-05-11">
  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Emits the Extension::Location of an extension that was ungreylisted. Logged
    when SafeBrowsingVerdictHandler ungreylists and enables an installed
    extension.

    Warning: this histogram was expired from 2024-09-07 to 2025-11-13; data may
    be missing.
  </summary>
</histogram>

<histogram name="Extensions.GreylistedForceInstalled.{TrustLevel}.Enabled"
    enum="Boolean" expires_after="2027-02-07">
  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the enabled state of a greylisted force-installed extension in a
    {TrustLevel} management environment. A greylisted extension is one that has
    been taken down by the Chrome Web Store for non-malware reasons such as
    store policy violations or unwanted software categorization. Recorded once
    per extension at profile startup on Windows and macOS. Only applicable for
    &quot;user profiles&quot; (profiles where people can install extensions,
    specifically profiles that can have non-component extensions installed).
  </summary>
  <token key="TrustLevel">
    <variant name="HighTrust" summary="high-trust"/>
    <variant name="LowTrust" summary="low-trust"/>
  </token>
</histogram>

<histogram name="Extensions.HasPermissions_Install4" enum="Boolean"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Whether there were any permissions present in an extension when it was
    installed for &quot;user profiles&quot; (profiles where people can install
    extensions, specifically profiles that can have non-component extensions
    installed). To find places where this histogram may be emitted, look for
    calls to InstalledLoader::RecordPermissionMessagesHistogram with the
    argument Install. For Sync users, this is reported for each device.
  </summary>
</histogram>

<histogram name="Extensions.HasPermissions_Load4" enum="Boolean"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Whether there were any permissions present in an extension when it was
    loaded (which happens at profile open or extension install) for &quot;user
    profiles&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed). To find places
    where this histogram may be emitted, look for calls to
    InstalledLoader::RecordPermissionMessagesHistogram with the argument Load.
  </summary>
</histogram>

<histogram name="Extensions.HomepageOverrides2" units="units"
    expires_after="2026-12-01">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <owner>junhaohuang@microsoft.com</owner>
  <summary>
    The number of enabled extensions with a homepage override specified in their
    manifest. Recorded once per &quot;user profile&quot; (profiles where people
    can install extensions, specifically profiles that can have non-component
    extensions installed) at profile initialization.
  </summary>
</histogram>

<histogram name="Extensions.HostedAppLaunchContainer" enum="AppLaunchContainer"
    expires_after="2023-04-16">
  <owner>benwells@chromium.org</owner>
  <owner>dominickn@chromium.org</owner>
  <summary>
    Records the container used for a hosted app launch, when the app is
    launched. The definition of 'launch' for the purposes of this histogram is
    different to that used for the launch type histograms. This definition is
    less inclusive, for example it does not include navigations to the hosted
    app due to normal browsing, which the other definition does include. This
    definition could be thought of more as explicit launches via a launch
    surface such as the app launcher, chrome://apps, or a shortcut.
  </summary>
</histogram>

<histogram name="Extensions.HostPermissions.GrantedAccess2"
    enum="HostPermissionsAccess" expires_after="never">
<!-- expires-never: Monitors core extension usage. -->

  <owner>evasu@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records the host permissions access for a enabled extension as a result of
    the RuntimeHostPermissions feature. Recorded once per extension at profile
    initialization for &quot;user profiles&quot; (profiles where people can
    install extensions, specifically profiles that can have non-component
    extensions installed) initialization.
  </summary>
</histogram>

<histogram name="Extensions.HostPermissions.GrantedAccessForBroadRequests2"
    enum="HostPermissionsAccess" expires_after="never">
<!-- expires-never: Monitors core extension usage. -->

  <owner>evasu@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records the host permissions access for each enabled extension that
    specifies a host permission that matches an effective TLD. Recorded once per
    extension at &quot;user profile&quot; (profiles where people can install
    extensions, specifically profiles that can have non-component extensions
    installed) initialization.
  </summary>
</histogram>

<histogram name="Extensions.HostPermissions.GrantedAccessForTargetedRequests2"
    enum="HostPermissionsAccess" expires_after="never">
<!-- expires-never: Monitors core extension usage. -->

  <owner>evasu@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records the host permissions access for each enabled extension that
    specifies hosts, but has no host permission that matches an effective TLD.
    Recorded once per extension at &quot;user profile&quot; (profiles where
    people can install extensions, specifically profiles that can have
    non-component extensions installed) initialization.
  </summary>
</histogram>

<histogram name="Extensions.IncognitoAllowed2" units="units"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of extensions (and friends) that could have been allowed in
    incognito, and were, for users that have at least one extension that could
    have been allowed. This excludes anything that doesn't show up in
    chrome://extensions (platform apps, hosted apps, component extensions),
    policy-installed extensions, and unpacked extensions. Logged at &quot;user
    profile&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed) initialization.
  </summary>
</histogram>

<histogram name="Extensions.InjectCssTime" units="ms" expires_after="never">
<!-- expires-never: Used for monitoring extension API performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The amount of time for a CSS file to be injected into a page.
  </summary>
</histogram>

<histogram name="Extensions.InjectedScriptExecutionTime{UserScriptRunLocation}"
    units="ms" expires_after="never">
<!-- expires-never: Monitoring performance of a core extension API. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Time taken to execute all scripts for one location within an extension.
    Recorded every time content scripts injected by extensions are executed
    {UserScriptRunLocation}. Unlike Extensions.InjectScriptTime, this includes
    execution time of asynchronously injected scripts.
  </summary>
  <token key="UserScriptRunLocation">
    <variant name="" summary="for all script run locations"/>
    <variant name=".DocumentEnd"
        summary="with run location of `run_at: document_end`"/>
    <variant name=".DocumentIdle"
        summary="with run location of `run_at: document_idle`"/>
    <variant name=".DocumentStart"
        summary="with run location of `run_at: document_start`"/>
  </token>
</histogram>

<histogram name="Extensions.InjectEnd_BlockingScriptCount" units="units"
    expires_after="never">
<!-- expires-never: Monitoring core extensions performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>
    Number of blocking scripts injected at document end by extensions.
  </summary>
</histogram>

<histogram name="Extensions.InjectEnd_ScriptCount" units="units"
    expires_after="never">
<!-- expires-never: Monitoring core extensions performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>Number of scripts injected at document end by extensions.</summary>
</histogram>

<histogram name="Extensions.InjectEnd_Time" units="ms" expires_after="never">
<!-- expires-never: Used for monitoring extension API performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Time taken to inject all scripts at document end by extensions. Not reported
    if scripts are executed asynchronously.
  </summary>
</histogram>

<histogram name="Extensions.InjectIdle_BlockingScriptCount" units="units"
    expires_after="never">
<!-- expires-never: Monitoring core extensions performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>
    Number of blocking scripts injected at document idle by extensions.
  </summary>
</histogram>

<histogram name="Extensions.InjectIdle_ScriptCount" units="units"
    expires_after="never">
<!-- expires-never: Monitoring core extensions performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>Number of scripts injected at document idle by extensions.</summary>
</histogram>

<histogram name="Extensions.InjectIdle_Time" units="ms" expires_after="never">
<!-- expires-never: Used for monitoring extension API performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Time taken to inject all scripts at document idle by extensions. Not
    reported if scripts are executed asynchronously.
  </summary>
</histogram>

<histogram name="Extensions.InjectStart_BlockingScriptCount" units="units"
    expires_after="never">
<!-- expires-never: Used for monitoring extension API performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Number of blocking scripts injected at document start by extensions.
  </summary>
</histogram>

<histogram name="Extensions.InjectStart_CssCount" units="units"
    expires_after="never">
<!-- expires-never: Monitors core extension performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>Number of css files injected by extensions.</summary>
</histogram>

<histogram name="Extensions.InjectStart_ScriptCount" units="units"
    expires_after="never">
<!-- expires-never: Used for monitoring extension API performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>Number of scripts injected at document start by extensions.</summary>
</histogram>

<histogram name="Extensions.InjectStart_Time" units="ms" expires_after="never">
<!-- expires-never: Monitors core extension performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>
    Time taken to inject css/scripts at document start by extensions. Not
    reported if scripts are executed asynchronously.
  </summary>
</histogram>

<histogram name="Extensions.Install.PinReason" enum="ExtensionPinReason"
    expires_after="2026-12-31">
  <owner>evasu@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Logged every time an extension is installed. Records the reason why the
    extension was or wasn't automatically pinned to the toolbar.
  </summary>
</histogram>

<histogram name="Extensions.InstallFrictionDialogAction"
    enum="ExtensionInstallFrictionDialogAction" expires_after="2026-06-07">
  <owner>jeffcyr@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Action taken in the extension install friction dialog displayed to Enhanced
    Safe Browsing users before installing an extension that is not included in
    the Safe Browsing CRX allowlist.

    Warning: this histogram was expired from 2024-11-17 to 2025-01-07; data may
    be missing.
  </summary>
</histogram>

<!-- TODO(crbug.com/40878021): Change all .NonUser/.User metrics to use histogram suffixes rather than be duplicated here. -->

<histogram name="Extensions.InstallSource{UserType}2" enum="ExtensionLocation"
    expires_after="never">
<!-- expires-never: Monitoring core extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Installs grouped by the location property in prefs for {UserType}. Emitted
    once per profile open.
  </summary>
  <token key="UserType" variants="UserType"/>
</histogram>

<histogram name="Extensions.InstallType{UserType}" enum="ExtensionType"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Installs grouped by Extension::HistogramType for {UserType}. Emitted once
    per extension install.
  </summary>
  <token key="UserType" variants="UserType"/>
</histogram>

<histogram name="Extensions.LoadAll2" units="units" expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of extensions and themes loaded at &quot;user profile&quot;
    (profiles where people can install extensions, specifically profiles that
    can have non-component extensions installed) open.
  </summary>
</histogram>

<histogram name="Extensions.LoadAllComponentTime" units="ms"
    expires_after="2023-07-07">
  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>
    Time taken to load all component extensions at profile open. This happens as
    part of the total initialization time of ExtensionService, measured in
    Extensions.ExtensionServiceInitTime.

    Histogram is in the process of being removed in favor of its new versions
    (Extensions.LoadAllComponentTime.NonUser and
    Extensions.LoadAllComponentTime.User) that emit only on profile open for
    &quot;user&quot; profiles (profiles where people can install extensions,
    specifically profiles that can have non-component extensions installed).
  </summary>
</histogram>

<histogram name="Extensions.LoadAllComponentTime.NonUser" units="ms"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Time taken to load all component extensions at profile open for
    non-&quot;user profiles&quot; (profiles where people cannot install
    extensions, specifically profiles that can only have component extensions
    installed). This happens as part of the total initialization time of
    ExtensionService, measured in Extensions.ExtensionServiceInitTime. Emitted
    once per profile open.
  </summary>
</histogram>

<histogram name="Extensions.LoadAllComponentTime.User" units="ms"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Time taken to load all component extensions at profile open for &quot;user
    profiles&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed). This happens as
    part of the total initialization time of ExtensionService, measured in
    Extensions.ExtensionServiceInitTime. Emitted once per profile open.
  </summary>
</histogram>

<histogram name="Extensions.LoadAllTime2.NonUser" units="ms"
    expires_after="never">
<!-- expires-never: Monitoring core extensions system performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Time taken to load all non-component extensions at profile open and record
    metrics for non-&quot;user profiles&quot; (profiles where people cannot
    install extensions, specifically profiles that can only have component
    extensions installed). This happens as part of the total initialization time
    of ExtensionService, measured in Extensions.ExtensionServiceInitTime.
    Emitted once per profile open.
  </summary>
</histogram>

<histogram name="Extensions.LoadAllTime2.User" units="ms" expires_after="never">
<!-- expires-never: Monitoring core extensions system performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Time taken to load all non-component extensions at profile open and record
    metrics for &quot;user profiles&quot; (profiles where people can install
    extensions, specifically profiles that can have non-component extensions
    installed). This happens as part of the total initialization time of
    ExtensionService, measured in Extensions.ExtensionServiceInitTime. Emitted
    once per profile open.
  </summary>
</histogram>

<histogram name="Extensions.LoadApp2" units="units" expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of apps loaded by each user at &quot;user profile&quot; (profiles
    where people can install extensions, specifically profiles that can have
    non-component extensions installed) open.
  </summary>
</histogram>

<histogram name="Extensions.LoadAppExternal2" units="units"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>
    The number of externally managed apps loaded by each user at &quot;user
    profile&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed) open.
  </summary>
</histogram>

<histogram name="Extensions.LoadAppUser2" units="units" expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of user-installed apps loaded by each user at &quot;user
    profile&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed) open.
  </summary>
</histogram>

<histogram name="Extensions.LoadBrowserAction2" units="units"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of browser action extensions loaded at &quot;user profile&quot;
    (profiles where people can install extensions, specifically profiles that
    can have non-component extensions installed) open.
  </summary>
</histogram>

<histogram name="Extensions.LoadExtension2" units="units" expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of extensions loaded at profile open for &quot;user&quot;
    profiles (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed).
  </summary>
</histogram>

<histogram name="Extensions.LoadExtensionExternal2" units="units"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>
    The number of externally managed extensions loaded at &quot;user
    profile&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed) open.
  </summary>
</histogram>

<histogram name="Extensions.LoadExtensionUser2" units="units"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of user-installed extensions loaded at &quot;user profile&quot;
    (profiles where people can install extensions, specifically profiles that
    can have non-component extensions installed) open.
  </summary>
</histogram>

<histogram name="Extensions.LoadExternal" units="units" expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>
    The number of externally managed extensions and apps loaded at profile open.
  </summary>
</histogram>

<histogram name="Extensions.LoadHostedApp2" units="units" expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of hosted apps loaded by each user at &quot;user profile&quot;
    (profiles where people can install extensions, specifically profiles that
    can have non-component extensions installed) open.
  </summary>
</histogram>

<histogram name="Extensions.LoadingFromCommandLine" enum="LoadExtensionFlag"
    expires_after="2026-09-13">
  <owner>richche@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Recorded when extension are loaded via the &quot;--load-extension&quot; or
    &quot;--disable-extensions-except&quot; command line switch. Emitted once
    per profile start while extensions are loading with flags present, and the
    extension is loaded without being blocked.
  </summary>
</histogram>

<histogram name="Extensions.LoadNoExtensionAction2" units="units"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of extensions that had neither a page nor browser action
    specified in their manifest. Recorded at &quot;user profile&quot; (profiles
    where people can install extensions, specifically profiles that can have
    non-component extensions installed) open.
  </summary>
</histogram>

<histogram name="Extensions.LoadOffStoreItems2" units="Number of items"
    expires_after="never">
<!-- expires-never: Monitoring core extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of enabled extensions or apps the user has installed that do not
    update from the Chrome Web Store. Recorded during &quot;user profile&quot;
    (profiles where people can install extensions, specifically profiles that
    can have non-component extensions installed) initialization.
  </summary>
</histogram>

<histogram name="Extensions.LoadPackagedApp2" units="units"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>
    The number of legacy packaged apps loaded by each user at &quot;user
    profile&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed) open.
  </summary>
</histogram>

<histogram name="Extensions.LoadPlatformApp2" units="units"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <summary>
    The number of platform apps loaded at &quot;user profile&quot; (profiles
    where people can install extensions, specifically profiles that can have
    non-component extensions installed) open.
  </summary>
</histogram>

<histogram name="Extensions.LoadTheme2" units="units"
    expires_after="2027-01-03">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of themes loaded at &quot;user profile&quot; (profiles where
    people can install extensions, specifically profiles that can have
    non-component extensions installed) open.
  </summary>
</histogram>

<histogram name="Extensions.LoadType2" enum="ExtensionType"
    expires_after="2027-02-07">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of extensions loaded at &quot;user profile&quot; (profiles where
    people can install extensions, specifically profiles that can have
    non-component extensions installed) open grouped by
    Extension::HistogramType.
  </summary>
</histogram>

<histogram name="Extensions.Management.SetEnabled.HasUserGesture"
    enum="Boolean" expires_after="2026-03-20">
  <owner>solomonkinard@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Emitted whenever an extension calls the chrome.management.setEnabled() API
    method. Emits whether API call was made using a user gesture.
  </summary>
</histogram>

<histogram name="Extensions.Management_Refresh" units="ms"
    expires_after="2023-05-07">
  <owner>jam@chromium.org</owner>
  <owner>cduvall@chromium.org</owner>
  <summary>
    Measures how long ExtensionManagement::Refresh takes. This reloads all
    enterprise-related policies for all extensions, and is called both at
    startup and any time the enterprise policy changes.
  </summary>
</histogram>

<histogram name="Extensions.ManifestVersion2" units="units"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The manifest version of each loaded extension. Emitted for each extension at
    &quot;user profils&quot; (profiles where people can install extensions,
    specifically profiles that can have non-component extensions installed)
    open.

    Note: Though the histogram name is 'Extensions.ManifestVersion2', it does
    not represent MV2. Instead, it represents the second version of the
    histogram that was named 'Extensions.ManifestVersion'.
  </summary>
</histogram>

<histogram name="Extensions.ManifestVersion2Count.{ManifestLocation}"
    units="number of extensions" expires_after="2027-01-10">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of enabled manifest version 2 {ManifestLocation}. Emitted once on
    profile startup for user profiles (profiles where users can install
    extensions, specifically profiles that can have non-component extensions
    installed).
  </summary>
  <token key="ManifestLocation" variants="ManifestLocationGroup"/>
</histogram>

<histogram name="Extensions.ManifestVersion3Count.{ManifestLocation}"
    units="number of extensions" expires_after="2027-02-07">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of enabled manifest version 3 {ManifestLocation}. Emitted once on
    profile startup for user profiles (profiles where users can install
    extensions, specifically profiles that can have non-component extensions
    installed).
  </summary>
  <token key="ManifestLocation" variants="ManifestLocationGroup"/>
</histogram>

<histogram name="Extensions.ManifestVersionByLocation.{ManifestLocation}"
    units="manifest version" expires_after="2027-02-14">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The manifest version of an enabled {ManifestLocation}. Emitted for every
    enabled extension (not for other extension-y items, like platform apps) on
    profile startup for user profiles (profiles where users can install
    extensions, specifically profiles that can have non-component extensions
    installed).
  </summary>
  <token key="ManifestLocation" variants="ManifestLocationGroup"/>
</histogram>

<histogram
    name="Extensions.MessagePipeline.OpenChannelDispatchOnConnectStatus{DispatchTarget}{ChannelType}"
    enum="OpenChannelMessagePipelineResult" expires_after="2026-07-12">
  <owner>andreaorru@chromium.org</owner>
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Tracks that for every IPC we dispatch to create a port for a messaging
    channel in the renderer whether it responded, or if the channel or port
    closed before the ack could be received.

    Emitted each time a (LocalFrame::|ServiceWorker::)DispatchOnConnect IPC is
    dispatched to a {DispatchTarget}. This occurs once for every available frame
    and worker in the extension when a channel is opened to an extension.

    It is permuted by channel type (message type). {ChannelType}.

    Note: a new enum value was added in February 2026, which could affect query
    results across that date.

    Note: This histogram was expired during February 2026 so some data might be
    missing.
  </summary>
  <token key="DispatchTarget">
    <variant name=".ForFrame" summary="frame"/>
    <variant name=".ForWorker" summary="worker"/>
  </token>
  <token key="ChannelType" variants="ChannelType"/>
</histogram>

<histogram
    name="Extensions.MessagePipeline.OpenChannelStatus{WorkerStatus}{ChannelType}"
    enum="OpenChannelMessagePipelineResult" expires_after="2026-09-13">
  <owner>andreaorru@chromium.org</owner>
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Tracks the results of attempting to open a channel to an extension.

    Emitted each time a messaging channel is opened which occurs once per
    messaging communication (one-time or long-lived connections).

    It is permuted by worker status. Specifically if an extension has
    {WorkerStatus}.

    It is permuted by channel type (message type). {ChannelType}

    Note: a new enum value was added in February 2026, which could affect query
    results across that date.
  </summary>
  <token key="WorkerStatus">
    <variant name=""
        summary="any background of the background types (as an overall
                 metric)"/>
    <variant name="WithActiveWorker"
        summary="a service worker that is running"/>
    <variant name="WithIdleWorker"
        summary="a service worker this is not running"/>
    <variant name="WithNoWorker"
        summary="no service worker (e.g. no worker in manfest or a different
                 background type)"/>
  </token>
  <token key="ChannelType" variants="ChannelType"/>
</histogram>

<histogram
    name="Extensions.MessagePipeline.OpenChannelWorkerDispatchStatus{ChannelType}"
    enum="OpenChannelMessagePipelineResult" expires_after="2026-07-12">
  <owner>andreaorru@chromium.org</owner>
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Tracks that when a messaging channel is opened to a worker-based extension,
    whether the extension was able to create a port (for any listener, not
    necessarily the worker).

    Emitted each time a messaging channel is opened which occurs once per
    messaging communication (one-time or long-lived connections).

    It is permuted by channel type (message type). {ChannelType}.

    Note: a new enum value was added in February 2026, which could affect query
    results across that date.

    Note: This histogram was expired From July to February 2026 so some data
    might be missing.
  </summary>
  <token key="ChannelType" variants="ChannelType"/>
</histogram>

<histogram
    name="Extensions.MessagePipeline.OpenChannelWorkerWakeUpStatus{ChannelType}"
    enum="OpenChannelMessagePipelineResult" expires_after="2026-07-12">
  <owner>andreaorru@chromium.org</owner>
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Tracks whether a worker was successfully started in order to open a channel
    to the worker-based extension.

    Emitted each time a messaging channel is opened which occurs once per
    messaging communication (one-time or long-lived connections).

    It is permuted by channel type (message type). {ChannelType}.

    Note: a new enum value was added in February 2026, which could affect query
    results across that date.

    Note: This histogram was expired From July to February 2026 so some data
    might be missing.
  </summary>
  <token key="ChannelType" variants="ChannelType"/>
</histogram>

<histogram name="Extensions.Messaging.NativeMessagingCount" units="extensions"
    expires_after="2027-02-07">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Number of enabled extensions which have requested the
    &quot;nativeMessaging&quot; permission. Includes all kinds of extensions,
    including component and unpacked extensions. Recorded during &quot;user
    profile&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed) initialization.
  </summary>
</histogram>

<histogram
    name="Extensions.MV2Deprecation.MV2ExtensionState.{ManifestLocation}"
    enum="MV2ExtensionState" expires_after="2027-02-07">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    The state of a given MV2 extension on a user's device. Emitted once after
    profile initialization for user profiles (profiles where users can install
    extensions, specifically profiles that can have non-component extensions
    installed). Emitted only if the user is in an MV2 experiment stage that can
    disable MV2 extensions. Only emitted for non-component MV2 extensions.
  </summary>
  <token key="ManifestLocation" variants="ManifestLocationGroup"/>
</histogram>

<histogram name="Extensions.NativeMessaging.MessageSize{NativeMessagingSource}"
    units="bytes" expires_after="2027-01-01">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The size of the message in bytes sent from {NativeMessagingSource} for
    native messaging. Recorded only for native hosts launched via host manifest
    files on desktop platforms.
  </summary>
  <token key="NativeMessagingSource" variants="NativeMessagingSource"/>
</histogram>

<histogram name="Extensions.Navigation.Scheme" enum="ExtensionNavigationScheme"
    expires_after="2024-11-17">
  <owner>jkokatsu@google.com</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Counts usage of various schemes (e.g. file:, chrome:, http:) when a
    navigation is triggered from an extension (such as through tabs API).
  </summary>
</histogram>

<histogram name="Extensions.NetworkDelay" units="ms" expires_after="2027-06-01">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>Time that network requests were blocked due to extensions.</summary>
</histogram>

<histogram name="Extensions.NetworkDelayPercentage" units="%"
    expires_after="2023-01-23">
  <owner>battre@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Percentage of total lifetime a network request was blocked due to an
    extension.
  </summary>
</histogram>

<histogram name="Extensions.NewTabPageOverrides2" units="units"
    expires_after="2027-02-14">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <summary>
    The number of enabled extensions with a New Tab Page override specified in
    their manifest. Recorded once per &quot;user profile&quot; (profiles where
    people can install extensions, specifically profiles that can have
    non-component extensions installed) at profile open.
  </summary>
</histogram>

<histogram name="Extensions.NonWebstoreLocation2" enum="ExtensionLocation"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of apps/extensions with a non-webstore update_url loaded on
    profile open grouped by Extension::Location. Emitted per &quot;user
    profiles&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed) open.
  </summary>
</histogram>

<histogram
    name="Extensions.NonWebstoreLocationWith{DeveloperModeState}{ExtensionState}3"
    enum="ExtensionLocation" expires_after="2026-12-06">
  <owner>richche@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    The number of {ExtensionState} non-webstore extensions with a non-webstore
    update_url loaded on profile open and {DeveloperModeState}. Grouped by
    Extension::Location. Emitted on every profile open only for &quot;user
    profiles&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed).

    This replaces the previous histogram,
    NonWebstoreLocationWith{DeveloperModeState}{ExtensionState}2, due to missing
    data from M126.
  </summary>
  <token key="DeveloperModeState" variants="DeveloperModeState"/>
  <token key="ExtensionState" variants="ExtensionState"/>
</histogram>

<histogram name="Extensions.NonWebStoreNewTabPageOverrides2" units="units"
    expires_after="2026-11-15">
  <owner>anunoy@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Number of non-WebStore extensions on profile open for &quot;user
    profiles&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed) that override the
    new tab page.
  </summary>
</histogram>

<histogram name="Extensions.NotAllowlistedDisabled2" units="extensions"
    expires_after="2025-01-01">
  <owner>jeffcyr@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    The total number of disabled extensions that are not present in the Enhanced
    Safe Browsing CRX allowlist. Recorded for &quot;user profiles&quot;
    (profiles where people can install extensions, specifically profiles that
    can have non-component extensions installed) on profile initialization.
  </summary>
</histogram>

<histogram name="Extensions.NotAllowlistedDisabledAndEsbUser2"
    units="extensions" expires_after="2025-01-01">
  <owner>jeffcyr@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    The total number of disabled extensions that are not present in the Enhanced
    Safe Browsing CRX allowlist. Recorded for only for Enhanced Safe Browsing
    users on &quot;user profile&quot; (profiles where people can install
    extensions, specifically profiles that can have non-component extensions
    installed) initialization.
  </summary>
</histogram>

<histogram name="Extensions.NotAllowlistedEnabled2" units="extensions"
    expires_after="2025-01-01">
  <owner>jeffcyr@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    The total number of enabled extensions that are not present in the Enhanced
    Safe Browsing CRX allowlist. Recorded for &quot;user profiles&quot;
    (profiles where people can install extensions, specifically profiles that
    can have non-component extensions installed) on profile initialization.
  </summary>
</histogram>

<histogram name="Extensions.NotAllowlistedEnabledAndEsbUser2"
    units="extensions" expires_after="2025-01-01">
  <owner>jeffcyr@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    The total number of enabled extensions that are not present in the Enhanced
    Safe Browsing CRX allowlist. Recorded for only for Enhanced Safe Browsing
    users on &quot;user profile&quot; (profiles where people can install
    extensions, specifically profiles that can have non-component extensions
    installed) initialization.
  </summary>
</histogram>

<histogram name="Extensions.Permissions_Install4" enum="ExtensionPermission3"
    expires_after="never">
<!-- expires-never: Monitoring extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The permissions present in an extension when it was installed. To find
    places where this histogram may be emitted, look for calls to
    InstalledLoader::RecordPermissionMessagesHistogram with the argument
    Install. Emitted once per &quot;user profile&quot; (profiles where people
    can install extensions, specifically profiles that can have non-component
    extensions installed) open. For Sync users, this is reported for each
    device.
  </summary>
</histogram>

<histogram name="Extensions.Permissions_Load4" enum="ExtensionPermission3"
    expires_after="never">
<!-- expires-never: Monitoring core extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The permissions present in an extension when it was loaded (which happens at
    profile open or extension install). Only emitted for quot;user
    profiles&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed). To find places
    where this histogram may be emitted, look for calls to
    InstalledLoader::RecordPermissionMessagesHistogram with the argument Load.
  </summary>
</histogram>

<histogram name="Extensions.Printing.UsesSupportedMargins" enum="Boolean"
    expires_after="2027-08-01">
  <owner>nmuggli@google.com</owner>
  <owner>msisov@igalia.com</owner>
  <summary>
    Records whether users of the chrome.printing extension API are using margins
    values that are supported by the printer.
  </summary>
</histogram>

<histogram name="Extensions.Printing.UsesSupportedPrintScaling" enum="Boolean"
    expires_after="2027-08-01">
  <owner>nmuggli@google.com</owner>
  <owner>msisov@igalia.com</owner>
  <summary>
    Records whether users of the chrome.printing extension API are using print
    scaling values that are supported by the printer.
  </summary>
</histogram>

<histogram name="Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts2"
    enum="BooleanHasWithheldHosts" expires_after="never">
<!-- expires-never: Monitors core extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Whether an extension had host permissions withheld as a result of the
    RuntimeHostPermissions feature. Recorded once per extension at &quot;user
    profile&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed) initialization if
    and only if the RuntimeHostPermissions feature is enabled and the extension
    requests any host permissions (i.e., could be affected by the feature).
  </summary>
</histogram>

<histogram name="Extensions.RuntimeHostPermissions.GrantedHostCount2"
    units="Granted hosts" expires_after="never">
<!-- expires-never: Monitors core extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of hosts an extension has been granted explicit access to that it
    also requested (note that if the user granted unrequested hosts, those will
    not be included in this count). Recorded once per extension at &quot;user
    profile&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed) initialization if
    and only if the RuntimeHostPermissions feature is enabled and the extension
    has had host permissions withheld. See also
    Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts.
  </summary>
</histogram>

<histogram name="Extensions.RuntimeSetUnistallURL.Host"
    enum="ExtensionRuntimeUninstallURLHost" expires_after="M155">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>bershanskyi@gmail.com</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of extensions which have uninstall URL with given security
    properties: HTTPS protocol, HTTP protocol and local hostname, or HTTP
    protocol and non-local hostname. This histogram may allow us to deprecate
    support for insecure remote unistall URLs. For purposes of this histogram,
    any non-local domain name is considered non-local even if it resolves to a
    local IP. Recorded on extension load if an extension has a valid uninstall
    URL set.
  </summary>
</histogram>

<histogram name="Extensions.SafeBrowsing.BlocklistedCount" units="count"
    expires_after="2027-02-07">
  <owner>thefrog@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    The number of blocklisted extensions found during a Safe Browsing extension
    check. Recorded each time a Safe Browsing check for extension IDs completes,
    whether synchronously or asynchronously.
  </summary>
</histogram>

<histogram name="Extensions.SandboxUnpackFailureReason2"
    enum="ExtensionUnpackFailureReason" expires_after="never">
<!-- expires-never: Monitors core extension installation flows. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The reason an extension failed to unpack, recorded when a failure occurs.

    Replaced Extensions.SandboxUnpackFailureReason because the enum values were
    not in sync with the C++ enums.
  </summary>
</histogram>

<histogram name="Extensions.SandboxUnpackFailureReasonForUpdates"
    enum="ExtensionUnpackFailureReason" expires_after="2026-10-14">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records the reason an extension failed to unpack during an update. Emits
    when a failure occurs.
  </summary>
</histogram>

<histogram name="Extensions.SandboxUnpackSuccess" units="units"
    expires_after="never">
<!-- expires-never: Monitors core extension installation flows. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>Count the number of times a sandboxed CRX unpack succeeds.</summary>
</histogram>

<histogram name="Extensions.SandboxUnpackSuccessForUpdates"
    enum="BooleanSuccess" expires_after="2026-10-14">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records whether a sandboxed CRX unpack succeeds or fails during an update.
    Emits when the installation completes (either successfully or with a
    sandboxed unpacker failure).
  </summary>
</histogram>

<histogram name="Extensions.SearchEngineOverrides2" units="units"
    expires_after="2027-01-17">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>kelvinjiang@chromium.org</owner>
  <summary>
    The number of enabled extensions with a search engine override specified in
    their manifest. Recorded once per &quot;user profile&quot; (profiles where
    people can install extensions, specifically profiles that can have
    non-component extensions installed) at profile initialization.
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.AddPendingTaskForRunningWorker3"
    enum="Boolean" expires_after="2024-09-15">
<!-- expires-never: Monitors core extension system health. -->

  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    It is emitted every time we add a pending task for a worker. Records true if
    the worker was ready to run tasks when pendings tasks are added (this is not
    optimal). Records false if the worker was not ready to run tasks when the
    pending task was added (this is the optimal expected state). `false` is
    recorded if the task is added when the extension is unloaded.

    Note: this histogram was incremented May, 2024 since it additionally started
    emmitting when the extension is unloaded.
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.FinishedExternalRequest_Result"
    enum="ServiceWorkerExternalRequestResult" expires_after="never">
<!-- expires-never: Monitors core extension system health. -->

  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Tracks the result (ServiceWorkerExternalRequestResult) of when we attempt to
    remove (finish) an external request for the extension service worker.
    Emitted when we attempt to finish the external request after the browser has
    received an ack from the renderer that it fired the event in the service
    worker.
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.FinishedExternalRequest_Result_PostReturn"
    enum="ServiceWorkerExternalRequestResult" expires_after="2025-03-02">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Tracks the result (ServiceWorkerExternalRequestResult) of when we attempt to
    remove (finish) an external request for the extension service worker.
    Emitted when we attempt to finish the external request after the browser has
    received an ack from the renderer that it fired the event in the service
    worker. Specifically the emit is delayed until *after* we've attempted to
    return early for either a stopped worker or the starting of the external
    request failing.
  </summary>
</histogram>

<histogram name="Extensions.ServiceWorkerBackground.MultiWorkerVersionIdMatch"
    enum="Boolean" expires_after="2026-10-04">
  <owner>andreaorru@chromium.org</owner>
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    When Extensions.ServiceWorkerBackground.WorkerCountAfterAdd == 2, this emits
    whether the previous and new worker added to WorkerIdSet had the same
    service worker version id.

    Warning: this histogram was expired from 2025-02-24 to 2025-08-15; data may
    be missing.
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.MultiWorkerVersionStatus.{WorkerType}"
    enum="ServiceWorkerVersionStatus" expires_after="2026-09-13">
  <owner>andreaorru@chromium.org</owner>
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The content::ServiceWorkerRunningInfo::ServiceWorkerVersionStatus for the
    {WorkerType} WorkerIdSet. Only emitted when
    Extensions.ServiceWorkerBackground.WorkerCountAfterAdd == 2. This ensures
    there will be a new and previous worker to emit for.

    Warning: this histogram was expired from 2025-02-24 to 2025-08-15; data may
    be missing.
  </summary>
  <token key="WorkerType">
    <variant name="NewWorker" summary="new worker that we've just added to"/>
    <variant name="PreviousWorker"
        summary="previous worker that was recorded before we added a new
                 worker to"/>
  </token>
</histogram>

<histogram name="Extensions.ServiceWorkerBackground.Registration_FailStatus"
    enum="ServiceWorkerStatusCode" expires_after="2027-01-10">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Tracks when a background service worker fails to register what is the
    ServiceWorkerStatusCode that occurred. Logged each time a service worker
    fails to register. Some failures are expected and are not counted by this
    metric.
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.RegistrationMismatchLocation"
    enum="ExtensionLocation" expires_after="2026-03-01">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded when Service Worker registration wasn't found for an existing
    extension when attempting to verify that persisted-to-prefs (ExtensionPrefs)
    worker registration. It records the manifest location of the extension.

    Note: this histogram expired between 2023-04 and 2024-04, it will be missing
    data between those dates.
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.RegistrationMismatchMitigated2"
    enum="Boolean" expires_after="2026-03-01">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Whether the attempt to re-register an extension Service Worker to mitigate
    missing registration issue succeeded. The attempt is performed during
    extension load.

    Note: incremented Aug, 2024 due to the implementation of worker registration
    retries which could increase the number of emits of this metric.
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.RegistrationMismatchMitigated_FailStatus"
    enum="ServiceWorkerStatusCode" expires_after="2026-03-01">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    When a mitigation for a mismatched registration state between ExtensionPrefs
    and the content service worker layer fails, this records the status that was
    returned by the content service worker layer for the registration request
    failure.

    Emitted when
    Extensions.ServiceWorkerBackground.RegistrationMismatchMitigated is false.
  </summary>
</histogram>

<histogram name="Extensions.ServiceWorkerBackground.RegistrationTime"
    units="ms" expires_after="2025-03-25">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The amount of time it takes to register a service worker background script
    with the content service worker layer.

    Measured in milliseconds from 1ms up to 10 seconds.
  </summary>
</histogram>

<histogram name="Extensions.ServiceWorkerBackground.RegistrationWhenExpected"
    enum="Boolean" expires_after="2026-03-01">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Whether or not a Service Worker registration was found in the content
    service worker layer after finding a registration for the worker in
    ExtensionPrefs.

    Emitted immediately after the content service worker layer has tried to
    search for the registration.
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.RequestedWorkerStartForStartedWorker3"
    enum="Boolean" expires_after="never">
<!-- expires-never: Monitors core extension system health. -->

  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    When we're about to request a worker to start to run an event/task this is
    emitted to indicate if the start was unneeded/redundant. Emitted just before
    we know that we are going to attempt to start a worker. A `true` value means
    that we will redundantly reqeust to start a worker when it was already
    running and could've processed the event without the request to start. A
    `false` value means that we correctly started the worker because it was not
    ready to run events. `false` is recorded if the worker start is requested
    when the extension is unloaded.

    Note: this histogram was incremented May, 2024 since it additionally started
    emmitting when the extension is unloaded.
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.StartingExternalRequest_Result"
    enum="ServiceWorkerExternalRequestResult" expires_after="never">
<!-- expires-never: Monitors core extension system health. -->

  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Tracks the result (ServiceWorkerExternalRequestResult) of when we attempt to
    add (start) an external request for the extension service worker. Logged
    each time an external request is added prior to dispatching the event to the
    service worker.
  </summary>
</histogram>

<histogram name="Extensions.ServiceWorkerBackground.StartWorker_FailStatus"
    enum="ServiceWorkerStatusCode" expires_after="never">
<!-- expires-never: Monitors core extension system health. -->

  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Tracks when a background service worker fails to start what is the
    ServiceWorkerStatusCode that occurred. Logged each time a service worker
    fails to start when we attempt to start it for extension tasks.
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.StartWorkerRetryAttemptsResult"
    enum="Boolean" expires_after="2026-09-06">
  <owner>andreaorru@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    When starting a service worker fails due to a transient error, we retry
    multiple times to try to make the start succeed.

    Emits true if the retry results in a successful start. Emits false if either
    all retry attempts have been exhausted without success or a retry resulted
    in a non-transient error.
  </summary>
</histogram>

<histogram name="Extensions.ServiceWorkerBackground.StartWorkerStatus"
    enum="Boolean" expires_after="2026-12-27">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Tracks whether background service worker starting succeeded or not. Logged
    each time a service worker has been started for extension tasks.
  </summary>
</histogram>

<histogram name="Extensions.ServiceWorkerBackground.StartWorkerTime" units="ms"
    expires_after="2025-10-03">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The amount of time it takes to start the background service worker of an
    extension that succeeded in starting. Logged when we've confirmed the
    service worker is started for extension tasks to run.

    Warning: This histogram was expired from 2025-01-15 to 2025-04-03 data may
    be missing.
  </summary>
</histogram>

<histogram name="Extensions.ServiceWorkerBackground.StartWorkerTime_Fail"
    units="ms" expires_after="2026-06-21">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The amount of time it takes to start the background service worker of an
    extension that failed in starting. Logged when we've confirmed the service
    worker has failed for extension tasks to run.

    Warning: This histogram was expired from 2024-11-13 to 2025-04-03 data may
    be missing.
  </summary>
</histogram>

<histogram name="Extensions.ServiceWorkerBackground.WorkerCountAfterAdd"
    units="registered workers" expires_after="2027-01-17">
  <owner>andreaorru@chromium.org</owner>
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The count of active workers registered in the extension ProcessManager for a
    given service worker-based extension. Reported immediately after a new
    worker is registered for the extension.
  </summary>
</histogram>

<histogram name="Extensions.ServiceWorkerBackground.WorkerCountAfterRemove"
    units="registered workers" expires_after="2027-01-17">
  <owner>andreaorru@chromium.org</owner>
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The count of active workers registered in the extension ProcessManager for a
    given service worker-based extension. Reported immediately after a worker
    for the extension is removed from the active set. Note: This histogram was
    expired between 2026-03 and 2026-06.
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.WorkerRegistrationRetryAttemptsResult"
    enum="Boolean" expires_after="2027-01-10">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    When an extension requests that its service worker be registered with the
    content layer it can fail due to
    blink::ServiceWorkerStatusCode::kErrorTimeout. When this happens we retry
    multiple times to try to make the registration succeed.

    Emits true if the retry results in a successful registration. Emits false if
    either all retry attempts have been exhausted without success or a retry
    resulted in a status code that is not
    blink::ServiceWorkerStatusCode::kErrorTimeout.
  </summary>
</histogram>

<histogram name="Extensions.ServiceWorkerBackground.WorkerRegistrationState"
    enum="Boolean" expires_after="2027-01-10">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Tracks whether background service worker registration ultimately succeeded
    or unexpectedly not. It can be emitted whenever an extension is enabled
    (including updates).

    If there are attempts to retry registration, those are not emitted. See
    Extensions.ServiceWorkerBackground.WorkerRegistrationRetryAttemptsResult for
    a metric on retry attempts.
  </summary>
</histogram>

<histogram name="Extensions.ServiceWorkerBackground.WorkerScriptFetchNetError"
    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2025-02-01">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records the underlying net::Error that was encountered when the content
    service worker layer tries to fetch the worker script (from disk) but
    encounters a network error.

    It is emitted each time a worker script fetch fails for a
    blink::ServiceWorkerBackground::kErrorNetwork reason.
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.WorkerUnregistrationFailureStatus{UnregistrationType}"
    enum="ServiceWorkerStatusCode" expires_after="2027-01-03">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The ServiceWorkerStatusCode when unregistering a worker for an extension
    fails unexpectedly.

    Emitted when Extensions.ServiceWorkerBackground.WorkerUnregistrationState is
    false.

    It is emitted when this failure happens in two scenarios when a worker may
    be unregistered:

    1. due to an extension update to potentially unregister the old worker or

    2. due to the extension being deactivated (due to disable, uninstall, or
    terminate)

    #1 and #2 can both occur for an extension update.

    #2 can occur independently outside of an extension update.

    {UnregistrationType}
  </summary>
  <token key="UnregistrationType" variants="UnregistrationType"/>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.WorkerUnregistrationState{UnregistrationType}"
    enum="Boolean" expires_after="2026-03-01">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The success (true) or unexpected failure (false) of attempting to unregister
    a worker for an extension.

    This is emitted for two scenarios when a worker may be unregistered:

    1. due to an extension update to potentially unregister the old worker or

    2. due to the extension being deactivated (due to disable, uninstall, or
    terminate)

    #1 and #2 can both occur for an extension update.

    #2 can occur independently outside of an extension update.

    {UnregistrationType}
  </summary>
  <token key="UnregistrationType" variants="UnregistrationType"/>
</histogram>

<histogram
    name="Extensions.ServiceWorkerBackground.WorkerVersionIdState_OnInitialized_NotActive"
    enum="WorkerVersionIdState" expires_after="2027-01-17">
  <owner>andreaorru@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records whether a notification for a newly initialized service worker's
    version ID is older, equal to, or newer than the existing worker version ID.
    This metric is emitted during
    ServiceWorkerState::RendererDidInitializeServiceWorkerContext only when the
    renderer state is already &quot;initialized&quot; or &quot;active&quot;
    (i.e., not RendererState::kNotActive).
  </summary>
</histogram>

<histogram
    name="Extensions.ServiceWorkerRenderer.ExtensionLoadStatusInWorkerScriptEvaluation"
    enum="ExtensionLoadStatusOnScriptEval" expires_after="2026-05-03">
  <owner>jlulejian@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    This records the state of the extension loading in the (renderer) extension
    registry during the process of service worker script evaluation. Loaded
    means the extension is in the extension registry. Unloaded means the
    extension was loaded, but is now unloaded (disabled). Unknown means that
    there is no record of the extension in the renderer.

    It is emitted potentially after the worker thread is started and the worker
    script will soon or already is evaluating, but it is before the worker's
    extension bindings sytem is created.
  </summary>
</histogram>

<histogram name="Extensions.Settings.DefaultPinningStartupState" enum="Boolean"
    expires_after="2027-01-01">
  <owner>evasu@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Logged once on profile initialization for non-incognito user profiles when
    the kExtensionsPinnedByDefault feature is enabled. Emits the boolean value
    of the kExtensionsPinnedByDefault preference, which tracks whether new
    extensions should be pinned to the toolbar by default.
  </summary>
</histogram>

<histogram name="Extensions.Settings.DefaultPinningToggled" enum="Boolean"
    expires_after="2027-01-01">
  <owner>evasu@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Emitted whenever the user changes the state of the &quot;Pin new
    extensions&quot; toggle on chrome://extensions. Records the new boolean
    value of the preference.
  </summary>
</histogram>

<histogram
    name="Extensions.SettingsOverridden.BackToGoogleNtpOverriddenDialogResult"
    enum="SettingsOverriddenDialogResult" expires_after="2026-11-15">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    The action taken on the settings overridden dialog that was shown to alert
    the user of an extension overriding the New Tab Page, when the dialog shown
    is the version that asks the user if they want to go back to Google's New
    Tab Page. Recorded once per instance of the dialog being shown, after the
    action is taken.
  </summary>
</histogram>

<histogram
    name="Extensions.SettingsOverridden.BackToGoogleSearchOverriddenDialogResult"
    enum="SettingsOverriddenDialogResult" expires_after="2027-02-07">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    The action taken on the settings overridden dialog that was shown to alert
    the user of an extension overriding the default search provider, when the
    dialog shown is the version that asks the user if they want to go back to
    Google search. Recorded once per instance of the dialog being shown, after
    the action is taken.
  </summary>
</histogram>

<histogram
    name="Extensions.SettingsOverridden.BackToOtherSearchOverriddenDialogResult"
    enum="SettingsOverriddenDialogResult" expires_after="2027-02-07">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    The action taken on the settings overridden dialog that was shown to alert
    the user of an extension overriding the default search provider, when the
    dialog shown is the version that asks the user if they want to go back to a
    previous search engine that isn't Google. Recorded once per instance of the
    dialog being shown, after the action is taken.
  </summary>
</histogram>

<histogram
    name="Extensions.SettingsOverridden.GenericNtpOverriddenDialogResult"
    enum="SettingsOverriddenDialogResult" expires_after="2026-11-15">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    The action taken on the settings overridden dialog that was shown to alert
    the user of an extension overriding the New Tab Page, when the dialog shown
    is the generic version. Recorded once per instance of the dialog being
    shown, after the action is taken.
  </summary>
</histogram>

<histogram
    name="Extensions.SettingsOverridden.GenericSearchOverriddenDialogResult"
    enum="SettingsOverriddenDialogResult" expires_after="2027-02-07">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    The action taken on the settings overridden dialog that was shown to alert
    the user of an extension overriding the default search provider, when the
    dialog shown is the generic version. Recorded once per instance of the
    dialog being shown, after the action is taken.
  </summary>
</histogram>

<histogram name="Extensions.SettingsOverridden.MissingParams"
    enum="MissingParams" expires_after="2027-01-17">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Records whether any search parameters are missing when populating the values
    for the Explicit Choice dialog.
  </summary>
</histogram>

<histogram
    name="Extensions.SettingsOverridden.UnacknowledgedMatchingDseExtensionPresent"
    enum="BooleanPresent" expires_after="2027-02-01">
  <owner>yeroshkin@google.com</owner>
  <owner>top-chrome-desktop-ui@google.com</owner>
  <summary>
    Recorded on browser window initialization on Windows and Mac. Records true
    if an installed extension controls the Default Search Engine (DSE), the
    extension's search engine matches the user's existing engine, and the user
    has not acknowledged the settings bubble (ack_settings_bubble). This detects
    the impacted state associated with crbug.com/540532980.
  </summary>
</histogram>

<histogram name="Extensions.Startup.DefaultPinnedExtensionState"
    enum="DefaultPinnedExtensionState" expires_after="2027-01-01">
  <owner>evasu@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Recorded on profile initialization for each extension that was originally
    pinned by default on installation. Logs whether the extension is currently
    pinned or unpinned by the user. Recorded only when the
    kExtensionsPinnedByDefault feature is enabled.
  </summary>
</histogram>

<histogram name="Extensions.Storage.OnSettingsChangedTime" units="ms"
    expires_after="2027-02-01">
  <owner>nafisabedin@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Tracks the Browser UI thread execution time of
    StorageFrontend::OnSettingsChanged when preparing and dispatching
    chrome.storage change events to extensions with active listeners. Recorded
    for each storage change notification that has at least one registered
    listener.
  </summary>
</histogram>

<histogram name="Extensions.SyncBlockedByDefaultWebAppMigration" enum="Boolean"
    expires_after="2024-02-08">
  <owner>alancutter@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Records true whenever an extension sync install attempt was blocked because
    it was a default Chrome app that has been migrated over to a web app. Never
    records false.

    Warning: This histogram was expired from 2023-08-08 to 2023-10-16; data may
    be missing.
  </summary>
</histogram>

<histogram name="Extensions.Tabs.RemoveAction" enum="TabsRemoveActionType"
    expires_after="2026-12-31">
  <owner>quarz@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>Tracks Tabs API remove actions.</summary>
</histogram>

<histogram name="Extensions.Tabs.UpdateAction" enum="TabsUpdateActionType"
    expires_after="2026-12-31">
  <owner>quarz@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>Tracks Tabs API update actions.</summary>
</histogram>

<histogram name="Extensions.Toolbar.BrowserActionsCount2" units="actions"
    expires_after="never">
<!-- expires-never: Monitoring core user behavior with extensions. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The total number of extensions that have an icon in the extension toolbar,
    including those that are unpinned and only show in the extensions menu.
    Measured once per &quot;user&quot; profile (profiles where people can
    install extensions, specifically profiles that can have non-component
    extensions installed) open. Note: There was a typo in the name in the XML
    for this histogram until 2026-06, which may result in missing data on some
    platforms.
  </summary>
</histogram>

<histogram name="Extensions.Toolbar.ExtensionsActivatedFromRequestAccessButton"
    units="Extension Count" expires_after="2027-05-03">
  <owner>evasu@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of extensions in the request access button that were granted site
    access after the user clicked on the request access button.
  </summary>
</histogram>

<histogram name="Extensions.Toolbar.InvocationSource"
    enum="ExtensionActionInvocationSource" expires_after="2027-01-31">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The source that triggered an extension action. Recorded once per invocation
    of an extension action.
  </summary>
</histogram>

<histogram name="Extensions.Toolbar.PinnedExtensionCount2"
    units="pinned extensions" expires_after="never">
<!-- expires-never: Monitoring core user behavior with extensions. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The number of extensions that the user has pinned on the toolbar. Recorded
    once per profile during initialization if the user has at least one
    extension with an action in the toolbar.
  </summary>
</histogram>

<histogram name="Extensions.Toolbar.PinnedExtensionPercentage3" units="%"
    expires_after="never">
<!-- expires-never: Monitoring core user behavior with extensions. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The percentage of extensions that the user has pinned to the toolbar (i.e.,
    this will be 100 if the user has every extension pinned). Recorded once per
    profile during initialization if the user has at least one extension with an
    action in the toolbar.
  </summary>
</histogram>

<histogram name="Extensions.Toolbar.TimeToFirstActionClick" units="ms"
    expires_after="2026-12-31">
  <owner>evasu@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The time elapsed between a user installing an extension and the first time
    the user clicks on that extension in ms. Recorded once per extension.
  </summary>
</histogram>

<histogram name="Extensions.UninstallSource" enum="ExtensionUninstallSource"
    expires_after="never">
<!-- expires-never: Monitoring core extension usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    The source for the extension uninstall. This is only recorded if an
    uninstall dialog is shown to the user (i.e., it is not recorded for internal
    &quot;cleanups&quot;). Note: this is no longer emitted for web app
    uninstalls as of M113.
  </summary>
</histogram>

<histogram name="Extensions.UninstallType" enum="ExtensionType"
    expires_after="never">
<!-- expires-never: Monitoring core extension usage behaviors. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>Uninstalls grouped by Extension::HistogramType.</summary>
</histogram>

<histogram name="Extensions.UploadExtensionToAccount.{Page}" enum="Boolean"
    expires_after="2027-02-14">
  <owner>kelvinjiang@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Logged when the user interacts with the dialog which uploads a local
    extension to their signed in account from the {Page} in chrome://extensions.
    Logs if the user proceeds with or cancels the extension upload.
  </summary>
  <token key="Page">
    <variant name="DetailsViewPage" summary="details view page"/>
    <variant name="ItemsListPage" summary="item list page"/>
  </token>
</histogram>

<histogram name="Extensions.WAR.XOriginWebAccessible.{ManifestVersion}"
    enum="Boolean" expires_after="2025-12-28">
  <owner>solomonkinard@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Emitted each time a cross-origin extension navigation request occurs. Counts
    whether or not the target URL is a web accessible resource. It's possible
    that the upstream origin and target are different but both for the same
    extension (i.e. one for a static URL and the other for its dynamic URL).
  </summary>
  <token key="ManifestVersion">
    <variant name="MV2" summary="At most MV2"/>
    <variant name="MV3" summary="At least MV3"/>
  </token>
</histogram>

<histogram
    name="Extensions.WebRequest.BeforeRequestDeclarativeNetRequestEvaluationTime"
    units="ms" expires_after="2027-02-14">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    The total amount of time taken to evaluate declarativeNetRequest rules in
    the onBeforeRequest stage, measured in milliseconds. Recorded once per
    request if and only if at least one declarativeNetRequest rule is present.
  </summary>
</histogram>

<histogram
    name="Extensions.WebRequest.BeforeRequestDeclarativeNetRequestEvaluationTimeInMicroseconds"
    units="microseconds" expires_after="2027-06-01">
  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    The total amount of time taken to evaluate declarativeNetRequest rules in
    the onBeforeRequest stage, measured in microseconds. Recorded once per
    request if and only if at least one declarativeNetRequest rule is present.
    This is only emitted for users with high resolution clocks.
  </summary>
</histogram>

<histogram
    name="Extensions.WebRequest.DeclarativeRequestDependentExtensionCount"
    units="Extension Count" expires_after="2027-01-27">
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the number of installed Extensions that require the
    Declarative{Web|Net}Request or their variant permission. The number will be
    clamped to 10 at maximum. This is recorded whenever a URLLoaderFactory is
    created for renderers. The metric is used for identifying the major reason
    to decide using the Extensions' loader proxy. We will consider possible
    optimization opportunities to reduce loading overheads.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.EventListenerFlag"
    enum="WebRequestEventListenerFlag" expires_after="never">
<!-- expires-never: For monitoring Web Request API usage statistics. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records any flags that were registered in the extraInfoSpec of a webRequest
    listener, as well as the total number of listeners registered. Recorded each
    time a new listener is registered.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.ProxyDecision2"
    enum="WebRequest.ProxyDecision" expires_after="2027-01-27">
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the decision of whether to proxy the request for the WebRequest API.
    This is recorded whenever a URLLoaderFactory is created for renderers.

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

<histogram name="Extensions.WebRequest.ProxyDecisionDetailsForExtension"
    enum="WebRequest.ProxyDecisionDetailsForExtension"
    expires_after="2027-01-27">
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the reason of kWillProxyForExtension in the ProxyDecision2. This is
    recorded if and only if the reason is kWillProxyForExtension when a
    URLLoaderFactory is created for renderers.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.RequestHeaderAdded"
    enum="WebRequest.RequestHeader" expires_after="never">
<!-- expires-never: For monitoring Web Request API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the request header added by extensions using the WebRequest API.
    Recorded for each network request during the OnBeforeSendHeaders stage.
    Multiple samples can be recorded per request.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.RequestHeaderChanged"
    enum="WebRequest.RequestHeader" expires_after="never">
<!-- expires-never: For monitoring Web Request API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the request header modified by extensions using the WebRequest API.
    Recorded for each network request during the OnBeforeSendHeaders stage.
    Multiple samples can be recorded per request.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.RequestHeaderRemoved"
    enum="WebRequest.RequestHeader" expires_after="never">
<!-- expires-never: For monitoring Web Request API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the request header removed by extensions using the WebRequest API.
    Recorded for each network request during the OnBeforeSendHeaders stage.
    Multiple samples can be recorded per request.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.ResponseHeaderAdded"
    enum="WebRequest.ResponseHeader" expires_after="never">
<!-- expires-never: For monitoring Web Request API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the response header added by extensions using the WebRequest API.
    This is logged for the cumulative delta across all the web request
    extensions. Recorded for each network request during the OnHeadersReceived
    stage. Multiple samples can be recorded per request.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.ResponseHeaderChanged"
    enum="WebRequest.ResponseHeader" expires_after="never">
<!-- expires-never: For monitoring Web Request API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the response header modified by extensions using the WebRequest API.
    This is logged for the cumulative delta across all the web request
    extensions. Recorded for each network request during the OnHeadersReceived
    stage. Multiple samples can be recorded per request.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.ResponseHeaderRemoved"
    enum="WebRequest.ResponseHeader" expires_after="never">
<!-- expires-never: For monitoring Web Request API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Records the response header removed by extensions using the WebRequest API.
    This is logged for the cumulative delta across all the web request
    extensions. Recorded for each network request during the OnHeadersReceived
    stage. Multiple samples can be recorded per request.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.TotalBlockingRequestTime" units="ms"
    expires_after="never">
<!-- expires-never: For monitoring Web Request API performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    The total time a network request took when at least one Web Request listener
    was registered at the start of the request, and a listener was blocked on
    the request. Measures from onBeforeRequest to onCompleted/onErrorOccurred,
    and does not include canceled or redirected requests.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.TotalExtraHeadersRequestTime" units="ms"
    expires_after="never">
<!-- expires-never: For monitoring Web Request API performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    The total time a network request took when at least one Web Request listener
    with 'extraHeaders' in the extraInfoSpec was registered at the start of the
    request. Measures from onBeforeRequest to onCompleted/onErrorOccurred, and
    does not include canceled or redirected requests.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.TotalRequestTime" units="ms"
    expires_after="never">
<!-- expires-never: For monitoring Web Request API performance. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    The total time a network request took when at least one Web Request listener
    was registered at the start of the request. Measures from onBeforeRequest to
    onCompleted/onErrorOccurred, and does not include canceled or redirected
    requests.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.WebRequestDependentExtensionCount"
    units="Extension Count" expires_after="2027-01-27">
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the number of installed Extensions that require the WebRequest or
    its variant permission. The number will be clamped to 10 at maximum. This is
    recorded whenever a URLLoaderFactory is created for renderers. The metric is
    used for identifying the major reason to decide using the Extensions' loader
    proxy. We will consider possible optimization opportunities to reduce
    loading overheads.
  </summary>
</histogram>

<histogram name="Extensions.WebRequest.WebViewDependentExtensionCount"
    units="Extension Count" expires_after="2027-01-27">
  <owner>toyoshim@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the number of installed Extensions that require the WebView
    permission. The number will be clamped to 10 at maximum. This is recorded
    whenever a URLLoaderFactory is created for renderers. The metric is used for
    identifying the major reason to decide using the Extensions' loader proxy.
    We will consider possible optimization opportunities to reduce loading
    overheads.
  </summary>
</histogram>

<histogram name="Extensions.WebRequestAction" enum="RequestAction"
    expires_after="never">
<!-- expires-never: For monitoring Web request actions. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>src/extensions/OWNERS</owner>
  <summary>
    Counts the number of times an action is requested by extensions as part of
    the Web Request API. For a given web request stage, multiple actions may be
    logged.
  </summary>
</histogram>

<histogram name="Extensions.WebRequestBlockingCount2" units="extensions"
    expires_after="never">
<!-- expires-never: For monitoring Web request API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Number of enabled extensions which have requested the
    &quot;webRequestBlocking&quot; permission. Includes all kinds of extensions,
    including component and unpacked extensions. Recorded during &quot;user
    profile&quot; (profiles where people can install extensions, specifically
    profiles that can have non-component extensions installed) initialization.
  </summary>
</histogram>

<histogram name="Extensions.WebRequestCount2" units="extensions"
    expires_after="never">
<!-- expires-never: For monitoring Web request API usage. -->

  <owner>rdevlin.cronin@chromium.org</owner>
  <owner>extensions-core@chromium.org</owner>
  <summary>
    Number of enabled extensions which have requested the &quot;webRequest&quot;
    permission. Includes all kinds of extensions, including component and
    unpacked extensions. Recorded during &quot;user profile&quot; (profiles
    where people can install extensions, specifically profiles that can have
    non-component extensions installed) initialization.
  </summary>
</histogram>

<histogram name="Extensions.WebStoreInstall.EsbAllowlistParameter"
    enum="WebStoreInstallAllowlistParameter" expires_after="2025-12-01">
  <owner>jeffcyr@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Reports the Safe Browsing CRX allowlist state received from Chrome Web Store
    when a user presses on &quot;Add to Chrome&quot; in Chrome Web Store.

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

<histogram
    name="Extensions.WebStoreInstall.NotAllowlistedInstalledWithFriction"
    enum="Boolean" expires_after="2025-12-01">
  <owner>jeffcyr@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Reports when a user with install friction dialog enabled tries to install an
    extension that is not included in the Safe Browsing CRX allowlist. 'True' if
    the install dialog is accepted or 'False' if the friction dialog or install
    dialog is canceled.

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

<histogram
    name="Extensions.WebStoreInstall.NotAllowlistedInstalledWithoutFriction"
    enum="Boolean" expires_after="2025-12-01">
  <owner>jeffcyr@google.com</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Reports when a user with install friction dialog disabled tries to install
    an extension that is not included in the Safe Browsing CRX allowlist. 'True'
    if the install dialog is accepted or 'False' if the install dialog is
    canceled.

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

<histogram name="Extensions.ZeroStatePromo.IphActionChromeWebStoreLink"
    enum="WebStoreLinkClicked" expires_after="2026-12-27">
  <owner>uwyiming@chromium.org</owner>
  <owner>cws-consumer-team@google.com</owner>
  <summary>
    Records that the users clicked a link or button in the Extension Zero State
    promo page. The value indicates the link that the user clicked.
  </summary>
</histogram>

<histogram
    name="Extensions.{ExtensionSource}ForceInstalledFailureManifestInvalidErrorDetail2"
    enum="ManifestInvalidError" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    The detailed reason why enterprise policy forced extensions had failed to
    install because fetched update manifest was invalid. Recorded for each
    forced extension that failed to install after 5 minutes with
    Extensions.ForceInstalledFailureReason2 equal to MANIFEST_INVALID.

    Replaced Extensions.ForceInstalledFailureManifestInvalidErrorDetail due to
    addition of new error BAD_APP_STATUS, and some of the errors that were
    MISSING_UPDATE_CHECK_TAG would now be reported as BAD_APP_STATUS.
  </summary>
  <token key="ExtensionSource">
    <variant name="OffStore_"
        summary="Detailed failure reason for OffStore extensions"/>
    <variant name="WebStore_"
        summary="Detailed failure reason for WebStore extensions"/>
  </token>
</histogram>

<histogram name="Extensions.{ExtensionSource}ForceInstalledFailureReason3"
    enum="ExtensionInstallationFailureReason" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    The reason why enterprise policy forced extensions were not installed
    {ExtensionSource}. Recorded for each forced extension that failed to install
    after 5 minutes. Recorded together with
    &quot;Extensions.ForceInstalledTimedOutCount&quot; histogram, but for every
    extension not installed at the moment.

    Replaced Extensions.ForceInstalledFailureReason2 because of reporting
    MANIFEST_INVALID instead of MANIFEST_FETCH_FAILED in case parsing update
    manifest failed with different reasons for the extensions.
  </summary>
  <token key="ExtensionSource">
    <variant name="" summary="for all extension sources"/>
    <variant name="OffStore_"
        summary="for extensions hosted off the Chrome Web Store"/>
    <variant name="WebStore_"
        summary="for extensions from the Chrome Web Store"/>
  </token>
</histogram>

<histogram
    name="Extensions.{ExtensionSource}ForceInstalled{ErrorType}HttpErrorCode2"
    enum="HttpResponseCode" expires_after="never">
<!-- expires-never: Monitoring outcomes of admin installed extensions -->

  <owner>giovax@google.com</owner>
  <owner>chromeos-commercial-chrome-apps-and-extensions@google.com</owner>
  <owner>managed-devices@google.com</owner>
  <summary>
    HTTP error code for the last retry attempt when for enterprise policy forced
    extensions failed with {ErrorType}. Recorded for each forced extension that
    failed to install after 5 minutes with
    Extensions.`OffStore,WebStore`_ForceInstalledFailureReason3 equal to
    {ErrorType} and a HTTP response code was received. HTTP response code is
    received only if there was no network error. Replaced
    Extensions.ForceInstalledHttpErrorCode because error codes are now reported
    only when network error code is HTTP_RESPONSE_CODE_FAILURE.
  </summary>
  <token key="ExtensionSource">
    <variant name=""
        summary="Aggregated detailed failure reason for any type of extension"/>
    <variant name="OffStore_"
        summary="Detailed failure reason for OffStore extensions"/>
    <variant name="WebStore_"
        summary="Detailed failure reason for WebStore extensions"/>
  </token>
  <token key="ErrorType">
    <variant name="" summary="CRX_FETCH_FAILED failure reason."/>
    <variant name="CrxFetchRetry" summary="CRX_DOWNLOAD_RETRY stage."/>
    <variant name="ManifestFetchFailed"
        summary="MANIFEST_FETCH_FAILED failure reason."/>
    <variant name="ManifestFetchRetry"
        summary="MANIFEST_DOWNLOAD_RETRY stage."/>
  </token>
</histogram>

<histogram name="Extensions.{OverrideType}.{TrustLevel}.{InstallMode}"
    enum="PolicyExtensionStatus" expires_after="2027-07-20">
  <owner>anunoy@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Reports the status (Enabled or Disabled) of policy-installed extensions that
    perform a {OverrideType} on {TrustLevel} devices where the extension is
    {InstallMode}.

    Logged once at startup during ExtensionService initialization.

    Note: This is only recorded on Windows and Mac. This is only emitted for
    regular user profiles, and is skipped for guest and incognito profiles.
  </summary>
  <token key="OverrideType">
    <variant name="BothOverride" summary="both DSE and NTP override"/>
    <variant name="DseOverride" summary="Default Search Engine override"/>
    <variant name="NtpOverride" summary="New Tab Page override"/>
  </token>
  <token key="TrustLevel">
    <variant name="HighTrust" summary="high trust management environment"/>
    <variant name="LowTrust" summary="low trust management environment"/>
  </token>
  <token key="InstallMode">
    <variant name="Forced" summary="forced"/>
    <variant name="Recommended" summary="recommended"/>
  </token>
</histogram>

<histogram name="GuestView.GuestViewCreated" enum="GuestViewType"
    expires_after="2027-02-14">
  <owner>mcnee@chromium.org</owner>
  <owner>wjmaclean@chromium.org</owner>
  <owner>src/components/guest_view/OWNERS</owner>
  <summary>
    Indicates the type of guest view created. Emitted once per guest view
    object.
  </summary>
</histogram>

</histograms>

</histogram-configuration>
