<!--
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 Android 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="ActivityIndexMismatchAssignmentState">
  <variant name=".NotReassigned" summary="not reassigned"/>
  <variant name=".Reassigned" summary="reassigned"/>
</variants>

<variants name="ActivityType">
  <variant name="" summary="activity"/>
  <variant name=".ChromeTabbedActivity" summary="ChromeTabbedActivity"/>
  <variant name=".CustomTabActivity" summary="CustomTabActivity"/>
  <variant name=".FirstRunActivity" summary="FirstRunActivity"/>
</variants>

<variants name="AndroidFeatureModuleName">
  <variant name="ar" summary="Augmented Reality Module"/>
  <variant name="cablev2_authenticator" summary="caBLEv2 Authenticator Module"/>
  <variant name="chime" summary="Chime Notification Module"/>
  <variant name="chrome" summary="Chrome Module"/>
  <variant name="dev_ui" summary="Developer UI Module"/>
  <variant name="feedv2" summary="Feed V2 Module"/>
  <variant name="google3" summary="Google3 Module"/>
  <variant name="image_editor" summary="Image Editor Module"/>
  <variant name="read_aloud_playback" summary="Read Aloud Playback Module"/>
  <variant name="stack_unwinder" summary="Stack Unwinder Module"/>
  <variant name="survey" summary="Survey Module"/>
  <variant name="tab_ui" summary="Tab Management Module"/>
  <variant name="test_dummy" summary="Test Dummy Module"/>
  <variant name="vr" summary="Virtual Reality Module"/>
</variants>

<variants name="AndroidNavigationOrSuggestionPrefetch">
  <variant name="NavigationPrefetch"
      summary="Recorded for prefetches where Chrome is relatively confident
               an omnibox navigation is about to occur (i.e. the user
               selected a search suggestion). These prefetches allow Chrome
               to kickstart the request without waiting until before unload
               handlers or other navigation pre-processing mechanisms in
               Chrome."/>
  <variant name="SuggestionPrefetch"
      summary="Recorded for prefetches where an omnibox suggestion from the
               suggestion server recommends a prefetch of a suggestion
               results page."/>
</variants>

<variants name="AndroidNavigationPrefetchOnly">
  <variant name="NavigationPrefetch"
      summary="Recorded for prefetches where Chrome is relatively confident
               an omnibox navigation is about to occur (i.e. the user
               selected a search suggestion). These prefetches allow Chrome
               to kickstart the request without waiting until before unload
               handlers or other navigation pre-processing mechanisms in
               Chrome."/>
</variants>

<variants name="AndroidSearchPrefetch">
  <variant name="SearchPrefetch"
      summary="Search Prefetch issues results page requests in response to
               either the suggestion server or the Omnibox client being
               confident that the user will navigate to a specific search
               suggestion. These requests are then served instantly to the
               user when the user navigates to a search suggestion with the
               same search terms. These requests can have mismatching query
               params as the Omnibox client updates the search navigation URL
               as the user types more into the Omnibox. The suggestion server
               issues prefetch hints along with the suggestion request.
               Additionally, the Omnibox client decides to prefetch when the
               user has chosen (or likely chosen) a search suggestion to
               initiate the search suggestion navigation earlier."/>
</variants>

<variants name="AwHttpCacheQuotaProfileType">
  <variant name="Default" summary="the default profile"/>
  <variant name="NonDefault" summary="a non-default profile"/>
</variants>

<variants name="ChildProcessConnectionMetricsBindingState">
  <variant name="ContentModerate"
      summary="Moderate binding excluding BindingManager bindings"/>
  <variant name="ContentVisible"
      summary="Visible binding excluding BindingManager bindings"/>
  <variant name="ContentWaived"
      summary="Waived binding excluding BindingManager bindings"/>
  <variant name="Moderate" summary="strongest binding of Moderate"/>
  <variant name="NotPerceptible"
      summary="strongest binding of Not Perceptible"/>
  <variant name="Strong" summary="strongest binding of Strong"/>
  <variant name="Visible" summary="strongest binding of Visible"/>
  <variant name="Waivable" summary="binding only from BindingManager"/>
  <variant name="Waived" summary="strongest binding of Waived"/>
</variants>

<variants name="CustomizationDelegate">
  <variant name="GService" summary="GService"/>
  <variant name="None" summary="None-valid"/>
  <variant name="Phenotype" summary="Phenotype/Heterodyne"/>
  <variant name="PreloadApk" summary="Preload-APK"/>
</variants>

<variants name="GridTabSwitcherAnimationType">
  <variant name="Expand" summary="Grid to Tab"/>
  <variant name="Shrink" summary="Tab to Grid"/>
</variants>

<variants name="GridTabSwitcherMessageType">
  <variant name="PriceAlertsMessageCard"
      summary="the promo message for price notifications"/>
  <variant name="PriceWelcomeMessageCard"
      summary="the message introducing price chips"/>
</variants>

<variants name="HandoffEnableTrigger">
  <variant name="TabSwitch" summary="First tab init and tab switch"/>
  <variant name="UrlNavigation" summary="URL navigation"/>
</variants>

<variants name="HubSwipeDirection">
  <variant name=".Left" summary="left"/>
  <variant name=".Right" summary="right"/>
</variants>

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

<variants name="MessageIdentifiers">
  <variant name=".AboutThisSite"/>
  <variant name=".AddToHomescreenIPH"/>
  <variant name=".AdsBlocked"/>
  <variant name=".ArCoreUpgrade"/>
  <variant name=".AutoDarkWebContents"/>
  <variant name=".CctAccountMismatchNotice"/>
  <variant name=".ChromeSurvey"/>
  <variant name=".CollaborationMemberAdded"/>
  <variant name=".CollaborationRemoved"/>
  <variant name=".ContextualTasksWindowResized"/>
  <variant name=".CvcSave"/>
  <variant name=".DefaultBrowserPromo"/>
  <variant name=".DesktopSiteGlobalDefaultOptOut"/>
  <variant name=".DesktopSiteGlobalOptIn"/>
  <variant name=".DesktopSiteWindowSetting"/>
  <variant name=".DownloadIncognitoWarning"/>
  <variant name=".DownloadProgress"/>
  <variant name=".EmailVerified"/>
  <variant name=".ExtensionDevTools"/>
  <variant name=".ExtensionsRequestAccess"/>
  <variant name=".ExternalNavigation"/>
  <variant name=".FramebustBlocked"/>
  <variant name=".GeneratedPasswordSaved"/>
  <variant name=".GlicWindowResized"/>
  <variant name=".ImmersivePlaybackConfirmation"/>
  <variant name=".InstallableAmbientBadge"/>
  <variant name=".IntranetRedirect"/>
  <variant name=".KnownInterceptionDisclosure"/>
  <variant name=".MerchantTrust"/>
  <variant name=".MultiInstanceCreationLimit"/>
  <variant name=".NearOomReduction"/>
  <variant name=".NotificationBlocked"/>
  <variant name=".OfferNotification"/>
  <variant name=".OsAdvancedProtectionSettingChangedMessage"/>
  <variant name=".PasswordSavedConfirmation"/>
  <variant name=".PermissionBlocked"/>
  <variant name=".PermissionPromptLoud"/>
  <variant name=".PermissionUpdate"/>
  <variant name=".PersonalContextFetchingFailure"/>
  <variant name=".PopupBlocked"/>
  <variant name=".PrivateInferenceNotice"/>
  <variant name=".PromptHatsCameraCustomInvitation"/>
  <variant name=".PromptHatsCameraGenericInvitation"/>
  <variant name=".PromptHatsLocationCustomInvitation"/>
  <variant name=".PromptHatsLocationGenericInvitation"/>
  <variant name=".PromptHatsMicrophoneCustomInvitation"/>
  <variant name=".PromptHatsMicrophoneGenericInvitation"/>
  <variant name=".ReaderMode"/>
  <variant name=".ReloadPage"/>
  <variant name=".SafetyTip"/>
  <variant name=".SaveAddressProfile"/>
  <variant name=".SaveCard"/>
  <variant name=".SaveCardFailure"/>
  <variant name=".SavePassword"/>
  <variant name=".SaveUpdateEntity"/>
  <variant name=".SendTabToSelf"/>
  <variant name=".SharedHighlighting"/>
  <variant name=".SigninSurvey"/>
  <variant name=".SyncError"/>
  <variant name=".TabNavigatedThroughCollaboration"/>
  <variant name=".TabRemovedThroughCollaboration"/>
  <variant name=".TailoredSecurityDisabled"/>
  <variant name=".TailoredSecurityEnabled"/>
  <variant name=".TrackingProtectionNotice"/>
  <variant name=".Translate"/>
  <variant name=".UpdateChromeForTabGroupShare"/>
  <variant name=".UpdatePassword"/>
  <variant name=".VirtualCardEnrollFailure"/>
  <variant name=".VrServicesUpgrade"/>
</variants>

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

<variants name="PageContentProvider_Consumer">
  <variant name="" summary="an external app"/>
  <variant name=".Aga" summary="the Google App (AGA)"/>
</variants>

<variants name="PageContentProvider_OutputFormat">
  <variant name="Proto" summary="Annotated page content proto format"/>
  <variant name="Text" summary="Text"/>
</variants>

<variants name="PageContentProvider_RequestType">
  <variant name="OpenFile"
      summary="call to openFile() that returns results as a FileDescriptor"/>
  <variant name="Query"
      summary="call to query() that returns results in a Cursor"/>
</variants>

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

<variants name="SearchActivityIntentOriginVariants">
  <variant name="" summary="overall"/>
  <variant name=".CustomTab" summary="Chrome Custom Tab"/>
  <variant name=".Hub" summary="Hub search feature"/>
  <variant name=".Launcher" summary="Launcher / Jump-start Omnibox"/>
  <variant name=".SearchWidget" summary="(old) Search widget"/>
  <variant name=".ShortcutsWidget" summary="(new) Shortcuts widget"/>
  <variant name=".WebSearch" summary="External Web Search request"/>
</variants>

<!-- LINT.ThenChange(//chrome/browser/ui/android/searchactivityutils/java/src/org/chromium/chrome/browser/ui/searchactivityutils/SearchActivityExtras.java:IntentOrigin) -->

<variants name="TabBottomSheetClient">
  <variant name="ContextualTasks" summary="Contextual Tasks"/>
  <variant name="Glic" summary="Glic"/>
</variants>

<variants name="TabLaunchType">
  <variant name="AppWidget" summary="tabs opened from an app widget"/>
  <variant name="BookmarkBarBackground"
      summary="tabs opened from the bookmark bar which are opened in the
               background"/>
  <variant name="BrowserActions"
      summary="tabs opened from browser actions context menu"/>
  <variant name="ChromeUI" summary="tabs opened via Chrome UI"/>
  <variant name="CollaborationBackgroundInGroup"
      summary="tabs opened from collaboration protection mechanism"/>
  <variant name="ExternalApp" summary="tabs opened from an external app"/>
  <variant name="HistoryNavigationBackground"
      summary="tabs opened in background from back/forward history navigation"/>
  <variant name="HistoryNavigationForeground"
      summary="tabs opened in foreground from back/forward history navigation"/>
  <variant name="LauncherShortcut"
      summary="tabs opened from launcher shortcut"/>
  <variant name="Link" summary="tabs opened from a link"/>
  <variant name="LinkCreatingNewWindow"
      summary="tabs opened from a link, creating a new window"/>
  <variant name="LongpressBackground"
      summary="tabs opened from the long press context menu which are opened
               in the background"/>
  <variant name="LongpressBackgroundInGroup"
      summary="tabs opened from long press context menu item 'Open in new tab
               in group'"/>
  <variant name="LongpressForeground"
      summary="tabs opened from the long press context menu"/>
  <variant name="LongpressForegroundInGroup"
      summary="For tabs which must be opened in the foreground in the same
               group as the parent"/>
  <variant name="LongpressIncognito"
      summary="tabs opened from the long press context menu item 'Open in
               Incognito Tab'"/>
  <variant name="NewIncognitoTab"
      summary="tabs opened by an external application launching a new Chrome
               incognito tab"/>
  <variant name="Omnibox" summary="tabs opened from omnibox"/>
  <variant name="ReadingList" summary="tabs opened from the reading list"/>
  <variant name="RecentTabs"
      summary="tabs opened in background from recent tabs"/>
  <variant name="RecentTabsForeground"
      summary="tabs opened in foreground from recent tabs"/>
  <variant name="Reparenting"
      summary="tabs opened in foreground from changing windows"/>
  <variant name="ReparentingBackground"
      summary="tabs opened in background from changing windows"/>
  <variant name="Restore" summary="tabs opened from restores"/>
  <variant name="RestoreTabsUI" summary="tabs opened from restore tabs UI"/>
  <variant name="SpeculativeBackgroundCreation"
      summary="tabs opened from CCT in the background"/>
  <variant name="StartSurface" summary="tabs opened from the start surface"/>
  <variant name="Startup" summary="tabs opened during the startup process"/>
  <variant name="SyncBackground"
      summary="tabs opened in the background by sync"/>
  <variant name="TabGroupUI" summary="tabs opened from Tab group UI"/>
  <variant name="TabListInterface"
      summary="tabs opened from tab list interface"/>
  <variant name="TabSwitcherUI" summary="tabs opened from Tab Switcher UI"/>
  <variant name="TipsNotifications"
      summary="tabs opened from Tips Notifications"/>
  <variant name="TypeUnknown"
      summary="tabs opened from a different case than one's listed"/>
  <variant name="Unset" summary="pre-warmed tabs without creation reason"/>
</variants>

<variants name="TabObjectType">
  <variant name=".MultiTab" summary="multi-tab"/>
  <variant name=".Tab" summary="tab"/>
  <variant name=".TabGroup" summary="tab group"/>
</variants>

<variants name="TaskType">
  <variant name="AuxiliarySearchDonate" summary="AuxiliarySearchDonate"/>
  <variant name="BackgroundSyncOneShot" summary="BackgroundSyncOneShot"/>
  <variant name="ChromeMinidumpUploading" summary="ChromeMinidumpUploading"/>
  <variant name="ChromeSignalsReporting" summary="ChromeSignalsReporting"/>
  <variant name="ComponentUpdate" summary="ComponentUpdate"/>
  <variant name="DeprecatedDownloadResumption"
      summary="DeprecatedDownloadResumption"/>
  <variant name="DeprecatedExploreSitesRefresh"
      summary="DeprecatedExploreSitesRefresh"/>
  <variant name="DownloadAutoResumption" summary="DownloadAutoResumption"/>
  <variant name="DownloadAutoResumptionAnyNetwork"
      summary="DownloadAutoResumptionAnyNetwork"/>
  <variant name="DownloadAutoResumptionUnmetered"
      summary="DownloadAutoResumptionUnmetered"/>
  <variant name="DownloadCleanup" summary="DownloadCleanup"/>
  <variant name="DownloadLater" summary="DownloadLater"/>
  <variant name="DownloadService" summary="DownloadService"/>
  <variant name="DwaUpload" summary="DwaUpload"/>
  <variant name="ExploreSitesRefresh" summary="ExploreSitesRefresh"/>
  <variant name="FeedRefresh" summary="FeedRefresh"/>
  <variant name="FeedV2Refresh" summary="FeedV2Refresh"/>
  <variant name="Gcm" summary="Gcm"/>
  <variant name="NotificationScheduler" summary="NotificationScheduler"/>
  <variant name="NotificationService" summary="NotificationService"/>
  <variant name="NotificationServicePreUnsubscribe"
      summary="NotificationServicePreUnsubscribe (not used)"/>
  <variant name="NotificationTrigger" summary="NotificationTrigger"/>
  <variant name="OfflinePages" summary="OfflinePages"/>
  <variant name="Omaha" summary="Omaha"/>
  <variant name="PeriodicBackgroundSyncChromeWakeup"
      summary="PeriodicBackgroundSyncChromeWakeup"/>
  <variant name="PumaUpload" summary="PumaUpload"/>
  <variant name="QueryTile" summary="QueryTile"/>
  <variant name="SafetyHub" summary="SafetyHub"/>
  <variant name="StructuredMetricsUpload" summary="StructuredMetricsUpload"/>
  <variant name="Test" summary="Test"/>
  <variant name="UkmUpload" summary="UkmUpload"/>
  <variant name="UmaUpload" summary="UmaUpload"/>
  <variant name="WebApkUpdate" summary="WebApkUpdate"/>
  <variant name="WebviewComponentUpdate" summary="WebviewComponentUpdate"/>
  <variant name="WebviewMinidumpUploading" summary="WebviewMinidumpUploading"/>
  <variant name="WebviewVariationsSeedFetch"
      summary="WebviewVariationsSeedFetch"/>
</variants>

<variants name="ThumbnailProvider_ClientType">
  <variant name="DownloadHome" summary="Download home"/>
  <variant name="NTPSnippets" summary="NTP snippets"/>
</variants>

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

<variants name="WebViewChromiumStartupMode">
  <variant name="" summary="all startupModes"/>
  <variant name=".AsyncButFullySync"
      summary="Startup was triggered on a background thread, the posted task
               was not run yet. Then another init call on the UI thread was
               started before the posted task and startup fully completed
               synchronously"/>
  <variant name=".FullyAsync"
      summary="Startup was triggered on a background thread and completed
               asynchronously"/>
  <variant name=".FullySync"
      summary="Startup was triggered on the UI thread and completed
               synchronously"/>
  <variant name=".PartialAsyncThenSync"
      summary="Startup was triggered on a background thread, some tasks ran
               asynchronously. Then another init call on the UI thread
               preempted the async run and startup completed synchronously"/>
  <variant name=".Unknown"
      summary="Something went wrong in our metrics. (The histogram may need
               to be re-reviewed.)"/>
</variants>

<!--  LINT.ThenChange(//android_webview/glue/java/src/com/android/webview/chromium/WebViewChromiumAwInit.java:WebViewChromiumStartupMode) -->

<histogram name="Android.ActivityStop.NumberOfPinnedTabsUsed" units="count"
    expires_after="2027-02-07">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@google.com</owner>
  <owner>clank-tab-dev@google.com</owner>
  <summary>
    Captures the number of regular and incognito pinned tabs used. Pinned tabs
    used are calculated by identifying the number of pinned tabs that were
    selected between ChromeTabbedActivity onResumeWithNative() and
    onStopWithNative(). This is recorded when onStopWithNative() is called.
  </summary>
</histogram>

<histogram name="Android.ActivityStop.NumberOfTabsUsed" units="count"
    expires_after="2027-02-07">
  <owner>gauravjj@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Captures the number of regular and incognito tabs used. Used tabs are
    calculated by identifying the number of tabs that were selected between
    ChromeTabbedActivity onResumeWithNative() and onStopWithNative(). This is
    recorded when onStopWithNative() is called by backgrounding the app or by
    opening another activity like SettingsActivity. If multiple instances are
    running, each instance will only track and record usage of tabs that it
    contains.
  </summary>
</histogram>

<histogram name="Android.ActivityStop.PercentageOfPinnedTabsUsed" units="%"
    expires_after="2027-02-07">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@google.com</owner>
  <owner>clank-tab-dev@google.com</owner>
  <summary>
    Captures the percentage of regular and incognito pinned tabs used. This is
    calculated by finding the ratio of the number of pinned tabs used to the
    total number of pinned tabs available between ChromeTabbedActivity
    onResumedWithNative and onStopWithNative. Total number of pinned tabs
    available is the sum of the pinned tab count when CTA is resumed and any new
    tabs that are pinned before CTA is stopped. This is recorded when
    ChromeTabbedActivity#onStopWithNative() is called.
  </summary>
</histogram>

<histogram name="Android.ActivityStop.PercentageOfTabsUsed" units="%"
    expires_after="2027-01-31">
  <owner>gauravjj@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Captures the percentage of regular and incognito tabs used. This is
    calculated by finding the ratio of the number of tabs used to the total
    number of tabs available between ChromeTabbedActivity onResumedWithNative
    and onStopWithNative. Total number of tabs available is the sum of the tab
    count when CTA is resumed and any new tabs that are opened before CTA is
    stopped. This is recorded when ChromeTabbedActivity#onStopWithNative() is
    called by backgrounding the app or by opening another activity like
    SettingsActivity. If multiple instances are running, each instance will only
    track and record usage of tabs that it contains.
  </summary>
</histogram>

<histogram name="Android.AdaptiveToolbarButton.Clicked"
    enum="AdaptiveToolbarButtonVariant" expires_after="2027-02-14">
  <owner>bttk@chromium.org</owner>
  <owner>chrome-segmentation-platform@google.com</owner>
  <summary>
    Reports the variant of the optional toolbar button that was clicked.
  </summary>
</histogram>

<histogram name="Android.AdaptiveToolbarButton.SessionVariant"
    enum="AdaptiveToolbarButtonVariant" expires_after="2027-02-14">
  <owner>bttk@chromium.org</owner>
  <owner>chrome-segmentation-platform@google.com</owner>
  <summary>
    Reports the variant of the optional toolbar button used during the session.
    The button is placed in the toolbar, and is clickable.
  </summary>
</histogram>

<histogram name="Android.AdaptiveToolbarButton.Settings.Changed"
    enum="AdaptiveToolbarRadioButtonState" expires_after="2027-01-17">
  <owner>shaktisahu@chromium.org</owner>
  <owner>chrome-segmentation-platform@google.com</owner>
  <summary>
    Records the newly selected radio button option for the adaptive toolbar
    button on the toolbar shortcut settings page. Recorded only when the
    selected radio button state is changed.
  </summary>
</histogram>

<histogram name="Android.AdaptiveToolbarButton.Settings.Startup"
    enum="AdaptiveToolbarRadioButtonState" expires_after="2027-02-14">
  <owner>shaktisahu@chromium.org</owner>
  <owner>chrome-segmentation-platform@google.com</owner>
  <summary>
    Records the currently selected radio button option for the adaptive toolbar
    button on the toolbar shortcut settings page. Recorded on startup, only if
    AdaptiveButtonInTopToolbarCustomization feature is enabled.
  </summary>
</histogram>

<histogram name="Android.AdaptiveToolbarButton.SettingsToggle.Changed"
    enum="BooleanEnabled" expires_after="2027-01-17">
  <owner>shaktisahu@chromium.org</owner>
  <owner>chrome-segmentation-platform@google.com</owner>
  <summary>
    Records whether the toolbar settings toggle button is on or off on the
    toolbar shortcut settings page after the user manually changes it. Recorded
    after the user explicitly taps on the toggle button.
  </summary>
</histogram>

<histogram name="Android.AdaptiveToolbarButton.SettingsToggle.Startup"
    enum="BooleanEnabled" expires_after="2027-01-17">
  <owner>shaktisahu@chromium.org</owner>
  <owner>chrome-segmentation-platform@google.com</owner>
  <summary>
    Records whether the toolbar settings toggle button is on or off on the
    toolbar shortcut settings page. Recorded on startup.
  </summary>
</histogram>

<histogram name="Android.AdaptiveToolbarButton.Variant.OnPageLoad"
    enum="AdaptiveToolbarButtonVariant" expires_after="2027-01-03">
  <owner>shaktisahu@chromium.org</owner>
  <owner>chrome-segmentation-platform@google.com</owner>
  <summary>
    Reports the variant of the optional toolbar button that was shown after a
    page load. Reports only when a page is loaded or a tab is switched. Reports
    only when the contextual page actions feature is enabled and after all the
    action providers have responded or the request has timed out. Only reported
    for pages in the regular profile.
  </summary>
</histogram>

<histogram name="Android.AdaptiveToolbarButton.Variant.OnStartNavigation"
    enum="AdaptiveToolbarButtonVariant" expires_after="2027-01-17">
  <owner>shaktisahu@chromium.org</owner>
  <owner>chrome-segmentation-platform@google.com</owner>
  <summary>
    Reports the variant of the optional toolbar button being shown during the
    start of a new navigation. Reports whenever
    TabObserver.onDidStartNavigationInPrimaryMainFrame() is called which then
    records the button variant currently being shown on the toolbar. Recorded
    for both regular and incognito profiles.
  </summary>
</histogram>

<histogram name="Android.AppLaunchDrawBlocker.ActiveTabAvailable" units="ms"
    expires_after="2026-12-31">
  <owner>mfiaz@google.com</owner>
  <owner>clank-tab-dev@google.com</owner>
  <summary>
    Records the time taken for ActiveTabAvailable() to be called after the app
    is launched.
  </summary>
</histogram>

<histogram
    name="Android.ApplicationState.TimeInBackgroundBeforeForegroundedAgain"
    units="ms" expires_after="2027-02-07">
  <owner>lizeb@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Record the time the application spent in the background in-between two
    foregrounded periods, meaning that when the application is started in
    background, then foregrounded, no data points are recorded. This is recorded
    at the end of each such background interval. Saturates at 1h.
  </summary>
</histogram>

<histogram name="Android.AppNotificationStatus" enum="NotificationAppStatus"
    expires_after="never">
<!-- expires-never: Indicates whether Chrome has notification permission. -->

  <owner>dtrainor@chromium.org</owner>
  <owner>peter@chromium.org</owner>
  <summary>
    Records whether notifications are enabled for Chrome, as the Android app,
    every time metrics are logged.
  </summary>
</histogram>

<histogram name="Android.AppRatingPrompt.InteractionDuration" units="ms"
    expires_after="2027-02-07">
  <owner>agazal@google.com</owner>
  <owner>jhimawan@google.com</owner>
  <owner>twellington@google.com</owner>
  <summary>
    The duration a user spends in the Play Store In-App Review flow. Measured
    from the moment the review UI is launched until the flow finishes, excluding
    the initial silent API request latency. Used to proxy user engagement
    (dismissal vs. rating vs. review). Recorded only when the Play Store API
    returns a success status.
  </summary>
</histogram>

<histogram name="Android.AppRatingPrompt.ShowAttempted" enum="Boolean"
    expires_after="2027-02-07">
  <owner>agazal@google.com</owner>
  <owner>jhimawan@google.com</owner>
  <owner>twellington@google.com</owner>
  <summary>
    Records that Chrome attempted to launch the App Rating Prompt using the Play
    Store In-App Review API. This acts as the denominator for funnel analysis,
    ensuring we can track silent failures where the Play Store API never returns
    a callback. Recorded immediately before invoking the Play Store API.
  </summary>
</histogram>

<histogram name="Android.AppRatingPrompt.Status" enum="AppRatingPromptStatus"
    expires_after="2027-02-07">
  <owner>agazal@google.com</owner>
  <owner>jhimawan@google.com</owner>
  <owner>twellington@google.com</owner>
  <summary>
    Records the outcome of attempting to show the App Rating Prompt using the
    Play Store In-App Review API. This indicates whether the flow was
    successfully requested or failed due to a technical error (e.g. Play Store
    not found, internal error). Recorded on every API callback.
  </summary>
</histogram>

<histogram name="Android.AssistContent.AttachedUrl" enum="BooleanSuccess"
    expires_after="2027-02-07">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <summary>
    Records whether the current web page URI was attached to an AssistContent
    object when assistant was invoked while ChromeActivity was in the
    foreground.
  </summary>
</histogram>

<histogram name="Android.AssistContent.IsEnterpriseInfoCached" enum="Boolean"
    expires_after="2027-02-07">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <summary>
    Records whether enterprise info was cached while trying to populate an
    AssistContent when assistant was invoked while ChromeActivity was in the
    foreground.

    If false we don't populate AssistContent.

    Only recorded when the &quot;PageContentProvider&quot; feature is enabled
    and assistant is invoked while viewing a web page.

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

<histogram name="Android.AssistContent.StructuredDataAttachedSuccess.Pdf"
    enum="BooleanSuccess" expires_after="2027-02-07">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <summary>
    Records whether PDF structured data was successfully attached to an
    AssistContent object when assistant was invoked while ChromeActivity was in
    the foreground.

    Only recorded when the &quot;AndroidPdfAssistContent&quot; feature is
    enabled and assistant is invoked while viewing a PDF.
  </summary>
</histogram>

<histogram name="Android.AssistContent.StructuredDataAttachedSuccess.WebPage"
    enum="BooleanSuccess" expires_after="2026-10-04">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <summary>
    Records whether web page structured data was successfully attached to an
    AssistContent object when assistant was invoked while ChromeActivity was in
    the foreground.

    Only recorded when the &quot;PageContentProvider&quot; feature is enabled
    and assistant is invoked while viewing a web page.

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

<histogram name="Android.AssistContent.WebPage" units="BooleanSuccess"
    expires_after="2027-02-07">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <summary>
    Records whether a JSON string with ContentProvider URIs was attached to an
    AssistContent object when assistant was invoked while ChromeActivity was in
    the foreground.

    Recorded when an assistant is invoked while viewing a non-incognito http/s
    web page.
  </summary>
</histogram>

<histogram
    name="Android.AssistContent.WebPageContentProvider.Events.{RequestType}.{Format}{Consumer}"
    enum="WebPageContentProviderEvent" expires_after="2027-05-25">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <owner>tivi@google.com</owner>
  <summary>
    Records events related to WebPageContentProvider as it generates a URI for
    {Consumer} and as it handles queries from said external app.

    Recorded when {Consumer} requests {Format} with a {RequestType}.
  </summary>
  <token key="RequestType" variants="PageContentProvider_RequestType"/>
  <token key="Format" variants="PageContentProvider_OutputFormat"/>
  <token key="Consumer" variants="PageContentProvider_Consumer"/>
</histogram>

<histogram name="Android.AssistContent.WebPageContentProvider.Events{Consumer}"
    enum="WebPageContentProviderEvent" expires_after="2027-05-25">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <owner>tivi@google.com</owner>
  <summary>
    Records events related to WebPageContentProvider as it generates a URI for
    {Consumer} and as it handles queries from said external app.
  </summary>
  <token key="Consumer" variants="PageContentProvider_Consumer"/>
</histogram>

<histogram
    name="Android.AssistContent.WebPageContentProvider.GetAssistantPackageResult"
    enum="BooleanSuccess" expires_after="2027-05-25">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <summary>
    Records whether we were able to get the package name of the default
    assistant app from Android's settings. Recorded when AssistContent is
    requested for web pages.

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

<histogram
    name="Android.AssistContent.WebPageContentProvider.Latency.CreateToExtractionStart.{RequestType}.{Format}{Consumer}"
    units="ms" expires_after="2027-05-25">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <owner>tivi@google.com</owner>
  <summary>
    Records the amount of time passed between sending a web page content
    provider URI to {Consumer} and receiving a query from {Consumer} with the
    same URI (this starts a content extraction task).
  </summary>
  <token key="RequestType" variants="PageContentProvider_RequestType"/>
  <token key="Format" variants="PageContentProvider_OutputFormat"/>
  <token key="Consumer" variants="PageContentProvider_Consumer"/>
</histogram>

<histogram
    name="Android.AssistContent.WebPageContentProvider.Latency.ExtractionStartToEnd.{RequestType}.{Format}{Consumer}"
    units="ms" expires_after="2027-05-25">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <owner>tivi@google.com</owner>
  <summary>
    Records the amount of time passed while extracting a web page's contents for
    {Consumer}.
  </summary>
  <token key="RequestType" variants="PageContentProvider_RequestType"/>
  <token key="Format" variants="PageContentProvider_OutputFormat"/>
  <token key="Consumer" variants="PageContentProvider_Consumer"/>
</histogram>

<histogram
    name="Android.AssistContent.WebPageContentProvider.Latency.TotalLatency.{RequestType}.{Format}{Consumer}"
    units="ms" expires_after="2027-05-25">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <owner>tivi@google.com</owner>
  <summary>
    Records the total amount of time passed between sending a web page content
    provider URI to {Consumer} and it receiving the web page's contents.
  </summary>
  <token key="RequestType" variants="PageContentProvider_RequestType"/>
  <token key="Format" variants="PageContentProvider_OutputFormat"/>
  <token key="Consumer" variants="PageContentProvider_Consumer"/>
</histogram>

<histogram
    name="Android.AssistContent.WebPageContentProvider.TargetPackageProvided"
    enum="Boolean" expires_after="2027-05-25">
  <owner>salg@google.com</owner>
  <owner>tivi@google.com</owner>
  <summary>
    Records whether the targetPackage argument is non-null when AssistContent is
    requested for web pages. A false value means the default assistant package
    will be used.
  </summary>
</histogram>

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

<histogram name="Android.Automotive.DeviceLockDialogAction.{Source}"
    enum="DeviceLockDialogAction" expires_after="2026-07-01">
  <owner>clhager@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Records action user took when presented with the device lock explainer
    dialog (ex: button clicked) during a {Source} flow. Other actions such as
    clicking back on the automotive toolbar or clicking outside of the dialog to
    escape it can be calculated by subtracting button clicks from number of
    times the dialog was shown.
  </summary>
  <token key="Source">
    <variant name="AccountPicker"/>
    <variant name="Autofill"/>
    <variant name="FirstRun"/>
    <variant name="FullscreenSignin"/>
    <variant name="SyncConsent" summary="sync consent screen (Deprecated)"/>
  </token>
</histogram>

<!-- LINT.ThenChange(//components/browser_ui/device_lock/android/java/src/org/chromium/components/browser_ui/device_lock/DeviceLockActivityLauncher.java:DeviceLockSource) -->

<histogram name="Android.Automotive.DeviceLockOutcome" enum="Boolean"
    expires_after="2026-07-01">
  <owner>twellington@chromium.org</owner>
  <owner>clhager@google.com</owner>
  <summary>
    Records whether the user successfully passed the device lock challenge after
    having seen the automotive device lock explainer dialog.
  </summary>
</histogram>

<histogram name="Android.Automotive.DeviceLockRemovalDialogEvent"
    enum="MissingDeviceLockDialogEvent" expires_after="2026-07-01">
  <owner>twellington@chromium.org</owner>
  <owner>clhager@google.com</owner>
  <summary>
    Records an event whenever the missing device lock dialog is shown to the
    user or the user takes an action on the dialog.
  </summary>
</histogram>

<histogram name="Android.Automotive.DeviceLockSet" enum="Boolean"
    expires_after="2026-07-01">
  <owner>twellington@chromium.org</owner>
  <owner>clhager@google.com</owner>
  <summary>
    Records whether the automotive device has a device lock set when Chrome is
    resumed.
  </summary>
</histogram>

<histogram name="Android.Automotive.UiScalingFactor" units="%"
    expires_after="2025-11-23">
  <owner>twellington@chromium.org</owner>
  <owner>clhager@google.com</owner>
  <summary>
    Records the scaling factor applied to the UI on an automotive device. This
    value is recorded once per activity start as a percentage, with 134% being
    the default scale-up.
  </summary>
</histogram>

<histogram name="Android.BackgroundRestrictions.IsBackgroundRestricted"
    enum="Boolean" expires_after="2023-04-30">
  <owner>shaktisahu@chromium.org</owner>
  <owner>chrome-segmentation-platform@google.com</owner>
  <summary>
    Records whether user has enabled background restriction for chrome. Recorded
    after native initialization in browser process.
  </summary>
</histogram>

<histogram name="Android.BackgroundRestrictions.StandbyBucket"
    enum="StandbyBucket" expires_after="2023-04-30">
  <owner>shaktisahu@chromium.org</owner>
  <owner>chrome-segmentation-platform@google.com</owner>
  <summary>
    Records the standby bucket (UsageStatsManager.getAppStandbyBucket) in which
    chrome is currently placed by android. Recorded after native initialization
    in browser process.
  </summary>
</histogram>

<histogram
    name="Android.BackgroundRestrictions.StandbyBucket.WithUserRestriction"
    enum="StandbyBucket" expires_after="2023-04-30">
  <owner>shaktisahu@chromium.org</owner>
  <owner>chrome-segmentation-platform@google.com</owner>
  <summary>
    Records the standby bucket (UsageStatsManager.getAppStandbyBucket) in which
    chrome is currently placed by android, when user has explicitly enabled
    background restrictions. Recorded after native initialization in browser
    process.
  </summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.ExactTaskCreated"
    enum="BackgroundTaskId" expires_after="2024-10-05">
  <owner>nator@chromium.org</owner>
  <owner>knollr@chromium.org</owner>
  <owner>shaktisahu@chromium.org</owner>
  <summary>
    Records that an exact task has been created. Cached when the task is
    scheduled.

    Cached to SharedPreferences to be recorded in the next ChromeActivity start
    instead of recorded immediately on background.
  </summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskCanceled"
    enum="BackgroundTaskId" expires_after="2025-06-08">
  <owner>nyquist@chromium.org</owner>
  <owner>shaktisahu@chromium.org</owner>
  <summary>
    Records that a specific background task has been canceled.

    Cached to SharedPreferences to be recorded in the next ChromeActivity start
    instead of recorded immediately on background.
  </summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskCreated.WithExpiration"
    enum="BackgroundTaskId" expires_after="2024-10-05">
  <owner>nator@chromium.org</owner>
  <owner>knollr@chromium.org</owner>
  <owner>shaktisahu@chromium.org</owner>
  <summary>
    Records that a specific task has been created with an expiration deadline.
    Cached when the task is scheduled.

    Cached to SharedPreferences to be recorded in the next ChromeActivity start
    instead of recorded immediately on background.
  </summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskCreated.WithoutExpiration"
    enum="BackgroundTaskId" expires_after="2024-10-05">
  <owner>nator@chromium.org</owner>
  <owner>knollr@chromium.org</owner>
  <owner>shaktisahu@chromium.org</owner>
  <summary>
    Records that a specific task has been created without the expiration feature
    activated. Cached when the task is scheduled.

    Cached to SharedPreferences to be recorded in the next ChromeActivity start
    instead of recorded immediately on background.
  </summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskExpired"
    enum="BackgroundTaskId" expires_after="2025-06-08">
  <owner>nator@chromium.org</owner>
  <owner>knollr@chromium.org</owner>
  <owner>shaktisahu@chromium.org</owner>
  <summary>
    Records that a specific background task has expired. Cached before the task
    is to be started.

    Cached to SharedPreferences to be recorded in the next ChromeActivity start
    instead of recorded immediately on background.
  </summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskFinished.{TaskType}"
    units="ms" expires_after="2027-02-07">
  <owner>nyquist@chromium.org</owner>
  <owner>shaktisahu@chromium.org</owner>
  <summary>
    Records the time (uptimeMillis) taken by a background task of type
    {TaskType}. Recorded when the task finished callback is invoked.

    Differs from other Android.BackgroundTaskScheduler histograms in that it is
    recorded immediately in background, instead of in the next time Chrome is
    run in foreground, so cannot be directly compared.
  </summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskFinished2"
    enum="BackgroundTaskId" expires_after="2025-07-06">
  <owner>hnakashima@chromium.org</owner>
  <owner>smaier@chromium.org</owner>
  <summary>
    Records that a specific background task has finished.

    Cached to SharedPreferences to be recorded in the next ChromeActivity start
    instead of recorded immediately on background.

    Differs from &quot;TaskFinished&quot; in that it is recorded in the same
    session as &quot;TaskStarted&quot;, making them comparable for success rate
    calculations and ensuring they are in the same experiment group (which is
    not the case for &quot;TaskFinished&quot;).
  </summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskLoadedNative"
    enum="BackgroundTaskId" expires_after="2025-06-22">
  <owner>nyquist@chromium.org</owner>
  <owner>shaktisahu@chromium.org</owner>
  <summary>
    Records that a task extending a NativeBackgroundTask started loading the
    native portion of Chrome.

    Cached to SharedPreferences to be recorded in the next ChromeActivity start
    instead of recorded immediately on background.
  </summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskScheduled.Failure"
    enum="BackgroundTaskId" expires_after="2025-06-08">
  <owner>nyquist@chromium.org</owner>
  <owner>shaktisahu@chromium.org</owner>
  <summary>
    Records that a specific background task has failed to be scheduled.

    Cached to SharedPreferences to be recorded in the next ChromeActivity start
    instead of recorded immediately on background.
  </summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskScheduled.Success"
    enum="BackgroundTaskId" expires_after="2024-10-05">
  <owner>nyquist@chromium.org</owner>
  <owner>shaktisahu@chromium.org</owner>
  <summary>
    Records that a specific background task has been successfully scheduled.

    Cached to SharedPreferences to be recorded in the next ChromeActivity start
    instead of recorded immediately on background.
  </summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskStarted"
    enum="BackgroundTaskId" expires_after="2025-06-22">
  <owner>nyquist@chromium.org</owner>
  <owner>shaktisahu@chromium.org</owner>
  <summary>
    Records that a specific background task has been started.

    Cached to SharedPreferences to be recorded in the next ChromeActivity start
    instead of recorded immediately on background.
  </summary>
</histogram>

<histogram name="Android.BackgroundTaskScheduler.TaskStopped"
    enum="BackgroundTaskId" expires_after="2025-06-08">
  <owner>nyquist@chromium.org</owner>
  <owner>shaktisahu@chromium.org</owner>
  <summary>
    Records that a specific background task has been stopped by Background Task
    Scheduler before it was able to complete itself.

    Cached to SharedPreferences to be recorded in the next ChromeActivity start
    instead of recorded immediately on background.
  </summary>
</histogram>

<histogram name="Android.BackPress.Backfalsing2" enum="NavigationDirection"
    expires_after="2026-08-09">
  <owner>eleanorlee@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Recorded when a user navigates to a URL by a navigation gesture or a
    navigation button and then a backfalsing event happens. Recorded for both
    swipes and clicks in both 3-button mode and gesture navigation mode.
  </summary>
</histogram>

<histogram name="Android.BackPress.Failure" enum="BackPressConsumer"
    expires_after="2027-01-17">
  <owner>adelm@google.com</owner>
  <owner>mschillaci@google.com</owner>
  <owner>twellington@google.com</owner>
  <owner>src/chrome/browser/back_press/android/OWNERS</owner>
  <summary>
    Recorded when the user invokes a back navigation only if the handler failed
    to operate as expected, (e.g. it does nothing). May be recorded multiple
    times for a single back press event if there are multiple failed handlers.
    Android only.
  </summary>
</histogram>

<histogram name="Android.BackPress.IncorrectEdgeSwipe" enum="SwipeEdge"
    expires_after="2026-10-25">
  <owner>eleanorlee@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records any incorrect edge swipes the user tries to perform. Recorded in
    3-button mode when the user tries to swipe from the forward edge and the
    page is not navigable, such as when the forward stack is empty. Android
    only.
  </summary>
</histogram>

<histogram name="Android.BackPress.IncorrectEdgeSwipe.CountChained"
    units="count" expires_after="2026-04-05">
  <owner>eleanorlee@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records the consecutive number of incorrect edge swipes the user tries to
    perform if the number of incorrect edge swipes are greater than zero.
    Recorded in 3-button mode when the user makes a correct edge swipe, which is
    when the user swipes from either the right edge or the left edge and the
    page is navigable. Android only.
  </summary>
</histogram>

<histogram name="Android.BackPress.Intercept{Direction}"
    enum="BackPressConsumer" expires_after="2027-01-03">
  <owner>mschillaci@google.com</owner>
  <owner>adelm@google.com</owner>
  <owner>src/chrome/browser/back_press/android/OWNERS</owner>
  <summary>
    Recorded when a specific feature intercepted the system's back press
    gesture{Direction}.
  </summary>
  <token key="Direction">
    <variant name="" summary=""/>
    <variant name=".LeftEdge" summary="from left edge in U+."/>
    <variant name=".RightEdge" summary="from right edge in U+."/>
  </token>
</histogram>

<histogram name="Android.BackPress.MinimizeAppAndCloseTab"
    enum="MinimizeAppAndCloseTabType" expires_after="2026-11-29">
  <owner>mschillaci@google.com</owner>
  <owner>adelm@google.com</owner>
  <owner>src/chrome/browser/back_press/android/OWNERS</owner>
  <summary>
    Records that the back press causes the app to be minimized or the current
    tab to be closed.
  </summary>
</histogram>

<histogram name="Android.BackPress.MinimizeAppAndCloseTab.CustomTab.{Task}"
    enum="MinimizeAppAndCloseTabType" expires_after="2026-12-06">
  <owner>mschillaci@google.com</owner>
  <owner>adelm@google.com</owner>
  <owner>src/chrome/browser/back_press/android/OWNERS</owner>
  <summary>
    Records that the custom tabs back press causes the app to be minimized or
    the current tab to be closed {Task}.
  </summary>
  <token key="Task">
    <variant name="SameTask" summary="custom tab is from the same task."/>
    <variant name="SeparateTask" summary="custom tab is from a separate task."/>
  </token>
</histogram>

<histogram name="Android.BackPress.StrictBackfalsing"
    enum="NavigationDirection" expires_after="2027-01-03">
  <owner>eleanorlee@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Another version of Android.BackPress.Backfalsing2 with strict definition of
    &quot;Backfalsing&quot;. Recorded when a user navigates to a URL by a
    navigation gesture or a navigation button and then a backfalsing event
    happens within **3 seconds**. Recorded for both swipes and clicks in both
    3-button mode and gesture navigation mode.
  </summary>
</histogram>

<histogram name="Android.BackPress.SwipeEdge{Type}" enum="SwipeEdge"
    expires_after="2027-02-07">
  <owner>mschillaci@google.com</owner>
  <owner>adelm@google.com</owner>
  <owner>src/chrome/browser/back_press/android/OWNERS</owner>
  <summary>
    Record the edge from which the gesture is swiped from {Type}.
  </summary>
  <token key="Type">
    <variant name="" summary=""/>
    <variant name=".TabHistoryNavigation"
        summary="when a back gesture triggers a tab history navigation."/>
  </token>
</histogram>

<histogram name="Android.BackPress.TabClosureType" enum="BackPressTabCloseType"
    expires_after="2026-11-29">
  <owner>mschillaci@google.com</owner>
  <owner>adelm@google.com</owner>
  <owner>src/chrome/browser/back_press/android/OWNERS</owner>
  <summary>
    Record the type of tab closure caused by back press. Record when tab is
    about to be closed.
  </summary>
</histogram>

<histogram name="Android.BindingManger.ConnectionsDroppedDueToMaxSize"
    units="connections" expires_after="2026-11-15">
  <owner>ckitagawa@chromium.org</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the total number of BindingManager bindings to
    ChildProcessConnections that were dropped due to the BindingManager reaching
    the connection limit. This value accumulates while the app is running and is
    emitted upong the app being backgrounded at which time the counter is reset.
  </summary>
</histogram>

<histogram name="Android.BookmarkAllTabs.Result"
    enum="AndroidBookmarkAllTabsResult" expires_after="2027-01-26">
  <owner>mklw@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the result of the 'Bookmark all tabs' action from either the tab
    strip context menu or keyboard shortcut. Recorded when the user activates
    the action. We track this to monitor the failure rate of this action and the
    reason of failure (null tab model, empty tab list).
  </summary>
</histogram>

<histogram name="Android.BottomBar.Aim.IneligibilityReason"
    enum="AndroidBottomBarAimIneligibilityReason" expires_after="2027-05-26">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <owner>polardz@google.com</owner>
  <summary>
    Records the reason why AI Mode was evaluated and determined to be ineligible
    or not shown in the Android Bottom Bar.
  </summary>
</histogram>

<histogram name="Android.BottomBar.Aim.LaunchResult"
    enum="AndroidBottomBarAimLaunchResult" expires_after="2027-05-26">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <owner>polardz@google.com</owner>
  <summary>
    Records the result of attempting to launch AI Mode when the AI Mode button
    is pressed in the Android Bottom Bar.
  </summary>
</histogram>

<histogram name="Android.BottomBar.ExtraAction.CandidateDecisionTime"
    units="ms" expires_after="2027-05-26">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <owner>polardz@google.com</owner>
  <summary>
    Records the time taken to evaluate and decide the candidate extra action
    (GLIC or AI Mode) in the bottom bar. This includes the time spent in
    GlicEnabling and geofencing checks. Recorded when the candidate extra action
    resolution is evaluated.
  </summary>
</histogram>

<histogram name="Android.BottomBar.ExtraAction.CandidateResolved"
    enum="AndroidBottomBarCandidateAction" expires_after="2027-05-26">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <owner>polardz@google.com</owner>
  <summary>
    Records the candidate action resolved for the Android Bottom Bar's extra
    button container slot (None, Glic, or Aim). Recorded when the candidate
    resolution is computed.
  </summary>
</histogram>

<histogram name="Android.BottomBar.Glic.ButtonStateOnClick"
    enum="AndroidBottomBarGlicButtonState" expires_after="2027-05-26">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <owner>polardz@google.com</owner>
  <summary>
    Records the visual state of the Glic button in the bottom bar at the moment
    the user clicks it. Recorded only for the bottom bar entry point.
  </summary>
</histogram>

<histogram name="Android.BottomBar.Glic.ConvoResult"
    enum="AndroidBottomBarGlicConvoResult" expires_after="2027-05-26">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <owner>polardz@google.com</owner>
  <summary>
    Recorded when the Glic button is clicked in the bottom bar and toggles the
    panel. Tracks whether the panel was opened or closed. Recorded only for the
    bottom bar entry point.
  </summary>
</histogram>

<histogram name="Android.BottomBar.Glic.IneligibilityReason"
    enum="AndroidBottomBarGlicIneligibilityReason" expires_after="2027-05-26">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <owner>polardz@google.com</owner>
  <summary>
    Records the reason why Glic was evaluated and determined to be ineligible or
    not shown in the Android Bottom Bar.
  </summary>
</histogram>

<histogram name="Android.BottomBar.GlicTimeToAppearSinceBottomBarShown"
    units="ms" expires_after="2027-05-26">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <owner>polardz@google.com</owner>
  <summary>
    Records the time elapsed from when the bottom bar becomes visible to when
    the GLIC button actually appears (transitions from hidden to visible).
    Recorded when the GLIC button becomes visible if the bottom bar was already
    shown. Recorded only the first time it appears after the bottom bar is
    shown.
  </summary>
</histogram>

<histogram name="Android.BottomBar.IPH.{IPHType}.Event"
    enum="AndroidBottomBarIphEvent" expires_after="2027-05-26">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <owner>polardz@google.com</owner>
  <summary>
    Recorded when the {IPHType} In-Product Help (IPH) in the Android Bottom Bar
    triggers (is shown or dismissed).
  </summary>
<!-- LINT.IfChange(AndroidBottomBarIphFeature) -->

  <token key="IPHType">
    <variant name="Aim" summary="AI Mode button"/>
    <variant name="Glic" summary="Gemini button"/>
    <variant name="NewTab" summary="New Tab button"/>
  </token>
<!-- LINT.ThenChange(//chrome/browser/ui/android/bottombar/java/src/org/chromium/chrome/browser/ui/bottombar/BottomBarMetrics.java:AndroidBottomBarIphFeature) -->

</histogram>

<histogram name="Android.BottomBar.Promo.Event"
    enum="AndroidBottomBarPromoEvent" expires_after="2027-05-26">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <owner>polardz@google.com</owner>
  <summary>
    Recorded when the introductory promo dialog for the Android Bottom Bar is
    shown, accepted, or dismissed.
  </summary>
</histogram>

<histogram name="Android.BottomControlsStacker.NumberOfVisibleLayers"
    units="layers" expires_after="2027-10-01">
  <owner>pnoland@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records the number of visible bottom controls layers. Recorded when a
    navigation finishes in the main frame of the active tab.

    Note: There is a recording gap between: 2026.01-2026.08.
  </summary>
</histogram>

<histogram
    name="Android.BottomControlsStacker.PercentageOfWindowUsedByBottomControlsAtMaxHeight"
    units="%" expires_after="2027-10-01">
  <owner>pnoland@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records the percentage of the window's total height used by the bottom
    controls stack at full height. This is the maximum % the window is obscured
    by the bottom controls, which can ordinarily be scrolled off. Recorded when
    a navigation finishes in the main frame of the active tab.
  </summary>
</histogram>

<histogram
    name="Android.BottomControlsStacker.PercentageOfWindowUsedByBottomControlsAtMinHeight"
    units="%" expires_after="2027-10-01">
  <owner>pnoland@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records the percentage of the window's total height used by the bottom
    controls stack at its minimum height. This is the minimum % the window is
    obscured by the bottom controls, which cannot ordinarily be scrolled off.
    Recorded when a navigation finishes in the main frame of the active tab.
  </summary>
</histogram>

<histogram name="Android.BottomSheet.Closed"
    enum="BottomSheet.StateChangeReason" expires_after="2027-08-01">
  <owner>hitarthkothari@google.com</owner>
  <owner>mfiaz@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <summary>
    Recorded every time a Bottom Sheet is closed or collapsed back to the
    peeking state. Records the specific reason for closure (e.g. swipe, back
    press, tap scrim, close button).
  </summary>
</histogram>

<histogram name="Android.BottomSheet.Shown" enum="Boolean"
    expires_after="2027-08-01">
  <owner>hitarthkothari@google.com</owner>
  <owner>mfiaz@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <summary>
    Recorded every time any Bottom Sheet is opened and expanded beyond the
    peeking state. This includes all types of bottom sheet content without
    differentiation.
  </summary>
</histogram>

<histogram name="Android.BrowserControls.LockedByTabState" enum="Boolean"
    expires_after="2026-09-13">
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records whether browser controls is forced to be visible by the tab state
    when controls visibility is updated. Recorded at
    TabStateBrowserControlsVisibilityDelegate.enableHidingBrowserControls().
  </summary>
</histogram>

<histogram name="Android.BrowserControls.OutstandingChangedOnFinish"
    enum="BooleanChanged" expires_after="2027-10-01">
  <owner>skym@chromium.org</owner>
  <owner>pnoland@chromium.org</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records if the outstanding navigations set changed when a navigation is
    finished. This means the navigation id was not previously tracked, either
    because it never started or it already finished once. When things are
    working correctly, this should always be true. There are known tests and
    likely some real scenarios that currently violate this.
  </summary>
</histogram>

<histogram name="Android.BrowserControls.OutstandingChangedOnStart"
    enum="BooleanChanged" expires_after="2027-10-01">
  <owner>skym@chromium.org</owner>
  <owner>pnoland@chromium.org</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records if the outstanding navigations set changed when a navigation is
    started. This means the navigation id was previously tracked and then the
    same id was claimed to be started again. If things are working correctly,
    this metric should always be true. No existing violations of this are
    currently known.

    Note: There is a recording gap between: 2026.07-2026.08.
  </summary>
</histogram>

<histogram name="Android.BrowserControls.OutstandingNavigationsOnFinish"
    units="navigations" expires_after="2027-10-01">
  <owner>skym@chromium.org</owner>
  <owner>pnoland@chromium.org</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records the number of outstanding navigations that are blocking the browser
    controls from being scrollable. Recorded when a navigation completes.
    Typically the value should be 0 or maybe 1 for a very short amount of time.
    Large numbers here indicate there's a bug that's keeping the controls
    visible.
  </summary>
</histogram>

<histogram name="Android.BrowserControls.RenderDrivenShowConstraint"
    enum="Boolean" expires_after="2026-10-04">
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records when browser controls constraint is set to &quot;SHOWN&quot;,
    whether the render is capable to drive the browser controls show animation.
    The record is used for crbug.com/449011189. Recorded after native is fully
    initialized and when feature BrowserControlsRenderDrivenShowConstraint is
    enabled.
  </summary>
</histogram>

<histogram name="Android.BrowserControlsAnimationUpdate.HasExistingAnimation"
    enum="Boolean" expires_after="2026-09-13">
  <owner>peilinwang@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Only recorded when BrowserControlsScrollSnapAnimation is enabled, and when
    the layer tree instance isn't in viz. Records whether an existing animation
    was running when either a new browser controls snap/height animation was
    initiated, or when we attempt to reset an animation.
  </summary>
</histogram>

<histogram name="Android.BrowsingDataModel.ModelDestructionTime" units="ms"
    expires_after="2026-06-21">
  <owner>alimariam@google.com</owner>
  <owner>dullweber@chromium.org</owner>
  <owner>chrome-browser-privacy-team@google.com</owner>
  <summary>
    This histogram records the time taken to destroy the android browsing data
    model wrapper with its contents. This is recorded each time the model is
    destroyed on the Java side when the destroy method is called.
  </summary>
</histogram>

<histogram name="Android.ChildProcess.JavalessStarted" enum="Boolean"
    expires_after="2027-02-14">
  <owner>smaier@chromium.org</owner>
  <summary>
    Records when a child process (specifically a renderer) is started via the
    javaless code path on Android.
  </summary>
</histogram>

<histogram name="Android.ChildProcessBinding.BatchRequestDelay" units="ms"
    expires_after="2026-11-10">
  <owner>kawasin@google.com</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the delay from the first request in a batch to when the batch is
    flushed. This is recorded when the queue in BindingRequestQueue is flushed
    with at least one request.
  </summary>
</histogram>

<histogram name="Android.ChildProcessBinding.BatchRequestSize" units="count"
    expires_after="2026-11-10">
  <owner>kawasin@google.com</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the number of binding requests in a batch when the batch is flushed.
    This is recorded when the queue in BindingRequestQueue is flushed with at
    least one request.
  </summary>
</histogram>

<histogram name="Android.ChildProcessBinding.BatchScopeDurationOnMainThread"
    units="ms" expires_after="2027-01-10">
  <owner>kawasin@google.com</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Measures the duration of the ScopedServiceBindingBatch batching scope on the
    main thread. This metric is recorded when the batching scope is closed. This
    is recorded regardless of whether the service binding batching feature is
    enabled. ScopedServiceBindingBatch can be nested. This metrics measures the
    duration of the outermost batching scope.
  </summary>
</histogram>

<histogram name="Android.ChildProcessBinding.BinderIPC.Count" units="calls"
    expires_after="2026-09-27">
  <owner>kawasin@google.com</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the number of BindService.doBindService() calls. This is emitted
    every 5 minutes on Chrome on Android while in the foreground.
  </summary>
</histogram>

<histogram name="Android.ChildProcessBinding.BinderIPC.{Type}.Count"
    units="calls" expires_after="2027-02-07">
  <owner>kawasin@google.com</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the number of {Type} calls. This is emitted every 5 minutes on
    Chrome on Android while in the foreground.
  </summary>
  <token key="Type">
    <variant name="BindService" summary="BindService.doBindService()"/>
    <variant name="Total" summary="Total"/>
    <variant name="UnbindService" summary="BindService.doUnbindService()"/>
    <variant name="UpdateServiceGroup"
        summary="BindService.doUpdateServiceGroup()"/>
  </token>
</histogram>

<histogram name="Android.ChildProcessBinding.SetPriorityLatency"
    units="microseconds" expires_after="2027-01-24">
  <owner>kawasin@google.com</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the latency from posting SetRenderProcessPriorityOnLauncherThread on
    the main thread to its execution complete on the launcher thread. It is
    recorded when SetRenderProcessPriorityOnLauncherThread is executed. This
    metrics is recorded on all Android clients.
  </summary>
</histogram>

<histogram name="Android.ChildProcessBinding.TotalBindingCount"
    units="bindings" expires_after="2027-01-17">
  <owner>kawasin@google.com</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the total number of service bindings for sandboxed
    ChildProcessConnections in existence. This is emitted even if there are no
    live connections. Emitted at a Poisson distributed period with a mean of 5
    minutes on Chrome on Android while in the foreground.
  </summary>
</histogram>

<histogram name="Android.ChildProcessBinding.TotalConnections"
    units="connections" expires_after="2027-01-17">
  <owner>ckitagawa@chromium.org</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the total number of sandboxed ChildProcessConnections in existence.
    This is emitted even if there are no live connections. Emitted at a Poisson
    distributed period with a mean of 5 minutes on Chrome on Android while in
    the foreground.
  </summary>
</histogram>

<histogram
    name="Android.ChildProcessBinding.{ChildProcessConnectionMetricsBindingState}BindingCount"
    units="connections" expires_after="2027-02-07">
  <owner>kawasin@google.com</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the number of {ChildProcessConnectionMetricsBindingState} service
    bindings for sandboxed ChildProcessConnections. This is emitted even if
    there are no live connections. Emitted at a Poisson distributed period with
    a mean of 5 minutes on Chrome on Android while in the foreground.
  </summary>
  <token key="ChildProcessConnectionMetricsBindingState"
      variants="ChildProcessConnectionMetricsBindingState"/>
</histogram>

<histogram
    name="Android.ChildProcessBinding.{ChildProcessConnectionMetricsBindingState}Connections"
    units="connections" expires_after="2027-01-31">
  <owner>ckitagawa@chromium.org</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the number of sandboxed ChildProcessConnections with a
    {ChildProcessConnectionMetricsBindingState}. This is emitted even if there
    are no live connections. Emitted at a Poisson distributed period with a mean
    of 5 minutes on Chrome on Android while in the foreground.
  </summary>
  <token key="ChildProcessConnectionMetricsBindingState"
      variants="ChildProcessConnectionMetricsBindingState"/>
</histogram>

<histogram name="Android.ChildProcessConectionEventCounts"
    enum="AndroidChildProcessConnectionEvents" expires_after="2026-12-06">
  <owner>boliu@chromium.org</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Record events in ChildProcessConnection. Recorded when the specific events
    happen. Note individual counts may or may not be independent or mutually
    exclusive; thus total count is meaningless. Counts can be compared with each
    other, or need to be normalized with something else (eg number of child
    process launches).
  </summary>
</histogram>

<histogram name="Android.ChildProcessConnection.FallbackService"
    enum="AndroidChildProcessConnectionServiceNames" expires_after="2027-01-17">
  <owner>boliu@chromium.org</owner>
  <owner>smaier@chromium.org</owner>
  <summary>
    Records the name of the fallback service that is used in
    ChildProcessConnection. This is recorded when a fallback to a different
    service happens.
  </summary>
</histogram>

<histogram name="Android.ChildProcessConnection.OnServiceConnectedCounts"
    units="count" expires_after="2026-12-06">
  <owner>boliu@chromium.org</owner>
  <owner>kawasin@chromium.org</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Record the accumulated count of
    ChildServiceConnectionDelegate.onServiceConnected. This is recorded every
    time the callback is triggered. The metric with number more than 1 indicates
    that the child process is restarted after the service process connected.
    Note that the lower buckets double-counts the higher buckets since this is
    recorded at each restart (e.g. when 4 is recorded, 1,2,3 are also recorded).
  </summary>
</histogram>

<histogram name="Android.ChildProcessRanking.{RankType}.Count" units="count"
    expires_after="2026-12-06">
  <owner>kawasin@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Records the number of child process connections that are classified as
    {RankType}. Whether the process is high rank or low rank is determined by
    ChildProcessRanking.shouldBeInLowRankGroup() This is recorded when the
    application is sent to the background.
  </summary>
  <token key="RankType">
    <variant name="HighRank" summary="high-rank processes"/>
    <variant name="LowRank" summary="low-rank processes"/>
  </token>
</histogram>

<histogram name="Android.ChildProcessStartTimeV2.{Type}" units="ms"
    expires_after="2023-02-22">
  <owner>cduvall@chromium.org</owner>
  <owner>boliu@chromium.org</owner>
  <summary>
    Measures time from {Type} child process starts to right before main. Only
    recorded on Android N+. Zygote measurements are recorded on Q+.

    Zygote measurements capture the CPU time (thread time) spent to create the
    app zygote process, before the zygote preload starts. For other processes it
    measures the time (uptimeMillis) to create the child process service.
  </summary>
  <token key="Type">
    <variant name="All" summary="all (excluding zygote)"/>
    <variant name="Isolated" summary="isolated"/>
    <variant name="NotIsolated" summary="non-isolated"/>
    <variant name="Zygote" summary="app zygote"/>
  </token>
</histogram>

<histogram name="Android.ChromeActivity.Type" enum="ChromeActivityType"
    expires_after="never">
<!-- expires-never: Used to classify UMA reports by the dashboards. -->

  <owner>peconn@chromium.org</owner>
  <owner>src/base/metrics/OWNERS</owner>
  <summary>
    Recorded at the same time as &quot;CustomTabs.Visible&quot;, this metric
    should eventually replace that one. This additionally distinguishes between
    Trusted Web Activities, WebAPKs and Webapps.

    As of M87, this histogram is logged on a log start, rather than log end to
    tag more logs.
  </summary>
</histogram>

<histogram name="Android.ChromeStartupDelegate.FailureReason"
    enum="ChromeStartupDelegateFailureType" expires_after="2027-10-01">
  <owner>twellington@chromium.org</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records the failure reason for ChromeStartupDelegate requests. Recorded at
    most once on application startup.

    (Expired in 2022-12-25. Revived in 2025-01-07.)

    Note: There is a recording gap between: 2026.02-2026.08.
  </summary>
</histogram>

<histogram name="Android.ChromeStartupDelegate.Result"
    enum="ChromeStartupDelegateResult" expires_after="2027-10-01">
  <owner>twellington@chromium.org</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records the result for ChromeStartupDelegate. Recorded on application
    startup.

    (Expired in 2022-10-16. Revived in 2025-01-07.)

    Note: There is a recording gap between: 2026.02-2026.08.
  </summary>
</histogram>

<histogram name="Android.ComposeboxQueryController.AddTabContextCachedDuration"
    units="ms" expires_after="2026-12-06">
  <owner>ckitagawa@chromium.org</owner>
  <owner>clank-tab-dev@google.com</owner>
  <summary>
    Records the duration between requesting and starting the upload of a tab's
    context in the ComposeboxQueryController. Recorded whenever a tab with
    cached context is added as an attachment to a query. Only recorded when the
    retrieval from the cache is successful.
  </summary>
</histogram>

<histogram name="Android.ComposeboxQueryController.AddTabContextDuration"
    units="ms" expires_after="2027-02-07">
  <owner>ckitagawa@chromium.org</owner>
  <owner>clank-tab-dev@google.com</owner>
  <summary>
    Records the duration between requesting and starting the upload of a tab's
    context in the ComposeboxQueryController. Recorded whenever a tab without a
    cached context is added as an attachment to a query and the context must be
    extracted on-demand. Only recorded when the context extraction is
    successful.
  </summary>
</histogram>

<histogram name="Android.ComposeboxQueryController.OnInputStateChangedDuration"
    units="ms" expires_after="2027-08-21">
  <owner>skym@chromium.org</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records the duration to construct the Java InputState object and dispatch
    onInputStateChanged from the C++ ComposeboxQueryControllerBridge. Recorded
    whenever the input state changes and is pushed to Java.
  </summary>
</histogram>

<histogram name="Android.Compositor.IsRequestingOpaqueSurface" enum="Boolean"
    expires_after="2025-04-13">
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records whether CopmositorSurfaceManager.requestSurface a surface with
    PixelFormat.OPAQUE when the method is called. Used to idicate how often an
    opaque SurfaceView is used.
  </summary>
</histogram>

<histogram name="Android.Compositor.UpdateLayerTree.Duration.Subsampled"
    units="microseconds" expires_after="2027-01-17">
  <owner>acondor@chromium.org</owner>
  <owner>clank-performance-team@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the duration of CompositorView::UpdateLayerTreeHost on Android,
    which updates the layer tree when a frame is requested. Subsampled to 1/100.
  </summary>
</histogram>

<histogram name="Android.ContactsPicker.ContactCount" units="Contacts"
    expires_after="2027-02-17">
  <owner>finnur@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Measures the total number of contacts shown in the contacts picker. Measured
    once when the Contacts Picker dialog is dismissed. Warning: this histogram
    was expired from 2024-08-04 to 2026-02-17; data may be missing.
  </summary>
</histogram>

<histogram name="Android.ContactsPicker.DialogAction"
    enum="ContactsPickerDialogAction" expires_after="2027-02-17">
  <owner>finnur@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Records which action the user takes in the ContactsPickerDialog. Measured
    once when the Contacts Picker dialog is dismissed. Warning: this histogram
    was expired from 2024-08-04 to 2026-02-17; data may be missing.
  </summary>
</histogram>

<histogram name="Android.ContactsPicker.PropertiesRequested"
    enum="ContactsPickerProperties" expires_after="2027-02-17">
  <owner>finnur@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    The contact properties requested by the website (names, emails, telephone
    numbers). Measured once when the Contacts Picker dialog is dismissed. Note:
    This metric was not logged in June 2023. Warning: this histogram was expired
    from 2024-08-04 to 2026-02-17; data may be missing.
  </summary>
</histogram>

<histogram name="Android.ContactsPicker.PropertiesUserRejected"
    enum="ContactsPickerProperties" expires_after="2027-02-17">
  <owner>finnur@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    The contact properties requested by the website but rejected by the user.
    Measured once when the Contacts Picker dialog is dismissed. Warning: this
    histogram was expired from 2024-10-06 to 2026-02-17; data may be missing.
  </summary>
</histogram>

<histogram name="Android.ContactsPicker.SelectCount" units="Contacts"
    expires_after="2027-02-17">
  <owner>finnur@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Measures the total number of contacts selected in the contacts picker.
    Measured once when the Contacts Picker dialog is dismissed. Note: This
    metric was not logged in June 2023. Warning: this histogram was expired from
    2024-08-04 to 2026-02-17; data may be missing.
  </summary>
</histogram>

<histogram name="Android.ContactsPicker.SelectPercentage" units="%"
    expires_after="2027-02-17">
  <owner>finnur@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Measures the percentage of contacts selected in the contacts picker.
    Measured once when the Contacts Picker dialog is dismissed. Note: This
    metric was not logged in June 2023. Warning: this histogram was expired from
    2024-08-04 to 2026-02-17; data may be missing.
  </summary>
</histogram>

<histogram name="Android.CpuAbiBitnessSupport" enum="CpuAbiBitnessSupport"
    expires_after="2027-01-17">
  <owner>tasak@google.com</owner>
  <owner>lizeb@chromium.org</owner>
  <summary>
    Whether 64-bit and/or 32-bit apps can be installed on this device/OS.

    This is recorded every time a metrics log is created.
  </summary>
</histogram>

<histogram name="Android.DarkTheme.EnabledState" enum="BooleanEnabled"
    expires_after="2027-01-17">
  <owner>twellington@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records whether dark theme is enabled or not on cold start and when the
    enabled state changes.
  </summary>
</histogram>

<histogram name="Android.DarkTheme.ThemeSettingsEntry"
    enum="AndroidThemeSettingsEntry" expires_after="2023-04-16">
  <owner>nemco@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Entry that navigate the user into the Theme Settings. Recorded when the
    Theme settings is opened.
  </summary>
</histogram>

<histogram name="Android.DefaultBrowserPromo.Click"
    enum="DefaultBrowserPromoSourceType" expires_after="2027-03-01">
  <owner>xinyiji@chromium.org</owner>
  <owner>hanxi@chromium.org</owner>
  <summary>
    Records the total count of clicks on the default browser promo. Includes
    clicks on message banners, the Settings page promo card, and the Magic Stack
    (Educational Tip) module. For Message Banners, the metric triggers when the
    user clicks the &quot;Settings&quot; button. For Settings Page Promo Card,
    the metric triggers when the user clicks the &quot;Open Settings&quot;
    button. For Magic Stack (Educational Tip), the metric triggers when the user
    clicks the &quot;Show me how&quot; button. Android-only.
  </summary>
</histogram>

<histogram name="Android.DefaultBrowserPromo.EntryPoint.{Source}"
    enum="AndroidDefaultBrowserPromoOutcomeType" expires_after="2027-01-26">
  <owner>eleanorlee@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Records the default browser state of the user at the moment they click a
    Default Browser Promo entry point. This also records the volume of clicks
    (Engagement) for the {Source}. Recorded when the user clicks the AppMenu or
    Settings Menu item.
  </summary>
  <token key="Source">
    <variant name="AppMenu" summary="Clicked from the App Menu."/>
    <variant name="AppMenu.RoleManagerDialog"
        summary="App Menu click that successfully showed the Role Manager
                 Dialog."/>
    <variant name="Settings" summary="Clicked from Chrome Settings."/>
  </token>
</histogram>

<histogram name="Android.DefaultBrowserPromo.Outcome.{CurrentState}"
    enum="AndroidDefaultBrowserPromoOutcomeType" expires_after="2026-08-30">
  <owner>twellington@chromium.org</owner>
  <owner>src/chrome/browser/ui/android/default_browser_promo/OWNERS</owner>
  <summary>
    The final default browser state (outcome) after the user has been prompted
    to set Chrome as the default when {CurrentState} is set as the default
    initially. Recorded when the system UI prompting the user to change their
    default is dismissed.
  </summary>
  <token key="CurrentState">
    <variant name="NoDefault" summary="no browser"/>
    <variant name="OtherDefault" summary="another browser"/>
  </token>
</histogram>

<histogram
    name="Android.DefaultBrowserPromo.Outcome.{CurrentState}.{PromoCount}"
    enum="AndroidDefaultBrowserPromoOutcomeType" expires_after="2026-09-06">
  <owner>twellington@chromium.org</owner>
  <owner>src/chrome/browser/ui/android/default_browser_promo/OWNERS</owner>
  <summary>
    The final default browser state (outcome) after the user has been prompted
    to set Chrome as the default when {CurrentState} is set as the default
    initially and the total promo count is {PromoCount}. Recorded when the
    system UI prompting the user to change their default is dismissed.
  </summary>
  <token key="CurrentState">
    <variant name="NoDefault" summary="no browser"/>
    <variant name="OtherDefault" summary="another browser"/>
  </token>
  <token key="PromoCount">
    <variant name="FifthOrMorePromo" summary="five or more"/>
    <variant name="FirstPromo" summary="one"/>
    <variant name="FourthPromo" summary="four"/>
    <variant name="SecondPromo" summary="two"/>
    <variant name="ThirdPromo" summary="three"/>
  </token>
</histogram>

<histogram name="Android.DefaultBrowserPromo.Outcome.{Source}"
    enum="AndroidDefaultBrowserPromoOutcomeType" expires_after="2027-04-22">
  <owner>eleanorlee@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    The final default browser state (outcome) after the user has been prompted
    to set Chrome as the default via the {Source}.
  </summary>
  <token key="Source">
    <variant name="AppMenu"
        summary="Promo shown in App Menu. Recorded when the Role Manager
                 Dialog is dismissed."/>
    <variant name="AppMenu.DeepLink"
        summary="Promo shown in App Menu. Recorded upon returning to Chrome
                 from a deep-link."/>
    <variant name="FRE"
        summary="Promo shown in FRE. Recorded when the Role Manager Dialog is
                 dismissed."/>
    <variant name="Settings"
        summary="Promo shown in Main Settings. Recorded upon returning to
                 Chrome from a deep-link."/>
  </token>
</histogram>

<histogram name="Android.DefaultBrowserPromo.RoleManagerShown"
    enum="AndroidDefaultBrowserPromoType" expires_after="2027-02-14">
  <owner>twellington@chromium.org</owner>
  <owner>src/chrome/browser/ui/android/default_browser_promo/OWNERS</owner>
  <summary>
    Records the default browser state when the Android Q+ role manager dialog is
    shown.
  </summary>
</histogram>

<histogram name="Android.DesktopWindowHeuristicResult4"
    enum="DesktopWindowHeuristicResult" expires_after="2027-01-24">
  <owner>aishwaryarj@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the result of the heuristics used to determine whether the app is in
    a desktop window. The histogram will be emitted only if the result changed
    since the last time it was emitted. This is to avoid emitting noisy data,
    since we believe that most of the conditions in these heuristics are
    unlikely to change for a given OS/OEM across these checks that may be
    relatively significantly larger in number.
  </summary>
</histogram>

<histogram name="Android.DeviceAuthenticator.AuthSource"
    enum="DeviceAuthSource" expires_after="2025-09-07">
  <owner>ioanap@chromium.org</owner>
  <owner>friedrichh@chromium.org</owner>
  <owner>clhager@google.com</owner>
  <summary>
    Recorded when a UI surface/flow in Chrome on Android chooses to re-auth the
    user. It records where the request comes from (Password Manager, Autofill,
    Incognito or Device Lock Page).
  </summary>
</histogram>

<histogram name="Android.DeviceSize.ScreenSizeInTensOfInches"
    units="10x inches" expires_after="2027-01-17">
  <owner>twellington@chromium.org</owner>
  <owner>aishwaryarj@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records the primary display (screen) size in tens of inches with 0.2 inches
    (2 units) granularity, during deferred startup. The display size is not
    affected by Android N multi-window mode.
  </summary>
</histogram>

<histogram name="Android.Display.IsDisplayTopologyAvaialble" enum="Boolean"
    expires_after="2026-12-27">
  <owner>renkens@google.com</owner>
  <owner>boliu@chromium.org</owner>
  <summary>
    Reports whether usage of the Display Topology Android API on this device is
    allowed (when AndroidUseDisplayTopology feature flag is enabled and the
    Android version provides the Display Topology API) or blocked. Recorded once
    in DisplayAndroidManager.initialize() every time Chrome on Android or
    Android WebView starts up.
  </summary>
</histogram>

<histogram name="Android.Display.IsNullDisplayRemoved" enum="Boolean"
    expires_after="2026-06-01">
  <owner>renkens@google.com</owner>
  <owner>boliu@chromium.org</owner>
  <summary>
    Emitted when DisplayListenerBackend.onDisplayAdded() reports a new
    sdkDisplayId whose Display descriptor is unexpectedly null. The value
    records whether that same sdkDisplayId is removed within the next 1 second:

    * true - DisplayListenerBackend.onDisplayRemoved() was invoked for the
    invalid sdkDisplayId within 1 s.

    * false — No removal occurred, or it happened after 1 s.

    Logged once for every onDisplayAdded() call in which the Display descriptor
    associated with the sdkDisplayId is null.
  </summary>
</histogram>

<histogram name="Android.Download.OpenTarget" enum="AndroidDownloadOpenTarget"
    expires_after="2026-10-28">
  <owner>jhimawan@google.com</owner>
  <owner>clank-downloads@google.com</owner>
  <summary>
    Records the target application used when a user opens a download on Android.
    Logged when a download open request is handled in the downloads UI or from
    notifications.
  </summary>
</histogram>

<histogram name="Android.DownloadManager.ForegroundServiceLifecycle"
    enum="DownloadNotificationForegroundLifecycle" expires_after="never">
<!-- expires-never: Download foreground notification stability metric. -->

  <owner>qinmin@chromium.org</owner>
  <owner>clank-downloads@google.com</owner>
  <summary>
    Records instances where the foreground undergoes a lifecycle change (when
    the foreground starts, changes pinned notification, or stops).
  </summary>
</histogram>

<histogram name="Android.DownloadManager.NotificationInteraction"
    enum="DownloadNotificationInteractions" expires_after="2023-01-01">
  <owner>qinmin@chromium.org</owner>
  <owner>clank-downloads@google.com</owner>
  <summary>
    Records instances where a user interacts with a download notification (ie.
    clicks on, pauses, resumes, cancels).
  </summary>
</histogram>

<histogram name="Android.DownloadManager.OpenSource.Audio"
    enum="AndroidDownloadOpenSource" expires_after="2027-01-17">
  <owner>shaktisahu@chromium.org</owner>
  <owner>clank-downloads@google.com</owner>
  <summary>
    Records how users open audio download files on Android. This histogram was
    previously expired on 2023-07-09, and was re-enabled on 2024-02-12.
  </summary>
</histogram>

<histogram name="Android.DownloadManager.OpenSource.Other"
    enum="AndroidDownloadOpenSource" expires_after="2027-01-17">
  <owner>shaktisahu@chromium.org</owner>
  <owner>clank-downloads@google.com</owner>
  <summary>
    Records the entry point for users opening downloaded files on Android, that
    are not audio nor video. Records how users open audio download files on
    Android. This histogram was previously expired on 2023-06-25, and was
    re-enabled on 2024-02-12.
  </summary>
</histogram>

<histogram name="Android.DownloadManager.OpenSource.Video"
    enum="AndroidDownloadOpenSource" expires_after="2026-03-01">
  <owner>shaktisahu@chromium.org</owner>
  <owner>clank-downloads@google.com</owner>
  <summary>
    Records how users open video download files on Android. This histogram was
    previously expired on 2023-06-25, and was re-enabled on 2024-02-12.
  </summary>
</histogram>

<histogram name="Android.DownloadManager.ServiceStopped.DownloadForeground"
    enum="DownloadNotificationServiceStopped" expires_after="never">
  <owner>qinmin@chromium.org</owner>
  <owner>clank-downloads@google.com</owner>
<!-- expires-never: Download foreground notification stability metric. -->

  <summary>
    Records instances of DownloadForegroundService stops. The number of expected
    stops (stopped) and unexpected stops (task removed, low memory, etc) can be
    compared to get a sense of how often the service crashes to see how it
    handles restarts. For example, the number of times the service is stopped
    because of low memory can be compared to the number of times the service has
    been destroyed to see how frequently it occurs. Or, the number of start
    sticky's will indicate how often the service is able to restart due to an
    unexpected stop.
  </summary>
</histogram>

<histogram name="Android.DownloadPage.OpenSource"
    enum="AndroidDownloadOpenSource" expires_after="2027-01-17">
  <owner>qinmin@chromium.org</owner>
  <owner>clank-downloads@google.com</owner>
  <summary>
    Records the entry point for users opening the download page on Android. This
    histogram was previously expired on 2023-04-23, and was re-enabled on
    2024-02-12.
  </summary>
</histogram>

<histogram name="Android.DragDrop.Files.Count" units="files"
    expires_after="2027-07-26">
  <owner>joelhockey@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the number of files included in a drag-drop in chrome. It is
    recorded on the drop event for a web contents. Android only.
  </summary>
</histogram>

<histogram name="Android.DragDrop.FromWebContent.TargetType"
    enum="AndroidDragTargetType" expires_after="2026-09-06">
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the type of object being dragged, for the drag process starts from
    the web content, and drop happens outside of the web content. Does not
    capture drag events that end inside the ContentView containing web contents.
    Recorded when such a drag event ends. Android only.
  </summary>
</histogram>

<histogram name="Android.DragDrop.Image.OpenFileTime.FirstAttempt" units="ms"
    expires_after="2027-01-17">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the duration between receiving Android Drag End event and the first
    ContentProvider#openFile attempted by the drop target app. The duration is
    calculated during the first ContentProvider#openFile for each URI. Another
    metric Android.DragDrop.Image.OpenFileTime.LastAttempt is recorded for the
    last ContentProvider#openFile. Record 0 if the duration is negative (e.g.
    ContentProvider#openFile is accessed before drag ends). Android only.
  </summary>
</histogram>

<histogram name="Android.DragDrop.Image.OpenFileTime.FirstExpired" units="ms"
    expires_after="2027-01-17">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the duration between the URI being cleared and the first
    ContentProvider#openFile attempt with that expired URI. This is used to
    evaluate how long we should keep the image data. Because drop target app may
    retry after Chrome rejects the expired URI; and the retries are not helpful
    to evaluate how long the data is needed; this metric records at most once
    per URI. This metric is recorded when Chrome receives an expired URI to
    retrieve data. If the URI is not the latest expired one, the metric will not
    be recorded because we do not calculate the elapsed time for older URIs.
    Android only.
  </summary>
</histogram>

<histogram name="Android.DragDrop.Image.OpenFileTime.LastAttempt" units="ms"
    expires_after="2027-01-17">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the duration between receiving Android Drag End event and the last
    ContentProvider#openFile attempted by the drop target app. The duration is
    calculated when the image data expired at the designated time limit. It is
    not recorded if the image data is replaced before the time limit due to the
    start of the next image drag. Another metric
    Android.DragDrop.Image.OpenFileTime.FirstAttempt is recorded for the first
    ContentProvider#openFile. Record 0 if the duration is negative (e.g.
    ContentProvider#openFile is accessed before drag ends). Android only.
  </summary>
</histogram>

<histogram name="Android.DragDrop.Image.Size" units="KB"
    expires_after="2026-11-29">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the image size being dragged from Chrome. Recorded when start
    dragging an image from Chrome's web content, regardless of whether drop is
    handled successfully. Used to evaluate the memory consumption. Android only.
  </summary>
</histogram>

<histogram name="Android.DragDrop.TabOrGroup.MaxInstanceFailureCount"
    units="failures" expires_after="2027-03-27">
  <owner>aishwaryarj@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    The number of times tab or group tearing failed for a user, because the
    maximum number of Chrome instances were open, in a 24-hour period. Recorded
    when the max-instance toast is shown when a dragged tab or group drop is
    unhandled at the max instance limit.
  </summary>
</histogram>

<histogram name="Android.DragDrop{TabObjectType}.FromStrip.Result"
    enum="DragDropResult" expires_after="2027-02-07">
  <owner>shuyng@google.com</owner>
  <owner>zheliooo@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the {TabObjectType} drag and drop results, including successful
    drops and failed drops with varied reasons. For failed drops, it is recorded
    during ACTION_DROP. For successful drops, it is recorded during
    ACTION_DRAG_ENDED. Note that the successful drops count can be recorded more
    often than Android.DragDrop.Tab.Type or Android.DragDrop.TabGroup.Type such
    as reorder within strip or tabs being consumed as text by EditText in native
    pages.
  </summary>
  <token key="TabObjectType" variants="TabObjectType"/>
</histogram>

<histogram name="Android.DragDrop{TabObjectType}.ReorderStripWithDragDrop"
    enum="Boolean" expires_after="2026-11-15">
  <owner>shuyng@google.com</owner>
  <owner>zheliooo@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records {TabObjectType} drops into source strip with or without leaving the
    strip. True means the drag has left the source strip; while false means it
    does not. Recorded when drop into source strip. Used to determine the amount
    of accidental drag out of the strip.
  </summary>
  <token key="TabObjectType" variants="TabObjectType"/>
</histogram>

<histogram name="Android.DragDrop{TabObjectType}.SourceWindowClosed"
    enum="Boolean" expires_after="2027-03-27">
  <owner>aishwaryarj@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>zheliooo@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records true when a {TabObjectType} drag/drop results in closing the source
    Chrome window because it was the last {TabObjectType} in the window, false
    when the drop does not close the source window. Only recorded when drag/drop
    is handled.
  </summary>
  <token key="TabObjectType" variants="TabObjectType"/>
</histogram>

<histogram name="Android.DragDrop{TabObjectType}.Type" enum="DragDropType"
    expires_after="2027-02-07">
  <owner>shuyng@google.com</owner>
  <owner>zheliooo@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the drag source and drop target when a {TabObjectType} is dropped
    successfully.
  </summary>
  <token key="TabObjectType" variants="TabObjectType"/>
</histogram>

<histogram name="Android.DynamicTopChrome.TabStripTransition.Finished"
    enum="Boolean" expires_after="2026-08-30">
  <owner>mschillaci@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    On tablets, when the width of the tab strip passes a certain threshold, the
    tab strip will start a transition to show / hide it from the top toolbar.
    This records true when tab strip transition finishes successfully, or false
    when a new transition starts before an ongoing transition dispatched the
    finished signal.
  </summary>
</histogram>

<histogram name="Android.DynamicTopChrome.WindowResize.DesktopWindowModeState"
    enum="DesktopWindowModeState" expires_after="2027-01-19">
  <owner>aishwaryarj@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the desktop windowing mode state when the Chrome window is resized
    on tablet or foldable devices.
  </summary>
</histogram>

<histogram name="Android.EdgeToEdge.BackupNavbarInsets.EdgeToEdgeController"
    enum="BackupNavbarInsetsSource" expires_after="2026-10-11">
  <owner>clhager@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>edge-to-edge@chromium.org</owner>
  <summary>
    Records the source, if applicable, used to provide back-up navbar insets to
    the EdgeToEdgeController. The EdgeToEdgeController will request back-up
    insets once every time it receives a window inset update, if the navigation
    bar insets are 0.
  </summary>
</histogram>

<histogram name="Android.EdgeToEdge.Debugging.ConfigurationSwitchOutcome"
    enum="EdgeToEdgeConfigurationSwitchOutcome" expires_after="2026-05-31">
  <owner>clhager@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>edge-to-edge@chromium.org</owner>
  <summary>
    Records when the EdgeToEdgeControllerImpl notices a change when edge-to-edge
    is changed from a supported configuration into unsupported. Record the
    outcome combination of the original window insets, new window insets, and
    paddings applied to the content view.
  </summary>
</histogram>

<histogram
    name="Android.EdgeToEdge.Debugging.SupportedConfigurationStrangeInsets"
    enum="SupportedConfigurationStrangeInsetsState" expires_after="2025-12-01">
  <owner>clhager@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>edge-to-edge@chromium.org</owner>
  <summary>
    Records when the EdgeToEdgeControllerImpl handles insets and observes that
    the configuration seems to support edge-to-edge, but other inset signals
    (other than the supported configuration check) seem to disagree.
  </summary>
</histogram>

<histogram name="Android.EdgeToEdge.DrawToEdgeInUnsupportedConfiguration"
    enum="Boolean" expires_after="2026-05-31">
  <owner>clhager@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>edge-to-edge@chromium.org</owner>
  <summary>
    Records when EdgeToEdgeControllerImpl#drawToEdge gets called on a device
    whose configuration does not support edge-to-edge, with the boolean record
    indicating whether drawToEdge was called due to a change in window state.
  </summary>
</histogram>

<histogram name="Android.EdgeToEdge.Eligible2" enum="Boolean"
    expires_after="2027-01-17">
  <owner>clhager@google.com</owner>
  <owner>edge-to-edge@chromium.org</owner>
  <summary>
    Records if the current activity is eligible for drawing any content edge to
    edge based on the device configuration. Recorded on ChromeActivity launch.
  </summary>
</histogram>

<histogram name="Android.EdgeToEdge.Eligible2.OnCreateController"
    enum="Boolean" expires_after="2026-11-15">
  <owner>clhager@google.com</owner>
  <owner>edge-to-edge@chromium.org</owner>
  <summary>
    Records if the current activity is eligible for drawing any content edge to
    edge based on the device configuration. Recorded when the
    EdgeToEdgeController is created.
  </summary>
</histogram>

<histogram name="Android.EdgeToEdge.IneligibilityReason2"
    enum="IneligibilityReason" expires_after="2027-01-17">
  <owner>clhager@google.com</owner>
  <owner>edge-to-edge@chromium.org</owner>
  <summary>
    Records the reason of why the current session is not eligibile for drawing
    any content edge to edge. Multiple reasons might be record for a single
    session. Recorded on ChromeActivity launch.
  </summary>
</histogram>

<histogram name="Android.EdgeToEdge.IneligibilityReason2.OnCreateController"
    enum="IneligibilityReason" expires_after="2026-11-15">
  <owner>clhager@google.com</owner>
  <owner>edge-to-edge@chromium.org</owner>
  <summary>
    Records the reason of why the current session is not eligibile for drawing
    any content edge to edge. Multiple reasons might be record for a single
    session. Recorded when the EdgeToEdgeController is created.
  </summary>
</histogram>

<histogram name="Android.EdgeToEdge.MissingNavbarInsets2"
    enum="MissingNavbarInsetsReason" expires_after="2025-12-01">
  <owner>clhager@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>edge-to-edge@chromium.org</owner>
  <summary>
    Records once during the initialization of the EdgeToEdgeControllerImpl
    whether there were no navigation bar insets at all, which may indicate an
    incorrect value from the OS.
  </summary>
</histogram>

<histogram name="Android.EdgeToEdge.NavigationBarMandatoryGesturesMismatch"
    enum="HasSeenNonZeroNavBarState" expires_after="2026-10-11">
  <owner>clhager@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>edge-to-edge@chromium.org</owner>
  <summary>
    Records when insets are updated and the mandatory system gestures insets
    seem to indicate the presence of a navigation bar, but the navigation bar
    insets (ignoring visibility) are zero. This is recorded up to three times
    per session: once if there's a mismatch in the first insets received by the
    app, once on the first time those mismatched insets are corrected (non-zero
    navbar insets), and once if insets are mismatched after non-zero navbar
    insets have been seen during the current session. The enum value also tracks
    the navigation mode (gesture, tappable) indicated by the insets, or if the
    insets are giving mixed signals on the navigation mode.
  </summary>
</histogram>

<histogram name="Android.EdgeToEdge.SupportedConfigurationSwitch2"
    enum="SupportedConfigurationSwitch" expires_after="2026-06-07">
  <owner>clhager@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>edge-to-edge@chromium.org</owner>
  <summary>
    Records when the EdgeToEdgeControllerImpl notices a change in whether
    edge-to-edge is supported by the device configuration when it handles a
    change in window insets. This is recorded once every time a change is
    detected.
  </summary>
</histogram>

<histogram name="Android.Event.ActionDown" enum="InputDeviceSource"
    expires_after="2026-12-27">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <owner>src/chrome/android/OWNERS</owner>
  <summary>
    Records the input device source for the action down touch event.
  </summary>
</histogram>

<histogram
    name="Android.FamilyLinkUser.LocalApprovalParentAuthenticationError.{Flow}"
    units="Status error codes raised in GMS Core" expires_after="2026-11-01">
  <owner>anthie@google.com</owner>
  <owner>ljjlee@google.com</owner>
  <owner>chrome-kids-eng@google.com</owner>
  <owner>cros-families-eng@google.com</owner>
  <summary>
    The different GMS error status codes that a user may encounter during the
    parent authentication step in the local extension or web approval flow.
    Recorded on Android only. See
    go/chrome-local-approval-parent-auth-error-codes (Googlers only) for the
    error code definitions.
  </summary>
  <token key="Flow">
    <variant name="Extension"/>
    <variant name="Web"/>
  </token>
</histogram>

<histogram name="Android.FocusChanged.FocusOwningWebContents" enum="Boolean"
    expires_after="2025-09-28">
  <owner>amanvr@google.com</owner>
  <owner>nuskos@chromium.org</owner>
  <summary>
    Records whether the WebContents associated with the RenderWidgetHost
    responsible for handling input is focused specifically on TouchStart or
    GestureTap or MouseDown events. This histogram is recorded for each input
    event sequence on TouchStart/GestureTap/MouseDown input events. This would
    help us in understanding if focus changes on input events need to be handled
    by Viz once it starts receiving transferred input events after InputVizard
    (go/chrome-inputvizard).
  </summary>
</histogram>

<histogram
    name="Android.FocusChanged.RenderWidgetHostViewChildFrame.RootViewFocusState"
    enum="RootViewFocusState" expires_after="2025-09-28">
  <owner>amanvr@google.com</owner>
  <owner>nuskos@chromium.org</owner>
  <summary>
    Tracks if the RenderWidgetHostViewChildFrame requests focus on the root
    RenderWidgetHostViewAndroid or not during the beginning of a touch
    interaction. This tracking occurs every time the function
    RenderWidgetHostViewChildFrame::PreProcessTouchEvent() is called when a
    touch sequence begins (on TouchStart). This would help us in understanding
    if focus changes on touch input events need to be handled by Viz once it
    starts receiving transferred input events after InputVizard
    (go/chrome-inputvizard).
  </summary>
</histogram>

<histogram name="Android.FontLookup.Blink.GetTableLatency" units="ms"
    expires_after="2023-11-12">
  <owner>drott@chromium.org</owner>
  <owner>cduvall@chromium.org</owner>
  <owner>layout-dev@chromium.org</owner>
  <summary>
    Records the latency of fetching the font name lookup table from the browser.
    The table is cached by the renderer so will usually only be fetched once per
    renderer startup. This is recorded when an attempt is made to fetch the
    table, typically once per renderer on the first font lookup for that
    process. If the original fetch fails, this will be recorded the next time a
    font lookup is requested.
  </summary>
</histogram>

<histogram name="Android.FontLookup.GmsFontRequest.Time" units="ms"
    expires_after="2023-08-08">
  <owner>twellington@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records the time taken to make a fetchFonts font request to GMS Core via the
    Android downloadable font provider API. This metric may be used to determine
    whether it's reasonable to execute this task on the IO thread rather than
    posting to a background thread.
  </summary>
</histogram>

<histogram name="Android.FontLookup.MatchLocalFontByUniqueName.Time" units="ms"
    expires_after="2023-08-13">
  <owner>twellington@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records the time taken to respond to a request from the renderer to fetch a
    specific font file from the GMS Core Android downloadable font provider.
  </summary>
</histogram>

<histogram name="Android.GlicPromoBottomSheet.DismissReason"
    enum="GlicPromoBottomSheetDismissReason" expires_after="2027-05-15">
  <owner>ssid@google.com</owner>
  <owner>haileywang@google.com</owner>
  <summary>
    Records the user's action taken on the Glic promo bottom sheet. Emitted once
    each time the bottom sheet is closed, documenting whether the user accepted
    the promo, rejected it, or dismissed it (via swipe, back press, etc.).
  </summary>
</histogram>

<histogram
    name="Android.GridTabSwitcher.Animation.FirstFrameLatency.{GridTabSwitcherAnimationType}"
    units="ms" expires_after="2026-11-29">
  <owner>ckitagawa@chromium.org</owner>
  <owner>clank-isochron-team@google.com</owner>
  <summary>
    This histogram records the time taken between the tab and tab switcher
    layout. Timing starts when the layout transition begins and ends on the
    first frame. This is recorded each time the layout transition animation
    occurs. {GridTabSwitcherAnimationType}
  </summary>
</histogram>

<histogram
    name="Android.GridTabSwitcher.Animation.TotalDuration.{GridTabSwitcherAnimationType}"
    units="ms" expires_after="2026-10-26">
  <owner>ckitagawa@chromium.org</owner>
  <owner>clank-isochron-team@google.com</owner>
  <summary>
    This histogram records the time taken between the tab and tab switcher
    layout. Timing starts when the layout transition begins and ends on the last
    frame. This is recorded each time the layout transition animation occurs.
    {GridTabSwitcherAnimationType}
  </summary>
</histogram>

<histogram name="Android.GridTabSwitcher.ThumbnailFetchingResult"
    enum="GridTabSwitcherThumbnailFetchingResult" expires_after="2027-08-30">
  <owner>ckitagawa@chromium.org</owner>
  <owner>clank-isochron-team@google.com</owner>
  <summary>
    This histogram records the result of thumbnail fetching in the Grid Tab
    Switcher on Android. This is recorded once per thumbnail fetch when a Tab
    card with a thumbnail is shown onscreen.
  </summary>
</histogram>

<histogram name="Android.GridTabSwitcher.TimeToTabStateInitializedFromShown"
    units="ms" expires_after="2027-01-17">
  <owner>ckitagawa@chromium.org</owner>
  <owner>clank-tab-dev@google.com</owner>
  <summary>
    Records the elapsed realtime in milliseconds between the tab switcher being
    shown and the tab state being initialized. This is not recorded if the tab
    state was already initialized. Recorded at most once per session once the
    tab state is initialized.
  </summary>
</histogram>

<histogram name="Android.Handoff.Enabled.{UpdateType}" enum="Boolean"
    expires_after="2027-01-24">
  <owner>zheliooo@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records whether Handoff is enabled for the current activity during
    {UpdateType}. Handoff is enabled if the user is in a normal tab (not
    incognito) and there is an active tab.
  </summary>
  <token key="UpdateType" variants="HandoffEnableTrigger"/>
</histogram>

<histogram name="Android.Hub.PaneFocused" enum="HubPaneId"
    expires_after="2026-12-27">
  <owner>ckitagawa@chromium.org</owner>
  <owner>clank-hub-dev@google.com</owner>
  <summary>
    Reports which pane in the Hub becomes focused when a request to change focus
    occurs. Focus may change either in response to user input on the pane
    switcher or programmatically as a side-effect of another user action. For
    example the see all tabs button on the Incognito reauth dialog. See
    &quot;Android.Hub.PaneFocused.PaneSwitcher&quot; if only interested in user
    actions on the pane switcher.
  </summary>
</histogram>

<histogram name="Android.Hub.PaneFocused.PaneSwitcher" enum="HubPaneId"
    expires_after="2026-12-27">
  <owner>ckitagawa@chromium.org</owner>
  <owner>clank-hub-dev@google.com</owner>
  <summary>
    Reports which pane in the Hub becomes focused when a request to change focus
    occurs in response to a user input on the pane switcher. This does not count
    programmatic pane switches triggered as a side effect of other user actions
    such as the back button, Incognito reauth dialog, etc. See
    &quot;Android.Hub.PaneFocused&quot; for all pane focus events.
  </summary>
</histogram>

<histogram name="Android.Hub.PaneSwiped.{Direction}" enum="HubPaneId"
    expires_after="2026-10-25">
  <owner>madhavpruthi@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <summary>
    The pane ID of the current pane when the user swipes {Direction} to navigate
    to the next pane.
  </summary>
  <token key="Direction" variants="HubSwipeDirection"/>
</histogram>

<histogram name="Android.Hub.ToolbarPresentOnAnimation" enum="Boolean"
    expires_after="2025-01-06">
  <owner>skym@chromium.org</owner>
  <owner>ckitagawa@chromium.org</owner>
  <summary>
    The shrink/expand animation is supposed to change the color of the toolbar.
    But there's currently a rare crash where the toolbar is not present. Either
    it hasn't been created yet or has already been torn down. This metric
    captures if the toolbar is present or not, which should help us measure the
    effectiveness of future mitigations.
  </summary>
</histogram>

<histogram name="Android.HubSearch.SearchBoxEntrypointV2"
    enum="HubSearchEntrypoint" expires_after="2027-01-03">
  <owner>bjfong@google.com</owner>
  <owner>wylieb@google.com</owner>
  <owner>clank-hub-dev@google.com</owner>
  <summary>
    Reports under which context (incognito or non-incognito) and visual
    component (search box or loupe) Hub Search is entered through. This includes
    tablet specific data which only has the loupe icon enabled.
  </summary>
</histogram>

<histogram name="Android.IncognitoNotification.FileNotDeleted" enum="Boolean"
    expires_after="2027-01-03">
  <owner>arabm@google.com</owner>
  <owner>chrome-incognito@google.com</owner>
  <summary>
    Records the count of any cases when clicking on the &quot;Close all
    Incognito tabs&quot; notification may not delete any files which were opened
    in the Incognito session. True value denotes file was not deleted and false
    otherwise.
  </summary>
</histogram>

<histogram name="Android.IncognitoReauth.AuthResult"
    enum="DeviceAuthFinalResult" expires_after="2027-02-07">
  <owner>roagarwal@chromium.org</owner>
  <owner>chrome-incognito@google.com</owner>
  <summary>
    Records the result of the attempt to re-auth the user via biometrics or
    device lock for the Incognito re-auth screen.
  </summary>
</histogram>

<histogram name="Android.IncognitoReauth.PrefToggledFromSettingPage"
    enum="IncognitoReauthToggleValueType" expires_after="2027-02-14">
  <owner>roagarwal@chromium.org</owner>
  <owner>chrome-incognito@google.com</owner>
  <summary>
    Records the count when the Incognito lock setting was either turned
    &quot;on&quot; or &quot;off&quot; from the Chrome Settings &gt; Privacy and
    Security &gt; Lock Incognito tabs when you leave Chrome, option. This
    setting can be in disabled state if the Android screen lock is not set-up,
    in which case we don't record this metric. This is recorded only when the
    toggle is not in disabled state and if the re-authentication checks succeeds
    which follows after the user changes the toggle. This covers only the
    interactions done from the above mentioned Incognito lock Setting page. See
    also the metric &quot;Android.IncognitoReauth.PromoActionType&quot; which
    records the opt-in made exclusively from promo card.
  </summary>
</histogram>

<histogram name="Android.IncognitoReauth.PromoAcceptedOrDismissed"
    enum="IncognitoReauthPromoActionType" expires_after="2027-01-17">
  <owner>roagarwal@chromium.org</owner>
  <owner>chrome-incognito@google.com</owner>
  <summary>
    Records the action type the user makes on the Incognito re-auth promo card
    which is shown inside the Incognito tab grid view. There's only two possible
    interactions possible which is either to turn on the Incognito lock or
    dismiss the promo. A &quot;Promo accepted&quot; entry is emitted when user
    clicks on &quot;Turn on Incognito lock&quot; (gated on successful
    re-authentication) and a &quot;No thanks&quot; value is emitted when the
    user clicks on &quot;No thanks&quot;.
  </summary>
</histogram>

<histogram name="Android.IncognitoReauth.PromoImpressionAfterActionCount"
    units="count" expires_after="2026-11-03">
  <owner>zalmashni@google.com</owner>
  <owner>arabm@google.com</owner>
  <owner>chrome-incognito@google.com</owner>
  <summary>
    Records the number of impressions of the Incognito re-auth promo card when
    user clicks accept or dismiss or when the promo expires after the max number
    of impressions.
  </summary>
</histogram>

<histogram name="Android.IncognitoReauth.ToggleOnOrOff" enum="BooleanToggled"
    expires_after="2027-01-17">
  <owner>roagarwal@chromium.org</owner>
  <owner>chrome-incognito@google.com</owner>
  <summary>
    Records the Incognito lock setting state (if available to clients) exactly
    once during the browser startup, after the native code is initialized. Note,
    for multi-windows this histogram would be emitted as many times as the users
    enter multi-window(s).
  </summary>
</histogram>

<histogram name="Android.Input.TouchEvent.Action" enum="MotionEventAction"
    expires_after="2026-12-27">
  <owner>lizeb@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    When a touch event is processed, what is the action associated with it. This
    is recorded only on Android (including WebView), at a subsampled rate.
  </summary>
</histogram>

<histogram name="Android.InputHintChecker.InitializationResult"
    enum="InputHintInitializationResult" expires_after="2026-12-20">
  <owner>pasko@chromium.org</owner>
  <owner>mthiesse@chromium.org</owner>
  <summary>
    Every time the native message loop yields to the Looper record whether it
    dispatches some input event referring to touch in the content area before
    returning back to the native message loop. The latter scenario may mean that
    the touch event was dispatched to the Android UI views. Alternatively, it
    can happen when the Looper decided to run the message loop handler first.
  </summary>
</histogram>

<histogram name="Android.InputHintChecker.InputHintResult"
    enum="InputHintResult" expires_after="2026-12-27">
  <owner>pasko@chromium.org</owner>
  <owner>mthiesse@chromium.org</owner>
  <summary>
    Records the status of the InputHintChecker initialization. This
    initialization procedure is required to be able to later poll for
    availability of unhandled input events queued. Recorded immediately after
    finishing the initialization, which should happen once during early browser
    process initialization.

    A failure may be recorded after initialization succeeds (which itself
    records a sample) if reading the input hint fails. In this case only the
    first failure is recorded.

    Note: This metric became randomly subsampled in M136 (136.0.7064.0) to
    reduce overhead. The low data volume warning on the dashboard for this
    transition can be ignored.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.Browser.EventsAfterTransfer"
    enum="MotionEventAction" expires_after="2027-02-07">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    The metric is only recorded when touch sequence is successfully transferred
    from Browser to Viz(when InputOnViz feature flag is enabled). The histogram
    is emitted for discrete events seen between inital DOWN on which transfer
    was requested, and the CANCEL received corresponding to DOWN from Android,
    excluding both of these events.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.Browser.EventTypesInDroppedSequence"
    enum="MotionEventAction" expires_after="2027-01-03">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    The metric is recorded when a touch sequence in Browser fails to transfer
    while while there's a potentially ongoing touch sequence on Viz. The metric
    records the type of event that was dropped.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.Browser.NewSequenceTransferredByOS"
    enum="TransferredSequenceType" expires_after="2026-11-22">
  <owner>amanvr@google.com</owner>
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    Logged whenever an ACTION_UP event is received on Browser while in
    kConsumeEventsUntilCancel state. This indicates that the OS transferred a
    different touch sequence than the one Chrome requested.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.Browser.NumEventsInDroppedSequence2"
    units="counts" expires_after="2026-11-22">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    The metric is recorded when a touch sequence in Browser fails to transfer
    while while there's a potentially ongoing touch sequence on Viz. The metric
    records the number of events lost in such cases.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.Browser.SequenceDroppedReason3"
    enum="InputOnVizSequenceDroppedReason" expires_after="2027-01-24">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    Records the reason a touch sequence was dropped on browser process while
    InputOnViz was enabled. A dropped touch sequence would have not have any
    affect on web contents, the input events never get transferred over to
    Renderer for such a sequence.

    The histogram is emitted every time a touch sequence is dropped on Browser
    procoess due to various reasons, when InputOnViz feature is enabled.

    `Android.InputOnViz.Browser.EventTypesInDroppedSequence` and
    `Android.InputOnViz.Browser.NumEventsInDroppedSequence2` could be used to
    know what type of events exist in dropped sequences and the number of events
    in these dropped sequences.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.Browser.TouchMovesSeenAfterTransfer"
    units="counts" expires_after="2027-02-07">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    The metric is only recorded when touch sequence is successfully transferred
    from Browser to Viz(when InputOnViz feature flag is enabled). It records the
    number of touch moves received on Browser before receiving a TOUCH_CANCEL,
    which would be the last event Browser sees for that sequence after a
    successful transfer.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.Browser.TransferInputToVizResult2"
    enum="TransferInputToVizResult" expires_after="2027-02-07">
  <owner>kartarsingh@google.com</owner>
  <owner>amanvr@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    The metric is only recorded when transfer of input sequence from Browser to
    Viz is supported.

    It records the result of transferring input sequence from Browser. The
    sequence can be handled by Browser/Viz based on various factors like if Ime
    is active, or touch selection is active, etc. V2 adds the
    kSharedMemoryUnavailable and kPositiveEventAndDownTimeDelta bucket.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.InputReceiverCreationResult"
    enum="CreateAndroidInputReceiverResult" expires_after="2027-02-07">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    Records result of InputReceiver creation on Viz. When Android returns null
    pointer to some of the API calls made, input receiver creation API call
    cannot be issued. This histogram tracks if input receiver creation was
    successful or failed due to some reason.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.Viz.DroppedKeyEvent.Type"
    enum="AInputEventType" expires_after="2027-02-14">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    Records the type of key event as gotten from `AInputEvent_getType` Android
    NDK API. Viz is not exepcted to receive key events, but in practice it does
    due to races in focus handling at startup. All the key events received on
    Viz are dropped and reported in this histogram.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.Viz.DroppedNonTouchActions2"
    enum="MotionEventAction" expires_after="2026-08-02">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    Records the actions of input events that were dropped on Viz due to lack of
    implementation. Viz expects to only handle touch events which means it
    doesn't expect to see actions like button down/release.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.Viz.DroppedSequences.EventAndDownTimeDelta"
    enum="DroppedSequenceEventAndDownTimeDelta" expires_after="2027-01-03">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    For dropped touch sequences, records the delta between event time and down
    time for the ACTION_DOWN event. This is recorded when a touch down for a
    sequence is dropped on Viz.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.Viz.PendingStateTransfers.{CurrentState}"
    units="counts" expires_after="2026-08-02">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    When `InputOnViz` is enabled Browser process sends state on TouchDown to Viz
    in case touch transfer was successful. In theory, due to hiccups in system
    we can have multiple pending states on Viz.

    This metric records the number of pending states on Viz when {CurrentState}.
    This would help us verify if we have pending states in practice as well.
  </summary>
  <token key="CurrentState">
    <variant name="NonNullCurrentState" summary="current state is non-null"/>
    <variant name="NullCurrentState" summary="current state is null"/>
  </token>
</histogram>

<histogram name="Android.InputOnViz.Viz.SequenceDroppedReason"
    enum="VizSequenceDroppedReason" expires_after="2027-01-03">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    Viz side variant of `Android.InputOnViz.Browser.SequenceDroppedReason3`
    histogram.

    The metric records whenever a touch sequence is dropped on Viz side.
  </summary>
</histogram>

<histogram name="Android.InputOnViz.Viz.StateProcessingResult3"
    enum="InputOnVizStateProcessingResult" expires_after="2026-12-27">
  <owner>kartarsingh@google.com</owner>
  <owner>woa-performance-team@google.com</owner>
  <summary>
    Records what happened to state received on Viz, upon successful transfer of
    a touch sequence the Browser process sends over touch transfer state for Viz
    to handle input sequence.

    Compared to `Android.InputOnViz.Viz.StateProcessingResult2`, version 3 of
    histogram further splits some of the `ProcessedSuccessfully` cases into
    `TransferBackToBrowserSuccessfully` and `DroppedTransferBackToBrowserFailed`
    buckets.
  </summary>
</histogram>

<histogram name="Android.InputStream.LastGetByteArrayRegionTime" units="ms"
    expires_after="2026-10-01">
  <owner>peconn@chromium.org</owner>
  <owner>webview-team@google.com</owner>
  <summary>
    Time spent on the final call to getByteArrayRegion when copying data from
    the InputStream. Recorded when the InputStream is destroyed.
  </summary>
</histogram>

<histogram name="Android.InputStream.TotalGetByteArrayRegionTime" units="ms"
    expires_after="2026-10-01">
  <owner>peconn@chromium.org</owner>
  <owner>webview-team@google.com</owner>
  <summary>
    Time spent on all calls to getByteArrayRegion when copying data from the
    InputStream. Recorded when the InputStream is destroyed.
  </summary>
</histogram>

<histogram name="Android.InputStream.TotalJavaReadTime" units="ms"
    expires_after="2026-10-01">
  <owner>peconn@chromium.org</owner>
  <owner>webview-team@google.com</owner>
  <summary>
    Total wall clock time spent reading from the Java InputStream into the
    temporary buffer. Recorded when the InputStream is destroyed.
  </summary>
</histogram>

<histogram name="Android.InputStream.TotalRead.SizeKB" units="KB"
    expires_after="2026-06-01">
  <owner>peconn@chromium.org</owner>
  <owner>webview-team@google.com</owner>
  <summary>
    Records how much data has been transferred through
    embedder_support::InputStream. Recorded when that object is destroyed.
  </summary>
</histogram>

<histogram name="Android.InputStream.TotalTransferTime" units="ms"
    expires_after="2026-10-01">
  <owner>peconn@chromium.org</owner>
  <owner>webview-team@google.com</owner>
  <summary>
    Sum total of the wall clock time spent in all InputStream::Read calls.
    Recorded when that object is destroyed.
  </summary>
</histogram>

<histogram name="Android.Intent.BringTabToFront.Result"
    enum="BringTabToFrontResult" expires_after="2026-12-31">
  <owner>philyan@chromium.org</owner>
  <owner>skavuluru@google.com</owner>
  <summary>
    Records the outcome of attempting to bring a tabbed activity to the front
    using a multi-window intent. This helps track the success rate and failure
    reasons of the MoveToFrontInLaunchIntentDispatcher feature.
  </summary>
</histogram>

<histogram name="Android.Intent.HasNonSpoofablePackageName" enum="Boolean"
    expires_after="2024-12-01">
  <owner>katzz@google.com</owner>
  <owner>chrome-connective-tissue@google.com</owner>
  <summary>
    Android only. Boolean histogram denoting whether the package name can be
    retrieved in a non-spoofable way from the View Intents sent to Chrome. When
    the histogram returns true, it means we can confirm the package name was
    passed by the defined host app. Emitted upon launching the tabbed Chrome
    Activity via View Intent.
  </summary>
</histogram>

<histogram name="Android.Intent.IdentityShared" enum="Boolean"
    expires_after="2024-09-01">
  <owner>jinsukkim@google.com</owner>
  <owner>chrome-connective-tissue@google.com</owner>
  <summary>
    Android only. Boolean histogram denoting whether the package name is
    available by the sender sharing its identity using the new API introduced in
    Android U. This means we can confirm the package name was passed by the
    defined host app. Emitted upon launching the tabbed Chrome Activity via View
    Intent.
  </summary>
</histogram>

<histogram name="Android.Intent.IntentLaunchFromTabCreation" enum="Boolean"
    expires_after="2026-08-30">
  <owner>nafisabedin@google.com</owner>
  <owner>mthiesse@chromium.org</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records whether a tab was created due to an external app to launch an intent
    for an external app.

    The false counts, and thus the PDF, for this metric is not meaningful.
    Instead, utilize the true counts with another such as
    MobileStartup.LaunchCause.EXTERNAL_VIEW_INTENT as the denominator to
    determine the proportion of redirects.
  </summary>
</histogram>

<histogram name="Android.Intent.InterceptNavigationDeferDuration" units="ms"
    expires_after="2026-08-09">
  <owner>mthiesse@chromium.org</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the duration of a deferred navigation due to the
    InterceptNavigationThrottle, every time a navigation is deferred.

    At time of writing, this can only be caused by the ExternalNavigationHandler
    on Android, and should only happen when background/early navigations
    redirect.
  </summary>
</histogram>

<histogram name="Android.Intent.LaunchInInstance.EarlyFailureReason"
    enum="LaunchInInstanceEarlyFailureReason" expires_after="2026-12-31">
  <owner>philyan@chromium.org</owner>
  <owner>skavuluru@google.com</owner>
  <summary>
    Records the reason for early failure when launching an intent into an
    existing multi-window instance. Recorded only when an early failure occurs.
  </summary>
</histogram>

<histogram name="Android.Intent.LaunchInInstance.{Api}.Result"
    enum="BooleanSuccess" expires_after="2026-12-31">
  <owner>philyan@chromium.org</owner>
  <owner>skavuluru@google.com</owner>
  <summary>
    Records the success or failure of attempting to bring a task to the front
    using the {Api} API path.
  </summary>
  <token key="Api">
    <variant name="AppTaskStartActivity" summary="AppTask.startActivity()"/>
    <variant name="SafeStartActivity"
        summary="IntentUtils.safeStartActivity()"/>
  </token>
</histogram>

<histogram name="Android.Intent.MainFrameIntentLaunch"
    enum="MainFrameIntentLaunch" expires_after="2027-02-07">
  <owner>mthiesse@chromium.org</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Recorded when an external app is launched as the result of a navigation.
    Records the source and scheme of the navigation.
  </summary>
</histogram>

<histogram name="Android.Intent.TrustedReferrer" enum="IntentReferrer"
    expires_after="2027-06-09">
  <owner>mthiesse@chromium.org</owner>
  <owner>yfriedman@google.com</owner>
  <summary>
    Records whether, and why, we used a trusted referrer on an Intent coming
    from another app.
  </summary>
</histogram>

<histogram
    name="Android.IsolatedSplits.ClassLoaderReplaced.{AndroidFeatureModuleName}"
    enum="BooleanYesNo" expires_after="2027-07-26">
  <owner>cduvall@chromium.org</owner>
  <owner>agrieve@chromium.org</owner>
  <summary>
    Whether a split Context has had its ClassLoader replaced due to b/172602571.
    This is recorded every time a split Context is created.
    {AndroidFeatureModuleName}
  </summary>
</histogram>

<histogram
    name="Android.IsolatedSplits.ContextCreateTime2.{AndroidFeatureModuleName}"
    units="ms" expires_after="2027-02-07">
  <owner>cduvall@chromium.org</owner>
  <owner>agrieve@chromium.org</owner>
  <owner>smaier@chromium.org</owner>
  <summary>
    Amount of time it takes to create a new Context for a split. This will only
    be recorded if isolated splits are enabled. Different from ContextCreateTime
    as only the first load of a split will be counted.
    {AndroidFeatureModuleName}
  </summary>
</histogram>

<histogram
    name="Android.IsolatedSplits.ContextCreateTime3.{AndroidFeatureModuleName}"
    units="ms" expires_after="2026-07-19">
  <owner>cduvall@chromium.org</owner>
  <owner>agrieve@chromium.org</owner>
  <owner>smaier@chromium.org</owner>
  <summary>
    Amount of time it takes to create a new Context and load a class for a
    split. This is simply ContextCreateTime2 + LoadFirstClassTime.
    {AndroidFeatureModuleName}
  </summary>
</histogram>

<histogram
    name="Android.IsolatedSplits.LoadFirstClassTime.{AndroidFeatureModuleName}"
    units="ms" expires_after="2026-07-19">
  <owner>cduvall@chromium.org</owner>
  <owner>agrieve@chromium.org</owner>
  <owner>smaier@chromium.org</owner>
  <summary>
    Amount of time it takes to load the first class in a split. This will only
    be recorded if there is a hardcoded class to load in SplitChromeApplication.
    Happens right after the Context is created. {AndroidFeatureModuleName}
  </summary>
</histogram>

<histogram
    name="Android.IsolatedSplits.PreloadWaitTime.{AndroidFeatureModuleName}"
    units="ms" expires_after="2025-12-07">
  <owner>cduvall@chromium.org</owner>
  <owner>agrieve@chromium.org</owner>
  <owner>smaier@chromium.org</owner>
  <summary>
    Amount of time spent waiting for a split preload task to finish. This will
    only be recorded if isolated splits are enabled. This histogram was expired
    between 2023-11-12 and 2024-08-23. {AndroidFeatureModuleName}
  </summary>
</histogram>

<histogram name="Android.Jank.AsyncTaskGetOnUiThreadStatus"
    enum="AsyncTaskStatus" expires_after="2024-06-30">
  <owner>smaier@chromium.org</owner>
  <owner>agrieve@chromium.org</owner>
  <summary>
    The status of an AsyncTask when get() is called on the UI thread. This is
    only recorded if the AsyncTask isn't immediately available.

    Seeing the distribution of PENDING vs RUNNING tasks will give us a better
    idea for how to approach these hangs.
  </summary>
</histogram>

<histogram name="Android.KernelVersion" enum="AndroidKernelVersion"
    expires_after="2027-01-17">
  <owner>rsesek@chromium.org</owner>
  <summary>
    Reports the kernel major and minor version from the utsname.release field.
    The low 16 bits of each version are combined into a 32-bit integer. The
    range is from [0x00020006,0x0004000a] to track kernel versions 2.6 through
    4.10.
  </summary>
</histogram>

<histogram name="Android.LauncherShortcut.UpdateFailure"
    enum="LauncherShortcutUpdateFailure" expires_after="2027-01-17">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records failures when trying to update dynamic shortcuts in
    LauncherShortcutActivity. Recorded when setDynamicShortcuts is rate-limited
    or exceeds the maximum number of shortcuts.
  </summary>
</histogram>

<histogram name="Android.LibraryLoader.Prefetch.Duration" units="ms"
    expires_after="2026-12-22">
  <owner>ziadyoussef@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <owner>woa-performance@google.com</owner>
  <summary>
    The time for prefetching the native library code to memory. Recorded once
    per process start when prefetching is used.
  </summary>
</histogram>

<histogram name="Android.LibraryLoader.Prefetch.ForkDuration"
    units="microseconds" expires_after="2026-12-22">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <owner>woa-performance@google.com</owner>
  <summary>
    Time taken to perform the fork() call in the library prefetcher when using
    the PrefetchWithFork strategy. This measures the duration of the clone
    syscall from the parent process, not the lifetime of the child process. The
    whole parent process (not just the calling thread) can be blocked for this
    duration, so this can represent a delay in startup.

    This is emitted regardless of whether the fork/prefetch succeeds, though it
    is extremely rare for the fork itself to fail (see the .Status histogram).

    Emitted during native library prefetch (normally in renderer process init),
    only for Android WebView and only when the LibraryPrefetcherMadvise feature
    is disabled.
  </summary>
</histogram>

<histogram name="Android.LibraryLoader.Prefetch.Madvise" enum="Boolean"
    expires_after="2026-12-22">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <owner>woa-performance@google.com</owner>
  <summary>
    True iff madvise MADV_WILLNEED is supported (and will be used to prefetch
    the native library). Does not state whether madvise was successful for the
    actual prefetch (see Android.LibraryLoader.Prefetch.Status instead.)

    Emitted during native library prefetch (normally in renderer process init),
    only for Android WebView and only when the LibraryPrefetcherMadvise feature
    is enabled.
  </summary>
</histogram>

<histogram name="Android.LibraryLoader.Prefetch.Status" enum="PrefetchStatus"
    expires_after="2026-12-22">
  <owner>ziadyoussef@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <owner>woa-performance@google.com</owner>
  <summary>
    Reports the result of prefetching native code into memory. Recorded once per
    process start when prefetching is used.
  </summary>
</histogram>

<histogram name="Android.MaybeCopyContentAreaAsBitmap.Time" units="ms"
    expires_after="2027-01-24">
  <owner>chikamune@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Measures how long the MaybeCopyContentAreaAsBitmap function takes. This is
    emitted only when a navigation entry screenshot is captured.
  </summary>
</histogram>

<histogram name="Android.MediaPickerShown" enum="MediaPickerShown"
    expires_after="2026-11-29">
  <owner>finnur@chromium.org</owner>
  <owner>peter@chromium.org</owner>
  <summary>
    Recorded once per batch of files uploaded, when Chrome has made the
    determination of what media picker to show to the user.
  </summary>
</histogram>

<histogram name="Android.MemoryPressureNotification{AndroidProcessType}"
    enum="Android.MemoryPressureNotification" expires_after="2021-12-05">
  <owner>ssid@chromium.org</owner>
  <summary>
    Memory pressure notifications sent by Android through ComponentCallbacks2.
    This metric was added 04/2018; for prior data for the browser process see
    MemoryAndroid.NotificationBackground and
    MemoryAndroid.NotificationForeground. {AndroidProcessType}
  </summary>
  <token key="AndroidProcessType">
    <variant name=".Browser" summary="Browser process"/>
    <variant name=".ChildService"
        summary="Child service process (renderer, GPU, etc.)"/>
  </token>
</histogram>

<histogram name="Android.Messages.DismissedWithoutFullyVisible"
    enum="MessageIdentifier" expires_after="2026-08-23">
  <owner>aishwaryarj@google.com</owner>
  <owner>src/components/messages/OWNERS</owner>
  <summary>
    Records the message identifier when the message is dismissed without being
    fully visible before. This only tracks the case in which message is
    dismissed by primary action, secondary action, gesture and timer.
  </summary>
</histogram>

<histogram name="Android.Messages.Dismissed{MessageIdentifier}"
    enum="MessageDismissReason" expires_after="2027-02-07">
  <owner>aishwaryarj@google.com</owner>
  <owner>src/components/messages/OWNERS</owner>
  <summary>
    Recorded once per message when the message is dismissed to capture the
    dismissal reason (e.g. primary button tap, timeout). The histogram can be
    used for measuring user engagement with messages of different types.
  </summary>
  <token key="MessageIdentifier" variants="MessageIdentifiers"/>
</histogram>

<histogram name="Android.Messages.Enqueued" enum="MessageIdentifier"
    expires_after="2027-02-21">
  <owner>aishwaryarj@google.com</owner>
  <owner>src/components/messages/OWNERS</owner>
  <summary>
    Records the message identifier each time a message is enqueued through
    MessageDispatcher (the entry point to Chrome for Android's messages system).
    This histogram can be used for getting a count of messages broken down by
    message identifier.
  </summary>
</histogram>

<histogram name="Android.Messages.Enqueued.Hidden" enum="MessageIdentifier"
    expires_after="2026-12-06">
  <owner>aishwaryarj@google.com</owner>
  <owner>src/components/messages/OWNERS</owner>
  <summary>
    Records the message identifier when an enqueued message is not immediately
    displayed either because there is another message on the secreen or because
    message scope (e.g. tab) is not active.
  </summary>
</histogram>

<histogram name="Android.Messages.Enqueued.Visible" enum="MessageIdentifier"
    expires_after="2027-02-21">
  <owner>aishwaryarj@google.com</owner>
  <owner>src/components/messages/OWNERS</owner>
  <summary>
    Records the message identifier when a message is displayed immediately when
    it is enqueued. This includes cases when there are no other messages on the
    screen as well as cases when the new message is high priority and causes
    some other message to hide.
  </summary>
</histogram>

<histogram name="Android.Messages.FullyVisible" enum="MessageIdentifier"
    expires_after="2027-01-17">
  <owner>aishwaryarj@google.com</owner>
  <owner>src/components/messages/OWNERS</owner>
  <summary>
    Records the message identifier every time it becomes fully visible to users.
    Can be recorded multiple times during its lifetime.
  </summary>
</histogram>

<histogram name="Android.Messages.TimeToAction{MessageIdentifier}" units="ms"
    expires_after="2027-02-07">
  <owner>aishwaryarj@google.com</owner>
  <owner>src/components/messages/OWNERS</owner>
  <summary>
    Records the time interval the message was displayed on the screen before the
    user explicitly dismissed it. The metric is recorded when the user presses
    primary or secondary button, or dismisses the message with a gesture. It is
    not recorded when the message is auto-dismissed based on timer. The interval
    includes both enter and exit animation. The metric can be used to analyze
    the amount of time it takes for the user to understand the message and take
    an action (e.g. click a button, dismiss the message, etc.).
  </summary>
  <token key="MessageIdentifier" variants="MessageIdentifiers"/>
</histogram>

<histogram name="Android.Messages.TimeToFullyShow{MessageIdentifier}"
    units="ms" expires_after="2027-02-07">
  <owner>aishwaryarj@google.com</owner>
  <owner>src/components/messages/OWNERS</owner>
  <summary>
    Recorded once per message measuring the duration from the moment it is
    enqueued to the first time it becomes fully shown. Recorded when the message
    becomes fully shown.
  </summary>
  <token key="MessageIdentifier" variants="MessageIdentifiers"/>
</histogram>

<histogram name="Android.MultiInstance.MaxActiveInstanceCount"
    units="instances" expires_after="2027-02-14">
  <owner>rathomas@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    The maximum number of active Chrome instances that ran at the same time in a
    24-hour period. Checked whenever there is an activity state change to log
    the stats once in 24 hours.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.MaxInstanceCount" units="instances"
    expires_after="2027-02-07">
  <owner>jinsukkim@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    The maximum number of Chrome instances that ran at the same time in a
    24-hour period. Checked whenever there is an activity state change to log
    the stats once in 24 hours.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.MaxInstanceCountIncognito"
    units="instances" expires_after="2027-01-10">
  <owner>shuyng@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <owner>mklw@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    The maximum number of Chrome Incognito-only instances that ran at the same
    time in a 24-hour period. Checked whenever there is an activity state change
    to log the stats once in 24 hours.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.MaxWindowLimitExceeded" enum="Boolean"
    expires_after="2027-01-17">
  <owner>ranjithkagathi@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Records the exceeded status when attempted to open a new chrome window. The
    value is set to true when attempted to exceed the maximum number of allowed
    chrome windows, the value is set to false otherwise. See also related
    metrics &quot;Android.MultiInstance.NumActivities&quot; and
    &quot;Android.MultiInstance.NumInstances&quot; which record the count of
    windows.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.MigrationAttempts" units="count"
    expires_after="2027-02-07">
  <owner>zheliooo@google.com</owner>
  <owner>aishwaryarj@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    The total number of attempts made to migrate multi-instance data from
    SharedPreferences to Protobuf. Recorded when the migration successfully
    completes, or when it reaches the terminal attempt limit (3) and gives up.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.NumActivities" units="activities"
    expires_after="2027-01-10">
  <owner>jinsukkim@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records the number of running ChromeTabbedActivity's on every
    ChromeTabbedActivity startup. This includes activities that may not be
    visible on screen (i.e. it includes ChromeTabbedActivity's in the
    &quot;stopped&quot; state). This does not include ChromeTabbedActivity's
    that have been destroyed regardless of whether their owning Android Task may
    be retrieved in Android Recents. Applicable to Android S+ only.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.NumActivities.DesktopWindow"
    units="activities" expires_after="2026-11-22">
  <owner>aishwaryarj@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the number of running ChromeTabbedActivity's on every
    ChromeTabbedActivity startup in a desktop window. This includes activities
    that may not be visible on screen (i.e. it includes ChromeTabbedActivity's
    in the &quot;stopped&quot; state). This does not include
    ChromeTabbedActivity's that have been destroyed regardless of whether their
    owning Android Task may be retrieved in Android Recents. Applicable to
    Android V+ only.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.NumActivities.DesktopWindow.Incognito"
    units="activities" expires_after="2027-01-10">
  <owner>shuyng@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <owner>mklw@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the number of running Incognito-only ChromeTabbedActivity's on every
    ChromeTabbedActivity startup in a desktop window. This includes activities
    that may not be visible on screen (i.e. it includes ChromeTabbedActivity's
    in the &quot;stopped&quot; state). This does not include
    ChromeTabbedActivity's that have been destroyed regardless of whether their
    owning Android Task may be retrieved in Android Recents. Applicable to
    Android V+ only.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.NumActivities.Incognito"
    units="activities" expires_after="2027-01-10">
  <owner>shuyng@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <owner>mklw@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the number of running Incognito-only ChromeTabbedActivity's on every
    ChromeTabbedActivity startup. This includes activities that may not be
    visible on screen (i.e. it includes ChromeTabbedActivity's in the
    &quot;stopped&quot; state). This does not include ChromeTabbedActivity's
    that have been destroyed regardless of whether their owning Android Task may
    be retrieved in Android Recents. Applicable to Android S+ only.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.NumInstances" units="instances"
    expires_after="2027-01-10">
  <owner>jinsukkim@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    The number of allocated instance IDs which corresponds to the number of
    retrievable Chrome instances (aka windows). An instance is considered
    retrievable if it has tab state data on disk irrespective of whether that
    data is currently assigned to a running ChromeTabbedActivity. These
    instances may be retrieved from Chrome's in-app window manager from Android
    Recents if they are associated with a live ChromeTabbedActivity or Android
    Task. Recorded on every ChromeTabbedActivity start-up. Applicable to Android
    S+ only.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.NumInstances.DesktopWindow"
    units="instances" expires_after="2027-01-24">
  <owner>aishwaryarj@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    The number of allocated instance IDs which corresponds to the number of
    retrievable Chrome instances (aka windows). An instance is considered
    retrievable if it has tab state data on disk irrespective of whether that
    data is currently assigned to a running ChromeTabbedActivity. These
    instances may be retrieved from Chrome's in-app window manager from Android
    Recents if they are associated with a live ChromeTabbedActivity or Android
    Task. Recorded on every ChromeTabbedActivity start-up in a desktop window.
    Applicable to Android V+ only.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.NumInstances.DesktopWindow.Incognito"
    units="instances" expires_after="2027-01-10">
  <owner>shuyng@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <owner>mklw@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    The number of allocated Incognito-only instance IDs which corresponds to the
    number of retrievable Chrome instances (aka windows). An instance is
    considered retrievable if it has tab state data on disk irrespective of
    whether that data is currently assigned to a running ChromeTabbedActivity.
    These instances may be retrieved from Chrome's in-app window manager from
    Android Recents if they are associated with a live ChromeTabbedActivity or
    Android Task. Recorded on every ChromeTabbedActivity start-up in a desktop
    window. Applicable to Android V+ only.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.NumInstances.Incognito"
    units="instances" expires_after="2027-01-10">
  <owner>shuyng@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <owner>mklw@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    The number of allocated Incognito-only instance IDs which corresponds to the
    number of retrievable Chrome instances (aka windows). An instance is
    considered retrievable if it has tab state data on disk irrespective of
    whether that data is currently assigned to a running ChromeTabbedActivity.
    These instances may be retrieved from Chrome's in-app window manager from
    Android Recents if they are associated with a live ChromeTabbedActivity or
    Android Task. Recorded on every ChromeTabbedActivity start-up. Applicable to
    Android S+ only.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.PersistAcrossReboots.IdVerification"
    enum="PersistentStateIdVerification" expires_after="2027-02-07">
  <owner>clhager@google.com</owner>
  <owner>twellington@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    The result of comparing the saved ID of the persistent state received in
    #onCreate() with the latest ID saved for the persistent state associated
    with that instance. This verification informs whether the OS has passed the
    same persistent state to the app after recreation that the app passed to the
    OS when the original instance was stopping for a device reboot or app
    update. A mismatch in IDs could indicate an OS bug resulting in the
    persistent state passed to the app being outdated. Note that only the ID is
    checked as a proxy for the bundle contents, the contents themselves are not
    verified.
  </summary>
</histogram>

<histogram name="Android.MultiInstance.WindowManager.DesktopWindowModeState"
    enum="DesktopWindowModeState" expires_after="2027-01-24">
  <owner>aishwaryarj@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the desktop windowing mode state when the Chrome window manager is
    opened from the app menu.
  </summary>
</histogram>

<histogram name="Android.MultipleUserProfilesState"
    enum="MultipleUserProfilesState" expires_after="2026-12-27">
  <owner>ckitagawa@chromium.org</owner>
  <owner>yfriedman@chromium.org</owner>
  <owner>chrome-metrics-team@google.com</owner>
  <summary>
    Records whether multiple user profiles are present in Android.

    This is recorded every time a metrics log is created.
  </summary>
</histogram>

<histogram name="Android.MultiWindow.CrashRecoveryDuration" units="ms"
    expires_after="2027-05-14">
  <owner>aishwaryarj@google.com</owner>
  <owner>zheliooo@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the time it takes to successfully recover all windows from the
    previous Chrome session after an app crash, when the user opts to restore
    all windows from the recovery prompt.
  </summary>
</histogram>

<histogram name="Android.MultiWindow.CrashRecoveryWindowCount" units="windows"
    expires_after="2027-05-14">
  <owner>aishwaryarj@google.com</owner>
  <owner>zheliooo@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the number of windows that were active at the time of a crash,
    determined from the crash recovery data. Recorded when the first
    ChromeTabbedActivity starts up in a new browser process after an unclean app
    exit is detected.
  </summary>
</histogram>

<histogram name="Android.MultiWindow.Occlusion.CalculateDuration" units="ms"
    expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the duration of the calculateOcclusion function in
    WindowOcclusionTracker. Emitted when window position changes or windows are
    redrawn.
  </summary>
</histogram>

<histogram name="Android.MultiWindow.Occlusion.CalculateResult"
    enum="WindowOcclusionCalculateResult" expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the result of WindowOcclusionTracker calculateOcclusion operation.
    Emitted when window position changes or windows are redrawn.
  </summary>
</histogram>

<histogram
    name="Android.MultiWindow.Occlusion.OcclusionCaclulationsPer5Minutes"
    units="count" expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the number of times WindowOcclusionTracker recalculates occlusion
    over the preceding 5 minutes. Emitted every 5 minutes while occlusion
    tracking is active.
  </summary>
</histogram>

<histogram name="Android.MultiWindow.Occlusion.TrackResult" enum="Boolean"
    expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the result of WindowOcclusionTracker track operation. Emitted when a
    new window is created. False if the root view could not be found, true on
    success.
  </summary>
</histogram>

<histogram name="Android.MultiWindow.Occlusion.UntrackResult" enum="Boolean"
    expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the result of WindowOcclusionTracker untrack operation. Emitted when
    a window is destroyed. False if the root view could not be found, true on
    success.
  </summary>
</histogram>

<histogram name="Android.MultiWindow.WindowZOrder.DisplaysCount" units="count"
    expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the number of displays being tracked for WindowZOrderTracker.
    Recorded every 5 minutes.
  </summary>
</histogram>

<histogram name="Android.MultiWindow.WindowZOrder.PromotionCount" units="count"
    expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the number of times a window was promoted to the top of the z-order
    by WindowZOrderTracker over the preceding 5 minutes. Recorded every 5
    minutes while occlusion tracking is enabled.
  </summary>
</histogram>

<histogram name="Android.MultiWindow.WindowZOrder.ResumedCount" units="count"
    expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the number of activity top resumed state transitions handled by
    WindowZOrderTracker over the preceding 5 minutes. Recorded every 5 minutes
    while occlusion tracking is enabled.
  </summary>
</histogram>

<histogram name="Android.MultiWindow.WindowZOrder.TrackedWindowsCount"
    units="count" expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the number of windows tracked by WindowZOrderTracker. Recorded every
    5 minutes.
  </summary>
</histogram>

<histogram name="Android.MultiWindowMode.Active" enum="BooleanEnabled"
    expires_after="never">
<!-- expires-never: topline metric for monitoring multi-window mode usage on Chrome for Android. -->

  <owner>twellington@chromium.org</owner>
  <owner>tedchoc@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records on every metrics upload whether the activity is running in Android N
    multi-window mode or not.
  </summary>
</histogram>

<histogram
    name="Android.MultiWindowMode.AssertIndicesMatch{ActivityIndexMismatchAssignmentState}"
    enum="PreAssignedActivityState" expires_after="2027-01-31">
  <owner>wenyufu@chromium.org</owner>
  <owner>aishwaryarj@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    When the TabWindowManager allocates a different tab model index than the
    window Id selected by MultiInstanceManagerApi31, it means the requested tab
    model Id was assigned to a different Activity.

    When this mismatch happened, record whether the activity at the requested
    index is finishing, whether it is in the same task as the new activity, and
    if it's still visible in ActivityManager#getAppTasks. Record
    &quot;Unknown&quot; if the activity cannot be found. Recorded when the
    mismatched index for the new activity is
    {ActivityIndexMismatchAssignmentState}.
  </summary>
  <token key="ActivityIndexMismatchAssignmentState"
      variants="ActivityIndexMismatchAssignmentState"/>
</histogram>

<histogram name="Android.MultiWindowMode.CloseWindow.AppSource3"
    enum="CloseWindowAppSource" expires_after="2027-02-07">
  <owner>aishwaryarj@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the source of instance closure, emitted when permanent instance
    state deletion is requested. Note that this does not account for Android
    system-initiated closures or closures due to user actions on system UI.
  </summary>
</histogram>

<histogram name="Android.MultiWindowMode.Configuration" enum="WindowingMode"
    expires_after="2027-02-14">
  <owner>aishwaryarj@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the configuration of the window that the app is running in. The
    histogram will be emitted when a window is created, and when the windowing
    mode changes. Recorded for tablet form factors only when desktop windowing
    is supported.
  </summary>
</histogram>

<histogram name="Android.MultiWindowMode.DraggedTabOpenedNewWindow"
    enum="Boolean" expires_after="2026-11-29">
  <owner>aishwaryarj@google.com</owner>
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Recorded when a new Chrome window is created from a dragged tab. The
    histogram records true when the dragged tab is successfully reparented to
    the new window, false when the reparenting of the dragged tab is not done.
  </summary>
</histogram>

<histogram name="Android.MultiWindowMode.InactiveInstanceRestore.AppSource2"
    enum="NewWindowAppSource" expires_after="2027-01-17">
  <owner>aishwaryarj@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the source of inactive instance restoration in a new activity.
  </summary>
</histogram>

<histogram name="Android.MultiWindowMode.NewWindow.AppSource4"
    enum="NewWindowAppSource" expires_after="2027-07-29">
  <owner>aishwaryarj@google.com</owner>
  <owner>rathomas@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records trigger source when a new window creation is requested.
  </summary>
</histogram>

<histogram
    name="Android.MultiWindowMode.PopupBoundsAdjustment.Delta{Axis}.Outcome.{CrossDisplay}"
    enum="Boolean" expires_after="2026-12-31">
  <owner>chominskib@google.com</owner>
  <owner>lt-web-apps-team@google.com</owner>
  <summary>
    After a contextual popup is spawned we may adjust its bounds so that size of
    the website viewport is as requested by the caller in the |window.open()|
    Javascript call. This records whether the absolute difference in {Axis}
    between initial popup bounds and adjusted popup bounds was zero pixels. The
    popup was opened on {CrossDisplay} its originating window.
  </summary>
  <token key="Axis">
    <variant name="Height" summary="height"/>
    <variant name="Width" summary="width"/>
  </token>
  <token key="CrossDisplay">
    <variant name="CrossDisplay" summary="a different display than"/>
    <variant name="InDisplay" summary="the same display as"/>
  </token>
</histogram>

<histogram
    name="Android.MultiWindowMode.PopupBoundsAdjustment.Delta{Axis}.Positive.{CrossDisplay}"
    units="dips" expires_after="2026-12-31">
  <owner>chominskib@google.com</owner>
  <owner>lt-web-apps-team@google.com</owner>
  <summary>
    After a contextual popup is spawned we may adjust its bounds so that size of
    the website viewport is as requested by the caller in the |window.open()|
    Javascript call. This records the absolute difference in {Axis} between
    initial popup bounds and adjusted popup bounds. Records only positive
    differences. The popup was opened on {CrossDisplay} its originating window.
  </summary>
  <token key="Axis">
    <variant name="Height" summary="height"/>
    <variant name="Width" summary="width"/>
  </token>
  <token key="CrossDisplay">
    <variant name="CrossDisplay" summary="a different display than"/>
    <variant name="InDisplay" summary="the same display as"/>
  </token>
</histogram>

<histogram name="Android.MultiWindowMode.PopupOpensInNewWindow" enum="Boolean"
    expires_after="2026-12-31">
  <owner>chominskib@google.com</owner>
  <owner>lt-web-apps-team@google.com</owner>
  <summary>
    Records the outcome of a |window.open()| JavaScript call that should open a
    new popup window. Recorded only when the |window.open()| call is guaranteed
    to be executed one way or another (i.e. does not record anything when popup
    blocker drops the request). If the popup is not opened in a new window, it
    is most likely opened as a new tab.
  </summary>
</histogram>

<histogram name="Android.MultiWindowMode.{WindowingMode}.Duration2" units="ms"
    expires_after="2027-02-14">
  <owner>rathomas@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Total time spent in {WindowingMode} mode in a given 24-hour period. The
    histogram will be emitted for a previous emission cycle when an activity in
    any windowing mode is stopped after more than 24 hours have elapsed since
    the start of this emission cycle.
  </summary>
  <token key="WindowingMode">
    <variant name="DefaultMultiWindow" summary="default multi-window"/>
    <variant name="DesktopWindow" summary="desktop windowing"/>
    <variant name="Fullscreen" summary="fullscreen"/>
    <variant name="PictureInPicture" summary="picture-in-picture"/>
  </token>
</histogram>

<histogram name="Android.Navigation.JavaObserverDuration.DidFinishNavigation"
    units="ms" expires_after="2027-02-07">
  <owner>sisidovski@chromium.org</owner>
  <owner>chrome-loading@google.com</owner>
  <summary>
    Records the duration of the didFinishNavigationInPrimaryMainFrame event
    dispatching to Java-side WebContentsObservers. Recorded on the browser main
    thread when a primary main frame navigation finishes (committed, aborted, or
    replaced).
  </summary>
</histogram>

<histogram name="Android.NTP.Impression" enum="NTPImpressionType"
    expires_after="2027-01-17">
  <owner>finkm@chromium.org</owner>
  <summary>
    Counts impressions of the NTP on Android. It also counts potential
    impressions. A potential impression is a place where it would make sense to
    open the NTP instead of the current view. E.g. the no-tab view is counted as
    a potential impression since this view could be replaced with the NTP. For
    better comparison regular impressions are also counted. The no-tab view
    counting happens right after the user closed the last tab and the regular
    impression counting happens at construction time of the NTP (=whenever a new
    tab is opened).
  </summary>
</histogram>

<histogram name="Android.Omnibox.ActionInSuggest.IntentResult"
    enum="ActionInSuggestIntentResult" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records the outcome of the User's interaction with ActionInSuggest chips,
    breaking down the cases where the intent could not be created or started.

    Recorded every time the user interacts with the ActionInSuggest, for the
    Action that the user interacted with. Not recorded if the user does not
    interact with ActionInSuggest.
  </summary>
</histogram>

<histogram name="Android.Omnibox.InputToNavigationControllerStart.Intent"
    units="ms" expires_after="2027-02-07">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <owner>chrome-brapp-loading@google.com</owner>
  <summary>
    Records time between the intent that triggered an Omnibox navigation on
    Android to the time the Omnibox code calls into the shared C++ navigation
    code (NavigationController). The UMA is recorded each time a URL is loaded
    in the NavigationController with a valid intent received timestamp.
  </summary>
</histogram>

<histogram name="Android.Omnibox.InputToNavigationControllerStart.UserInput"
    units="ms" expires_after="2027-02-07">
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <owner>chrome-brapp-loading@google.com</owner>
  <summary>
    Records time between the user input that triggered an Omnibox navigation on
    Android to the time the Omnibox code calls into the shared C++ navigation
    code (NavigationController). The UMA is recorded each time a URL is loaded
    in the NavigationController with a valid input start timestamp.
  </summary>
</histogram>

<histogram name="Android.Omnibox.InputToNavigationControllerStart2" units="ms"
    expires_after="2026-12-20">
  <owner>spelchat@chromium.org</owner>
  <owner>gjc@google.com</owner>
  <owner>chrome-loading@google.com</owner>
  <owner>chrome-brapp-loading@google.com</owner>
  <summary>
    Records time between the user input that triggered an Omnibox navigation on
    Android to the time the Omnibox code calls into the shared C++ navigation
    code (NavigationController). The UMA is recorded each time a URL is loaded
    in the NavigationController with a valid input start timestamp.

    Compared to InputToNavigationControllerStart2, this metric filters out cases
    where the input start timestamp is 0, which can happen for some
    browser-initiated navigations (e.g. opening URL in a new tab).
  </summary>
</histogram>

<histogram name="Android.Omnibox.InvalidMatch" enum="MatchResult"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Recorded every time AutocompleteController.java interacts with
    autocomplete_controller_android.cc. Indicates how often matches referenced
    by Java are different from the matches referenced by C++ at any position.

    Note: starting Chrome 118, this is recorded every time we detect a
    non-cached match, when Native and Java AutocompleteResult objects differ.
  </summary>
</histogram>

<histogram name="Android.Omnibox.JumpStartState" enum="OmniboxJumpStartState"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records the JumpStart feature eligibility and user preference state during
    cold start. Logged once per cold start.

    Note: There is a recording gap between: 2026.07-2026.08.
  </summary>
</histogram>

<histogram name="Android.Omnibox.MobileFusebox.ReanchorViews.Duration"
    units="ms" expires_after="2027-10-01">
  <owner>skym@chromium.org</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the duration of reanchorViewsForCompactFusebox in FuseboxViewBinder
    when updating layout constraints. Recorded each time the binder reanchors
    views.
  </summary>
</histogram>

<histogram name="Android.Omnibox.MobileFusebox.SetActiveModelSource"
    enum="SetActiveModelSource" expires_after="2027-03-20">
  <owner>skym@chromium.org</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records the trigger source when setting the active model (or skipping
    setting when redundant) on the Composebox query controller in Fusebox.
  </summary>
</histogram>

<histogram name="Android.Omnibox.OmniboxAction.Used" enum="BooleanUsage"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Tracks the usage of Omnibox actions displayed in the Omnibox when the user
    completed interaction with the Omnibox, if at least one action was shown to
    the user at that time.

    Value &quot;Used&quot; indicates that at least one OmniboxAction was shown
    to the user and it was used. Conversely, value &quot;Not Used&quot;
    signifies that although actions were displayed, none were employed.

    The histogram is not recorded if no actions were visible.

    The histogram is recorded once per Omnibox interaction, where at least one
    Omnibox Action was shown to the user at the time the user completed
    interaction with the Omnibox.

    Note: There is a recording gap between: 2026.07-2026.08.
  </summary>
</histogram>

<histogram name="Android.Omnibox.OmniboxAction.Valid" enum="BooleanValid"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Tracks the validity of Omnibox actions displayed in the Omnibox when the
    user completed interaction with the Omnibox, if at least one action was
    shown to the user at that time.

    Omnibox Actions can appear at any point, but the histogram only captures the
    ultimate state, disregarding any preceding events.

    An OmniboxAction is &quot;Valid&quot; if both Java and Native objects exist
    and are linked. &quot;Not Valid&quot; indicates a broken relationship, often
    due to Native AutocompleteResult becoming invalid.

    The histogram should ideally show values close to 100% validity.

    The histogram captures one value for every Omnibox Action displayed in the
    Suggestions list when the user completes the interaction with the Omnibox.

    Note: There is a recording gap between: 2026.07-2026.08.
  </summary>
</histogram>

<histogram name="Android.Omnibox.RefineActionUsage" enum="RefineActionUsage"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>jdonnelly@chromium.org</owner>
  <summary>
    Records interactions with the Search Refine button, differentiating by
    context (zero-prefix vs non-zero-prefix), including the cases where the User
    did not interact with the Refine button placed beside the Search suggestion
    at all.

    Recorded once per interaction with the Omnibox and Sugestions, when the
    Omnibox loses focus. This includes cases where the User chooses to navigate
    somewhere (both by using a suggestion or pressing Go button on keyboard), or
    abandons the Omnibox.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SearchActivity.ActivityPresent"
    enum="BooleanPresent" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records whether intent is updating an already present activity. For the most
    part the expected value here is 'false', indicating that the intent was
    starting a new session. A value of 'true' indicates that the SearchActivity
    was already focused and running when a new intent was received. Such intent
    would need to be emitted while SearchActivity is in foreground.

    Recorded once per intent.

    Note: There is a recording gap between: 2026.07-2026.08.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SearchActivity.IntentOrigin"
    enum="SearchActivityIntentOrigin" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Record the origin of an intent (i.e. from where the SearchActivity was
    called). Recorded once per intent.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SearchActivity.LaunchedWithQuery"
    enum="Boolean" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records whether intent used to launch / update SearchActivity carried an
    (optional) User Query. Recorded once per intent.

    Note: There is a recording gap between: 2026.07-2026.08.
  </summary>
</histogram>

<histogram
    name="Android.Omnibox.SearchActivity.NavigationTargetType{IntentOrigin}"
    enum="UrlTargetType" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records the intended navigation search target type for every navigation
    initiated from the SearchActivity.

    Captures the {IntentOrigin} specific SearchActivity metrics. Recorded
    exactly once per user initiated navigation. Not recorded if the user
    abandons SearchActivity.
  </summary>
  <token key="IntentOrigin" variants="SearchActivityIntentOriginVariants"/>
</histogram>

<histogram name="Android.Omnibox.SearchActivity.ReferrerValid"
    enum="BooleanValid" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records whether Intent Referrer field was valid for Searches initiated from
    SearchActivity. Recorded only when IntentOrigin is &quot;Custom Tab&quot;.
    Recorded once per SearchActivity session.

    Note: There is a recording gap between: 2026.07-2026.08.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SearchActivity.RequestedSearchType"
    enum="SearchActivitySearchType" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Record the Search type requested from an Intent. Recorded once per intent.

    Note: There is a recording gap between: 2026.07-2026.08.
  </summary>
</histogram>

<histogram
    name="Android.Omnibox.SearchActivity.SessionTerminationReason{IntentOrigin}"
    enum="SearchActivityTerminationReason" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records the reason SearchActivity was closed.

    Captures the {IntentOrigin} specific SearchActivity metrics. Recorded
    exactly once per SearchActivity session.
  </summary>
  <token key="IntentOrigin" variants="SearchActivityIntentOriginVariants"/>
</histogram>

<histogram name="Android.Omnibox.SetGeolocationHeadersTime" units="ms"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records time spent setting geolocation headers when the user navigates via
    the Omnibox. This time blocks the start of the navigation and is included in
    InputToNavigationStart metrics, but not in NavigationTo* metrics.

    NOTE: there's a possible gap in data between 2024-04-28 and 2024-08-16.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionList.FocusToImeAnimationStart"
    units="ms" expires_after="2027-10-01">
  <owner>pnoland@chromium.org</owner>
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records the wall time elapsed between focusing the omnibox and invocation of
    the onPrepare method signalling the start of an IME (soft keyboard)
    animation.

    Recorded once per omnibox focus on devices when suggestion list animation is
    enabled, which requires API level 30+ and &quot;controllable&quot; IME
    insets (which excludes, e.g. most devices with a hardware keyboard
    attached). This metric is recorded even if the animation is cancelled due to
    timeout, but is not recorded if the onPrepare method is never called.

    Note: There is a recording gap between: 2025.09-2026.08.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionList.LayoutTime2" units="ms"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>mpearson@chromium.org</owner>
  <owner>jdonnelly@chromium.org</owner>
  <summary>
    Records thread time spent on positioning all suggestions on screen. This
    histogram is recorded every time a new suggestion list is received.

    Smaller values are indicative of better performance, but the time taken
    varies considerably based on, e.g. whether new views need to be inflated and
    the number of suggestions being rendered.

    This metric is reported for all users and uses 100microsecond granularity.

    When comparing Durations measured here, also compare Total Counts for a
    correct indication of how frequently views are laid out and how the overall
    time spent performing layout operation changed.

    This histogram is related to Android.Omnibox.SuggestionView.Reused,
    Android.Omnibox.SuggestionList.MeasureTime2,
    Android.Omnibox.SuggestionView.CreateTime2.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionList.LayoutTime3" units="ms"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>pnoland@chromium.org</owner>
  <summary>
    Replacement for Android.Omnibox.SuggestionList.LayoutTime2 that uses wall
    time instead of thread time. Records wall time spent positioning suggestion
    view onto the screen. This histogram is recorded every time a new suggestion
    list is received, which is typically multiple times per keystroke.

    This metric is reported for all users and uses 1ms granularity.

    When comparing durations measured here, also compare Total Counts for a
    correct indication of how frequently views are laid out and how the overall
    time spent performing layout operation changed.

    This histogram is related to Android.Omnibox.SuggestionList.LayoutTime2,
    Android.Omnibox.SuggestionView.CreateTime3, and
    Android.Omnibox.SuggestionList.MeasureTime3
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionList.MeasureTime2" units="ms"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>mpearson@chromium.org</owner>
  <owner>jdonnelly@chromium.org</owner>
  <summary>
    Records time spent on measuring all suggestions ahead of positioning them on
    screen. This histogram is recorded every time a new suggestion list is
    received.

    Values recorded here should generally aim to be small, likely below 2ms
    range. Higher values are an indicator of a performance problem.

    Measure operation should take place just once when suggestion view is shown
    for the first time.

    This metric is reported for all users and uses 100microsecond granularity.

    When comparing Durations measured here, also compare Total Counts for a
    correct indication of how frequently views are measured and how the overall
    time spent measuring views changed.

    This histogram is related to Android.Omnibox.SuggestionView.Reused,
    Android.Omnibox.SuggestionList.LayoutTime2,
    Android.Omnibox.SuggestionView.CreateTime2.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionList.MeasureTime3" units="ms"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>pnoland@chromium.org</owner>
  <summary>
    Replacement for Android.Omnibox.SuggestionList.MeasureTime2 that uses wall
    time instead of thread time. Records wall time spent on measuring all
    suggestions ahead of positioning them on screen. This histogram is recorded
    every time a new suggestion list is received, which is typically multiple
    times per keystroke.

    This metric is reported for all users and uses 1ms granularity.

    When comparing durations measured here, also compare Total Counts for a
    correct indication of how frequently views are laid out and how the overall
    time spent performing layout operation changed.

    This histogram is related to Android.Omnibox.SuggestionList.MeasureTime2,
    Android.Omnibox.SuggestionView.CreateTime3, and
    Android.Omnibox.SuggestionList.LayoutTime3
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionList.RequestToUiModel.First"
    units="ms" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>pnoland@chromium.org</owner>
  <summary>
    Records time elapsed between requesting the suggestions and converting the
    first (synchronous) set of received suggestions to the UI model.

    For the complete, asynchronous iteration see the
    Android.Omnibox.SuggestionList.RequestToUiModel.Last metric.

    This metric is recorded exactly once per request, including the zero-prefix
    suggestions request.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionList.RequestToUiModel.Last"
    units="ms" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>pnoland@chromium.org</owner>
  <summary>
    Records time elapsed between requesting the suggestions and converting the
    final (asynchronous) set of received suggestions to the UI model.

    For the short, synchronous iteration see the
    Android.Omnibox.SuggestionList.RequestToUiModel.First metric.

    This metric is recorded at most once per request, including the zero-prefix
    suggestions request. The metric will not be emitted if the current
    Autocomplete cycle was canceled by the user - either by refining the input
    in the omnibox, or by ending the interaction with the Omnibox.
  </summary>
</histogram>

<histogram
    name="Android.Omnibox.SuggestionsDropdown.AsyncInflationDropdownAvailable"
    enum="Boolean" expires_after="2027-01-03">
  <owner>peterkang@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records whether the Omnibox suggestions dropdown view was successfully
    created in the background before the UI thread required it. True indicates
    the background inflation finished on time. False indicates the background
    inflation did not finish on time and the dropdown had to be inflated on the
    UI thread.

    Recorded at most once per activity start upon the first time the Omnibox is
    focused and the suggestions container is requested.
  </summary>
</histogram>

<histogram
    name="Android.Omnibox.SuggestionsDropdown.ContainerInflationThreadTime"
    units="ms" expires_after="2027-01-03">
  <owner>peterkang@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records thread time spent inflating the Omnibox suggestions container view
    hierarchy in a background thread via AsyncViewStub.

    Recorded at most once per activity start when AsyncViewStub inflates the
    container.
  </summary>
</histogram>

<histogram
    name="Android.Omnibox.SuggestionsDropdown.ContainerInflationWallTime"
    units="ms" expires_after="2027-01-03">
  <owner>peterkang@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records wall time spent inflating the Omnibox suggestions container view
    hierarchy in a background thread via AsyncViewStub.

    Recorded at most once per activity start when AsyncViewStub inflates the
    container.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionsDropdown.ForcedSyncInflation"
    enum="Boolean" expires_after="2027-01-03">
  <owner>peterkang@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records whether forced synchronous inflation occurred for the suggestions
    dropdown. True indicates inflation had to be forced synchronously because
    the UI requested the container before background inflation completed. False
    indicates background inflation completed successfully on time.

    Recorded at most once per activity start upon the first time the suggestions
    container is requested/inflated.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionsDropdown.InflationThreadMatches"
    enum="Boolean" expires_after="2027-01-03">
  <owner>peterkang@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records whether the Omnibox suggestions dropdown inflation thread matches
    the expected thread (background thread if async inflation is enabled, UI
    thread otherwise).

    Recorded once per activity start when inflation is initialized.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionsDropdown.InflationTime2" units="ms"
    expires_after="2027-01-03">
  <owner>peterkang@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records thread time spent on construction of the Omnibox suggestions
    dropdown.

    This metric will provide a comparison of the thread time spent inflating the
    suggestions dropdown on the UI thread vs the background thread. Furthermore,
    it will also be used to gauge how much time is being moved from the UI
    thread to the background thread.

    Recorded once per activity start when AsyncViewInflator inflates the
    OmniboxSuggestionsDropdown.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionsDropdown.InflationTime3" units="ms"
    expires_after="2027-10-01">
  <owner>peterkang@google.com</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records wall time spent on construction of the Omnibox suggestions dropdown.

    This metric will provide a comparison of the wall time spent inflating the
    suggestions dropdown on the UI thread vs the background thread. Furthermore,
    it will also be used to gauge how much time is being moved from the UI
    thread to the background thread.

    Recorded once per activity start when AsyncViewInflator inflates the
    OmniboxSuggestionsDropdown.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionsDropdown.PreWarmedViewsCount"
    units="count" expires_after="2027-01-03">
  <owner>peterkang@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records the number of ViewHolders successfully created during pre-warming of
    the OmniboxSuggestionsDropdown RecycledViewPool.

    Recorded once per activity start when pre-warming finishes.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionsDropdown.PreWarmingThreadMatches"
    enum="Boolean" expires_after="2027-01-03">
  <owner>peterkang@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records whether the OmniboxSuggestionsDropdown pre-warming thread matches
    the expected thread (background thread if async inflation is enabled, UI
    thread otherwise).

    Recorded once per activity start when pre-warming is initialized.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionsDropdown.PreWarmingViewsThreadTime"
    units="ms" expires_after="2027-01-03">
  <owner>peterkang@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records the cumulative CPU thread time spent actively inflating ViewHolders
    during pre-warming of the OmniboxSuggestionsDropdown RecycledViewPool.

    Recorded once per activity start when pre-warming finishes.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionsDropdown.PreWarmingViewsWallTime"
    units="ms" expires_after="2027-01-03">
  <owner>peterkang@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records the cumulative wall time spent actively inflating ViewHolders during
    pre-warming of the OmniboxSuggestionsDropdown RecycledViewPool.

    Recorded once per activity start when pre-warming finishes.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionsListScrolled.{PageClass}"
    enum="Boolean" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>jdonnelly@chromium.org</owner>
  <summary>
    For every interaction with the Omnibox, this metric records whether the user
    scrolled the omnibox while exploring suggestions on {PageClass}.

    This is recorded once per Omnibox interaction, regardless of whether the
    User chooses to navigate somewhere or abandons the interaction.
  </summary>
  <token key="PageClass">
    <variant name="ComposeBox" summary="the Compose Box"/>
    <variant name="NTP" summary="the New Tab Page"/>
    <variant name="Other" summary="a website"/>
    <variant name="SRP" summary="the Search Results Page"/>
    <variant name="TabSearch" summary="the Tab Search overlay"/>
    <variant name="Widget" summary="the Widget Search Activity"/>
  </token>
</histogram>

<histogram name="Android.Omnibox.SuggestionView.CreatedType"
    enum="OmniboxSuggestionUiType" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records the type of suggestion that was reused with the help of
    RecyclerView.

    This histogram drives OmniboxSuggestionsDropdown optimization, helping us
    find the balance between the volume of suggestions and amount of memory we
    delegate to re-use the pre-constructed suggestion views.

    Along with the Android.Omnibox.SuggestionView.ReusedType, the two histograms
    paint the picture of which suggestions need to be created more often than
    others vs which suggestions have more capacity than is actually needed.
    Higher reuse means lower latency at the expense of slight increase of memory
    consumption.

    This histogram is related to Android.Omnibox.SuggestionView.ReusedType.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionView.CreateTime2" units="ms"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>mpearson@chromium.org</owner>
  <owner>jdonnelly@chromium.org</owner>
  <summary>
    Records time spent creating a single suggestion.

    Values recorded here should generally aim to be small, below 1ms range.
    Higher values may be an indicator of a performance problem.

    This metric is reported for all users and uses 100microsecond granularity.

    When comparing Durations measured here, also compare Total Counts for a
    correct indication of how frequently views are created and how the overall
    time spent creating views changed.

    This histogram is related to Android.Omnibox.SuggestionList.LayoutTime2,
    Android.Omnibox.SuggestionList.MeasureTime2,
    Android.Omnibox.SuggestionView.Reused.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionView.CreateTime3" units="ms"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>pnoland@chromium.org</owner>
  <summary>
    Replacement for Android.Omnibox.SuggestionList.CreateTime2 that uses wall
    time instead of thread time. Records wall time spent on creating a single
    suggestion view. This histogram is recorded every time a new view is
    created, but not when a view is recycled.

    This metric is reported for all users and uses 1ms granularity.

    When comparing Durations measured here, also compare Total Counts for a
    correct indication of how frequently views are created and how the overall
    time spent creating views changed.

    This histogram is related to Android.Omnibox.SuggestionView.CreateTime2,
    Android.Omnibox.SuggestionList.LayoutTime3, and
    Android.Omnibox.SuggestionList.MeasureTime3

    Note: There is a recording gap between: 2026.07-2026.08.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionView.ReusedType"
    enum="OmniboxSuggestionUiType" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records the type of suggestion that was reused with the help of
    RecyclerView.

    This histogram drives OmniboxSuggestionsDropdown optimization, helping us
    find the balance between the volume of suggestions and amount of memory we
    delegate to re-use the pre-constructed suggestion views.

    Along with the Android.Omnibox.SuggestionView.CreatedType, the two
    histograms paint the picture of which suggestions need to be created more
    often than others vs which suggestions have more capacity than is actually
    needed. Higher reuse means lower latency at the expense of slight increase
    of memory consumption.

    This histogram is related to Android.Omnibox.SuggestionView.CreatedType.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionView.SessionViewsCreated"
    units="count" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records number of views created from the moment the Omnibox was focused,
    until the interaction was completed, whether the user navigated somewhere or
    canceled the interaction.

    Values recorded here tell how efficiently the view creation and re-use
    works, highlighting possible issues related to unusually frequent view
    creation; the number of views created should be low and not exceed the sum
    of all the views recycled by HistogramRecordingRecycledViewPool component.
    Any deviation from this are a signal that the RecycledViewPool limits are
    not optimal.

    When observing a higher than expected number of created views, consult the
    Android.Omnibox.SuggestionView.CreatedType to identify view type that is not
    correctly captured and update the limits of the
    HistogramRecordingRecycledViewPool.

    This histogram is related to Android.Omnibox.SuggestionView.CreatedType,
    Android.Omnibox.SuggestionView.SessionViewsReused.

    Note: There is a recording gap between: 2026.07-2026.08.
  </summary>
</histogram>

<histogram name="Android.Omnibox.SuggestionView.SessionViewsReused" units="%"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Captures the efficiency of the view re-use from the moment the Omnibox was
    focused, until the interaction was completed, whether the user navigated
    somewhere or canceled the interaction.

    Values captured here directly reflect the efficiency of recycled view pool
    tuning, with the following caveats:

    * short sessions (omnibox focused and defocused, with no inputs) will report
    efficiency of 0% (because all the views had to be created and no views were
    available for re-use).

    * this metric will never truly capture 100% effectiveness, because during
    every input session some views will have to be created.

    The captured value should be at or above 90% re-use. Lower re-use rates may
    be an indication of a possible issue.

    This histogram is related to
    Android.Omnibox.SuggestionView.SessionViewsCreated.

    Note: There is a recording gap between: 2026.07-2026.08.
  </summary>
</histogram>

<histogram name="Android.Omnibox.UsedSuggestionFromCache" enum="Boolean"
    expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    Records whether users interacted with suggestion originating from Java
    cache.

    Android presents the Cached suggestions for a brief time before the Native
    libraries become available, replacing these with a fresh content as soon as
    Autocomplete subsystem serves them. This histogram records all the events
    where the cached suggestions were shown for an extended period of time -
    long enough for the User to identify and interact with a suggestion of their
    choice.

    Recorded every time the User initiates navigation using the Omnibox or the
    Suggestions list, regardless of context.

    Note: starting Chrome 118 this is recorded for every Autocomplete action
    requiring native AutocompleteMatch instance.
  </summary>
</histogram>

<histogram
    name="Android.Omnibox.{AndroidSearchPrefetch}.GeoLocationHeaderTime.{AndroidNavigationOrSuggestionPrefetch}"
    units="ms" expires_after="2027-10-01">
  <owner>ender@google.com</owner>
  <owner>nhiroki@chromium.org</owner>
  <owner>ryansturm@chromium.org</owner>
  <owner>curranmax@chromium.org</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    {AndroidSearchPrefetch}

    The amount of time it takes to get the Geo Location header for a prefetch
    request.

    {AndroidNavigationOrSuggestionPrefetch}

    Note: There is a recording gap between: 2026.07-2026.08.
  </summary>
  <token key="AndroidSearchPrefetch" variants="AndroidSearchPrefetch"/>
  <token key="AndroidNavigationOrSuggestionPrefetch"
      variants="AndroidNavigationOrSuggestionPrefetch"/>
</histogram>

<histogram
    name="Android.Omnibox.{AndroidSearchPrefetch}.NumPrefetchesStartedInOmniboxSession.{AndroidNavigationPrefetchOnly}"
    units="count" expires_after="2027-02-07">
  <owner>nhiroki@chromium.org</owner>
  <owner>ryansturm@chromium.org</owner>
  <owner>curranmax@chromium.org</owner>
  <owner>chrome-search@google.com</owner>
  <summary>
    {AndroidSearchPrefetch}

    The number of prefetches that were successfully started from touch down
    events. This is recorded once per omnibox session.

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

<histogram
    name="Android.Omnibox.{AndroidSearchPrefetch}.TouchDownDelay.{AndroidNavigationPrefetchOnly}"
    units="ms" expires_after="2026-12-31">
  <owner>thesalsa@google.com</owner>
  <owner>chrome-mobile-search@google.com</owner>
  <summary>
    {AndroidSearchPrefetch}

    Measures the delay from physical touch down to the start of prefetch
    processing on the Java main thread, i.e. directly before
    TouchDownProcessTime is recorded. This is used to measure the overhead of
    Android input event dispatching plus queueing time on the UI thread.

    Emitted once for each touch down event on a search suggestion that is
    forwarded to the prefetch handler. Not emitted when the omnibox input
    session has ended or the per-session prefetch limit has been reached (in
    those cases the event is dropped before this is recorded). Emitted whether
    or not the forwarded event ultimately starts a prefetch.

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

<histogram
    name="Android.Omnibox.{AndroidSearchPrefetch}.TouchDownPrefetchResult.{AndroidNavigationPrefetchOnly}"
    enum="SearchPrefetchTouchDownPrefetchResult" expires_after="2027-02-07">
  <owner>nhiroki@chromium.org</owner>
  <owner>ryansturm@chromium.org</owner>
  <owner>curranmax@chromium.org</owner>
  <owner>chrome-search@google.com</owner>
  <summary>
    {AndroidSearchPrefetch}

    Whether or not the last prefetch started from the touch down trigger was
    used for a navigation. This is recorded once per omnibox session.

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

<histogram
    name="Android.Omnibox.{AndroidSearchPrefetch}.TouchDownProcessTime.{AndroidNavigationPrefetchOnly}"
    units="ms" expires_after="2027-02-07">
  <owner>nhiroki@chromium.org</owner>
  <owner>ryansturm@chromium.org</owner>
  <owner>curranmax@chromium.org</owner>
  <owner>chrome-search@google.com</owner>
  <summary>
    {AndroidSearchPrefetch}

    The amount of time it takes to process a touch down event for Search
    Prefetch. This includes cases where: 1) the event is filtered out in the
    Java code (native is not initialized, the limit for preetches in an omnibox
    session is reached, etc.), 2) the event is sent to native but the prefetch
    is not started, and 3) the event is sent to native and the prefetch request
    is started.

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

<histogram name="Android.OmniboxFocusReason" enum="OmniboxFocusReason"
    expires_after="2027-01-17">
  <owner>mdjones@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <owner>amaralp@chromium.org</owner>
  <owner>mpearson@chromium.org</owner>
  <owner>jdonnelly@chromium.org</owner>
  <summary>Records how the omnibox was focused.</summary>
</histogram>

<histogram name="Android.OpenInApp.Clicked.AppMenuItem" enum="Boolean"
    expires_after="2027-01-28">
  <owner>sinansahin@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Recorded when the user clicks the Open in App item in the App Menu. A true
    value indicates OpenInAppInfo was non-null for the current tab when the item
    was clicked, and vice versa.
  </summary>
</histogram>

<histogram name="Android.OpenInApp.Clicked.AppMenuItem.ChipVisible"
    enum="Boolean" expires_after="2027-05-27">
  <owner>sinansahin@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Recorded when the user clicks the Open in App item in the App Menu. Recorded
    boolean denotes whether the Open in App chip in the omnibox was visible at
    the time of the click.
  </summary>
</histogram>

<histogram name="Android.OpenInApp.Clicked.OmniboxChip" enum="Boolean"
    expires_after="2027-05-27">
  <owner>sinansahin@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Recorded when the user clicks the Open in App chip in the omnibox. Always
    recorded true.
  </summary>
</histogram>

<histogram name="Android.OpenInApp.Impression" enum="Boolean"
    expires_after="2027-05-27">
  <owner>sinansahin@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Recorded when the Open in App option becomes available for a page (either as
    a chip or in the app menu). It is recorded when the target app package
    changes (e.g. navigating from a page with no app, or a different app). If
    multiple apps are available, we compare by domain instead of package.
    Navigations that resolve to the same package (or same domain if multiple
    apps) do not emit this histogram again. Always recorded true.
  </summary>
</histogram>

<histogram name="Android.OverscrollFromBottom.CanStart" enum="Boolean"
    expires_after="2027-01-03">
  <owner>wenyufu@chromium.org</owner>
  <owner>src/chrome/browser/ui/android/edge_to_edge/OWNERS</owner>
  <summary>
    Records, when user starts a overscroll from the bottom on a tab, whether the
    overscroll satisfied the start condition (e.g. the browser controls is not
    already shown).
  </summary>
</histogram>

<histogram name="Android.OverscrollFromBottom.DidTriggerOverscroll"
    enum="Boolean" expires_after="2027-02-07">
  <owner>wenyufu@chromium.org</owner>
  <owner>src/chrome/browser/ui/android/edge_to_edge/OWNERS</owner>
  <summary>
    Records, when user starts a overscroll from the bottom on a tab, whether the
    overscroll handler fired the callback to re-show the browser controls.
  </summary>
</histogram>

<histogram name="Android.PackageStats.CacheSize" units="MB"
    expires_after="2024-05-05">
  <owner>nyquist@chromium.org</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the size of the user's cache at startup on Android O and above.
  </summary>
</histogram>

<histogram name="Android.PackageStats.CodeSize" units="MB"
    expires_after="2024-05-05">
  <owner>nyquist@chromium.org</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    At startup, records the space on disk taken by Chrome application including
    APK resources, compiled libraries, and extracted native code. Only recorded
    for Android O and above.
  </summary>
</histogram>

<histogram name="Android.PackageStats.DataSize" units="MB"
    expires_after="2024-05-05">
  <owner>nyquist@chromium.org</owner>
  <owner>yfriedman@chromium.org</owner>
  <summary>
    Records the size of the user's data directory at startup on Android O and
    above. Does not include cache size.
  </summary>
</histogram>

<histogram name="Android.PageContentProtoViewStructureBuilder.Result"
    enum="BooleanSuccess" expires_after="2026-07-26">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <summary>
    Records whether the PageContentProtoViewStructureBuilder was successful in
    getting the page content proto and populating the virtual structure.
    Recorded when onProvideVirtualStructure is called on ContentView when the
    AnnotatedPageContentsVirtualStructure feature is enabled.
  </summary>
</histogram>

<histogram name="Android.PartnerCustomization.HomepageCustomizationOutcome"
    enum="PartnerCustomizationsHomepage" expires_after="2025-02-02">
  <owner>donnd@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <summary>
    Records the outcome of initial Tab creation relative to Homepage
    customization. The outcome characterizes the initial Tab focusing on an NTP
    and whether it was created correctly. When a custom Homepage was created we
    only record whether it was a Partner Homepage or some other Homepage. At
    this time we don't differentiate between User and Policy Homepages or record
    whether any Homepage was correctly created when customization changes.
    Recorded at the end of customization or initial Tab creation, whichever is
    last.
  </summary>
</histogram>

<histogram
    name="Android.PartnerCustomization.HomepageCustomizationOutcome.{CustomizationDelegate}"
    enum="PartnerCustomizationsHomepage" expires_after="2025-02-02">
  <owner>donnd@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <summary>
    Records the outcome of initial Tab creation relative to Homepage
    customization using delegate &quot;{CustomizationDelegate}&quot;. The
    outcome characterizes the initial Tab focusing on an NTP and whether it was
    created correctly. When a custom Homepage was created we only record whether
    it was a Partner Homepage or some other Homepage. At this time we don't
    differentiate between User and Policy Homepages or record whether any
    Homepage was correctly created when customization changes. Recorded at the
    end of customization or initial Tab creation, whichever is last.
  </summary>
  <token key="CustomizationDelegate" variants="CustomizationDelegate"/>
</histogram>

<histogram
    name="Android.PartnerCustomization.HomepageCustomizationOutcomeNotCached.{CustomizationDelegate}"
    enum="PartnerCustomizationsHomepage" expires_after="2025-02-02">
  <owner>donnd@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <summary>
    Records the outcome of initial Tab creation relative to Homepage
    customization using delegate &quot;{CustomizationDelegate}&quot; when the
    Homepage was not previously cached. The outcome characterizes the initial
    Tab focusing on an NTP and whether it was created correctly. When a custom
    Homepage was created we only record whether it was a Partner Homepage or
    some other Homepage. At this time we don't differentiate between User and
    Policy Homepages or record whether any Homepage was correctly created when
    customization changes. Recorded at the end of customization or initial Tab
    creation, whichever is last.
  </summary>
  <token key="CustomizationDelegate" variants="CustomizationDelegate"/>
</histogram>

<histogram name="Android.PartnerCustomization.TaskCompletion"
    enum="PartnerTaskCompletion" expires_after="2025-04-06">
  <owner>donnd@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <summary>
    Records the outcome of the async initialization task for the partner browser
    customization. This tells us how often the delegate is able to provide
    correct data, is canceled due to timeout, and whether exceptions were
    thrown, etc. Note that the correct data may actually arrive too late to be
    used because Chrome waits only 1/2 second before creating an initial tab,
    but it will be recorded here regardless. This logging of Completed-too-late
    is only done by the Chrome App, but all other values are logged for CCT as
    well. Recorded when the async task is completed or canceled during Chrome's
    start up.
  </summary>
</histogram>

<histogram
    name="Android.PartnerCustomization.TaskCompletion.{CustomizationDelegate}"
    enum="PartnerTaskCompletion" expires_after="2025-04-06">
  <owner>donnd@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <summary>
    Records the outcome of the async initialization task for the partner browser
    customization. This tells us how often the delegate
    &quot;{CustomizationDelegate}&quot; is able to provide correct data, is
    canceled due to timeout, and whether exceptions were thrown, for this
    delegate. Note that the correct data may actually arrive too late to be used
    because Chrome waits only 1/2 second before creating an initial tab, but it
    will be recorded here regardless. This logging of Completed-too-late is only
    done by the Chrome App, but all other values are logged for CCT as well.
    Recorded when the async task is completed or canceled during Chrome's start
    up.
  </summary>
  <token key="CustomizationDelegate" variants="CustomizationDelegate"/>
</histogram>

<histogram
    name="Android.PartnerCustomization.TaskCompletionNotCached.{CustomizationDelegate}"
    enum="PartnerTaskCompletion" expires_after="2025-02-02">
  <owner>donnd@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <summary>
    Warning, this histogram may have a data gap since it was expired on
    2023-12-12 and reenabled around 2024-03-01. Records the outcome of the async
    initialization task for the partner browser customization, when there is not
    yet any cached Homepage (likely Chrome's first launch). This tells us how
    often the delegate &quot;{CustomizationDelegate}&quot; is able to provide
    correct data, is canceled due to timeout, and whether exceptions were
    thrown, for this delegate. Note that the correct data may actually arrive
    too late to be used because Chrome waits only 1/2 second before creating an
    initial tab, but it will be recorded here regardless. This logging of
    Completed-too-late is only done by the Chrome App, but all other values are
    logged for CCT as well. Recorded when the async task is completed or
    canceled during Chrome's start up when no homepage is already cached.
  </summary>
  <token key="CustomizationDelegate" variants="CustomizationDelegate"/>
</histogram>

<histogram
    name="Android.PartnerCustomization.TryFailedDuration.{CustomizationDelegate}"
    units="ms" expires_after="2025-04-06">
  <owner>donnd@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <summary>
    Records the amount of time it took for the delegate
    &quot;{CustomizationDelegate}&quot; to run in the async task that does
    partner customization. Recorded when the task completes but was unable to
    use the delegate for some reason. Trying to use the PreloadApk delegate is
    only done when actually needed so these numbers should reflect actual usage
    attempts.
  </summary>
  <token key="CustomizationDelegate" variants="CustomizationDelegate"/>
</histogram>

<histogram
    name="Android.PartnerCustomization.TrySucceededDuration.{CustomizationDelegate}"
    units="ms" expires_after="2025-04-06">
  <owner>donnd@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <summary>
    Records the amount of time it took for the delegate
    &quot;{CustomizationDelegate}&quot; to run in the async task that does
    partner customization. Recorded when the task completes successfully and a
    delegate providing customizations is found. Trying to use the PreloadApk
    delegate is only done when actually needed so these numbers should reflect
    actual usage attempts.
  </summary>
  <token key="CustomizationDelegate" variants="CustomizationDelegate"/>
</histogram>

<histogram name="Android.PartnerCustomization.Usage"
    enum="PartnerCustomizationUsage" expires_after="2025-04-06">
  <owner>donnd@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <summary>
    Records which customization usage is being invoked, at the time it is
    requested. The possible usages include a custom Homepage URL, suppressing
    incognito, etc.
  </summary>
</histogram>

<histogram name="Android.PartnerHomepageCustomization.Delegate2"
    enum="PartnerCustomizationProviderDelegate" expires_after="2027-01-17">
  <owner>donnd@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <summary>
    Records which delegate will be used to provide the home page URL that is
    needed for a custom provider's customization. Recorded at startup on
    Android.
  </summary>
</histogram>

<histogram name="Android.PasswordEcho.SettingReadTime.{SettingType}"
    units="microseconds" expires_after="2026-09-30">
  <owner>shahinmd@google.com</owner>
  <owner>ashleynewson@chromium.org</owner>
  <summary>
    Records the time taken to read the password echo setting(s) from the system
    server during initialization. The {SettingType} token specifies the type of
    setting read.

    Only emitted once when the embedding application's instance of
    PasswordEchoSettingState is created. The metric recorded (either the split
    or the legacy setting) depends on the state of the Aconfig feature flag for
    splitting the password echo settings.

    This is recorded only on Android, where the timer is always high-resolution.
  </summary>
  <token key="SettingType">
    <variant name="Legacy"/>
    <variant name="Split"/>
  </token>
</histogram>

<histogram name="Android.PasswordEcho.SettingStateInitializationTime"
    units="microseconds" expires_after="2026-09-30">
  <owner>shahinmd@google.com</owner>
  <owner>ashleynewson@chromium.org</owner>
  <summary>
    Records the total time taken for the PasswordEchoSettingState class to
    complete its initialization. This time includes operations like reading the
    Aconfig feature flag state, registering the necessary ContentObserver(s) for
    monitoring setting changes, and the initial read of the relevant system
    setting value(s).

    Only emitted once when the embedding application's instance of
    PasswordEchoSettingState is created.

    This is recorded only on Android, where the timer is always high-resolution.
  </summary>
</histogram>

<histogram name="Android.Pdf.AssistContent.GetAssistantPackageResult"
    enum="BooleanSuccess" expires_after="2025-09-07">
  <owner>salg@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records whether we were able to get the package name of the default
    assistant app from Android's settings. Recorded when AssistContent is
    requested for pdf pages.
  </summary>
</histogram>

<histogram name="Android.Pdf.AssistContent.IsEnterpriseInfoCached"
    enum="Boolean" expires_after="2027-02-14">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records whether the device enterprise info has been cached when getting it
    synchronously for pdf pages.
  </summary>
</histogram>

<histogram name="Android.Pdf.AssistContent.IsWorkProfile" enum="Boolean"
    expires_after="2027-01-17">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records whether we are running in a work profile. Recorded when
    AssistContent is generated successfully for pdf pages. Used to determine the
    frequency of AssistContent preparation on pdf pages; and how often the work
    profile is on while preparing AssistContent for pdf pages.
  </summary>
</histogram>

<histogram name="Android.Pdf.DocumentLoad" enum="Boolean"
    expires_after="2027-01-24">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Recorded when the pdf load starts. Used to compare against
    Android.Pdf.DocumentLoadResult.Detail, which is recorded when the pdf load
    is complete, to determine how many pdf loads are not complete.
  </summary>
</histogram>

<histogram name="Android.Pdf.DocumentLoadInterval" units="ms"
    expires_after="2027-02-14">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the elapsed time between two pdf document loads. Recorded when the
    pdf load starts. Used to evaluate the threshold to keep PdfDocumentService
    running after the last client unbinds.
  </summary>
</histogram>

<histogram name="Android.Pdf.DocumentLoadResult.Detail"
    enum="AndroidPdfLoadResult" expires_after="2027-01-24">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the pdf document load result details. Recorded when the pdf load is
    completed or aborted. Only record when there is a paired
    Android.Pdf.DocumentLoad. Only record the first load result for each pdf
    load.
  </summary>
</histogram>

<histogram name="Android.Pdf.DocumentLoadTime.FirstPaired" units="ms"
    expires_after="2027-02-07">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the pdf document load time. Recorded when the pdf load is complete.
    Records the first successful load for each explicit pdf load. Only record
    when there is a paired Android.Pdf.DocumentLoad.
  </summary>
</histogram>

<histogram name="Android.Pdf.DownloadTime.Transient" units="ms"
    expires_after="2026-12-27">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the pdf download time for transient downloads, i.e. download pdf to
    open in Chrome. Recorded when the pdf download is complete and before pdf
    view is rendered. Used to assess the prioritization of a refined user
    experience for downloading.
  </summary>
</histogram>

<histogram name="Android.Pdf.DownloadUrlDecoded" enum="Boolean"
    expires_after="2026-12-01">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records whether the pdf download url is successfully decoded. This is
    recorded when re-download is needed for pdf pages (e.g. Chrome restart or
    navigate back/forward).
  </summary>
</histogram>

<histogram name="Android.Pdf.DownloadUrlEncoded" enum="Boolean"
    expires_after="2026-12-01">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records whether the pdf download url is successfully encoded. This is
    recorded when the pdf download starts.
  </summary>
</histogram>

<histogram name="Android.Pdf.FindInPageCounts" units="count"
    expires_after="2027-01-24">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records find-in-page invocation counts for each pdf page. The count number
    represents the previous find-in-page invocations on the same pdf page. This
    can be recorded more than once for each pdf page. Recorded when find-in-page
    is invoked.
  </summary>
</histogram>

<histogram name="Android.Pdf.Hyperlink.ClickResult"
    enum="AndroidPdfHyperlinkClickResult" expires_after="2027-01-10">
  <owner>rathomas@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the outcome when a user clicks on an embedded hyperlink in a PDF.
    Recorded in PdfCoordinator#onLinkClicked.
  </summary>
</histogram>

<histogram name="Android.Pdf.IsFrozenWhenDisplayed" enum="Boolean"
    expires_after="2027-01-24">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records whether the pdf native page is frozen before the tab is displayed,
    such as being selected from tab switcher or tab strip. Used to determine how
    often the pdf native page is frozen.
  </summary>
</histogram>

<histogram name="Android.Pdf.SelectionMenuItem"
    enum="AndroidPdfSelectionMenuItem" expires_after="2027-01-10">
  <owner>rathomas@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records user interactions with PDF V2 selection menu items. Recorded when a
    selection menu item (such as Share, Web Search, or Translate) is selected.
  </summary>
</histogram>

<histogram name="Android.Pdf.ToolbarAction" enum="AndroidPdfToolbarAction"
    expires_after="2027-01-10">
  <owner>rathomas@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records user interactions with the PDF viewer toolbar and overflow (3-dot)
    menu. Recorded when a toolbar button is clicked or a menu action is
    triggered.
  </summary>
</histogram>

<histogram name="Android.Pdf.UriIsNull" enum="Boolean"
    expires_after="2027-01-24">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records whether the PDF file URI is null when attempting to load the file.
    Recorded in PdfCoordinator#loadPdfFile.
  </summary>
</histogram>

<histogram name="Android.PhotoPicker.DialogAction"
    enum="PhotoPickerDialogAction" expires_after="2025-04-13">
  <owner>finnur@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Records which action the user takes in the PhotoPickerDialog.
  </summary>
</histogram>

<histogram name="Android.PlayServices.ShortVersion" enum="GmsShortVersionCode"
    expires_after="2026-05-03">
  <owner>twellington@chromium.org</owner>
  <owner>tedchoc@chromium.org</owner>
  <summary>
    The short version code for Google Play Services in a format YYWWV, where YY
    is year, WW is week and V is version (0 for beta releases and 1 for stable
    release). This metric is logged with every UMA upload. 0 is recorded when
    GMS Core is not installed, 1 when GMS Core version can't be parsed and 2
    when GMS Core version doesn't fit into defined range.
  </summary>
</histogram>

<histogram name="Android.PlayServices.Version" units="versioncode"
    expires_after="2026-11-15">
  <owner>twellington@chromium.org</owner>
  <owner>tedchoc@chromium.org</owner>
  <summary>
    The version code for Google Play Services if it is installed on the device,
    or 0 if it is not. Recorded during deferred startup.
  </summary>
</histogram>

<histogram name="Android.PredictiveGestureNavigation{Transition}"
    enum="PredictiveNavTransitionPhase" expires_after="2026-12-31">
  <owner>jinsukkim@google.com</owner>
  <owner>twellington@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Record the phase when a gesture nav is triggered {Transition} by user's
    gesture and when the predictive back gesture is on.
  </summary>
  <token key="Transition">
    <variant name="" summary="no matter if a transition is activated"/>
    <variant name=".WithoutTransition"
        summary="without transition is activated"/>
    <variant name=".WithTransition" summary="with transition is activated"/>
  </token>
</histogram>

<histogram
    name="Android.PredictiveNavigationTransition.CaptureNativeViewResult"
    enum="CaptureNativeViewResult" expires_after="2026-12-31">
  <owner>jinsukkim@google.com</owner>
  <owner>twellington@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Record the result of capturing a screenshot of a native page view. This
    screenshot will be saved for back forward transition and used a preview when
    user navigating back to native page. Record when user navigates away from a
    native view page.
  </summary>
</histogram>

<histogram
    name="Android.PredictiveNavigationTransition.NavigateBetweenNativePages"
    enum="Boolean" expires_after="2026-12-31">
  <owner>jinsukkim@google.com</owner>
  <owner>twellington@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Record whether a navigation is about to start from a chrome native page to
    another chrome native page. Record right before such navigation starts.
  </summary>
</histogram>

<histogram
    name="Android.PredictiveNavigationTransition.NTPFeedRestorationDuration"
    units="ms" expires_after="2026-12-31">
  <owner>jinsukkim@google.com</owner>
  <owner>twellington@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Record the duration when the feed stream is restored after being transited
    to New Tab Page.
  </summary>
</histogram>

<histogram
    name="Android.PredictiveNavigationTransition.NTPSmoothTransitionByFallback"
    enum="Boolean" expires_after="2026-12-31">
  <owner>jinsukkim@google.com</owner>
  <owner>twellington@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Record whether animation is triggered because of the timeout fallback. False
    if it's triggered right after the feed stream is restored.
  </summary>
</histogram>

<histogram name="Android.ReaderModeCpa.Shown" enum="Boolean"
    expires_after="2026-11-15">
  <owner>jinsukkim@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Tells whether Reader Mode CPA button can be shown i.e. has the space in the
    toolbar. Recorded when Contextual page action controller chooses Reader Mode
    for the action to display as CPA.
  </summary>
</histogram>

<histogram name="Android.RequestDesktopSite.Changed" enum="SiteLayout"
    expires_after="2027-01-24">
  <owner>shuyng@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Records the changes of request desktop site content settings. This is
    recorded when a user manually switches the global setting between
    mobile/desktop.
  </summary>
</histogram>

<histogram name="Android.RequestDesktopSite.DomainSettingChanged"
    enum="Boolean" expires_after="2027-01-24">
  <owner>shuyng@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Records the new domain level Request Desktop Setting when changed. False
    means Mobile site while true means Desktop site. This is recorded when a
    user manually edits a domain level Request Desktop Setting from the site
    settings exception list.
  </summary>
</histogram>

<histogram name="Android.RequestDesktopSite.SubDomainSettingChanged"
    enum="Boolean" expires_after="2026-11-15">
  <owner>shuyng@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Records the new subdomain level Request Desktop Setting when changed. False
    means Mobile site while true means Desktop site. This is recorded when a
    user manually edits a subdomain level Request Desktop Setting from the site
    settings exception list.
  </summary>
</histogram>

<histogram name="Android.RequestDesktopSite.UseDesktopUserAgent" enum="Boolean"
    expires_after="2027-10-01">
  <owner>fgorski@chromium.org</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records if Chrome uses the desktop site user agent to request websites. This
    is recorded when each tab loads a new url or reloads a url (browser
    navigations).
  </summary>
</histogram>

<histogram name="Android.RequestDesktopSite.UserSwitchToDesktop" enum="Boolean"
    expires_after="2027-10-01">
  <owner>fgorski@chromium.org</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records if a user switched to request desktop site from the app menu. This
    is recorded when a user manually switches sites between the desktop/mobile.
  </summary>
</histogram>

<histogram
    name="Android.RequestDesktopSite.UserSwitchToDesktop.DomainSettingAdded"
    enum="Boolean" expires_after="2027-01-17">
  <owner>shuyng@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Records the new domain level Request Desktop Setting when added. False means
    Mobile site while true means Desktop site. This is recorded when a user
    manually adds a domain level Request Desktop Setting from the Add site
    dialog in Site settings.
  </summary>
</histogram>

<histogram
    name="Android.RequestDesktopSite.UserSwitchToDesktop.SubDomainSettingAdded"
    enum="Boolean" expires_after="2027-01-17">
  <owner>shuyng@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    Records the new subdomain level Request Desktop Setting when added. False
    means Mobile site while true means Desktop site. This is recorded when a
    user manually adds a subdomain level Request Desktop Setting from the Add
    site dialog in Site settings.
  </summary>
</histogram>

<histogram name="Android.RequestDesktopSite.WindowSettingChanged"
    enum="Boolean" expires_after="2027-01-17">
  <owner>shuyng@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <summary>
    Records the new Request Desktop window setting when changed. If the setting
    is true, Chrome will request mobile view when the window is narrow. This is
    recorded when a user manually changes the Request Desktop window setting
    from the site settings.
  </summary>
</histogram>

<histogram name="Android.RestoreResult" enum="AndroidRestoreResult"
    expires_after="2027-02-14">
  <owner>triploblastic@chromium.org</owner>
  <owner>chrome-signin-team@google.com</owner>
  <summary>
    Whether Chrome tried to restore its settings from a previous device or
    installation, and what happened when it did. Only recorded on first run.
  </summary>
</histogram>

<histogram name="Android.RestoreTabsOnFRE.DeviceRestoredFrom"
    enum="RestoreTabsOnFREDeviceRestoredFrom" expires_after="2027-02-07">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    Whether the user restored tabs from the non default selected device.
    Recorded only if the user has multiple synced devices, and once per user
    interaction with the entire workflow on restore.
  </summary>
</histogram>

<histogram name="Android.RestoreTabsOnFRE.EligibleTabsForRestoreCount"
    units="count" expires_after="2027-04-01">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    The total count of tabs eligible to be restored from the selected device.
    Recorded once per user attempt to restore tabs from the selected device.
  </summary>
</histogram>

<histogram name="Android.RestoreTabsOnFRE.PromoShowResult2"
    enum="RestoreTabsOnFREPromoShowResult" expires_after="2027-02-07">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    The outcome of the promo show attempt from the RestoreTabsFeatureHelper.
    Recorded once per user attempt to show the promo after first run experience.
  </summary>
</histogram>

<histogram name="Android.RestoreTabsOnFRE.RestoredTabsResult"
    enum="RestoreTabsOnFRERestoredTabsResult" expires_after="2027-04-01">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    The portion of tabs the user ended up restoring out of the maximum possible
    amount. Recorded once per user attempt to restore tabs from the selected
    device.
  </summary>
</histogram>

<histogram name="Android.RestoreTabsOnFRE.ResultActionFirstShow2"
    enum="RestoreTabsOnFREResultAction" expires_after="2027-02-07">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    The result of the workflow action taken on the RestoreTabs promo. Recorded
    once per user interaction with the promo when shown the first time.
  </summary>
</histogram>

<histogram name="Android.RestoreTabsOnFRE.ResultActionSecondShow2"
    enum="RestoreTabsOnFREResultAction" expires_after="2027-02-07">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    The result of the workflow action taken on the RestoreTabs promo. Recorded
    once per user interaction with the promo when shown the second time.
  </summary>
</histogram>

<histogram name="Android.RestoreTabsOnFRE.SyncedDevicesCount" units="count"
    expires_after="2027-04-01">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    The total count of synced devices on the user logged in account. Recorded
    once per user interaction with the entire workflow.
  </summary>
</histogram>

<histogram name="Android.RestoreTabsOnFRE.TabsRestoredCount" units="count"
    expires_after="2027-04-01">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    The total count of tabs that were actually restored from the selected
    device. Recorded once per user attempt to restore tabs from the selected
    device.
  </summary>
</histogram>

<histogram name="Android.RestoreTabsOnFRE.TabsRestoredPercentage" units="%"
    expires_after="2027-04-01">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    The ratio between the number of tabs that the user is eligible to restore
    and the number of tabs that were actually restored, from the currently
    selected device calculated as a percentage. Recorded once per user attempt
    to restore tabs from the selected device.
  </summary>
</histogram>

<histogram name="Android.ScreenshotContentProvider.Events"
    enum="ScreenshotContentProviderEvent" expires_after="2027-05-25">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <owner>tivi@google.com</owner>
  <summary>
    Records events related to ScreenshotContentProvider as it generates a URI
    for an external app and as it handles queries/openFile from said external
    app.
  </summary>
</histogram>

<histogram name="Android.ScreenshotContentProvider.Latency.CaptureStartToEnd"
    units="ms" expires_after="2027-05-25">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <owner>tivi@google.com</owner>
  <summary>
    Records the amount of time passed while capturing a screenshot's contents.
  </summary>
</histogram>

<histogram
    name="Android.ScreenshotContentProvider.Latency.CreateToCaptureStart"
    units="ms" expires_after="2027-05-25">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <owner>tivi@google.com</owner>
  <summary>
    Records the amount of time passed between sending a screenshot provider URI
    to an external app and receiving an openFile request from an external app
    with the same URI (this starts a screenshot capture task).
  </summary>
</histogram>

<histogram name="Android.ScreenshotContentProvider.Latency.TotalLatency"
    units="ms" expires_after="2027-05-25">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <owner>tivi@google.com</owner>
  <summary>
    Records the total amount of time passed between sending a screenshot content
    provider URI to an external app and it receiving the screenshot's contents.
  </summary>
</histogram>

<histogram name="Android.ScreenshotUriProvider.Events"
    enum="ScreenshotUriProviderEvent" expires_after="2027-05-25">
  <owner>salg@google.com</owner>
  <owner>ssid@google.com</owner>
  <owner>tivi@google.com</owner>
  <summary>
    Records events related to ScreenshotUriProvider as it generates, caches, or
    reuses content URIs for screenshots.
  </summary>
</histogram>

<histogram name="Android.Scrim.MissingParent.Client" enum="ScrimClient"
    expires_after="2027-08-11">
  <owner>skym@chromium.org</owner>
  <owner>ckitagawa@chromium.org</owner>
  <summary>
    Scrims are placed into the view heirarchy by walking up from the anchor view
    looking for the parent. This is supposed to always work, but we're currently
    seeing failures in the wild. This histogram aims to narrow down which scrim
    clients are having problems to inform the investigation.
  </summary>
</histogram>

<histogram name="Android.Scrim.ShowRequest.Client" enum="ScrimClient"
    expires_after="2027-08-11">
  <owner>skym@chromium.org</owner>
  <owner>ckitagawa@chromium.org</owner>
  <summary>
    Emitted when a scrim is actaully triggered. Should help narrow down which
    clients that have code depedencies on the scrim systme actaully use it. It's
    possible some are legacy and just dead code. Additionally, will help give a
    ratio of usages to problems encountered when compared to the other scrim
    histograms.
  </summary>
</histogram>

<histogram name="Android.SearchEngineChoice.ChosenSearchEngine"
    enum="OmniboxSearchEngineType" expires_after="never">
<!-- expires-never: Continuously monitored by Android partner team. -->

  <owner>wylieb@google.com</owner>
  <owner>chrome-omnibox-team@google.com</owner>
  <summary>
    The type of the search engine chosen by the user in Search Engine Choice
    flow.
  </summary>
</histogram>

<histogram name="Android.SearchEngineChoice.Events"
    enum="AndroidSearchEngineChoiceEvents" expires_after="never">
<!-- expires-never: Continuously monitored by Android partner team. -->

  <owner>wylieb@google.com</owner>
  <owner>chrome-omnibox-team@google.com</owner>
  <summary>
    Counts occurences of various events related to Search Engine Choice feature.
  </summary>
</histogram>

<histogram name="Android.SearchEngineChoice.EventsV2"
    enum="AndroidSearchEngineChoiceEventsV2" expires_after="never">
<!-- expires-never: Continuously monitored by Android partner team. -->

  <owner>wylieb@google.com</owner>
  <owner>chrome-omnibox-team@google.com</owner>
  <summary>
    Counts occurences of various events related to Search Engine Choice V2
    feature.
  </summary>
</histogram>

<histogram name="Android.SearchEngineChoice.SearchEngineBeforeChoicePrompt"
    enum="OmniboxSearchEngineType" expires_after="never">
<!-- expires-never: Continuously monitored by Android partner team. -->

  <owner>wylieb@google.com</owner>
  <owner>chrome-omnibox-team@google.com</owner>
  <summary>
    The type of the search engine used before Search Engine Choice flow was
    presented.
  </summary>
</histogram>

<histogram name="Android.SeccompStatus.RendererSandbox"
    enum="AndroidSeccompSandboxStatus" expires_after="2024-04-28">
  <owner>rsesek@chromium.org</owner>
  <summary>
    Reports the status of the seccomp-bpf sandbox in renderer processes.
    Anything other than &quot;Sandbox Engaged&quot; indicates the sandbox is not
    turned on. See https://crbug.com/477049.
  </summary>
</histogram>

<histogram name="Android.SelectFileDialogContentSelected"
    enum="SelectFileDialogContent" expires_after="2026-09-30">
  <owner>finnur@chromium.org</owner>
  <owner>peter@chromium.org</owner>
  <summary>
    Records the types of content selected for upload, focusing mostly on image
    and video types and how they were determined (asking ContentResolver for the
    MIME type or going by extension). Recorded when user uploads files to a
    website (once per item uploaded).
  </summary>
</histogram>

<histogram name="Android.SelectFileDialogImgCount" units="images"
    expires_after="2026-11-29">
  <owner>finnur@chromium.org</owner>
  <owner>peter@chromium.org</owner>
  <summary>
    Records the number of images selected in either the new Photo Picker or the
    standard Android file picker. Note: Only recorded in situations determined
    to warrant the new Photo Picker (not, for example, if mixed content, like
    images and text files, was requested).
  </summary>
</histogram>

<histogram name="Android.SelectFileDialogScope" enum="SelectFileDialogScope"
    expires_after="2026-09-30">
  <owner>peter@chromium.org</owner>
  <owner>finnur@chromium.org</owner>
  <summary>
    Records the scope of accepted content for a select file dialog when shown by
    a Web developer.
  </summary>
</histogram>

<histogram name="Android.SelectFileDialogUploadMethods"
    enum="SelectFileDialogUploadMethods" expires_after="2026-09-30">
  <owner>finnur@chromium.org</owner>
  <owner>peter@chromium.org</owner>
  <summary>
    Records the method of upload for files uploaded from Chrome via the
    SelectFileDialog, focusing mostly on image and video types. Recorded when
    user uploads files to a website (once per item uploaded).
  </summary>
</histogram>

<histogram name="Android.SelectionMenu.TimeToShowMenu.ActionMode" units="ms"
    expires_after="2027-01-03">
  <owner>jhimawan@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records the time taken to show the text selection popup menu. Recorded when
    the menu is shown. This metric is only recorded for the floating (action
    mode) selection menu.
  </summary>
</histogram>

<histogram name="Android.SelectionMenu.TimeToShowMenu.Dropdown" units="ms"
    expires_after="2027-01-03">
  <owner>jhimawan@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Records the time taken to show the text selection popup menu. Recorded when
    the menu is shown. This metric is only recorded for the dropdown selection
    menu.
  </summary>
</histogram>

<histogram name="Android.SelectionMenu.UsedCachedMenu" enum="Boolean"
    expires_after="2027-01-03">
  <owner>alexmitra@chromium.org</owner>
  <owner>peconn@chromium.org</owner>
  <summary>
    Records whether we were able to reuse the cached selection menu for the text
    selection popup menu. We keep this object stored in memory for a small
    latency gain and this histogram will help us determine whether it's worth
    removing the caching mechanism. This histogram is logged once every time we
    attempt to show a selection menu (each time text is selected).
  </summary>
</histogram>

<histogram name="Android.Settings.PendingPopBackWorked" units="count"
    expires_after="2026-12-31">
  <owner>hidehiko@google.com</owner>
  <owner>jinsukkim@google.com</owner>
  <summary>
    Records when the user triggers fragment pop back on SettingsActivity after
    the fragment manager already saved its state. In the case we delayed the pop
    back operation. Records the number of such cases to make sure this works
    enough. This record is used to verify the effectiveness of the fix.
  </summary>
</histogram>

<histogram name="Android.ShowSelectionMenuSourceType" enum="MenuSourceType"
    expires_after="2026-08-23">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>wbjacksonjr@chromium.org</owner>
  <summary>
    Records the menu source type when a selection menu is shown. Android only.
  </summary>
</histogram>

<histogram name="Android.SpareTab.FinalStatus" enum="SpareTabFinalStatus"
    expires_after="2026-01-18">
  <owner>sreejakshetty@chromium.org</owner>
  <owner>chrome-brapp-loading@google.com</owner>
  <summary>
    Records the final status of the spare tab, for example, if the spare tab is
    used, destroyed, crashed, etc. This is recorded when the spare tab is used
    for navigation or destroyed. It is only recorded when a spare tab is
    created, and it is only recorded once per spare tab.
  </summary>
</histogram>

<histogram name="Android.StrictMode.OverrideUrlLoadingTime" units="ms"
    expires_after="2027-01-17">
  <owner>yfriedman@chromium.org</owner>
  <owner>wnwen@chromium.org</owner>
  <summary>
    Measures the amount of time due to a StrictMode violation from calling out
    to Android activity manager.
  </summary>
</histogram>

<histogram name="Android.Survey.DownloadRequested2" enum="BooleanRequested"
    expires_after="2026-10-19">
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Recorded when a survey download is requested. If the download has been
    attemped, but the download request is not sent (e.g. user is not signed-in),
    'not requested' will be recorded.
  </summary>
</histogram>

<histogram name="Android.Survey.DownloadResponseCode2"
    enum="SurveyDownloadResponseCodes2" expires_after="2026-10-19">
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    The result of the completed survey download request. A survey download is
    initiated on ChromeTabbedActivity cold start iff the user passes a series of
    eligibility checks. Recorded when a valid survey response is received.
    Android only.
  </summary>
</histogram>

<histogram name="Android.Survey.ShowSurveyStatus"
    enum="SurveyPresentationStatusCode" expires_after="2027-02-21">
  <owner>wenyufu@chromium.org</owner>
  <owner>aishwaryarj@google.com</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    The result of the request to show the survey after it has been downloaded.
    This request is initiated when the user accepts to take the survey on the
    survey prompt. This histogram is agnostic to the content of the survey,
    which is configured server side, and will be recorded for all surveys shown
    in Chrome. Android only.
  </summary>
</histogram>

<histogram name="Android.Survey.SurveyCompleted" enum="BooleanCompleted"
    expires_after="2026-10-19">
  <owner>wenyufu@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Whether a user completed the survey after it was presented. This histogram
    is agnostic to the content of the survey, which is configured server side,
    and will be recorded for all surveys shown in Chrome. Android only.
  </summary>
</histogram>

<histogram name="Android.Survey.SurveyFilteringResults"
    enum="SurveyFilteringResult" expires_after="2027-03-01">
  <owner>wenyufu@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    The result of the survey filtering process. Each enum represents a different
    filter that caught the user. This is recorded on cold starts when we check
    if a user qualifies for a survey.
  </summary>
</histogram>

<histogram name="Android.Sync.ActualSyncedTabCountPercentage"
    units="% of tab count" expires_after="2026-11-03">
  <owner>bjfong@google.com</owner>
  <owner>ckitagawa@chromium.org</owner>
  <summary>
    Records the percentage of sync-eligible tabs that are in local sync storage.
    This is recorded after session restore is completed and local data is
    reconciled.
  </summary>
</histogram>

<histogram name="Android.Tab.BackgroundColorChange"
    enum="BackgroundColorChangeOrigin" expires_after="2025-09-07">
  <owner>clhager@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <summary>
    Records a change in the background color of a tab resulting in an update to
    tab observers. This background color change may be due to a change in web
    content or web content background, a custom view being set, or a native page
    being shown or hidden. A sharp increase in such updates may have performance
    implications - measuring an increase in such updates is particularly helpful
    for the OSNavBarMatchesTab feature, which has observed some performance
    regressions.
  </summary>
</histogram>

<histogram name="Android.Tab.BackgroundColorChange.PreOptimization"
    enum="BackgroundColorChangeOrigin" expires_after="2025-09-07">
  <owner>clhager@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <owner>wenyufu@chromium.org</owner>
  <summary>
    Records a potential change in the background color of a tab. This potential
    change may or may not be communicated to observers, as an optimization will
    attempt to avoid redundant notifications. To measure the number of
    notifications that are actually communicated to observers, refer to
    'Android.Tab.BackgroundColorChange'.
  </summary>
</histogram>

<histogram name="Android.Tab.CreateNewTabDuration.{TabLaunchType}2" units="ms"
    expires_after="2027-01-31">
  <owner>sreejakshetty@chromium.org</owner>
  <owner>spelchat@chromium.org</owner>
  <owner>chrome-brapp-loading@google.com</owner>
  <summary>
    Records the duration of new tab creation for {TabLaunchType}. Emitted
    everytime a new tab is finished being created. Take into account that
    low-end devices create tabs more slowly, so adjust your analysis
    accordingly.
  </summary>
  <token key="TabLaunchType" variants="TabLaunchType"/>
</histogram>

<histogram name="Android.TabBottomSheet.{ClientType}.CurrentState"
    enum="BottomSheet.State" expires_after="2027-05-13">
  <owner>ssid@google.com</owner>
  <owner>hitarthkothari@google.com</owner>
  <summary>
    Records the stable state (Peek, Half, Full, or Hidden/Closed) entered by the
    Tab Bottom Sheet for {ClientType}. Recorded every time a stable state is
    reached, ignoring transient scrolling or transition states.
  </summary>
  <token key="ClientType" variants="TabBottomSheetClient"/>
</histogram>

<histogram name="Android.TabBottomSheet.{ClientType}.StateChangeReason.Hidden"
    enum="BottomSheet.StateChangeReason" expires_after="2027-05-13">
  <owner>ssid@google.com</owner>
  <owner>hitarthkothari@google.com</owner>
  <summary>
    Records the reason why the Tab Bottom Sheet for {ClientType} was hidden.
    Recorded every time the bottom sheet settles into the Hidden/Closed state.
  </summary>
  <token key="ClientType" variants="TabBottomSheetClient"/>
</histogram>

<histogram name="Android.TabBottomSheet.{ClientType}.StateChangeReason.Peek"
    enum="BottomSheet.StateChangeReason" expires_after="2027-05-13">
  <owner>ssid@google.com</owner>
  <owner>hitarthkothari@google.com</owner>
  <summary>
    Records the reason why the Tab Bottom Sheet for {ClientType} entered the
    Peek state. Recorded every time the bottom sheet settles into the Peek
    state.
  </summary>
  <token key="ClientType" variants="TabBottomSheetClient"/>
</histogram>

<histogram name="Android.TabBottomSheet.{ClientType}.StateTransition"
    enum="TabBottomSheetStateTransition" expires_after="2027-05-13">
  <owner>ssid@google.com</owner>
  <owner>hitarthkothari@google.com</owner>
  <summary>
    Records transitions between open stable states (Peek, Half, Full) for the
    Tab Bottom Sheet for {ClientType}. Recorded when transitioning between two
    different open stable states, ignoring transient scrolling states.
  </summary>
  <token key="ClientType" variants="TabBottomSheetClient"/>
</histogram>

<histogram
    name="Android.TabContentManager.CaptureThumbnail.{PageType}.Duration"
    units="ms" expires_after="2026-10-26">
  <owner>acondor@chromium.org</owner>
  <owner>ckitagawa@chromium.org</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    This histogram records the time taken to screenshot the contents of a tab to
    use as a thumbnail. Recorded once per capture.
  </summary>
  <token key="PageType">
    <variant name="NativePage" summary="Pages based on Android Views"/>
    <variant name="WebContent" summary="Web content"/>
  </token>
</histogram>

<histogram name="Android.TabGroupParity.TabGroupColorChangeActionType"
    enum="TabGroupColorChangeActionType" expires_after="2026-11-03">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    Reports the entrypoint from which a tab group's color icon was changed.
    Record once per user attempt to change the tab group's color in the
    TabGridDialog view.
  </summary>
</histogram>

<histogram name="Android.TabGroupParity.TabGroupCreationDialogResultAction"
    enum="TabGroupCreationDialogResultAction" expires_after="2026-11-03">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    The result of the action taken from the TabGroupCreation dialog. Record once
    per user attempt to create a new tab group through the TabGroupCreation
    modal dialog.
  </summary>
</histogram>

<histogram name="Android.TabGroupParity.TabGroupCreationFinalSelections"
    enum="TabGroupCreationFinalSelections" expires_after="2026-11-03">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    The result of the group color and title selections made when accepting the
    TabGroupCreation dialog. Record once per user attempt to create a new tab
    group through the TabGroupCreation modal dialog.
  </summary>
</histogram>

<histogram name="Android.TabGroupSync.WindowStateOnFailedOpen"
    enum="TabGroupCreationFinalSelections" expires_after="2026-11-07">
  <owner>skym@chromium.org</owner>
  <owner>clank-tab-dev@google.com</owner>
  <summary>
    When a tab group open from the tab group pane failes because there is no
    local id, this metric is emitted with the state that the tab is in. This
    should help narrow down why this is happening.
  </summary>
</histogram>

<histogram name="Android.TabItemPicker.ActiveTabs.Count" units="count"
    expires_after="2027-01-24">
  <owner>bbetini@google.com</owner>
  <owner>ssid@chromium.org</owner>
  <summary>
    Records the number of 'active' (currently loaded in memory/session) tabs
    that are eligible for the tab picker. Recorded when the Tab Picker UI is
    preparing its list of displayable tabs.
  </summary>
</histogram>

<histogram name="Android.TabItemPicker.ActiveTabsPicked.Count" units="count"
    expires_after="2027-01-24">
  <owner>bbetini@google.com</owner>
  <owner>ssid@chromium.org</owner>
  <summary>
    Records the number of 'active' (live) tabs actually selected by the user,
    when the user confirms their selection in the Tab Picker.
  </summary>
</histogram>

<histogram name="Android.TabItemPicker.BackgroundTabs.Count" units="count"
    expires_after="2027-01-24">
  <owner>ckitagawa@chromium.org</owner>
  <owner>ssid@chromium.org</owner>
  <summary>
    Records the number of background tabs that are shown for the tab picker.
    Recorded when the Tab Picker UI is preparing its list of displayable tabs.
    These tabs will be lazily loaded after being picked.
  </summary>
</histogram>

<histogram name="Android.TabItemPicker.CachedTabs.Count" units="count"
    expires_after="2027-01-24">
  <owner>bbetini@google.com</owner>
  <owner>ssid@chromium.org</owner>
  <summary>
    Records the number of tabs found in the PageContentExtractionService cache
    that are eligible for the tab picker. Recorded when the Tab Picker UI is
    preparing its list of displayable tabs.
  </summary>
</histogram>

<histogram name="Android.TabItemPicker.CachedTabsPicked.Count" units="count"
    expires_after="2027-01-24">
  <owner>bbetini@google.com</owner>
  <owner>ssid@chromium.org</owner>
  <summary>
    Records the number of 'cached' tabs actually selected by the user, when the
    user confirms their selection in the Tab Picker.
  </summary>
</histogram>

<histogram name="Android.TabItemPicker.Cancel.SelectedTabs.Count" units="count"
    expires_after="2027-07-07">
  <owner>skym@chromium.org</owner>
  <owner>clank-tab-dev@google.com</owner>
  <summary>
    Records the number of tabs selected when the user exits the Tab Picker by
    cancelling (e.g. back press).
  </summary>
</histogram>

<histogram name="Android.TabItemPicker.OnDemandLoadDuration.{Result}"
    units="ms" expires_after="2026-09-20">
  <owner>ckitagawa@chromium.org</owner>
  <owner>madhavpruthi@google.com</owner>
  <summary>
    Records the time taken to load a background tab on demand for the tab
    picker. Recorded when the tab load finishes.
  </summary>
  <token key="Result">
    <variant name="Abandoned" summary="Page load abandoned on destroy"/>
    <variant name="Crash" summary="Page crashed"/>
    <variant name="Destroyed" summary="Page was destroyed"/>
    <variant name="Failure" summary="Page load failed"/>
    <variant name="Success" summary="Page load succeeded"/>
  </token>
</histogram>

<histogram name="Android.TabItemPicker.OnDemandThumbnailFetchDuration"
    units="ms" expires_after="2026-09-20">
  <owner>ckitagawa@chromium.org</owner>
  <owner>madhavpruthi@google.com</owner>
  <summary>
    Records the time taken to fetch a thumbnail after an on-demand tab load
    finishes. Recorded when the thumbnail is fetched.
  </summary>
</histogram>

<histogram name="Android.TabItemPicker.SelectableTabs.Count" units="count"
    expires_after="2027-01-24">
  <owner>haileywang@google.com</owner>
  <owner>ssid@chromium.org</owner>
  <summary>
    The number of selectable tabs available to the user in the tab item picker.
    Recorded when the tab picker UI is shown.
  </summary>
</histogram>

<histogram name="Android.TabItemPicker.SelectedTabs.Count" units="count"
    expires_after="2027-01-24">
  <owner>haileywang@google.com</owner>
  <owner>ssid@chromium.org</owner>
  <summary>
    The number of tabs selected by the user in the tab item picker. Recorded
    when the user confirms their selection.
  </summary>
</histogram>

<histogram name="Android.TabletDeterminationMismatch" enum="Boolean"
    expires_after="2027-01-17">
  <owner>skavuluru@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records whether the tablet determination logic via resource loading and
    display properties is different. This is recorded once per activity lifespan
    during startup (attachBaseContext).
  </summary>
</histogram>

<histogram name="Android.TabMultiSelectV2.BookmarkTabsCount" units="count"
    expires_after="2027-01-05">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    Reports the number of tabs that are bookmarked using the TabListEditor
    bookmark action. Recorded once per user attempt to bookmark tabs in the Tab
    Selection Editor.
  </summary>
</histogram>

<histogram name="Android.TabMultiSelectV2.SharingState"
    enum="TabListEditorShareActionState" expires_after="2026-11-03">
  <owner>ckitagawa@chromium.org</owner>
  <owner>bjfong@google.com</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    The result of the share action taken from the TabListEditor. Record once per
    user attempt to share tabs in the Tab Selection Editor.
  </summary>
</histogram>

<histogram name="Android.TabMultiSelectV2.TimeSinceLastShown" units="ms"
    expires_after="2026-11-03">
  <owner>ckitagawa@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    Measures the time between opening the TabListEditor in milliseconds within a
    given browser activity lifespan. This is recorded when the TabListEditor is
    shown with the exception of the first time it is shown within an activity
    lifespan.
  </summary>
</histogram>

<histogram name="Android.TabNavigationIntercept.Scheme"
    enum="NavigationInterceptScheme" expires_after="2026-12-20">
  <owner>rbyers@chromium.org</owner>
  <owner>mthiesse@chromium.org</owner>
  <owner>mamir@chromium.org</owner>
  <summary>
    When a navigation is intercepted, the scheme of the URL being intercepted.
  </summary>
</histogram>

<histogram name="Android.TabNavigationInterceptResult.For{ProtocolType}"
    enum="NavigationInterceptResult" expires_after="2027-02-07">
  <owner>blundell@chromium.org</owner>
  <owner>mthiesse@chromium.org</owner>
  <owner>tedchoc@chromium.org</owner>
  <summary>
    The distribution of results when running ExternalNavigationHandler for
    navigations that have an {ProtocolType}. This shows how often we send
    intents to be handled by other applications.
  </summary>
  <token key="ProtocolType">
    <variant name="ExternalProtocol" summary="external protocol"/>
    <variant name="InternalProtocol" summary="internal protocol"/>
  </token>
</histogram>

<histogram name="Android.TabNavigationInterceptResult.For{Scheme}"
    enum="NavigationInterceptResult" expires_after="2027-02-14">
  <owner>mamir@chromium.org</owner>
  <owner>rbyers@chromium.org</owner>
  <summary>
    The distribution of results when running ExternalNavigationHandler for
    {Scheme} navigations which are intercepted. This shows how frequently
    {Scheme} navigations trigger a dialog (that the user may potentially cancel
    to cancel the external app launch.)
  </summary>
  <token key="Scheme">
    <variant name="HaipVci" summary="haip-vci://"/>
    <variant name="HaipVp" summary="haip-vp://"/>
    <variant name="Mdoc" summary="mdoc://"/>
    <variant name="OpenId4Vci" summary="openid-credential-offer://"/>
    <variant name="OpenId4Vp" summary="openid4vp://"/>
  </token>
</histogram>

<histogram name="Android.TabSearch.DismissalReason"
    enum="TabSearchDismissalReason" expires_after="2026-11-15">
  <owner>bjfong@google.com</owner>
  <owner>wylieb@google.com</owner>
  <owner>clank-growth@google.com</owner>
  <summary>
    Records the reason the Tab Search overlay was dismissed (e.g. close button,
    scrim click, back press / ESC, window focus loss, or tab / URL selection).
    Recorded every time the Tab Search overlay is hidden.
  </summary>
</histogram>

<histogram name="Android.TabSearch.EntryPoint" enum="TabSearchEntryPoint"
    expires_after="2026-11-15">
  <owner>bjfong@google.com</owner>
  <owner>wylieb@google.com</owner>
  <owner>clank-growth@google.com</owner>
  <summary>
    Records the entrypoint used to open the Tab Search overlay (e.g. horizontal
    tab strip button, vertical tabs button, or app menu / shortcut). Recorded
    when the Tab Search overlay is invoked.
  </summary>
</histogram>

<histogram name="Android.TabSearch.SessionHadEmptyState" enum="Boolean"
    expires_after="2026-11-15">
  <owner>bjfong@google.com</owner>
  <owner>wylieb@google.com</owner>
  <owner>clank-growth@google.com</owner>
  <summary>
    Records whether the Tab Search overlay displayed an empty search state
    (&quot;No results found&quot;) at least once during a search session because
    an entered search query returned zero matching suggestions. Recorded once
    per Tab Search overlay session upon dismissal.
  </summary>
</histogram>

<histogram name="Android.TabStrip.NullTabHoverCardView.ShowDelayed"
    enum="Boolean" expires_after="2026-06-01">
  <owner>renkens@google.com</owner>
  <owner>aishwaryarj@google.com</owner>
  <summary>
    Emitted when mTabHoverCardView object is unexpectedly null during a
    StripLayoutHelper.showTabHoverCardView call. The value is True if the
    showTabHoverCardView call was delayed, and False if it was immediate.

    Recorded once per call, if the mLastHoveredTab is not null and
    mTabHoverCardView is null.
  </summary>
</histogram>

<histogram name="Android.TabStrip.PlaceholderStripLeftoverTabsCount"
    units="tabs" expires_after="2026-12-31">
  <owner>nemco@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    We show empty placeholder tabs on the tablet tab strip during startup. The
    placeholders will be replaced by real tabs once they are restored,
    preventing a visual flicker/scroll jank as the restored tabs are rapidly
    populated to the strip. The number of placeholders and positioning of the
    active tab is calculated based on tab metadata saved to disk, and thus does
    not account for tabs created by other means during startup (e.g. user
    interaction). This histogram records the number of placeholder tabs, if any
    that are leftover when all tabs have been restored. This is captured when
    all tabs are finished restoring.
  </summary>
</histogram>

<histogram
    name="Android.TabStrip.PlaceholderStripTabsCreatedDuringRestoreCount"
    units="tabs" expires_after="2026-12-31">
  <owner>nemco@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    We show empty placeholder tabs on the tablet tab strip during startup. The
    placeholders will be replaced by real tabs once they are restored,
    preventing a visual flicker/scroll jank as the restored tabs are rapidly
    populated to the strip. The number of placeholders and positioning of the
    active tab is calculated based on tab metadata saved to disk, and thus does
    not account for tabs created by other means during startup (e.g. user
    interaction). This histogram records the number of tabs created in this way
    (and thus are not accounted for in the placeholder strip). This is captured
    when all tabs are finished restoring.
  </summary>
</histogram>

<histogram name="Android.TabStrip.PlaceholderStripTabsNeededDuringRestoreCount"
    units="tabs" expires_after="2026-12-31">
  <owner>nemco@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    We show empty placeholder tabs on the tablet tab strip during startup. The
    placeholders will be replaced by real tabs once they are restored,
    preventing a visual flicker/scroll jank as the restored tabs are rapidly
    populated to the strip. The number of placeholders and positioning of the
    active tab is calculated based on tab metadata saved to disk, and thus does
    not account for tabs created by other means during startup (e.g. user
    interaction). This histogram records the number of restored tabs, if any,
    that we unexpectedly did not allocate a placeholder for. This is captured
    when all tabs are finished restoring.
  </summary>
</histogram>

<histogram name="Android.TabStrip.PlaceholderStripVisibleDuration" units="ms"
    expires_after="2026-12-31">
  <owner>nemco@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    We show empty placeholder tabs on the tablet tab strip during startup. The
    placeholders will be replaced by real tabs once they are restored,
    preventing a visual flicker/scroll jank as the restored tabs are rapidly
    populated to the strip. The number of placeholders and positioning of the
    active tab is calculated based on tab metadata saved to disk, and thus does
    not account for tabs created by other means during startup (e.g. user
    interaction). This histogram records the amount of time for which the
    placeholders are ready to be shown before the tab state is initialized. This
    will roughly measure the amount of time that we could have been seeing the
    flicker/scroll jank without this feature. This is captured when all tabs are
    finished restoring.
  </summary>
</histogram>

<histogram name="Android.TabStrip.TempBackgroundTimedOut" enum="Boolean"
    expires_after="2026-12-31">
  <owner>nemco@google.com</owner>
  <owner>skavuluru@google.com</owner>
  <summary>
    Recorded on startup, after a set amount of time. True if we timed out while
    waiting for the tab strip to be drawn before removing the temp background.
    False if the tab strip was successfully drawn and we removed the temp
    background before timing out.
  </summary>
</histogram>

<histogram name="Android.TabStrip.TimeToSwitchTab" units="ms"
    expires_after="2027-01-03">
  <owner>gauravjj@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    This captures the time taken for a user to select a tab after scrolling the
    tab strip as one measure of tab strip switching efficiency. This is recorded
    only when a tab switch event occurs within 60 seconds of the most recent tab
    strip scroll. In the event of multiple back-to-back scrolls, this metric is
    recorded so long as the sequence of scrolls occur within 60 seconds of each
    other and is capped at 3 minutes.
  </summary>
</histogram>

<histogram name="Android.TabStrip.TitleBitmapFactory.getTitleBitmap.Duration"
    units="ms" expires_after="2026-09-06">
  <owner>peilinwang@google.com</owner>
  <summary>
    The duration of TitleBitmapFactory.getTitleBitmap, recorded once per call.
  </summary>
</histogram>

<histogram name="Android.TabStrip.TitleBitmapFactory.getTitleBitmap.Length"
    units="characters" expires_after="2024-05-10">
  <owner>peilinwang@google.com</owner>
  <owner>twellington@chromium.org</owner>
  <summary>
    The full (untruncated) length of the title to be converted to a bitmap by
    TitleBitmapFactory.getTitleBitmap.

    Recorded once per call, if the title is neither null nor empty.
  </summary>
</histogram>

<histogram name="Android.TabSwitcher.IncognitoClickedIsEmpty" enum="Boolean"
    expires_after="2024-03-17">
  <owner>roagarwal@chromium.org</owner>
  <owner>chrome-incognito@google.com</owner>
  <summary>
    Emitted every time a user uses Incognito button on Tab Switcher. Records
    whether or not there is any Incognito tab when Incognito button is clicked.
  </summary>
</histogram>

<histogram name="Android.TabSwitcher.NullContextMenuCoordinatorIsIncognito"
    enum="Boolean" expires_after="2026-11-15">
  <owner>shuyng@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Emitted when the ContextMenuCoordinator is unexpectedly null while
    attempting to change the context menu's focus state in the Tab Switcher.
    Records true if the current tab model is Incognito (off-the-record) at the
    time of the event, and false if it is a regular tab model.
  </summary>
</histogram>

<histogram name="Android.TabSwitcher.SetupRecyclerView.Time" units="ms"
    expires_after="2025-12-28">
  <owner>skavuluru@chromium.org</owner>
  <owner>twellington@chromium.org</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the time taken to create TabListCoordinator, which inflates the
    RecyclerView for the grid tab switcher, and bind views.
  </summary>
</histogram>

<histogram name="Android.ThumbnailCache.InMemoryCacheEntries"
    units="thumbnails" expires_after="2026-09-20">
  <owner>ckitagawa@chromium.org</owner>
  <owner>dtrainor@chromium.org</owner>
  <summary>
    Records the number of entries for the in-memory ETC1 and bitmap thumbnail
    cache. Recorded on a Poisson distributed frequency with a mean of 5 minutes
    starting 1 minute after TabContentManager native initialization.
  </summary>
</histogram>

<histogram name="Android.ThumbnailCache.InMemoryCacheSize" units="KiB"
    expires_after="2026-09-20">
  <owner>ckitagawa@chromium.org</owner>
  <owner>dtrainor@chromium.org</owner>
  <summary>
    Records the in-memory ETC1 and bitmap thumbnail cache size in KiB. Recorded
    on a Poisson distributed frequency with a mean of 5 minutes starting 1
    minute after TabContentManager native initialization. Note that this memory
    may be distributed across the GPU process and Browser process.
  </summary>
</histogram>

<histogram
    name="Android.ThumbnailProvider.BitmapCache.Size.{ThumbnailProvider_ClientType}"
    units="KB" expires_after="2021-01-30">
  <owner>shaktisahu@chromium.org</owner>
  <owner>clank-downloads@google.com</owner>
  <summary>
    Measures the size of the bitmap cache used. Recorded whenever a bitmap is
    added to the cache. {ThumbnailProvider_ClientType}
  </summary>
</histogram>

<histogram
    name="Android.ThumbnailProvider.CachedBitmap.Found.{ThumbnailProvider_ClientType}"
    enum="BooleanFound" expires_after="2021-01-30">
  <owner>shaktisahu@chromium.org</owner>
  <owner>clank-downloads@google.com</owner>
  <summary>
    Records the status of a thumbnail query from the thumbnail provider
    in-memory cache. {ThumbnailProvider_ClientType}
  </summary>
</histogram>

<histogram name="Android.Toolbar.BitmapCapture" enum="ToolbarCaptureType"
    expires_after="2027-03-24">
  <owner>skym@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    Recorded when a toolbar view draws itself to a bitmap such that it can be
    passed to the compositor and drawn by native. Performing a bitmap capture is
    somewhat expensive opperation that must be done on the UI thread. It is
    possible that high capture counts are correlated with scroll jank.
  </summary>
</histogram>

<histogram name="Android.Toolbar.StaleCapturedUrlOnScroll.Subsampled"
    enum="Boolean" expires_after="2027-02-07">
  <owner>peilinwang@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Whether or not we have a capture with an out of date url when starting a
    scroll. This means that we're showing an older url that's different from the
    url of the current page. This histogram is recorded every time
    onContentViewScrollingStateChanged(true) gets called with browser controls
    unlocked.

    Subsampled to 1% of the time.
  </summary>
</histogram>

<histogram name="Android.ToolbarPosition.PositionAtStartup"
    enum="ToolbarPosition" expires_after="2027-10-01">
  <owner>pnoland@chromium.org</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records the user-preferred position for the toolbar at the time
    ToolbarPositionController is initialized. Initialization occurs once per
    eligible ChromeTabbedActivity after initial layout inflation completes. A
    ChromeTabbedActivity is eligible if it is non-CCT, the device is not a
    tablet, and the bottom toolbar flag is enabled.

    The value of the pref defaults to TOP until the user deliberately changes
    it.
  </summary>
</histogram>

<histogram name="Android.ToolbarPosition.PositionPrefChanged"
    enum="ToolbarPosition" expires_after="2027-10-01">
  <owner>pnoland@chromium.org</owner>
  <owner>ender@google.com</owner>
  <summary>
    Records user-initiated positions change for the toolbar, indicating the
    newly preferred position. Recorded when the value of the toolbar position
    preference changes, either via long press or toggling it in the settings
    page.
  </summary>
</histogram>

<histogram name="Android.TopToolbar.AllowCaptureReason"
    enum="TopToolbarAllowCaptureReason" expires_after="2027-08-13">
  <owner>skym@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    Recorded on #isDirty calls that return true. Because #isDirty() is used to
    control when bitmap captures happen, this histogram holds the reason that
    the capture was allowed. Note that there there's an assert that calls into
    #isDirty() from #getBitmap(), which can cause these to be double counted. If
    Canary starts running assert code, this will cause this metric to double in
    report volume.

    Warning: this histogram was expired from 2024-01 to 2024-10 and from
    2025-12-21 to 2026-08-13; data may be missing.
  </summary>
</histogram>

<histogram name="Android.TopToolbar.BlockCaptureReason"
    enum="TopToolbarBlockCaptureReason" expires_after="2027-05-05">
  <owner>skym@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    Recorded on #isDirty calls that return false. Because #isDirty() is used to
    control when bitmap captures happen, this histogram holds the reason that
    the capture was not allowed.
  </summary>
</histogram>

<histogram
    name="Android.TopToolbar.CaptureBlocked.OptionalButtonAnimationDuration"
    units="ms" expires_after="2026-11-01">
  <owner>peilinwang@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Records how long the optional button was animating for when it causes a
    capture to be blocked. Only recorded when the duration is longer than 10s.
  </summary>
</histogram>

<histogram name="Android.TopToolbar.CaptureBlocked.StatusIconAnimationDuration"
    units="ms" expires_after="2026-11-01">
  <owner>peilinwang@google.com</owner>
  <owner>clank-performance-team@google.com</owner>
  <summary>
    Records how long the status icon was animating for when it causes a capture
    to be blocked. Only recorded when the duration is longer than 10s.
  </summary>
</histogram>

<histogram name="Android.TopToolbar.InMotionStage" enum="ToolbarInMotionStage"
    expires_after="2026-12-27">
  <owner>skym@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    Captures the stages reached in the Toolbar's in motion handling. Recorded
    every time the in motion state of the compositor changes, before the event
    is routed to the renderer process. Motion states include: flinging, swiping,
    and any gesture that the CompositorViewHolder is processing. This metric
    shows how often the in motion handling had to request the toolbar's capture
    readiness state, which is a computationally expensive operation, and could
    slow down input handling. Was expired from 2024-01 to 2024-10.
  </summary>
</histogram>

<histogram name="Android.TopToolbar.SnapshotDifference"
    enum="ToolbarSnapshotDifference" expires_after="2027-08-13">
  <owner>skym@chromium.org</owner>
  <owner>fredmello@chromium.org</owner>
  <summary>
    When the allow reason for a bitmap capture was that the snapshots were
    different, then this histogram is recorded with the reason that the
    snapshots were different. Often there may be multiple differences but one is
    arbitrarily and consistently picked.

    Warning: this histogram was expired from 2024-01 to 2024-10 and from
    2025-12-21 to 2026-08-13; data may be missing.
  </summary>
</histogram>

<histogram name="Android.UIDialogShown" enum="AndroidDialogType"
    expires_after="2027-03-15">
  <owner>alexmitra@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Logs when an Android dialog is shown from either Chrome or WebView. Logs the
    specific type of dialog which is being shown to the user.
  </summary>
</histogram>

<histogram name="Android.VersionCode" enum="VersionCode"
    expires_after="2027-01-17">
  <owner>tasak@google.com</owner>
  <owner>lizeb@chromium.org</owner>
  <summary>
    Version code identifies which bundle is used. It's effectively a version
    from the Play Store point of view. There can be multiple version codes for a
    given Chrome version. See go/chrome-android-version-codes.

    This is recorded every time a metrics log is created.
  </summary>
</histogram>

<histogram name="Android.VerticalTabs.DragDropResult"
    enum="AndroidVerticalTabsDragDropResult" expires_after="2027-07-22">
  <owner>agazal@google.com</owner>
  <owner>kije@chromium.org</owner>
  <summary>
    Tracks the outcome of a drag-and-drop interaction session in Vertical Tabs.
    Recorded when the drag interaction ends (finger is lifted).
  </summary>
</histogram>

<histogram name="Android.VerticalTabs.DragDropTimeToUngroup" units="ms"
    expires_after="2027-07-22">
  <owner>agazal@google.com</owner>
  <owner>kije@chromium.org</owner>
  <summary>
    Records the duration (in milliseconds) between when a tab was grouped via
    drag and drop and when it was subsequently ungrouped (dragged back out) in
    Vertical Tabs.
  </summary>
</histogram>

<histogram name="Android.VerticalTabs.DurationEnabled" units="ms"
    expires_after="2027-07-22">
  <owner>agazal@google.com</owner>
  <owner>jinsukkim@chromium.org</owner>
  <summary>
    Records the duration (wall-clock time) for which Vertical Tabs remained
    enabled. Recorded when the user toggles Vertical Tabs off (reverting to
    Horizontal Tabs).
  </summary>
</histogram>

<histogram name="Android.VerticalTabs.LayoutToggleSourceAndDirection"
    enum="AndroidVerticalTabsLayoutToggleSourceAndDirection"
    expires_after="2027-07-22">
  <owner>agazal@google.com</owner>
  <owner>jinsukkim@chromium.org</owner>
  <owner>eleanorlee@google.com</owner>
  <summary>
    Records the entry point and direction (enable/disable) when the user toggles
    Vertical Tabs.
  </summary>
</histogram>

<histogram name="Android.VerticalTabs.RailCollapsed" enum="Boolean"
    expires_after="2027-07-22">
  <owner>agazal@google.com</owner>
  <owner>spdonghao@google.com</owner>
  <summary>
    Recorded when the user clicks on the collapse button to collapse or expand
    the vertical tab strip rail. True if the user is collapsing the rail and
    false if a user is expanding it.
  </summary>
</histogram>

<histogram name="Android.VerticalTabs.TabGroupCollapsed" enum="Boolean"
    expires_after="2027-07-22">
  <owner>agazal@google.com</owner>
  <owner>jinsukkim@chromium.org</owner>
  <summary>
    Recorded when the user clicks on the tab group header to collapse or expand
    it in Vertical Tabs. True if the user is collapsing a group and false if a
    user is expanding it.
  </summary>
</histogram>

<histogram name="Android.VerticalTabs.WindowWidthBoundaryOnToggle.{Direction}"
    enum="AndroidVerticalTabsWindowWidthBoundary" expires_after="2027-07-22">
  <owner>agazal@google.com</owner>
  <owner>jinsukkim@chromium.org</owner>
  <owner>eleanorlee@google.com</owner>
  <owner>spdonghao@google.com</owner>
  <summary>
    Records the window width boundary category when a user toggles Vertical Tabs
    {Direction}.
  </summary>
  <token key="Direction">
    <variant name="Disable" summary="off (reverting to horizontal tabs)"/>
    <variant name="Enable" summary="on (switching to vertical tabs)"/>
  </token>
</histogram>

<histogram name="Android.Wallet.BoardingPass.Detected" enum="BooleanDetected"
    expires_after="2024-12-31">
  <owner>hanfeng@google.com</owner>
  <owner>wallet-1p-integrations@google.com</owner>
  <summary>
    Records detected flight boarding pass barcode images on each page load. It's
    only enabled on the Chrome Android app. It's only emitted once on page load,
    either detected or not detected.
  </summary>
</histogram>

<histogram name="Android.WebView.AgsaProcessName" enum="AgsaProcessName"
    expires_after="2026-11-30">
  <owner>elabadysayed@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    The name of the process when WebView is loaded by the AGSA app
    (com.google.android.googlequicksearchbox).

    This is recorded every time a metrics log is created, but only if the host
    app is AGSA.
  </summary>
</histogram>

<histogram name="Android.WebView.AndroidX.ApiCall" enum="AndroidXWebkitApiCall"
    expires_after="never">
<!-- expires-never: used in server pipeline to monitor WebView API usage -->

  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records calls to WebView APIs from AndroidX. Some AndroidX-originating calls
    may plumb through the corresponding platform (framework) API if the device
    OS version supports the platform API. In this case the API call will be
    logged by the &quot;Android.WebView.ApiCall&quot; histogram instead. This is
    logged each time an AndroidX API is called through the &quot;boundary
    interface&quot; code path (see //android_webview/support_library/README.md
    for more details).

    Warning: this histogram was expired from 2026-05-03 to 2026-05-15; data may
    be missing.
  </summary>
</histogram>

<histogram name="Android.WebView.AndroidX.Profile.ExtraHeaderAttached"
    enum="BooleanUsage" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    This histogram is logged every time a header configured through the AndroidX
    Profile.setExtraHeaderForOrigins API matches an outgoing request, whether it
    is the original request or a redirect. The histogram records whether the
    header was ultimately attached to the request (Used) or skipped because it
    would have overwritten an existing header on the request (Not Used).

    The histogram is emitted once for each matching header on each request or
    redirect.

    The histogram is intended to provide data on how often headers configured
    through this API collides with existing headers, as input for potential
    future changes to the AndroidX API.
  </summary>
</histogram>

<histogram
    name="Android.WebView.AndroidX.Profile.ExtraHeaderTargetsCorsPreflight"
    enum="Boolean" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    This histogram is logged every time a header configured through the AndroidX
    Profile.setExtraHeaderForOrigins API matches an outgoing CORS preflight
    request, and is emitted once per request, even if multiple headers match.

    The histogram is intended to provide data on how often headers configured
    through this API applies to CORS preflight, to inform if and how to handle
    preflight request.
  </summary>
</histogram>

<histogram name="Android.WebView.ApiCall" enum="WebViewApiCall"
    expires_after="never">
<!-- expires-never: used in server pipeline to monitor WebView API usage -->

  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records calls to WebView APIs through the platform (framework) APIs. This
    may include AndroidX API calls on OS versions where the AndroidX library
    just calls through the platform API (see
    &quot;Android.WebView.AndroidX.ApiCall&quot; for details). This is logged
    each time an API is called.

    For historical data (before M99), see &quot;WebView.ApiCall&quot;.

    Warning: this histogram was expired from 2026-04-29 to 2026-05-15; data may
    be missing.
  </summary>
</histogram>

<histogram
    name="Android.WebView.ApiCall.Duration.Framework.LOAD_DATA_WITH_BASE_URL"
    units="ms" expires_after="2027-05-16">
  <owner>ziadyoussef@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    How long the WebView loadDataWithBaseURL API takes to run. This measures the
    sync time the API takes to return not the actual time until the page loads.
    This is logged only when the app calls loadDataWithBaseURL explicitly.
  </summary>
</histogram>

<histogram name="Android.WebView.ApiCall.Duration.Framework.LOAD_URL"
    units="ms" expires_after="2027-05-16">
  <owner>ziadyoussef@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    How long the WebView loadUrl API takes to run. This measures the sync time
    the API takes to return not the actual time until the page loads. This is
    logged only when the app calls loadUrl explicitly.
  </summary>
</histogram>

<histogram
    name="Android.WebView.ApiCall.Duration.Framework.LOAD_URL_ADDITIONAL_HEADERS"
    units="ms" expires_after="2027-05-16">
  <owner>ziadyoussef@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    How long the WebView loadUrl with addtional headers API takes to run. This
    measures the sync time the API takes to return not the actual time until the
    page loads. This is logged only when the app calls loadUrl with addtional
    headers explicitly.
  </summary>
</histogram>

<histogram name="Android.WebView.ApiCall.Overridden.WebChromeClient"
    enum="WebChromeClientMethod" expires_after="never">
<!-- expires-never: used in server pipeline to monitor WebView API usage -->

  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records which methods of WebChromeClient the caller has overridden when
    calling WebView.setWebChromeClient. The goal of this histogram is to
    determine the popularity of the various callback methods present in
    WebChromeClient.

    This histogram is logged every time a WebChromeClient is set.
  </summary>
</histogram>

<histogram name="Android.WebView.ApiCall.Overridden.WebChromeClient.Count"
    units="Methods" expires_after="never">
<!-- expires-never: used in server pipeline to monitor WebView API usage -->

  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records how many methods of WebChromeClient the caller has overridden when
    calling WebView.setWebChromeClient. The goal of this histogram is to track
    how many methods apps override to assist the analysis of API usage in
    WebView.

    This histogram is logged every time a WebChromeClient is set.
  </summary>
</histogram>

<histogram name="Android.WebView.ApiCall.Overridden.WebViewClient"
    enum="WebViewClientMethod" expires_after="never">
<!-- expires-never: used in server pipeline to monitor WebView API usage -->

  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records which methods of WebViewClient the caller has overridden when
    calling WebView.setWebViewClient. The goal of this histogram is to determine
    the popularity of the various callback methods present in WebViewClient.

    This histogram is logged every time a WebViewClient is set.
  </summary>
</histogram>

<histogram name="Android.WebView.ApiCall.Overridden.WebViewClient.Count"
    units="Methods" expires_after="never">
<!-- expires-never: used in server pipeline to monitor WebView API usage -->

  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records how many methods of WebViewClient the caller has overridden when
    calling WebView.setWebViewClient. The goal of this histogram is to track how
    many methods apps override to assist the analysis of API usage in WebView.

    This histogram is logged every time a WebViewClient is set.
  </summary>
</histogram>

<histogram name="Android.WebView.ApiCall.Static" enum="WebViewApiCallStatic"
    expires_after="never">
<!-- expires-never: used in server pipeline to monitor WebView API usage -->

  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <owner>woa-performance@google.com</owner>
  <summary>
    Records calls to static WebView APIs through the platform (framework) APIs.
    This may include AndroidX API calls on OS versions where the AndroidX
    library just calls through the platform API (see
    &quot;Android.WebView.AndroidX.ApiCall&quot; for details). This is logged
    each time an API is called.

    Recorded in M118+.

    This metric was expired between Aug 2024 and Jan 2025 and may be missing
    data.

    Warning: this histogram was expired from 2026-04-29 to 2026-05-15; data may
    be missing.
  </summary>
</histogram>

<histogram name="Android.WebView.ApiCall.System" enum="WebViewApiCallSystem"
    expires_after="never">
<!-- expires-never: used in server pipeline to monitor WebView API usage -->

  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <owner>woa-performance@google.com</owner>
  <summary>
    Records calls to WebView APIs made by the system through the platform
    (framework) APIs. This is logged each time an API is called.

    Recorded in M118+.

    This metric was expired between Aug 2024 and Jan 2025 and may be missing
    data.

    Warning: this histogram was expired from 2026-04-29 to 2026-05-15; data may
    be missing.
  </summary>
</histogram>

<histogram name="Android.WebView.ApiCall.TracingController"
    enum="WebViewApiCallTracingController" expires_after="2027-04-01">
  <owner>etiennep@chromium.org</owner>
  <owner>ntfschr@chromium.org</owner>
  <summary>
    Records calls to TracingController WebView APIs through the platform
    (framework) APIs. This is logged each time an API is called.

    Warning: this histogram was expired from 2026-04-29 to 2026-05-15; data may
    be missing.
  </summary>
</histogram>

<histogram name="Android.WebView.AppliedProcessGlobalCacheDirectoryBasePath"
    enum="Boolean" expires_after="2027-05-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>peter@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Whether a cache directory base path, provided through the process global
    config, was applied when loading the WebView library. Recorded once per
    WebView startup.
  </summary>
</histogram>

<histogram name="Android.WebView.AppliedProcessGlobalDataDirectoryBasePath"
    enum="Boolean" expires_after="2027-05-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>peter@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Whether a data directory base path, provided through the process global
    config, was applied when loading the WebView library. Recorded once per
    WebView startup.
  </summary>
</histogram>

<histogram name="Android.WebView.AssetPathWorkaroundUsed.FactoryInit"
    enum="Boolean" expires_after="2027-03-11">
  <owner>alexmitra@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    In some cases, WebView is unable to find the package ID which usually means
    that the AssetManager for the Context passed to WebView doesn't have WebView
    loaded in it. We have a rudimentary workaround for this which is to add
    WebView's asset path to the Context. Since writing this workaround, we
    believe we've addressed the underlying problem. Therefore the workaround
    should no longer be needed. This histogram logs whether the asset path
    workaround was needed during startup so that we can determine if it's safe
    to remove. This is logged once during
    WebViewChromiumFactoryProvider#initialize.
  </summary>
</histogram>

<histogram name="Android.WebView.AssetPathWorkaroundUsed.StartChromiumLocked"
    enum="Boolean" expires_after="2027-03-11">
  <owner>alexmitra@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    In some cases, WebView is unable to find its own Resources which usually
    means that the host app is doing something unsupported with the Context
    passed to WebView (or with the platform Resources class). We have a
    rudimentary workaround for this which is to add WebView's asset path to the
    Context. Since writing this workaround, we believe we've addressed the
    underlying problem. Therefore the workaround should no longer be needed.
    This histogram logs whether the asset path workaround was needed during
    startup so that we can determine if it's safe to remove. This is logged once
    during WebViewChromiumAwInit#startChromium.
  </summary>
</histogram>

<histogram
    name="Android.WebView.AwBrowserContext.Default.Duration.CreateOrLoadFromDisk"
    units="ms" expires_after="2026-04-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the UI thread blocking time taken to instantiate the default
    profile, which may or may not already reside on disk.

    Emitted once per session at Chromium startup after the immediate UI thread
    blocking work for instantiating the default profile is completed. Note that
    profile instantiation may trigger additional tasks, threads, or processes to
    be started, which may not be measured by this histogram. This non-measured
    work may still block practical usage of a profile.

    Only emitted for AndroidWebView.
  </summary>
</histogram>

<histogram
    name="Android.WebView.AwBrowserContext.GetDefaultStoragePartition.Duration"
    units="ms" expires_after="2027-07-01">
  <owner>elabadysayed@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the synchronous duration of GetDefaultStoragePartition() when
    invoked during AwBrowserContext profile initialization. Emitted when
    creating origin trials delegate in the profile constructor.
  </summary>
</histogram>

<histogram name="Android.WebView.AwBrowserContext.Instantiations"
    units="profiles" expires_after="2026-04-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    After a (default or non-default) profile is instantiated (freshly created or
    loaded from disk), records the new total count of instantiated profiles for
    the current session. Profiles cannot currently be unloaded, so this reflects
    the number of profiles actively loaded in memory.

    For example, if 3 profiles are started during a session, this histogram will
    emit 1, then 2, then 3. Note that this means direct modal or percentile
    based analysis of this histogram is not meaningful.

    Only emitted for AndroidWebView.
  </summary>
</histogram>

<histogram name="Android.WebView.AwBrowserContext.NonDefault.CountAtStartup"
    units="profiles" expires_after="2026-04-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    The number of non-default profiles listed on disk at WebView startup. This
    is counted before any profiles are loaded, created, deleted, or otherwise
    manipulated.

    The default profile is not explicitly tracked in the pref_store and as such
    is not included in the count.

    Emitted once per session at Chromium startup.

    Only emitted for AndroidWebView.
  </summary>
</histogram>

<histogram name="Android.WebView.AwBrowserContext.NonDefault.Duration.Create"
    units="ms" expires_after="2026-04-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    When a non-default profile is requested and needs to be newly created (it
    does not previously exist on disk), records the UI thread blocking time
    taken to create and instantiate the profile.

    Emitted once per non-default profile after it is created and sufficiently
    instantiated to be returned to the getter caller. Note that profile
    instantiation may trigger additional tasks, threads, or processes to be
    started, which may not be measured by this histogram. This non-measured work
    may still block practical usage of a profile.

    A single session will never emit both .Create and .LoadFromDisk for the same
    profile. Only emitted for AndroidWebView.
  </summary>
</histogram>

<histogram name="Android.WebView.AwBrowserContext.NonDefault.Duration.Delete"
    units="ms" expires_after="2026-04-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the time taken to delete an on-disk but uninstantiated non-default
    profile. Requests to delete instantiated or non-existant profiles will not
    emit to this histogram.

    Emitted once per deleted non-default profile after its deletion is
    completed.

    Only emitted for AndroidWebView.
  </summary>
</histogram>

<histogram
    name="Android.WebView.AwBrowserContext.NonDefault.Duration.LoadFromDisk"
    units="ms" expires_after="2026-04-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    When an existing non-default profile is requested and needs to be loaded
    from disk, records the UI thread blocking time taken to load and instantiate
    the profile.

    Emitted once per non-default profile after it is loaded and sufficiently
    instantiated to be returned to the getter caller. Note that profile
    instantiation may trigger additional tasks, threads, or processes to be
    started, which may not be measured by this histogram. This non-measured work
    may still block practical usage of a profile.

    A single session will never emit both .Create and .LoadFromDisk for the same
    profile. Only emitted for AndroidWebView.
  </summary>
</histogram>

<histogram
    name="Android.WebView.AwBrowserContext.NonDefault.TimeSinceStartup.Create"
    units="ms" expires_after="2026-04-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    When a non-default profile is requested and needs to be newly created (it
    does not previously exist on disk), records the time between
    AwBrowserContextStore initialization and this first request for the profile.

    Emitted once per non-default profile creation, just before its registration
    to the pref_store.

    A single session will never emit both .Create and .LoadFromDisk for the same
    profile. Only emitted for AndroidWebView.
  </summary>
</histogram>

<histogram
    name="Android.WebView.AwBrowserContext.NonDefault.TimeSinceStartup.Delete"
    units="ms" expires_after="2026-04-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    When a request to delete an on-disk but uninstantiated non-default profile
    is made, records the time between AwBrowserContextStore initialization and
    the deletion request. Requests to delete instantiated or non-existant
    profiles will not emit to this histogram.

    Emitted once per deleted non-default profile just before its deletion is
    started.

    Only emitted for AndroidWebView.
  </summary>
</histogram>

<histogram
    name="Android.WebView.AwBrowserContext.NonDefault.TimeSinceStartup.LoadFromDisk"
    units="ms" expires_after="2026-04-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    When an existing non-default profile is requested and needs to be loaded
    from disk, records the time between AwBrowserContextStore initialization and
    this session's first request for the profile.

    Emitted once per requested existing non-default profile per session just
    before the time of its load from disk.

    A single session will never emit both .Create and .LoadFromDisk for the same
    profile. Only emitted for AndroidWebView.
  </summary>
</histogram>

<histogram name="Android.WebView.AwContentsConstructorTime{IsFirst}" units="ms"
    expires_after="2026-04-07">
  <owner>cduvall@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Time it takes to run the AwContents constructor. Recorded {IsFirst} time the
    constructor is run.
  </summary>
  <token key="IsFirst">
    <variant name="" summary="each"/>
    <variant name=".First" summary="the first"/>
  </token>
</histogram>

<histogram name="Android.WebView.CachedFlagsExist" enum="BooleanExists"
    expires_after="2027-04-28">
  <owner>alexmitra@chromium.org</owner>
  <owner>colibie@google.com</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    When we read the cached flags from shared preferences, this histogram
    records whether we successfully found existing cached flags. The cached
    flags may not be there if the app/user has cleared the data directory, the
    app is freshly installed or in some cases when the WebView version changes.
    This metric does not include the &quot;old manual experiments&quot;
    referenced in WebViewCachedFlags.java. This metric is recorded once per
    startup.
  </summary>
</histogram>

<histogram name="Android.WebView.CacheQuotaFreshness"
    enum="CacheQuotaFreshness" expires_after="2026-06-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records how this session's cache quota was obtained in
    `AwBrowserProcess::GetHostAppCacheQuota()`.

    This is emitted once during WebView global initialization if
    `WebViewCacheSizeLimitDerivedFromAppCacheQuota` flag is enabled.

    Only emitted for AndroidWebView.
  </summary>
</histogram>

<histogram name="Android.WebView.CacheQuotaSize" units="KiB"
    expires_after="2026-06-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the result of `StorageManager.getCacheQuotaBytes()` after WebView
    startup. The value denotes the amount of cache quota that was allocated to
    the app by the framework.

    This is logged only once per session in a delayed background task
    approximately 5 seconds after WebView completes its main startup tasks. The
    measurement may be expensive, so it is only performed if the
    WebViewRecordAppCacheHistograms feature is enabled.
  </summary>
</histogram>

<histogram name="Android.WebView.CacheSize" units="KiB"
    expires_after="2026-06-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the result of `StorageManager.getCacheSizeBytes()` after WebView
    startup. The value denotes the amount of cache that the app is currently
    using.

    This is logged only once per session in a delayed background task
    approximately 5 seconds after WebView completes its main startup tasks. The
    measurement may be expensive, so it is only performed if the
    WebViewRecordAppCacheHistograms feature is enabled.
  </summary>
</histogram>

<histogram name="Android.WebView.CacheSize{ExceedsOrWithin}Quota" units="KiB"
    expires_after="2026-06-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records by how much the cache size {ExceedsOrWithin} the cache quota alloted
    to the app by the framework.

    This is logged only once per session in a delayed background task
    approximately 5 seconds after WebView completes its main startup tasks. The
    measurement may be expensive, so it is only performed if the
    WebViewRecordAppCacheHistograms feature is enabled.

    Only recorded in AndroidWebView.
  </summary>
  <token key="ExceedsOrWithin">
    <variant name="Exceeds" summary="exceeds"/>
    <variant name="Within" summary="is within"/>
  </token>
</histogram>

<histogram name="Android.WebView.Callback.Counts" enum="WebViewCallbackType"
    expires_after="2027-01-31">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the invocation count of WebView callbacks. Starting with M117,
    records shouldInterceptRequest counts.
  </summary>
</histogram>

<histogram name="Android.WebView.ComponentUpdater.CPSDirectorySize" units="KB"
    expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Size on disk taken by the ComponentsProviderService serving directory. This
    is logged once per run of the update job in AwComponentUpdateService.
  </summary>
</histogram>

<histogram name="Android.WebView.ComponentUpdater.CUSDirectorySize" units="KB"
    expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Size on disk taken by the AwComponentUpdateService directory. This is logged
    once per update job in AwComponentUpdateService.
  </summary>
</histogram>

<histogram name="Android.WebView.ComponentUpdater.GetFilesDuration" units="ms"
    expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Duration of ComponentsProviderService getFilesForComponent request. This
    method retrieves FileDescriptors for an installed component. This is logged
    at the end of every request the service receives.
  </summary>
</histogram>

<histogram name="Android.WebView.ComponentUpdater.GetFilesResult"
    enum="WebViewComponentUpdaterGetFilesResult" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Logs the result of ComponentsProviderService getFilesForComponent request.
    This method retrieves FileDescriptors for an installed component. This is
    logged once for every request the service receives.
  </summary>
</histogram>

<histogram name="Android.WebView.ComponentUpdater.SafeModeActionExecuted"
    enum="Boolean" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Whether a SafeMode action was executed by Component Updater services. This
    is logged whenever a nonembedded Component Updater service checks whether
    SafeMode is enabled.
  </summary>
</histogram>

<histogram name="Android.WebView.ComponentUpdater.UnexpectedExit"
    enum="Boolean" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Whether AwComponentUpdateService quit unexpectedly on the previous run. This
    might indicate a crash occurred during the previous job. This is logged once
    per run of AwComponentUpdateService.
  </summary>
</histogram>

<histogram name="Android.WebView.ComponentUpdater.UpdateJobDuration" units="ms"
    expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Duration of AwComponentUpdateService update job. This job is responsible for
    updating and installing components. This is logged once per run of the job.
  </summary>
</histogram>

<histogram name="Android.WebView.ComponentUpdater.UpdateJobFilesChanged"
    units="count" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    How many components were updated by AwComponentUpdateService update job.
    This is logged once per run of the job, and is capped at 1000.
  </summary>
</histogram>

<histogram name="Android.WebView.ComposeHierarchyDepth" units="levels"
    expires_after="2027-09-01">
  <owner>bewise@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records how many levels up in the View hierarchy Jetpack Compose is found
    when a WebView is attached to the window (e.g. 1 means directly wrapped by
    AndroidView). Records 0 if no Compose ancestor is found.
  </summary>
</histogram>

<histogram name="Android.WebView.CookieFixup.Url" enum="FixupResult"
    expires_after="2027-01-05">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether the two different input fixup strategies being tested in
    AwCookieManager changed the URL, and whether the change was the same. Logged
    once for each call to the Java CookieManager.setCookie or
    CookieManager.getCookie APIs.
  </summary>
</histogram>

<histogram name="Android.WebView.CookieFixup.Value" enum="FixupResult"
    expires_after="2027-01-05">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether the two different input fixup strategies being tested in
    AwCookieManager changed the value, and whether the change was the same.
    Logged once for each call to the Java CookieManager.setCookie API.
  </summary>
</histogram>

<histogram name="Android.WebView.DevUi.AppLaunch" enum="Boolean"
    expires_after="2026-07-15">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the number of times the developer UI app was launched. This only
    ever logs the value &quot;true&quot; because we only care about the total
    count. This is logged in the developer UI app during Activity#onCreate.
  </summary>
</histogram>

<histogram name="Android.WebView.DevUi.CrashList.CollectionState"
    enum="AndroidWebViewCrashCollectionState" expires_after="2026-07-15">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the state of crash collection, as seen by the developer UI. This is
    recorded when launching the crash UI, but only if the UI is not already
    showing an error message for another problem (ex. WebView package error).
    This only logs the first state we detect: ex. if the user has enabled crash
    reporting by opting in and also with the flag UI, this only logs the flag UI
    case.
  </summary>
</histogram>

<histogram name="Android.WebView.DevUi.CrashList.CrashInteraction"
    enum="AndroidWebViewCrashInteraction" expires_after="2026-07-15">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the user's interaction with crashes in the developer UI's crash
    list. Specifically, this tracks how the user interacts with the &quot;hide
    crash&quot;, &quot;upload this crash report&quot; or the &quot;file bug
    report&quot; buttons and possible subsequent dialogs. Since the latter two
    buttons are connected (the user must upload a crash before they can file a
    bug report), we track interaction with both in the same histogram. This is
    recorded for each button press in the crash list and is not recorded if the
    user does not interact with any crashes.
  </summary>
</histogram>

<histogram name="Android.WebView.DevUi.DeveloperModeEnabled"
    enum="BooleanEnabled" expires_after="2026-07-15">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether or not WebView is starting up in &quot;developer mode.&quot;
    This is a mode where the user has enabled debugging features through the
    WebView developer UI. This is recorded once during startup.
  </summary>
</histogram>

<histogram name="Android.WebView.DevUi.FlagLoadingBlockingTime" units="ms"
    expires_after="2026-07-15">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the time spent blocking WebView startup to load flags from the
    developer UI. This is recorded only once during WebView startup, and only if
    we've already detected developer mode is enabled (see
    &quot;Android.WebView.DevUi.DeveloperModeEnabled&quot;).
  </summary>
</histogram>

<histogram name="Android.WebView.DevUi.FlagsUi.ToggledFromSearch"
    enum="Boolean" expires_after="2026-07-15">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    This is recorded each time a user toggles a flag in the developer UI
    (changing a flag's state), and logs whether the user found this flag with
    the search bar (&quot;true&quot; means there was a non-empty search query).
    This is only recorded when the user toggles an individual flag through the
    Spinner dialog, not when they press the &quot;reset all flags&quot; button.
  </summary>
</histogram>

<histogram name="Android.WebView.DevUi.FragmentNavigation.{NavType}"
    enum="AndroidWebViewDevUiFragments" expires_after="2026-07-15">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the user's navigation to a Fragment. &quot;FromIntent&quot; tracks
    navigations triggered by an Intent (ex. navigating to HomeFragment on
    launch) and &quot;NavBar&quot; tracks user interaction with the bottom
    navigation bar. &quot;AnyMethod&quot; should be the sum of the other two.
    {NavType}
  </summary>
  <token key="NavType">
    <variant name="AnyMethod" summary="User navigation through any means"/>
    <variant name="FromIntent"
        summary="User navigation through the bottom navigation bar"/>
    <variant name="NavBar" summary="User navigation in response to an Intent"/>
  </token>
</histogram>

<histogram name="Android.WebView.DevUi.MenuSelection"
    enum="AndroidWebViewDevUiMenu" expires_after="2026-07-15">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the user's selection in the developer UI overflow menu or action
    bar, recorded after each selection.
  </summary>
</histogram>

<histogram name="Android.WebView.DevUi.NetLogsCalled" enum="Boolean"
    expires_after="2025-04-26">
  <owner>ntfschr@chromium.org</owner>
  <owner>thomasbull@chromium.org</owner>
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the number of times the Net Logs were captured. This only ever logs
    the value &quot;true&quot; because we only care about the total count. This
    is logged in the nonembedded AwNetLogService when the net-logs flag is
    enabled and a webview is launched.
  </summary>
</histogram>

<histogram
    name="Android.WebView.DevUi.SessionDuration2.{AndroidWebViewFragment}"
    units="ms" expires_after="2026-07-13">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the time spent using a specific tool, from creation to destruction.
    {AndroidWebViewFragment}
  </summary>
  <token key="AndroidWebViewFragment">
    <variant name="CrashesListFragment"
        summary="This is for the crash list tool."/>
    <variant name="FlagsFragment"
        summary="This is for the flag modification tool."/>
    <variant name="HomeFragment"
        summary="This is for the home (default) page."/>
    <variant name="SafeModeFragment" summary="This is for the safe mode tool."/>
    <variant name="Unknown"
        summary="Unknown Fragment (the histogram may need to be updated)."/>
  </token>
</histogram>

<histogram name="Android.WebView.DevUi.ToggledFlagCount" units="flags"
    expires_after="2026-07-15">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the number of flags we will toggle for this run of WebView. This is
    recorded only once during WebView startup, and only if we've already
    detected developer mode is enabled (see
    &quot;Android.WebView.DevUi.DeveloperModeEnabled&quot;). If developer mode
    is disabled, we will not toggle any flags through this mechanism.
  </summary>
</histogram>

<histogram name="Android.WebView.GetCacheQuotaSizeTime" units="ms"
    expires_after="2026-06-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the time taken to measure Android.WebView.CacheQuotaSize using
    `StorageManager.getCacheQuotaBytes()` in milliseconds.

    This may be logged even if the measurement for
    Android.WebView.CacheQuotaSize fails.
  </summary>
</histogram>

<histogram name="Android.WebView.GetCacheSizeTime" units="ms"
    expires_after="2026-06-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the time taken to measure Android.WebView.CacheSize using
    `StorageManager.getCacheSizeBytes()` in milliseconds.

    This may be logged even if the measurement for Android.WebView.CacheSize
    fails.
  </summary>
</histogram>

<histogram name="Android.WebView.Gfx.HardwareDrawType"
    enum="WebViewDrawAndSubmissionType" expires_after="2027-01-31">
  <owner>vasilyt@chromium.org</owner>
  <owner>boliu@chromium.org</owner>
  <summary>
    Tracks invalidate and frame submission status for WebView hardware draw.
    Result is enum that represent three flags: did we called invalidate this
    frame, did renderer submitted compositor frame and whether DrawParams from
    Android HWUI changed. This is logged once per WebView draw functor call.
  </summary>
</histogram>

<histogram name="Android.WebView.HistoricalApplicationExitInfo.Counts2"
    enum="AndroidProcessExitReason" expires_after="2027-01-10">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Enumerates over the historical list of ApplicationExitInfo and their exit
    reasons for an application. Records the latest exit reason for the embedding
    application. Logged when the browser process is started.
  </summary>
</histogram>

<histogram
    name="Android.WebView.HistoricalApplicationExitInfo.Counts2.BACKGROUND"
    enum="AndroidProcessExitReason" expires_after="2026-11-11">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Enumerates over the historical list of ApplicationExitInfo and their exit
    reasons for an application. Records the latest exit reason for the embedding
    application, specifically when WebView's last recorded state before exiting
    was the background state. Logged when the browser process is started.
  </summary>
</histogram>

<histogram
    name="Android.WebView.HistoricalApplicationExitInfo.Counts2.DESTROYED"
    enum="AndroidProcessExitReason" expires_after="2026-11-11">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Enumerates over the historical list of ApplicationExitInfo and their exit
    reasons for an application. Records the latest exit reason for the embedding
    application, specifically when WebView's last recorded state before exiting
    was the destroyed state. Logged when the browser process is started.
  </summary>
</histogram>

<histogram
    name="Android.WebView.HistoricalApplicationExitInfo.Counts2.FOREGROUND"
    enum="AndroidProcessExitReason" expires_after="2026-11-11">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Enumerates over the historical list of ApplicationExitInfo and their exit
    reasons for an application. Records the latest exit reason for the embedding
    application, specifically when WebView's last recorded state before exiting
    was the foreground state. Logged when the browser process is started.
  </summary>
</histogram>

<histogram name="Android.WebView.HistoricalApplicationExitInfo.Counts2.STARTUP"
    enum="AndroidProcessExitReason" expires_after="2027-01-10">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Enumerates over the historical list of ApplicationExitInfo and their exit
    reasons for an application. Records the latest exit reason for the embedding
    application, specifically when WebView's last recorded state before exiting
    was the startup state. Logged when the browser process is started.
  </summary>
</histogram>

<histogram name="Android.WebView.HistoricalApplicationExitInfo.Counts2.UNKNOWN"
    enum="AndroidProcessExitReason" expires_after="2026-11-11">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Enumerates over the historical list of ApplicationExitInfo and their exit
    reasons for an application. Records the latest exit reason for the embedding
    application, specifically when WebView's last recorded state before exiting
    was the detached state. Logged when the browser process is started.
  </summary>
</histogram>

<histogram name="Android.WebView.HistoricalApplicationExitInfo.Delta2"
    units="ms" expires_after="2026-08-28">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Tracks the deltas (in ms) between the current time of recording and the last
    time of recording historical application exit info data. Only recorded if
    the last time at recording was non-zero and there was some exit reason
    recorded. Logged when the browser process is started.
  </summary>
</histogram>

<histogram name="Android.WebView.HttpCacheQuotaApi.AbsoluteValue.{ProfileType}"
    units="KiB" expires_after="2026-12-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    The absolute HTTP cache quota size supplied to the SetHttpCacheQuota API for
    {ProfileType}. Recorded on every call to the setter API. This uses the
    unclamped value provided to the setter.

    Not emitted when calling UseDefaultHttpCacheQuota. Only emitted if the
    WebViewHttpCacheQuotaApi feature is enabled. This histogram will only be
    emitted for the default profile if the
    WebViewHttpCacheQuotaApiAllowForDefaultProfile feature parameter is true.
  </summary>
  <token key="ProfileType" variants="AwHttpCacheQuotaProfileType"/>
</histogram>

<histogram name="Android.WebView.HttpCacheQuotaApi.ChangeHistory.{ProfileType}"
    enum="HttpCacheQuotaChangeHistory" expires_after="2026-12-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    For each call to the AwBrowserContext::SetHttpCacheQuota or
    ::UseDefaultHttpCacheQuota APIs for {ProfileType}, records whether it is the
    first call or a repeated call with or without a change since the previous
    call.

    Only emitted if the WebViewHttpCacheQuotaApi feature is enabled. This
    histogram will only be emitted for the default profile if the
    WebViewHttpCacheQuotaApiAllowForDefaultProfile feature parameter is true.
  </summary>
  <token key="ProfileType" variants="AwHttpCacheQuotaProfileType"/>
</histogram>

<histogram name="Android.WebView.HttpCacheQuotaApi.RelativeValue.{ProfileType}"
    units="%" expires_after="2026-12-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    The HTTP cache quota size supplied to the SetHttpCacheQuota API relative to
    the default quota size for {ProfileType}. 100% means equal to default.
    Recorded on every call to the SetHttpCacheQuota API. This uses the unclamped
    value provided to the setter, but the default it is compared against is a
    clamped value.

    Not emitted when calling UseDefaultHttpCacheQuota. Only emitted if the
    WebViewHttpCacheQuotaApi feature is enabled. This histogram will only be
    emitted for the default profile if the
    WebViewHttpCacheQuotaApiAllowForDefaultProfile feature parameter is true.
  </summary>
  <token key="ProfileType" variants="AwHttpCacheQuotaProfileType"/>
</histogram>

<histogram
    name="Android.WebView.HttpCacheQuotaApi.RestoredFromPrefs.{ProfileType}"
    enum="Boolean" expires_after="2026-12-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Whether a non-default HTTP cache quota was restored from a previously
    persisted preference for {ProfileType}. Recorded once per profile during
    profile initialization.

    Only emitted if the WebViewHttpCacheQuotaApi feature is enabled. This
    histogram will only be emitted for the default profile if the
    WebViewHttpCacheQuotaApiAllowForDefaultProfile feature parameter is true.
  </summary>
  <token key="ProfileType" variants="AwHttpCacheQuotaProfileType"/>
</histogram>

<histogram
    name="Android.WebView.HttpCacheQuotaApi.UseDefaultQuota.{ProfileType}"
    enum="Boolean" expires_after="2026-12-01">
  <owner>ashleynewson@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Recorded when the HTTP cache quota is reset to the default value for
    {ProfileType}. Recorded on every call to UseDefaultHttpCacheQuota.

    Only emitted if the WebViewHttpCacheQuotaApi feature is enabled. This
    histogram will only be emitted for the default profile if the
    WebViewHttpCacheQuotaApiAllowForDefaultProfile feature parameter is true.
  </summary>
  <token key="ProfileType" variants="AwHttpCacheQuotaProfileType"/>
</histogram>

<histogram name="Android.WebView.HttpCacheSizeLimit" units="MiB"
    expires_after="2027-01-10">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the default per-profile HTTP cache size limit that will be used
    throughout this session. This default may be overridden by the Cache Quota
    API.

    This is emitted once during WebView global initialization.

    Only emitted for AndroidWebView.
  </summary>
</histogram>

<histogram name="Android.WebView.InputStreamTime" units="ms"
    expires_after="2025-06-01">
  <owner>jam@chromium.org</owner>
  <owner>cduvall@chromium.org</owner>
  <owner>stefanoduo@google.com</owner>
  <summary>
    Measures how long InputStreams take from creation to completion. This is
    emitted for all streams whether they succeed or fail. This metric was
    expired between December 2023 and May 2024. Data from that period will be
    incomplete.
  </summary>
</histogram>

<histogram name="Android.WebView.isDebuggable" enum="DebuggingEnabled"
    expires_after="2026-07-25">
  <owner>ntfschr@chromium.org</owner>
  <owner>thomasbull@chromium.org</owner>
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the number of times the WebView is debuggable or not debuggable, if
    it is debuggable then also how it has been set set, whether it is from the
    app or from the OS or from calling setWebContentsDebuggingEnabled(true).
    This is logged each time the MetricsService uploads metrics. Warning: this
    histogram was expired from 2025-05-18 to 2025-07-25; data may be missing.
  </summary>
</histogram>

<histogram name="Android.WebView.JsInjection.RenderFrameCreatedTime" units="ms"
    expires_after="2026-06-01">
  <owner>peconn@chromium.org</owner>
  <owner>webview-team@google.com</owner>
  <summary>
    The time it takes to execute JsCommunicationHost::RenderFrameCreated.
    Recorded whenever a render frame is created in a WebContents that has a
    JsCommunicationHost attached (in other words, in Android WebView).
  </summary>
</histogram>

<histogram name="Android.WebView.LoadDataWithBaseUrl.DataSize.DataScheme"
    units="characters" expires_after="2026-06-01">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    The size of the 'data' string passed to loadDataWithBaseURL() when the
    'baseUrl' starts with 'data:'.
  </summary>
</histogram>

<histogram name="Android.WebView.LoadDataWithBaseUrl.DataSize.NonDataScheme"
    units="characters" expires_after="2026-06-01">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    The size of the 'data' string passed to loadDataWithBaseURL() when the
    'baseUrl' does not start with 'data:'.
  </summary>
</histogram>

<histogram name="Android.WebView.LoadUrl.FailureScheme" enum="WebViewUrlScheme"
    expires_after="2026-06-01">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the scheme for calls to loadUrl that have failed (they will have
    recorded Android.WebView.LoadUrl.Success == false). Logged once per call to
    loadUrl.
  </summary>
</histogram>

<histogram name="Android.WebView.LoadUrl.RejectedHeaderCount" units="headers"
    expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    This histogram records the number of HTTP headers that are silently rejected
    by the WebView.loadUrl API. The API will reject headers if the name or value
    contains any of NULL, CR, LF with an IllegalArgumentException. However,
    header names have more forbidden characters than just those three, and the
    API will silently discard those headers to maintain long-term compatibility.

    The purpose of this histogram is to identify applications who rely on this
    silent rejection of invalid headers in order to determine the disruption
    caused if we change the API contract in the future.

    This histogram logs the count of headers that are silently rejected.

    The histogram will only be emitted if the application is setting at least
    one header, and will be 0 if no invalid headers were rejected. It will not
    be emitted if any headers were rejected due to the 3 characters mentioned
    above.
  </summary>
</histogram>

<histogram name="Android.WebView.LoadUrl.Success" enum="BooleanSuccess"
    expires_after="2026-06-01">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether a call to loadUrl succeeds or not, with regards to whether
    NavigationController.loadUrl returns a non-null NavigationHandle. This is
    logged once per call to loadUrl.
  </summary>
</histogram>

<histogram name="Android.WebView.LoadUrl.UrlScheme" enum="WebViewUrlScheme"
    expires_after="2024-06-13">
  <owner>ntfschr@chromium.org</owner>
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the scheme for the URL loaded by a browser-initiated navigation.
    Specifically, this is the scheme of the URL passed to loadUrl() (and its
    overloads), postUrl(), and loadData() (this is implicitly
    &quot;data:&quot;). also records if this value is &quot;empty&quot;, which
    means either null or &quot;about:blank&quot;. This intentionally excludes
    loadDataWithBaseURL().
  </summary>
</histogram>

<histogram name="Android.WebView.MediaIntegrity.ApiStatusV2"
    enum="AndroidWebViewMediaIntegrityApiStatus" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the Media Integrity API Status set by the embedding application.
    This status can be different for different URLs, but this histogram just
    records the reported API status without any URL information.

    This metric is logged when the API status for the source origin is checked.
    This is done during the initial call to supply a token provider to the Blink
    Renderer Extension.
  </summary>
</histogram>

<histogram name="Android.WebView.MediaIntegrity.ContentBindingSizeLog2"
    units="log2(bytes)" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the ceil(log2(x)) of the size of the provided content binding on a
    requestToken call.

    Play restricts the length of the content binding to 500, but this histogram
    is recorded before calling Play, so any values higher that 9 would likely
    have led to a client error.

    This histogram is recorded as an exact linear histogram with a max value of
    32.
  </summary>
</histogram>

<histogram name="Android.WebView.MediaIntegrity.GetTokenCumulativeV2"
    units="calls" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Counts the number of calls to 'requestToken' for a token provider. This
    metric is counted individually for each token provider, and is emitted when
    the request for a token is made.

    The metric will show the usage pattern of token providers by individual
    clients, by showing how many times they are used by the client

    As a cumulative value, this value is incremented and logged for each
    successive call. This means that when this histogram is logged for the Nth
    time, it will already have been emitted for all values [1 ... N-1]. Before
    analysing the histogram, it should be normalised by subtracting the raw
    count of the next higher bucket from the bucket count. The interesting value
    is &quot;how far did the app get&quot;. By subtracting the raw count of N+1
    from bucket N, you remove all the counts where the app continued to emit the
    next value in the sequence.
  </summary>
</histogram>

<histogram name="Android.WebView.MediaIntegrity.GetTokenProviderCumulativeV2"
    units="calls" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Counts the number of times the WebView Media Integrity getIntegrityProvider
    method has been called by web content since the app loaded.

    This metric will be used to analyse the usage pattern of the Media Integrity
    API in apps, specifically to understand if apps are causing multiple
    sessions to be created, or if apps are instead creating a single webpage
    that loads a single resource which instantiates the API once.

    The metric is logged whenever a valid request is made from Web Content.

    As a cumulative value, this value is incremented and logged for each
    successive call. This means that when this histogram is logged for the Nth
    time, it will already have been emitted for all values [1 ... N-1]. Before
    analysing the histogram, it should be normalised by subtracting the raw
    count of the next higher bucket from the bucket count. The interesting value
    is &quot;how far did the app get&quot;. By subtracting the raw count of N+1
    from bucket N, you remove all the counts where the app continued to emit the
    next value in the sequence.
  </summary>
</histogram>

<histogram name="Android.WebView.MediaIntegrity.GetTokenProviderResponseTimeV2"
    units="ms" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the end-to-end time for a GetTokenProvider call to a successful
    response. This will be the time observed by a JavaScript client waiting for
    a new token provider.

    This includes both responses served from the cache and responses that go to
    Play. This histogram is not logged if the call results in an error.

    This histogram replaces
    Android.WebView.MediaIntegrity.GetTokenProviderResponseTime by extending the
    range of valid values from 10 seconds to 3 minutes.
  </summary>
</histogram>

<histogram name="Android.WebView.MediaIntegrity.GetTokenProviderStatus"
    enum="AndroidWebViewMediaIntegrityStatus" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Logs the status of calling the Play getTokenProvider API.

    This histogram is logged on both successful responses and error responses.

    The error enum corresponds to the StandardIntegrityErrorCode, but introduces
    an UNKNOWN_ERROR code to catch situations where the Play client library
    introduces a new error code.
  </summary>
</histogram>

<histogram name="Android.WebView.MediaIntegrity.GetTokenStatus"
    enum="AndroidWebViewMediaIntegrityStatus" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Logs the status of calling the Play request token API on the
    StandardIntegrityTokenProvider.

    This histogram is logged on both successful responses and error responses.

    The error enum corresponds to the StandardIntegrityErrorCode, but introduces
    an UNKNOWN_ERROR code to catch situations where the Play client library
    introduces a new error code.
  </summary>
</histogram>

<histogram name="Android.WebView.MediaIntegrity.GetTokenTime" units="ms"
    expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the time from the beginning of a getToken request to a successful
    response is returned to JavaScript.
  </summary>
</histogram>

<histogram name="Android.WebView.MediaIntegrity.InvalidInteraction"
    enum="AndroidWebViewMediaIntegrityInvalidInteraction"
    expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Logs invalid calls from JavaScript to the Media Integrity API Java
    implementation.

    This histogram will be used to understand the extend to which clients are
    bypassing the JavaScript client API and sending unexpected requests to Java.
  </summary>
</histogram>

<histogram name="Android.WebView.MediaIntegrity.NonRecoverableErrorReason"
    enum="AndroidWebViewMediaIntegrityNonRecoverableErrorReason"
    expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the reason for returning a &quot;Non-recoverable Error&quot; from
    the Android WebView Media Integrity API, to aid in investigating why clients
    are seeing a relatively high proportion of this error code.

    The histogram is emitted every time this error code is produced by the
    implementation.
  </summary>
</histogram>

<histogram
    name="Android.WebView.MediaIntegrity.TokenProviderCacheEvictionsCumulativeV2"
    units="evictions" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Counts the number of times the token provider cache size has been exceeded,
    or in other words how many times an existing token provider was evicted from
    the cache in order to make room for a new one. The purpose of this histogram
    is to measure the effectiveness of the current cache size parameter, and
    will help inform if it should be changed, by giving us a histogram of how
    much larger it should have been to avoid evictions.

    This metric is logged every time a token provider is evicted.

    As a cumulative value, this value is incremented and logged for each
    successive call. This means that when this histogram is logged for the Nth
    time, it will already have been emitted for all values [1 ... N-1]. Before
    analysing the histogram, it should be normalised by subtracting the raw
    count of the next higher bucket from the bucket count. The interesting value
    is &quot;how far did the app get&quot;. By subtracting the raw count of N+1
    from bucket N, you remove all the counts where the app continued to emit the
    next value in the sequence.
  </summary>
</histogram>

<histogram
    name="Android.WebView.MediaIntegrity.TokenProviderCacheHitsCumulativeV2"
    units="hits" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Counts the number of times a cached token provider is returned in response
    to a request from web content.

    This metric will help gauge the effectiveness of the token provider cache,
    especially if the cache size is changed in the future. It serves as a way to
    measure the savings on requests to Play caused by the cache.

    The metric is logged when a cached token provider is found in the cache.

    As a cumulative value, this value is incremented and logged for each
    successive call. This means that when this histogram is logged for the Nth
    time, it will already have been emitted for all values [1 ... N-1]. Before
    analysing the histogram, it should be normalised by subtracting the raw
    count of the next higher bucket from the bucket count. The interesting value
    is &quot;how far did the app get&quot;. By subtracting the raw count of N+1
    from bucket N, you remove all the counts where the app continued to emit the
    next value in the sequence.
  </summary>
</histogram>

<histogram
    name="Android.WebView.MediaIntegrity.TokenProviderCacheMissesCumulativeV2"
    units="misses" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Counts the number of cache misses for the token provider cache in an
    application.

    This metric will help gauge the effectiveness of the token provider cache,
    especially if the cache size is changed in the future. It serves as a way to
    measure the savings on requests to Play caused by the cache.

    The metric is logged when a cached token provider is not found the cache.

    As a cumulative value, this value is incremented and logged for each
    successive call. This means that when this histogram is logged for the Nth
    time, it will already have been emitted for all values [1 ... N-1]. Before
    analysing the histogram, it should be normalised by subtracting the raw
    count of the next higher bucket from the bucket count. The interesting value
    is &quot;how far did the app get&quot;. By subtracting the raw count of N+1
    from bucket N, you remove all the counts where the app continued to emit the
    next value in the sequence.
  </summary>
</histogram>

<histogram
    name="Android.WebView.MediaIntegrity.TokenProviderCreatedCumulativeV2"
    units="providers" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Logs how many times a new TokenProvider is created by Play.

    This metric will show how many different token providers are requested from
    Play. With the token provider cache in place, this count is expected to be
    lower than GetTokenProviderCumulative.

    This metric is logged when a provider is returned from Play.

    As a cumulative value, this value is incremented and logged for each
    successive call. This means that when this histogram is logged for the Nth
    time, it will already have been emitted for all values [1 ... N-1]. Before
    analysing the histogram, it should be normalised by subtracting the raw
    count of the next higher bucket from the bucket count. The interesting value
    is &quot;how far did the app get&quot;. By subtracting the raw count of N+1
    from bucket N, you remove all the counts where the app continued to emit the
    next value in the sequence.
  </summary>
</histogram>

<histogram name="Android.WebView.MediaIntegrity.TokenProviderCreationTimeV2"
    units="ms" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the time from requesting a new token provider from Play to receiving
    a successful response. This histogram is not emitted if the call results in
    an error.

    This histogram replaces
    Android.WebView.MediaIntegrity.TokenProviderCreationTimeV2 by extending the
    range of valid values from 10 seconds to 3 minutes.
  </summary>
</histogram>

<histogram name="Android.WebView.Memory.FaviconJavaAllocatedMemory2" units="KB"
    expires_after="2027-04-01">
  <owner>isaacmadgwick@chromium.org</owner>
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the memory usage by mFavicon in AwContents in the java side. This is
    to determine how much memory is being used by favicons in Java.

    This histogram is logged everytime onReceivedIcon is called.

    This histogram replaces Android.WebView.Memory.FaviconJavaAllocatedMemory,
    which was configured with a min-value of 1000, and thus put most values in
    the 0 bucket.
  </summary>
</histogram>

<histogram name="Android.WebView.MixedContent.Mode"
    enum="WebViewMixedContentMode" expires_after="2024-08-25">
  <owner>ntfschr@chromium.org</owner>
  <owner>carlosil@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the mixed content mode set when an app uses the
    WebSettings.setMixedContentMode API.
  </summary>
</histogram>

<histogram name="Android.WebView.Navigation.DidDownloadFavicon" enum="Boolean"
    expires_after="2026-09-30">
  <owner>isaacmadgwick@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    For each navigation e.g. loadUrl, this histogram records if a Favicon is
    downloaded or not. This is recorded by the value of
    AwContents::ShouldDownloadFavicon.

    Emitted everytime a WebView page navigation attempts to download a Favicon.
  </summary>
</histogram>

<histogram name="Android.WebView.Navigation.MainFrame"
    enum="WebViewNavigationType" expires_after="2026-09-30">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    For each committed navigation in the main frame of a WebView, records
    whether this was the initial navigation, a same-document navigation, or in
    all other cases whether it is same- or cross-origin and whether it was
    triggered by the browser or renderer.

    Navigations that do not commit (interrupted, HTTP 204, etc) are not counted.
  </summary>
</histogram>

<histogram name="Android.WebView.NonAppUid" enum="AndroidUidType"
    expires_after="2025-12-31">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the type of UID that WebView is running as if it's not a standard
    application UID. This is recorded once during WebView startup on SDK30+
    devices.
  </summary>
</histogram>

<histogram name="Android.WebView.NonEmbeddedMetrics.HistogramRecordAge"
    units="minutes" expires_after="2027-02-21">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the time interval between when a histogram is recorded in a
    non-embedded WebView process and when it's actually sent to the UMA API in
    an embedded WebView. This is recorded during WebView startup for each
    histogram retrieved and replayed successfully from WebView non-embedded
    metrics service.
  </summary>
</histogram>

<histogram name="Android.WebView.NonEmbeddedMetrics.NumHistograms"
    units="histograms" expires_after="2027-02-21">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the number of histograms received from WebView's non-embedded
    histogram service. This is recorded once during WebView startup, after
    retrieving histograms from the service (if the proto can be parsed).
  </summary>
</histogram>

<histogram name="Android.WebView.NonEmbeddedMetrics.ParsingLogResult"
    enum="AndroidWebViewNonEmbeddedMetricsParsingLogResult"
    expires_after="2027-02-21">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether metrics parsing from file in non-embedded histogram service
    was successful. It's recorded during service startup by adding it to records
    list. It captures the most recent file parsing result for the last service
    launch before the client connects to the service.
  </summary>
</histogram>

<histogram name="Android.WebView.NonEmbeddedMetrics.TransmissionResult"
    enum="AndroidWebViewDevUiMetricsTransmission" expires_after="2027-02-21">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether metrics transmission from the non-embedded histogram service
    was successful. This is recorded once during WebView startup, after
    retrieving histograms from the service.
  </summary>
</histogram>

<histogram name="Android.WebView.OnRenderProcessGoneResult2"
    enum="AndroidWebViewRenderProcessGoneResult" expires_after="2027-06-21">
  <owner>ntfschr@chromium.org</owner>
  <owner>ziadyoussef@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    This captures three pieces of information about renderer crashes: did the
    app developer handle the renderer crash to recover, what type of crash was
    this and was the app in foreground or background? This is recorded once each
    time the renderer process dies unexpectedly, and is logged after we have
    notified the app via the onRenderProcessGone() callback.

    Note that the foreground/background state tracked here is different from the
    foreground/background state of WebView that we typically track. Those track
    the state of the WebViews in an app while this tracks the state of the app
    as a whole.
  </summary>
</histogram>

<histogram name="Android.WebView.OptionallyBlockableMixedContentLoaded.Mode"
    enum="WebViewMixedContentMode" expires_after="2024-08-25">
  <owner>ntfschr@chromium.org</owner>
  <owner>carlosil@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the mixed content mode set when an app loads optionally blockable
    mixed content (images, audio, or video). This histogram is logged on page
    load, once per subresource (i.e. a single page load can cause multiple
    records if the page contains multiple mixed content subresources).
  </summary>
</histogram>

<histogram name="Android.WebView.OriginsVisited" units="origins"
    expires_after="2026-08-28">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Measures the count of distinct http and https origins visited per day in
    WebView. The purpose of this metric is to slice it by package name to help
    characterize the usage of that package.
  </summary>
</histogram>

<histogram name="Android.WebView.PageLoad.LoadUrlToCommit" units="ms"
    expires_after="2027-06-22">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    The time from when AwContents.loadUrl is called on the UI thread to when the
    network request for the URL starts. Recorded only for API initiated page
    loads.
  </summary>
</histogram>

<histogram name="Android.WebView.PageLoad.LoadUrlToFirstContentfulPaint"
    units="ms" expires_after="2027-06-22">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    The time from when AwContents.loadUrl is called on the UI thread to when the
    first contentful paint occurs for the loaded page. Recorded only for API
    initiated page loads.
  </summary>
</histogram>

<histogram name="Android.WebView.Preconnect.ConnectionDuration{Protocol}"
    units="ms" expires_after="2027-01-01">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the duration of a {Protocol} preconnected session in WebView. This
    is the time elapsed between connection opening and closing. Logged when the
    preconnected session is closed.
  </summary>
  <token key="Protocol">
    <variant name="" summary="all"/>
    <variant name=".HTTP2" summary="HTTP/2"/>
    <variant name=".Other" summary="Other protocol"/>
    <variant name=".QUIC" summary="QUIC"/>
  </token>
</histogram>

<histogram name="Android.WebView.Preconnect.Event"
    enum="AndroidWebViewPreconnectEvent" expires_after="2027-01-01">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records events during the WebView preconnect lifecycle. Logged when the
    preconnect process begins and when the session is closed.
  </summary>
</histogram>

<histogram name="Android.WebView.Preconnect.SessionCreationTime.{Protocol}"
    units="ms" expires_after="2027-01-01">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the setup latency of a {Protocol} preconnected session in WebView.
    Logged when the connection is established.
  </summary>
  <token key="Protocol">
    <variant name="HTTP2" summary="HTTP/2"/>
    <variant name="Other" summary="Other protocol"/>
    <variant name="QUIC" summary="QUIC"/>
  </token>
</histogram>

<histogram name="Android.WebView.PrimaryCpuAbiBitness"
    enum="PrimaryCpuAbiBitness" expires_after="2026-11-30">
  <owner>tasak@google.com</owner>
  <owner>lizeb@chromium.org</owner>
  <owner>ziadyoussef@chromium.org</owner>
  <summary>
    Primary bitness of the bundle. This may be different from bitness of
    Browser. On WebView, Browser always follows bitness of the app, whereas
    Renderer follows bitness of the bundle (provided that such bitness is
    supported, so look at it in combination with CpuAbiBitnessSupport).

    This is recorded every time a metrics log is created.

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

<histogram name="Android.WebView.Profile.Prefetch.ApiCallResult"
    enum="AwPrefetchApiCallResult" expires_after="2026-12-31">
  <owner>taiyo@chromium.org</owner>
  <owner>wbjacksonjr@chromium.org</owner>
  <owner>webview-team@google.com</owner>
  <summary>
    Records the result of prefetch API calls, distinguishing between UI thread
    and worker thread calls, and success/failure states.

    Recorded when a prefetch request is initiated (or fails validation).
  </summary>
</histogram>

<histogram name="Android.WebView.Profile.Prefetch.QueuedPrefetchExecutionDelay"
    units="ms" expires_after="2027-05-21">
  <owner>wbjacksonjr@chromium.org</owner>
  <owner>webview-team@google.com</owner>
  <summary>
    The delay between when an application starts a prefetch request on a
    background and when that prefetch actually executes on the UI thread.

    This is recorded every time WebView sends a prefetch request to the prefetch
    infrastructure inside of //content, it is not recorded for prefetches that
    are deemed as duplicate (or error out) and thus never reach //content.
  </summary>
</histogram>

<histogram name="Android.WebView.ProfileWasCreatedByAsyncStartup"
    enum="Boolean" expires_after="2026-09-14">
  <owner>elabadysayed@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    A profile can be created from several code paths, including the
    AsyncStartupWebView API. This histogram specifically records when
    ProfileStore.getOrCreateProfile() is triggered by that startup path.
  </summary>
</histogram>

<histogram name="Android.WebView.RendererKeepAlive.Event"
    enum="WebViewRendererKeepAliveEvent" expires_after="2027-01-11">
  <owner>ziadyoussef@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the fate of a renderer process that was kept alive pending reuse.
    Recorded when a renderer enters the pending reuse state, when it is reused
    by a new WebView, or when the keep-alive timer expires. This metric is only
    recorded if the WebViewRendererKeepAlive feature is enabled.
  </summary>
</histogram>

<histogram name="Android.WebView.RendererKeepAlive.TimeToReuse" units="ms"
    expires_after="2027-01-11">
  <owner>ziadyoussef@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the time elapsed from when a renderer process entered the pending
    reuse state until it was reused by a new WebView. Only recorded if the
    process was reused before the keep-alive timer expired. This metric is only
    recorded if the WebViewRendererKeepAlive feature is enabled.
  </summary>
</histogram>

<histogram
    name="Android.WebView.RestrictedContentBlocking.ApiCallMatchesDiskCache"
    enum="BooleanMatched" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether the SafeBrowsingClient.getSupportedThreatTypes API call
    returns a result which matches our disk cache. This does not record the
    actual value of that call: a log of &quot;true&quot; means that the return
    value matches the disk cache and a log of &quot;false&quot; means that the
    disk cache didn't match.

    This histogram is recorded when the task completes successfully.

    Note: Prior to M151, timeouts and errors were recorded as a consent value of
    false.
  </summary>
</histogram>

<histogram
    name="Android.WebView.RestrictedContentBlocking.GetSupportedThreatTypes.CallDuration"
    units="ms" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the duration of the call to
    SafeBrowsingClient.getSupportedThreatTypes during the flow to determine if
    restricted content blocking should be enabled.

    This histogram is recorded when the task completes, which can be on either
    success, failure, or timeout.
  </summary>
</histogram>

<histogram
    name="Android.WebView.RestrictedContentBlocking.GetSupportedThreatTypes.Result"
    enum="AndroidWebViewGmsApiCallResult" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the result of the call to SafeBrowsingClient.getSupportedThreatTypes
    during the flow to determine if restricted content blocking should be
    enabled. It will log success/failure/timeout.

    This histogram is recorded when the task completes, which can be on either
    success, failure, or timeout.
  </summary>
</histogram>

<histogram name="Android.WebView.SafeMode.ActionName"
    enum="AndroidWebViewSafeModeActionName" expires_after="never">
<!-- expires-never: Needed for tracking SafeMode during an incident. -->

  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records which SafeModeAction was executed. This is recorded once during
    WebView startup and only if SafeMode is enabled (see
    &quot;Android.WebView.SafeMode.SafeModeEnabled&quot;).
  </summary>
</histogram>

<histogram name="Android.WebView.SafeMode.ExecutionResult"
    enum="AndroidWebViewSafeModeResult" expires_after="never">
<!-- expires-never: Needed for tracking SafeMode during an incident. -->

  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether SafeMode was able to execute all the specified SafeMode
    actions or if it encountered an error. This is recorded once during WebView
    startup and only if SafeMode is enabled (see
    &quot;Android.WebView.SafeMode.SafeModeEnabled&quot;). If multiple fixes
    have different statuses, then this will log a single status in the following
    precedence: a. Unknown error b. Action failed c. Unrecognized action d.
    Success (If all actions were successful).
  </summary>
</histogram>

<histogram name="Android.WebView.SafeMode.QueryAndExecuteBlockingTime"
    units="ms" expires_after="never">
<!-- expires-never: Needed for tracking SafeMode during an incident. -->

  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the time spent blocking WebView startup to both retrieve the list of
    SafeMode actions from the SafeModeService and to execute those actions. This
    is recorded once during startup only if SafeMode is enabled (see
    &quot;Android.WebView.SafeMode.SafeModeEnabled&quot;). This can be
    interpreted as the additional startup cost caused by enabling SafeMode.
  </summary>
</histogram>

<histogram name="Android.WebView.SafeMode.ReceivedFix" enum="BooleanEnabled"
    expires_after="never">
<!-- expires-never: Needed for tracking SafeMode during an incident. -->

  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether or not the WebView nonembedded service receives a SafeMode
    fix configuration. This is recorded once for each SafeMode config the
    WebView receives. This only ever logs true since WebView won't need to log
    anything when safemode is not activated. This is only relevant for the app
    recovery activation pathway.
  </summary>
</histogram>

<histogram name="Android.WebView.SafeMode.SafeModeEnabled"
    enum="BooleanEnabled" expires_after="never">
<!-- expires-never: Needed for tracking SafeMode during an incident. -->

  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether or not WebView is starting up in SafeMode. This is a mode
    where WebView takes extra steps during startup to reduce the risk of
    starting in a bad state. This is recorded once during WebView startup,
    regardless of whether SafeMode is enabled.
  </summary>
</histogram>

<histogram name="Android.WebView.SaveState.ExtraHeadersAttached" enum="Boolean"
    expires_after="2027-03-01">
  <owner>jdeabreu@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Recorded whenever an embedder calls WebView#saveState, for each navigation
    entry saved, records whether any headers are associated with the entry. This
    is logged even if the feature to save the headers to saveState is disabled.
    This data will be used to check that no headers are currently being passed
    through via AwContents#loadUrl or any other flow and that headers are being
    passed through once the new AwContents#navigate method is being used.
  </summary>
</histogram>

<histogram name="Android.WebView.SaveState.Size" units="KB"
    expires_after="2026-12-11">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Recorded whenever an embedder calls WebView#saveState, it records the size
    of that state in KB. The size isn't expected to exceed 1MB, as that is the
    limit for Android saveInstanceState.
  </summary>
</histogram>

<histogram name="Android.WebView.SecureCookieAction" enum="SecureCookieAction"
    expires_after="2027-01-31">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the action WebView took (if any) to &quot;fix up&quot; secure
    cookies for backwards compatibility.
  </summary>
</histogram>

<histogram name="Android.WebView.SendBrowsingIntent"
    enum="WebViewSendIntentState" expires_after="2027-04-01">
  <owner>pbirk@google.com</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether WebView handled a navigation by sending a browsing intent or
    not. The default behavior is to send a browsing intent for navigations and
    redirects, but this behavior is disabled if the application provides a
    WebViewClient of any kind.

    The aim of this histogram is to determine if any applications use the
    default behavior.

    This histogram is emitted when WebViewClient.shouldOverrideUrlLoading is
    called.
  </summary>
</histogram>

<histogram name="Android.WebView.SetAcceptThirdPartyCookies"
    enum="BooleanAccepted" expires_after="2027-04-01">
  <owner>jdeabreu@chromium.org</owner>
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether third party cookies are being accepted following every
    Android API call, initiated by the hosting Android app, to
    CookieManager.setAcceptThirdPartyCookies().
  </summary>
</histogram>

<histogram name="Android.WebView.SetLayoutAlgorithm"
    enum="WebViewLayoutAlgorithm" expires_after="2027-12-01">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the layout algorithm requested in each call to
    WebSettings.setLayoutAlgorithm().
  </summary>
</histogram>

<histogram
    name="Android.WebView.ShouldInterceptRequest.DidIncludeMultiCookieHeader"
    enum="BooleanIncluded" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Logs whether the application used the option to provide multiple Set-Cookie
    headers through WebResourceResponseCompat.

    The histogram aims to track adoption of the new API to provide response
    cookies through shouldInterceptRequest.

    Logged when the application responds to shouldInterceptRequest calls for
    either the WebView or service workers with a non-null response.
  </summary>
</histogram>

<histogram name="Android.WebView.ShouldInterceptRequest.DidOverride"
    enum="WebViewShouldInterceptRequestOverridden" expires_after="2026-06-01">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Whether a WebViewClient passed into setWebViewClient has overridden the
    shouldInterceptRequest method. Recorded when setWebViewClient is called.
  </summary>
</histogram>

<histogram
    name="Android.WebView.ShouldInterceptRequest.GetCookieHeader.PostMojo.TimeToRun"
    units="ms" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the total time spent processing work to provide cookie headers to
    apps. This is recorded when WebViewInterceptedCookieHeader is enabled and
    after the mojo call returns with the cookie jar contents. This is recorded
    on all devices.
  </summary>
</histogram>

<histogram name="Android.WebView.ShouldInterceptRequest.InterceptDuration"
    units="ms" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Measures the total time for shouldInterceptRequest in WebView, from the time
    the invocation is posted to the worker thread pool, until the response is
    posted back to the IO thread.
  </summary>
</histogram>

<histogram name="Android.WebView.ShouldInterceptRequest.IsRequestIntercepted"
    enum="Boolean" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Whether the network request was intercepted by the embedder of Android
    WebView. Intercepted requests are requests for which the
    shouldInterceptRequest() callback returned a non-null response. This is
    logged each time the shouldInterceptRequest() callback API is invoked by
    WebView.

    Not all requests will result in the callback being invoked, and thus the
    histogram will not be emitted in these cases. Some non-exhaustive edge cases
    include post-redirect requests not invoking the callback, and callbacks
    being triggered by non-network requests, such as data URIs.

    This histogram was added in M116. Prior milestones logged
    &quot;Android.WebView.ShouldInterceptRequest.InterceptionType2&quot;,
    however that histogram further broke down the &quot;intercepted ==
    true&quot; case by which URL scheme was used for the URL.

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

<histogram name="Android.WebView.ShouldInterceptRequest.IsRequestSkipped"
    enum="Boolean" expires_after="2026-06-01">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Whether WebView skipped running shouldInterceptRequest because the embedder
    hadn't overridden it (and hadn't provided the async version either).

    This is logged in the shouldInterceptRequest flow before jumping onto the
    background thread.
  </summary>
</histogram>

<histogram
    name="Android.WebView.ShouldInterceptRequest.SetCookieHeader.TimeToRun"
    units="ms" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the total time spent processing work to update the cookie jar. This
    is recorded when WebViewInterceptedCookieHeader is enabled and a set-cookie
    header is provided by a site embedded in the app. This is recorded on all
    devices.
  </summary>
</histogram>

<histogram name="Android.WebView.SingleOrMultiProcess"
    enum="AndroidWebViewSingleOrMultiProcess" expires_after="never">
  <owner>alexmitra@chromium.org</owner>
  <owner>nator@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether WebView is being run in a single process or multi-process.
    This is recorded each time logs are uploaded. This is used as a dashboard
    filter.
  </summary>
</histogram>

<histogram name="Android.WebView.SitesVisitedWeekly" units="sites"
    expires_after="2026-08-28">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Measures the count of distinct sites visited per week in WebView. This is
    recorded at the time of a navigation when stored hashed site navigations are
    older than a week. The purpose of this metric is to slice it by package name
    to help characterize the usage of that package. This histogram uses eTLD+1
    as the definition of a site.
  </summary>
</histogram>

<histogram name="Android.WebView.Startup.CachedFlagInitTime" units="ms"
    expires_after="2026-10-29">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Measures the time taken to initialize shared preferences and cached flags in
    WebViewChromiumFactoryProvider.initialize().

    Only measured in Android WebView.
  </summary>
</histogram>

<histogram name="Android.WebView.Startup.CheckNeedsPost.CalledOnUiThread"
    enum="Boolean" expires_after="2027-05-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Reports whether or not `checkNeedsPost`
    (https://source.chromium.org/chromium/chromium/src/+/main:android_webview/glue/java/src/com/android/webview/chromium/SharedWebViewChromium.java;l=208;drc=6712edb4e0491c96b69c7346ac278e5c093b6584)
    is called on the Chromium UI thread.

    Conditions for recording this metric: Chromium is initialized and AwContents
    is not null.

    `checkNeedsPost` is called by various WebView APIs.

    Only recorded on Android WebView.
  </summary>
</histogram>

<histogram name="Android.WebView.Startup.CheckNeedsPost.IsChromiumInitialized"
    enum="Boolean" expires_after="2027-05-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Reports whether or not `checkNeedsPost`
    (https://source.chromium.org/chromium/chromium/src/+/main:android_webview/glue/java/src/com/android/webview/chromium/SharedWebViewChromium.java;l=208;drc=6712edb4e0491c96b69c7346ac278e5c093b6584)
    is called before Chromium is initialized or not.

    `checkNeedsPost` is called by various WebView APIs.

    Only recorded on Android WebView.
  </summary>
</histogram>

<histogram
    name="Android.WebView.Startup.ChromiumInitTime.LongestUiBlockingTaskTime{StartupMode}"
    units="ms" expires_after="2027-01-10">
  <owner>colibie@google.com</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    For synchronous WebView initialization, this value measures the entire
    duration of running StartupTasksRunner's tasks together without yielding the
    UI thread, and will equal the
    &quot;Android.WebView.Startup.CreationTime.StartChromiumLocked&quot;
    histogram. For asynchronous initialization, it measures the longest task run
    by StartupTasksRunner.

    This histogram is recorded in the last step of chromium init and so, is not
    recorded when init does not complete for any reason or if init had been
    completed in previous runs.
  </summary>
  <token key="StartupMode" variants="WebViewChromiumStartupMode"/>
</histogram>

<histogram name="Android.WebView.Startup.ChromiumInitTime.StartupMode"
    enum="WebViewChromiumStartupMode" expires_after="2027-01-10">
  <owner>colibie@google.com</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the completion sequence of the WebView's Chromium initialization,
    indicating whether startup was fully synchronous, fully asynchronous, or a
    hybrid approach.

    This metric is only recorded upon successful completion of the
    initialization process.
  </summary>
</histogram>

<histogram
    name="Android.WebView.Startup.ChromiumInitTime.WallClockTime{StartupMode}"
    units="ms" expires_after="2026-06-30">
  <owner>colibie@google.com</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The wall clock time it takes to start up Chromium. This is different from
    (&quot;Android.WebView.Startup.CreationTime.StartChromiumLocked&quot;)
    because for async startup, it includes the time spent in-between startup
    tasks.
  </summary>
  <token key="StartupMode" variants="WebViewChromiumStartupMode"/>
</histogram>

<histogram name="Android.WebView.Startup.CreationTime.AssetsAddTime" units="ms"
    expires_after="2027-05-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The total time to add WebView assets to AssetManager. Reported on S+.

    This task is performed and measured in the framework.

    This time is included in
    `Android.WebView.Startup.CreationTime.TotalFactoryInitTime`.
  </summary>
</histogram>

<histogram name="Android.WebView.Startup.CreationTime.CreateContextTime"
    units="ms" expires_after="2027-05-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The total time to create the WebView APK context. Reported on S+.

    This task is performed and measured in the framework.

    This time is included in
    `Android.WebView.Startup.CreationTime.TotalFactoryInitTime`.
  </summary>
</histogram>

<histogram
    name="Android.WebView.Startup.CreationTime.FirstInstanceAfterGlobalStartup"
    units="ms" expires_after="2027-02-14">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    How long it takes to initialize the first WebViewChromium instance in the
    case where we have already finished the process-global browser startup:
    (&quot;Android.WebView.Startup.CreationTime.StartChromiumLocked&quot;) was
    already complete and did not need to be performed during the instance
    initialization.

    This is recorded separately as it is significantly faster than the
    &quot;FirstInstanceWithGlobalStartup&quot; case, but slower than the
    &quot;NotFirstInstance&quot; case.
  </summary>
</histogram>

<histogram
    name="Android.WebView.Startup.CreationTime.FirstInstanceWithGlobalStartup"
    units="ms" expires_after="2027-01-10">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    How long it takes to initialize the first WebViewChromium instance in the
    case where we had to also do the process-global browser startup:
    (&quot;Android.WebView.Startup.CreationTime.StartChromiumLocked&quot;) had
    not yet run and was performed during the instance initialization.

    This is recorded separately as it is significantly slower than the
    &quot;FirstInstanceAfterGlobalStartup&quot; and &quot;NotFirstInstance&quot;
    cases.
  </summary>
</histogram>

<histogram name="Android.WebView.Startup.CreationTime.GetClassLoaderTime"
    units="ms" expires_after="2025-12-31">
  <owner>abhijithnair@chromium.org</owner>
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The total time to create the WebView ClassLoader. Reported on S+.

    This task is performed and measured in the framework.

    This time is included in
    `Android.WebView.Startup.CreationTime.TotalFactoryInitTime`.
  </summary>
</histogram>

<histogram
    name="Android.WebView.Startup.CreationTime.GetProviderClassForNameTime"
    units="ms" expires_after="2027-05-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The total time taken by `getWebViewProviderClass` method
    (https://cs.android.com/android/platform/superproject/main/+/main:frameworks/base/core/java/android/webkit/WebViewFactory.java;l=270;drc=61197364367c9e404c7da6900658f1b16c42d0da)
    in the framework. Reported on S+.

    This task is performed and measured in the framework.

    This time is included in
    `Android.WebView.Startup.CreationTime.TotalFactoryInitTime`.
  </summary>
</histogram>

<histogram name="Android.WebView.Startup.CreationTime.InitReason2"
    enum="WebViewStartupCallSite" expires_after="2026-10-02">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the reason for initialization (startChromium call), such as creating
    a WebView instance, calling a static method through getStatics() or other
    static methods.

    The older version of this histogram
    (Android.WebView.Startup.CreationTime.InitReason) used a less granular
    callsite enum. If any WebView instance methods or static method was the
    callsite, we couldn't know which exact method it was since it was grouped
    together as the same callsite. This issue is fixed in this histogram.

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

<histogram name="Android.WebView.Startup.CreationTime.NativeLoadTime"
    units="ms" expires_after="2027-05-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The total time to load the WebView native library for the first time.
    Reported on S+. This also includes the time taken for processing relocations
    using the relro sharing mechanism.

    This task is performed and measured in the framework.

    This time is included in
    `Android.WebView.Startup.CreationTime.TotalFactoryInitTime`.
  </summary>
</histogram>

<histogram name="Android.WebView.Startup.CreationTime.NotFirstInstance"
    units="ms" expires_after="2026-12-13">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    How long it takes to initialize a subsequent WebViewChromium instance. This
    will be recorded once for each instance created, other than the first to be
    created in the current process.

    This is recorded separately as it is significantly faster than the
    &quot;FirstInstanceWithGlobalStartup&quot; and
    &quot;FirstInstanceAfterGlobalStartup&quot; cases.
  </summary>
</histogram>

<histogram name="Android.WebView.Startup.CreationTime.Stage1.FactoryInit"
    units="ms" expires_after="2027-01-10">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    How long it takes to run WebViewChromiumFactoryProvider.initialize(). This
    does not count the time spent beforehand in WebViewFactory in the Android
    framework, which first has to load the WebView code and do some basic setup
    before initialize() can be called.

    This will be recorded once per host process since the initialization is
    process-global.

    The &quot;Android.WebView.Startup.CreationTime.TotalFactoryInitTime&quot;
    histogram measures the entire duration from when
    WebViewFactory.getProvider() is first called until the
    WebViewChromiumFactoryProvider is fully initialized and should be preferred
    for most purposes, but is only recorded on Android S+ devices, so this older
    metric is retained for now to allow &quot;fair&quot; comparisons with
    Android R and earlier.
  </summary>
</histogram>

<histogram
    name="Android.WebView.Startup.CreationTime.StartChromiumLocked{StartupMode}"
    units="ms" expires_after="never">
<!-- expires-never: Guardrail metric for WebView startup performance. -->

  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    For synchronous WebView initialization, this value measures the entire
    duration of running StartupTasksRunner's tasks together without yielding the
    UI thread, and will equal the
    &quot;Android.WebView.Startup.ChromiumInitTime.LongestUiBlockingTaskTime&quot;
    histogram.

    For asynchronous initialization, it measures the cumulative duration of each
    task run by the StartupTasksRunner on the UI thread. This reflects the total
    time StartupTasksRunner's tasks block the UI thread. It does not measure the
    wall clock time from the start of the first task to the end of the last
    task.

    This histogram is recorded in the last step of chromium init and so, is not
    recorded when init does not complete for any reason or if init had been
    completed in previous runs.

    This histogram is of special interest, do not change its semantics or retire
    it without talking to the owners first.
  </summary>
  <token key="StartupMode" variants="WebViewChromiumStartupMode"/>
</histogram>

<histogram name="Android.WebView.Startup.CreationTime.TotalFactoryInitTime"
    units="ms" expires_after="2027-01-10">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The total time to initialize WebViewChromiumFactoryProvider. Reported on S+.

    This measurement is different from Stage1.FactoryInit as it takes into
    account time spent in framework. Does not overlap with
    Android.WebView.Startup.CreationTime.Stage2.* measurements.
  </summary>
</histogram>

<histogram
    name="Android.WebView.Startup.CreationTime.TotalFactoryInitTime.MainLooper"
    units="ms" expires_after="2027-05-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The total time to initialize WebViewChromiumFactoryProvider if the
    initialization is done on the main looper. Reported on S+.

    This measurement is different from Stage1.FactoryInit as it takes into
    account time spent in framework. Does not overlap with
    Android.WebView.Startup.CreationTime.Stage2.* measurements.
  </summary>
</histogram>

<histogram
    name="Android.WebView.Startup.CreationTime.TotalFactoryInitTime.NotMainLooper"
    units="ms" expires_after="2027-05-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    The total time to initialize WebViewChromiumFactoryProvider if
    initialization is not on the main looper. Reported on S+.

    This measurement is different from Stage1.FactoryInit as it takes into
    account time spent in framework. Does not overlap with
    Android.WebView.Startup.CreationTime.Stage2.* measurements.
  </summary>
</histogram>

<histogram name="Android.WebView.Startup.CreationTime.waitForUIThreadInit"
    units="ms" expires_after="2025-12-31">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records how long it took to wait for the UI thread before running
    startChromium. Only recorded if startChromium was posted as a task.

    Recorded in M125+.
  </summary>
</histogram>

<histogram name="Android.WebView.Startup.IsUiThreadMainLooper" enum="Boolean"
    expires_after="2027-05-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Reports whether or not the Chromium UI thread is the Android main looper.
    Recorded once during WebView process global startup.

    Only recorded on Android WebView.
  </summary>
</histogram>

<histogram name="Android.WebView.Startup.LockRetryResult"
    enum="LockRetryResult" expires_after="2026-06-01">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Recorded after successfully acquiring the WebView data dir lock based on the
    number of retry attempts and whether we saw an OverlappingFileLockException.

    This is not recorded when we run out of retries and fail to acquire the lock
    because this case throws an exception - we don't complete startup and so
    would never actually store and upload the metric value.

    This does not record the exact number of retries, just a few buckets - we're
    primarily interested in whether OverlappingFileLockException is involved and
    whether retrying provides any value at all.
  </summary>
</histogram>

<histogram
    name="Android.WebView.Startup.NonblockingServiceConnectionDelay.{ServiceName}"
    units="ms" expires_after="2026-07-28">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the delay between calling Context#bindService until the
    ServiceConnection#onServiceConnected is called. This should give an idea of
    how long it takes for nonembedded service connections to be established and
    capture any regressions in this. In the case when a service connection is
    dropped and then reconnected by the system, the histogram is only recorded
    for the first connection. Warning: this histogram was expired from
    2023-09-01 to 2025-07-29; data may be missing.
  </summary>
  <token key="ServiceName">
    <variant name="MetricsBridgeService"/>
    <variant name="VariationsSeedServer"/>
  </token>
</histogram>

<histogram
    name="Android.WebView.Startup.{Operation}BlockedByNetworkContextInit"
    enum="Boolean" expires_after="2027-02-01">
  <owner>elabadysayed@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether a {Operation} operation in WebView was blocked waiting for
    synchronous NetworkContext initialization.

    Only measured in Android WebView.
  </summary>
  <token key="Operation">
    <variant name="Navigation" summary="navigation URLLoaderFactory creation"/>
    <variant name="Other" summary="non-navigation URLLoaderFactory creation"/>
    <variant name="Preconnect" summary="Profile#preconnect call"/>
    <variant name="Prefetch" summary="prefetch request"/>
  </token>
</histogram>

<histogram
    name="Android.WebView.Startup.{Operation}BlockedByNetworkContextInit.Duration"
    units="ms" expires_after="2027-02-01">
  <owner>elabadysayed@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the duration that a {Operation} operation in WebView was blocked
    waiting for synchronous NetworkContext initialization. Recorded only when
    blocked.

    Only measured in Android WebView.
  </summary>
  <token key="Operation">
    <variant name="Navigation" summary="navigation URLLoaderFactory creation"/>
    <variant name="Other" summary="non-navigation URLLoaderFactory creation"/>
    <variant name="Preconnect" summary="Profile#preconnect call"/>
    <variant name="Prefetch" summary="prefetch request"/>
  </token>
</histogram>

<histogram
    name="Android.WebView.Static.GetDefaultUserAgentCalledOnUiThreadIfChromiumNotStarted"
    enum="Boolean" expires_after="2027-05-01">
  <owner>abhijithnair@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether getDefaultUserAgent was called on the UI thread or not.
    Emitted only if browser startup has not been started during the time of the
    call.

    This is only logged in Android WebView.
  </summary>
</histogram>

<histogram name="Android.WebView.SupervisedUser.UrlCheckResult"
    enum="AndroidWebViewSupervisedUserUrlCheckResult"
    expires_after="2027-05-01">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether a given URL is allowed to be loaded by the current device
    user. This is based on a call to GMS Core, which checks if the url is
    allowed. This is recorded during each URL load, however only for the
    resource types which undergo this type of URL check. Note: This histogram
    was expired between 2025-08-01 and 2025-12-02, data may be missing.
  </summary>
</histogram>

<histogram name="Android.WebView.SupervisedUser.UrlCheckTime" units="ms"
    expires_after="2027-05-01">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the time taken to return from the call to GMS Core that checks if a
    given URL is allowed to be loaded by the current device user. This is
    recorded during each URL load, however only for the resource types which
    undergo this type of URL check. Note: This histogram was expired between
    2025-08-01 and 2025-12-02, data may be missing.
  </summary>
</histogram>

<histogram name="Android.WebView.SupervisedUser.UrlCheckTime.FirstRequest"
    units="ms" expires_after="2027-05-01">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the time taken to return from the call to GMS Core that checks if a
    given URL is allowed to be loaded by the current device user. This metric is
    only recorded on the first call to GMS Core. This is recorded only for the
    first URL load, and only for the resource types which undergo this type of
    URL check. Note: This histogram was expired between 2025-08-01 and
    2025-12-02, data may be missing.
  </summary>
</histogram>

<histogram name="Android.WebView.SupervisedUser.UrlCheckTime.SubsequentRequest"
    units="ms" expires_after="2027-05-01">
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <improvement direction="LOWER_IS_BETTER"/>
  <summary>
    Records the time taken to return from the call to GMS Core that checks if a
    given URL is allowed to be loaded by the current device user. This metric is
    not recorded on the first call, only on subsequent ones. This is recorded
    during each URL load after the initial load, however only for the resource
    types which undergo this type of URL check. Note: This histogram was expired
    between 2025-08-01 and 2025-12-02, data may be missing.
  </summary>
</histogram>

<histogram name="Android.WebView.SupportLibrary.ClientIsCompat"
    enum="WebViewClientTypeEnum" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether the WebViewClient provided by the app is an instance of
    WebViewClientCompat (and therefore exposes AndroidX callbacks). This is
    recorded each time the app sets a new WebViewClient via
    WebView#setWebViewClient().
  </summary>
</histogram>

<histogram name="Android.WebView.TargetSdkVersion" enum="AndroidApiLevel"
    expires_after="never">
<!-- expires-never: we have an ongoing need to monitor targetSdkVersion because it helps with planning support for new features. -->

  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    The version of the target SDK of the app WebView is running in. This is
    recorded once during startup.
  </summary>
</histogram>

<histogram name="Android.WebView.TracingInit.BackgroundInitMainThreadWaitTime"
    units="ms" expires_after="2027-04-01">
  <owner>pbirk@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Time spent on the main thread waiting for background tracing init to finish.

    This histogram is emitted a the point where WebView determines if tracing
    should start on the main browser thread, since that is the point where the
    startup code assumes that tracing is initialized. The histogram is only
    emitted if tracing was initialized on a bachground thread, and it measures
    the time spent waiting on the main thread for this initialization to finish.

    Any values higher than 0 indicate that tracing did not manage to initialize
    fully on the background thread before the main thread reached the point
    where tracing is required.

    The purpose of this histogram is to determine if background initialization
    of tracing provides an overall benefit to WebView Startup Time.
  </summary>
</histogram>

<histogram
    name="Android.WebView.UniversalAccess.OriginUrlMismatchInRenderFrame"
    enum="BooleanAllowed" expires_after="2023-12-10">
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records when we allow a cross origin push state from a file URL solely
    because AllowUniversalAccessFromFileURLs is enabled. This is logged from the
    implementation of the frame renderer. This metric was expired between June
    4-23, 2023 and may be missing data.
  </summary>
</histogram>

<histogram name="Android.WebView.UsedInPopupWindow"
    enum="WebViewUsedInPopupWindow" expires_after="2026-09-01">
  <owner>peconn@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Recorded when a WebView is attached to the window. Records whether the
    window the WebView is attached to is a PopupWindow.
  </summary>
</histogram>

<histogram name="Android.WebView.UserAgentClientHintsMetadata.AvailableType"
    enum="UserAgentMetadataAvailableType" expires_after="2027-05-01">
  <owner>victortan@chromium.org</owner>
  <owner>torne@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records when we propagate user-agent client hints metadata in different
    cases. This give us an idea to understand better how the user-agent metadata
    overrides and user-agent overrides work. This is recorded every time webview
    updates the user-agent or user-agent medatadata for the request.
  </summary>
</histogram>

<histogram name="Android.WebView.Visibility.Global" enum="WebViewVisibility"
    expires_after="2026-08-28">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the global visibility state of WebView in seconds, updated with
    every Metrics upload. The Visible bucket counts total seconds that any
    WebView was visible (the view itself was visible, and was attached to the
    view hierarchy of a visible window). The NotVisible bucket counts time since
    WebView initialization for which no WebView was considered visible, or no
    WebView existed. The total of these two buckets reflects the amount of time
    covered by metrics collection.
  </summary>
</histogram>

<histogram name="Android.WebView.Visibility.PerWebView"
    enum="WebViewVisibility" expires_after="2026-08-28">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records per-WebView visibility duration in seconds, updated with every
    Metrics upload. The Visible bucket counts the total time in seconds that
    each WebView was considered visible (the view itself was visible, and was
    attached to the view hierarchy of a visible window). If more than one
    WebView is considered visible, then each WebView contributes independently.
    The NotVisible bucket counts the duration that each WebView exists but not
    in a visible state. As with the Visible bucket, each WebView contributes
    independently, and thus this bucket is not incremented when no WebViews
    exist.
  </summary>
</histogram>

<histogram name="Android.WebView.VisibleScheme.Global" enum="WebViewUrlScheme"
    expires_after="2026-08-28">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the number of seconds any WebView was visible (the view itself was
    visible, and was attached to the view hierarchy of a visible window) with a
    particular URL scheme in the primary main frame. Updated with every Metrics
    upload. Note that the seconds are logged as the count for the scheme enum
    values.
  </summary>
</histogram>

<histogram name="Android.WebView.VisibleScheme.PerWebView"
    enum="WebViewUrlScheme" expires_after="2026-08-28">
  <owner>mvanouwerkerk@chromium.org</owner>
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the number of seconds each WebView was visible (the view itself was
    visible, and was attached to the view hierarchy of a visible window) with a
    particular URL scheme in the primary main frame. Updated with every Metrics
    upload. Note that the seconds are logged as the count for the scheme enum
    values.
  </summary>
</histogram>

<histogram name="Android.WebView.VisibleScreenCoverage.Global" units="%"
    expires_after="2026-08-28">
  <owner>mvanouwerkerk@google.com</owner>
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the number of seconds any WebView was visible (the view itself was
    visible, and was attached to the view hierarchy of a visible window) by
    screen coverage percentage. The screen coverage of all WebViews is merged so
    overlaps do not count more than once and do not increase the percentage.
    Updated with every Metrics upload. Not recorded when there is no visible
    WebView. Fractional percentages are rounded down. Note that the seconds are
    logged as the count for the percentages.
  </summary>
</histogram>

<histogram name="Android.WebView.VisibleScreenCoverage.PerWebView" units="%"
    expires_after="2026-08-28">
  <owner>mvanouwerkerk@google.com</owner>
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the number of seconds each WebView was visible (the view itself was
    visible, and was attached to the view hierarchy of a visible window) by
    screen coverage percentage. The screen coverage of these WebViews is not
    merged. Updated with every Metrics upload. Not recorded when there is no
    visible WebView. Fractional percentages are rounded down. Note that the
    seconds are logged as the count for the percentages.
  </summary>
</histogram>

<histogram name="Android.WebView.VisibleScreenCoverage.PerWebView.{Scheme}"
    units="%" expires_after="2026-08-28">
  <owner>mvanouwerkerk@google.com</owner>
  <owner>ntfschr@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records the number of seconds each WebView was visible (the view itself was
    visible, and was attached to the view hierarchy of a visible window) with a
    {Scheme} scheme in the primary main frame by screen coverage percentage. The
    screen coverage of these WebViews is not merged. Updated with every Metrics
    upload. Not recorded when there is no visible WebView. Fractional
    percentages are rounded down. Note that the seconds are logged as the count
    for the percentages.
  </summary>
  <token key="Scheme">
    <variant name="about"/>
    <variant name="blob"/>
    <variant name="chrome"/>
    <variant name="content"/>
    <variant name="data"/>
    <variant name="empty"/>
    <variant name="file"/>
    <variant name="ftp"/>
    <variant name="http"/>
    <variant name="https"/>
    <variant name="intent"/>
    <variant name="javascript"/>
    <variant name="unknown"/>
  </token>
</histogram>

<histogram name="Android.WebView.WarmUpSpareRenderer.Duration" units="ms"
    expires_after="2027-04-12">
  <owner>ziadyoussef@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Reports the sync blocking time for the warm up renderer process API call.
    Recorded once per call to the warm up renderer process API.
  </summary>
</histogram>

<histogram name="Android.WebView.WarmUpSpareRenderer.StartsNewRenderer"
    enum="Boolean" expires_after="2027-04-12">
  <owner>ziadyoussef@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Reports whether or not the warm up renderer process API call starts a new
    process. Recorded once per call to the warm up renderer process API.
  </summary>
</histogram>

<histogram name="Android.WebView.Webauthn.BrowserModePermissionGranted"
    enum="Boolean" expires_after="2027-05-28">
  <owner>ntfschr@google.com</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Records whether the app calling setWebAuthenticationSupport with BROWSER
    mode has the CREDENTIAL_MANAGER_SET_ORIGIN permission. This permission has
    always been required for browser mode; however, if it is missing, the app
    will only crash later at the time of performing WebAuthn operations. This is
    recorded once per API call to setWebAuthenticationSupport, but only if the
    app is requesting BROWSER mode. This will help evaluate if we can safely
    throw a SecurityException earlier to indicate when apps are missing this
    permission.
  </summary>
</histogram>

<histogram name="Android.WebView.WebContent.AdoptResult"
    enum="WebContentAdoptResult" expires_after="2027-09-01">
  <owner>bewise@chromium.org</owner>
  <owner>src/android_webview/OWNERS</owner>
  <summary>
    Recorded every time AwContents.adopt() is called to transfer WebView state
    to a new WebView instance. Adopt is triggered by app developers using the
    WebContent API. Captures successful adoptions as well as precondition check
    failures (e.g. view attachment races or destroyed instances).
  </summary>
</histogram>

<histogram name="Android.Window.OcclusionExperimental.Duration" units="ms"
    expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the duration a window was occluded. Recorded when a window is
    unoccluded or destroyed.
  </summary>
</histogram>

<histogram
    name="Android.Window.OcclusionExperimental.MaxOfMinVisibleRectsDuration.{DimensionBucket}"
    units="ms" expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the duration spent in each bucket of the maximum of all the minimum
    dimensions of visible rects for a window. This value gives a rough idea of
    'how much a window is visible by'. For example, if a window has two visible
    rects on the left and top sides with dimensions of 1000x20 and 50x1000,
    respectively, then this metric value will be 50 and count towards the 31-50
    bucket.

    This metric is logged when the bucket changes for a WindowAndroid instance
    or when the window is destroyed.
  </summary>
<!-- LINT.IfChange(DimensionBucket) -->

  <token key="DimensionBucket">
    <variant name="0" summary="0 pixels"/>
    <variant name="1To10" summary="1 to 10 pixels"/>
    <variant name="11To30" summary="11 to 30 pixels"/>
    <variant name="31To50" summary="31 to 50 pixels"/>
    <variant name="51To100" summary="51 to 100 pixels"/>
    <variant name="101To200" summary="101 to 200 pixels"/>
    <variant name="201Plus" summary="201+ pixels"/>
    <variant name="FullyVisible" summary="Fully visible"/>
  </token>
<!-- LINT.ThenChange(//ui/android/java/src/org/chromium/ui/base/WindowAndroidOcclusionMetrics.java:DimensionBucket) -->

</histogram>

<histogram name="Android.Window.OcclusionExperimental.OccludedCount"
    units="count" expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the number of WindowAndroid instances that are currently occluded.
    Recorded periodically every 5 minutes.
  </summary>
</histogram>

<histogram name="Android.Window.OcclusionExperimental.OccludedTimePercent"
    units="%" expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the percentage of the window's lifetime that it spent occluded.
    Recorded when the window is destroyed.
  </summary>
</histogram>

<histogram
    name="Android.Window.OcclusionExperimental.SavedRenderingPer5Minutes"
    units="MP*s" expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the total occluded pixels over time in megapixel*seconds since the
    last emission. This metric gives an estimate of the saved rendering work due
    to occlusion optimizations. Recorded periodically every 5 minutes.
  </summary>
</histogram>

<histogram name="Android.Window.OcclusionExperimental.TotalOccludedMegapixels"
    units="MP" expires_after="2027-04-02">
  <owner>kalutes@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the sum total pixel area of all occluded windows in megapixels. If
    there are 3 separate 1000x1000 pixel windows that are occluded, the value of
    this metric would be 3. Sampled periodically every 5 minutes. No
    accumulation is performed, only the instanntaneous value at every 5 minute
    interval is reported.
  </summary>
</histogram>

<histogram name="Android.Window.TimeToAcquireWindowBounds" units="ms"
    expires_after="2026-12-27">
  <owner>chominskib@google.com</owner>
  <owner>lt-web-apps-team@google.com</owner>
  <summary>
    Records the time it takes to acquire on-screen bounds of the browser window
    by the `WindowAndroid::GetBoundsInScreenCoordinates()` method.
  </summary>
</histogram>

<histogram name="Android.Window.TimeToUpdateWindowBounds" units="ms"
    expires_after="2026-12-27">
  <owner>chominskib@google.com</owner>
  <owner>lt-web-apps-team@google.com</owner>
  <summary>
    Records the time it takes to process a window bounds change event received
    from the OS, including notifying native counterparts and sending new bounds
    to Blink in native part. Recorded only if the window bounds have actually
    changed compared to values cached in the WindowAndroid Java object.
  </summary>
</histogram>

<histogram name="Android.WindowWidth" units="dp" expires_after="2027-05-27">
  <owner>aishwaryarj@google.com</owner>
  <owner>zheliooo@google.com</owner>
  <owner>clank-large-form-factors@google.com</owner>
  <summary>
    Records the window width in density-independent pixels (dp) when a Chrome
    window is first opened or resized.
  </summary>
</histogram>

<histogram name="ChromiumAndroidLinker.RelroAvailableImmediately"
    enum="BooleanRelroAvailableImmediately" expires_after="2023-12-29">
  <owner>lizeb@chromium.org</owner>
  <owner>pasko@chromium.org</owner>
  <summary>
    Recorded when RELRO is replaced with a shared memory region, in all
    processes consuming RELRO. Indicates whether the shared RELRO was available
    synchronously right after the native library was loaded. ModernLinker only.
  </summary>
</histogram>

<histogram name="ChromiumAndroidLinker.RelroProvidedSuccessfully"
    enum="BooleanSuccess" expires_after="2026-05-17">
  <owner>lizeb@chromium.org</owner>
  <owner>pasko@chromium.org</owner>
  <summary>
    Recorded when the native library is loaded by the Chromium linker, and an
    attempt to spawn a shared RELRO region is made. Indicates whether the
    attempt was a success. If the number of samples from
    &quot;ChromiumAndroidLinker.RelroAvailableImmediately&quot; where the
    availability was not immediate is large compared to the counts of successful
    RELRO spawns, it would indicate potential startup performance improvements
    when starting child process(es) during early browser startup phases.
    ModernLinker only.
  </summary>
</histogram>

<histogram name="ChromiumAndroidLinker.RelroSharingStatus2"
    enum="RelroSharingStatus" expires_after="2027-01-17">
  <owner>lizeb@chromium.org</owner>
  <owner>pasko@chromium.org</owner>
  <summary>
    Recorded when RELRO is replaced with a shared memory region, in all
    processes consuming RELRO. Indicates whether the replacement was a success.
    ModernLinker only.

    See a description of RELRO sharing here:
    https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/android_native_libraries.md#RELRO-Sharing

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

<histogram name="ChromiumAndroidLinker.{ProcessType}LoadTime2" units="ms"
    expires_after="2022-10-01">
  <owner>pasko@chromium.org</owner>
  <owner>rsesek@chromium.org</owner>
  <summary>
    The amount of time it took to load the native libraries in {ProcessType}.

    In order to explain the nature of the uploaded samples for this histogram it
    is necessary to define a few core properties of the running processes.

    On Android 10 (=Q) a new feature was introduced and became used in Chrome:
    App Zygotes. An App Zygote (AZ) is a process pre-created by the system to
    allow faster initialization of isolated processes (IP) for a specific app.
    When AZ is created it runs the app-specific &quot;preload&quot; function
    once, and becomes idle, after that no work can be performed in the AZ other
    than getting forked. Whenever an app requests the Android Framework (AF) to
    provide an isolated process, the AF notifies the AZ to fork itself into a
    new process, which later will be provided to the app. An AZ created for one
    app (package) cannot be used for another app.

    The purpose of the AZ in Chrome is to load the native library - it avoids
    loading the same library in each isolated process separately.

    Capabilities of the AZ are very restricted. It runs in the same sandbox
    constraints as an isolated process, while also not having the ability to
    communicate with any other process on the system. Only after forking from
    the AZ the inherited process becomes able to communicate to the rest of
    Chrome.

    Beyond isolated processes, Chrome can request processes with more
    privileges: privileged processes (PP). In this case those processes will be
    forked from another zygote. There are several types of those zygotes, we
    will refer to them as Other Zygote (OZ) for simplicity. The decisions
    whether to start an isolated process through an AZ, and when to start a new
    AZ are made dynamically and depends on a few factors.

    The suffixes of this histogram, as described below, correspond to distinct
    execution scenarios:

    Suffix &quot;Browser&quot;: the native library is loaded in the main app
    process

    Suffix &quot;Zygote&quot;: OZ forks into AZ, AZ loads the native library, AZ
    forks into IP

    Suffix &quot;Child&quot;: OZ forks into PP, PP loads the native library

    Suffix &quot;Child&quot;: OZ forks into IP, IP loads the native library

    Suffix &quot;Child&quot;: OZ forks into AZ, AZ fails to load the native
    library, AZ forks into IP, IP loads the native library (this scenario should
    happen rarely).

    After library loading happens in the AZ, the recorded histogram value (for
    simplicity) gets copied to each child process forked from this AZ process
    and uploaded &quot;as if&quot; it is a unique sample from this child
    process. This leads to a discrepancy in sample counts.

    In early 2021-10 it had about 7% extra uploaded samples in
    &quot;ChromiumAndroidLinker.ZygoteLoadTime2&quot;.
  </summary>
  <token key="ProcessType">
    <variant name="Browser" summary="the browser process"/>
    <variant name="Child" summary="a child process"/>
    <variant name="Zygote" summary="the App Zygote"/>
  </token>
</histogram>

<histogram name="ChromiumAndroidLinker.{ProcessType}ThreadLoadTime" units="ms"
    expires_after="2022-10-01">
  <owner>pasko@chromium.org</owner>
  <owner>agrieve@chromium.org</owner>
  <summary>
    The amount of CPU time (thread time) it took to load the native libraries in
    {ProcessType}.

    For a more detailed description of each suffix process type suffix (Browser,
    Child, Zygote) see description of the ChromiumAndroidLinker.*LoadTime2.
  </summary>
  <token key="ProcessType">
    <variant name="Browser" summary="the browser process"/>
    <variant name="Child" summary="a child process"/>
    <variant name="Zygote" summary="the App Zygote"/>
  </token>
</histogram>

<histogram name="GestureNavigation.Activated2"
    enum="GestureNavigationDirection" expires_after="2027-02-14">
  <owner>twellington@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Overscroll gesture was made beyond a threshold big enough to regard it as a
    valid gesture navigation i.e. at least 1/3 of the arrow puck is visible.
    Similar to 'Triggered' but is used in pair with 'Cancelled' on M81 forward
    to measure cancellation rate. Implemented for Android.
  </summary>
</histogram>

<histogram name="GestureNavigation.Cancelled2"
    enum="GestureNavigationDirection" expires_after="2027-01-17">
  <owner>twellington@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Overscroll gestures that were cancelled before they were completed. Similar
    to 'Abandoned' but is used in pair with 'Activated' on M81 forward to
    measure cancellation rate. Implemented for Android.
  </summary>
</histogram>

<histogram name="GestureNavigation.Completed2"
    enum="GestureNavigationDirection" expires_after="2027-01-17">
  <owner>twellington@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Navigations that were triggered due to completed overscroll gesture.
    Implemented for Android.
  </summary>
</histogram>

<histogram name="GestureNavigation.Reversed2" enum="GestureNavigationDirection"
    expires_after="2026-12-31">
  <owner>twellington@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Overscroll gesture was made to trigger navigation, but within 3 seconds user
    used overscroll gesture to navigate back to the page. Implemented for
    Android.
  </summary>
</histogram>

<histogram name="GestureNavigation.Type2" enum="GestureNavigationType"
    expires_after="2027-01-17">
  <owner>twellington@chromium.org</owner>
  <owner>clank-app-team@google.com</owner>
  <summary>
    Gesture navigation type. It can be either Chrome's own gesture UI that
    supports back and forward navigation or OS-provided default system gesture
    navigation that supports only back action on both left and right edge. This
    is recorded on Chrome startup at the feature component initialization.
  </summary>
</histogram>

<histogram name="GridTabSwitcher.FramePerSecond.{GridTabSwitcherAnimationType}"
    units="frame/sec" expires_after="2027-04-01">
  <owner>ckitagawa@chromium.org</owner>
  <owner>meiliang@chromium.org</owner>
  <summary>
    This histogram records the frame rate of the transition animation between
    Tab and Grid Tab Switcher. {GridTabSwitcherAnimationType}
  </summary>
</histogram>

<histogram
    name="GridTabSwitcher.MaxFrameInterval.{GridTabSwitcherAnimationType}"
    units="ms" expires_after="2027-04-01">
  <owner>ckitagawa@chromium.org</owner>
  <owner>meiliang@chromium.org</owner>
  <summary>
    This histogram records the maximum interval between rendered frames during
    the transition animation between Tab and Grid Tab Switcher.
    {GridTabSwitcherAnimationType}
  </summary>
</histogram>

<histogram name="GridTabSwitcher.{GridTabSwitcherMessageType}.DisableReason"
    enum="GridTabSwitcherMessageDisableReason" expires_after="2022-10-01">
  <owner>zhiyuancai@chromium.org</owner>
  <owner>wychen@chromium.org</owner>
  <owner>ayman@chromium.org</owner>
  <summary>
    Records why the {GridTabSwitcherMessageType} is disabled in GridTabSwitcher
    and will no longer be shown to users. Recorded when the message is disabled.
    Implemented for Android.
  </summary>
</histogram>

</histograms>

</histogram-configuration>
