From f36bbcc8712c1c8fb4a0a9e4f7d85f321353108f Mon Sep 17 00:00:00 2001 From: uazo <29201891+uazo@users.noreply.github.com> Date: Wed, 1 Oct 2025 03:29:20 +0000 Subject: [PATCH] [AUTO][FILECONTROL] - version 141.0.7390.55 --- tools/under-control/src/RELEASE | 2 +- .../browser/aw_content_browser_client.cc | 9 +- .../browser/aw_field_trials.cc | 27 +- .../chrome/android/java/AndroidManifest.xml | 9 + .../CustomTabIntentDataProvider.java | 24 +- .../src/chrome/browser/about_flags.cc | 13655 ++++++++++++++++ .../chrome_browsing_data_remover_delegate.cc | 62 +- .../browser/chrome_content_browser_client.cc | 513 +- .../browser/flags/ChromeFeatureList.java | 292 +- .../src/chrome/browser/prefs/browser_prefs.cc | 143 +- .../src/chrome/browser/ui/tab_helpers.cc | 67 +- ...hrome_content_browser_client_webui_part.cc | 1 + .../extensions/api/autofill_private.idl | 3 - .../extensions/api/developer_private.idl | 1 + .../extensions/api/file_manager_private.idl | 23 +- .../extensions/api/pdf_viewer_private.idl | 3 + .../common/extensions/api/reading_list.idl | 117 - .../common/extensions/api/side_panel.idl | 44 + .../api/web_authentication_proxy.idl | 196 - .../chrome_content_renderer_client.cc | 75 +- .../policy/resources/templates/policies.yaml | 3 + .../AutoSelectCertificateForUrls.yaml | 1 + .../DeviceRollbackAllowedMilestones.yaml | 18 +- ...ensionInstallCloudPolicyChecksEnabled.yaml | 40 + .../FloatingSso/AutoSignOutEnabled.yaml | 27 + .../FloatingSso/policy_atomic_groups.yaml | 2 +- .../GenAILocalFoundationalModelSettings.yaml | 4 +- .../GenerativeAI/TabOrganizerSettings.yaml | 2 + .../KioskApplicationLogCollectionEnabled.yaml | 4 +- .../Miscellaneous/BrowserThemeColor.yaml | 1 + .../GloballyScopeHTTPAuthCacheEnabled.yaml | 3 +- .../NTPCustomBackgroundEnabled.yaml | 1 + .../Miscellaneous/NTPShortcuts.yaml | 51 + ...ionManagedClientCertificateForBrowser.yaml | 2 + ...visionManagedClientCertificateForUser.yaml | 2 + .../Signin/ProfileSeparationSettings.yaml | 2 + .../browser/web_contents/web_contents_impl.cc | 294 +- .../src/content/child/runtime_features.cc | 36 +- .../public/browser/content_browser_client.cc | 56 +- .../src/extensions/common/api/audio.idl | 167 - .../src/extensions/common/api/automation.idl | 1 + .../src/extensions/common/api/bluetooth.idl | 187 - .../common}/api/chrome_url_overrides.idl | 0 .../common/api/declarative_net_request.idl | 38 + tools/under-control/src/gin/v8_initializer.cc | 9 +- .../src/services/network/network_context.cc | 115 +- .../variations/fieldtrial_testing_config.json | 3448 ++-- .../use_counter/metrics/web_feature.mojom | 39 +- .../webpreferences/web_preferences.mojom | 3 + .../core/animation/animation_trigger.idl | 6 - .../core/animation/timeline_trigger.idl | 17 + ...tions.idl => timeline_trigger_options.idl} | 2 +- .../core/css/css_apply_mixin_rule.idl | 8 + .../core/css/css_contents_mixin_rule.idl | 7 + .../renderer/core/css/css_mixin_rule.idl | 8 + .../renderer/core/dom/common_definitions.idl | 1 - .../blink/renderer/core/dom/document.idl | 3 - .../blink/renderer/core/dom/element.idl | 3 +- .../renderer/core/dom/form_control_range.idl | 10 + .../blink/renderer/core/dom/parent_node.idl | 2 +- ...ment.idl => popover_target_attributes.idl} | 2 +- .../blink/renderer/core/dom/void_function.idl | 1 - .../blink/renderer/core/editing/selection.idl | 4 +- .../renderer/core/exported/web_view_impl.cc | 55 +- .../blink/renderer/core/fileapi/blob.idl | 12 +- .../renderer/core/fileapi/file_reader.idl | 10 +- .../renderer/core/fileapi/url_file_api.idl | 7 +- .../core/frame/crash_report_storage.idl | 2 +- .../renderer/core/frame/visual_viewport.idl | 2 +- .../core/html/canvas/image_data_settings.idl | 1 + .../html/custom/custom_element_registry.idl | 2 +- .../core/html/forms/html_button_element.idl | 2 +- .../core/html/forms/html_input_element.idl | 2 +- .../forms/html_selected_content_element.idl | 3 +- .../renderer/core/html/html_embed_element.idl | 2 +- .../core/html/html_iframe_element.idl | 2 +- .../core/html/html_object_element.idl | 2 +- .../origin_trials/origin_trial_context.cc | 3 + .../patching/{patch_status.idl => patch.idl} | 6 +- .../renderer/core/patching/patch_event.idl | 2 +- .../core/patching/patch_event_init.idl | 2 +- .../renderer/core/streams/readable_stream.idl | 2 +- .../blink/renderer/core/svg/svg_a_element.idl | 1 + .../blink/renderer/core/testing/internals.idl | 2 + .../core/testing/type_conversions.idl | 2 + .../view_transition_supplement.idl | 2 + .../renderer/core/xml/xslt_processor.idl | 2 +- .../ai/language_model_create_options.idl | 4 - .../blink/renderer/modules/ai/proofreader.idl | 7 +- .../animationworklet/worklet_animation.idl | 2 +- .../broadcastchannel/broadcast_channel.idl | 2 +- .../canvas_2d_draw_element_option.idl | 3 +- .../canvas2d/canvas_rendering_context_2d.idl | 11 + .../modules/cookie_store/cookie_list_item.idl | 12 +- .../identity_provider_config.idl | 1 + .../testing/internals_fed_cm.idl | 7 +- .../file_system_directory_handle.idl | 2 +- .../blink/renderer/modules/ml/ml_context.idl | 3 + .../modules/ml/webnn/ml_graph_builder.idl | 3 + .../rtc_encoded_audio_frame_metadata.idl | 15 +- .../rtc_encoded_frame_metadata.idl | 16 + .../rtc_encoded_video_frame_metadata.idl | 33 +- .../peerconnection/rtc_peer_connection.idl | 4 +- .../peerconnection/rtc_stats_report.idl | 2 + .../renderer/modules/printing/web_printer.idl | 2 +- .../private_attribution.idl | 57 - .../window_private_attribution.idl | 14 - .../modules/shared_storage/shared_storage.idl | 2 +- .../webaudio/audio_context_options.idl | 1 + .../audio_context_render_size_category.idl | 9 + .../webaudio/audio_worklet_global_scope.idl | 1 + .../modules/webaudio/base_audio_context.idl | 1 + .../offline_audio_context_options.idl | 1 + .../webgl/webgl_rendering_context_base.idl | 3 + .../modules/webgpu/gpu_supported_features.idl | 2 +- .../modules/webtransport/web_transport.idl | 3 + .../webtransport/web_transport_options.idl | 1 + .../platform/runtime_enabled_features.json5 | 694 +- .../global-interface-listing-expected.txt | 30 + 119 files changed, 17753 insertions(+), 3219 deletions(-) create mode 100755 tools/under-control/src/chrome/browser/about_flags.cc delete mode 100755 tools/under-control/src/chrome/common/extensions/api/reading_list.idl delete mode 100755 tools/under-control/src/chrome/common/extensions/api/web_authentication_proxy.idl create mode 100755 tools/under-control/src/components/policy/resources/templates/policy_definitions/Extensions/ExtensionInstallCloudPolicyChecksEnabled.yaml create mode 100755 tools/under-control/src/components/policy/resources/templates/policy_definitions/FloatingSso/AutoSignOutEnabled.yaml create mode 100755 tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPShortcuts.yaml delete mode 100755 tools/under-control/src/extensions/common/api/audio.idl delete mode 100755 tools/under-control/src/extensions/common/api/bluetooth.idl rename tools/under-control/src/{chrome/common/extensions => extensions/common}/api/chrome_url_overrides.idl (100%) create mode 100755 tools/under-control/src/third_party/blink/renderer/core/animation/timeline_trigger.idl rename tools/under-control/src/third_party/blink/renderer/core/animation/{animation_trigger_options.idl => timeline_trigger_options.idl} (93%) create mode 100755 tools/under-control/src/third_party/blink/renderer/core/css/css_apply_mixin_rule.idl create mode 100755 tools/under-control/src/third_party/blink/renderer/core/css/css_contents_mixin_rule.idl create mode 100755 tools/under-control/src/third_party/blink/renderer/core/css/css_mixin_rule.idl create mode 100755 tools/under-control/src/third_party/blink/renderer/core/dom/form_control_range.idl rename tools/under-control/src/third_party/blink/renderer/core/dom/{popover_invoker_element.idl => popover_target_attributes.idl} (90%) rename tools/under-control/src/third_party/blink/renderer/core/patching/{patch_status.idl => patch.idl} (57%) create mode 100755 tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_encoded_frame_metadata.idl delete mode 100755 tools/under-control/src/third_party/blink/renderer/modules/private_attribution/private_attribution.idl delete mode 100755 tools/under-control/src/third_party/blink/renderer/modules/private_attribution/window_private_attribution.idl create mode 100755 tools/under-control/src/third_party/blink/renderer/modules/webaudio/audio_context_render_size_category.idl diff --git a/tools/under-control/src/RELEASE b/tools/under-control/src/RELEASE index 01455f54..8e93cd91 100644 --- a/tools/under-control/src/RELEASE +++ b/tools/under-control/src/RELEASE @@ -1 +1 @@ -140.0.7339.186 +141.0.7390.55 diff --git a/tools/under-control/src/android_webview/browser/aw_content_browser_client.cc b/tools/under-control/src/android_webview/browser/aw_content_browser_client.cc index 39762ba3..90937945 100755 --- a/tools/under-control/src/android_webview/browser/aw_content_browser_client.cc +++ b/tools/under-control/src/android_webview/browser/aw_content_browser_client.cc @@ -48,7 +48,6 @@ #include "android_webview/common/aw_paths.h" #include "android_webview/common/aw_switches.h" #include "android_webview/common/url_constants.h" -#include "base/android/build_info.h" #include "base/android/locale_utils.h" #include "base/android/yield_to_looper_checker.h" #include "base/base_paths_android.h" @@ -173,8 +172,7 @@ bool g_created_network_context_params = false; // On apps targeting API level O or later, check cleartext is enforced. bool g_check_cleartext_permitted = false; -BASE_FEATURE(kWebViewOptimizeXrwNavigationFlow, - "WebViewOptimizeXrwNavigationFlow", +BASE_FEATURE(WebViewOptimizeXrwNavigationFlow, base::FEATURE_ENABLED_BY_DEFAULT); // A throttle which checks if the XRW origin trial is enabled for this @@ -661,6 +659,11 @@ void AwContentBrowserClient::OverrideWebPreferences( aw_settings->PopulateWebPreferences(web_prefs); } + // This preference is needed for back-forward transitions, but they are not + // enabled for webview (crbug.com/361600214). + web_prefs->increment_local_surface_id_for_mainframe_same_doc_navigation = + false; + AwWebContentsDelegate* delegate = static_cast(web_contents->GetDelegate()); web_prefs->modal_context_menu = diff --git a/tools/under-control/src/android_webview/browser/aw_field_trials.cc b/tools/under-control/src/android_webview/browser/aw_field_trials.cc index 849f1814..df9c51d8 100755 --- a/tools/under-control/src/android_webview/browser/aw_field_trials.cc +++ b/tools/under-control/src/android_webview/browser/aw_field_trials.cc @@ -155,8 +155,6 @@ void AwFieldTrials::RegisterFeatureOverrides(base::FeatureList* feature_list) { // on WebView. aw_feature_overrides.DisableFeature(::features::kDigitalGoodsApi); - aw_feature_overrides.DisableFeature(::features::kDynamicColorGamut); - // COOP is not supported on WebView yet. See: // https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/XBKAGb2_7uAi. aw_feature_overrides.DisableFeature( @@ -195,6 +193,10 @@ void AwFieldTrials::RegisterFeatureOverrides(base::FeatureList* feature_list) { // FedCM is not yet supported on WebView. aw_feature_overrides.DisableFeature(::features::kFedCm); + // Disable Digital Credentials API on WebView. + aw_feature_overrides.DisableFeature(::features::kWebIdentityDigitalCredentials); + aw_feature_overrides.DisableFeature(::features::kWebIdentityDigitalCredentialsCreation); + // TODO(crbug.com/40272633): Web MIDI permission prompt for all usage. aw_feature_overrides.DisableFeature(blink::features::kBlockMidiByDefault); @@ -208,11 +210,9 @@ void AwFieldTrials::RegisterFeatureOverrides(base::FeatureList* feature_list) { // enabling site isolation. See crbug.com/356170748. aw_feature_overrides.DisableFeature(blink::features::kPaintHoldingForIframes); - // Since Default Nav Transition does not support WebView yet, disable the - // LocalSurfaceId increment flag. TODO(crbug.com/361600214): Re-enable for - // WebView when we start introducing this feature. - aw_feature_overrides.DisableFeature( - blink::features::kIncrementLocalSurfaceIdForMainframeSameDocNavigation); + // Default Nav Transition does not support WebView. + // TODO(crbug.com/434928245): cleanup this feature gate in M141. + aw_feature_overrides.DisableFeature(blink::features::kBackForwardTransitions); // Disabling this feature for WebView, since it can switch focus when scrolled // in cases with multiple views which can trigger HTML focus changes that @@ -300,4 +300,17 @@ void AwFieldTrials::RegisterFeatureOverrides(base::FeatureList* feature_list) { // AAudio per-stream device selection is not supported on WebView. aw_feature_overrides.DisableFeature( features::kAAudioPerStreamDeviceSelection); + + // Disable background media. This is not used in WebView, and also it + // side-steps an issue where JNI calls in renderer does not reliably work. + // Long-term fix is to plumb this info to the renderer and remove Java calls + // there. crbug.com/438910961 + aw_feature_overrides.DisableFeature( + features::kAndroidEnableBackgroundMediaLargeFormFactors); + + // Local Network Access restrictions should not be enforced in WebView. + // The LNA permission is auto-granted in WebView, but the permission + // policy currently blocks iframes from using it. crbug.com/442879527 + aw_feature_overrides.DisableFeature( + network::features::kLocalNetworkAccessChecks); } diff --git a/tools/under-control/src/chrome/android/java/AndroidManifest.xml b/tools/under-control/src/chrome/android/java/AndroidManifest.xml index 1ede2017..50519bab 100755 --- a/tools/under-control/src/chrome/android/java/AndroidManifest.xml +++ b/tools/under-control/src/chrome/android/java/AndroidManifest.xml @@ -901,6 +901,9 @@ by a child template that "extends" this file. + + + @@ -913,6 +916,9 @@ by a child template that "extends" this file. + + + @@ -949,6 +955,9 @@ by a child template that "extends" this file. + + + diff --git a/tools/under-control/src/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java b/tools/under-control/src/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java index 74417f90..89b0fd26 100755 --- a/tools/under-control/src/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java +++ b/tools/under-control/src/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java @@ -32,6 +32,8 @@ import static androidx.browser.trusted.LaunchHandlerClientMode.FOCUS_EXISTING; import static androidx.browser.trusted.LaunchHandlerClientMode.NAVIGATE_EXISTING; import static androidx.browser.trusted.LaunchHandlerClientMode.NAVIGATE_NEW; +import static org.chromium.chrome.browser.app.tab_activity_glue.PopupCreator.EXTRA_REQUESTED_WINDOW_FEATURES; + import android.app.Activity; import android.app.ActivityOptions; import android.app.PendingIntent; @@ -72,7 +74,7 @@ import androidx.browser.trusted.sharing.ShareData; import androidx.browser.trusted.sharing.ShareTarget; import org.chromium.base.ApiCompatibilityUtils; -import org.chromium.base.BuildInfo; +import org.chromium.base.DeviceInfo; import org.chromium.base.IntentUtils; import org.chromium.base.LocaleUtils; import org.chromium.base.Log; @@ -95,6 +97,7 @@ import org.chromium.chrome.browser.toolbar.adaptive.AdaptiveToolbarButtonVariant import org.chromium.chrome.browser.ui.google_bottom_bar.GoogleBottomBarCoordinator; import org.chromium.chrome.browser.ui.google_bottom_bar.proto.IntentParams.GoogleBottomBarIntentParams; import org.chromium.chrome.browser.ui.web_app_header.WebAppHeaderUtils; +import org.chromium.chrome.browser.util.WindowFeatures; import org.chromium.components.browser_ui.widget.TintedDrawable; import org.chromium.components.embedder_support.util.Origin; import org.chromium.components.embedder_support.util.UrlConstants; @@ -1250,13 +1253,13 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid @Override public boolean isPartialHeightCustomTab() { - if (BuildInfo.getInstance().isAutomotive) return false; + if (DeviceInfo.isAutomotive()) return false; return getInitialActivityHeight() > 0; } @Override public boolean isPartialWidthCustomTab() { - if (BuildInfo.getInstance().isAutomotive) return false; + if (DeviceInfo.isAutomotive()) return false; return getInitialActivityWidth() > 0; } @@ -1656,7 +1659,7 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid public boolean isInteractiveOmniboxAllowed() { if (isOffTheRecord()) return false; if (isPartialCustomTab()) return false; - if (BuildInfo.getInstance().isAutomotive) return false; + if (DeviceInfo.isAutomotive()) return false; return true; } @@ -1791,4 +1794,17 @@ public class CustomTabIntentDataProvider extends BrowserServicesIntentDataProvid && ChromeFeatureList.sCctAdaptiveButtonDefaultVariant.getValue() == AdaptiveToolbarButtonVariant.OPEN_IN_BROWSER; } + + @Override + public WindowFeatures getRequestedWindowFeatures() { + if (mUiType != CustomTabsUiType.POPUP) { + return null; + } + final Bundle bundle = + IntentUtils.safeGetBundleExtra(getIntent(), EXTRA_REQUESTED_WINDOW_FEATURES); + if (bundle == null) { + return new WindowFeatures(); + } + return new WindowFeatures(bundle); + } } diff --git a/tools/under-control/src/chrome/browser/about_flags.cc b/tools/under-control/src/chrome/browser/about_flags.cc new file mode 100755 index 00000000..0e35753a --- /dev/null +++ b/tools/under-control/src/chrome/browser/about_flags.cc @@ -0,0 +1,13655 @@ +// Copyright 2012 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifdef UNSAFE_BUFFERS_BUILD +// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. +#pragma allow_unsafe_buffers +#endif + +// Instructions for adding new entries to this file: +// https://chromium.googlesource.com/chromium/src/+/main/docs/how_to_add_your_feature_flag.md#step-2_adding-the-feature-flag-to-the-chrome_flags-ui + +#include "chrome/browser/about_flags.h" + +#include +#include +#include +#include +#include + +#include "base/allocator/partition_alloc_features.h" +#include "base/base_switches.h" +#include "base/command_line.h" +#include "base/feature_list.h" +#include "base/features.h" +#include "base/functional/bind.h" +#include "base/functional/callback.h" +#include "base/i18n/base_i18n_switches.h" +#include "base/memory/singleton.h" +#include "base/metrics/histogram_functions.h" +#include "base/no_destructor.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "base/task/task_features.h" +#include "base/values.h" +#include "build/branding_buildflags.h" +#include "build/build_config.h" +#include "cc/base/features.h" +#include "cc/base/switches.h" +#include "chrome/browser/apps/app_discovery_service/app_discovery_service.h" +#include "chrome/browser/browser_features.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/devtools/features.h" +#include "chrome/browser/flag_descriptions.h" +#include "chrome/browser/ip_protection/ip_protection_switches.h" +#include "chrome/browser/login_detection/login_detection_util.h" +#include "chrome/browser/media/router/discovery/access_code/access_code_cast_constants.h" +#include "chrome/browser/media/router/discovery/access_code/access_code_cast_feature.h" +#include "chrome/browser/navigation_predictor/navigation_predictor_features.h" +#include "chrome/browser/navigation_predictor/search_engine_preconnector.h" +#include "chrome/browser/net/stub_resolver_config_reader.h" +#include "chrome/browser/net/system_network_context_manager.h" +#include "chrome/browser/notifications/scheduler/public/features.h" +#include "chrome/browser/page_info/page_info_features.h" +#include "chrome/browser/permissions/notifications_permission_revocation_config.h" +#include "chrome/browser/permissions/quiet_notification_permission_ui_config.h" +#include "chrome/browser/predictors/loading_predictor_config.h" +#include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h" +#include "chrome/browser/preloading/preloading_features.h" +#include "chrome/browser/preloading/search_preload/search_preload_features.h" +#include "chrome/browser/resource_coordinator/tab_manager_features.h" +#include "chrome/browser/sharing_hub/sharing_hub_features.h" +#include "chrome/browser/site_isolation/about_flags.h" +#include "chrome/browser/task_manager/common/task_manager_features.h" +#include "chrome/browser/tpcd/experiment/tpcd_experiment_features.h" +#include "chrome/browser/ui/browser_navigator_params.h" +#include "chrome/browser/ui/tabs/tab_group_home/constants.h" +#include "chrome/browser/ui/toasts/toast_features.h" +#include "chrome/browser/ui/ui_features.h" +#include "chrome/browser/ui/webui/new_tab_page/composebox/variations/aim_entrypoint_fieldtrial.h" +#include "chrome/browser/ui/webui/new_tab_page/composebox/variations/composebox_fieldtrial.h" +#include "chrome/browser/unexpire_flags.h" +#include "chrome/browser/unexpire_flags_gen.h" +#include "chrome/browser/web_applications/link_capturing_features.h" +#include "chrome/browser/webauthn/webauthn_switches.h" +#include "chrome/common/buildflags.h" +#include "chrome/common/channel_info.h" +#include "chrome/common/chrome_content_client.h" +#include "chrome/common/chrome_features.h" +#include "chrome/common/chrome_switches.h" +#include "components/android_autofill/browser/android_autofill_features.h" +#include "components/assist_ranker/predictor_config_definitions.h" +#include "components/autofill/core/browser/manual_testing_import.h" +#include "components/autofill/core/browser/studies/autofill_experiments.h" +#include "components/autofill/core/common/autofill_features.h" +#include "components/autofill/core/common/autofill_payments_features.h" +#include "components/autofill/core/common/autofill_switches.h" +#include "components/autofill/core/common/autofill_util.h" +#include "components/browser_sync/browser_sync_switches.h" +#include "components/browsing_data/core/features.h" +#include "components/collaboration/public/features.h" +#include "components/commerce/core/commerce_feature_list.h" +#include "components/commerce/core/flag_descriptions.h" +#include "components/component_updater/component_updater_command_line_config_policy.h" +#include "components/component_updater/component_updater_switches.h" +#include "components/compose/buildflags.h" +#include "components/compose/core/browser/compose_features.h" +#include "components/content_settings/core/common/features.h" +#include "components/contextual_search/core/browser/contextual_search_field_trial.h" +#include "components/contextual_search/core/browser/public.h" +#include "components/data_sharing/public/features.h" +#include "components/data_sharing/public/switches.h" +#include "components/dom_distiller/core/dom_distiller_features.h" +#include "components/dom_distiller/core/dom_distiller_switches.h" +#include "components/download/public/common/download_features.h" +#include "components/enterprise/buildflags/buildflags.h" +#include "components/enterprise/data_controls/core/browser/features.h" +#include "components/enterprise/obfuscation/core/utils.h" +#include "components/error_page/common/error_page_switches.h" +#include "components/feature_engagement/public/feature_constants.h" +#include "components/feature_engagement/public/feature_list.h" +#include "components/feed/feed_feature_list.h" +#include "components/fingerprinting_protection_filter/common/fingerprinting_protection_filter_features.h" +#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h" +#include "components/heavy_ad_intervention/heavy_ad_features.h" +#include "components/history/core/browser/features.h" +#include "components/history_clusters/core/config.h" +#include "components/history_clusters/core/features.h" +#include "components/history_clusters/core/on_device_clustering_features.h" +#include "components/history_embeddings/history_embeddings_features.h" +#include "components/input/features.h" +#include "components/language/core/common/language_experiments.h" +#include "components/lens/buildflags.h" +#include "components/lens/lens_features.h" +#include "components/manta/features.h" +#include "components/mirroring/service/mirroring_features.h" +#include "components/network_session_configurator/common/network_features.h" +#include "components/network_session_configurator/common/network_switches.h" +#include "components/no_state_prefetch/browser/no_state_prefetch_field_trial.h" +#include "components/ntp_tiles/features.h" +#include "components/offline_pages/core/offline_page_feature.h" +#include "components/omnibox/browser/aim_eligibility_service_features.h" +#include "components/omnibox/browser/omnibox_field_trial.h" +#include "components/omnibox/common/omnibox_feature_configs.h" +#include "components/omnibox/common/omnibox_features.h" +#include "components/open_from_clipboard/clipboard_recent_content_features.h" +#include "components/optimization_guide/core/model_execution/model_execution_features.h" +#include "components/optimization_guide/core/optimization_guide_features.h" +#include "components/optimization_guide/core/optimization_guide_switches.h" +#include "components/page_content_annotations/core/page_content_annotations_features.h" +#include "components/page_content_annotations/core/page_content_annotations_switches.h" +#include "components/page_image_service/features.h" +#include "components/page_info/core/features.h" +#include "components/paint_preview/buildflags/buildflags.h" +#include "components/paint_preview/features/features.h" +#include "components/password_manager/core/browser/features/password_features.h" +#include "components/password_manager/core/common/password_manager_features.h" +#include "components/payments/core/features.h" +#include "components/performance_manager/public/features.h" +#include "components/permissions/features.h" +#include "components/plus_addresses/core/common/features.h" +#include "components/power_bookmarks/core/power_bookmark_features.h" +#include "components/privacy_sandbox/privacy_sandbox_features.h" +#include "components/regional_capabilities/regional_capabilities_switches.h" +#include "components/remote_cocoa/app_shim/features.h" +#include "components/safe_browsing/core/common/features.h" +#include "components/safe_browsing/core/common/safebrowsing_switches.h" +#include "components/safety_check/features.h" +#include "components/saved_tab_groups/public/features.h" +#include "components/search/ntp_features.h" +#include "components/search_engines/search_engines_switches.h" +#include "components/security_interstitials/content/stateful_ssl_host_state_delegate.h" +#include "components/security_interstitials/core/features.h" +#include "components/security_state/core/security_state.h" +#include "components/segmentation_platform/embedder/home_modules/constants.h" +#include "components/segmentation_platform/public/features.h" +#include "components/send_tab_to_self/features.h" +#include "components/sensitive_content/features.h" +#include "components/services/heap_profiling/public/cpp/switches.h" +#include "components/services/storage/public/cpp/buckets/bucket_info.h" +#include "components/shared_highlighting/core/common/shared_highlighting_features.h" +#include "components/sharing_message/features.h" +#include "components/signin/core/browser/dice_account_reconcilor_delegate.h" +#include "components/signin/public/base/signin_buildflags.h" +#include "components/signin/public/base/signin_switches.h" +#include "components/site_isolation/features.h" +#include "components/soda/soda_features.h" +#include "components/spellcheck/common/spellcheck_features.h" +#include "components/spellcheck/spellcheck_buildflags.h" +#include "components/supervised_user/core/common/features.h" +#include "components/supervised_user/core/common/supervised_user_constants.h" +#include "components/sync/base/command_line_switches.h" +#include "components/sync/base/features.h" +#include "components/sync_preferences/features.h" +#include "components/tracing/common/tracing_switches.h" +#include "components/translate/core/browser/translate_prefs.h" +#include "components/translate/core/browser/translate_ranker_impl.h" +#include "components/translate/core/common/translate_util.h" +#include "components/trusted_vault/features.h" +#include "components/ui_devtools/switches.h" +#include "components/variations/variations_switches.h" +#include "components/version_info/channel.h" +#include "components/version_info/version_info.h" +#include "components/visited_url_ranking/public/features.h" +#include "components/viz/common/features.h" +#include "components/viz/common/switches.h" +#include "components/webapps/browser/features.h" +#include "components/webapps/isolated_web_apps/features.h" +#include "components/webui/flags/feature_entry.h" +#include "components/webui/flags/feature_entry_macros.h" +#include "components/webui/flags/flags_state.h" +#include "components/webui/flags/flags_storage.h" +#include "components/webui/flags/flags_ui_metrics.h" +#include "components/webui/flags/flags_ui_switches.h" +#include "components/webui/flags/pref_service_flags_storage.h" +#include "content/public/common/content_features.h" +#include "content/public/common/content_switches.h" +#include "device/base/features.h" +#include "device/bluetooth/bluez/bluez_features.h" +#include "device/bluetooth/chromeos_platform_features.h" +#include "device/bluetooth/floss/floss_features.h" +#include "device/fido/features.h" +#include "device/gamepad/public/cpp/gamepad_features.h" +#include "device/vr/buildflags/buildflags.h" +#include "extensions/buildflags/buildflags.h" +#include "gpu/config/gpu_finch_features.h" +#include "gpu/config/gpu_switches.h" +#include "media/audio/audio_features.h" +#include "media/base/media_switches.h" +#include "media/capture/capture_switches.h" +#include "media/media_buildflags.h" +#include "media/midi/midi_switches.h" +#include "media/webrtc/webrtc_features.h" +#include "mojo/core/embedder/features.h" +#include "net/base/features.h" +#include "net/net_buildflags.h" +#include "net/nqe/effective_connection_type.h" +#include "net/nqe/network_quality_estimator_params.h" +#include "net/websockets/websocket_basic_handshake_stream.h" +#include "partition_alloc/buildflags.h" +#include "pdf/buildflags.h" +#include "printing/buildflags/buildflags.h" +#include "sandbox/policy/features.h" +#include "sandbox/policy/switches.h" +#include "services/device/public/cpp/device_features.h" +#include "services/media_session/public/cpp/features.h" +#include "services/network/public/cpp/features.h" +#include "services/network/public/cpp/network_switches.h" +#include "services/tracing/public/cpp/tracing_features.h" +#include "services/webnn/public/mojom/features.mojom-features.h" +#include "skia/rusty_png_feature.h" +#include "storage/browser/blob/features.h" +#include "storage/browser/quota/quota_features.h" +#include "third_party/blink/public/common/features.h" +#include "third_party/blink/public/common/features_generated.h" +#include "third_party/blink/public/common/forcedark/forcedark_switches.h" +#include "third_party/blink/public/common/switches.h" +#include "ui/accessibility/accessibility_features.h" +#include "ui/accessibility/accessibility_switches.h" +#include "ui/base/ozone_buildflags.h" +#include "ui/base/ui_base_features.h" +#include "ui/base/ui_base_switches.h" +#include "ui/compositor/compositor_switches.h" +#include "ui/display/display_features.h" +#include "ui/display/display_switches.h" +#include "ui/events/blink/blink_features.h" +#include "ui/events/event_switches.h" +#include "ui/gfx/switches.h" +#include "ui/gl/buildflags.h" +#include "ui/gl/gl_features.h" +#include "ui/gl/gl_switches.h" +#include "ui/native_theme/features/native_theme_features.h" +#include "ui/ui_features.h" +#include "url/url_features.h" + +#if BUILDFLAG(IS_ANDROID) +#include "base/android/pre_freeze_background_memory_trimmer.h" +#include "chrome/browser/contextmenu/context_menu_features.h" +#include "chrome/browser/flags/android/chrome_feature_list.h" +#include "chrome/browser/notifications/chime/android/features.h" +#include "components/browser_ui/photo_picker/android/features.h" +#include "components/credential_management/android/features.h" +#include "components/enterprise/connectors/core/features.h" +#include "components/external_intents/android/external_intents_features.h" +#include "components/facilitated_payments/core/features/features.h" +#include "components/messages/android/messages_feature.h" +#include "components/payments/content/android/payment_feature_map.h" +#include "components/push_messaging/push_messaging_features.h" +#include "components/translate/content/android/translate_message.h" +#include "ui/android/ui_android_features.h" +#else // BUILDFLAG(IS_ANDROID) +#include "chrome/browser/component_updater/iwa_key_distribution_component_installer.h" +#include "chrome/browser/media/router/discovery/access_code/access_code_cast_sink_service.h" +#include "chrome/browser/media/router/media_router_feature.h" +#include "chrome/browser/ui/tabs/features.h" +#include "chrome/browser/web_applications/preinstalled_app_install_features.h" +#include "components/user_education/common/user_education_features.h" // nogncheck +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) +#include "ash/constants/ash_features.h" +#include "ash/constants/ash_switches.h" +#include "ash/public/cpp/app_list/app_list_features.h" +#include "ash/public/cpp/keyboard/keyboard_switches.h" +#include "base/process/process.h" +#include "chrome/browser/apps/app_service/chrome_app_deprecation/chrome_app_deprecation.h" +#include "chrome/browser/ash/app_list/search/search_features.h" +#include "chrome/browser/ash/crostini/crostini_util.h" +#include "chrome/browser/ash/file_suggest/item_suggest_cache.h" +#include "chrome/browser/ash/ownership/owner_settings_service_ash.h" +#include "chrome/browser/ash/ownership/owner_settings_service_ash_factory.h" +#include "chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.h" +#include "chrome/browser/ash/settings/about_flags.h" +#include "chrome/browser/component_updater/cros_component_installer_chromeos.h" +#include "chrome/browser/nearby_sharing/common/nearby_share_features.h" +#include "chrome/common/webui_url_constants.h" +#include "chromeos/ash/components/assistant/buildflags.h" +#include "chromeos/ash/components/memory/swap_configuration.h" +#include "chromeos/ash/experiences/arc/arc_features.h" +#include "chromeos/ash/experiences/arc/arc_util.h" +#include "chromeos/ash/services/assistant/public/cpp/features.h" +#include "chromeos/constants/chromeos_features.h" +#include "chromeos/constants/chromeos_switches.h" +#include "components/app_restore/features.h" +#include "components/cross_device/nearby/nearby_features.h" +#include "components/metrics/structured/structured_metrics_features.h" // nogncheck +#include "media/capture/video/chromeos/video_capture_features_chromeos.h" +#include "remoting/host/chromeos/features.h" +#include "third_party/cros_system_api/switches/chrome_switches.h" +#include "ui/events/ozone/features.h" +#else +#include "components/variations/net/variations_command_line.h" +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_MAC) +#include "chrome/browser/ui/browser_dialogs.h" +#endif // BUILDFLAG(IS_MAC) + +#if BUILDFLAG(IS_WIN) +#include "chrome/browser/tracing/tracing_features.h" +#include "chrome/browser/win/mica_titlebar.h" +#include "components/stylus_handwriting/win/features.h" +#endif + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) +#include "base/allocator/buildflags.h" +#include "ui/ozone/public/ozone_switches.h" +#endif + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) +#include "chrome/browser/contextual_cueing/contextual_cueing_features.h" // nogncheck +#include "chrome/browser/enterprise/profile_management/profile_management_features.h" +#include "chrome/browser/enterprise/webstore/features.h" +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) +#include "chrome/browser/enterprise/platform_auth/platform_auth_features.h" +#endif + +#if BUILDFLAG(ENABLE_BOUND_SESSION_CREDENTIALS) +#include "components/unexportable_keys/features.h" // nogncheck +#endif + +#if BUILDFLAG(ENABLE_EXTENSIONS) +#include "chrome/browser/extensions/cws_info_service.h" +#include "extensions/common/extension_features.h" +#include "extensions/common/switches.h" +#endif // BUILDFLAG(ENABLE_EXTENSIONS) + +#if BUILDFLAG(ENABLE_PDF) +#include "pdf/pdf_features.h" +#endif + +#if BUILDFLAG(ENABLE_PRINTING) +#include "printing/printing_features.h" +#endif + +#if BUILDFLAG(ENABLE_VR) +#include "device/vr/public/cpp/features.h" +#include "device/vr/public/cpp/switches.h" +#endif + +#if defined(TOOLKIT_VIEWS) +#include "ui/views/views_features.h" +#include "ui/views/views_switches.h" +#endif // defined(TOOLKIT_VIEWS) + +using flags_ui::FeatureEntry; +using flags_ui::kDeprecated; +using flags_ui::kOsAndroid; +using flags_ui::kOsCrOS; +using flags_ui::kOsCrOSOwnerOnly; +using flags_ui::kOsLinux; +using flags_ui::kOsMac; +using flags_ui::kOsWin; + +namespace about_flags { + +namespace { + +const unsigned kOsAll = kOsMac | kOsWin | kOsLinux | kOsCrOS | kOsAndroid; +const unsigned kOsDesktop = kOsMac | kOsWin | kOsLinux | kOsCrOS; + +#if defined(USE_AURA) +const unsigned kOsAura = kOsWin | kOsLinux | kOsCrOS; +#endif // USE_AURA + +#if defined(USE_AURA) +const FeatureEntry::Choice kPullToRefreshChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flags_ui::kGenericExperimentChoiceDisabled, switches::kPullToRefresh, "0"}, + {flags_ui::kGenericExperimentChoiceEnabled, switches::kPullToRefresh, "1"}, + {flag_descriptions::kPullToRefreshEnabledTouchscreen, + switches::kPullToRefresh, "2"}}; +#endif // USE_AURA + +const FeatureEntry::FeatureParam kLocalNetworkAccessChecksBlock[] = { + {"LocalNetworkAccessChecksWarn", "false"}}; +const FeatureEntry::FeatureVariation kLocalNetworkAccessChecksVariations[] = { + {"(Blocking)", kLocalNetworkAccessChecksBlock, + std::size(kLocalNetworkAccessChecksBlock), nullptr}}; + +const FeatureEntry::Choice kEnableBenchmarkingChoices[] = { + {flag_descriptions::kEnableBenchmarkingChoiceDisabled, "", ""}, + {flag_descriptions::kEnableBenchmarkingChoiceDefaultFeatureStates, + variations::switches::kEnableBenchmarking, ""}, + {flag_descriptions::kEnableBenchmarkingChoiceMatchFieldTrialTestingConfig, + variations::switches::kEnableBenchmarking, + variations::switches::kEnableFieldTrialTestingConfig}, +}; + +const FeatureEntry::Choice kOverlayStrategiesChoices[] = { + {flag_descriptions::kOverlayStrategiesDefault, "", ""}, + {flag_descriptions::kOverlayStrategiesNone, + switches::kEnableHardwareOverlays, ""}, + {flag_descriptions::kOverlayStrategiesUnoccludedFullscreen, + switches::kEnableHardwareOverlays, "single-fullscreen"}, + {flag_descriptions::kOverlayStrategiesUnoccluded, + switches::kEnableHardwareOverlays, "single-fullscreen,single-on-top"}, + {flag_descriptions::kOverlayStrategiesOccludedAndUnoccluded, + switches::kEnableHardwareOverlays, + "single-fullscreen,single-on-top,underlay"}, +}; + +const FeatureEntry::Choice kTouchTextSelectionStrategyChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kTouchSelectionStrategyCharacter, + blink::switches::kTouchTextSelectionStrategy, + blink::switches::kTouchTextSelectionStrategy_Character}, + {flag_descriptions::kTouchSelectionStrategyDirection, + blink::switches::kTouchTextSelectionStrategy, + blink::switches::kTouchTextSelectionStrategy_Direction}}; + +#if BUILDFLAG(IS_WIN) +const FeatureEntry::FeatureParam kMediaFoundationClearStrategyUseFrameServer[] = + {{"strategy", "frame-server"}}; + +const FeatureEntry::FeatureParam + kMediaFoundationClearStrategyUseDirectComposition[] = { + {"strategy", "direct-composition"}}; + +const FeatureEntry::FeatureParam kMediaFoundationClearStrategyUseDynamic[] = { + {"strategy", "dynamic"}}; + +const FeatureEntry::FeatureVariation kMediaFoundationClearStrategyVariations[] = + {{"Direct Composition", kMediaFoundationClearStrategyUseDirectComposition, + std::size(kMediaFoundationClearStrategyUseDirectComposition), nullptr}, + {"Frame Server", kMediaFoundationClearStrategyUseFrameServer, + std::size(kMediaFoundationClearStrategyUseFrameServer), nullptr}, + {"Dynamic", kMediaFoundationClearStrategyUseDynamic, + std::size(kMediaFoundationClearStrategyUseDynamic), nullptr}}; + +const FeatureEntry::Choice kUseAngleChoicesWindows[] = { + {flag_descriptions::kUseAngleDefault, "", ""}, + {flag_descriptions::kUseAngleD3D11, switches::kUseANGLE, + gl::kANGLEImplementationD3D11Name}, + {flag_descriptions::kUseAngleD3D9, switches::kUseANGLE, + gl::kANGLEImplementationD3D9Name}, + {flag_descriptions::kUseAngleD3D11Warp, switches::kUseANGLE, + gl::kANGLEImplementationD3D11WarpName}}; +#elif BUILDFLAG(IS_ANDROID) +const FeatureEntry::Choice kUseAngleChoicesAndroid[] = { + {flag_descriptions::kUseAngleDefault, "", ""}, + {flag_descriptions::kUseAngleGLES, switches::kUseANGLE, + gl::kANGLEImplementationOpenGLESName}, + {flag_descriptions::kUseAngleVulkan, switches::kUseANGLE, + gl::kANGLEImplementationVulkanName}}; +#endif + +#if BUILDFLAG(ENABLE_EXTENSIONS) +const FeatureEntry::Choice kExtensionsToolbarZeroStateChoices[] = { + {flag_descriptions::kExtensionsToolbarZeroStateChoicesDisabled, "", ""}, + {flag_descriptions::kExtensionsToolbarZeroStateVistWebStore, + switches::kExtensionsToolbarZeroStateVariation, + switches::kExtensionsToolbarZeroStateSingleWebStoreLink}, + {flag_descriptions::kExtensionsToolbarZeroStateExploreExtensionsByCategory, + switches::kExtensionsToolbarZeroStateVariation, + switches::kExtensionsToolbarZeroStateExploreExtensionsByCategory}, +}; +#endif // ENABLE_EXTENSIONS + +#if BUILDFLAG(IS_WIN) +const FeatureEntry::FeatureParam kDXGIWaitableSwapChain1Frame = { + "DXGIWaitableSwapChainMaxQueuedFrames", "1"}; + +const FeatureEntry::FeatureParam kDXGIWaitableSwapChain2Frames = { + "DXGIWaitableSwapChainMaxQueuedFrames", "2"}; + +const FeatureEntry::FeatureParam kDXGIWaitableSwapChain3Frames = { + "DXGIWaitableSwapChainMaxQueuedFrames", "3"}; + +const FeatureEntry::FeatureVariation kDXGIWaitableSwapChainVariations[] = { + {"Max 1 Frame", &kDXGIWaitableSwapChain1Frame, 1, nullptr}, + {"Max 2 Frames", &kDXGIWaitableSwapChain2Frames, 1, nullptr}, + {"Max 3 Frames", &kDXGIWaitableSwapChain3Frames, 1, nullptr}}; +#endif + +#if BUILDFLAG(ENABLE_VR) +const FeatureEntry::Choice kWebXrForceRuntimeChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kWebXrRuntimeChoiceNone, switches::kWebXrForceRuntime, + switches::kWebXrRuntimeNone}, +#if BUILDFLAG(ENABLE_ARCORE) + {flag_descriptions::kWebXrRuntimeChoiceArCore, switches::kWebXrForceRuntime, + switches::kWebXrRuntimeArCore}, +#endif +#if BUILDFLAG(ENABLE_CARDBOARD) + {flag_descriptions::kWebXrRuntimeChoiceCardboard, + switches::kWebXrForceRuntime, switches::kWebXrRuntimeCardboard}, +#endif +#if BUILDFLAG(ENABLE_OPENXR) + {flag_descriptions::kWebXrRuntimeChoiceOpenXR, switches::kWebXrForceRuntime, + switches::kWebXrRuntimeOpenXr}, +#endif // ENABLE_OPENXR + {flag_descriptions::kWebXrRuntimeChoiceOrientationSensors, + switches::kWebXrForceRuntime, switches::kWebXrRuntimeOrientationSensors}, +}; + +const FeatureEntry::Choice KWebXrHandAnonymizationChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kWebXrHandAnonymizationChoiceRuntime, + device::switches::kWebXrHandAnonymizationStrategy, + device::switches::kWebXrHandAnonymizationStrategyRuntime}, + {flag_descriptions::kWebXrHandAnonymizationChoiceFallback, + device::switches::kWebXrHandAnonymizationStrategy, + device::switches::kWebXrHandAnonymizationStrategyFallback}, + {flag_descriptions::kWebXrHandAnonymizationChoiceNone, + device::switches::kWebXrHandAnonymizationStrategy, + device::switches::kWebXrHandAnonymizationStrategyNone}, +}; +#endif // ENABLE_VR + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kCCTAdaptiveButtonEnable[] = { + {"open_in_browser", "true"}}; +const FeatureEntry::FeatureParam kCCTAdaptiveButtonCPAOnly[] = { + {"contextual_only", "true"}}; +const FeatureEntry::FeatureParam kCCTAdaptiveButtonOpenInBrowserCPA[] = { + {"open_in_browser", "true"}, + {"default_variant", "15"}, // 15 == Open In Browser + {"contextual_only", "true"}}; +const FeatureEntry::FeatureParam kCCTAdaptiveButtonMenuOpenInBrowserTop[] = { + {"open_in_browser", "true"}, + {"show_open_in_browser_menu_top", "true"}}; +const FeatureEntry::FeatureParam kCCTAdaptiveButtonMenuRemoval[] = { + {"open_in_browser", "true"}, + {"remove_find_in_page_menu_item", "true"}, + {"remove_desktop_site_menu_item", "true"}}; +const FeatureEntry::FeatureParam kCCTAdaptiveButtonMenuCombo[] = { + {"open_in_browser", "true"}, + {"show_open_in_browser_menu_top", "true"}, + {"remove_find_in_page_menu_item", "true"}, + {"remove_desktop_site_menu_item", "true"}}; +const FeatureEntry::FeatureParam kCCTAdaptiveButtonMLTraining[] = { + {"ml_training", "true"}, + {"open_in_browser", "true"}}; +const FeatureEntry::FeatureVariation kCCTAdaptiveButtonVariations[] = { + {"+OpenInBrowser", kCCTAdaptiveButtonEnable, + std::size(kCCTAdaptiveButtonEnable), nullptr}, + {"CPA only", kCCTAdaptiveButtonCPAOnly, + std::size(kCCTAdaptiveButtonCPAOnly), nullptr}, + {"CPA+OpenInBrowser", kCCTAdaptiveButtonOpenInBrowserCPA, + std::size(kCCTAdaptiveButtonOpenInBrowserCPA), nullptr}, + {"Menu: OpenInBrowser at Top", kCCTAdaptiveButtonMenuOpenInBrowserTop, + std::size(kCCTAdaptiveButtonMenuOpenInBrowserTop), nullptr}, + {"Menu: Remove FineInPage/DesktopSite", kCCTAdaptiveButtonMenuRemoval, + std::size(kCCTAdaptiveButtonMenuRemoval), nullptr}, + {"Menu: Combine above 2", kCCTAdaptiveButtonMenuCombo, + std::size(kCCTAdaptiveButtonMenuCombo), nullptr}, + {"for ML training", kCCTAdaptiveButtonMLTraining, + std::size(kCCTAdaptiveButtonMLTraining), nullptr}, +}; + +const FeatureEntry::FeatureParam kCCTAdaptiveButtonTestSwitchHide[] = { + {"hide-button", "true"}, + {"always-animate", "false"}}; +const FeatureEntry::FeatureParam kCCTAdaptiveButtonTestSwitchChip[] = { + {"hide-button", "false"}, + {"always-animate", "true"}}; +const FeatureEntry::FeatureParam kCCTAdaptiveButtonTestSwitchBoth[] = { + {"hide-button", "true"}, + {"always-animate", "true"}}; +const FeatureEntry::FeatureVariation kCCTAdaptiveButtonTestSwitchVariations[] = + { + {"+Hide button", kCCTAdaptiveButtonTestSwitchHide, + std::size(kCCTAdaptiveButtonTestSwitchHide), nullptr}, + {"+Always animate chip", kCCTAdaptiveButtonTestSwitchChip, + std::size(kCCTAdaptiveButtonTestSwitchChip), nullptr}, + {"+Both", kCCTAdaptiveButtonTestSwitchBoth, + std::size(kCCTAdaptiveButtonTestSwitchBoth), nullptr}, +}; +const FeatureEntry::FeatureParam + kAdaptiveButtonInTopToolbarPageSummaryDisableFallback[] = { + {"intent_fallback", "false"}, +}; +const FeatureEntry::FeatureVariation + kAdaptiveButtonInTopToolbarPageSummaryVariations[] = { + {"(Disable intent fallback)", + kAdaptiveButtonInTopToolbarPageSummaryDisableFallback, + std::size(kAdaptiveButtonInTopToolbarPageSummaryDisableFallback), + nullptr}, +}; + +const FeatureEntry::FeatureParam kCCTAuthTabHttpsVerificationTimeout10000Ms[] = + {{"verification_timeout_ms", "10000"}}; +const FeatureEntry::FeatureParam kCCTAuthTabHttpsVerificationTimeout1000Ms[] = { + {"verification_timeout_ms", "1000"}}; + +const FeatureEntry::FeatureVariation + kCCTAuthTabEnableHttpsRedirectsVariations[] = { + {"HTTPS verification timeout 10,000ms", + kCCTAuthTabHttpsVerificationTimeout10000Ms, + std::size(kCCTAuthTabHttpsVerificationTimeout10000Ms), nullptr}, + {"HTTPS verification timeout 1000ms", + kCCTAuthTabHttpsVerificationTimeout1000Ms, + std::size(kCCTAuthTabHttpsVerificationTimeout1000Ms), nullptr}}; + +const FeatureEntry::FeatureParam kCCTResizablePolicyParamUseAllowlist[] = { + {"default_policy", "use-allowlist"}}; +const FeatureEntry::FeatureParam kCCTResizablePolicyParamUseDenylist[] = { + {"default_policy", "use-denylist"}}; + +const FeatureEntry::FeatureVariation + kCCTResizableThirdPartiesDefaultPolicyVariations[] = { + {"Use Allowlist", kCCTResizablePolicyParamUseAllowlist, + std::size(kCCTResizablePolicyParamUseAllowlist), nullptr}, + {"Use Denylist", kCCTResizablePolicyParamUseDenylist, + std::size(kCCTResizablePolicyParamUseDenylist), nullptr}}; + +const FeatureEntry::FeatureParam kCCTBottomBarButtonBalancedWithHomeParam[] = { + {"google_bottom_bar_button_list", "0,10,3,2"}}; +const FeatureEntry::FeatureParam kCCTBottomBarButtonsBalancedWithCustomParam[] = + {{"google_bottom_bar_button_list", "0,3,8,2"}}; +const FeatureEntry::FeatureParam kCCTBottomBarButtonsBalancedWithSearchParam[] = + {{"google_bottom_bar_button_list", "0,3,9,2"}}; +const FeatureEntry::FeatureParam kCCTBottomBarHomeInSpotlightParam[] = { + {"google_bottom_bar_button_list", "10,10,3,2"}}; +const FeatureEntry::FeatureParam kCCTBottomBarCustomInSpotlightParam[] = { + {"google_bottom_bar_button_list", "8,8,3,2"}}; +const FeatureEntry::FeatureParam kCCTBottomBarSearchInSpotlightParam[] = { + {"google_bottom_bar_button_list", "9,9,3,2"}}; + +const FeatureEntry::FeatureVariation kCCTGoogleBottomBarVariations[] = { + {"Balanced with home button", kCCTBottomBarButtonBalancedWithHomeParam, + std::size(kCCTBottomBarButtonBalancedWithHomeParam), nullptr}, + {"Balanced with custom button", kCCTBottomBarButtonsBalancedWithCustomParam, + std::size(kCCTBottomBarButtonsBalancedWithCustomParam), nullptr}, + {"Balanced with search button", kCCTBottomBarButtonsBalancedWithSearchParam, + std::size(kCCTBottomBarButtonsBalancedWithSearchParam), nullptr}, + {"home button in spotlight", kCCTBottomBarHomeInSpotlightParam, + std::size(kCCTBottomBarHomeInSpotlightParam), nullptr}, + {"custom button in spotlight", kCCTBottomBarCustomInSpotlightParam, + std::size(kCCTBottomBarCustomInSpotlightParam), nullptr}, + {"search button in spotlight", kCCTBottomBarSearchInSpotlightParam, + std::size(kCCTBottomBarSearchInSpotlightParam), nullptr}, +}; + +const FeatureEntry::FeatureParam kCCTDoubleDeckerBottomBarParam[] = { + {"google_bottom_bar_variant_layout", "1"}}; +const FeatureEntry::FeatureParam kCCTSingleDeckerBottomBarParam[] = { + {"google_bottom_bar_variant_layout", "2"}}; +const FeatureEntry::FeatureParam + kCCTSingleDeckerBottomBarWithButtonsOnRightParam[] = { + {"google_bottom_bar_variant_layout", "3"}}; + +const FeatureEntry::FeatureVariation + kCCTGoogleBottomBarVariantLayoutsVariations[] = { + {"Double decker", kCCTDoubleDeckerBottomBarParam, + std::size(kCCTDoubleDeckerBottomBarParam), nullptr}, + {"Single decker", kCCTSingleDeckerBottomBarParam, + std::size(kCCTSingleDeckerBottomBarParam), nullptr}, + {"Single decker with button(s) on right", + kCCTSingleDeckerBottomBarWithButtonsOnRightParam, + std::size(kCCTSingleDeckerBottomBarWithButtonsOnRightParam), nullptr}, +}; + +const FeatureEntry::Choice kReaderModeHeuristicsChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kReaderModeHeuristicsMarkup, + switches::kReaderModeHeuristics, + switches::reader_mode_heuristics::kOGArticle}, + {flag_descriptions::kReaderModeHeuristicsAdaboost, + switches::kReaderModeHeuristics, + switches::reader_mode_heuristics::kAdaBoost}, + {flag_descriptions::kReaderModeHeuristicsAlwaysOn, + switches::kReaderModeHeuristics, + switches::reader_mode_heuristics::kAlwaysTrue}, + {flag_descriptions::kReaderModeHeuristicsAlwaysOff, + switches::kReaderModeHeuristics, switches::reader_mode_heuristics::kNone}, + {flag_descriptions::kReaderModeHeuristicsAllArticles, + switches::kReaderModeHeuristics, + switches::reader_mode_heuristics::kAllArticles}, +}; + +const FeatureEntry::FeatureParam + kReaderModeImprovementsTriggerOnMobileFriendly[] = { + {"trigger_on_mobile_friendly_pages", "true"}}; +const FeatureEntry::FeatureParam kReaderModeImprovementsAlwaysOnEntryPoint[] = { + {"always_on_entry_point", "true"}}; +const FeatureEntry::FeatureParam kReaderModeImprovementsCustomCPATimeout[] = { + {"custom_cpa_timeout_enabled", "true"}, + {"custom_cpa_timeout", "300"}}; +const FeatureEntry::FeatureParam + kReaderModeImprovementsShowReadingModeInRegularTab[] = { + {"show_in_regular_tab", "true"}}; +const FeatureEntry::FeatureParam kReaderModeImprovementsAllOn[] = { + {"trigger_on_mobile_friendly_pages", "true"}, + {"always_on_entry_point", "true"}, + {"custom_cpa_timeout_enabled", "true"}, + {"custom_cpa_timeout", "300"}, + {"show_in_regular_tab", "true"}}; + +const FeatureEntry::FeatureVariation kReaderModeImprovementsChoices[] = { + {"trigger on mobile-friendly pages", + kReaderModeImprovementsTriggerOnMobileFriendly, + std::size(kReaderModeImprovementsTriggerOnMobileFriendly), nullptr}, + {"always-on entry point", kReaderModeImprovementsAlwaysOnEntryPoint, + std::size(kReaderModeImprovementsAlwaysOnEntryPoint), nullptr}, + {"increased cpa timeout", kReaderModeImprovementsCustomCPATimeout, + std::size(kReaderModeImprovementsCustomCPATimeout), nullptr}, + {"reading mode in regular tab", + kReaderModeImprovementsShowReadingModeInRegularTab, + std::size(kReaderModeImprovementsShowReadingModeInRegularTab), nullptr}, + + {"all", kReaderModeImprovementsAllOn, + std::size(kReaderModeImprovementsAllOn), nullptr}}; + +const FeatureEntry::FeatureParam kReaderModeUseReadabilityDistiller[] = { + {"use_distiller", "true"}}; +const FeatureEntry::FeatureParam kReaderModeUseReadabilityHeuristic[] = { + {"use_heuristic", "true"}}; +const FeatureEntry::FeatureParam kReaderModeUseReadabilityAll[] = { + {"use_distiller", "true"}, + {"use_heuristic", "true"}}; + +const FeatureEntry::FeatureVariation kReaderModeUseReadabilityChoices[] = { + {"distiller only", kReaderModeUseReadabilityDistiller, + std::size(kReaderModeUseReadabilityDistiller), nullptr}, + {"triggering heuristic only", kReaderModeUseReadabilityHeuristic, + std::size(kReaderModeUseReadabilityHeuristic), nullptr}, + {"both distiller and triggering heuristic", kReaderModeUseReadabilityAll, + std::size(kReaderModeUseReadabilityAll), nullptr}}; + +const FeatureEntry::Choice kForceUpdateMenuTypeChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kUpdateMenuTypeNone, switches::kForceUpdateMenuType, + "none"}, + {flag_descriptions::kUpdateMenuTypeUpdateAvailable, + switches::kForceUpdateMenuType, "update_available"}, + {flag_descriptions::kUpdateMenuTypeUnsupportedOSVersion, + switches::kForceUpdateMenuType, "unsupported_os_version"}, +}; + +const FeatureEntry::FeatureParam kOmahaMinSdkVersionAndroidMinSdk1[] = { + {"min_sdk_version", "1"}}; +const FeatureEntry::FeatureParam kOmahaMinSdkVersionAndroidMinSdk1000[] = { + {"min_sdk_version", "1000"}}; +const FeatureEntry::FeatureVariation kOmahaMinSdkVersionAndroidVariations[] = { + {flag_descriptions::kOmahaMinSdkVersionAndroidMinSdk1Description, + kOmahaMinSdkVersionAndroidMinSdk1, + std::size(kOmahaMinSdkVersionAndroidMinSdk1), nullptr}, + {flag_descriptions::kOmahaMinSdkVersionAndroidMinSdk1000Description, + kOmahaMinSdkVersionAndroidMinSdk1000, + std::size(kOmahaMinSdkVersionAndroidMinSdk1000), nullptr}, +}; + +const FeatureEntry::FeatureParam + kOptimizationGuidePersonalizedFetchingAllowPageInsights[] = { + {"allowed_contexts", "CONTEXT_PAGE_INSIGHTS_HUB"}}; +const FeatureEntry::FeatureVariation + kOptimizationGuidePersonalizedFetchingAllowPageInsightsVariations[] = { + {"for Page Insights", + kOptimizationGuidePersonalizedFetchingAllowPageInsights, + std::size(kOptimizationGuidePersonalizedFetchingAllowPageInsights), + nullptr}}; + +const FeatureEntry::FeatureParam kFeedHeaderRemovalParam1 = { + feed::kFeedHeaderRemovalTreatmentParam, + feed::kFeedHeaderRemovalTreatmentValue1}; +const FeatureEntry::FeatureParam kFeedHeaderRemovalParam2 = { + feed::kFeedHeaderRemovalTreatmentParam, + feed::kFeedHeaderRemovalTreatmentValue2}; +const FeatureEntry::FeatureVariation kFeedHeaderRemovalVariations[] = { + {"1", &kFeedHeaderRemovalParam1, 1, nullptr}, + {"2", &kFeedHeaderRemovalParam2, 1, nullptr}, +}; + +const FeatureEntry::Choice kSafetyHubUnifiedPasswordsModuleChoices[] = { + {"Default", "", ""}, + {"Enabled", switches::kEnableFeatures, + "SafetyHubLocalPasswordsModule, SafetyHubUnifiedPasswordsModule"}, + {"Disabled", switches::kDisableFeatures, + "SafetyHubLocalPasswordsModule, SafetyHubUnifiedPasswordsModule"}, +}; + +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_CHROMEOS) +const FeatureEntry::FeatureParam kForceDark_SimpleHsl[] = { + {"inversion_method", "hsl_based"}, + {"foreground_lightness_threshold", "150"}, + {"background_lightness_threshold", "205"}}; + +const FeatureEntry::FeatureParam kForceDark_SimpleCielab[] = { + {"inversion_method", "cielab_based"}, + {"foreground_lightness_threshold", "150"}, + {"background_lightness_threshold", "205"}}; + +const FeatureEntry::FeatureParam kForceDark_SimpleRgb[] = { + {"inversion_method", "rgb_based"}, + {"foreground_lightness_threshold", "150"}, + {"background_lightness_threshold", "205"}}; + +// Keep in sync with the kForceDark_SelectiveImageInversion +// in aw_feature_entries.cc if you tweak these parameters. +const FeatureEntry::FeatureParam kForceDark_SelectiveImageInversion[] = { + {"inversion_method", "cielab_based"}, + {"image_behavior", "selective"}, + {"foreground_lightness_threshold", "150"}, + {"background_lightness_threshold", "205"}}; + +const FeatureEntry::FeatureParam kForceDark_SelectiveElementInversion[] = { + {"inversion_method", "cielab_based"}, + {"foreground_lightness_threshold", "150"}, + {"background_lightness_threshold", "205"}}; + +const FeatureEntry::FeatureParam kForceDark_SelectiveGeneralInversion[] = { + {"inversion_method", "cielab_based"}, + {"image_behavior", "selective"}, + {"foreground_lightness_threshold", "150"}, + {"background_lightness_threshold", "205"}}; + +const FeatureEntry::FeatureParam kForceDark_TransparencyAndNumColors[] = { + {"classifier_policy", "transparency_and_num_colors"}}; + +const FeatureEntry::FeatureVariation kForceDarkVariations[] = { + {"with simple HSL-based inversion", kForceDark_SimpleHsl, + std::size(kForceDark_SimpleHsl), nullptr}, + {"with simple CIELAB-based inversion", kForceDark_SimpleCielab, + std::size(kForceDark_SimpleCielab), nullptr}, + {"with simple RGB-based inversion", kForceDark_SimpleRgb, + std::size(kForceDark_SimpleRgb), nullptr}, + {"with selective image inversion", kForceDark_SelectiveImageInversion, + std::size(kForceDark_SelectiveImageInversion), nullptr}, + {"with selective inversion of non-image elements", + kForceDark_SelectiveElementInversion, + std::size(kForceDark_SelectiveElementInversion), nullptr}, + {"with selective inversion of everything", + kForceDark_SelectiveGeneralInversion, + std::size(kForceDark_SelectiveGeneralInversion), nullptr}, + {"with selective image inversion based on transparency and number of " + "colors", + kForceDark_TransparencyAndNumColors, + std::size(kForceDark_TransparencyAndNumColors), nullptr}}; +#endif // !BUILDFLAG(IS_CHROMEOS) + +const FeatureEntry::FeatureParam + kWebIdentityDigitalIdentityCredentialNoDialogParam[] = { + {"dialog", "no_dialog"}}; +const FeatureEntry::FeatureParam + kWebIdentityDigitalIdentityCredentialDefaultParam[] = { + {"dialog", "default"}}; +const FeatureEntry::FeatureParam + kWebIdentityDigitalIdentityCredentialLowRiskDialogParam[] = { + {"dialog", "low_risk"}}; +const FeatureEntry::FeatureParam + kWebIdentityDigitalIdentityCredentialHighRiskDialogParam[] = { + {"dialog", "high_risk"}}; +const FeatureEntry::FeatureVariation + kWebIdentityDigitalIdentityCredentialVariations[] = { + {"with dialog depending on what credentials are requested", + kWebIdentityDigitalIdentityCredentialDefaultParam, + std::size(kWebIdentityDigitalIdentityCredentialDefaultParam), nullptr}, + {"without dialog", kWebIdentityDigitalIdentityCredentialNoDialogParam, + std::size(kWebIdentityDigitalIdentityCredentialNoDialogParam), + nullptr}, + {"with confirmation dialog with mild warning before sending identity " + "request to Android OS", + kWebIdentityDigitalIdentityCredentialLowRiskDialogParam, + std::size(kWebIdentityDigitalIdentityCredentialLowRiskDialogParam), + nullptr}, + {"with confirmation dialog with severe warning before sending " + "identity request to Android OS", + kWebIdentityDigitalIdentityCredentialHighRiskDialogParam, + std::size(kWebIdentityDigitalIdentityCredentialHighRiskDialogParam), + nullptr}}; + +const FeatureEntry::FeatureParam kClipboardMaximumAge60Seconds[] = { + {"UIClipboardMaximumAge", "60"}}; +const FeatureEntry::FeatureParam kClipboardMaximumAge90Seconds[] = { + {"UIClipboardMaximumAge", "90"}}; +const FeatureEntry::FeatureParam kClipboardMaximumAge120Seconds[] = { + {"UIClipboardMaximumAge", "120"}}; +const FeatureEntry::FeatureParam kClipboardMaximumAge150Seconds[] = { + {"UIClipboardMaximumAge", "150"}}; +const FeatureEntry::FeatureParam kClipboardMaximumAge180Seconds[] = { + {"UIClipboardMaximumAge", "180"}}; + +const FeatureEntry::FeatureVariation kClipboardMaximumAgeVariations[] = { + {"Enabled 60 seconds", kClipboardMaximumAge60Seconds, + std::size(kClipboardMaximumAge60Seconds), nullptr}, + {"Enabled 90 seconds", kClipboardMaximumAge90Seconds, + std::size(kClipboardMaximumAge90Seconds), nullptr}, + {"Enabled 120 seconds", kClipboardMaximumAge120Seconds, + std::size(kClipboardMaximumAge120Seconds), nullptr}, + {"Enabled 150 seconds", kClipboardMaximumAge150Seconds, + std::size(kClipboardMaximumAge150Seconds), nullptr}, + {"Enabled 180 seconds", kClipboardMaximumAge180Seconds, + std::size(kClipboardMaximumAge180Seconds), nullptr}, +}; + +const FeatureEntry::FeatureParam kMBIModeLegacy[] = {{"mode", "legacy"}}; +const FeatureEntry::FeatureParam kMBIModeEnabledPerRenderProcessHost[] = { + {"mode", "per_render_process_host"}}; +const FeatureEntry::FeatureParam kMBIModeEnabledPerSiteInstance[] = { + {"mode", "per_site_instance"}}; + +const FeatureEntry::FeatureVariation kMBIModeVariations[] = { + {"legacy mode", kMBIModeLegacy, std::size(kMBIModeLegacy), nullptr}, + {"per render process host", kMBIModeEnabledPerRenderProcessHost, + std::size(kMBIModeEnabledPerRenderProcessHost), nullptr}, + {"per site instance", kMBIModeEnabledPerSiteInstance, + std::size(kMBIModeEnabledPerSiteInstance), nullptr}}; + +const FeatureEntry::FeatureParam kSearchPrefetchWithoutHoldback[] = { + {"prefetch_holdback", "false"}}; +const FeatureEntry::FeatureParam kSearchPrefetchWithHoldback[] = { + {"prefetch_holdback", "true"}}; + +const FeatureEntry::FeatureVariation + kSearchPrefetchServicePrefetchingVariations[] = { + {"without holdback", kSearchPrefetchWithoutHoldback, + std::size(kSearchPrefetchWithoutHoldback), nullptr}, + {"with holdback", kSearchPrefetchWithHoldback, + std::size(kSearchPrefetchWithHoldback), nullptr}}; + +#if BUILDFLAG(IS_CHROMEOS) +const FeatureEntry::FeatureParam kArcVmMemorySizeShift_200[] = { + {"shift_mib", "-200"}}; +const FeatureEntry::FeatureParam kArcVmMemorySizeShift_500[] = { + {"shift_mib", "-500"}}; +const FeatureEntry::FeatureParam kArcVmMemorySizeShift_800[] = { + {"shift_mib", "-800"}}; + +const FeatureEntry::FeatureVariation kArcVmMemorySizeVariations[] = { + {"shift -200MiB", kArcVmMemorySizeShift_200, + std::size(kArcVmMemorySizeShift_200), nullptr}, + {"shift -500MiB", kArcVmMemorySizeShift_500, + std::size(kArcVmMemorySizeShift_500), nullptr}, + {"shift -800MiB", kArcVmMemorySizeShift_800, + std::size(kArcVmMemorySizeShift_800), nullptr}, +}; +#endif // BUILDFLAG(IS_CHROMEOS) + +const FeatureEntry::Choice kEnableGpuRasterizationChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flags_ui::kGenericExperimentChoiceEnabled, + switches::kEnableGpuRasterization, ""}, + {flags_ui::kGenericExperimentChoiceDisabled, + switches::kDisableGpuRasterization, ""}, +}; + +const FeatureEntry::FeatureParam kEnableLazyLoadImageForAllInvisiblePage[] = { + {"enabled_page_type", "all_invisible_page"}}; +const FeatureEntry::FeatureParam kEnableLazyLoadImageForPrerenderPage[] = { + {"enabled_page_type", "prerender_page"}}; + +const FeatureEntry::FeatureVariation + kSearchSuggsetionPrerenderTypeVariations[] = { + {"for all invisible page", kEnableLazyLoadImageForAllInvisiblePage, + std::size(kEnableLazyLoadImageForAllInvisiblePage), nullptr}, + {"for prerendering page", kEnableLazyLoadImageForPrerenderPage, + std::size(kEnableLazyLoadImageForPrerenderPage), nullptr}}; + +const FeatureEntry::FeatureParam kSoftNavigationHeuristicsBasic[] = { + {"mode", "basic"}}; +const FeatureEntry::FeatureParam + kSoftNavigationHeuristicsAdvancedPaintAttribution[] = { + {"mode", "advanced_paint_attribution"}}; +const FeatureEntry::FeatureParam + kSoftNavigationHeuristicsPrePaintBasedAttribution[] = { + {"mode", "pre_paint_based_attribution"}}; + +const FeatureEntry::FeatureVariation kSoftNavigationHeuristicsVariations[] = { + {"Basic (default)", kSoftNavigationHeuristicsBasic, + std::size(kSoftNavigationHeuristicsBasic), nullptr}, + {"Advanced Paint Attribution (Lazy Uncached Paint Walk)", + kSoftNavigationHeuristicsAdvancedPaintAttribution, + std::size(kSoftNavigationHeuristicsAdvancedPaintAttribution), nullptr}, + {"Advanced Paint Attribution (Eager Cached Pre-Paint Walk)", + kSoftNavigationHeuristicsPrePaintBasedAttribution, + std::size(kSoftNavigationHeuristicsPrePaintBasedAttribution), nullptr}}; + +const FeatureEntry::Choice kTopChromeTouchUiChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flags_ui::kGenericExperimentChoiceAutomatic, switches::kTopChromeTouchUi, + switches::kTopChromeTouchUiAuto}, + {flags_ui::kGenericExperimentChoiceDisabled, switches::kTopChromeTouchUi, + switches::kTopChromeTouchUiDisabled}, + {flags_ui::kGenericExperimentChoiceEnabled, switches::kTopChromeTouchUi, + switches::kTopChromeTouchUiEnabled}}; + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kCctSignInPromptAlways[] = { + {"cadence_day", "0"}, + {"show_limit", "10000"}, + {"user_act_count", "10000"}, + {"if_allowed_by_embedder", "true"}, + {"if_enabled_by_embedder", "true"}}; +const FeatureEntry::FeatureParam kCctSignInTestOnly[] = { + {"cadence_day", "0"}, + {"show_limit", "4"}, + {"user_act_count", "2"}, + {"if_allowed_by_embedder", "true"}, + {"if_enabled_by_embedder", "true"}}; + +const FeatureEntry::FeatureVariation kCctSignInPromptVariations[] = { + {"always show", kCctSignInPromptAlways, std::size(kCctSignInPromptAlways), + nullptr}, + {"for test", kCctSignInTestOnly, std::size(kCctSignInTestOnly), nullptr}}; +#endif + +#if BUILDFLAG(IS_CHROMEOS) + +const FeatureEntry::FeatureParam kZinkEnableRecommended[] = { + {"BorealisZinkGlDriverParam", "ZinkEnableRecommended"}}; +const FeatureEntry::FeatureParam kZinkEnableAll[] = { + {"BorealisZinkGlDriverParam", "ZinkEnableAll"}}; + +const FeatureEntry::FeatureVariation kBorealisZinkGlDriverVariations[] = { + {"for recommended apps", kZinkEnableRecommended, + std::size(kZinkEnableRecommended), nullptr}, + {"for all apps", kZinkEnableAll, std::size(kZinkEnableAll), nullptr}}; + +const char kArcEnableVirtioBlkForDataInternalName[] = + "arc-enable-virtio-blk-for-data"; + +const char kProjectorServerSideSpeechRecognition[] = + "enable-projector-server-side-speech-recognition"; + +const char kArcEnableAttestationFlag[] = "arc-enable-attestation"; + +#endif // BUILDFLAG(IS_CHROMEOS) + +const FeatureEntry::Choice kForceUIDirectionChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kForceDirectionLtr, switches::kForceUIDirection, + switches::kForceDirectionLTR}, + {flag_descriptions::kForceDirectionRtl, switches::kForceUIDirection, + switches::kForceDirectionRTL}, +}; + +const FeatureEntry::Choice kForceTextDirectionChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kForceDirectionLtr, switches::kForceTextDirection, + switches::kForceDirectionLTR}, + {flag_descriptions::kForceDirectionRtl, switches::kForceTextDirection, + switches::kForceDirectionRTL}, +}; + +const FeatureEntry::Choice kIpProtectionProxyOptOutChoices[] = { + {flag_descriptions::kIpProtectionProxyOptOutChoiceDefault, "", ""}, + {flag_descriptions::kIpProtectionProxyOptOutChoiceOptOut, + switches::kDisableIpProtectionProxy, ""}, +}; + +#if BUILDFLAG(IS_CHROMEOS) +const FeatureEntry::Choice kSchedulerConfigurationChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kSchedulerConfigurationConservative, + ash::switches::kSchedulerConfiguration, + ash::switches::kSchedulerConfigurationConservative}, + {flag_descriptions::kSchedulerConfigurationPerformance, + ash::switches::kSchedulerConfiguration, + ash::switches::kSchedulerConfigurationPerformance}, +}; + +const FeatureEntry::FeatureParam kDynamicSearchUpdateAnimationDuration_50[] = { + {"search_result_translation_duration", "50"}}; +const FeatureEntry::FeatureParam kDynamicSearchUpdateAnimationDuration_100[] = { + {"search_result_translation_duration", "100"}}; +const FeatureEntry::FeatureParam kDynamicSearchUpdateAnimationDuration_150[] = { + {"search_result_translation_duration", "150"}}; + +const FeatureEntry::FeatureVariation kDynamicSearchUpdateAnimationVariations[] = + {{"50ms", kDynamicSearchUpdateAnimationDuration_50, + std::size(kDynamicSearchUpdateAnimationDuration_50), nullptr}, + {"100ms", kDynamicSearchUpdateAnimationDuration_100, + std::size(kDynamicSearchUpdateAnimationDuration_100), nullptr}, + {"150ms", kDynamicSearchUpdateAnimationDuration_150, + std::size(kDynamicSearchUpdateAnimationDuration_150), nullptr}}; +#endif // BUILDFLAG(IS_CHROMEOS) + +const FeatureEntry::Choice kSiteIsolationOptOutChoices[] = { + {flag_descriptions::kSiteIsolationOptOutChoiceDefault, "", ""}, + {flag_descriptions::kSiteIsolationOptOutChoiceOptOut, + switches::kDisableSiteIsolation, ""}, +}; + +const FeatureEntry::Choice kForceColorProfileChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kForceColorProfileSRGB, + switches::kForceDisplayColorProfile, "srgb"}, + {flag_descriptions::kForceColorProfileP3, + switches::kForceDisplayColorProfile, "display-p3-d65"}, + {flag_descriptions::kForceColorProfileRec2020, + switches::kForceDisplayColorProfile, "rec2020"}, + {flag_descriptions::kForceColorProfileColorSpin, + switches::kForceDisplayColorProfile, "color-spin-gamma24"}, + {flag_descriptions::kForceColorProfileSCRGBLinear, + switches::kForceDisplayColorProfile, "scrgb-linear"}, + {flag_descriptions::kForceColorProfileHDR10, + switches::kForceDisplayColorProfile, "hdr10"}, +}; + +const FeatureEntry::Choice kMemlogModeChoices[] = { + {flags_ui::kGenericExperimentChoiceDisabled, "", ""}, + {flag_descriptions::kMemlogModeMinimal, heap_profiling::kMemlogMode, + heap_profiling::kMemlogModeMinimal}, + {flag_descriptions::kMemlogModeAll, heap_profiling::kMemlogMode, + heap_profiling::kMemlogModeAll}, + {flag_descriptions::kMemlogModeBrowser, heap_profiling::kMemlogMode, + heap_profiling::kMemlogModeBrowser}, + {flag_descriptions::kMemlogModeGpu, heap_profiling::kMemlogMode, + heap_profiling::kMemlogModeGpu}, + {flag_descriptions::kMemlogModeAllRenderers, heap_profiling::kMemlogMode, + heap_profiling::kMemlogModeAllRenderers}, + {flag_descriptions::kMemlogModeRendererSampling, + heap_profiling::kMemlogMode, heap_profiling::kMemlogModeRendererSampling}, + {flag_descriptions::kMemlogModeUtilitySampling, heap_profiling::kMemlogMode, + heap_profiling::kMemlogModeUtilitySampling}, + {flag_descriptions::kMemlogModeAllUtilities, heap_profiling::kMemlogMode, + heap_profiling::kMemlogModeAllUtilities}, +}; + +const FeatureEntry::Choice kMemlogStackModeChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kMemlogStackModeNative, + heap_profiling::kMemlogStackMode, heap_profiling::kMemlogStackModeNative}, + {flag_descriptions::kMemlogStackModeNativeWithThreadNames, + heap_profiling::kMemlogStackMode, + heap_profiling::kMemlogStackModeNativeWithThreadNames}, +}; + +const FeatureEntry::Choice kMemlogSamplingRateChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kMemlogSamplingRate10KB, + heap_profiling::kMemlogSamplingRate, + heap_profiling::kMemlogSamplingRate10KB}, + {flag_descriptions::kMemlogSamplingRate50KB, + heap_profiling::kMemlogSamplingRate, + heap_profiling::kMemlogSamplingRate50KB}, + {flag_descriptions::kMemlogSamplingRate100KB, + heap_profiling::kMemlogSamplingRate, + heap_profiling::kMemlogSamplingRate100KB}, + {flag_descriptions::kMemlogSamplingRate500KB, + heap_profiling::kMemlogSamplingRate, + heap_profiling::kMemlogSamplingRate500KB}, + {flag_descriptions::kMemlogSamplingRate1MB, + heap_profiling::kMemlogSamplingRate, + heap_profiling::kMemlogSamplingRate1MB}, + {flag_descriptions::kMemlogSamplingRate5MB, + heap_profiling::kMemlogSamplingRate, + heap_profiling::kMemlogSamplingRate5MB}, +}; + +const FeatureEntry::FeatureParam + kOptimizationGuideOnDeviceModelBypassPerfParams[] = { + {"compatible_on_device_performance_classes", "*"}, +}; +const FeatureEntry::FeatureVariation + kOptimizationGuideOnDeviceModelVariations[] = { + {"BypassPerfRequirement", + kOptimizationGuideOnDeviceModelBypassPerfParams, + std::size(kOptimizationGuideOnDeviceModelBypassPerfParams), nullptr}, +}; + +const FeatureEntry::FeatureParam kTextSafetyClassifierNoRetractParams[] = { + {"on_device_retract_unsafe_content", "false"}, +}; +const FeatureEntry::FeatureVariation kTextSafetyClassifierVariations[] = { + {"Executes safety classifier but no retraction of output", + kTextSafetyClassifierNoRetractParams, + std::size(kTextSafetyClassifierNoRetractParams), nullptr}, +}; + +const FeatureEntry::FeatureParam kPageActionsMigrationParams[] = { + {"autofill_address", "true"}, + {"discounts", "true"}, + {"file_system_access", "true"}, + {"find", "true"}, + {"intent_picker", "true"}, + {"lens_overlay", "true"}, + {"manage_passwords", "true"}, + {"mandatory_reauth", "true"}, + {"memory_saver", "true"}, + {"offer_notification", "true"}, + {"price_insights", "true"}, + {"price_tracking", "true"}, + {"pwa_install", "true"}, + {"translate", "true"}, + {"zoom", "true"}, +}; +const FeatureEntry::FeatureVariation kPageActionsMigrationVariations[] = { + {"with all migrated page actions enabled", kPageActionsMigrationParams, + std::size(kPageActionsMigrationParams), nullptr}, +}; + +const FeatureEntry::FeatureParam kPageContentAnnotationsContentParams[] = { + {"annotate_title_instead_of_page_content", "false"}, + {"extract_related_searches", "true"}, + {"max_size_for_text_dump_in_bytes", "5120"}, + {"write_to_history_service", "true"}, +}; +const FeatureEntry::FeatureParam kPageContentAnnotationsTitleParams[] = { + {"annotate_title_instead_of_page_content", "true"}, + {"extract_related_searches", "true"}, + {"write_to_history_service", "true"}, +}; +const FeatureEntry::FeatureParam + kPageContentAnnotationsTimeoutDurationParams[] = { + {"PageContentAnnotationBatchSizeTimeoutDuration", "0"}, +}; +const FeatureEntry::FeatureVariation kPageContentAnnotationsVariations[] = { + {"All Annotations and Persistence on Content", + kPageContentAnnotationsContentParams, + std::size(kPageContentAnnotationsContentParams), nullptr}, + {"All Annotations and Persistence on Title", + kPageContentAnnotationsTitleParams, + std::size(kPageContentAnnotationsTitleParams), nullptr}, + {"Annotation timeout duration 0 seconds", + kPageContentAnnotationsTimeoutDurationParams, + std::size(kPageContentAnnotationsTimeoutDurationParams), nullptr}}; + +#if !BUILDFLAG(IS_ANDROID) +constexpr FeatureEntry::FeatureParam + kHappinessTrackingSurveysForDesktopDemoWithoutAutoPrompt[] = { + {"auto_prompt", "false"}}; +constexpr FeatureEntry::FeatureVariation + kHappinessTrackingSurveysForDesktopDemoVariations[] = { + {"without Auto Prompt", + kHappinessTrackingSurveysForDesktopDemoWithoutAutoPrompt, + std::size(kHappinessTrackingSurveysForDesktopDemoWithoutAutoPrompt), + nullptr}}; +#endif // !BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam kJourneysShowAllVisitsParams[] = { + {"JourneysLocaleOrLanguageAllowlist", "*"}, + // To show all visits, set the number of visits above the fold to a very + // high number. + {"JourneysNumVisitsToAlwaysShowAboveTheFold", "200"}, +}; +const FeatureEntry::FeatureParam kJourneysAllLocalesParams[] = { + {"JourneysLocaleOrLanguageAllowlist", "*"}, +}; +const FeatureEntry::FeatureVariation kJourneysVariations[] = { + {"No 'Show More' - Show all visits", kJourneysShowAllVisitsParams, + std::size(kJourneysShowAllVisitsParams), nullptr}, + {"All Supported Locales", kJourneysAllLocalesParams, + std::size(kJourneysAllLocalesParams), nullptr}, +}; + +const FeatureEntry::FeatureVariation + kImageServiceOptimizationGuideSalientImagesVariations[] = { + {"High Performance Canonicalization", nullptr, 0, "3362133"}, +}; + +const FeatureEntry::FeatureVariation kRemotePageMetadataVariations[] = { + {"High Performance Canonicalization", nullptr, 0, "3362133"}, +}; + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \ + BUILDFLAG(IS_WIN) + +// A limited number of combinations of the rich autocompletion params. +const FeatureEntry::FeatureParam kOmniboxRichAutocompletionAggressive1[] = { + {"RichAutocompletionAutocompleteTitlesMinChar", "1"}, + {"RichAutocompletionAutocompleteShortcutTextMinChar", "1"}}; +const FeatureEntry::FeatureParam kOmniboxRichAutocompletionAggressive2[] = { + {"RichAutocompletionAutocompleteTitlesMinChar", "2"}, + {"RichAutocompletionAutocompleteShortcutTextMinChar", "2"}}; +const FeatureEntry::FeatureParam kOmniboxRichAutocompletionAggressive3[] = { + {"RichAutocompletionAutocompleteTitlesMinChar", "3"}, + {"RichAutocompletionAutocompleteShortcutTextMinChar", "3"}}; +const FeatureEntry::FeatureParam kOmniboxRichAutocompletionAggressive4[] = { + {"RichAutocompletionAutocompleteTitlesMinChar", "4"}, + {"RichAutocompletionAutocompleteShortcutTextMinChar", "4"}}; + +const FeatureEntry::FeatureVariation + kOmniboxRichAutocompletionPromisingVariations[] = { + {"Min input length 1 characters", kOmniboxRichAutocompletionAggressive1, + std::size(kOmniboxRichAutocompletionAggressive1), nullptr}, + {"Min input length 2 characters", kOmniboxRichAutocompletionAggressive2, + std::size(kOmniboxRichAutocompletionAggressive2), nullptr}, + {"Min input length 2 characters", kOmniboxRichAutocompletionAggressive2, + std::size(kOmniboxRichAutocompletionAggressive2), nullptr}, + {"Min input length 3 characters", kOmniboxRichAutocompletionAggressive3, + std::size(kOmniboxRichAutocompletionAggressive3), nullptr}, + {"Min input length 4 characters", kOmniboxRichAutocompletionAggressive4, + std::size(kOmniboxRichAutocompletionAggressive4), nullptr}, +}; + +const FeatureEntry::FeatureParam kOmniboxStarterPackExpansionPreProdUrl[] = { + {"StarterPackGeminiUrlOverride", "https://gemini.google.com/corp/prompt"}}; +const FeatureEntry::FeatureParam kOmniboxStarterPackExpansionStagingUrl[] = { + {"StarterPackGeminiUrlOverride", + "https://gemini.google.com/staging/prompt"}}; +const FeatureEntry::FeatureVariation kOmniboxStarterPackExpansionVariations[] = + {{"pre-prod url", kOmniboxStarterPackExpansionPreProdUrl, + std::size(kOmniboxStarterPackExpansionPreProdUrl), nullptr}, + {"staging url", kOmniboxStarterPackExpansionStagingUrl, + std::size(kOmniboxStarterPackExpansionStagingUrl), nullptr}}; + +const FeatureEntry::FeatureParam kOmniboxSearchAggregatorProdParams[] = { + {"name", "Agentspace"}, + {"shortcut", "agentspace"}, + {"search_url", + "https://vertexaisearch.cloud.google.com/home/cid/" + "8884f744-aae1-4fbc-8a64-b8bf7cbf270e?q={searchTerms}"}, + {"suggest_url", + "https://discoveryengine.googleapis.com/v1alpha/projects/862721868538/" + "locations/global/collections/default_collection/engines/" + "teamfood-v11_1720671063545/completionConfig:completeQuery"}}; +const FeatureEntry::FeatureParam kOmniboxSearchAggregatorStagingParams[] = { + {"name", "Agentspace (staging)"}, + {"shortcut", "agentspace"}, + {"icon_url", "https://gstatic.com/vertexaisearch/favicon.png"}, + {"search_url", + "https://vertexaisearch.cloud.google.com/home/cid/" + "3abd7045-7845-4f83-b204-e39fcbca3494?q={searchTerms}&mods=widget_staging_" + "api_mod"}, + {"suggest_url", + "https://staging-discoveryengine.sandbox.googleapis.com/v1alpha/projects/" + "862721868538/locations/global/collections/default_collection/engines/" + "teamfood-v11/completionConfig:completeQuery"}}; +const FeatureEntry::FeatureParam kOmniboxSearchAggregatorDemoParams[] = { + {"name", "Neuravibe"}, + {"shortcut", "neura"}, + {"icon_url", "https://gstatic.com/vertexaisearch/favicon.png"}, + {"search_url", + "https://vertexaisearch.cloud.google.com/home/cid/" + "8e21c7cd-cbfe-4162-baf4-3381fc43546e?q={searchTerms}"}, + {"suggest_url", + "https://discoveryengine.googleapis.com/v1alpha/projects/977834784893/" + "locations/global/collections/default_collection/engines/" + "neuravibeenterprisesearch_1732204320742/completionConfig:completeQuery"}}; +const FeatureEntry::FeatureVariation kOmniboxSearchAggregatorVariations[] = { + {"prod", kOmniboxSearchAggregatorProdParams, + std::size(kOmniboxSearchAggregatorProdParams), nullptr}, + {"staging", kOmniboxSearchAggregatorStagingParams, + std::size(kOmniboxSearchAggregatorStagingParams), nullptr}, + {"demo", kOmniboxSearchAggregatorDemoParams, + std::size(kOmniboxSearchAggregatorDemoParams), nullptr}}; + +const FeatureEntry::FeatureParam kOmniboxUrlSuggestionsOnFocusTwoDayWindow[] = { + {"OnFocusMostVisitedRecencyWindow", "1"}, +}; +const FeatureEntry::FeatureParam kOmniboxUrlSuggestionsOnFocusThreeDayWindow[] = + { + {"OnFocusMostVisitedRecencyWindow", "2"}, +}; +const FeatureEntry::FeatureParam kOmniboxUrlSuggestionsOnFocusOneWeekWindow[] = + { + {"OnFocusMostVisitedRecencyWindow", "6"}, +}; +const FeatureEntry::FeatureParam kOmniboxUrlSuggestionsOnFocusTwoWeekWindow[] = + { + {"OnFocusMostVisitedRecencyWindow", "13"}, +}; +const FeatureEntry::FeatureVariation kOmniboxUrlSuggestionsOnFocusVariations[] = + { + {"- Two day window", kOmniboxUrlSuggestionsOnFocusTwoDayWindow, + std::size(kOmniboxUrlSuggestionsOnFocusTwoDayWindow), nullptr}, + {"- Three day window", kOmniboxUrlSuggestionsOnFocusThreeDayWindow, + std::size(kOmniboxUrlSuggestionsOnFocusThreeDayWindow), nullptr}, + {"- One week window", kOmniboxUrlSuggestionsOnFocusOneWeekWindow, + std::size(kOmniboxUrlSuggestionsOnFocusOneWeekWindow), nullptr}, + {"- Two week window", kOmniboxUrlSuggestionsOnFocusTwoWeekWindow, + std::size(kOmniboxUrlSuggestionsOnFocusTwoWeekWindow), nullptr}, +}; + +const FeatureEntry::FeatureParam kOmniboxZpsSuggestionLimitMax8[] = { + {"OmniboxZpsMaxSuggestions", "8"}, + {"OmniboxZpsMaxSearchSuggestions", "4"}, + {"OmniboxZpsMaxUrlSuggestions", "4"}, +}; +const FeatureEntry::FeatureParam kOmniboxZpsSuggestionLimitMax4[] = { + {"OmniboxZpsMaxSuggestions", "4"}, + {"OmniboxZpsMaxSearchSuggestions", "2"}, + {"OmniboxZpsMaxUrlSuggestions", "2"}, +}; +const FeatureEntry::FeatureParam kOmniboxZpsSuggestionLimitMax2TwoZero[] = { + {"OmniboxZpsMaxSuggestions", "2"}, + {"OmniboxZpsMaxSearchSuggestions", "2"}, + {"OmniboxZpsMaxUrlSuggestions", "0"}, +}; +const FeatureEntry::FeatureParam kOmniboxZpsSuggestionLimitMax3ThreeZero[] = { + {"OmniboxZpsMaxSuggestions", "3"}, + {"OmniboxZpsMaxSearchSuggestions", "3"}, + {"OmniboxZpsMaxUrlSuggestions", "0"}, +}; +const FeatureEntry::FeatureParam kOmniboxZpsSuggestionLimitMax4FourZero[] = { + {"OmniboxZpsMaxSuggestions", "4"}, + {"OmniboxZpsMaxSearchSuggestions", "4"}, + {"OmniboxZpsMaxUrlSuggestions", "0"}, +}; +const FeatureEntry::FeatureParam kOmniboxZpsSuggestionLimitMax5FourOne[] = { + {"OmniboxZpsMaxSuggestions", "5"}, + {"OmniboxZpsMaxSearchSuggestions", "4"}, + {"OmniboxZpsMaxUrlSuggestions", "1"}, +}; +const FeatureEntry::FeatureParam kOmniboxZpsSuggestionLimitMax5ThreeTwo[] = { + {"OmniboxZpsMaxSuggestions", "5"}, + {"OmniboxZpsMaxSearchSuggestions", "3"}, + {"OmniboxZpsMaxUrlSuggestions", "2"}, +}; +const FeatureEntry::FeatureVariation kOmniboxZpsSuggestionLimitVariations[] = { + {"- Max 8 Suggestions (4 search, 4 url)", kOmniboxZpsSuggestionLimitMax8, + std::size(kOmniboxZpsSuggestionLimitMax8), nullptr}, + {"- Max 4 Suggestions (2 search, 2 url)", kOmniboxZpsSuggestionLimitMax4, + std::size(kOmniboxZpsSuggestionLimitMax4), nullptr}, + {"- Max 2 Suggestions (2 search, 0 url)", + kOmniboxZpsSuggestionLimitMax2TwoZero, + std::size(kOmniboxZpsSuggestionLimitMax2TwoZero), nullptr}, + {"- Max 3 Suggestions (3 search, 0 url)", + kOmniboxZpsSuggestionLimitMax3ThreeZero, + std::size(kOmniboxZpsSuggestionLimitMax3ThreeZero), nullptr}, + {"- Max 4 Suggestions (4 search, 0 url)", + kOmniboxZpsSuggestionLimitMax4FourZero, + std::size(kOmniboxZpsSuggestionLimitMax4FourZero), nullptr}, + {"- Max 5 Suggestions (4 search, 1 url)", + kOmniboxZpsSuggestionLimitMax5FourOne, + std::size(kOmniboxZpsSuggestionLimitMax5FourOne), nullptr}, + {"- Max 5 Suggestions (3 search, 2 url)", + kOmniboxZpsSuggestionLimitMax5ThreeTwo, + std::size(kOmniboxZpsSuggestionLimitMax5ThreeTwo), nullptr}, +}; + +const FeatureEntry::FeatureParam + kOmniboxContextualSearchOnFocusSuggestionsLimit0[] = { + {"Limit", "0"}, +}; +const FeatureEntry::FeatureParam + kOmniboxContextualSearchOnFocusSuggestionsLimit1[] = { + {"Limit", "1"}, +}; +const FeatureEntry::FeatureParam + kOmniboxContextualSearchOnFocusSuggestionsLimit2[] = { + {"Limit", "2"}, +}; +const FeatureEntry::FeatureParam + kOmniboxContextualSearchOnFocusSuggestionsLimit3[] = { + {"Limit", "3"}, +}; +const FeatureEntry::FeatureParam + kOmniboxContextualSearchOnFocusSuggestionsLimit4[] = { + {"Limit", "4"}, +}; +const FeatureEntry::FeatureVariation + kOmniboxContextualSearchOnFocusSuggestionsVariations[] = { + {"- Limit 0", kOmniboxContextualSearchOnFocusSuggestionsLimit0, + std::size(kOmniboxContextualSearchOnFocusSuggestionsLimit0), nullptr}, + {"- Limit 1", kOmniboxContextualSearchOnFocusSuggestionsLimit1, + std::size(kOmniboxContextualSearchOnFocusSuggestionsLimit1), nullptr}, + {"- Limit 2", kOmniboxContextualSearchOnFocusSuggestionsLimit2, + std::size(kOmniboxContextualSearchOnFocusSuggestionsLimit2), nullptr}, + {"- Limit 3", kOmniboxContextualSearchOnFocusSuggestionsLimit3, + std::size(kOmniboxContextualSearchOnFocusSuggestionsLimit3), nullptr}, + {"- Limit 4", kOmniboxContextualSearchOnFocusSuggestionsLimit4, + std::size(kOmniboxContextualSearchOnFocusSuggestionsLimit4), nullptr}, +}; + +const FeatureEntry::FeatureParam + kContextualSuggestionsAblateOthersWhenPresentAblateAll[] = { + {"AblateSearchOnly", "false"}, +}; + +const FeatureEntry::FeatureParam + kContextualSuggestionsAblateOthersWhenPresentAblateSearchOnly[] = { + {"AblateSearchOnly", "true"}, +}; + +const FeatureEntry::FeatureParam + kContextualSuggestionsAblateOthersWhenPresentAblateUrlOnly[] = { + {"AblateUrlOnly", "true"}, +}; + +const FeatureEntry::FeatureVariation + kContextualSuggestionsAblateOthersWhenPresentVariations[] = { + {"- Ablate all", kContextualSuggestionsAblateOthersWhenPresentAblateAll, + std::size(kContextualSuggestionsAblateOthersWhenPresentAblateAll), + nullptr}, + {"- Ablate search only", + kContextualSuggestionsAblateOthersWhenPresentAblateSearchOnly, + std::size( + kContextualSuggestionsAblateOthersWhenPresentAblateSearchOnly), + nullptr}, + {"- Ablate URL only", + kContextualSuggestionsAblateOthersWhenPresentAblateUrlOnly, + std::size(kContextualSuggestionsAblateOthersWhenPresentAblateUrlOnly), + nullptr}, +}; + +const FeatureEntry::FeatureParam kOmniboxToolbeltLensActionsZeroInputs[] = { + {"KeepToolbeltAfterInput", "false"}, + {"ShowLensActionOnNonNtp", "true"}, + {"ShowLensActionOnNtp", "false"}, + {"ShowAiModeActionOnNonNtp", "false"}, + {"ShowAiModeActionOnNtp", "false"}, + {"ShowHistoryActionOnNonNtp", "true"}, + {"ShowHistoryActionOnNtp", "true"}, + {"ShowBookmarksActionOnNonNtp", "true"}, + {"ShowBookmarksActionOnNtp", "true"}, + {"ShowTabsActionOnNonNtp", "true"}, + {"ShowTabsActionOnNtp", "true"}, +}; +const FeatureEntry::FeatureParam kOmniboxToolbeltLensActionsZeroTypedInputs[] = + { + {"KeepToolbeltAfterInput", "true"}, + {"ShowLensActionOnNonNtp", "true"}, + {"ShowLensActionOnNtp", "false"}, + {"ShowAiModeActionOnNonNtp", "false"}, + {"ShowAiModeActionOnNtp", "false"}, + {"ShowHistoryActionOnNonNtp", "true"}, + {"ShowHistoryActionOnNtp", "true"}, + {"ShowBookmarksActionOnNonNtp", "true"}, + {"ShowBookmarksActionOnNtp", "true"}, + {"ShowTabsActionOnNonNtp", "true"}, + {"ShowTabsActionOnNtp", "true"}, +}; +const FeatureEntry::FeatureParam kOmniboxToolbeltAiActionsZeroInputs[] = { + {"KeepToolbeltAfterInput", "false"}, + {"ShowLensActionOnNonNtp", "false"}, + {"ShowLensActionOnNtp", "false"}, + {"ShowAiModeActionOnNonNtp", "true"}, + {"ShowAiModeActionOnNtp", "true"}, + {"ShowHistoryActionOnNonNtp", "true"}, + {"ShowHistoryActionOnNtp", "true"}, + {"ShowBookmarksActionOnNonNtp", "true"}, + {"ShowBookmarksActionOnNtp", "true"}, + {"ShowTabsActionOnNonNtp", "true"}, + {"ShowTabsActionOnNtp", "true"}, +}; +const FeatureEntry::FeatureParam kOmniboxToolbeltAiActionsZeroTypedInputs[] = { + {"KeepToolbeltAfterInput", "true"}, + {"ShowLensActionOnNonNtp", "false"}, + {"ShowLensActionOnNtp", "false"}, + {"ShowAiModeActionOnNonNtp", "true"}, + {"ShowAiModeActionOnNtp", "true"}, + {"ShowHistoryActionOnNonNtp", "true"}, + {"ShowHistoryActionOnNtp", "true"}, + {"ShowBookmarksActionOnNonNtp", "true"}, + {"ShowBookmarksActionOnNtp", "true"}, + {"ShowTabsActionOnNonNtp", "true"}, + {"ShowTabsActionOnNtp", "true"}, +}; +const FeatureEntry::FeatureParam kOmniboxToolbeltLensAiActionsZeroInputs[] = { + {"KeepToolbeltAfterInput", "false"}, + {"ShowLensActionOnNonNtp", "true"}, + {"ShowLensActionOnNtp", "false"}, + {"ShowAiModeActionOnNonNtp", "true"}, + {"ShowAiModeActionOnNtp", "true"}, + {"ShowHistoryActionOnNonNtp", "true"}, + {"ShowHistoryActionOnNtp", "true"}, + {"ShowBookmarksActionOnNonNtp", "true"}, + {"ShowBookmarksActionOnNtp", "true"}, + {"ShowTabsActionOnNonNtp", "false"}, + {"ShowTabsActionOnNtp", "false"}, +}; +const FeatureEntry::FeatureParam + kOmniboxToolbeltLensAiActionsZeroTypedInputs[] = { + {"KeepToolbeltAfterInput", "true"}, + {"ShowLensActionOnNonNtp", "true"}, + {"ShowLensActionOnNtp", "false"}, + {"ShowAiModeActionOnNonNtp", "true"}, + {"ShowAiModeActionOnNtp", "true"}, + {"ShowHistoryActionOnNonNtp", "true"}, + {"ShowHistoryActionOnNtp", "true"}, + {"ShowBookmarksActionOnNonNtp", "true"}, + {"ShowBookmarksActionOnNtp", "true"}, + {"ShowTabsActionOnNonNtp", "false"}, + {"ShowTabsActionOnNtp", "false"}, +}; +const FeatureEntry::FeatureParam kOmniboxToolbeltAllActionsZeroInputs[] = { + {"KeepToolbeltAfterInput", "false"}, + {"ShowLensActionOnNonNtp", "true"}, + {"ShowLensActionOnNtp", "true"}, + {"ShowAiModeActionOnNonNtp", "true"}, + {"ShowAiModeActionOnNtp", "true"}, + {"ShowHistoryActionOnNonNtp", "true"}, + {"ShowHistoryActionOnNtp", "true"}, + {"ShowBookmarksActionOnNonNtp", "true"}, + {"ShowBookmarksActionOnNtp", "true"}, + {"ShowTabsActionOnNonNtp", "true"}, + {"ShowTabsActionOnNtp", "true"}, +}; +const FeatureEntry::FeatureParam kOmniboxToolbeltAllActionsZeroTypedInputs[] = { + {"KeepToolbeltAfterInput", "true"}, + {"ShowLensActionOnNonNtp", "true"}, + {"ShowLensActionOnNtp", "true"}, + {"ShowAiModeActionOnNonNtp", "true"}, + {"ShowAiModeActionOnNtp", "true"}, + {"ShowHistoryActionOnNonNtp", "true"}, + {"ShowHistoryActionOnNtp", "true"}, + {"ShowBookmarksActionOnNonNtp", "true"}, + {"ShowBookmarksActionOnNtp", "true"}, + {"ShowTabsActionOnNonNtp", "true"}, + {"ShowTabsActionOnNtp", "true"}, +}; +const FeatureEntry::FeatureVariation kOmniboxToolbeltVariations[] = { + {"1 - Lens Action - Zero Inputs (Default)", + kOmniboxToolbeltLensActionsZeroInputs, + std::size(kOmniboxToolbeltLensActionsZeroInputs), nullptr}, + {"2 - Lens Action - Zero + Typed Inputs", + kOmniboxToolbeltLensActionsZeroTypedInputs, + std::size(kOmniboxToolbeltLensActionsZeroTypedInputs), nullptr}, + {"3 - AI Action - Zero Inputs", kOmniboxToolbeltAiActionsZeroInputs, + std::size(kOmniboxToolbeltAiActionsZeroInputs), nullptr}, + {"4 - AI Action - Zero + Typed Inputs", + kOmniboxToolbeltAiActionsZeroTypedInputs, + std::size(kOmniboxToolbeltAiActionsZeroTypedInputs), nullptr}, + {"5 - Lens + AI Actions - Zero Inputs", + kOmniboxToolbeltLensAiActionsZeroInputs, + std::size(kOmniboxToolbeltLensAiActionsZeroInputs), nullptr}, + {"6 - Lens + AI Actions - Zero + Typed Inputs", + kOmniboxToolbeltLensAiActionsZeroTypedInputs, + std::size(kOmniboxToolbeltLensAiActionsZeroTypedInputs), nullptr}, + {"7 - All Actions - Zero Inputs", kOmniboxToolbeltAllActionsZeroInputs, + std::size(kOmniboxToolbeltAllActionsZeroInputs), nullptr}, + {"8 - All Actions - Zero + Typed Inputs", + kOmniboxToolbeltAllActionsZeroTypedInputs, + std::size(kOmniboxToolbeltAllActionsZeroTypedInputs), nullptr}, +}; + +const FeatureEntry::FeatureParam kComposeboxShowZps[] = { + {"ShowComposeboxZps", "true"}, +}; +const FeatureEntry::FeatureParam kComposeboxShowTypedSuggestAndZps[] = { + {"ShowComposeboxZps", "true"}, + {"ShowComposeboxTypedSuggest", "true"}, +}; +const FeatureEntry::FeatureParam kComposeboxNoClickOutsideClosure[] = { + {"ConfigParam", "EgIQAA=="}, +}; +const FeatureEntry::FeatureParam kComposeboxNoEscClosure[] = { + {"ConfigParam", "EgIIAA=="}, +}; +const FeatureEntry::FeatureParam kComposeboxShowContextMenu[] = { + {"ShowContextMenu", "true"}, +}; +const FeatureEntry::FeatureParam kComposeboxShowContextMenuAndZps[] = { + {"ShowComposeboxZps", "true"}, + {"ShowContextMenu", "true"}, +}; +const FeatureEntry::FeatureParam kComposeboxShowContextMenuAndZpsMultiFile[] = { + {"MaxNumFiles", "5"}, + {"ShowComposeboxZps", "true"}, + {"ShowContextMenu", "true"}, +}; + +const FeatureEntry::FeatureVariation kNtpComposeboxVariations[] = { + {"- Show ZPS", kComposeboxShowZps, std::size(kComposeboxShowZps), nullptr}, + {"- Show Typed Suggest and ZPS", kComposeboxShowTypedSuggestAndZps, + std::size(kComposeboxShowTypedSuggestAndZps), nullptr}, + {"- Disable Click Outside Closure", kComposeboxNoClickOutsideClosure, + std::size(kComposeboxNoClickOutsideClosure), nullptr}, + {"- Disable Escape Closure", kComposeboxNoEscClosure, + std::size(kComposeboxNoEscClosure), nullptr}, + {"- Show Contextual Input Menu", kComposeboxShowContextMenu, + std::size(kComposeboxShowContextMenu), nullptr}, + {"- Show Contextual Input Menu and ZPS", kComposeboxShowContextMenuAndZps, + std::size(kComposeboxShowContextMenuAndZps), nullptr}, + {"- Show Contextual Input Menu and ZPS 5 File Limit", + kComposeboxShowContextMenuAndZpsMultiFile, + std::size(kComposeboxShowContextMenuAndZpsMultiFile), nullptr}, +}; + +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || + // BUILDFLAG(IS_WIN) + +const FeatureEntry::FeatureParam kOmniboxMlUrlScoringEnabledWithFixes[] = { + {"enable_scoring_signals_annotators_for_ml_scoring", "true"}, + {"MlUrlScoringShortcutDocumentSignals", "true"}, +}; +const FeatureEntry::FeatureParam kOmniboxMlUrlScoringUnlimitedNumCandidates[] = + { + {"MlUrlScoringUnlimitedNumCandidates", "true"}, + {"enable_scoring_signals_annotators_for_ml_scoring", "true"}, + {"MlUrlScoringShortcutDocumentSignals", "true"}, +}; +// Sets Bookmark(1), History Quick(4), History URL(8), Shortcuts(64), +// Document(512), and History Fuzzy(65536) providers max matches to 10. +const FeatureEntry::FeatureParam kOmniboxMlUrlScoringMaxMatchesByProvider10[] = + { + {"MlUrlScoringMaxMatchesByProvider", + "1:10,4:10,8:10,64:10,512:10,65536:10"}, + {"enable_scoring_signals_annotators_for_ml_scoring", "true"}, + {"MlUrlScoringShortcutDocumentSignals", "true"}, +}; +// Enables ML scoring for Search suggestions. +const FeatureEntry::FeatureParam kOmniboxMlUrlScoringWithSearches[] = { + {"MlUrlScoring_EnableMlScoringForSearches", "true"}, +}; +// Enables ML scoring for verbatim URL suggestions. +const FeatureEntry::FeatureParam kOmniboxMlUrlScoringWithVerbatimURLs[] = { + {"MlUrlScoring_EnableMlScoringForVerbatimUrls", "true"}, +}; +// Enables ML scoring for both Search and verbatim URL suggestions. +const FeatureEntry::FeatureParam + kOmniboxMlUrlScoringWithSearchesAndVerbatimURLs[] = { + {"MlUrlScoring_EnableMlScoringForSearches", "true"}, + {"MlUrlScoring_EnableMlScoringForVerbatimUrls", "true"}, +}; + +const FeatureEntry::FeatureVariation kOmniboxMlUrlScoringVariations[] = { + {"Enabled with fixes", kOmniboxMlUrlScoringEnabledWithFixes, + std::size(kOmniboxMlUrlScoringEnabledWithFixes), nullptr}, + {"unlimited suggestion candidates", + kOmniboxMlUrlScoringUnlimitedNumCandidates, + std::size(kOmniboxMlUrlScoringUnlimitedNumCandidates), nullptr}, + {"Increase provider max limit to 10", + kOmniboxMlUrlScoringMaxMatchesByProvider10, + std::size(kOmniboxMlUrlScoringMaxMatchesByProvider10), nullptr}, + {"with scoring of Search suggestions", kOmniboxMlUrlScoringWithSearches, + std::size(kOmniboxMlUrlScoringWithSearches), nullptr}, + {"with scoring of verbatim URL suggestions", + kOmniboxMlUrlScoringWithVerbatimURLs, + std::size(kOmniboxMlUrlScoringWithVerbatimURLs), nullptr}, + {"with scoring of Search & verbatim URL suggestions", + kOmniboxMlUrlScoringWithSearchesAndVerbatimURLs, + std::size(kOmniboxMlUrlScoringWithSearchesAndVerbatimURLs), nullptr}, +}; + +const FeatureEntry::FeatureParam + kMlUrlPiecewiseMappedSearchBlendingAdjustedBy0[] = { + {"MlUrlPiecewiseMappedSearchBlending", "true"}, + {"MlUrlPiecewiseMappedSearchBlending_BreakPoints", + "0,550;0.018,1300;0.14,1398;1,1422"}, + {"MlUrlPiecewiseMappedSearchBlending_GroupingThreshold", "1400"}, + {"MlUrlPiecewiseMappedSearchBlending_RelevanceBias", "0"}}; +const FeatureEntry::FeatureParam + kMlUrlPiecewiseMappedSearchBlendingDemotedBy50[] = { + {"MlUrlPiecewiseMappedSearchBlending", "true"}, + {"MlUrlPiecewiseMappedSearchBlending_BreakPoints", + "0,550;0.018,1250;0.14,1348;1,1422"}, + {"MlUrlPiecewiseMappedSearchBlending_GroupingThreshold", "1350"}, + {"MlUrlPiecewiseMappedSearchBlending_RelevanceBias", "0"}}; +const FeatureEntry::FeatureParam + kMlUrlPiecewiseMappedSearchBlendingPromotedBy50[] = { + {"MlUrlPiecewiseMappedSearchBlending", "true"}, + {"MlUrlPiecewiseMappedSearchBlending_BreakPoints", + "0,550;0.018,1350;0.14,1448;1,1472"}, + {"MlUrlPiecewiseMappedSearchBlending_GroupingThreshold", "1450"}, + {"MlUrlPiecewiseMappedSearchBlending_RelevanceBias", "0"}}; +const FeatureEntry::FeatureParam + kMlUrlPiecewiseMappedSearchBlendingPromotedBy100[] = { + {"MlUrlPiecewiseMappedSearchBlending", "true"}, + {"MlUrlPiecewiseMappedSearchBlending_BreakPoints", + "0,550;0.018,1400;0.14,1498;1,1522"}, + {"MlUrlPiecewiseMappedSearchBlending_GroupingThreshold", "1500"}, + {"MlUrlPiecewiseMappedSearchBlending_RelevanceBias", "0"}}; +const FeatureEntry::FeatureParam + kMlUrlPiecewiseMappedSearchBlendingMobileMapping[] = { + {"MlUrlPiecewiseMappedSearchBlending", "true"}, + {"MlUrlPiecewiseMappedSearchBlending_BreakPoints", + "0,590;0.006,790;0.082,1290;0.443,1360;0.464,1400;0.987,1425;1,1530"}, + {"MlUrlPiecewiseMappedSearchBlending_GroupingThreshold", "1340"}, + {"MlUrlPiecewiseMappedSearchBlending_RelevanceBias", "0"}}; + +const FeatureEntry::FeatureVariation + kMlUrlPiecewiseMappedSearchBlendingVariations[] = { + {"adjusted by 0", kMlUrlPiecewiseMappedSearchBlendingAdjustedBy0, + std::size(kMlUrlPiecewiseMappedSearchBlendingAdjustedBy0), nullptr}, + {"demoted by 50", kMlUrlPiecewiseMappedSearchBlendingDemotedBy50, + std::size(kMlUrlPiecewiseMappedSearchBlendingDemotedBy50), nullptr}, + {"promoted by 50", kMlUrlPiecewiseMappedSearchBlendingPromotedBy50, + std::size(kMlUrlPiecewiseMappedSearchBlendingPromotedBy50), nullptr}, + {"promoted by 100", kMlUrlPiecewiseMappedSearchBlendingPromotedBy100, + std::size(kMlUrlPiecewiseMappedSearchBlendingPromotedBy100), nullptr}, + {"mobile mapping", kMlUrlPiecewiseMappedSearchBlendingMobileMapping, + std::size(kMlUrlPiecewiseMappedSearchBlendingMobileMapping), nullptr}, +}; + +const FeatureEntry::FeatureParam kMlUrlSearchBlendingStable[] = { + {"MlUrlSearchBlending_StableSearchBlending", "true"}, + {"MlUrlSearchBlending_MappedSearchBlending", "false"}, +}; +const FeatureEntry::FeatureParam kMlUrlSearchBlendingMappedConservativeUrls[] = + { + {"MlUrlSearchBlending_StableSearchBlending", "false"}, + {"MlUrlSearchBlending_MappedSearchBlending", "true"}, + {"MlUrlSearchBlending_MappedSearchBlendingMin", "0"}, + {"MlUrlSearchBlending_MappedSearchBlendingMax", "2000"}, + {"MlUrlSearchBlending_MappedSearchBlendingGroupingThreshold", "1000"}, +}; +const FeatureEntry::FeatureParam kMlUrlSearchBlendingMappedModerateUrls[] = { + {"MlUrlSearchBlending_StableSearchBlending", "false"}, + {"MlUrlSearchBlending_MappedSearchBlending", "true"}, +}; +const FeatureEntry::FeatureParam kMlUrlSearchBlendingMappedAggressiveUrls[] = { + {"MlUrlSearchBlending_StableSearchBlending", "false"}, + {"MlUrlSearchBlending_MappedSearchBlending", "true"}, + {"MlUrlSearchBlending_MappedSearchBlendingMin", "1000"}, + {"MlUrlSearchBlending_MappedSearchBlendingMax", "4000"}, + {"MlUrlSearchBlending_MappedSearchBlendingGroupingThreshold", "1500"}, +}; + +const FeatureEntry::FeatureVariation kMlUrlSearchBlendingVariations[] = { + {"Stable", kMlUrlSearchBlendingStable, + std::size(kMlUrlSearchBlendingStable), nullptr}, + {"Mapped conservative urls", kMlUrlSearchBlendingMappedConservativeUrls, + std::size(kMlUrlSearchBlendingMappedConservativeUrls), nullptr}, + {"Mapped moderate urls", kMlUrlSearchBlendingMappedModerateUrls, + std::size(kMlUrlSearchBlendingMappedModerateUrls), nullptr}, + {"Mapped aggressive urls", kMlUrlSearchBlendingMappedAggressiveUrls, + std::size(kMlUrlSearchBlendingMappedAggressiveUrls), nullptr}, +}; + +const FeatureEntry::FeatureParam kMostVitedTilesNewScoring_DecayStaircaseCap10[] = { + { + "recency_factor", // history::kMvtScoringParamRecencyFactor.name + "decay_staircase" // history::kMvtScoringParamRecencyFactor_DecayStaircase + }, + {"daily_visit_count_cap", // history::kMvtScoringParamDailyVisitCountCap.name + "10"}, +}; +const FeatureEntry::FeatureParam kMostVitedTilesNewScoring_DecayCap1[] = { + { + "recency_factor", // history::kMvtScoringParamRecencyFactor.name + "decay" // history::kMvtScoringParamRecencyFactor_Decay + }, + { + "decay_per_day", // history::kMvtScoringParamDecayPerDay.name + "0.9131007162822623" // exp(-1.0 / 11). + }, + {"daily_visit_count_cap", // history::kMvtScoringParamDailyVisitCountCap.name + "1"}, +}; +constexpr FeatureEntry::FeatureVariation + kMostVisitedTilesNewScoringVariations[] = { + {"Decay Staircase, Cap 10", + kMostVitedTilesNewScoring_DecayStaircaseCap10, + std::size(kMostVitedTilesNewScoring_DecayStaircaseCap10), nullptr}, + {"Decay, Cap 1", kMostVitedTilesNewScoring_DecayCap1, + std::size(kMostVitedTilesNewScoring_DecayCap1), nullptr}, +}; + +const FeatureEntry::FeatureVariation kUrlScoringModelVariations[] = { + {"Small model (desktop)", nullptr, 0, nullptr}, + {"Full model (desktop)", nullptr, 0, "3380045"}, + {"Small model (ios)", nullptr, 0, "3379590"}, + {"Full model (ios)", nullptr, 0, "3380197"}, + {"Small model (android)", nullptr, 0, "3381543"}, + {"Full model (android)", nullptr, 0, "3381544"}, +}; + +const FeatureEntry::FeatureParam + kOmniboxZeroSuggestPrefetchDebouncingMinimalFromLastRun[] = { + {"ZeroSuggestPrefetchDebounceDelay", "300"}, + {"ZeroSuggestPrefetchDebounceFromLastRun", "true"}, +}; +const FeatureEntry::FeatureParam + kOmniboxZeroSuggestPrefetchDebouncingMinimalFromLastRequest[] = { + {"ZeroSuggestPrefetchDebounceDelay", "300"}, + {"ZeroSuggestPrefetchDebounceFromLastRun", "false"}, +}; +const FeatureEntry::FeatureParam + kOmniboxZeroSuggestPrefetchDebouncingModerateFromLastRun[] = { + {"ZeroSuggestPrefetchDebounceDelay", "600"}, + {"ZeroSuggestPrefetchDebounceFromLastRun", "true"}, +}; +const FeatureEntry::FeatureParam + kOmniboxZeroSuggestPrefetchDebouncingModerateFromLastRequest[] = { + {"ZeroSuggestPrefetchDebounceDelay", "600"}, + {"ZeroSuggestPrefetchDebounceFromLastRun", "false"}, +}; +const FeatureEntry::FeatureParam + kOmniboxZeroSuggestPrefetchDebouncingAggressiveFromLastRun[] = { + {"ZeroSuggestPrefetchDebounceDelay", "900"}, + {"ZeroSuggestPrefetchDebounceFromLastRun", "true"}, +}; +const FeatureEntry::FeatureParam + kOmniboxZeroSuggestPrefetchDebouncingAggressiveFromLastRequest[] = { + {"ZeroSuggestPrefetchDebounceDelay", "900"}, + {"ZeroSuggestPrefetchDebounceFromLastRun", "false"}, +}; + +const FeatureEntry::FeatureVariation + kOmniboxZeroSuggestPrefetchDebouncingVariations[] = { + {"Minimal debouncing relative to last run", + kOmniboxZeroSuggestPrefetchDebouncingMinimalFromLastRun, + std::size(kOmniboxZeroSuggestPrefetchDebouncingMinimalFromLastRun), + nullptr}, + {"Minimal debouncing relative to last request", + kOmniboxZeroSuggestPrefetchDebouncingMinimalFromLastRequest, + std::size(kOmniboxZeroSuggestPrefetchDebouncingMinimalFromLastRequest), + nullptr}, + {"Moderate debouncing relative to last run", + kOmniboxZeroSuggestPrefetchDebouncingModerateFromLastRun, + std::size(kOmniboxZeroSuggestPrefetchDebouncingModerateFromLastRun), + nullptr}, + {"Moderate debouncing relative to last request", + kOmniboxZeroSuggestPrefetchDebouncingModerateFromLastRequest, + std::size( + kOmniboxZeroSuggestPrefetchDebouncingModerateFromLastRequest), + nullptr}, + {"Aggressive debouncing relative to last run", + kOmniboxZeroSuggestPrefetchDebouncingAggressiveFromLastRun, + std::size(kOmniboxZeroSuggestPrefetchDebouncingAggressiveFromLastRun), + nullptr}, + {"Aggressive debouncing relative to last request", + kOmniboxZeroSuggestPrefetchDebouncingAggressiveFromLastRequest, + std::size( + kOmniboxZeroSuggestPrefetchDebouncingAggressiveFromLastRequest), + nullptr}, +}; + +#if BUILDFLAG(IS_ANDROID) +constexpr FeatureEntry::FeatureParam kOmniboxAnswerActionsCounterfactual[] = { + {OmniboxFieldTrial::kAnswerActionsCounterfactual.name, "true"}}; +constexpr FeatureEntry::FeatureParam kOmniboxAnswerActionsTreatment1[] = { + {OmniboxFieldTrial::kAnswerActionsShowAboveKeyboard.name, "true"}, + {OmniboxFieldTrial::kAnswerActionsShowIfUrlsPresent.name, "false"}, + {OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "false"}}; + +constexpr FeatureEntry::FeatureParam kOmniboxAnswerActionsTreatment2[] = { + {OmniboxFieldTrial::kAnswerActionsShowAboveKeyboard.name, "false"}, + {OmniboxFieldTrial::kAnswerActionsShowIfUrlsPresent.name, "true"}, + {OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "false"}}; + +constexpr FeatureEntry::FeatureParam kOmniboxAnswerActionsTreatment3[] = { + {OmniboxFieldTrial::kAnswerActionsShowAboveKeyboard.name, "false"}, + {OmniboxFieldTrial::kAnswerActionsShowIfUrlsPresent.name, "false"}, + {OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "false"}}; + +constexpr FeatureEntry::FeatureParam kOmniboxAnswerActionsTreatment4[] = { + {OmniboxFieldTrial::kAnswerActionsShowAboveKeyboard.name, "true"}, + {OmniboxFieldTrial::kAnswerActionsShowIfUrlsPresent.name, "false"}, + {OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "true"}}; + +constexpr FeatureEntry::FeatureParam kOmniboxAnswerActionsTreatment5[] = { + {OmniboxFieldTrial::kAnswerActionsShowAboveKeyboard.name, "false"}, + {OmniboxFieldTrial::kAnswerActionsShowIfUrlsPresent.name, "false"}, + {OmniboxFieldTrial::kAnswerActionsShowRichCard.name, "true"}}; + +constexpr FeatureEntry::FeatureVariation kOmniboxAnswerActionsVariants[] = { + {"Counterfactual: fetch without rendering ", + kOmniboxAnswerActionsCounterfactual, + std::size(kOmniboxAnswerActionsCounterfactual), "t3379046"}, + {"T1: Show chips above keyboard when there are no url matches", + kOmniboxAnswerActionsTreatment1, + std::size(kOmniboxAnswerActionsTreatment1), "t3379047"}, + {"T2: Show chips at position 0", kOmniboxAnswerActionsTreatment2, + std::size(kOmniboxAnswerActionsTreatment2), "t3379048"}, + {"T3: Show chips at position 0 when there are no url matches", + kOmniboxAnswerActionsTreatment3, + std::size(kOmniboxAnswerActionsTreatment3), "t3379049"}, + {"T4: Show rich card above keyboard when there are no url matches", + kOmniboxAnswerActionsTreatment4, + std::size(kOmniboxAnswerActionsTreatment4), "t3379050"}, + {"T5: Show rich card at position 0 when there are no url matches", + kOmniboxAnswerActionsTreatment5, + std::size(kOmniboxAnswerActionsTreatment5), "t3379051"}, +}; + +constexpr FeatureEntry::FeatureParam kOmniboxDiagInputConnection[]{ + {OmniboxFieldTrial::kAndroidDiagInputConnection.name, "true"}}; + +constexpr FeatureEntry::FeatureVariation kOmniboxDiagnosticsAndroidVaiants[] = { + {"- InputConnection", kOmniboxDiagInputConnection, + std::size(kOmniboxDiagInputConnection), nullptr}}; + +// Omnibox Mobile Parity Update V2 --> + +const FeatureEntry::FeatureParam + kOmniboxMobileParityV2RetrieveBuiltinFavicon[] = { + {OmniboxFieldTrial::kMobileParityRetrieveBuiltinFavicon.name, "true"}}; + +const FeatureEntry::FeatureVariation kOmniboxMobileParityV2Variants[] = { + {"with Builtin Favicon", kOmniboxMobileParityV2RetrieveBuiltinFavicon, + std::size(kOmniboxMobileParityV2RetrieveBuiltinFavicon)}}; +// <-- Omnibox Mobile Parity Update V2 + +#endif // BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam kMaxZeroSuggestMatches5[] = { + {"MaxZeroSuggestMatches", "5"}}; +const FeatureEntry::FeatureParam kMaxZeroSuggestMatches6[] = { + {"MaxZeroSuggestMatches", "6"}}; +const FeatureEntry::FeatureParam kMaxZeroSuggestMatches7[] = { + {"MaxZeroSuggestMatches", "7"}}; +const FeatureEntry::FeatureParam kMaxZeroSuggestMatches8[] = { + {"MaxZeroSuggestMatches", "8"}}; +const FeatureEntry::FeatureParam kMaxZeroSuggestMatches9[] = { + {"MaxZeroSuggestMatches", "9"}}; +const FeatureEntry::FeatureParam kMaxZeroSuggestMatches10[] = { + {"MaxZeroSuggestMatches", "10"}}; +const FeatureEntry::FeatureParam kMaxZeroSuggestMatches11[] = { + {"MaxZeroSuggestMatches", "11"}}; +const FeatureEntry::FeatureParam kMaxZeroSuggestMatches12[] = { + {"MaxZeroSuggestMatches", "12"}}; +const FeatureEntry::FeatureParam kMaxZeroSuggestMatches13[] = { + {"MaxZeroSuggestMatches", "13"}}; +const FeatureEntry::FeatureParam kMaxZeroSuggestMatches14[] = { + {"MaxZeroSuggestMatches", "14"}}; +const FeatureEntry::FeatureParam kMaxZeroSuggestMatches15[] = { + {"MaxZeroSuggestMatches", "15"}}; + +const FeatureEntry::FeatureVariation kMaxZeroSuggestMatchesVariations[] = { + {"5", kMaxZeroSuggestMatches5, std::size(kMaxZeroSuggestMatches5), nullptr}, + {"6", kMaxZeroSuggestMatches6, std::size(kMaxZeroSuggestMatches6), nullptr}, + {"7", kMaxZeroSuggestMatches7, std::size(kMaxZeroSuggestMatches7), nullptr}, + {"8", kMaxZeroSuggestMatches8, std::size(kMaxZeroSuggestMatches8), nullptr}, + {"9", kMaxZeroSuggestMatches9, std::size(kMaxZeroSuggestMatches9), nullptr}, + {"10", kMaxZeroSuggestMatches10, std::size(kMaxZeroSuggestMatches10), + nullptr}, + {"11", kMaxZeroSuggestMatches11, std::size(kMaxZeroSuggestMatches11), + nullptr}, + {"12", kMaxZeroSuggestMatches12, std::size(kMaxZeroSuggestMatches12), + nullptr}, + {"13", kMaxZeroSuggestMatches13, std::size(kMaxZeroSuggestMatches13), + nullptr}, + {"14", kMaxZeroSuggestMatches14, std::size(kMaxZeroSuggestMatches14), + nullptr}, + {"15", kMaxZeroSuggestMatches15, std::size(kMaxZeroSuggestMatches15), + nullptr}}; + +const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches3[] = { + {OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "3"}}; +const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches4[] = { + {OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "4"}}; +const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches5[] = { + {OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "5"}}; +const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches6[] = { + {OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "6"}}; +const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches7[] = { + {OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "7"}}; +const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches8[] = { + {OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "8"}}; +const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches9[] = { + {OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "9"}}; +const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches10[] = { + {OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "10"}}; +const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches12[] = { + {OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "12"}}; + +const FeatureEntry::FeatureVariation + kOmniboxUIMaxAutocompleteMatchesVariations[] = { + {"3 matches", kOmniboxUIMaxAutocompleteMatches3, + std::size(kOmniboxUIMaxAutocompleteMatches3), nullptr}, + {"4 matches", kOmniboxUIMaxAutocompleteMatches4, + std::size(kOmniboxUIMaxAutocompleteMatches4), nullptr}, + {"5 matches", kOmniboxUIMaxAutocompleteMatches5, + std::size(kOmniboxUIMaxAutocompleteMatches5), nullptr}, + {"6 matches", kOmniboxUIMaxAutocompleteMatches6, + std::size(kOmniboxUIMaxAutocompleteMatches6), nullptr}, + {"7 matches", kOmniboxUIMaxAutocompleteMatches7, + std::size(kOmniboxUIMaxAutocompleteMatches7), nullptr}, + {"8 matches", kOmniboxUIMaxAutocompleteMatches8, + std::size(kOmniboxUIMaxAutocompleteMatches8), nullptr}, + {"9 matches", kOmniboxUIMaxAutocompleteMatches9, + std::size(kOmniboxUIMaxAutocompleteMatches9), nullptr}, + {"10 matches", kOmniboxUIMaxAutocompleteMatches10, + std::size(kOmniboxUIMaxAutocompleteMatches10), nullptr}, + {"12 matches", kOmniboxUIMaxAutocompleteMatches12, + std::size(kOmniboxUIMaxAutocompleteMatches12), nullptr}}; + +const FeatureEntry::FeatureParam kOmniboxMaxURLMatches2[] = { + {OmniboxFieldTrial::kOmniboxMaxURLMatchesParam, "2"}}; +const FeatureEntry::FeatureParam kOmniboxMaxURLMatches3[] = { + {OmniboxFieldTrial::kOmniboxMaxURLMatchesParam, "3"}}; +const FeatureEntry::FeatureParam kOmniboxMaxURLMatches4[] = { + {OmniboxFieldTrial::kOmniboxMaxURLMatchesParam, "4"}}; +const FeatureEntry::FeatureParam kOmniboxMaxURLMatches5[] = { + {OmniboxFieldTrial::kOmniboxMaxURLMatchesParam, "5"}}; +const FeatureEntry::FeatureParam kOmniboxMaxURLMatches6[] = { + {OmniboxFieldTrial::kOmniboxMaxURLMatchesParam, "6"}}; + +const FeatureEntry::FeatureVariation kOmniboxMaxURLMatchesVariations[] = { + {"2 matches", kOmniboxMaxURLMatches2, std::size(kOmniboxMaxURLMatches2), + nullptr}, + {"3 matches", kOmniboxMaxURLMatches3, std::size(kOmniboxMaxURLMatches3), + nullptr}, + {"4 matches", kOmniboxMaxURLMatches4, std::size(kOmniboxMaxURLMatches4), + nullptr}, + {"5 matches", kOmniboxMaxURLMatches5, std::size(kOmniboxMaxURLMatches5), + nullptr}, + {"6 matches", kOmniboxMaxURLMatches6, std::size(kOmniboxMaxURLMatches6), + nullptr}}; + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kOmniboxMiaZpsEnabledWithHistoryAblation[] = { + {OmniboxFieldTrial::kSuppressPsuggestBackfillWithMIAParam, "true"}}; +const FeatureEntry::FeatureVariation kOmniboxMiaZpsVariations[] = { + {"with History Ablation", kOmniboxMiaZpsEnabledWithHistoryAblation, + std::size(kOmniboxMiaZpsEnabledWithHistoryAblation), nullptr}}; +#endif + +const FeatureEntry::FeatureParam + kOmniboxAimShortcutTypedStateEnabledForTypedLength15[] = { + {OmniboxFieldTrial::kMinimumTypedCharactersToInvokeAimShortcut.name, + "15"}}; +const FeatureEntry::FeatureVariation kOmniboxAimShortcutTypedStateVariations[] = + {{"for 15+ chars", kOmniboxAimShortcutTypedStateEnabledForTypedLength15, + std::size(kOmniboxAimShortcutTypedStateEnabledForTypedLength15), + nullptr}}; + +const FeatureEntry::FeatureParam kOmniboxDynamicMaxAutocomplete90[] = { + {"OmniboxDynamicMaxAutocompleteUrlCutoff", "0"}, + {"OmniboxDynamicMaxAutocompleteIncreasedLimit", "9"}}; +const FeatureEntry::FeatureParam kOmniboxDynamicMaxAutocomplete91[] = { + {"OmniboxDynamicMaxAutocompleteUrlCutoff", "1"}, + {"OmniboxDynamicMaxAutocompleteIncreasedLimit", "9"}}; +const FeatureEntry::FeatureParam kOmniboxDynamicMaxAutocomplete92[] = { + {"OmniboxDynamicMaxAutocompleteUrlCutoff", "2"}, + {"OmniboxDynamicMaxAutocompleteIncreasedLimit", "9"}}; +const FeatureEntry::FeatureParam kOmniboxDynamicMaxAutocomplete100[] = { + {"OmniboxDynamicMaxAutocompleteUrlCutoff", "0"}, + {"OmniboxDynamicMaxAutocompleteIncreasedLimit", "10"}}; +const FeatureEntry::FeatureParam kOmniboxDynamicMaxAutocomplete101[] = { + {"OmniboxDynamicMaxAutocompleteUrlCutoff", "1"}, + {"OmniboxDynamicMaxAutocompleteIncreasedLimit", "10"}}; +const FeatureEntry::FeatureParam kOmniboxDynamicMaxAutocomplete102[] = { + {"OmniboxDynamicMaxAutocompleteUrlCutoff", "2"}, + {"OmniboxDynamicMaxAutocompleteIncreasedLimit", "10"}}; + +const FeatureEntry::FeatureVariation + kOmniboxDynamicMaxAutocompleteVariations[] = { + {"9 suggestions if 0 or fewer URLs", kOmniboxDynamicMaxAutocomplete90, + std::size(kOmniboxDynamicMaxAutocomplete90), nullptr}, + {"9 suggestions if 1 or fewer URLs", kOmniboxDynamicMaxAutocomplete91, + std::size(kOmniboxDynamicMaxAutocomplete91), nullptr}, + {"9 suggestions if 2 or fewer URLs", kOmniboxDynamicMaxAutocomplete92, + std::size(kOmniboxDynamicMaxAutocomplete92), nullptr}, + {"10 suggestions if 0 or fewer URLs", kOmniboxDynamicMaxAutocomplete100, + std::size(kOmniboxDynamicMaxAutocomplete100), nullptr}, + {"10 suggestions if 1 or fewer URLs", kOmniboxDynamicMaxAutocomplete101, + std::size(kOmniboxDynamicMaxAutocomplete101), nullptr}, + {"10 suggestions if 2 or fewer URLs", kOmniboxDynamicMaxAutocomplete102, + std::size(kOmniboxDynamicMaxAutocomplete102), nullptr}}; + +const FeatureEntry::FeatureParam kRepeatableQueries_6Searches_90Days[] = { + {"RepeatableQueriesIgnoreDuplicateVisits", "true"}, + {"RepeatableQueriesMinVisitCount", "6"}, +}; +const FeatureEntry::FeatureParam kRepeatableQueries_12Searches_90Days[] = { + {"RepeatableQueriesIgnoreDuplicateVisits", "true"}, + {"RepeatableQueriesMinVisitCount", "12"}, +}; +const FeatureEntry::FeatureParam kRepeatableQueries_6Searches_7Days[] = { + {"RepeatableQueriesIgnoreDuplicateVisits", "true"}, + {"RepeatableQueriesMinVisitCount", "6"}, + {"RepeatableQueriesMaxAgeDays", "7"}, +}; +const FeatureEntry::FeatureParam kRepeatableQueries_12Searches_7Days[] = { + {"RepeatableQueriesIgnoreDuplicateVisits", "true"}, + {"RepeatableQueriesMinVisitCount", "12"}, + {"RepeatableQueriesMaxAgeDays", "7"}, +}; + +const FeatureEntry::FeatureVariation kOrganicRepeatableQueriesVariations[] = { + {"6+ uses, once in last 90d", kRepeatableQueries_6Searches_90Days, + std::size(kRepeatableQueries_6Searches_90Days), nullptr}, + {"12+ uses, once in last 90d", kRepeatableQueries_12Searches_90Days, + std::size(kRepeatableQueries_12Searches_90Days), nullptr}, + {"6+ uses, once in last 7d", kRepeatableQueries_6Searches_7Days, + std::size(kRepeatableQueries_6Searches_7Days), nullptr}, + {"12+ uses, once in last 7d", kRepeatableQueries_12Searches_7Days, + std::size(kRepeatableQueries_12Searches_7Days), nullptr}, +}; + +const FeatureEntry::FeatureParam kNtpZps0RecentSearches[] = { + {OmniboxFieldTrial::kOmniboxNumNtpZpsRecentSearches.name, "0"}}; +const FeatureEntry::FeatureParam kNtpZps5RecentSearches[] = { + {OmniboxFieldTrial::kOmniboxNumNtpZpsRecentSearches.name, "5"}}; +const FeatureEntry::FeatureParam kNtpZps10RecentSearches[] = { + {OmniboxFieldTrial::kOmniboxNumNtpZpsRecentSearches.name, "10"}}; +const FeatureEntry::FeatureParam kNtpZps15RecentSearches[] = { + {OmniboxFieldTrial::kOmniboxNumNtpZpsRecentSearches.name, "15"}}; +const FeatureEntry::FeatureVariation kNumNtpZpsRecentSearches[] = { + {"No recents", kNtpZps0RecentSearches, std::size(kNtpZps0RecentSearches)}, + {"5 recents", kNtpZps5RecentSearches, std::size(kNtpZps5RecentSearches)}, + {"10 recents", kNtpZps10RecentSearches, std::size(kNtpZps10RecentSearches)}, + {"15 recents", kNtpZps15RecentSearches, std::size(kNtpZps15RecentSearches)}, +}; +const FeatureEntry::FeatureParam kNtpZps0TrendingSearches[] = { + {OmniboxFieldTrial::kOmniboxNumNtpZpsTrendingSearches.name, "0"}}; +const FeatureEntry::FeatureParam kNtpZps5TrendingSearches[] = { + {OmniboxFieldTrial::kOmniboxNumNtpZpsTrendingSearches.name, "5"}}; +const FeatureEntry::FeatureVariation kNumNtpZpsTrendingSearches[] = { + {"No trends", kNtpZps0TrendingSearches, + std::size(kNtpZps0TrendingSearches)}, + {"5 trends", kNtpZps5TrendingSearches, std::size(kNtpZps5TrendingSearches)}, +}; +const FeatureEntry::FeatureParam kWebZps0RecentSearches[] = { + {OmniboxFieldTrial::kOmniboxNumWebZpsRecentSearches.name, "0"}}; +const FeatureEntry::FeatureParam kWebZps5RecentSearches[] = { + {OmniboxFieldTrial::kOmniboxNumWebZpsRecentSearches.name, "5"}}; +const FeatureEntry::FeatureParam kWebZps10RecentSearches[] = { + {OmniboxFieldTrial::kOmniboxNumWebZpsRecentSearches.name, "10"}}; +const FeatureEntry::FeatureParam kWebZps15RecentSearches[] = { + {OmniboxFieldTrial::kOmniboxNumWebZpsRecentSearches.name, "15"}}; +const FeatureEntry::FeatureVariation kNumWebZpsRecentSearches[] = { + {"No recents", kWebZps0RecentSearches, std::size(kWebZps0RecentSearches)}, + {"5 recents", kWebZps5RecentSearches, std::size(kWebZps5RecentSearches)}, + {"10 recents", kWebZps10RecentSearches, std::size(kWebZps10RecentSearches)}, + {"15 recents", kWebZps15RecentSearches, std::size(kWebZps15RecentSearches)}, +}; +const FeatureEntry::FeatureParam kWebZps0RelatedSearches[] = { + {OmniboxFieldTrial::kOmniboxNumWebZpsRelatedSearches.name, "0"}}; +const FeatureEntry::FeatureParam kWebZps5RelatedSearches[] = { + {OmniboxFieldTrial::kOmniboxNumWebZpsRelatedSearches.name, "5"}}; +const FeatureEntry::FeatureParam kWebZps10RelatedSearches[] = { + {OmniboxFieldTrial::kOmniboxNumWebZpsRelatedSearches.name, "10"}}; +const FeatureEntry::FeatureParam kWebZps15RelatedSearches[] = { + {OmniboxFieldTrial::kOmniboxNumWebZpsRelatedSearches.name, "15"}}; +const FeatureEntry::FeatureVariation kNumWebZpsRelatedSearches[] = { + {"No related", kWebZps0RelatedSearches, std::size(kWebZps0RelatedSearches)}, + {"5 related", kWebZps5RelatedSearches, std::size(kWebZps5RelatedSearches)}, + {"10 related", kWebZps10RelatedSearches, + std::size(kWebZps10RelatedSearches)}, + {"15 related", kWebZps15RelatedSearches, + std::size(kWebZps15RelatedSearches)}, +}; +const FeatureEntry::FeatureParam kWebZps0MostVisitedUrls[] = { + {OmniboxFieldTrial::kOmniboxNumWebZpsMostVisitedUrls.name, "0"}}; +const FeatureEntry::FeatureParam kWebZps5MostVisitedUrls[] = { + {OmniboxFieldTrial::kOmniboxNumWebZpsMostVisitedUrls.name, "5"}}; +const FeatureEntry::FeatureParam kWebZps10MostVisitedUrls[] = { + {OmniboxFieldTrial::kOmniboxNumWebZpsMostVisitedUrls.name, "10"}}; +const FeatureEntry::FeatureParam kWebZps15MostVisitedUrls[] = { + {OmniboxFieldTrial::kOmniboxNumWebZpsMostVisitedUrls.name, "15"}}; +const FeatureEntry::FeatureVariation kNumWebZpsMostVisitedUrls[] = { + {"No related", kWebZps0MostVisitedUrls, std::size(kWebZps0MostVisitedUrls)}, + {"5 related", kWebZps5MostVisitedUrls, std::size(kWebZps5MostVisitedUrls)}, + {"10 related", kWebZps10MostVisitedUrls, + std::size(kWebZps10MostVisitedUrls)}, + {"15 related", kWebZps15MostVisitedUrls, + std::size(kWebZps15MostVisitedUrls)}, +}; +const FeatureEntry::FeatureParam kSrpZps0RecentSearches[] = { + {OmniboxFieldTrial::kOmniboxNumSrpZpsRecentSearches.name, "0"}}; +const FeatureEntry::FeatureParam kSrpZps5RecentSearches[] = { + {OmniboxFieldTrial::kOmniboxNumSrpZpsRecentSearches.name, "5"}}; +const FeatureEntry::FeatureParam kSrpZps10RecentSearches[] = { + {OmniboxFieldTrial::kOmniboxNumSrpZpsRecentSearches.name, "10"}}; +const FeatureEntry::FeatureParam kSrpZps15RecentSearches[] = { + {OmniboxFieldTrial::kOmniboxNumSrpZpsRecentSearches.name, "15"}}; +const FeatureEntry::FeatureVariation kNumSrpZpsRecentSearches[] = { + {"No recents", kSrpZps0RecentSearches, std::size(kSrpZps0RecentSearches)}, + {"5 recents", kSrpZps5RecentSearches, std::size(kSrpZps5RecentSearches)}, + {"10 recents", kSrpZps10RecentSearches, std::size(kSrpZps10RecentSearches)}, + {"15 recents", kSrpZps15RecentSearches, std::size(kSrpZps15RecentSearches)}, +}; +const FeatureEntry::FeatureParam kSrpZps0RelatedSearches[] = { + {OmniboxFieldTrial::kOmniboxNumSrpZpsRelatedSearches.name, "0"}}; +const FeatureEntry::FeatureParam kSrpZps5RelatedSearches[] = { + {OmniboxFieldTrial::kOmniboxNumSrpZpsRelatedSearches.name, "5"}}; +const FeatureEntry::FeatureParam kSrpZps10RelatedSearches[] = { + {OmniboxFieldTrial::kOmniboxNumSrpZpsRelatedSearches.name, "10"}}; +const FeatureEntry::FeatureParam kSrpZps15RelatedSearches[] = { + {OmniboxFieldTrial::kOmniboxNumSrpZpsRelatedSearches.name, "15"}}; +const FeatureEntry::FeatureVariation kNumSrpZpsRelatedSearches[] = { + {"No related", kSrpZps0RelatedSearches, std::size(kSrpZps0RelatedSearches)}, + {"5 related", kSrpZps5RelatedSearches, std::size(kSrpZps5RelatedSearches)}, + {"10 related", kSrpZps10RelatedSearches, + std::size(kSrpZps10RelatedSearches)}, + {"15 related", kSrpZps15RelatedSearches, + std::size(kSrpZps15RelatedSearches)}, +}; + +#if !BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kMinimumTabWidthSettingPinned[] = { + {tabs::kMinimumTabWidthFeatureParameterName, "54"}}; +const FeatureEntry::FeatureParam kMinimumTabWidthSettingMedium[] = { + {tabs::kMinimumTabWidthFeatureParameterName, "72"}}; +const FeatureEntry::FeatureParam kMinimumTabWidthSettingLarge[] = { + {tabs::kMinimumTabWidthFeatureParameterName, "140"}}; +const FeatureEntry::FeatureParam kMinimumTabWidthSettingFull[] = { + {tabs::kMinimumTabWidthFeatureParameterName, "256"}}; + +const FeatureEntry::FeatureVariation kTabScrollingVariations[] = { + {" - tabs shrink to pinned tab width", kMinimumTabWidthSettingPinned, + std::size(kMinimumTabWidthSettingPinned), nullptr}, + {" - tabs shrink to a medium width", kMinimumTabWidthSettingMedium, + std::size(kMinimumTabWidthSettingMedium), nullptr}, + {" - tabs shrink to a large width", kMinimumTabWidthSettingLarge, + std::size(kMinimumTabWidthSettingLarge), nullptr}, + {" - tabs don't shrink", kMinimumTabWidthSettingFull, + std::size(kMinimumTabWidthSettingFull), nullptr}}; +#endif + +#if !BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kTabSearchToolbarButton[] = { + {"tab_search_toolbar_button", "true"}}; + +const FeatureEntry::FeatureVariation kTabstripComboButtonVariations[] = { + {" - toolbar button", kTabSearchToolbarButton, + std::size(kTabSearchToolbarButton)}, +}; +#endif + +const FeatureEntry::FeatureParam kTabScrollingButtonPositionRight[] = { + {features::kTabScrollingButtonPositionParameterName, "0"}}; +const FeatureEntry::FeatureParam kTabScrollingButtonPositionLeft[] = { + {features::kTabScrollingButtonPositionParameterName, "1"}}; +const FeatureEntry::FeatureParam kTabScrollingButtonPositionSplit[] = { + {features::kTabScrollingButtonPositionParameterName, "2"}}; + +const FeatureEntry::FeatureVariation kTabScrollingButtonPositionVariations[] = { + {" - to the right of the tabstrip", kTabScrollingButtonPositionRight, + std::size(kTabScrollingButtonPositionRight), nullptr}, + {" - to the left of the tabstrip", kTabScrollingButtonPositionLeft, + std::size(kTabScrollingButtonPositionLeft), nullptr}, + {" - on both sides of the tabstrip", kTabScrollingButtonPositionSplit, + std::size(kTabScrollingButtonPositionSplit), nullptr}}; + +#if !BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kTabScrollingWithDraggingWithConstantSpeed[] = + {{tabs::kTabScrollingWithDraggingModeName, "1"}}; +const FeatureEntry::FeatureParam kTabScrollingWithDraggingWithVariableSpeed[] = + {{tabs::kTabScrollingWithDraggingModeName, "2"}}; + +const FeatureEntry::FeatureVariation kTabScrollingWithDraggingVariations[] = { + {" - tabs scrolling with constant speed", + kTabScrollingWithDraggingWithConstantSpeed, + std::size(kTabScrollingWithDraggingWithConstantSpeed), nullptr}, + {" - tabs scrolling with variable speed region", + kTabScrollingWithDraggingWithVariableSpeed, + std::size(kTabScrollingWithDraggingWithVariableSpeed), nullptr}}; + +const FeatureEntry::FeatureParam kScrollableTabStripOverflowDivider[] = { + {tabs::kScrollableTabStripOverflowModeName, "1"}}; +const FeatureEntry::FeatureParam kScrollableTabStripOverflowFade[] = { + {tabs::kScrollableTabStripOverflowModeName, "2"}}; +const FeatureEntry::FeatureParam kScrollableTabStripOverflowShadow[] = { + {tabs::kScrollableTabStripOverflowModeName, "3"}}; + +const FeatureEntry::FeatureVariation kScrollableTabStripOverflowVariations[] = { + {" - Divider", kScrollableTabStripOverflowDivider, + std::size(kScrollableTabStripOverflowDivider), nullptr}, // Divider + {" - Fade", kScrollableTabStripOverflowFade, + std::size(kScrollableTabStripOverflowFade), nullptr}, // Fade + {" - Shadow", kScrollableTabStripOverflowShadow, + std::size(kScrollableTabStripOverflowShadow), nullptr}, // Shadow +}; +#endif + +#if !BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kMiniToolbarHiddenOnActiveView[] = { + {"mini_toolbar_active_config", "hide"}}; +const FeatureEntry::FeatureParam kMiniToolbarWithMenuOnActiveView[] = { + {"mini_toolbar_active_config", "showmenu"}}; +const FeatureEntry::FeatureParam kMiniToolbarWithCloseOnActiveView[] = { + {"mini_toolbar_active_config", "showclose"}}; + +const FeatureEntry::FeatureVariation kSideBySideVariations[] = { + {" - hide mini toolbar on active view", kMiniToolbarHiddenOnActiveView, + std::size(kMiniToolbarHiddenOnActiveView)}, + {" - show mini toolbar with menu button on active view", + kMiniToolbarWithMenuOnActiveView, + std::size(kMiniToolbarWithMenuOnActiveView)}, + {" - show mini toolbar with close button on active view", + kMiniToolbarWithCloseOnActiveView, + std::size(kMiniToolbarWithCloseOnActiveView)}, +}; +#endif + +#if !BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kNtpCalendarModuleFakeData[] = { + {ntp_features::kNtpCalendarModuleDataParam, "fake"}}; +const FeatureEntry::FeatureVariation kNtpCalendarModuleVariations[] = { + {"- Fake Data", kNtpCalendarModuleFakeData, + std::size(kNtpCalendarModuleFakeData), nullptr}, +}; + +const FeatureEntry::FeatureParam kNtpDriveModuleFakeData[] = { + {ntp_features::kNtpDriveModuleDataParam, "fake"}}; +const FeatureEntry::FeatureParam kNtpDriveModuleManagedUsersOnly[] = { + {ntp_features::kNtpDriveModuleManagedUsersOnlyParam, "true"}}; +const FeatureEntry::FeatureVariation kNtpDriveModuleVariations[] = { + {"- Fake Data", kNtpDriveModuleFakeData, std::size(kNtpDriveModuleFakeData), + nullptr}, + {"- Managed Users Only", kNtpDriveModuleManagedUsersOnly, + std::size(kNtpDriveModuleManagedUsersOnly), nullptr}, +}; + +const FeatureEntry::FeatureParam kNtpOutlookCalendarModuleFakeData[] = { + {ntp_features::kNtpOutlookCalendarModuleDataParam, "fake"}}; +const FeatureEntry::FeatureParam + kNtpOutlookCalendarModuleFakeAttachmentsData[] = { + {ntp_features::kNtpOutlookCalendarModuleDataParam, "fake-attachments"}}; +const FeatureEntry::FeatureVariation kNtpOutlookCalendarModuleVariations[] = { + {"- Fake Data", kNtpOutlookCalendarModuleFakeData, + std::size(kNtpOutlookCalendarModuleFakeData), nullptr}, + {"- Fake Attachments Data", kNtpOutlookCalendarModuleFakeAttachmentsData, + std::size(kNtpOutlookCalendarModuleFakeAttachmentsData), nullptr}, +}; + +const FeatureEntry::FeatureParam kNtpMiddleSlotPromoDismissalFakeData[] = { + {ntp_features::kNtpMiddleSlotPromoDismissalParam, "fake"}}; +const FeatureEntry::FeatureVariation kNtpMiddleSlotPromoDismissalVariations[] = + { + {"- Fake Data", kNtpMiddleSlotPromoDismissalFakeData, + std::size(kNtpMiddleSlotPromoDismissalFakeData), nullptr}, +}; + +const FeatureEntry::FeatureParam + kNtpRealboxCr23NoShadowExpandedStateBgMatchesSteadyState[]{ + {"kNtpRealboxCr23ExpandedStateBgMatchesOmnibox", "false"}, + {"kNtpRealboxCr23SteadyStateShadow", "false"}}; +const FeatureEntry::FeatureParam + kNtpRealboxCr23ShadowExpandedStateBgMatchesOmnibox[]{ + {"kNtpRealboxCr23ExpandedStateBgMatchesOmnibox", "true"}, + {"kNtpRealboxCr23SteadyStateShadow", "true"}}; +const FeatureEntry::FeatureParam + kNtpRealboxCr23ShadowExpandedStateBgMatchesSteadyState[]{ + {"kNtpRealboxCr23ExpandedStateBgMatchesOmnibox", "false"}, + {"kNtpRealboxCr23SteadyStateShadow", "true"}}; + +const FeatureEntry::FeatureVariation kNtpRealboxCr23ThemingVariations[] = { + {" - Steady state shadow", + kNtpRealboxCr23ShadowExpandedStateBgMatchesOmnibox, + std::size(kNtpRealboxCr23ShadowExpandedStateBgMatchesOmnibox), nullptr}, + {" - No steady state shadow + Dark mode background color matches steady" + "state", + kNtpRealboxCr23NoShadowExpandedStateBgMatchesSteadyState, + std::size(kNtpRealboxCr23NoShadowExpandedStateBgMatchesSteadyState), + nullptr}, + {" - Steady state shadow + Dark mode background color matches steady " + "state", + kNtpRealboxCr23ShadowExpandedStateBgMatchesSteadyState, + std::size(kNtpRealboxCr23ShadowExpandedStateBgMatchesSteadyState), + nullptr}, +}; + +const FeatureEntry::FeatureParam kNtpSafeBrowsingModuleFastCooldown[] = { + {ntp_features::kNtpSafeBrowsingModuleCooldownPeriodDaysParam, "0.001"}, + {ntp_features::kNtpSafeBrowsingModuleCountMaxParam, "1"}}; +const FeatureEntry::FeatureVariation kNtpSafeBrowsingModuleVariations[] = { + {"(Fast Cooldown)", kNtpSafeBrowsingModuleFastCooldown, + std::size(kNtpSafeBrowsingModuleFastCooldown), nullptr}, +}; + +const FeatureEntry::FeatureParam kNtpSharepointModuleTrendingInsights[] = { + {"NtpSharepointModuleDataParam", "trending-insights"}}; +const FeatureEntry::FeatureParam kNtpSharepointModuleNonInsights[] = { + {"NtpSharepointModuleDataParam", "non-insights"}}; +const FeatureEntry::FeatureParam kNtpSharepointModuleTrendingFakeData[] = { + {"NtpSharepointModuleDataParam", "fake-trending"}}; +const FeatureEntry::FeatureParam kNtpSharepointModuleNonInsightsFakeData[] = { + {"NtpSharepointModuleDataParam", "fake-non-insights"}}; +const FeatureEntry::FeatureParam kNtpSharepointModuleCombinedSuggestions[] = { + {"NtpSharepointModuleDataParam", "combined"}}; + +const FeatureEntry::FeatureVariation kNtpSharepointModuleVariations[] = { + {"- Trending", kNtpSharepointModuleTrendingInsights, + std::size(kNtpSharepointModuleTrendingInsights), nullptr}, + {"- Recently Used and Shared", kNtpSharepointModuleNonInsights, + std::size(kNtpSharepointModuleNonInsights), nullptr}, + {"- Fake Trending Data", kNtpSharepointModuleTrendingFakeData, + std::size(kNtpSharepointModuleTrendingFakeData), nullptr}, + {"- Fake Recently Used and Shared", kNtpSharepointModuleNonInsightsFakeData, + std::size(kNtpSharepointModuleNonInsightsFakeData), nullptr}, + {"- Combined Suggestions", kNtpSharepointModuleCombinedSuggestions, + std::size(kNtpSharepointModuleCombinedSuggestions), nullptr}}; + +const FeatureEntry::FeatureParam kNtpTabGroupsModuleFakeData[] = { + {ntp_features::kNtpTabGroupsModuleDataParam, "Fake Data"}}; +const FeatureEntry::FeatureParam kNtpTabGroupsModuleFakeZeroState[] = { + {ntp_features::kNtpTabGroupsModuleDataParam, "Fake Zero State"}}; + +const FeatureEntry::FeatureVariation kNtpTabGroupsModuleVariations[] = { + {"- Fake Data", kNtpTabGroupsModuleFakeData, + std::size(kNtpTabGroupsModuleFakeData), nullptr}, + {"- Fake Zero State", kNtpTabGroupsModuleFakeZeroState, + std::size(kNtpTabGroupsModuleFakeData), nullptr}, +}; + +const FeatureEntry::FeatureParam kNtpMostRelevantTabResumptionModuleFakeData[] = + {{ntp_features::kNtpMostRelevantTabResumptionModuleDataParam, "Fake Data"}}; +const FeatureEntry::FeatureParam + kNtpMostRelevantTabResumptionModuleFakeDataMostRecent[] = { + {ntp_features::kNtpMostRelevantTabResumptionModuleDataParam, + "Fake Data - Most Recent Decorator"}}; +const FeatureEntry::FeatureParam + kNtpMostRelevantTabResumptionModuleFakeDataFrequentlyVisitedAtTime[] = { + {ntp_features::kNtpMostRelevantTabResumptionModuleDataParam, + "Fake Data - Frequently Visited At Time Decorator"}}; +const FeatureEntry::FeatureParam + kNtpMostRelevantTabResumptionModuleFakeDataJustVisited[] = { + {ntp_features::kNtpMostRelevantTabResumptionModuleDataParam, + "Fake Data - Just Visited Decorator"}}; +const FeatureEntry::FeatureParam kNtpMostRelevantTabResumptionModuleTabData[] = + {{ntp_features::kNtpMostRelevantTabResumptionModuleDataParam, "1,2"}}; +const FeatureEntry::FeatureParam + kNtpMostRelevantTabResumptionModuleRemoteTabData[] = { + {ntp_features::kNtpMostRelevantTabResumptionModuleDataParam, "2"}}; +const FeatureEntry::FeatureParam + kNtpMostRelevantTabResumptionModuleRemoteVisitsData[] = { + {ntp_features::kNtpMostRelevantTabResumptionModuleDataParam, "2,4"}}; +const FeatureEntry::FeatureParam + kNtpMostRelevantTabResumptionModuleAllHistoryRemoteTabData[] = { + {ntp_features::kNtpMostRelevantTabResumptionModuleDataParam, "2,3,4"}}; +const FeatureEntry::FeatureParam + kNtpMostRelevantTabResumptionModuleVisitData[] = { + {ntp_features::kNtpMostRelevantTabResumptionModuleDataParam, + "1,2,3,4"}}; +// Most relevant tab resumption module data params may be expressed as a comma +// separated value consisting of the integer representations of the +// `FetchOptions::URLType` enumeration, to specify what URL types should be +// provided as options to the Visited URL Ranking Service's APIs. +const FeatureEntry::FeatureVariation + kNtpMostRelevantTabResumptionModuleVariations[] = { + {"- Fake Data", kNtpMostRelevantTabResumptionModuleFakeData, + std::size(kNtpMostRelevantTabResumptionModuleFakeData), nullptr}, + {"- Fake Data - Most Recent Decorator", + kNtpMostRelevantTabResumptionModuleFakeDataMostRecent, + std::size(kNtpMostRelevantTabResumptionModuleFakeData), nullptr}, + {"- Fake Data - Frequently Visited At Time Decorator", + kNtpMostRelevantTabResumptionModuleFakeDataFrequentlyVisitedAtTime, + std::size(kNtpMostRelevantTabResumptionModuleFakeData), nullptr}, + {"- Fake Data - Just Visited Decorator", + kNtpMostRelevantTabResumptionModuleFakeDataJustVisited, + std::size(kNtpMostRelevantTabResumptionModuleFakeData), nullptr}, + {"- Tabs Only", kNtpMostRelevantTabResumptionModuleTabData, + std::size(kNtpMostRelevantTabResumptionModuleTabData), nullptr}, + {"- Remote Tabs Only", kNtpMostRelevantTabResumptionModuleRemoteTabData, + std::size(kNtpMostRelevantTabResumptionModuleRemoteTabData), nullptr}, + {"- Remote Visits", kNtpMostRelevantTabResumptionModuleRemoteVisitsData, + std::size(kNtpMostRelevantTabResumptionModuleRemoteVisitsData), + nullptr}, + {"- All History, Remote Tabs", + kNtpMostRelevantTabResumptionModuleAllHistoryRemoteTabData, + std::size(kNtpMostRelevantTabResumptionModuleAllHistoryRemoteTabData), + nullptr}, + {"- All Visits", kNtpMostRelevantTabResumptionModuleVisitData, + std::size(kNtpMostRelevantTabResumptionModuleVisitData), nullptr}, +}; +#endif // !BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam kDataSharingShowSendFeedbackDisabled[] = { + {"show_send_feedback", "false"}}; +const FeatureEntry::FeatureParam kDataSharingShowSendFeedbackEnabled[] = { + {"show_send_feedback", "true"}}; +const FeatureEntry::FeatureVariation kDatasharingVariations[] = { + {"with feedback", kDataSharingShowSendFeedbackEnabled, + std::size(kDataSharingShowSendFeedbackEnabled)}, + {"without feedback", kDataSharingShowSendFeedbackDisabled, + std::size(kDataSharingShowSendFeedbackEnabled)}}; + +#if BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam kContextualSearchSuppressShortViewWith300Dp[] = + {{"contextual_search_minimum_page_height_dp", "300"}}; +const FeatureEntry::FeatureParam kContextualSearchSuppressShortViewWith400Dp[] = + {{"contextual_search_minimum_page_height_dp", "400"}}; +const FeatureEntry::FeatureParam kContextualSearchSuppressShortViewWith500Dp[] = + {{"contextual_search_minimum_page_height_dp", "500"}}; +const FeatureEntry::FeatureParam kContextualSearchSuppressShortViewWith600Dp[] = + {{"contextual_search_minimum_page_height_dp", "600"}}; +const FeatureEntry::FeatureVariation + kContextualSearchSuppressShortViewVariations[] = { + {"(300 dp)", kContextualSearchSuppressShortViewWith300Dp, + std::size(kContextualSearchSuppressShortViewWith300Dp), nullptr}, + {"(400 dp)", kContextualSearchSuppressShortViewWith400Dp, + std::size(kContextualSearchSuppressShortViewWith400Dp), nullptr}, + {"(500 dp)", kContextualSearchSuppressShortViewWith500Dp, + std::size(kContextualSearchSuppressShortViewWith500Dp), nullptr}, + {"(600 dp)", kContextualSearchSuppressShortViewWith600Dp, + std::size(kContextualSearchSuppressShortViewWith600Dp), nullptr}, +}; + +const FeatureEntry::FeatureParam kUseRunningCompactDelay_default[] = { + {"running_compact_delay_after_tasks", "30"}}; +const FeatureEntry::FeatureParam kUseRunningCompactDelay_immediate[] = { + {"running_compact_delay_after_tasks", "2"}}; + +const FeatureEntry::FeatureVariation kUseRunningCompactDelayOptions[] = { + {"default", kUseRunningCompactDelay_default, + std::size(kUseRunningCompactDelay_default), nullptr}, + {"immediate", kUseRunningCompactDelay_immediate, + std::size(kUseRunningCompactDelay_immediate), nullptr}}; + +const FeatureEntry::FeatureParam kJumpStartOmnibox1Minute[] = { + {"jump_start_min_away_time_minutes", "1"}, + {"jump_start_cover_recently_visited_page", "true"}}; +const FeatureEntry::FeatureParam kJumpStartOmnibox15Minutes[] = { + {"jump_start_min_away_time_minutes", "15"}, + {"jump_start_cover_recently_visited_page", "true"}}; +const FeatureEntry::FeatureParam kJumpStartOmnibox30Minutes[] = { + {"jump_start_min_away_time_minutes", "30"}, + {"jump_start_cover_recently_visited_page", "true"}}; +const FeatureEntry::FeatureParam kJumpStartOmnibox60Minutes[] = { + {"jump_start_min_away_time_minutes", "60"}, + {"jump_start_cover_recently_visited_page", "true"}}; + +const FeatureEntry::FeatureVariation kJumpStartOmniboxVariations[] = { + {"(after 1min)", kJumpStartOmnibox1Minute, + std::size(kJumpStartOmnibox1Minute)}, + {"(after 15min)", kJumpStartOmnibox15Minutes, + std::size(kJumpStartOmnibox15Minutes)}, + {"(after 30min)", kJumpStartOmnibox30Minutes, + std::size(kJumpStartOmnibox30Minutes)}, + {"(after 60min)", kJumpStartOmnibox60Minutes, + std::size(kJumpStartOmnibox60Minutes)}}; + +#endif // BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam + kReportNotificationContentDetectionDataRate100[] = { + {"ReportNotificationContentDetectionDataRate", "100"}}; +const FeatureEntry::FeatureVariation + kReportNotificationContentDetectionDataVariations[] = { + {"with reporting rate 100", + kReportNotificationContentDetectionDataRate100, + std::size(kReportNotificationContentDetectionDataRate100), nullptr}, +}; + +const FeatureEntry::FeatureParam + kResamplingScrollEventsPredictionFramesBasedEnabledV1[] = { + {"mode", features::kPredictionTypeFramesBased}, + {"latency", features::kPredictionTypeDefaultFramesVariation1}}; +const FeatureEntry::FeatureParam + kResamplingScrollEventsPredictionFramesBasedEnabledV2[] = { + {"mode", features::kPredictionTypeFramesBased}, + {"latency", features::kPredictionTypeDefaultFramesVariation2}}; +const FeatureEntry::FeatureParam + kResamplingScrollEventsPredictionFramesBasedEnabledV3[] = { + {"mode", features::kPredictionTypeFramesBased}, + {"latency", features::kPredictionTypeDefaultFramesVariation3}}; +const FeatureEntry::FeatureVariation + kResamplingScrollEventsExperimentalPredictionVariations[] = { + {"frames 0.25", kResamplingScrollEventsPredictionFramesBasedEnabledV1, + std::size(kResamplingScrollEventsPredictionFramesBasedEnabledV1), + nullptr}, + {"frames 0.375", kResamplingScrollEventsPredictionFramesBasedEnabledV2, + std::size(kResamplingScrollEventsPredictionFramesBasedEnabledV2), + nullptr}, + {"frames 0.5", kResamplingScrollEventsPredictionFramesBasedEnabledV3, + std::size(kResamplingScrollEventsPredictionFramesBasedEnabledV3), + nullptr}, +}; + +const FeatureEntry::FeatureParam + kShowWarningsForSuspiciousNotificationsScoreThreshold70[] = { + {"ShowWarningsForSuspiciousNotificationsScoreThreshold", "70"}, + {"ShowWarningsForSuspiciousNotificationsShouldSwapButtons", "false"}}; +const FeatureEntry::FeatureParam + kShowWarningsForSuspiciousNotificationsScoreThreshold70SwapButtons[] = { + {"ShowWarningsForSuspiciousNotificationsScoreThreshold", "70"}, + {"ShowWarningsForSuspiciousNotificationsShouldSwapButtons", "true"}}; +const FeatureEntry::FeatureVariation + kShowWarningsForSuspiciousNotificationsVariations[] = { + {"with suspicious score 70", + kShowWarningsForSuspiciousNotificationsScoreThreshold70, + std::size(kShowWarningsForSuspiciousNotificationsScoreThreshold70), + nullptr}, + {"with suspicious score 70 and swapped buttons", + kShowWarningsForSuspiciousNotificationsScoreThreshold70SwapButtons, + std::size( + kShowWarningsForSuspiciousNotificationsScoreThreshold70SwapButtons), + nullptr}, +}; + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kStartSurfaceReturnTime_Immediate[] = { + {"start_surface_return_time_seconds", "0"}, + {"start_surface_return_time_on_tablet_seconds", "0"}}; +const FeatureEntry::FeatureParam kStartSurfaceReturnTime_10Seconds[] = { + {"start_surface_return_time_seconds", "10"}, + {"start_surface_return_time_on_tablet_seconds", "10"}}; +const FeatureEntry::FeatureParam kStartSurfaceReturnTime_1Minute[] = { + {"start_surface_return_time_seconds", "60"}, + {"start_surface_return_time_on_tablet_seconds", "60"}}; +const FeatureEntry::FeatureParam kStartSurfaceReturnTime_5Minute[] = { + {"start_surface_return_time_seconds", "300"}, + {"start_surface_return_time_on_tablet_seconds", "300"}}; +const FeatureEntry::FeatureParam kStartSurfaceReturnTime_60Minute[] = { + {"start_surface_return_time_seconds", "3600"}, + {"start_surface_return_time_on_tablet_seconds", "3600"}}; +const FeatureEntry::FeatureVariation kStartSurfaceReturnTimeVariations[] = { + {"Immediate", kStartSurfaceReturnTime_Immediate, + std::size(kStartSurfaceReturnTime_Immediate), nullptr}, + {"10 seconds", kStartSurfaceReturnTime_10Seconds, + std::size(kStartSurfaceReturnTime_10Seconds), nullptr}, + {"1 minute", kStartSurfaceReturnTime_1Minute, + std::size(kStartSurfaceReturnTime_1Minute), nullptr}, + {"5 minute", kStartSurfaceReturnTime_5Minute, + std::size(kStartSurfaceReturnTime_5Minute), nullptr}, + {"60 minute", kStartSurfaceReturnTime_60Minute, + std::size(kStartSurfaceReturnTime_60Minute), nullptr}, +}; + +const FeatureEntry::FeatureParam kMagicStackAndroid_show_all_modules[] = { + {"show_all_modules", "true"}}; + +const FeatureEntry::FeatureVariation kMagicStackAndroidVariations[] = { + {"Show all modules", kMagicStackAndroid_show_all_modules, + std::size(kMagicStackAndroid_show_all_modules), nullptr}, +}; + +const FeatureEntry::FeatureParam kDefaultBrowserPromoShowArm[] = { + {segmentation_platform::features::kEphemeralCardRankerForceShowCardParam, + segmentation_platform::kDefaultBrowserPromo}, +}; +const FeatureEntry::FeatureParam kDefaultBrowserPromoHideArm[] = { + {segmentation_platform::features::kEphemeralCardRankerForceHideCardParam, + segmentation_platform::kDefaultBrowserPromo}, +}; +const FeatureEntry::FeatureParam kTabGroupPromoShowArm[] = { + {segmentation_platform::features::kEphemeralCardRankerForceShowCardParam, + segmentation_platform::kTabGroupPromo}, +}; +const FeatureEntry::FeatureParam kTabGroupPromoHideArm[] = { + {segmentation_platform::features::kEphemeralCardRankerForceHideCardParam, + segmentation_platform::kTabGroupPromo}, +}; +const FeatureEntry::FeatureParam kTabGroupSyncPromoShowArm[] = { + {segmentation_platform::features::kEphemeralCardRankerForceShowCardParam, + segmentation_platform::kTabGroupSyncPromo}, +}; +const FeatureEntry::FeatureParam kTabGroupSyncPromoHideArm[] = { + {segmentation_platform::features::kEphemeralCardRankerForceHideCardParam, + segmentation_platform::kTabGroupSyncPromo}, +}; +const FeatureEntry::FeatureParam kQuickDeletePromoShowArm[] = { + {segmentation_platform::features::kEphemeralCardRankerForceShowCardParam, + segmentation_platform::kQuickDeletePromo}, +}; +const FeatureEntry::FeatureParam kQuickDeletePromoHideArm[] = { + {segmentation_platform::features::kEphemeralCardRankerForceHideCardParam, + segmentation_platform::kQuickDeletePromo}, +}; + +const FeatureEntry::FeatureVariation kEphemeralCardRankerCardOverrideOptions[] = + { + {"- Force show default browser promo", kDefaultBrowserPromoShowArm, + std::size(kDefaultBrowserPromoShowArm), nullptr}, + {"- Force hide default browser promo", kDefaultBrowserPromoHideArm, + std::size(kDefaultBrowserPromoHideArm), nullptr}, + {"- Force show tab group promo", kTabGroupPromoShowArm, + std::size(kTabGroupPromoShowArm), nullptr}, + {"- Force hide tab group promo", kTabGroupPromoHideArm, + std::size(kTabGroupPromoHideArm), nullptr}, + {"- Force show tab group sync promo", kTabGroupSyncPromoShowArm, + std::size(kTabGroupSyncPromoShowArm), nullptr}, + {"- Force hide tab group sync promo", kTabGroupSyncPromoHideArm, + std::size(kTabGroupSyncPromoHideArm), nullptr}, + {"- Force show quick delete promo", kQuickDeletePromoShowArm, + std::size(kQuickDeletePromoShowArm), nullptr}, + {"- Force hide quick delete promo", kQuickDeletePromoHideArm, + std::size(kQuickDeletePromoHideArm), nullptr}, +}; +#endif // BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kSearchResumption_use_new_service[] = { + {"use_new_service", "true"}}; +const FeatureEntry::FeatureVariation + kSearchResumptionModuleAndroidVariations[] = { + {"Use New Service", kSearchResumption_use_new_service, + std::size(kSearchResumption_use_new_service), nullptr}, +}; + +const FeatureEntry::FeatureParam + kMostVitedTilesReselect_enable_partial_match_arm1[] = { + {"lax_scheme_host", "true"}, + {"lax_ref", "true"}, + {"lax_query", "false"}, + {"lax_path", "false"}, +}; +const FeatureEntry::FeatureParam + kMostVitedTilesReselect_enable_partial_match_arm2[] = { + {"lax_scheme_host", "true"}, + {"lax_ref", "true"}, + {"lax_query", "true"}, + {"lax_path", "false"}, +}; +const FeatureEntry::FeatureParam + kMostVitedTilesReselect_enable_partial_match_arm3[] = { + {"lax_scheme_host", "true"}, + {"lax_ref", "true"}, + {"lax_query", "true"}, + {"lax_path", "true"}, +}; +const FeatureEntry::FeatureVariation kMostVisitedTilesReselectVariations[] = { + {"Partial match Arm 1", kMostVitedTilesReselect_enable_partial_match_arm1, + std::size(kMostVitedTilesReselect_enable_partial_match_arm1), nullptr}, + {"Partial match Arm 2", kMostVitedTilesReselect_enable_partial_match_arm2, + std::size(kMostVitedTilesReselect_enable_partial_match_arm2), nullptr}, + {"Partial match Arm 3", kMostVitedTilesReselect_enable_partial_match_arm3, + std::size(kMostVitedTilesReselect_enable_partial_match_arm3), nullptr}, +}; + +const FeatureEntry::FeatureParam + kNotificationPermissionRationale_show_dialog_next_start[] = { + {"always_show_rationale_before_requesting_permission", "true"}, + {"permission_request_interval_days", "0"}, +}; + +const FeatureEntry::FeatureVariation + kNotificationPermissionRationaleVariations[] = { + {"- Show rationale UI on next startup", + kNotificationPermissionRationale_show_dialog_next_start, + std::size(kNotificationPermissionRationale_show_dialog_next_start), + nullptr}, +}; + +const FeatureEntry::FeatureParam kWebFeedAwareness_new_animation[] = { + {"awareness_style", "new_animation"}}; +const FeatureEntry::FeatureParam kWebFeedAwareness_new_animation_no_limit[] = { + {"awareness_style", "new_animation_no_limit"}}; + +const FeatureEntry::FeatureParam kWebFeedAwareness_IPH[] = { + {"awareness_style", "IPH"}}; + +const FeatureEntry::FeatureVariation kWebFeedAwarenessVariations[] = { + {"new animation", kWebFeedAwareness_new_animation, + std::size(kWebFeedAwareness_new_animation), nullptr}, + {"new animation rate limit off", kWebFeedAwareness_new_animation_no_limit, + std::size(kWebFeedAwareness_new_animation_no_limit), nullptr}, + {"IPH and dot", kWebFeedAwareness_IPH, std::size(kWebFeedAwareness_IPH), + nullptr}, +}; + +#endif // BUILDFLAG(IS_ANDROID) + +const FeatureEntry::Choice kNotificationSchedulerChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions:: + kNotificationSchedulerImmediateBackgroundTaskDescription, + notifications::switches::kNotificationSchedulerImmediateBackgroundTask, + ""}, +}; + +#if BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam kPhotoPickerAdoptionStudyActionGetContent[] = { + {"use_action_get_content", "true"}}; +const FeatureEntry::FeatureParam kPhotoPickerAdoptionStudyActionPickImages[] = { + {"use_action_pick_images", "true"}}; +const FeatureEntry::FeatureParam + kPhotoPickerAdoptionStudyActionPickImagesPlus[] = { + {"use_action_pick_images_plus", "true"}}; +const FeatureEntry::FeatureParam + kPhotoPickerAdoptionStudyChromePickerWithoutBrowse[] = { + {"chrome_picker_suppress_browse", "true"}}; + +const FeatureEntry::FeatureVariation + kPhotoPickerAdoptionStudyFeatureVariations[] = { + {"(Android Picker w/ACTION_GET_CONTENT)", + kPhotoPickerAdoptionStudyActionGetContent, + std::size(kPhotoPickerAdoptionStudyActionGetContent), nullptr}, + {"(Android Picker w/ACTION_PICK_IMAGES)", + kPhotoPickerAdoptionStudyActionPickImages, + std::size(kPhotoPickerAdoptionStudyActionPickImages), nullptr}, + {"(Android Picker w/ACTION_PICK_IMAGES Plus)", + kPhotoPickerAdoptionStudyActionPickImagesPlus, + std::size(kPhotoPickerAdoptionStudyActionPickImagesPlus), nullptr}, + {"(Chrome Picker without Browse)", + kPhotoPickerAdoptionStudyChromePickerWithoutBrowse, + std::size(kPhotoPickerAdoptionStudyChromePickerWithoutBrowse), + nullptr}}; + +const FeatureEntry::FeatureParam + kAndroidAppIntegrationWithFavicon_UseLargeFavicon[] = { + {"use_large_favicon", "true"}}; +const FeatureEntry::FeatureParam + kAndroidAppIntegrationWithFavicon_UseLargeFavicon_SkipDeviceCheck[] = { + {"skip_device_check", "true"}, + {"use_large_favicon", "true"}}; +const FeatureEntry::FeatureParam + kAndroidAppIntegrationWithFavicon_UseLargeFavicon_SkipSchemaCheck[] = { + {"skip_schema_check", "true"}, + {"use_large_favicon", "true"}}; +const FeatureEntry::FeatureParam + kAndroidAppIntegrationWithFavicon_UseLargeFavicon_SkipDeviceAndSchemaChecks + [] = {{"skip_device_check", "true"}, + {"skip_schema_check", "true"}, + {"use_large_favicon", "true"}}; +const FeatureEntry::FeatureParam + kAndroidAppIntegrationWithFavicon_DelayTime200Ms[] = { + {"schedule_delay_time_ms", "200"}}; +const FeatureEntry::FeatureParam + kAndroidAppIntegrationWithFavicon_DelayTime200Ms_UseLargeFavicon[] = { + {"schedule_delay_time_ms", "200"}, + {"use_large_favicon", "true"}}; + +const FeatureEntry::FeatureVariation kAndroidAppIntegrationWithFaviconVariations[] = + {{"Use large favicon (no delay)", + kAndroidAppIntegrationWithFavicon_UseLargeFavicon, + std::size(kAndroidAppIntegrationWithFavicon_UseLargeFavicon), nullptr}, + {"Skip device check + use large favicon (no delay)", + kAndroidAppIntegrationWithFavicon_UseLargeFavicon_SkipDeviceCheck, + std::size( + kAndroidAppIntegrationWithFavicon_UseLargeFavicon_SkipDeviceCheck), + nullptr}, + {"Skip schema check + use large favicon (no delay)", + kAndroidAppIntegrationWithFavicon_UseLargeFavicon_SkipSchemaCheck, + std::size( + kAndroidAppIntegrationWithFavicon_UseLargeFavicon_SkipSchemaCheck), + nullptr}, + {"Skip both device and schema checks + use large favicon (no delay)", + kAndroidAppIntegrationWithFavicon_UseLargeFavicon_SkipDeviceAndSchemaChecks, + std::size( + kAndroidAppIntegrationWithFavicon_UseLargeFavicon_SkipDeviceAndSchemaChecks), + nullptr}, + {"200ms delay", kAndroidAppIntegrationWithFavicon_DelayTime200Ms, + std::size(kAndroidAppIntegrationWithFavicon_DelayTime200Ms), nullptr}, + {"200ms delay with large favicon", + kAndroidAppIntegrationWithFavicon_DelayTime200Ms_UseLargeFavicon, + std::size( + kAndroidAppIntegrationWithFavicon_DelayTime200Ms_UseLargeFavicon), + nullptr}}; + +const FeatureEntry::FeatureParam + kAndroidAppIntegrationModule_ForceCardShown_Pixel[] = { + {"force_card_shown", "true"}}; + +const FeatureEntry::FeatureParam + kAndroidAppIntegrationModule_ForceCardShown_NonPixel[] = { + {"force_card_shown", "true"}, + {"show_third_party_card", "true"}}; + +const FeatureEntry::FeatureVariation kAndroidAppIntegrationModuleVariations[] = + {{"Force to show Pixel's notice card", + kAndroidAppIntegrationModule_ForceCardShown_Pixel, + std::size(kAndroidAppIntegrationModule_ForceCardShown_Pixel), nullptr}, + {"Force to show opt in card", + kAndroidAppIntegrationModule_ForceCardShown_NonPixel, + std::size(kAndroidAppIntegrationModule_ForceCardShown_NonPixel), + nullptr}}; + +const FeatureEntry::FeatureParam kAndroidComposeplate_V2Enabled[] = { + {"v2_enabled", "true"}}; +const FeatureEntry::FeatureParam kAndroidComposeplate_HideIncognitoButton[] = { + {"hide_incognito_button", "true"}}; +const FeatureEntry::FeatureParam kAndroidComposeplate_SkipLocaleCheck[] = { + {"skip_locale_check", "true"}}; + +const FeatureEntry::FeatureVariation kAndroidComposeplateVariations[] = { + {"V2 enabled", kAndroidComposeplate_V2Enabled, + std::size(kAndroidComposeplate_V2Enabled), nullptr}, + {"Hide incognito button", kAndroidComposeplate_HideIncognitoButton, + std::size(kAndroidComposeplate_HideIncognitoButton), nullptr}, + {"Skip locale check", kAndroidComposeplate_SkipLocaleCheck, + std::size(kAndroidComposeplate_SkipLocaleCheck), nullptr}}; + +const FeatureEntry::FeatureParam + kAndroidAppIntegrationMultiDataSource_SkipDeviceCheck[] = { + {"multi_data_source_skip_device_check", "true"}}; +const FeatureEntry::FeatureParam + kAndroidAppIntegrationMultiDataSource_SkipSchemaCheck[] = { + {"multi_data_source_skip_schema_check", "true"}}; +const FeatureEntry::FeatureParam + kAndroidAppIntegrationMultiDataSource_SkipBothDeviceAndSchemaCheck[] = { + {"multi_data_source_skip_device_check", "true"}, + {"multi_data_source_skip_schema_check", "true"}}; + +const FeatureEntry::FeatureVariation + kAndroidAppIntegrationMultiDataSourceVariations[] = { + {"Skip device check", + kAndroidAppIntegrationMultiDataSource_SkipDeviceCheck, + std::size(kAndroidAppIntegrationMultiDataSource_SkipDeviceCheck), + nullptr}, + {"Skip schema check", + kAndroidAppIntegrationMultiDataSource_SkipSchemaCheck, + std::size(kAndroidAppIntegrationMultiDataSource_SkipSchemaCheck), + nullptr}, + {"Skip both device and schema check", + kAndroidAppIntegrationMultiDataSource_SkipBothDeviceAndSchemaCheck, + std::size( + kAndroidAppIntegrationMultiDataSource_SkipBothDeviceAndSchemaCheck), + nullptr}}; + +const FeatureEntry::FeatureParam kAndroidBottomToolbar_DefaultToBottom[] = { + {"default_to_top", "false"}}; + +const FeatureEntry::FeatureVariation kAndroidBottomToolbarVariations[] = { + {"default to bottom", kAndroidBottomToolbar_DefaultToBottom, + std::size(kAndroidBottomToolbar_DefaultToBottom), nullptr}}; + +const FeatureEntry::FeatureParam kAuxiliarySearchDonation_MaxDonation_20[] = { + {chrome::android::kAuxiliarySearchMaxBookmarksCountParam.name, "20"}, + {chrome::android::kAuxiliarySearchMaxTabsCountParam.name, "20"}}; +const FeatureEntry::FeatureParam kAuxiliarySearchDonation_MaxDonation_100[] = { + {chrome::android::kAuxiliarySearchMaxBookmarksCountParam.name, "100"}, + {chrome::android::kAuxiliarySearchMaxTabsCountParam.name, "100"}}; +const FeatureEntry::FeatureParam kAuxiliarySearchDonation_MaxDonation_200[] = { + {chrome::android::kAuxiliarySearchMaxBookmarksCountParam.name, "200"}, + {chrome::android::kAuxiliarySearchMaxTabsCountParam.name, "200"}}; +const FeatureEntry::FeatureParam kAuxiliarySearchDonation_MaxDonation_500[] = { + {chrome::android::kAuxiliarySearchMaxBookmarksCountParam.name, "500"}, + {chrome::android::kAuxiliarySearchMaxTabsCountParam.name, "500"}}; +const FeatureEntry::FeatureVariation kAuxiliarySearchDonationVariations[] = { + {"50 counts", kAuxiliarySearchDonation_MaxDonation_20, + std::size(kAuxiliarySearchDonation_MaxDonation_20), nullptr}, + {"100 counts", kAuxiliarySearchDonation_MaxDonation_100, + std::size(kAuxiliarySearchDonation_MaxDonation_100), nullptr}, + {"200 counts", kAuxiliarySearchDonation_MaxDonation_200, + std::size(kAuxiliarySearchDonation_MaxDonation_200), nullptr}, + {"500 counts", kAuxiliarySearchDonation_MaxDonation_500, + std::size(kAuxiliarySearchDonation_MaxDonation_500), nullptr}, +}; + +const FeatureEntry::FeatureParam kBoardingPassDetectorUrl_AA[] = { + {features::kBoardingPassDetectorUrlParamName, + "https://www.aa.com/checkin/viewMobileBoardingPass"}}; +const FeatureEntry::FeatureParam kBoardingPassDetectorUrl_All[] = { + {features::kBoardingPassDetectorUrlParamName, + "https://www.aa.com/checkin/viewMobileBoardingPass,https://united.com"}}; +const FeatureEntry::FeatureParam kBoardingPassDetectorUrl_Test[] = { + {features::kBoardingPassDetectorUrlParamName, "http"}}; +const FeatureEntry::FeatureVariation kBoardingPassDetectorVariations[] = { + {"AA", kBoardingPassDetectorUrl_AA, std::size(kBoardingPassDetectorUrl_AA), + nullptr}, + {"All", kBoardingPassDetectorUrl_All, + std::size(kBoardingPassDetectorUrl_All), nullptr}, + {"Test", kBoardingPassDetectorUrl_Test, + std::size(kBoardingPassDetectorUrl_Test), nullptr}, +}; +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam kShowNewTabAnimationsLogs[] = { + {"logs", "true"}, + {"listeners", "false"}}; +const FeatureEntry::FeatureParam kShowNewTabAnimationsListeners[] = { + {"logs", "true"}, + {"listeners", "true"}}; +const FeatureEntry::FeatureVariation kShowNewTabAnimationsVariations[] = { + {"- Add logs", kShowNewTabAnimationsLogs, + std::size(kShowNewTabAnimationsLogs), nullptr}, + {"- Add logs and listeners", kShowNewTabAnimationsListeners, + std::size(kShowNewTabAnimationsListeners), nullptr}, +}; + +#endif // BUILDFLAG(IS_ANDROID) + +// TODO(crbug.com/991082,1015377): Remove after proper support for back/forward +// cache is implemented. +const FeatureEntry::FeatureParam kBackForwardCache_ForceCaching[] = { + {"TimeToLiveInBackForwardCacheInSeconds", "300"}, + {"should_ignore_blocklists", "true"}}; + +const FeatureEntry::FeatureVariation kBackForwardCacheVariations[] = { + {"force caching all pages (experimental)", kBackForwardCache_ForceCaching, + std::size(kBackForwardCache_ForceCaching), nullptr}, +}; + +const FeatureEntry::FeatureParam kRenderDocument_Subframe[] = { + {"level", "subframe"}}; +const FeatureEntry::FeatureParam kRenderDocument_AllFrames[] = { + {"level", "all-frames"}}; + +const FeatureEntry::FeatureVariation kRenderDocumentVariations[] = { + {"Swap RenderFrameHosts on same-site navigations from subframes and " + "crashed frames (experimental)", + kRenderDocument_Subframe, std::size(kRenderDocument_Subframe), nullptr}, + {"Swap RenderFrameHosts on same-site navigations from any frame " + "(experimental)", + kRenderDocument_AllFrames, std::size(kRenderDocument_AllFrames), nullptr}, +}; + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::Choice kWebOtpBackendChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flag_descriptions::kWebOtpBackendSmsVerification, switches::kWebOtpBackend, + switches::kWebOtpBackendSmsVerification}, + {flag_descriptions::kWebOtpBackendUserConsent, switches::kWebOtpBackend, + switches::kWebOtpBackendUserConsent}, + {flag_descriptions::kWebOtpBackendAuto, switches::kWebOtpBackend, + switches::kWebOtpBackendAuto}, +}; +#endif // BUILDFLAG(IS_ANDROID) + +// The choices for --enable-experimental-cookie-features. This really should +// just be a SINGLE_VALUE_TYPE, but it is misleading to have the choices be +// labeled "Disabled"/"Enabled". So instead this is made to be a +// MULTI_VALUE_TYPE with choices "Default"/"Enabled". +const FeatureEntry::Choice kEnableExperimentalCookieFeaturesChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {flags_ui::kGenericExperimentChoiceEnabled, + switches::kEnableExperimentalCookieFeatures, ""}, +}; + +#if BUILDFLAG(IS_CHROMEOS) +const FeatureEntry::Choice kForceControlFaceAeChoices[] = { + {"Default", "", ""}, + {"Enable", media::switches::kForceControlFaceAe, "enable"}, + {"Disable", media::switches::kForceControlFaceAe, "disable"}}; + +const FeatureEntry::Choice kAutoFramingOverrideChoices[] = { + {"Default", "", ""}, + {"Force enabled", media::switches::kAutoFramingOverride, + media::switches::kAutoFramingForceEnabled}, + {"Force disabled", media::switches::kAutoFramingOverride, + media::switches::kAutoFramingForceDisabled}}; + +const FeatureEntry::Choice kFaceRetouchOverrideChoices[] = { + {"Default", "", ""}, + {"Enabled with relighting", media::switches::kFaceRetouchOverride, + media::switches::kFaceRetouchForceEnabledWithRelighting}, + {"Enabled without relighting", media::switches::kFaceRetouchOverride, + media::switches::kFaceRetouchForceEnabledWithoutRelighting}, + {"Disabled", media::switches::kFaceRetouchOverride, + media::switches::kFaceRetouchForceDisabled}}; + +const FeatureEntry::Choice kCrostiniContainerChoices[] = { + {"Default", "", ""}, + {"Buster", crostini::kCrostiniContainerFlag, "buster"}, + {"Bullseye", crostini::kCrostiniContainerFlag, "bullseye"}, + {"Bookworm", crostini::kCrostiniContainerFlag, "bookworm"}, +}; +#endif // BUILDFLAG(IS_CHROMEOS) + +#if !BUILDFLAG(IS_ANDROID) +// SCT Auditing feature variations. +const FeatureEntry::FeatureParam kSCTAuditingSamplingRateNone[] = { + {"sampling_rate", "0.0"}}; +const FeatureEntry::FeatureParam kSCTAuditingSamplingRateAlternativeOne[] = { + {"sampling_rate", "0.0001"}}; +const FeatureEntry::FeatureParam kSCTAuditingSamplingRateAlternativeTwo[] = { + {"sampling_rate", "0.001"}}; + +const FeatureEntry::FeatureVariation kSCTAuditingVariations[] = { + {"Sampling rate 0%", kSCTAuditingSamplingRateNone, + std::size(kSCTAuditingSamplingRateNone), nullptr}, + {"Sampling rate 0.01%", kSCTAuditingSamplingRateAlternativeOne, + std::size(kSCTAuditingSamplingRateAlternativeOne), nullptr}, + {"Sampling rate 0.1%", kSCTAuditingSamplingRateAlternativeTwo, + std::size(kSCTAuditingSamplingRateAlternativeTwo), nullptr}, +}; +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) +const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay10Mins[] = { + {"long_delay_minutes", "10"}}; +const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay12Hours[] = { + {"long_delay_minutes", "720"}}; +const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay24Hours[] = { + {"long_delay_minutes", "1440"}}; +const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay36Hours[] = { + {"long_delay_minutes", "2160"}}; +const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay48Hours[] = { + {"long_delay_minutes", "2880"}}; +const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay60Hours[] = { + {"long_delay_minutes", "3600"}}; +const FeatureEntry::FeatureParam kLauncherItemSuggest_LongDelay72Hours[] = { + {"long_delay_minutes", "4320"}}; + +const FeatureEntry::FeatureVariation kLauncherItemSuggestVariations[] = { + {"with 10 minute long delay", kLauncherItemSuggest_LongDelay10Mins, + std::size(kLauncherItemSuggest_LongDelay10Mins), nullptr}, + {"with 12 hour long delay", kLauncherItemSuggest_LongDelay12Hours, + std::size(kLauncherItemSuggest_LongDelay12Hours), nullptr}, + {"with 24 hour long delay", kLauncherItemSuggest_LongDelay24Hours, + std::size(kLauncherItemSuggest_LongDelay24Hours), nullptr}, + {"with 36 hour long delay", kLauncherItemSuggest_LongDelay36Hours, + std::size(kLauncherItemSuggest_LongDelay36Hours), nullptr}, + {"with 48 hour long delay", kLauncherItemSuggest_LongDelay48Hours, + std::size(kLauncherItemSuggest_LongDelay48Hours), nullptr}, + {"with 60 hour long delay", kLauncherItemSuggest_LongDelay60Hours, + std::size(kLauncherItemSuggest_LongDelay60Hours), nullptr}, + {"with 72 hour long delay", kLauncherItemSuggest_LongDelay72Hours, + std::size(kLauncherItemSuggest_LongDelay72Hours), nullptr}}; + +const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_10[] = { + {"confidence_threshold", "10"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_20[] = { + {"confidence_threshold", "20"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_30[] = { + {"confidence_threshold", "30"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_40[] = { + {"confidence_threshold", "40"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_50[] = { + {"confidence_threshold", "50"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_60[] = { + {"confidence_threshold", "60"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_70[] = { + {"confidence_threshold", "70"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_80[] = { + {"confidence_threshold", "80"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_90[] = { + {"confidence_threshold", "90"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_100[] = { + {"confidence_threshold", "100"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_110[] = { + {"confidence_threshold", "110"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchConfidence_120[] = { + {"confidence_threshold", "120"}}; + +const FeatureEntry::FeatureVariation + kLauncherLocalImageSearchConfidenceVariations[] = { + {"threshold 10", kLauncherLocalImageSearchConfidence_10, + std::size(kLauncherLocalImageSearchConfidence_10), nullptr}, + {"threshold 20", kLauncherLocalImageSearchConfidence_20, + std::size(kLauncherLocalImageSearchConfidence_20), nullptr}, + {"threshold 30", kLauncherLocalImageSearchConfidence_30, + std::size(kLauncherLocalImageSearchConfidence_30), nullptr}, + {"threshold 40", kLauncherLocalImageSearchConfidence_40, + std::size(kLauncherLocalImageSearchConfidence_40), nullptr}, + {"threshold 50", kLauncherLocalImageSearchConfidence_50, + std::size(kLauncherLocalImageSearchConfidence_50), nullptr}, + {"threshold 60", kLauncherLocalImageSearchConfidence_60, + std::size(kLauncherLocalImageSearchConfidence_60), nullptr}, + {"threshold 70", kLauncherLocalImageSearchConfidence_70, + std::size(kLauncherLocalImageSearchConfidence_70), nullptr}, + {"threshold 80", kLauncherLocalImageSearchConfidence_80, + std::size(kLauncherLocalImageSearchConfidence_80), nullptr}, + {"threshold 90", kLauncherLocalImageSearchConfidence_90, + std::size(kLauncherLocalImageSearchConfidence_90), nullptr}, + {"threshold 100", kLauncherLocalImageSearchConfidence_100, + std::size(kLauncherLocalImageSearchConfidence_100), nullptr}, + {"threshold 110", kLauncherLocalImageSearchConfidence_110, + std::size(kLauncherLocalImageSearchConfidence_110), nullptr}, + {"threshold 120", kLauncherLocalImageSearchConfidence_120, + std::size(kLauncherLocalImageSearchConfidence_120), nullptr}}; + +const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_10[] = { + {"relevance_threshold", "0.1"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_20[] = { + {"relevance_threshold", "0.2"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_30[] = { + {"relevance_threshold", "0.3"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_40[] = { + {"relevance_threshold", "0.4"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_50[] = { + {"relevance_threshold", "0.5"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_60[] = { + {"relevance_threshold", "0.6"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_70[] = { + {"relevance_threshold", "0.7"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_80[] = { + {"relevance_threshold", "0.8"}}; +const FeatureEntry::FeatureParam kLauncherLocalImageSearchRelevance_90[] = { + {"relevance_threshold", "0.9"}}; + +const FeatureEntry::FeatureVariation + kLauncherLocalImageSearchRelevanceVariations[] = { + {"threshold 0.1", kLauncherLocalImageSearchRelevance_10, + std::size(kLauncherLocalImageSearchRelevance_10), nullptr}, + {"threshold 0.2", kLauncherLocalImageSearchRelevance_20, + std::size(kLauncherLocalImageSearchRelevance_20), nullptr}, + {"threshold 0.3", kLauncherLocalImageSearchRelevance_30, + std::size(kLauncherLocalImageSearchRelevance_30), nullptr}, + {"threshold 0.4", kLauncherLocalImageSearchRelevance_40, + std::size(kLauncherLocalImageSearchRelevance_40), nullptr}, + {"threshold 0.5", kLauncherLocalImageSearchRelevance_50, + std::size(kLauncherLocalImageSearchRelevance_50), nullptr}, + {"threshold 0.6", kLauncherLocalImageSearchRelevance_60, + std::size(kLauncherLocalImageSearchRelevance_60), nullptr}, + {"threshold 0.7", kLauncherLocalImageSearchRelevance_70, + std::size(kLauncherLocalImageSearchRelevance_70), nullptr}, + {"threshold 0.8", kLauncherLocalImageSearchRelevance_80, + std::size(kLauncherLocalImageSearchRelevance_80), nullptr}, + {"threshold 0.9", kLauncherLocalImageSearchRelevance_90, + std::size(kLauncherLocalImageSearchRelevance_90), nullptr}}; + +const FeatureEntry::FeatureParam kCampbell9dot[] = {{"icon", "9dot"}}; +const FeatureEntry::FeatureParam kCampbellHero[] = {{"icon", "hero"}}; +const FeatureEntry::FeatureParam kCampbellAction[] = {{"icon", "action"}}; +const FeatureEntry::FeatureParam kCampbellText[] = {{"icon", "text"}}; + +const FeatureEntry::FeatureVariation kCampbellGlyphVariations[] = { + {"9dot", kCampbell9dot, std::size(kCampbell9dot), nullptr}, + {"hero", kCampbellHero, std::size(kCampbellHero), nullptr}, + {"action", kCampbellAction, std::size(kCampbellAction), nullptr}, + {"text", kCampbellText, std::size(kCampbellText), nullptr}}; + +const FeatureEntry::FeatureParam kCaptureModeEducationShortcutNudge[] = { + {"CaptureModeEducationParam", "ShortcutNudge"}}; +const FeatureEntry::FeatureParam kCaptureModeEducationShortcutTutorial[] = { + {"CaptureModeEducationParam", "ShortcutTutorial"}}; +const FeatureEntry::FeatureParam kCaptureModeEducationQuickSettingsNudge[] = { + {"CaptureModeEducationParam", "QuickSettingsNudge"}}; + +const FeatureEntry::FeatureVariation kCaptureModeEducationVariations[] = { + {"Shortcut Nudge", kCaptureModeEducationShortcutNudge, + std::size(kCaptureModeEducationShortcutNudge), nullptr}, + {"Shortcut Tutorial", kCaptureModeEducationShortcutTutorial, + std::size(kCaptureModeEducationShortcutTutorial), nullptr}, + {"Quick Settings Nudge", kCaptureModeEducationQuickSettingsNudge, + std::size(kCaptureModeEducationQuickSettingsNudge), nullptr}}; + +const FeatureEntry::FeatureParam + kSystemShortcutBehaviorIgnoreCommonVdiShortcuts[] = { + {"behavior_type", "ignore_common_vdi_shortcuts"}}; +const FeatureEntry::FeatureParam + kSystemShortcutBehaviorIgnoreCommonVdiShortcutsFullscreenOnly[] = { + {"behavior_type", "ignore_common_vdi_shortcut_fullscreen_only"}}; +const FeatureEntry::FeatureParam + kSystemShortcutBehaviorAllowSearchBasedPassthrough[] = { + {"behavior_type", "allow_search_based_passthrough"}}; +const FeatureEntry::FeatureParam + kSystemShortcutBehaviorAllowSearchBasedPassthroughFullscreenOnly[] = { + {"behavior_type", "allow_search_based_passthrough_fullscreen_only"}}; + +const FeatureEntry::FeatureVariation kSystemShortcutBehaviorVariations[] = { + {"Ignore Common VDI Shortcuts", + kSystemShortcutBehaviorIgnoreCommonVdiShortcuts, + std::size(kSystemShortcutBehaviorIgnoreCommonVdiShortcuts), nullptr}, + {"Ignore Common VDI Shortcuts while Fullscreen", + kSystemShortcutBehaviorIgnoreCommonVdiShortcutsFullscreenOnly, + std::size(kSystemShortcutBehaviorIgnoreCommonVdiShortcutsFullscreenOnly), + nullptr}, + {"Allow Search Based Passthrough", + kSystemShortcutBehaviorAllowSearchBasedPassthrough, + std::size(kSystemShortcutBehaviorAllowSearchBasedPassthrough), nullptr}, + {"Allow Search Based Passthrough while Fullscreen", + kSystemShortcutBehaviorAllowSearchBasedPassthroughFullscreenOnly, + std::size( + kSystemShortcutBehaviorAllowSearchBasedPassthroughFullscreenOnly), + nullptr}, +}; + +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_CHROMEOS) +constexpr char kWallpaperFastRefreshInternalName[] = "wallpaper-fast-refresh"; +constexpr char kWallpaperGooglePhotosSharedAlbumsInternalName[] = + "wallpaper-google-photos-shared-albums"; +constexpr char kGlanceablesTimeManagementClassroomStudentViewInternalName[] = + "glanceables-time-management-classroom-student-view"; +constexpr char kGlanceablesTimeManagementTasksViewInternalName[] = + "glanceables-time-management-tasks-view"; +constexpr char kBackgroundListeningName[] = "background-listening"; +constexpr char kBorealisBigGlInternalName[] = "borealis-big-gl"; +constexpr char kBorealisDGPUInternalName[] = "borealis-dgpu"; +constexpr char kBorealisEnableUnsupportedHardwareInternalName[] = + "borealis-enable-unsupported-hardware"; +constexpr char kBorealisForceBetaClientInternalName[] = + "borealis-force-beta-client"; +constexpr char kBorealisForceDoubleScaleInternalName[] = + "borealis-force-double-scale"; +constexpr char kBorealisLinuxModeInternalName[] = "borealis-linux-mode"; +// This differs slightly from its symbol's name since "enabled" is used +// internally to refer to whether borealis is installed or not. +constexpr char kBorealisPermittedInternalName[] = "borealis-enabled"; +constexpr char kBorealisProvisionInternalName[] = "borealis-provision"; +constexpr char kBorealisScaleClientByDPIInternalName[] = + "borealis-scale-client-by-dpi"; +constexpr char kBorealisZinkGlDriverInternalName[] = "borealis-zink-gl-driver"; +constexpr char kBluetoothUseFlossInternalName[] = "bluetooth-use-floss"; +constexpr char kBluetoothUseLLPrivacyInternalName[] = "bluetooth-use-llprivacy"; +constexpr char kAssistantIphInternalName[] = "assistant-iph"; +constexpr char kGrowthCampaigns[] = "growth-campaigns"; +constexpr char kGrowthCampaignsTestTag[] = "campaigns-test-tag"; +constexpr char kVcTrayMicIndicatorInternalName[] = "vc-tray-mic-indicator"; +constexpr char kVcTrayTitleHeaderInternalName[] = "vc-tray-title-header"; +#endif // BUILDFLAG(IS_CHROMEOS) + +#if !BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kLensOverlayNoOmniboxEntryPoint[] = { + {"omnibox-entry-point", "false"}, +}; +const FeatureEntry::FeatureParam kLensOverlayResponsiveOmniboxEntryPoint[] = { + {"omnibox-entry-point", "true"}, + {"omnibox-entry-point-always-visible", "false"}, +}; +const FeatureEntry::FeatureParam kLensOverlayPersistentOmniboxEntryPoint[] = { + {"omnibox-entry-point", "true"}, + {"omnibox-entry-point-always-visible", "true"}, +}; + +const FeatureEntry::FeatureVariation kLensOverlayVariations[] = { + {"with no omnibox entry point", kLensOverlayNoOmniboxEntryPoint, + std::size(kLensOverlayNoOmniboxEntryPoint), nullptr}, + {"with responsive chip omnibox entry point", + kLensOverlayResponsiveOmniboxEntryPoint, + std::size(kLensOverlayResponsiveOmniboxEntryPoint), nullptr}, + {"with persistent icon omnibox entry point", + kLensOverlayPersistentOmniboxEntryPoint, + std::size(kLensOverlayPersistentOmniboxEntryPoint), nullptr}, +}; +#endif // !BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kLensOverlayImageContextMenuActionsCopy[] = { + {"enable-copy-as-image", "true"}, + {"enable-save-as-image", "false"}, +}; + +const FeatureEntry::FeatureParam kLensOverlayImageContextMenuActionsSave[] = { + {"enable-copy-as-image", "false"}, + {"enable-save-as-image", "true"}, +}; + +const FeatureEntry::FeatureParam + kLensOverlayImageContextMenuActionsCopyAndSave[] = { + {"enable-copy-as-image", "true"}, + {"enable-save-as-image", "true"}, +}; + +const FeatureEntry::FeatureVariation + kLensOverlayImageContextMenuActionsVariations[] = { + {"copy as image", kLensOverlayImageContextMenuActionsCopy, + std::size(kLensOverlayImageContextMenuActionsCopy), nullptr}, + {"save as image", kLensOverlayImageContextMenuActionsSave, + std::size(kLensOverlayImageContextMenuActionsSave), nullptr}, + {"copy and save as image", + kLensOverlayImageContextMenuActionsCopyAndSave, + std::size(kLensOverlayImageContextMenuActionsCopyAndSave), nullptr}, +}; + +const FeatureEntry::FeatureParam + kLensOverlayTextSelectionContextMenuEntrypointContextualized{ + "contextualize", "true"}; +const FeatureEntry::FeatureParam + kLensOverlayTextSelectionContextMenuEntrypointNonContextualized{ + "contextualize", "false"}; +const FeatureEntry::FeatureVariation + kLensOverlayTextSelectionContextMenuEntrypointVariations[] = { + {"contextualized", + &kLensOverlayTextSelectionContextMenuEntrypointContextualized, 1, + nullptr}, + {"non-contextualized", + &kLensOverlayTextSelectionContextMenuEntrypointNonContextualized, 1, + nullptr}, +}; +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) +const FeatureEntry::Choice kAlwaysEnableHdcpChoices[] = { + {flag_descriptions::kAlwaysEnableHdcpDefault, "", ""}, + {flag_descriptions::kAlwaysEnableHdcpType0, + ash::switches::kAlwaysEnableHdcp, "type0"}, + {flag_descriptions::kAlwaysEnableHdcpType1, + ash::switches::kAlwaysEnableHdcp, "type1"}, +}; + +const FeatureEntry::Choice kPrintingPpdChannelChoices[] = { + {flags_ui::kGenericExperimentChoiceDefault, "", ""}, + {ash::switches::kPrintingPpdChannelProduction, + ash::switches::kPrintingPpdChannel, + ash::switches::kPrintingPpdChannelProduction}, + {ash::switches::kPrintingPpdChannelStaging, + ash::switches::kPrintingPpdChannel, + ash::switches::kPrintingPpdChannelStaging}, + {ash::switches::kPrintingPpdChannelDev, ash::switches::kPrintingPpdChannel, + ash::switches::kPrintingPpdChannelDev}, + {ash::switches::kPrintingPpdChannelLocalhost, + ash::switches::kPrintingPpdChannel, + ash::switches::kPrintingPpdChannelLocalhost}}; +#endif // BUILDFLAG(IS_CHROMEOS) + +// Feature variations for kIsolateSandboxedIframes. +const FeatureEntry::FeatureParam kIsolateSandboxedIframesGroupingPerSite{ + "grouping", "per-site"}; +const FeatureEntry::FeatureParam kIsolateSandboxedIframesGroupingPerOrigin{ + "grouping", "per-origin"}; +const FeatureEntry::FeatureParam kIsolateSandboxedIframesGroupingPerDocument{ + "grouping", "per-document"}; +const FeatureEntry::FeatureVariation + kIsolateSandboxedIframesGroupingVariations[] = { + {"with grouping by URL's site", + &kIsolateSandboxedIframesGroupingPerSite, 1, nullptr}, + {"with grouping by URL's origin", + &kIsolateSandboxedIframesGroupingPerOrigin, 1, nullptr}, + {"with each sandboxed frame document in its own process", + &kIsolateSandboxedIframesGroupingPerDocument, 1, nullptr}, +}; + +// Feature variation for kPdfInk2. +#if BUILDFLAG(ENABLE_PDF_INK2) +const FeatureEntry::FeatureParam kPdfInk2TextHighlighting[] = { + {"text-annotations", "false"}, + {"text-highlighting", "true"}, +}; +const FeatureEntry::FeatureParam kPdfInk2TextAnnotations[] = { + {"text-annotations", "true"}, + {"text-highlighting", "false"}, +}; +const FeatureEntry::FeatureParam kPdfInk2TextHighlightingAndAnnotations[] = { + {"text-annotations", "true"}, + {"text-highlighting", "true"}, +}; + +const FeatureEntry::FeatureVariation kPdfInk2Variations[] = { + {"with text highlighting", kPdfInk2TextHighlighting, + std::size(kPdfInk2TextHighlighting), nullptr}, + {"with text annotations", kPdfInk2TextAnnotations, + std::size(kPdfInk2TextAnnotations), nullptr}, + {"with text highlighting and annotations", + kPdfInk2TextHighlightingAndAnnotations, + std::size(kPdfInk2TextHighlightingAndAnnotations), nullptr}, +}; +#endif // BUILDFLAG(ENABLE_PDF_INK2) + +const FeatureEntry::FeatureParam kWebRtcApmDownmixMethodAverage[] = { + {"method", "average"}}; +const FeatureEntry::FeatureParam kWebRtcApmDownmixMethodFirstChannel[] = { + {"method", "first"}}; +const FeatureEntry::FeatureVariation kWebRtcApmDownmixMethodVariations[] = { + {"- Average all the input channels", kWebRtcApmDownmixMethodAverage, + std::size(kWebRtcApmDownmixMethodAverage), nullptr}, + {"- Use first channel", kWebRtcApmDownmixMethodFirstChannel, + std::size(kWebRtcApmDownmixMethodFirstChannel), nullptr}}; + +const FeatureEntry::FeatureParam + kSafetyCheckUnusedSitePermissionsNoDelayParam[] = { + {"unused-site-permissions-no-delay-for-testing", "true"}}; + +const FeatureEntry::FeatureParam + kSafetyCheckUnusedSitePermissionsWithDelayParam[] = { + {"unused-site-permissions-with-delay-for-testing", "true"}}; + +const FeatureEntry::FeatureVariation + kSafetyCheckUnusedSitePermissionsVariations[] = { + {"for testing no delay", kSafetyCheckUnusedSitePermissionsNoDelayParam, + std::size(kSafetyCheckUnusedSitePermissionsNoDelayParam), nullptr}, + {"for testing with delay", + kSafetyCheckUnusedSitePermissionsWithDelayParam, + std::size(kSafetyCheckUnusedSitePermissionsWithDelayParam), nullptr}, +}; + +const FeatureEntry::FeatureParam kSafetyHub_NoDelay[] = { + {safety_check::features::kPasswordCheckNotificationIntervalName, "0d"}, + {safety_check::features::kRevokedPermissionsNotificationIntervalName, "0d"}, + {safety_check::features::kNotificationPermissionsNotificationIntervalName, + "0d"}, + {safety_check::features::kSafeBrowsingNotificationIntervalName, "0d"}}; +const FeatureEntry::FeatureParam kSafetyHub_WithDelay[] = { + {safety_check::features::kPasswordCheckNotificationIntervalName, "0d"}, + {safety_check::features::kRevokedPermissionsNotificationIntervalName, "5m"}, + {safety_check::features::kNotificationPermissionsNotificationIntervalName, + "5m"}, + {safety_check::features::kSafeBrowsingNotificationIntervalName, "5m"}}; +const FeatureEntry::FeatureVariation kSafetyHubVariations[] = { + {"for testing no delay", kSafetyHub_NoDelay, std::size(kSafetyHub_NoDelay), + nullptr}, + {"for testing with delay", kSafetyHub_WithDelay, + std::size(kSafetyHub_WithDelay), nullptr}, +}; + +const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingControl1[] = { + {tpcd::experiment::kForceEligibleForTestingName, "false"}, + {tpcd::experiment::kDisable3PCookiesName, "false"}, + {features::kCookieDeprecationTestingDisableAdsAPIsName, "false"}, + {features::kCookieDeprecationLabelName, "fake_control_1.1"}, + {tpcd::experiment::kVersionName, "9990"}}; +const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingLabelOnly[] = { + {tpcd::experiment::kForceEligibleForTestingName, "false"}, + {tpcd::experiment::kDisable3PCookiesName, "false"}, + {features::kCookieDeprecationTestingDisableAdsAPIsName, "false"}, + {features::kCookieDeprecationLabelName, "fake_label_only_1.1"}, + {tpcd::experiment::kVersionName, "9991"}}; +const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingTreatment[] = { + {tpcd::experiment::kForceEligibleForTestingName, "false"}, + {tpcd::experiment::kDisable3PCookiesName, "true"}, + {features::kCookieDeprecationTestingDisableAdsAPIsName, "false"}, + {features::kCookieDeprecationLabelName, "fake_treatment_1.1"}, + {tpcd::experiment::kVersionName, "9992"}}; +const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingControl2[] = { + {tpcd::experiment::kForceEligibleForTestingName, "false"}, + {tpcd::experiment::kDisable3PCookiesName, "true"}, + {features::kCookieDeprecationTestingDisableAdsAPIsName, "true"}, + {features::kCookieDeprecationLabelName, "fake_control_2"}, + {tpcd::experiment::kVersionName, "9993"}}; +const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingForceControl1[] = + {{tpcd::experiment::kForceEligibleForTestingName, "true"}, + {tpcd::experiment::kDisable3PCookiesName, "false"}, + {features::kCookieDeprecationTestingDisableAdsAPIsName, "false"}, + {features::kCookieDeprecationLabelName, "fake_control_1.1"}, + {tpcd::experiment::kVersionName, "9994"}}; +const FeatureEntry::FeatureParam + kTPCPhaseOutFacilitatedTestingForceLabelOnly[] = { + {tpcd::experiment::kForceEligibleForTestingName, "true"}, + {tpcd::experiment::kDisable3PCookiesName, "false"}, + {features::kCookieDeprecationTestingDisableAdsAPIsName, "false"}, + {features::kCookieDeprecationLabelName, "fake_label_only_1.1"}, + {tpcd::experiment::kVersionName, "9995"}}; +const FeatureEntry::FeatureParam + kTPCPhaseOutFacilitatedTestingForceTreatment[] = { + {tpcd::experiment::kForceEligibleForTestingName, "true"}, + {tpcd::experiment::kDisable3PCookiesName, "true"}, + {features::kCookieDeprecationTestingDisableAdsAPIsName, "false"}, + {features::kCookieDeprecationLabelName, "fake_treatment_1.1"}, + {tpcd::experiment::kVersionName, "9996"}}; +const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingForceControl2[] = + {{tpcd::experiment::kForceEligibleForTestingName, "true"}, + {tpcd::experiment::kDisable3PCookiesName, "true"}, + {features::kCookieDeprecationTestingDisableAdsAPIsName, "true"}, + {features::kCookieDeprecationLabelName, "fake_control_2"}, + {tpcd::experiment::kVersionName, "9997"}}; + +const FeatureEntry::FeatureVariation + kTPCPhaseOutFacilitatedTestingVariations[] = { + {"Control 1", kTPCPhaseOutFacilitatedTestingControl1, + std::size(kTPCPhaseOutFacilitatedTestingControl1), nullptr}, + {"LabelOnly", kTPCPhaseOutFacilitatedTestingLabelOnly, + std::size(kTPCPhaseOutFacilitatedTestingLabelOnly), nullptr}, + {"Treatment", kTPCPhaseOutFacilitatedTestingTreatment, + std::size(kTPCPhaseOutFacilitatedTestingTreatment), nullptr}, + {"Control 2", kTPCPhaseOutFacilitatedTestingControl2, + std::size(kTPCPhaseOutFacilitatedTestingControl2), nullptr}, + {"Force Control 1", kTPCPhaseOutFacilitatedTestingForceControl1, + std::size(kTPCPhaseOutFacilitatedTestingForceControl1), nullptr}, + {"Force LabelOnly", kTPCPhaseOutFacilitatedTestingForceLabelOnly, + std::size(kTPCPhaseOutFacilitatedTestingForceLabelOnly), nullptr}, + {"Force Treatment", kTPCPhaseOutFacilitatedTestingForceTreatment, + std::size(kTPCPhaseOutFacilitatedTestingForceTreatment), nullptr}, + {"Force Control 2", kTPCPhaseOutFacilitatedTestingForceControl2, + std::size(kTPCPhaseOutFacilitatedTestingForceControl2), nullptr}, +}; + +const FeatureEntry::FeatureParam + kTpcdHeuristicsGrants_CurrentInteraction_ShortRedirect_MainFrameInitiator + [] = { + {content_settings::features::kTpcdReadHeuristicsGrantsName, "true"}, + {content_settings::features:: + kTpcdWritePopupCurrentInteractionHeuristicsGrantsName, + "30d"}, + {content_settings::features::kTpcdBackfillPopupHeuristicsGrantsName, + "30d"}, + {content_settings::features:: + kTpcdPopupHeuristicEnableForIframeInitiatorName, + "none"}, + {content_settings::features::kTpcdWriteRedirectHeuristicGrantsName, + "15m"}, + {content_settings::features:: + kTpcdRedirectHeuristicRequireABAFlowName, + "true"}, + {content_settings::features:: + kTpcdRedirectHeuristicRequireCurrentInteractionName, + "true"}}; +const FeatureEntry::FeatureParam + kTpcdHeuristicsGrants_CurrentInteraction_LongRedirect_MainFrameInitiator[] = + {{content_settings::features::kTpcdReadHeuristicsGrantsName, "true"}, + {content_settings::features:: + kTpcdWritePopupCurrentInteractionHeuristicsGrantsName, + "30d"}, + {content_settings::features::kTpcdBackfillPopupHeuristicsGrantsName, + "30d"}, + {content_settings::features:: + kTpcdPopupHeuristicEnableForIframeInitiatorName, + "none"}, + {content_settings::features::kTpcdWriteRedirectHeuristicGrantsName, + "30d"}, + {content_settings::features::kTpcdRedirectHeuristicRequireABAFlowName, + "true"}, + {content_settings::features:: + kTpcdRedirectHeuristicRequireCurrentInteractionName, + "true"}}; +const FeatureEntry::FeatureParam + kTpcdHeuristicsGrants_CurrentInteraction_ShortRedirect_AllFrameInitiator[] = + {{content_settings::features::kTpcdReadHeuristicsGrantsName, "true"}, + {content_settings::features:: + kTpcdWritePopupCurrentInteractionHeuristicsGrantsName, + "30d"}, + {content_settings::features::kTpcdBackfillPopupHeuristicsGrantsName, + "30d"}, + {content_settings::features:: + kTpcdPopupHeuristicEnableForIframeInitiatorName, + "all"}, + {content_settings::features::kTpcdWriteRedirectHeuristicGrantsName, + "15m"}, + {content_settings::features::kTpcdRedirectHeuristicRequireABAFlowName, + "true"}, + {content_settings::features:: + kTpcdRedirectHeuristicRequireCurrentInteractionName, + "true"}}; +const FeatureEntry::FeatureParam + kTpcdHeuristicsGrants_CurrentInteraction_LongRedirect_AllFrameInitiator[] = + {{content_settings::features::kTpcdReadHeuristicsGrantsName, "true"}, + {content_settings::features:: + kTpcdWritePopupCurrentInteractionHeuristicsGrantsName, + "30d"}, + {content_settings::features::kTpcdBackfillPopupHeuristicsGrantsName, + "30d"}, + {content_settings::features:: + kTpcdPopupHeuristicEnableForIframeInitiatorName, + "all"}, + {content_settings::features::kTpcdWriteRedirectHeuristicGrantsName, + "30d"}, + {content_settings::features::kTpcdRedirectHeuristicRequireABAFlowName, + "true"}, + {content_settings::features:: + kTpcdRedirectHeuristicRequireCurrentInteractionName, + "true"}}; + +const FeatureEntry::FeatureVariation kTpcdHeuristicsGrantsVariations[] = { + {"CurrentInteraction_ShortRedirect_MainFrameInitiator", + kTpcdHeuristicsGrants_CurrentInteraction_ShortRedirect_MainFrameInitiator, + std::size( + kTpcdHeuristicsGrants_CurrentInteraction_ShortRedirect_MainFrameInitiator), + nullptr}, + {"CurrentInteraction_LongRedirect_MainFrameInitiator", + kTpcdHeuristicsGrants_CurrentInteraction_LongRedirect_MainFrameInitiator, + std::size( + kTpcdHeuristicsGrants_CurrentInteraction_LongRedirect_MainFrameInitiator), + nullptr}, + {"CurrentInteraction_ShortRedirect_AllFrameInitiator", + kTpcdHeuristicsGrants_CurrentInteraction_ShortRedirect_AllFrameInitiator, + std::size( + kTpcdHeuristicsGrants_CurrentInteraction_ShortRedirect_AllFrameInitiator), + nullptr}, + {"CurrentInteraction_LongRedirect_AllFrameInitiator", + kTpcdHeuristicsGrants_CurrentInteraction_LongRedirect_AllFrameInitiator, + std::size( + kTpcdHeuristicsGrants_CurrentInteraction_LongRedirect_AllFrameInitiator), + nullptr}}; + +#if BUILDFLAG(IS_CHROMEOS) +const FeatureEntry::FeatureParam kVcInferenceBackendAuto[] = { + {"inference_backend", "AUTO"}, +}; + +const FeatureEntry::FeatureParam kVcInferenceBackendGpu[] = { + {"inference_backend", "GPU"}, +}; + +const FeatureEntry::FeatureParam kVcInferenceBackendNpu[] = { + {"inference_backend", "NPU"}, +}; + +const FeatureEntry::FeatureVariation kVcRelightingInferenceBackendVariations[] = + {{"AUTO", kVcInferenceBackendAuto, std::size(kVcInferenceBackendAuto), + nullptr}, + {"GPU", kVcInferenceBackendGpu, std::size(kVcInferenceBackendGpu), + nullptr}, + {"NPU", kVcInferenceBackendNpu, std::size(kVcInferenceBackendNpu), + nullptr}}; + +const FeatureEntry::FeatureVariation kVcRetouchInferenceBackendVariations[] = { + {"AUTO", kVcInferenceBackendAuto, std::size(kVcInferenceBackendAuto), + nullptr}, + {"GPU", kVcInferenceBackendGpu, std::size(kVcInferenceBackendGpu), nullptr}, + {"NPU", kVcInferenceBackendNpu, std::size(kVcInferenceBackendNpu), + nullptr}}; + +const FeatureEntry::FeatureVariation + kVcSegmentationInferenceBackendVariations[] = { + {"AUTO", kVcInferenceBackendAuto, std::size(kVcInferenceBackendAuto), + nullptr}, + {"GPU", kVcInferenceBackendGpu, std::size(kVcInferenceBackendGpu), + nullptr}, + {"NPU", kVcInferenceBackendNpu, std::size(kVcInferenceBackendNpu), + nullptr}}; + +const FeatureEntry::FeatureParam kVcSegmentationModelHighResolution[] = { + {"segmentation_model", "high_resolution"}, +}; + +const FeatureEntry::FeatureParam kVcSegmentationModelLowerResolution[] = { + {"segmentation_model", "lower_resolution"}, +}; + +const FeatureEntry::FeatureVariation kVcSegmentationModelVariations[] = { + {"High resolution model", kVcSegmentationModelHighResolution, + std::size(kVcSegmentationModelHighResolution), nullptr}, + {"Lower resolution model", kVcSegmentationModelLowerResolution, + std::size(kVcSegmentationModelLowerResolution), nullptr}, +}; + +const FeatureEntry::FeatureParam kVcLightIntensity10[] = { + {"light_intensity", "1.0"}, +}; + +const FeatureEntry::FeatureParam kVcLightIntensity13[] = { + {"light_intensity", "1.3"}, +}; + +const FeatureEntry::FeatureParam kVcLightIntensity15[] = { + {"light_intensity", "1.5"}, +}; + +const FeatureEntry::FeatureParam kVcLightIntensity17[] = { + {"light_intensity", "1.7"}, +}; + +const FeatureEntry::FeatureParam kVcLightIntensity18[] = { + {"light_intensity", "1.8"}, +}; + +const FeatureEntry::FeatureParam kVcLightIntensity20[] = { + {"light_intensity", "2.0"}, +}; + +const FeatureEntry::FeatureVariation kVcLightIntensityVariations[] = { + {"1.0", kVcLightIntensity10, std::size(kVcLightIntensity10), nullptr}, + {"1.3", kVcLightIntensity13, std::size(kVcLightIntensity13), nullptr}, + {"1.5", kVcLightIntensity15, std::size(kVcLightIntensity15), nullptr}, + {"1.7", kVcLightIntensity17, std::size(kVcLightIntensity17), nullptr}, + {"1.8", kVcLightIntensity18, std::size(kVcLightIntensity18), nullptr}, + {"2.0", kVcLightIntensity20, std::size(kVcLightIntensity20), nullptr}, +}; + +const FeatureEntry::FeatureParam + kCrOSLateBootMissiveDisableStorageDegradation[] = { + {"controlled_degradation", "false"}}; +const FeatureEntry::FeatureParam + kCrOSLateBootMissiveEnableStorageDegradation[] = { + {"controlled_degradation", "true"}}; +const FeatureEntry::FeatureParam kCrOSLateBootMissiveDisableLegacyStorage[] = { + {"legacy_storage_enabled", + "UNDEFINED_PRIORITY"}}; // All others are multi-generation action state. +const FeatureEntry::FeatureParam kCrOSLateBootMissiveEnableLegacyStorage[] = { + {"legacy_storage_enabled", + "SECURITY," + "IMMEDIATE," + "FAST_BATCH," + "SLOW_BATCH," + "BACKGROUND_BATCH," + "MANUAL_BATCH," + "MANUAL_BATCH_LACROS,"}}; +const FeatureEntry::FeatureParam kCrOSLateBootMissivePartialLegacyStorage[] = { + {"legacy_storage_enabled", + "SECURITY," + "IMMEDIATE,"}}; +const FeatureEntry::FeatureParam kCrOSLateBootMissiveSecurityLegacyStorage[] = { + {"legacy_storage_enabled", "SECURITY,"}}; + +const FeatureEntry::FeatureVariation + kCrOSLateBootMissiveStorageDefaultVariations[] = { + {"Enable storage degradation", + kCrOSLateBootMissiveEnableStorageDegradation, + std::size(kCrOSLateBootMissiveEnableStorageDegradation), nullptr}, + {"Disable storage degradation", + kCrOSLateBootMissiveDisableStorageDegradation, + std::size(kCrOSLateBootMissiveDisableStorageDegradation), nullptr}, + {"Enable all queues legacy", kCrOSLateBootMissiveEnableLegacyStorage, + std::size(kCrOSLateBootMissiveEnableLegacyStorage), nullptr}, + {"Disable all queues legacy", kCrOSLateBootMissiveDisableLegacyStorage, + std::size(kCrOSLateBootMissiveDisableLegacyStorage), nullptr}, + {"Enable SECURITY and IMMEDIATE queues legacy only", + kCrOSLateBootMissivePartialLegacyStorage, + std::size(kCrOSLateBootMissivePartialLegacyStorage), nullptr}, + {"Enable SECURITY queues legacy only", + kCrOSLateBootMissiveSecurityLegacyStorage, + std::size(kCrOSLateBootMissiveSecurityLegacyStorage), nullptr}, +}; +#endif // BUILDFLAG(IS_CHROMEOS) + +#if !BUILDFLAG(IS_ANDROID) +const FeatureEntry::Choice kCastMirroringTargetPlayoutDelayChoices[] = { + {flag_descriptions::kCastMirroringTargetPlayoutDelayDefault, "", ""}, + {flag_descriptions::kCastMirroringTargetPlayoutDelay100ms, + switches::kCastMirroringTargetPlayoutDelay, "100"}, + {flag_descriptions::kCastMirroringTargetPlayoutDelay150ms, + switches::kCastMirroringTargetPlayoutDelay, "150"}, + {flag_descriptions::kCastMirroringTargetPlayoutDelay250ms, + switches::kCastMirroringTargetPlayoutDelay, "250"}, + {flag_descriptions::kCastMirroringTargetPlayoutDelay300ms, + switches::kCastMirroringTargetPlayoutDelay, "300"}, + {flag_descriptions::kCastMirroringTargetPlayoutDelay350ms, + switches::kCastMirroringTargetPlayoutDelay, "350"}, + {flag_descriptions::kCastMirroringTargetPlayoutDelay400ms, + switches::kCastMirroringTargetPlayoutDelay, "400"}}; + +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(ENABLE_BOUND_SESSION_CREDENTIALS) +const FeatureEntry::FeatureParam + kEnableBoundSessionCredentialsWithMultiSessionSupport[] = { + {"exclusive-registration-path", ""}}; + +const FeatureEntry::FeatureVariation + kEnableBoundSessionCredentialsVariations[] = { + {"with multi-session", + kEnableBoundSessionCredentialsWithMultiSessionSupport, + std::size(kEnableBoundSessionCredentialsWithMultiSessionSupport), + nullptr}}; +#endif // BUILDFLAG(ENABLE_BOUND_SESSION_CREDENTIALS) + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kEdgeToEdgeTabletFeatureParams[] = { + {"e2e_tablet_invisible_bottom_chin_min_width", "768"}}; +const FeatureEntry::FeatureVariation kEdgeToEdgeTabletVariations[] = { + {"chin on smaller screens", kEdgeToEdgeTabletFeatureParams, + std::size(kEdgeToEdgeTabletFeatureParams), nullptr}, +}; + +const FeatureEntry::FeatureParam sAndroidThemeModuleParams[] = { + {"force_theme_module_dependencies", "true"}}; +const FeatureEntry::FeatureVariation kAndroidThemeModuleVariations[] = { + {"force dependencies", sAndroidThemeModuleParams, + std::size(sAndroidThemeModuleParams), nullptr}, +}; + +const FeatureEntry::FeatureParam sAndroidThemeResourceProviderParams[] = { + {"force_light_theme", "true"}}; +const FeatureEntry::FeatureVariation kAndroidThemeResourceProviderVariations[] = + { + {"force light theme", sAndroidThemeResourceProviderParams, + std::size(sAndroidThemeResourceProviderParams), nullptr}, +}; + +const FeatureEntry::FeatureParam + kAuxiliaryNavigationStaysInBrowserOnForDesktopWindowing[] = { + {"auxiliary_navigation_stays_in_browser", "desktop_wm"}}; +const FeatureEntry::FeatureParam kAuxiliaryNavigationStaysInBrowserOn[] = { + {"auxiliary_navigation_stays_in_browser", "all_wm"}}; +const FeatureEntry::FeatureVariation + kAuxiliaryNavigationStaysInBrowserVariations[] = { + {" - desktop windowing mode", + kAuxiliaryNavigationStaysInBrowserOnForDesktopWindowing, + std::size(kAuxiliaryNavigationStaysInBrowserOnForDesktopWindowing), + nullptr}, + {" - all windowing modes", kAuxiliaryNavigationStaysInBrowserOn, + std::size(kAuxiliaryNavigationStaysInBrowserOn), nullptr}}; + +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \ + BUILDFLAG(IS_CHROMEOS) +const flags_ui::FeatureEntry::FeatureParam kPwaNavigationCapturingDefaultOn[] = + {{"link_capturing_state", "on_by_default"}}; +const flags_ui::FeatureEntry::FeatureParam kPwaNavigationCapturingDefaultOff[] = + {{"link_capturing_state", "off_by_default"}}; +const flags_ui::FeatureEntry::FeatureParam + kPwaNavigationCapturingReimplDefaultOn[] = { + {"link_capturing_state", "reimpl_default_on"}}; +const flags_ui::FeatureEntry::FeatureParam + kPwaNavigationCapturingReimplDefaultOff[] = { + {"link_capturing_state", "reimpl_default_off"}}; +const flags_ui::FeatureEntry::FeatureParam + kPwaNavigationCapturingReimplOnViaClientMode[] = { + {"link_capturing_state", "reimpl_on_via_client_mode"}}; +const flags_ui::FeatureEntry::FeatureVariation + kPwaNavigationCapturingVariations[] = { + {"V1, On by default", kPwaNavigationCapturingDefaultOn, + std::size(kPwaNavigationCapturingDefaultOn), nullptr}, + {"V1, Off by default", kPwaNavigationCapturingDefaultOff, + std::size(kPwaNavigationCapturingDefaultOff), nullptr}, + {"V2, On by default", kPwaNavigationCapturingReimplDefaultOn, + std::size(kPwaNavigationCapturingReimplDefaultOn), nullptr}, + {"V2, Off by default", kPwaNavigationCapturingReimplDefaultOff, + std::size(kPwaNavigationCapturingReimplDefaultOff), nullptr}, + {"V2, On by app client_mode", + kPwaNavigationCapturingReimplOnViaClientMode, + std::size(kPwaNavigationCapturingReimplOnViaClientMode), nullptr}}; +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || + // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + +// UnoPhase2FollowUp flags. +const char kFastFollowFeatures[] = + "UnoForAuto," + "UnoPhase2FollowUp," + "UseHostedDomainForManagementCheckOnSignin"; + +const FeatureEntry::Choice kReplaceSyncPromosWithSignInPromosChoices[] = { + {"Default", "", ""}, + {"Follow-ups disabled", "disable-features", kFastFollowFeatures}, + {"Follow-ups enabled", "enable-features", kFastFollowFeatures}, +}; +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kLinkPreviewTriggerTypeAltClick[] = { + {"trigger_type", "alt_click"}}; +const FeatureEntry::FeatureParam kLinkPreviewTriggerTypeAltHover[] = { + {"trigger_type", "alt_hover"}}; +const FeatureEntry::FeatureParam kLinkPreviewTriggerTypeLongPress[] = { + {"trigger_type", "long_press"}}; + +const FeatureEntry::FeatureVariation kLinkPreviewTriggerTypeVariations[] = { + {"Alt + Click", kLinkPreviewTriggerTypeAltClick, + std::size(kLinkPreviewTriggerTypeAltClick), nullptr}, + {"Alt + Hover", kLinkPreviewTriggerTypeAltHover, + std::size(kLinkPreviewTriggerTypeAltHover), nullptr}, + {"Long Press", kLinkPreviewTriggerTypeLongPress, + std::size(kLinkPreviewTriggerTypeLongPress), nullptr}}; +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + +#endif // BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam kGroupSuggestionEnableRecentlyOpenedOnly[] = { + {"group_suggestion_enable_recently_opened", "true"}, + {"group_suggestion_enable_switch_between", "false"}, + {"group_suggestion_enable_similar_source", "false"}, + {"group_suggestion_enable_same_origin", "false"}, +}; +const FeatureEntry::FeatureParam kGroupSuggestionEnableSwitchBetweenOnly[] = { + {"group_suggestion_enable_recently_opened", "false"}, + {"group_suggestion_enable_switch_between", "true"}, + {"group_suggestion_enable_similar_source", "false"}, + {"group_suggestion_enable_same_origin", "false"}, + {"group_suggestion_trigger_calculation_on_page_load", "false"}, +}; +const FeatureEntry::FeatureParam kGroupSuggestionEnableSimilarSourceOnly[] = { + {"group_suggestion_enable_recently_opened", "false"}, + {"group_suggestion_enable_switch_between", "false"}, + {"group_suggestion_enable_similar_source", "true"}, + {"group_suggestion_enable_same_origin", "false"}, + {"group_suggestion_trigger_calculation_on_page_load", "false"}, +}; +const FeatureEntry::FeatureParam kGroupSuggestionEnableSameOriginOnly[] = { + {"group_suggestion_enable_recently_opened", "false"}, + {"group_suggestion_enable_switch_between", "false"}, + {"group_suggestion_enable_similar_source", "false"}, + {"group_suggestion_enable_same_origin", "true"}, +}; +const FeatureEntry::FeatureParam kGroupSuggestionEnableTabSwitcherOnly[] = { + {"group_suggestion_enable_tab_switcher_only", "true"}, +}; +const FeatureEntry::FeatureVariation kGroupSuggestionVariations[] = { + {"Recently Opened Only", kGroupSuggestionEnableRecentlyOpenedOnly, + std::size(kGroupSuggestionEnableRecentlyOpenedOnly), nullptr}, + {"Switch Between Only", kGroupSuggestionEnableSwitchBetweenOnly, + std::size(kGroupSuggestionEnableSwitchBetweenOnly), nullptr}, + {"Similar Source Only", kGroupSuggestionEnableSimilarSourceOnly, + std::size(kGroupSuggestionEnableSimilarSourceOnly), nullptr}, + {"Same Origin Only", kGroupSuggestionEnableSameOriginOnly, + std::size(kGroupSuggestionEnableSameOriginOnly), nullptr}, + {"Tab Switcher Only", kGroupSuggestionEnableTabSwitcherOnly, + std::size(kGroupSuggestionEnableTabSwitcherOnly), nullptr}, +}; + +#if BUILDFLAG(ENABLE_COMPOSE) +// Variations of the Compose selection nudge. +const FeatureEntry::FeatureParam kComposeSelectionNudge_1[] = { + {"selection_nudge_length", "1"}}; + +const FeatureEntry::FeatureParam kComposeSelectionNudge_15[] = { + {"selection_nudge_length", "15"}}; + +const FeatureEntry::FeatureParam kComposeSelectionNudge_30[] = { + {"selection_nudge_length", "30"}}; + +const FeatureEntry::FeatureParam kComposeSelectionNudge_30_1s[] = { + {"selection_nudge_length", "30"}, + {"selection_nudge_delay_milliseconds", "1000"}}; + +const FeatureEntry::FeatureParam kComposeSelectionNudge_30_2s[] = { + {"selection_nudge_length", "30"}, + {"selection_nudge_delay_milliseconds", "2000"}}; + +const FeatureEntry::FeatureParam kComposeSelectionNudge_50[] = { + {"selection_nudge_length", "50"}}; + +const FeatureEntry::FeatureParam kComposeSelectionNudge_100[] = { + {"selection_nudge_length", "100"}}; + +const FeatureEntry::FeatureVariation kComposeSelectionNudgeVariations[] = { + {"1 Char", kComposeSelectionNudge_1, std::size(kComposeSelectionNudge_1), + nullptr}, + {"15 Char", kComposeSelectionNudge_15, std::size(kComposeSelectionNudge_15), + nullptr}, + {"30 Char", kComposeSelectionNudge_30, std::size(kComposeSelectionNudge_30), + nullptr}, + {"50 Char", kComposeSelectionNudge_50, std::size(kComposeSelectionNudge_50), + nullptr}, + {"100 Char", kComposeSelectionNudge_100, + std::size(kComposeSelectionNudge_100), nullptr}, + {"30 Char - 1sec", kComposeSelectionNudge_30_1s, + std::size(kComposeSelectionNudge_30_1s), nullptr}, + {"30 char - 2sec", kComposeSelectionNudge_30_2s, + std::size(kComposeSelectionNudge_30_2s), nullptr}}; +#endif // ENABLE_COMPOSE + +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) +const FeatureEntry::FeatureParam kLocationProviderManagerModeNetworkOnly[] = { + {"LocationProviderManagerMode", "NetworkOnly"}}; +const FeatureEntry::FeatureParam kLocationProviderManagerModePlatformOnly[] = { + {"LocationProviderManagerMode", "PlatformOnly"}}; +const FeatureEntry::FeatureParam kLocationProviderManagerModeHybridPlatform[] = + {{"LocationProviderManagerMode", "HybridPlatform"}}; +const FeatureEntry::FeatureParam kLocationProviderManagerModeHybridPlatform2[] = + {{"LocationProviderManagerMode", "HybridPlatform2"}}; + +const FeatureEntry::FeatureVariation kLocationProviderManagerVariations[] = { + {"Network only", kLocationProviderManagerModeNetworkOnly, + std::size(kLocationProviderManagerModeNetworkOnly), nullptr}, + {"Platform only", kLocationProviderManagerModePlatformOnly, + std::size(kLocationProviderManagerModePlatformOnly), nullptr}, + {"Wi-Fi fallback", kLocationProviderManagerModeHybridPlatform, + std::size(kLocationProviderManagerModeHybridPlatform), nullptr}, + {"Fallback on error", kLocationProviderManagerModeHybridPlatform2, + std::size(kLocationProviderManagerModeHybridPlatform2), nullptr}}; +#endif // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + +const FeatureEntry::FeatureParam kVisitedURLRankingDomainDeduplicationParam[] = + {{"url_deduplication_include_title", "false"}}; + +const FeatureEntry::FeatureParam + kVisitedURLRankingDomainDeduplicationIncludeQueryParam[] = { + {"url_deduplication_include_title", "false"}, + {"url_deduplication_fallback", "false"}}; + +const FeatureEntry::FeatureParam + kVisitedURLRankingDomainDeduplicationIncludePathQueryParam[] = { + {"url_deduplication_include_title", "false"}, + {"url_deduplication_clear_path", "false"}, + {"url_deduplication_fallback", "false"}}; + +const FeatureEntry::FeatureVariation + kVisitedURLRankingDomainDeduplicationVariations[] = { + {"- Domain Deduplication", kVisitedURLRankingDomainDeduplicationParam, + std::size(kVisitedURLRankingDomainDeduplicationParam), nullptr}, + {"- Domain Deduplication - Include Query", + kVisitedURLRankingDomainDeduplicationIncludeQueryParam, + std::size(kVisitedURLRankingDomainDeduplicationIncludeQueryParam), + nullptr}, + {"- Domain Deduplication - Include Path and Query", + kVisitedURLRankingDomainDeduplicationIncludePathQueryParam, + std::size(kVisitedURLRankingDomainDeduplicationIncludePathQueryParam), + nullptr}}; + +const FeatureEntry::FeatureParam + kAutofillImprovedLabelsWithoutMainTextChanges[] = { + {"autofill_improved_labels_without_main_text_changes", "true"}, + {"autofill_improved_labels_with_differentiating_labels_in_front", + "false"}}; + +const FeatureEntry::FeatureParam + kAutofillImprovedLabelsWithDifferentiatingLabelsInFront[] = { + {"autofill_improved_labels_without_main_text_changes", "false"}, + {"autofill_improved_labels_with_differentiating_labels_in_front", + "true"}}; + +const FeatureEntry::FeatureVariation kAutofillImprovedLabelsVariations[] = { + {"without main text changes", kAutofillImprovedLabelsWithoutMainTextChanges, + std::size(kAutofillImprovedLabelsWithoutMainTextChanges), nullptr}, + {"with differentiating labels in front", + kAutofillImprovedLabelsWithDifferentiatingLabelsInFront, + std::size(kAutofillImprovedLabelsWithDifferentiatingLabelsInFront), + nullptr}, +}; + +#if BUILDFLAG(ENABLE_EXTENSIONS) +constexpr char kExtensionAiDataInternalName[] = + "enable-extension-ai-data-collection"; +#endif // BUILDFLAG(ENABLE_EXTENSIONS) + +const FeatureEntry::FeatureParam kDiscountOnShoppyPage[] = { + {commerce::kDiscountOnShoppyPageParam, "true"}}; + +#if !BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureVariation kDiscountsVariations[] = { + {"Discount on Shoppy page", kDiscountOnShoppyPage, + std::size(kDiscountOnShoppyPage), nullptr}}; +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kDiscountIconOnAndroidUseAlternateColor[] = { + {commerce::kDiscountOnShoppyPageParam, "true"}, + {"action_chip_with_different_color", "true"}}; +const FeatureEntry::FeatureVariation kDiscountsVariationsOnAndroid[] = { + {"Discount on Shoppy page", kDiscountOnShoppyPage, + std::size(kDiscountOnShoppyPage), nullptr}, + {"action chip different color", kDiscountIconOnAndroidUseAlternateColor, + std::size(kDiscountIconOnAndroidUseAlternateColor), nullptr}}; +#endif // BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam kSkiaGraphite_ValidationEnabled[] = { + {"dawn_skip_validation", "false"}}; +const FeatureEntry::FeatureParam kSkiaGraphite_ValidationDisabled[] = { + {"dawn_skip_validation", "true"}}; +const FeatureEntry::FeatureParam kSkiaGraphite_DebugLabelsEnabled[] = { + {"dawn_backend_debug_labels", "true"}}; + +const FeatureEntry::FeatureVariation kSkiaGraphiteVariations[] = { + {"dawn frontend validation enabled", kSkiaGraphite_ValidationEnabled, + std::size(kSkiaGraphite_ValidationEnabled), nullptr}, + {"dawn frontend validation disabled", kSkiaGraphite_ValidationDisabled, + std::size(kSkiaGraphite_ValidationDisabled), nullptr}, + {"dawn debug labels enabled", kSkiaGraphite_DebugLabelsEnabled, + std::size(kSkiaGraphite_DebugLabelsEnabled), nullptr}, +}; + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) +const FeatureEntry::FeatureParam kTranslationAPI_SkipLanguagePackLimit[] = { + {"TranslationAPIAcceptLanguagesCheck", "false"}, + {"TranslationAPILimitLanguagePackCount", "false"}}; + +const FeatureEntry::FeatureVariation kTranslationAPIVariations[] = { + {"without language pack limit", kTranslationAPI_SkipLanguagePackLimit, + std::size(kTranslationAPI_SkipLanguagePackLimit), nullptr}}; +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kSensitiveContentUsePwmHeuristics[] = { + {"sensitive_content_use_pwm_heuristics", "true"}}; + +const FeatureEntry::FeatureVariation kSensitiveContentVariations[] = { + {"with password manager heuristics", kSensitiveContentUsePwmHeuristics, + std::size(kSensitiveContentUsePwmHeuristics), nullptr}, +}; +#endif // BUILDFLAG(IS_ANDROID) + +// Feature variations for kSubframeProcessReuseThresholds. +const FeatureEntry::FeatureParam kSubframeProcessReuseMemoryThreshold512MB{ + "SubframeProcessReuseMemoryThreshold", "536870912"}; +const FeatureEntry::FeatureParam kSubframeProcessReuseMemoryThreshold1GB{ + "SubframeProcessReuseMemoryThreshold", "1073741824"}; +const FeatureEntry::FeatureParam kSubframeProcessReuseMemoryThreshold2GB{ + "SubframeProcessReuseMemoryThreshold", "2147483648"}; +const FeatureEntry::FeatureParam kSubframeProcessReuseMemoryThreshold4GB{ + "SubframeProcessReuseMemoryThreshold", "4294967296"}; +const FeatureEntry::FeatureVariation + kSubframeProcessReuseThresholdsVariations[] = { + {"with 512MB memory threshold", + &kSubframeProcessReuseMemoryThreshold512MB, 1, nullptr}, + {"with 1GB memory threshold", &kSubframeProcessReuseMemoryThreshold1GB, + 1, nullptr}, + {"with 2GB memory threshold", &kSubframeProcessReuseMemoryThreshold2GB, + 1, nullptr}, + {"with 4GB memory threshold", &kSubframeProcessReuseMemoryThreshold4GB, + 1, nullptr}, +}; + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) +const FeatureEntry::FeatureParam kContextualCueingEnabledNoEngagementCap[] = { + {"BackoffTime", "0h"}, + {"BackoffMultiplierBase", "0.0"}, + {"NudgeCapTime", "0h"}, + {"NudgeCapTimePerDomain", "0h"}, + {"MinPageCountBetweenNudges", "0"}, + {"MinTimeBetweenNudges", "0h"}}; +const FeatureEntry::FeatureVariation kContextualCueingEnabledOptions[] = { + {"no engagement caps", kContextualCueingEnabledNoEngagementCap, + std::size(kContextualCueingEnabledNoEngagementCap), nullptr}, +}; +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) + +#if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) +const FeatureEntry::FeatureParam + kPartitionAllocWithAdvancedChecksEnabledProcesses_BrowserOnly[] = { + {"enabled-processes", "browser-only"}}; +const FeatureEntry::FeatureParam + kPartitionAllocWithAdvancedChecksEnabledProcesses_BrowserAndRenderer[] = { + {"enabled-processes", "browser-and-renderer"}}; +const FeatureEntry::FeatureParam + kPartitionAllocWithAdvancedChecksEnabledProcesses_NonRenderer[] = { + {"enabled-processes", "non-renderer"}}; +const FeatureEntry::FeatureParam + kPartitionAllocWithAdvancedChecksEnabledProcesses_AllProcesses[] = { + {"enabled-processes", "all-processes"}}; +const FeatureEntry::FeatureVariation + kPartitionAllocWithAdvancedChecksEnabledProcessesOptions[] = { + {"on browser process only", + kPartitionAllocWithAdvancedChecksEnabledProcesses_BrowserOnly, + std::size( + kPartitionAllocWithAdvancedChecksEnabledProcesses_BrowserOnly), + nullptr}, + {"on browser and renderer processes", + kPartitionAllocWithAdvancedChecksEnabledProcesses_BrowserAndRenderer, + std::size( + kPartitionAllocWithAdvancedChecksEnabledProcesses_BrowserAndRenderer), + nullptr}, + {"on non renderer processes", + kPartitionAllocWithAdvancedChecksEnabledProcesses_NonRenderer, + std::size( + kPartitionAllocWithAdvancedChecksEnabledProcesses_NonRenderer), + nullptr}, + {"on all processes", + kPartitionAllocWithAdvancedChecksEnabledProcesses_AllProcesses, + std::size( + kPartitionAllocWithAdvancedChecksEnabledProcesses_AllProcesses), + nullptr}}; +#endif // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + +const FeatureEntry::FeatureParam kSendTabIOSPushNotificationsWithURLImage[] = { + {send_tab_to_self::kSendTabIOSPushNotificationsURLImageParam, "true"}}; +const FeatureEntry::FeatureVariation kSendTabIOSPushNotificationsVariations[] = + { + {"With URL Image", kSendTabIOSPushNotificationsWithURLImage, + std::size(kSendTabIOSPushNotificationsWithURLImage), nullptr}, +}; + +#if BUILDFLAG(IS_ANDROID) && PA_BUILDFLAG(HAS_MEMORY_TAGGING) && \ + PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) +// Feature variations for kPartitionAllocMemoryTagging. +const FeatureEntry::FeatureParam + kPartitionAllocMemoryTaggingParams_AsyncBrowserOnly[] = { + {"enabled-processes", "browser-only"}, + {"memtag-mode", "async"}}; +const FeatureEntry::FeatureParam + kPartitionAllocMemoryTaggingParams_AsyncNonRenderer[] = { + {"enabled-processes", "non-renderer"}, + {"memtag-mode", "async"}}; +const FeatureEntry::FeatureParam + kPartitionAllocMemoryTaggingParams_AsyncAllProcesses[] = { + {"enabled-processes", "all-processes"}, + {"memtag-mode", "async"}}; +const FeatureEntry::FeatureParam + kPartitionAllocMemoryTaggingParams_SyncBrowserOnly[] = { + {"enabled-processes", "browser-only"}, + {"memtag-mode", "sync"}}; +const FeatureEntry::FeatureParam + kPartitionAllocMemoryTaggingParams_SyncNonRenderer[] = { + {"enabled-processes", "non-renderer"}, + {"memtag-mode", "sync"}}; +const FeatureEntry::FeatureParam + kPartitionAllocMemoryTaggingParams_SyncAllProcesses[] = { + {"enabled-processes", "all-processes"}, + {"memtag-mode", "sync"}}; +const FeatureEntry::FeatureVariation + kPartitionAllocMemoryTaggingEnabledProcessesOptions[] = { + {"ASYNC mode on browser process only", + kPartitionAllocMemoryTaggingParams_AsyncBrowserOnly, + std::size(kPartitionAllocMemoryTaggingParams_AsyncBrowserOnly), + nullptr}, + {"ASYNC mode on non renderer processes", + kPartitionAllocMemoryTaggingParams_AsyncNonRenderer, + std::size(kPartitionAllocMemoryTaggingParams_AsyncNonRenderer), + nullptr}, + {"ASYNC mode on all processes", + kPartitionAllocMemoryTaggingParams_AsyncAllProcesses, + std::size(kPartitionAllocMemoryTaggingParams_AsyncAllProcesses), + nullptr}, + {"SYNC mode on browser process only", + kPartitionAllocMemoryTaggingParams_SyncBrowserOnly, + std::size(kPartitionAllocMemoryTaggingParams_SyncBrowserOnly), + nullptr}, + {"SYNC mode on non renderer processes", + kPartitionAllocMemoryTaggingParams_SyncNonRenderer, + std::size(kPartitionAllocMemoryTaggingParams_SyncNonRenderer), + nullptr}, + {"SYNC mode on all processes", + kPartitionAllocMemoryTaggingParams_SyncAllProcesses, + std::size(kPartitionAllocMemoryTaggingParams_SyncAllProcesses), + nullptr}}; +#endif // BUILDFLAG(IS_ANDROID) && PA_BUILDFLAG(HAS_MEMORY_TAGGING) && + // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + +const FeatureEntry::FeatureParam kServiceWorkerAutoPreload_SWNotRunningOnly[] = + { + {"enable_only_when_service_worker_not_running", "true"}, +}; +const FeatureEntry::FeatureVariation kServiceWorkerAutoPreloadVariations[] = { + {"only when SW is not running", kServiceWorkerAutoPreload_SWNotRunningOnly, + std::size(kServiceWorkerAutoPreload_SWNotRunningOnly), nullptr}, +}; + +// LINT.IfChange(FingerprintingProtectionFilterFeatureParams) +const FeatureEntry::FeatureParam + kEnableFingerprintingProtectionFilter_WithLogging[] = { + {"activation_level", "enabled"}, + {"enable_console_logging", "true"}}; +const FeatureEntry::FeatureParam + kEnableFingerprintingProtectionFilter_DryRunWithLogging[] = { + {"activation_level", "dry_run"}, + {"enable_console_logging", "true"}}; +const FeatureEntry::FeatureVariation + kEnableFingerprintingProtectionFilterVariations[] = { + {" - with Console Logs", + kEnableFingerprintingProtectionFilter_WithLogging, + std::size(kEnableFingerprintingProtectionFilter_WithLogging), nullptr}, + {" - Dry Run with Console Logs", + kEnableFingerprintingProtectionFilter_DryRunWithLogging, + std::size(kEnableFingerprintingProtectionFilter_DryRunWithLogging), + nullptr}}; + +const FeatureEntry::FeatureParam + kEnableFingerprintingProtectionFilterInIncognito_WithLogging[] = { + {"activation_level", "enabled"}, + {"enable_console_logging", "true"}}; +const FeatureEntry::FeatureVariation + kEnableFingerprintingProtectionFilterInIncognitoVariations[] = { + {" - with Console Logs", + kEnableFingerprintingProtectionFilterInIncognito_WithLogging, + std::size( + kEnableFingerprintingProtectionFilterInIncognito_WithLogging), + nullptr}}; +// LINT.ThenChange(//ios/chrome/browser/flags/about_flags.mm:FingerprintingProtectionFilterFeatureParams) + +#if !BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kMerchantTrustEnabledWithSampleData[] = { + {page_info::kMerchantTrustEnabledWithSampleDataName, "true"}}; +const FeatureEntry::FeatureVariation kMerchantTrustVariations[] = { + {"Enabled with sample data", kMerchantTrustEnabledWithSampleData, + std::size(kMerchantTrustEnabledWithSampleData), nullptr}}; + +const FeatureEntry::FeatureParam kAudioDuckingAttenuation_60[] = { + {"attenuation", "60"}}; +const FeatureEntry::FeatureParam kAudioDuckingAttenuation_70[] = { + {"attenuation", "70"}}; +const FeatureEntry::FeatureParam kAudioDuckingAttenuation_80[] = { + {"attenuation", "80"}}; +const FeatureEntry::FeatureParam kAudioDuckingAttenuation_90[] = { + {"attenuation", "90"}}; +const FeatureEntry::FeatureParam kAudioDuckingAttenuation_100[] = { + {"attenuation", "100"}}; + +const FeatureEntry::FeatureVariation kAudioDuckingAttenuationVariations[] = { + {"attenuation 60", kAudioDuckingAttenuation_60, + std::size(kAudioDuckingAttenuation_60), nullptr}, + {"attenuation 70", kAudioDuckingAttenuation_70, + std::size(kAudioDuckingAttenuation_70), nullptr}, + {"attenuation 80", kAudioDuckingAttenuation_80, + std::size(kAudioDuckingAttenuation_80), nullptr}, + {"attenuation 90", kAudioDuckingAttenuation_90, + std::size(kAudioDuckingAttenuation_90), nullptr}, + {"attenuation 100", kAudioDuckingAttenuation_100, + std::size(kAudioDuckingAttenuation_100), nullptr}}; +#endif // !BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) +const char kAccountStoragePrefsThemesAndSearchEnginesFeatures[] = + // Flags for account storage of prefs. + "EnablePreferencesAccountStorage," + // Flags for account storage of search engines. + "DisableSyncAutogeneratedSearchEngines," + "SeparateLocalAndAccountSearchEngines," + // Flags for account storage of themes. + "SeparateLocalAndAccountThemes," + "ThemesBatchUpload"; + +const FeatureEntry::Choice kAccountStoragePrefsThemesAndSearchEnginesChoices[] = + {{"Default", "", ""}, + {"Disabled", "disable-features", + kAccountStoragePrefsThemesAndSearchEnginesFeatures}, + {"Enabled", "enable-features", + kAccountStoragePrefsThemesAndSearchEnginesFeatures}}; +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam + kMaliciousApkDownloadCheckTelemetryOnlyParams[] = { + {"telemetry_only", "true"}}; +const FeatureEntry::FeatureVariation kMaliciousApkDownloadCheckChoices[] = { + {"Telemetry only", kMaliciousApkDownloadCheckTelemetryOnlyParams, + std::size(kMaliciousApkDownloadCheckTelemetryOnlyParams), nullptr}}; +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) +constexpr char kDisableFacilitatedPaymentsMerchantAllowlistInternalName[] = + "disable-facilitated-payments-merchant-allowlist"; +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam kHistoryOptInEducationalTipTurnOn[] = { + {"history_opt_in_educational_tip_param", "0"}}; +const FeatureEntry::FeatureParam kHistoryOptInEducationalTipLetsGo[] = { + {"history_opt_in_educational_tip_param", "1"}}; +const FeatureEntry::FeatureParam kHistoryOptInEducationalTipContinue[] = { + {"history_opt_in_educational_tip_param", "2"}}; + +const FeatureEntry::FeatureVariation kHistoryOptInEducationalTipVariations[] = { + {"Enable with \"Turn on\" string variant", + kHistoryOptInEducationalTipTurnOn, + std::size(kHistoryOptInEducationalTipTurnOn), nullptr}, + {"Enable with \"Let's go\" string variant", + kHistoryOptInEducationalTipLetsGo, + std::size(kHistoryOptInEducationalTipLetsGo), nullptr}, + {"Enable with \"Continue\" string variant", + kHistoryOptInEducationalTipContinue, + std::size(kHistoryOptInEducationalTipContinue), nullptr}}; +#endif // BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam kStandardBoundSessionCredentialsStandard[] = { + {"RequireOriginTrialTokens", "true"}, + {"RefreshQuota", "true"}, + {"CheckSubdomainRegistration", "true"}}; +const FeatureEntry::FeatureParam + kStandardBoundSessionCredentialsForDevelopers[] = { + {"RequireOriginTrialTokens", "false"}, + {"RefreshQuota", "false"}, + {"CheckSubdomainRegistration", "false"}}; + +const FeatureEntry::FeatureVariation + kStandardBoundSessionCredentialsVariations[] = { + {"- Standard", kStandardBoundSessionCredentialsStandard, + std::size(kStandardBoundSessionCredentialsStandard), nullptr}, + {"- For developers", kStandardBoundSessionCredentialsForDevelopers, + std::size(kStandardBoundSessionCredentialsForDevelopers), nullptr}}; + +const FeatureEntry::FeatureParam kEnableCanvasNoiseInAllModes[] = { + {"enable_in_regular_mode", "true"}}; +const FeatureEntry::FeatureVariation kEnableCanvasNoiseVariations[] = { + {" - In all browsing modes", kEnableCanvasNoiseInAllModes, + std::size(kEnableCanvasNoiseInAllModes), nullptr}}; + +// LINT.IfChange(AutofillVcnEnrollStrikeExpiryTime) +const FeatureEntry::FeatureParam kAutofillVcnEnrollStrikeExpiryTime_120Days[] = + {{"autofill_vcn_strike_expiry_time_days", "120"}}; + +const FeatureEntry::FeatureParam kAutofillVcnEnrollStrikeExpiryTime_60Days[] = { + {"autofill_vcn_strike_expiry_time_days", "60"}}; + +const FeatureEntry::FeatureParam kAutofillVcnEnrollStrikeExpiryTime_30Days[] = { + {"autofill_vcn_strike_expiry_time_days", "30"}}; + +const FeatureEntry::FeatureVariation + kAutofillVcnEnrollStrikeExpiryTimeOptions[] = { + {"120 days", kAutofillVcnEnrollStrikeExpiryTime_120Days, + std::size(kAutofillVcnEnrollStrikeExpiryTime_120Days), nullptr}, + {"60 days", kAutofillVcnEnrollStrikeExpiryTime_60Days, + std::size(kAutofillVcnEnrollStrikeExpiryTime_60Days), nullptr}, + {"30 days", kAutofillVcnEnrollStrikeExpiryTime_30Days, + std::size(kAutofillVcnEnrollStrikeExpiryTime_30Days), nullptr}}; +// LINT.ThenChange(//ios/chrome/browser/flags/about_flags.mm:AutofillVcnEnrollStrikeExpiryTime) + +#if BUILDFLAG(ENABLE_GLIC) +// Variations of the glic panel reset for the top Chrome button. +const FeatureEntry::FeatureParam kGlicPanelResetTopChromeButtonOnOpen_1s[] = { + {"glic-panel-reset-delay-ms", "1000"}}; +const FeatureEntry::FeatureParam kGlicPanelResetTopChromeButtonOnOpen_2s[] = { + {"glic-panel-reset-delay-ms", "2000"}}; +const FeatureEntry::FeatureParam kGlicPanelResetTopChromeButtonOnOpen_3s[] = { + {"glic-panel-reset-delay-ms", "3000"}}; +const FeatureEntry::FeatureParam kGlicPanelResetTopChromeButtonOnOpen_5s[] = { + {"glic-panel-reset-delay-ms", "3000"}}; +const FeatureEntry::FeatureParam kGlicPanelResetTopChromeButtonOnOpen_10s[] = { + {"glic-panel-reset-delay-ms", "10000"}}; + +const FeatureEntry::FeatureVariation + kGlicPanelResetTopChromeButtonVariations[] = { + {"Reset on open - 1s", kGlicPanelResetTopChromeButtonOnOpen_1s, + std::size(kGlicPanelResetTopChromeButtonOnOpen_1s), nullptr}, + {"Reset on open - 2s", kGlicPanelResetTopChromeButtonOnOpen_2s, + std::size(kGlicPanelResetTopChromeButtonOnOpen_2s), nullptr}, + {"Reset on open - 3s", kGlicPanelResetTopChromeButtonOnOpen_3s, + std::size(kGlicPanelResetTopChromeButtonOnOpen_3s), nullptr}, + {"Reset on open - 5s", kGlicPanelResetTopChromeButtonOnOpen_5s, + std::size(kGlicPanelResetTopChromeButtonOnOpen_5s), nullptr}, + {"Reset on open - 10s", kGlicPanelResetTopChromeButtonOnOpen_10s, + std::size(kGlicPanelResetTopChromeButtonOnOpen_10s), nullptr}}; + +const FeatureEntry::FeatureParam kGlicPanelResetOnSessionTimeout_0h[] = { + {"glic-panel-reset-session-timeout-delay-h", "0"}, +}; + +const FeatureEntry::FeatureParam kGlicPanelResetOnSessionTimeout_5min[] = { + {"glic-panel-reset-session-timeout-delay-h", "0.084"}, +}; + +const FeatureEntry::FeatureParam kGlicPanelResetOnSessionTimeout_30min[] = { + {"glic-panel-reset-session-timeout-delay-h", "0.5"}, +}; + +const FeatureEntry::FeatureParam kGlicPanelResetOnSessionTimeout_1h[] = { + {"glic-panel-reset-session-timeout-delay-h", "1"}, +}; +const FeatureEntry::FeatureParam kGlicPanelResetOnSessionTimeout_2h[] = { + {"glic-panel-reset-session-timeout-delay-h", "2"}, +}; +const FeatureEntry::FeatureParam kGlicPanelResetOnSessionTimeout_4h[] = { + {"glic-panel-reset-session-timeout-delay-h", "4"}, +}; +const FeatureEntry::FeatureParam kGlicPanelResetOnSessionTimeout_12h[] = { + {"glic-panel-reset-session-timeout-delay-h", "12"}, +}; +const FeatureEntry::FeatureParam kGlicPanelResetOnSessionTimeout_24h[] = { + {"glic-panel-reset-session-timeout-delay-h", "24"}, +}; +const FeatureEntry::FeatureParam kGlicPanelResetOnSessionTimeout_48h[] = { + {"glic-panel-reset-session-timeout-delay-h", "48"}, +}; + +const FeatureEntry::FeatureVariation + kGlicPanelResetOnSessionTimeoutVariations[] = { + {"Always Restart (0min)", kGlicPanelResetOnSessionTimeout_0h, + std::size(kGlicPanelResetOnSessionTimeout_0h), nullptr}, + {"Reset after 5min", kGlicPanelResetOnSessionTimeout_5min, + std::size(kGlicPanelResetOnSessionTimeout_5min), nullptr}, + {"Reset after 30min", kGlicPanelResetOnSessionTimeout_30min, + std::size(kGlicPanelResetOnSessionTimeout_30min), nullptr}, + {"Reset after 1h", kGlicPanelResetOnSessionTimeout_1h, + std::size(kGlicPanelResetOnSessionTimeout_1h), nullptr}, + {"Reset after 2h", kGlicPanelResetOnSessionTimeout_2h, + std::size(kGlicPanelResetOnSessionTimeout_2h), nullptr}, + {"Reset after 4h", kGlicPanelResetOnSessionTimeout_4h, + std::size(kGlicPanelResetOnSessionTimeout_4h), nullptr}, + {"Reset after 12h", kGlicPanelResetOnSessionTimeout_12h, + std::size(kGlicPanelResetOnSessionTimeout_12h), nullptr}, + {"Reset after 24h", kGlicPanelResetOnSessionTimeout_24h, + std::size(kGlicPanelResetOnSessionTimeout_24h), nullptr}, + {"Reset after 48h", kGlicPanelResetOnSessionTimeout_48h, + std::size(kGlicPanelResetOnSessionTimeout_48h), nullptr}}; + +// Variations on pre-warming delays. +const FeatureEntry::FeatureParam kGlicWarmingShorterDelays[] = { + {"glic-warming-delay-ms", "5000"}, + {"glic-panel-reset-delay-ms", "2000"}}; + +const FeatureEntry::FeatureVariation kGlicWarmingVariations[] = { + {"with shorter delays", kGlicWarmingShorterDelays, + std::size(kGlicWarmingShorterDelays), nullptr}}; +#endif // BUILDFLAG(ENABLE_GLIC) + +const FeatureEntry::FeatureParam kAutofillShowTypePredictionsAsTitle[] = { + {"as-title", "true"}}; +const FeatureEntry::FeatureVariation kAutofillShowTypePredictionsVariations[] = + {{"- show predictions as title", kAutofillShowTypePredictionsAsTitle, + std::size(kAutofillShowTypePredictionsAsTitle), nullptr}}; + +const FeatureEntry::FeatureParam + kInvalidateChoiceOnRestoreIsRetroactiveOption[] = { + {"is_retroactive", "true"}}; +const FeatureEntry::FeatureVariation + kInvalidateSearchEngineChoiceOnRestoreVariations[] = { + {"(retroactive)", kInvalidateChoiceOnRestoreIsRetroactiveOption, + std::size(kInvalidateChoiceOnRestoreIsRetroactiveOption), nullptr}}; + +const FeatureEntry::FeatureParam kAILangsParam[] = {{"langs", "*"}}; + +const FeatureEntry::FeatureVariation kAILangsVariation[] = { + {"Multilingual", kAILangsParam, std::size(kAILangsParam), nullptr}, +}; + +#if BUILDFLAG(IS_WIN) +const FeatureEntry::FeatureParam kAvatarButtonSyncPromoMinimumCookeAge[] = { + // 30 seconds to simplify testing. + {"minimum-cookie-age", "30s"}}; + +const FeatureEntry::FeatureVariation kAvatarButtonSyncPromoVariations[] = { + {"with short minimum cookie age (for testing)", + kAvatarButtonSyncPromoMinimumCookeAge, + std::size(kAvatarButtonSyncPromoMinimumCookeAge), nullptr}}; +#endif + +#if BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam kTouchToSearchCalloutIphParams[] = { + {"iph", "true"}, +}; +const FeatureEntry::FeatureParam + kTouchToSearchCalloutSnippetAsSubtitleParams[] = { + {"snippet_as_subtitle", "true"}, +}; +const FeatureEntry::FeatureVariation kTouchToSearchCalloutVariations[] = { + {"Default", nullptr, 0, nullptr}, + {"IPH", kTouchToSearchCalloutIphParams, + std::size(kTouchToSearchCalloutIphParams), nullptr}, + {"Snippet As Subtitle", kTouchToSearchCalloutSnippetAsSubtitleParams, + std::size(kTouchToSearchCalloutSnippetAsSubtitleParams), nullptr}, +}; + +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kLensOverlayEduActionChipAllPages[] = { + {"url-allow-filters", "[\"*\"]"}, + {"url-path-forced-allowed-match-patterns", "[\".\"]"}, + {"disabled-by-glic", "false"}, +}; + +const FeatureEntry::FeatureParam kLensOverlayEduActionChipHomework[] = { + {"url-allow-filters", "[\"*\"]"}, + {"url-path-match-allow-filters", "[\"(?i)homework\"]"}, + {"disabled-by-glic", "false"}, +}; + +const FeatureEntry::FeatureVariation kLensOverlayEduActionChipVariations[] = { + {"trigger on \"homework\"", kLensOverlayEduActionChipHomework, + std::size(kLensOverlayEduActionChipAllPages), nullptr}, + {"force trigger all pages", kLensOverlayEduActionChipAllPages, + std::size(kLensOverlayEduActionChipAllPages), nullptr}, +}; + +const FeatureEntry::FeatureParam kLensOverlayEntrypointLabelAlt1[] = { + {"id", "1"}, +}; + +const FeatureEntry::FeatureParam kLensOverlayEntrypointLabelAlt2[] = { + {"id", "2"}, +}; + +const FeatureEntry::FeatureParam kLensOverlayEntrypointLabelAlt3[] = { + {"id", "3"}, +}; + +const FeatureEntry::FeatureVariation + kLensOverlayEntrypointLabelAltVariations[] = { + {"Ask Google about this page", kLensOverlayEntrypointLabelAlt1, + std::size(kLensOverlayEntrypointLabelAlt1), nullptr}, + {"Ask Google Lens about this page", kLensOverlayEntrypointLabelAlt2, + std::size(kLensOverlayEntrypointLabelAlt2), nullptr}, + {"Search this page with Google Lens", kLensOverlayEntrypointLabelAlt3, + std::size(kLensOverlayEntrypointLabelAlt3), nullptr}, +}; + +const FeatureEntry::FeatureParam kEnableNtpBrowserPromosVariationSimple[] = { + {"promo-type", "simple"}}; + +const FeatureEntry::FeatureParam kEnableNtpBrowserPromosVariationSetupList[] = { + {"promo-type", "setuplist"}}; + +const FeatureEntry::FeatureVariation kEnableNtpBrowserPromosVariations[] = { + {"Single-promo", kEnableNtpBrowserPromosVariationSimple, + std::size(kEnableNtpBrowserPromosVariationSimple)}, + {"Setup List", kEnableNtpBrowserPromosVariationSetupList, + std::size(kEnableNtpBrowserPromosVariationSetupList)}, +}; +#endif // !BUILDFLAG(IS_ANDROID) + +// LINT.IfChange(DataSharingVersioningChoices) +const FeatureEntry::Choice kDataSharingVersioningStateChoices[] = { + {"Default", "", ""}, + {flag_descriptions::kDataSharingSharedDataTypesEnabled, + switches::kEnableFeatures, "SharedDataTypesKillSwitch"}, + {flag_descriptions::kDataSharingSharedDataTypesEnabledWithUi, + switches::kEnableFeatures, + "SharedDataTypesKillSwitch,DataSharingEnableUpdateChromeUI"}, + {"Disabled", switches::kDisableFeatures, + "SharedDataTypesKillSwitch, DataSharingEnableUpdateChromeUI"}, +}; +// LINT.ThenChange(//ios/chrome/browser/flags/about_flags.mm:DataSharingVersioningChoices) + +const FeatureEntry::FeatureParam + kDiskCacheBackendExperimentVariations_Default[] = {{"backend", "default"}}; +const FeatureEntry::FeatureParam + kDiskCacheBackendExperimentVariations_Simple[] = {{"backend", "simple"}}; +#if !BUILDFLAG(IS_ANDROID) +// Block file backend is not supported on Android to reduce the binary size. +const FeatureEntry::FeatureParam + kDiskCacheBackendExperimentVariations_Blockfile[] = { + {"backend", "blockfile"}}; +#endif // !BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kDiskCacheBackendExperimentVariations_Sql[] = { + {"backend", "sql"}}; + +const FeatureEntry::FeatureVariation kDiskCacheBackendExperimentVariations[] = { + {"default backend", kDiskCacheBackendExperimentVariations_Default, + std::size(kDiskCacheBackendExperimentVariations_Default), nullptr}, + {"simple backend", kDiskCacheBackendExperimentVariations_Simple, + std::size(kDiskCacheBackendExperimentVariations_Simple), nullptr}, +#if !BUILDFLAG(IS_ANDROID) + {"blockfile backend", kDiskCacheBackendExperimentVariations_Blockfile, + std::size(kDiskCacheBackendExperimentVariations_Blockfile), nullptr}, +#endif // !BUILDFLAG(IS_ANDROID) + {"experimental sql backend", kDiskCacheBackendExperimentVariations_Sql, + std::size(kDiskCacheBackendExperimentVariations_Sql), nullptr}}; + +const FeatureEntry::FeatureParam + kSafetyHubDisruptiveNotificationRevocationVariations_RevokeAll[] = { + {"shadow_run", "false"}, + {"max_engagement_score", "100.0"}, + {"min_notification_count", "0"}, + {"waiting_time_as_proposed", "0d"}, + {"waiting_for_metrics_days", "0"}}; +const FeatureEntry::FeatureParam + kSafetyHubDisruptiveNotificationRevocationVariations_Moderate[] = { + {"shadow_run", "false"}, + {"max_engagement_score", "0.0"}, + {"min_notification_count", "4"}, + {"waiting_time_as_proposed", "4d"}, + {"waiting_for_metrics_days", "0"}}; +const FeatureEntry::FeatureVariation + kSafetyHubDisruptiveNotificationRevocationVariations[] = { + {"- Revoke all for testing", + kSafetyHubDisruptiveNotificationRevocationVariations_RevokeAll, + std::size( + kSafetyHubDisruptiveNotificationRevocationVariations_RevokeAll), + nullptr}, + {"- Moderate", + kSafetyHubDisruptiveNotificationRevocationVariations_Moderate, + std::size( + kSafetyHubDisruptiveNotificationRevocationVariations_Moderate), + nullptr}, +}; + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kApproximateGeolocationPermissionArm1Params[] = + {{"prompt_arm", "1"}, {"sample_data", "true"}}; +const FeatureEntry::FeatureParam kApproximateGeolocationPermissionArm2Params[] = + {{"prompt_arm", "2"}, {"sample_data", "true"}}; +const FeatureEntry::FeatureParam kApproximateGeolocationPermissionArm3Params[] = + {{"prompt_arm", "3"}, {"sample_data", "true"}}; +const FeatureEntry::FeatureParam kApproximateGeolocationPermissionArm4Params[] = + {{"prompt_arm", "4"}, {"sample_data", "true"}}; +const FeatureEntry::FeatureParam kApproximateGeolocationPermissionArm5Params[] = + {{"prompt_arm", "5"}, {"sample_data", "true"}}; +const FeatureEntry::FeatureParam kApproximateGeolocationPermissionArm6Params[] = + {{"prompt_arm", "6"}, {"sample_data", "true"}}; + +const FeatureEntry::FeatureVariation + kApproximateGeolocationPermissionVariations[] = { + {"- Prompt arm: Horizontal Minimal", + kApproximateGeolocationPermissionArm1Params, + std::size(kApproximateGeolocationPermissionArm1Params), nullptr}, + {"- Prompt arm: Horizontal with Icon", + kApproximateGeolocationPermissionArm2Params, + std::size(kApproximateGeolocationPermissionArm2Params), nullptr}, + {"- Prompt arm: Horizontal with Icon + Description", + kApproximateGeolocationPermissionArm3Params, + std::size(kApproximateGeolocationPermissionArm3Params), nullptr}, + {"- Prompt arm: Vertical", kApproximateGeolocationPermissionArm4Params, + std::size(kApproximateGeolocationPermissionArm4Params), nullptr}, + {"- Prompt arm: Vertical with Description", + kApproximateGeolocationPermissionArm5Params, + std::size(kApproximateGeolocationPermissionArm5Params), nullptr}, + {"- Prompt arm: Horizontal with Icon + Long Description", + kApproximateGeolocationPermissionArm6Params, + std::size(kApproximateGeolocationPermissionArm6Params), nullptr}, +}; +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kCCTResetTimeoutParams_1min[] = { + {"minimum_reset_timeout_mins", "1"}, +}; +const FeatureEntry::FeatureParam kCCTResetTimeoutParams_15min[] = { + {"minimum_reset_timeout_mins", "15"}, +}; +const FeatureEntry::FeatureParam kCCTResetTimeoutParams_30min[] = { + {"minimum_reset_timeout_mins", "30"}, +}; +const FeatureEntry::FeatureVariation kCCTResetTimeoutVariations[] = { + {"- Minimum timeout 1 minute", kCCTResetTimeoutParams_1min, + std::size(kCCTResetTimeoutParams_1min), nullptr}, + {"- Minimum timeout 15 minutes", kCCTResetTimeoutParams_15min, + std::size(kCCTResetTimeoutParams_15min), nullptr}, + {"- Minimum timeout 30 minutes", kCCTResetTimeoutParams_30min, + std::size(kCCTResetTimeoutParams_30min), nullptr}, +}; +#endif + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kAndroidTabDeclutterAutoDeleteTesting[] = { + {"android_tab_declutter_auto_delete_promo_test", "true"}}; +const FeatureEntry::FeatureVariation + kAndroidTabDeclutterAutoDeleteVariations[] = { + {"Testing", kAndroidTabDeclutterAutoDeleteTesting, + std::size(kAndroidTabDeclutterAutoDeleteTesting), nullptr}}; +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kAndroidHubSearchTabGroupsPane[] = { + {"enable_hub_search_tab_groups_pane", "true"}}; +const FeatureEntry::FeatureVariation kAndroidHubSearchTabGroupsVariations[] = { + {"on Tab Groups Pane", kAndroidHubSearchTabGroupsPane, + std::size(kAndroidHubSearchTabGroupsPane), nullptr}}; +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) +const FeatureEntry::FeatureParam kAndroidTabHighlightingForceCtrlClick[] = { + {"force_ctrl_click", "true"}}; +const FeatureEntry::FeatureParam kAndroidTabHighlightingForceShiftClick[] = { + {"force_shift_click", "true"}}; +const FeatureEntry::FeatureVariation kAndroidTabHighlightingVariations[] = { + {"Force Ctrl Click", kAndroidTabHighlightingForceCtrlClick, + std::size(kAndroidTabHighlightingForceCtrlClick), nullptr}, + {"Force Shift Click", kAndroidTabHighlightingForceShiftClick, + std::size(kAndroidTabHighlightingForceShiftClick), nullptr}}; +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) +constexpr char kWebiumFlag[] = "webium"; +constexpr char kWebiumFeatures[] = "Webium,AttachUnownedInnerWebContents"; +#endif // !BUILDFLAG(IS_ANDROID) + +const FeatureEntry::FeatureParam kMobilePromoOnDesktopLens[] = { + {kMobilePromoOnDesktopPromoTypeParam, "1"}, + {kMobilePromoOnDesktopNotificationParam, "false"}}; +const FeatureEntry::FeatureParam kMobilePromoOnDesktopLensNotification[] = { + {kMobilePromoOnDesktopPromoTypeParam, "1"}, + {kMobilePromoOnDesktopNotificationParam, "true"}}; +const FeatureEntry::FeatureParam kMobilePromoOnDesktopESB[] = { + {kMobilePromoOnDesktopPromoTypeParam, "2"}, + {kMobilePromoOnDesktopNotificationParam, "false"}}; +const FeatureEntry::FeatureParam kMobilePromoOnDesktopESBNotification[] = { + {kMobilePromoOnDesktopPromoTypeParam, "2"}, + {kMobilePromoOnDesktopNotificationParam, "true"}}; +const FeatureEntry::FeatureParam kMobilePromoOnDesktopAutofill[] = { + {kMobilePromoOnDesktopPromoTypeParam, "3"}, + {kMobilePromoOnDesktopNotificationParam, "false"}}; +const FeatureEntry::FeatureParam kMobilePromoOnDesktopAutofillNotification[] = { + {kMobilePromoOnDesktopPromoTypeParam, "3"}, + {kMobilePromoOnDesktopNotificationParam, "true"}}; + +const FeatureEntry::FeatureVariation kMobilePromoOnDesktopVariations[] = { + {" - Lens Promo", kMobilePromoOnDesktopLens, + std::size(kMobilePromoOnDesktopLens), nullptr}, + {" - Lens Promo with push notification", + kMobilePromoOnDesktopLensNotification, + std::size(kMobilePromoOnDesktopLensNotification), nullptr}, + {" - ESB", kMobilePromoOnDesktopESB, std::size(kMobilePromoOnDesktopESB), + nullptr}, + {" - ESB with push notification", kMobilePromoOnDesktopESBNotification, + std::size(kMobilePromoOnDesktopESBNotification), nullptr}, + {" - PW Autofill", kMobilePromoOnDesktopAutofill, + std::size(kMobilePromoOnDesktopAutofill), nullptr}, + {" - PW Autofill with push notification", + kMobilePromoOnDesktopAutofillNotification, + std::size(kMobilePromoOnDesktopAutofillNotification), nullptr}, +}; + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \ + BUILDFLAG(IS_CHROMEOS) +const FeatureEntry::FeatureParam kNtpEnterpriseShortcutsWithFakeData[] = { + {"use_fake_data", "true"}}; +const FeatureEntry::FeatureVariation kNtpEnterpriseShortcutsVariations[] = { + {"with fake data", kNtpEnterpriseShortcutsWithFakeData, + std::size(kNtpEnterpriseShortcutsWithFakeData), nullptr}}; +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \ + // BUILDFLAG(IS_CHROMEOS) + +// RECORDING USER METRICS FOR FLAGS: +// ----------------------------------------------------------------------------- +// The first line of the entry is the internal name. +// +// To add a new entry, add to the end of kFeatureEntries. There are two +// distinct types of entries: +// . SINGLE_VALUE: entry is either on or off. Use the SINGLE_VALUE_TYPE +// macro for this type supplying the command line to the macro. +// . MULTI_VALUE: a list of choices, the first of which should correspond to a +// deactivated state for this lab (i.e. no command line option). To specify +// this type of entry use the macro MULTI_VALUE_TYPE supplying it the +// array of choices. +// See the documentation of FeatureEntry for details on the fields. +// +// Usage of about:flags is logged on startup via the "Launch.FlagsAtStartup" +// UMA histogram. This histogram shows the number of startups with a given flag +// enabled. If you'd like to see user counts instead, make sure to switch to +// "count users" view on the dashboard. When adding new entries, the enum +// "LoginCustomFlags" must be updated in histograms/enums.xml. See note in +// enums.xml and don't forget to run AboutFlagsHistogramTest unit test to +// calculate and verify checksum. +// +// When adding a new choice, add it to the end of the list. +const FeatureEntry kFeatureEntries[] = { +// Include generated flags for flag unexpiry; see //docs/flag_expiry.md and +// //tools/flags/generate_unexpire_flags.py. +#include "build/chromeos_buildflags.h" +#include "chrome/browser/unexpire_flags_gen.inc" + {variations::switches::kEnableBenchmarking, + flag_descriptions::kEnableBenchmarkingName, + flag_descriptions::kEnableBenchmarkingDescription, kOsAll, + MULTI_VALUE_TYPE(kEnableBenchmarkingChoices)}, + {"ignore-gpu-blocklist", flag_descriptions::kIgnoreGpuBlocklistName, + flag_descriptions::kIgnoreGpuBlocklistDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kIgnoreGpuBlocklist)}, + {"enable-accessibility-on-screen-mode", + flag_descriptions::kAccessibilityOnScreenModeName, + flag_descriptions::kAccessibilityOnScreenModeDescription, kOsAll, + FEATURE_VALUE_TYPE(::features::kAccessibilityOnScreenMode)}, + {"disable-accelerated-2d-canvas", + flag_descriptions::kAccelerated2dCanvasName, + flag_descriptions::kAccelerated2dCanvasDescription, kOsAll, + SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAccelerated2dCanvas)}, + {"overlay-strategies", flag_descriptions::kOverlayStrategiesName, + flag_descriptions::kOverlayStrategiesDescription, kOsAll, + MULTI_VALUE_TYPE(kOverlayStrategiesChoices)}, + {"tint-composited-content", flag_descriptions::kTintCompositedContentName, + flag_descriptions::kTintCompositedContentDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kTintCompositedContent)}, + {"show-overdraw-feedback", flag_descriptions::kShowOverdrawFeedbackName, + flag_descriptions::kShowOverdrawFeedbackDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kShowOverdrawFeedback)}, +#if !BUILDFLAG(IS_CHROMEOS) + {"feedback-include-variations", + flag_descriptions::kFeedbackIncludeVariationsName, + flag_descriptions::kFeedbackIncludeVariationsDescription, + kOsWin | kOsLinux | kOsMac | kOsAndroid, + FEATURE_VALUE_TYPE(variations::kFeedbackIncludeVariations)}, +#endif + {"ui-disable-partial-swap", flag_descriptions::kUiPartialSwapName, + flag_descriptions::kUiPartialSwapDescription, kOsAll, + SINGLE_DISABLE_VALUE_TYPE(switches::kUIDisablePartialSwap)}, + {"webrtc-hw-decoding", flag_descriptions::kWebrtcHwDecodingName, + flag_descriptions::kWebrtcHwDecodingDescription, kOsAndroid | kOsCrOS, + FEATURE_VALUE_TYPE(features::kWebRtcHWDecoding)}, + {"webrtc-hw-encoding", flag_descriptions::kWebrtcHwEncodingName, + flag_descriptions::kWebrtcHwEncodingDescription, kOsAndroid | kOsCrOS, + FEATURE_VALUE_TYPE(features::kWebRtcHWEncoding)}, + {"webrtc-pqc-for-dtls", flag_descriptions::kWebRtcPqcForDtlsName, + flag_descriptions::kWebRtcPqcForDtlsDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kWebRtcPqcForDtls)}, + {"enable-webrtc-allow-input-volume-adjustment", + flag_descriptions::kWebRtcAllowInputVolumeAdjustmentName, + flag_descriptions::kWebRtcAllowInputVolumeAdjustmentDescription, + kOsWin | kOsMac | kOsLinux, + FEATURE_VALUE_TYPE(features::kWebRtcAllowInputVolumeAdjustment)}, + {"enable-webrtc-apm-downmix-capture-audio-method", + flag_descriptions::kWebRtcApmDownmixCaptureAudioMethodName, + flag_descriptions::kWebRtcApmDownmixCaptureAudioMethodDescription, + kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + features::kWebRtcApmDownmixCaptureAudioMethod, + kWebRtcApmDownmixMethodVariations, + "WebRtcApmDownmixCaptureAudioMethod")}, + {"enable-webrtc-hide-local-ips-with-mdns", + flag_descriptions::kWebrtcHideLocalIpsWithMdnsName, + flag_descriptions::kWebrtcHideLocalIpsWithMdnsDecription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kWebRtcHideLocalIpsWithMdns)}, + {"enable-webrtc-use-min-max-vea-dimensions", + flag_descriptions::kWebrtcUseMinMaxVEADimensionsName, + flag_descriptions::kWebrtcUseMinMaxVEADimensionsDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kWebRtcUseMinMaxVEADimensions)}, +#if defined(WEBRTC_USE_PIPEWIRE) + {"enable-webrtc-pipewire-camera", + flag_descriptions::kWebrtcPipeWireCameraName, + flag_descriptions::kWebrtcPipeWireCameraDescription, kOsLinux, + FEATURE_VALUE_TYPE(features::kWebRtcPipeWireCamera)}, +#endif // defined(WEBRTC_USE_PIPEWIRE) +#if BUILDFLAG(ENABLE_EXTENSIONS) + {"web-hid-in-web-view", flag_descriptions::kEnableWebHidInWebViewName, + flag_descriptions::kEnableWebHidInWebViewDescription, kOsAll, + FEATURE_VALUE_TYPE(extensions_features::kEnableWebHidInWebView)}, + {"extensions-on-chrome-urls", + flag_descriptions::kExtensionsOnChromeUrlsName, + flag_descriptions::kExtensionsOnChromeUrlsDescription, kOsAll, + SINGLE_VALUE_TYPE(extensions::switches::kExtensionsOnChromeURLs)}, + {"extensions-on-extension-urls", + flag_descriptions::kExtensionsOnExtensionUrlsName, + flag_descriptions::kExtensionsOnExtensionUrlsDescription, kOsAll, + SINGLE_VALUE_TYPE(extensions::switches::kExtensionsOnExtensionURLs)}, +#endif // ENABLE_EXTENSIONS +#if BUILDFLAG(IS_ANDROID) + {"contextual-search-suppress-short-view", + flag_descriptions::kContextualSearchSuppressShortViewName, + flag_descriptions::kContextualSearchSuppressShortViewDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + chrome::android::kContextualSearchSuppressShortView, + kContextualSearchSuppressShortViewVariations, + "ContextualSearchSuppressShortView")}, + {"contextual-search-with-credentials-for-debug", + flag_descriptions::kContextualSearchWithCredentialsForDebugName, + flag_descriptions::kContextualSearchWithCredentialsForDebugDescription, + kOsAndroid, FEATURE_VALUE_TYPE(kContextualSearchWithCredentialsForDebug)}, + {"related-searches-all-language", + flag_descriptions::kRelatedSearchesAllLanguageName, + flag_descriptions::kRelatedSearchesAllLanguageDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kRelatedSearchesAllLanguage)}, + {"related-searches-switch", flag_descriptions::kRelatedSearchesSwitchName, + flag_descriptions::kRelatedSearchesSwitchDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kRelatedSearchesSwitch)}, + {"omnibox-shortcuts-android", + flag_descriptions::kOmniboxShortcutsAndroidName, + flag_descriptions::kOmniboxShortcutsAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(omnibox::kOmniboxShortcutsAndroid)}, + {"safe-browsing-scam-detection-keyboard-lock-trigger-android", + flag_descriptions:: + kSafeBrowsingScamDetectionKeyboardLockTriggerAndroidName, + flag_descriptions:: + kSafeBrowsingScamDetectionKeyboardLockTriggerAndroidDescription, + kOsAndroid, + SINGLE_VALUE_TYPE( + safe_browsing::switches::kScamDetectionKeyboardLockTriggerAndroid)}, + {"safe-browsing-sync-checker-check-allowlist", + flag_descriptions::kSafeBrowsingSyncCheckerCheckAllowlistName, + flag_descriptions::kSafeBrowsingSyncCheckerCheckAllowlistDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(safe_browsing::kSafeBrowsingSyncCheckerCheckAllowlist)}, +#endif // BUILDFLAG(IS_ANDROID) + {"show-autofill-type-predictions", + flag_descriptions::kShowAutofillTypePredictionsName, + flag_descriptions::kShowAutofillTypePredictionsDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + autofill::features::test::kAutofillShowTypePredictions, + kAutofillShowTypePredictionsVariations, + "AutofillShowTypePredictions")}, + {"autofill-more-prominent-popup", + flag_descriptions::kAutofillMoreProminentPopupName, + flag_descriptions::kAutofillMoreProminentPopupDescription, kOsDesktop, + FEATURE_VALUE_TYPE(autofill::features::kAutofillMoreProminentPopup)}, + {"autofill-payments-field-swapping", + flag_descriptions::kAutofillPaymentsFieldSwappingName, + flag_descriptions::kAutofillPaymentsFieldSwappingDescription, kOsAll, + FEATURE_VALUE_TYPE(autofill::features::kAutofillPaymentsFieldSwapping)}, + {"autofill-show-bubbles-based-on-priorities", + flag_descriptions::kAutofillShowBubblesBasedOnPrioritiesName, + flag_descriptions::kAutofillShowBubblesBasedOnPrioritiesDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillShowBubblesBasedOnPriorities)}, + {"backdrop-filter-mirror-edge", + flag_descriptions::kBackdropFilterMirrorEdgeName, + flag_descriptions::kBackdropFilterMirrorEdgeDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kBackdropFilterMirrorEdgeMode)}, + {"smooth-scrolling", flag_descriptions::kSmoothScrollingName, + flag_descriptions::kSmoothScrollingDescription, + // Mac has a separate implementation with its own setting to disable. + kOsLinux | kOsCrOS | kOsWin | kOsAndroid, + ENABLE_DISABLE_VALUE_TYPE(switches::kEnableSmoothScrolling, + switches::kDisableSmoothScrolling)}, + {"fractional-scroll-offsets", + flag_descriptions::kFractionalScrollOffsetsName, + flag_descriptions::kFractionalScrollOffsetsDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kFractionalScrollOffsets)}, +#if defined(USE_AURA) + {"overlay-scrollbars", flag_descriptions::kOverlayScrollbarsName, + flag_descriptions::kOverlayScrollbarsDescription, + // Uses the system preference on Mac (a different implementation). + // On Android, this is always enabled. + kOsAura, FEATURE_VALUE_TYPE(features::kOverlayScrollbar)}, + {"overlay-scrollbars-flash-when-mouse-enter", + flag_descriptions::kOverlayScrollbarsFlashWhenMouseEnterName, + flag_descriptions::kOverlayScrollbarsFlashWhenMouseEnterDescription, + kOsAura, + FEATURE_VALUE_TYPE(features::kOverlayScrollbarFlashWhenMouseEnter)}, +#endif // USE_AURA + {"enable-lazy-load-image-for-invisible-pages", + flag_descriptions::kEnableLazyLoadImageForInvisiblePageName, + flag_descriptions::kEnableLazyLoadImageForInvisiblePageDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + blink::features::kEnableLazyLoadImageForInvisiblePage, + kSearchSuggsetionPrerenderTypeVariations, + "EnableLazyLoadImageForInvisiblePage")}, + {"soft-navigation-heuristics", + flag_descriptions::kSoftNavigationHeuristicsName, + flag_descriptions::kSoftNavigationHeuristicsDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(blink::features::kSoftNavigationHeuristics, + kSoftNavigationHeuristicsVariations, + "SoftNavigationHeuristics")}, + {"enable-quic", flag_descriptions::kQuicName, + flag_descriptions::kQuicDescription, kOsAll, + ENABLE_DISABLE_VALUE_TYPE(switches::kEnableQuic, switches::kDisableQuic)}, + {"webtransport-developer-mode", + flag_descriptions::kWebTransportDeveloperModeName, + flag_descriptions::kWebTransportDeveloperModeDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kWebTransportDeveloperMode)}, + {"disable-javascript-harmony-shipping", + flag_descriptions::kJavascriptHarmonyShippingName, + flag_descriptions::kJavascriptHarmonyShippingDescription, kOsAll, + SINGLE_DISABLE_VALUE_TYPE(switches::kDisableJavaScriptHarmonyShipping)}, + {"enable-javascript-harmony", flag_descriptions::kJavascriptHarmonyName, + flag_descriptions::kJavascriptHarmonyDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kJavaScriptHarmony)}, + {"enable-enterprise-badging-for-ntp-footer", + flag_descriptions::kEnterpriseBadgingForNtpFooterName, + flag_descriptions::kEnterpriseBadgingForNtpFooterDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(features::kEnterpriseBadgingForNtpFooter)}, + {"enable-experimental-webassembly-features", + flag_descriptions::kExperimentalWebAssemblyFeaturesName, + flag_descriptions::kExperimentalWebAssemblyFeaturesDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableExperimentalWebAssemblyFeatures)}, + {"enable-experimental-webassembly-jspi", + flag_descriptions::kExperimentalWebAssemblyJSPIName, + flag_descriptions::kExperimentalWebAssemblyJSPIDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kEnableExperimentalWebAssemblyJSPI)}, + {"enable-experimental-webassembly-shared-everything", + flag_descriptions::kExperimentalWebAssemblySharedEverythingName, + flag_descriptions::kExperimentalWebAssemblySharedEverythingDescription, + kOsAll, + FEATURE_VALUE_TYPE( + features::kEnableExperimentalWebAssemblySharedEverything)}, + {"enable-webassembly-baseline", flag_descriptions::kEnableWasmBaselineName, + flag_descriptions::kEnableWasmBaselineDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kWebAssemblyBaseline)}, + {"enable-webassembly-lazy-compilation", + flag_descriptions::kEnableWasmLazyCompilationName, + flag_descriptions::kEnableWasmLazyCompilationDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kWebAssemblyLazyCompilation)}, + {"enable-webassembly-tiering", flag_descriptions::kEnableWasmTieringName, + flag_descriptions::kEnableWasmTieringDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kWebAssemblyTiering)}, + {"enable-future-v8-vm-features", flag_descriptions::kV8VmFutureName, + flag_descriptions::kV8VmFutureDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kV8VmFuture)}, +#if BUILDFLAG(IS_ANDROID) + {"taiyaki", flag_descriptions::kTaiyakiName, + flag_descriptions::kTaiyakiDescription, kOsAndroid, + FEATURE_VALUE_TYPE(switches::kTaiyaki)}, +#endif + {"enable-gpu-rasterization", flag_descriptions::kGpuRasterizationName, + flag_descriptions::kGpuRasterizationDescription, kOsAll, + MULTI_VALUE_TYPE(kEnableGpuRasterizationChoices)}, + {"enable-experimental-web-platform-features", + flag_descriptions::kExperimentalWebPlatformFeaturesName, + flag_descriptions::kExperimentalWebPlatformFeaturesDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableExperimentalWebPlatformFeatures)}, + {"top-chrome-touch-ui", flag_descriptions::kTopChromeTouchUiName, + flag_descriptions::kTopChromeTouchUiDescription, kOsDesktop, + MULTI_VALUE_TYPE(kTopChromeTouchUiChoices)}, + +#if BUILDFLAG(ENABLE_WEBUI_TAB_STRIP) + {flag_descriptions::kWebUITabStripFlagId, + flag_descriptions::kWebUITabStripName, + flag_descriptions::kWebUITabStripDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kWebUITabStrip)}, + {"webui-tab-strip-context-menu-after-tap", + flag_descriptions::kWebUITabStripContextMenuAfterTapName, + flag_descriptions::kWebUITabStripContextMenuAfterTapDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(features::kWebUITabStripContextMenuAfterTap)}, +#endif // BUILDFLAG(ENABLE_WEBUI_TAB_STRIP) +#if BUILDFLAG(IS_CHROMEOS) + {"allow-apn-modification-policy", + flag_descriptions::kAllowApnModificationPolicyName, + flag_descriptions::kAllowApnModificationPolicyDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kAllowApnModificationPolicy)}, + {"alt-click-and-six-pack-customization", + flag_descriptions::kAltClickAndSixPackCustomizationName, + flag_descriptions::kAltClickAndSixPackCustomizationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kAltClickAndSixPackCustomization)}, + {"apn-policies", flag_descriptions::kApnPoliciesName, + flag_descriptions::kApnPoliciesDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kApnPolicies)}, + {"apn-revamp", flag_descriptions::kApnRevampName, + flag_descriptions::kApnRevampDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kApnRevamp)}, + {"audio-selection-improvement", + flag_descriptions::kAudioSelectionImprovementName, + flag_descriptions::kAudioSelectionImprovementDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kAudioSelectionImprovement)}, + {"reset-audio-selection-improvement-pref", + flag_descriptions::kResetAudioSelectionImprovementPrefName, + flag_descriptions::kResetAudioSelectionImprovementPrefDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kResetAudioSelectionImprovementPref)}, + {"cras-processor-wav-dump", flag_descriptions::kCrasProcessorWavDumpName, + flag_descriptions::kCrasProcessorWavDumpDescription, kOsCrOS, + PLATFORM_FEATURE_NAME_TYPE("CrOSLateBootCrasProcessorWavDump")}, + {"disable-explicit-dma-fences", + flag_descriptions::kDisableExplicitDmaFencesName, + flag_descriptions::kDisableExplicitDmaFencesDescription, kOsCrOS, + SINGLE_VALUE_TYPE(switches::kDisableExplicitDmaFences)}, + // TODO(crbug.com/40652358): Remove this flag and provision when HDR is + // fully + // supported on ChromeOS. + {"use-hdr-transfer-function", + flag_descriptions::kUseHDRTransferFunctionName, + flag_descriptions::kUseHDRTransferFunctionDescription, kOsCrOS, + FEATURE_VALUE_TYPE(display::features::kUseHDRTransferFunction)}, + {"enable-external-display-hdr10", + flag_descriptions::kEnableExternalDisplayHdr10Name, + flag_descriptions::kEnableExternalDisplayHdr10Description, kOsCrOS, + FEATURE_VALUE_TYPE(display::features::kEnableExternalDisplayHDR10Mode)}, + {"ash-capture-mode-education", flag_descriptions::kCaptureModeEducationName, + flag_descriptions::kCaptureModeEducationDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE(ash::features::kCaptureModeEducation, + kCaptureModeEducationVariations, + "CaptureModeEducation")}, + {"ash-capture-mode-education-bypass-limits", + flag_descriptions::kCaptureModeEducationBypassLimitsName, + flag_descriptions::kCaptureModeEducationBypassLimitsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kCaptureModeEducationBypassLimits)}, + {"ash-limit-shelf-items-to-active-desk", + flag_descriptions::kLimitShelfItemsToActiveDeskName, + flag_descriptions::kLimitShelfItemsToActiveDeskDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kPerDeskShelf)}, + {"ash-enable-unified-desktop", + flag_descriptions::kAshEnableUnifiedDesktopName, + flag_descriptions::kAshEnableUnifiedDesktopDescription, kOsCrOS, + SINGLE_VALUE_TYPE(switches::kEnableUnifiedDesktop)}, + {"disable-system-blur", flag_descriptions::kDisableSystemBlur, + flag_descriptions::kDisableSystemBlurDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kDisableSystemBlur)}, + {"bluetooth-audio-le-audio-only", + flag_descriptions::kBluetoothAudioLEAudioOnlyName, + flag_descriptions::kBluetoothAudioLEAudioOnlyDescription, kOsCrOS, + PLATFORM_FEATURE_NAME_TYPE("CrOSLateBootBluetoothAudioLEAudioOnly")}, + {"bluetooth-btsnoop-internals", + flag_descriptions::kBluetoothBtsnoopInternalsName, + flag_descriptions::kBluetoothBtsnoopInternalsDescription, kOsCrOS, + FEATURE_VALUE_TYPE( + chromeos::bluetooth::features::kBluetoothBtsnoopInternals)}, + {"bluetooth-floss-telephony", + flag_descriptions::kBluetoothFlossTelephonyName, + flag_descriptions::kBluetoothFlossTelephonyDescription, kOsCrOS, + FEATURE_VALUE_TYPE( + chromeos::bluetooth::features::kBluetoothFlossTelephony)}, + {kBluetoothUseFlossInternalName, flag_descriptions::kBluetoothUseFlossName, + flag_descriptions::kBluetoothUseFlossDescription, kOsCrOS, + FEATURE_VALUE_TYPE(floss::features::kFlossEnabled)}, + {kBluetoothUseLLPrivacyInternalName, + flag_descriptions::kBluetoothUseLLPrivacyName, + flag_descriptions::kBluetoothUseLLPrivacyDescription, kOsCrOS, + FEATURE_VALUE_TYPE(bluez::features::kLinkLayerPrivacy)}, + {"campbell-glyph", flag_descriptions::kCampbellGlyphName, + flag_descriptions::kCampbellGlyphDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE(ash::features::kCampbellGlyph, + kCampbellGlyphVariations, + "GampbellGlyph")}, + {"campbell-key", flag_descriptions::kCampbellKeyName, + flag_descriptions::kCampbellKeyDescription, kOsCrOS, + STRING_VALUE_TYPE(ash::switches::kCampbellKey, "")}, + {"cellular-bypass-esim-installation-connectivity-check", + flag_descriptions::kCellularBypassESimInstallationConnectivityCheckName, + flag_descriptions:: + kCellularBypassESimInstallationConnectivityCheckDescription, + kOsCrOS, + FEATURE_VALUE_TYPE( + ash::features::kCellularBypassESimInstallationConnectivityCheck)}, + {"cellular-use-second-euicc", + flag_descriptions::kCellularUseSecondEuiccName, + flag_descriptions::kCellularUseSecondEuiccDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kCellularUseSecondEuicc)}, + {"enable-cros-separate-geo-api-key", + flag_descriptions::kCrosSeparateGeoApiKeyName, + flag_descriptions::kCrosSeparateGeoApiKeyDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kCrosSeparateGeoApiKey)}, + {"enable-cros-cached-location-provider", + flag_descriptions::kCrosCachedLocationProviderName, + flag_descriptions::kCrosCachedLocationProviderDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kCachedLocationProvider)}, + {"cros-components", flag_descriptions::kCrosComponentsName, + flag_descriptions::kCrosComponentsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kCrosComponents)}, + {"disable-cancel-all-touches", + flag_descriptions::kDisableCancelAllTouchesName, + flag_descriptions::kDisableCancelAllTouchesDescription, kOsCrOS, + SINGLE_VALUE_TYPE(switches::kDisableCancelAllTouches)}, + { + "enable-brightness-control-in-settings", + flag_descriptions::kEnableBrightnessControlInSettingsName, + flag_descriptions::kEnableBrightnessControlInSettingsDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableBrightnessControlInSettings), + }, + {"list-all-display-modes", flag_descriptions::kListAllDisplayModesName, + flag_descriptions::kListAllDisplayModesDescription, kOsCrOS, + FEATURE_VALUE_TYPE(display::features::kListAllDisplayModes)}, + {"enable-edid-based-display-ids", + flag_descriptions::kEnableEdidBasedDisplayIdsName, + flag_descriptions::kEnableEdidBasedDisplayIdsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(display::features::kEnableEdidBasedDisplayIds)}, + {"enable-wifi-qos", flag_descriptions::kEnableWifiQosName, + flag_descriptions::kEnableWifiQosDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableWifiQos)}, + {"enable-wifi-qos-enterprise", + flag_descriptions::kEnableWifiQosEnterpriseName, + flag_descriptions::kEnableWifiQosEnterpriseDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableWifiQosEnterprise)}, + {"esim-empty-activation-code-support", + flag_descriptions::kESimEmptyActivationCodeSupportedName, + flag_descriptions::kESimEmptyActivationCodeSupportedDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kESimEmptyActivationCodeSupported)}, + {"instant-hotspot-on-nearby", + flag_descriptions::kInstantHotspotOnNearbyName, + flag_descriptions::kInstantHotspotOnNearbyDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kInstantHotspotOnNearby)}, + {"instant-hotspot-rebrand", flag_descriptions::kInstantHotspotRebrandName, + flag_descriptions::kInstantHotspotRebrandDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kInstantHotspotRebrand)}, + {"instant-tethering", flag_descriptions::kTetherName, + flag_descriptions::kTetherDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kInstantTethering)}, + {"deprecate-alt-click", flag_descriptions::kDeprecateAltClickName, + flag_descriptions::kDeprecateAltClickDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kDeprecateAltClick)}, + {"show-bluetooth-debug-log-toggle", + flag_descriptions::kShowBluetoothDebugLogToggleName, + flag_descriptions::kShowBluetoothDebugLogToggleDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kShowBluetoothDebugLogToggle)}, + {"show-taps", flag_descriptions::kShowTapsName, + flag_descriptions::kShowTapsDescription, kOsCrOS, + SINGLE_VALUE_TYPE(ash::switches::kShowTaps)}, + {"show-touch-hud", flag_descriptions::kShowTouchHudName, + flag_descriptions::kShowTouchHudDescription, kOsCrOS, + SINGLE_VALUE_TYPE(ash::switches::kAshTouchHud)}, + {"tiled-display-support", flag_descriptions::kTiledDisplaySupportName, + flag_descriptions::kTiledDisplaySupportDescription, kOsCrOS, + FEATURE_VALUE_TYPE(display::features::kTiledDisplaySupport)}, + {"wake-on-wifi-allowed", flag_descriptions::kWakeOnWifiAllowedName, + flag_descriptions::kWakeOnWifiAllowedDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kWakeOnWifiAllowed)}, + {"microphone-mute-switch-device", + flag_descriptions::kMicrophoneMuteSwitchDeviceName, + flag_descriptions::kMicrophoneMuteSwitchDeviceDescription, kOsCrOS, + SINGLE_VALUE_TYPE("enable-microphone-mute-switch-device")}, + {"wifi-connect-mac-address-randomization", + flag_descriptions::kWifiConnectMacAddressRandomizationName, + flag_descriptions::kWifiConnectMacAddressRandomizationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kWifiConnectMacAddressRandomization)}, + {"wifi-concurrency", flag_descriptions::kWifiConcurrencyName, + flag_descriptions::kWifiConcurrencyDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kWifiConcurrency)}, + {"disable-dns-proxy", flag_descriptions::kDisableDnsProxyName, + flag_descriptions::kDisableDnsProxyDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kDisableDnsProxy)}, + {"firmware-update-ui-v2", flag_descriptions::kFirmwareUpdateUIV2Name, + flag_descriptions::kFirmwareUpdateUIV2Description, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFirmwareUpdateUIV2)}, + {"enable-rfc-8925", flag_descriptions::kEnableRFC8925Name, + flag_descriptions::kEnableRFC8925Description, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableRFC8925)}, + {"enable-root-ns-dns-proxy", flag_descriptions::kEnableRootNsDnsProxyName, + flag_descriptions::kEnableRootNsDnsProxyDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableRootNsDnsProxy)}, + {"support-f11-and-f12-shortcuts", + flag_descriptions::kSupportF11AndF12ShortcutsName, + flag_descriptions::kSupportF11AndF12ShortcutsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kSupportF11AndF12KeyShortcuts)}, + {"disconnect-wifi-on-ethernet-connected", + flag_descriptions::kDisconnectWiFiOnEthernetConnectedName, + flag_descriptions::kDisconnectWiFiOnEthernetConnectedDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kDisconnectWiFiOnEthernetConnected)}, + {"disable-idle-sockets-close-on-memory-pressure", + flag_descriptions::kDisableIdleSocketsCloseOnMemoryPressureName, + flag_descriptions::kDisableIdleSocketsCloseOnMemoryPressureDescription, + kOsCrOS, + FEATURE_VALUE_TYPE( + chromeos::features::kDisableIdleSocketsCloseOnMemoryPressure)}, + {"one-group-per-renderer", flag_descriptions::kOneGroupPerRendererName, + flag_descriptions::kOneGroupPerRendererDescription, kOsCrOS, + FEATURE_VALUE_TYPE(base::kOneGroupPerRenderer)}, + {"use-dhcpcd10", flag_descriptions::kUseDHCPCD10Name, + flag_descriptions::kUseDHCPCD10Description, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kUseDHCPCD10)}, + {"jupiter-screensaver", flag_descriptions::kJupiterScreensaverName, + flag_descriptions::kJupiterScreensaverDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kJupiterScreensaver)}, +#endif // BUILDFLAG(IS_CHROMEOS) + { + "disable-accelerated-video-decode", + flag_descriptions::kAcceleratedVideoDecodeName, + flag_descriptions::kAcceleratedVideoDecodeDescription, + kOsMac | kOsWin | kOsCrOS | kOsAndroid | kOsLinux, + SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedVideoDecode), + }, + { + "disable-accelerated-video-encode", + flag_descriptions::kAcceleratedVideoEncodeName, + flag_descriptions::kAcceleratedVideoEncodeDescription, + kOsMac | kOsWin | kOsCrOS | kOsAndroid, + SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedVideoEncode), + }, +#if BUILDFLAG(IS_WIN) + { + "enable-hardware-secure-decryption", + flag_descriptions::kHardwareSecureDecryptionName, + flag_descriptions::kHardwareSecureDecryptionDescription, + kOsWin, + FEATURE_VALUE_TYPE(media::kHardwareSecureDecryption), + }, + { + "enable-hardware-secure-decryption-experiment", + flag_descriptions::kHardwareSecureDecryptionExperimentName, + flag_descriptions::kHardwareSecureDecryptionExperimentDescription, + kOsWin, + FEATURE_VALUE_TYPE(media::kHardwareSecureDecryptionExperiment), + }, + { + "enable-hardware-secure-decryption-fallback", + flag_descriptions::kHardwareSecureDecryptionFallbackName, + flag_descriptions::kHardwareSecureDecryptionFallbackDescription, + kOsWin, + FEATURE_VALUE_TYPE(media::kHardwareSecureDecryptionFallback), + }, + { + "enable-media-foundation-clear", + flag_descriptions::kMediaFoundationClearName, + flag_descriptions::kMediaFoundationClearDescription, + kOsWin, + FEATURE_VALUE_TYPE(media::kMediaFoundationClearPlayback), + }, + {"enable-media-foundation-clear-rendering-strategy", + flag_descriptions::kMediaFoundationClearStrategyName, + flag_descriptions::kMediaFoundationClearStrategyDescription, kOsWin, + FEATURE_WITH_PARAMS_VALUE_TYPE(media::kMediaFoundationClearRendering, + kMediaFoundationClearStrategyVariations, + "MediaFoundationClearRendering")}, + { + "enable-media-foundation-camera-usage-monitoring", + flag_descriptions::kMediaFoundationCameraUsageMonitoringName, + flag_descriptions::kMediaFoundationCameraUsageMonitoringDescription, + kOsWin, + FEATURE_VALUE_TYPE(features::kMediaFoundationCameraUsageMonitoring), + }, + { + "enable-waitable-swap-chain", + flag_descriptions::kUseWaitableSwapChainName, + flag_descriptions::kUseWaitableSwapChainDescription, + kOsWin, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kDXGIWaitableSwapChain, + kDXGIWaitableSwapChainVariations, + "DXGIWaitableSwapChain"), + }, +#endif // BUILDFLAG(IS_WIN) + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) + { + "fluent-overlay-scrollbars", + flag_descriptions::kFluentOverlayScrollbarsName, + flag_descriptions::kFluentOverlayScrollbarsDescription, + kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(features::kFluentOverlayScrollbar), + }, + { + "fluent-scrollbars", + flag_descriptions::kFluentScrollbarsName, + flag_descriptions::kFluentScrollbarsDescription, + kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(features::kFluentScrollbar), + }, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) +#if BUILDFLAG(IS_CHROMEOS) + { + "zero-copy-video-capture", + flag_descriptions::kZeroCopyVideoCaptureName, + flag_descriptions::kZeroCopyVideoCaptureDescription, + kOsCrOS, + ENABLE_DISABLE_VALUE_TYPE_AND_VALUE( + switches::kVideoCaptureUseGpuMemoryBuffer, + "1", + switches::kDisableVideoCaptureUseGpuMemoryBuffer, + "1"), + }, + { + "ash-debug-shortcuts", + flag_descriptions::kDebugShortcutsName, + flag_descriptions::kDebugShortcutsDescription, + kOsAll, + SINGLE_VALUE_TYPE(ash::switches::kAshDebugShortcuts), + }, + {"ui-slow-animations", flag_descriptions::kUiSlowAnimationsName, + flag_descriptions::kUiSlowAnimationsDescription, kOsCrOS, + SINGLE_VALUE_TYPE(switches::kUISlowAnimations)}, +#endif // BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_WIN) + { + "zero-copy-video-capture", + flag_descriptions::kZeroCopyVideoCaptureName, + flag_descriptions::kZeroCopyVideoCaptureDescription, + kOsWin, + FEATURE_VALUE_TYPE(media::kMediaFoundationD3D11VideoCapture), + }, +#endif // BUILDFLAG(IS_WIN) + {"enable-show-autofill-signatures", + flag_descriptions::kShowAutofillSignaturesName, + flag_descriptions::kShowAutofillSignaturesDescription, kOsAll, + SINGLE_VALUE_TYPE(autofill::switches::kShowAutofillSignatures)}, + {"wallet-service-use-sandbox", + flag_descriptions::kWalletServiceUseSandboxName, + flag_descriptions::kWalletServiceUseSandboxDescription, + kOsAndroid | kOsDesktop, + ENABLE_DISABLE_VALUE_TYPE_AND_VALUE( + autofill::switches::kWalletServiceUseSandbox, + "1", + autofill::switches::kWalletServiceUseSandbox, + "0")}, + {"enable-web-bluetooth", flag_descriptions::kWebBluetoothName, + flag_descriptions::kWebBluetoothDescription, kOsLinux, + FEATURE_VALUE_TYPE(features::kWebBluetooth)}, + {"enable-web-bluetooth-new-permissions-backend", + flag_descriptions::kWebBluetoothNewPermissionsBackendName, + flag_descriptions::kWebBluetoothNewPermissionsBackendDescription, + kOsAndroid | kOsDesktop, + FEATURE_VALUE_TYPE(features::kWebBluetoothNewPermissionsBackend)}, + {"enable-webusb-device-detection", + flag_descriptions::kWebUsbDeviceDetectionName, + flag_descriptions::kWebUsbDeviceDetectionDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kWebUsbDeviceDetection)}, +#if defined(USE_AURA) + {"overscroll-history-navigation", + flag_descriptions::kOverscrollHistoryNavigationName, + flag_descriptions::kOverscrollHistoryNavigationDescription, kOsAura, + FEATURE_VALUE_TYPE(features::kOverscrollHistoryNavigation)}, + {"pull-to-refresh", flag_descriptions::kPullToRefreshName, + flag_descriptions::kPullToRefreshDescription, kOsAura, + MULTI_VALUE_TYPE(kPullToRefreshChoices)}, +#endif // USE_AURA + {"enable-touch-drag-drop", flag_descriptions::kTouchDragDropName, + flag_descriptions::kTouchDragDropDescription, kOsWin | kOsCrOS, + FEATURE_VALUE_TYPE(features::kTouchDragAndDrop)}, + {"touch-selection-strategy", flag_descriptions::kTouchSelectionStrategyName, + flag_descriptions::kTouchSelectionStrategyDescription, + kOsAndroid, // TODO(mfomitchev): Add CrOS/Win/Linux support soon. + MULTI_VALUE_TYPE(kTouchTextSelectionStrategyChoices)}, +#if BUILDFLAG(IS_CHROMEOS) + {"enable-virtual-keyboard", flag_descriptions::kVirtualKeyboardName, + flag_descriptions::kVirtualKeyboardDescription, kOsCrOS, + SINGLE_VALUE_TYPE(keyboard::switches::kEnableVirtualKeyboard)}, + {"disable-virtual-keyboard", + flag_descriptions::kVirtualKeyboardDisabledName, + flag_descriptions::kVirtualKeyboardDisabledDescription, kOsCrOS, + SINGLE_VALUE_TYPE(keyboard::switches::kDisableVirtualKeyboard)}, +#endif // BUILDFLAG(IS_CHROMEOS) + {"enable-webgl-developer-extensions", + flag_descriptions::kWebglDeveloperExtensionsName, + flag_descriptions::kWebglDeveloperExtensionsDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableWebGLDeveloperExtensions)}, + {"enable-webgl-draft-extensions", + flag_descriptions::kWebglDraftExtensionsName, + flag_descriptions::kWebglDraftExtensionsDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableWebGLDraftExtensions)}, + {"enable-zero-copy", flag_descriptions::kZeroCopyName, + flag_descriptions::kZeroCopyDescription, kOsAll, + ENABLE_DISABLE_VALUE_TYPE(blink::switches::kEnableZeroCopy, + blink::switches::kDisableZeroCopy)}, + {"enable-vulkan", flag_descriptions::kEnableVulkanName, + flag_descriptions::kEnableVulkanDescription, kOsLinux | kOsAndroid, + FEATURE_VALUE_TYPE(features::kVulkan)}, + {"default-angle-vulkan", flag_descriptions::kDefaultAngleVulkanName, + flag_descriptions::kDefaultAngleVulkanDescription, kOsLinux | kOsAndroid, + FEATURE_VALUE_TYPE(features::kDefaultANGLEVulkan)}, + {"vulkan-from-angle", flag_descriptions::kVulkanFromAngleName, + flag_descriptions::kVulkanFromAngleDescription, kOsLinux | kOsAndroid, + FEATURE_VALUE_TYPE(features::kVulkanFromANGLE)}, + +#if !BUILDFLAG(IS_CHROMEOS) + {"enable-system-notifications", + flag_descriptions::kNotificationsSystemFlagName, + flag_descriptions::kNotificationsSystemFlagDescription, + kOsMac | kOsLinux | kOsWin, + FEATURE_VALUE_TYPE(features::kSystemNotifications)}, +#endif // !BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_CHROMEOS) + {"enable-ongoing-processes", flag_descriptions::kEnableOngoingProcessesName, + flag_descriptions::kEnableOngoingProcessesDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kOngoingProcesses)}, +#endif // BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_ANDROID) + {"adaptive-button-in-top-toolbar-page-summary", + flag_descriptions::kAdaptiveButtonInTopToolbarPageSummaryName, + flag_descriptions::kAdaptiveButtonInTopToolbarPageSummaryDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + chrome::android::kAdaptiveButtonInTopToolbarPageSummary, + kAdaptiveButtonInTopToolbarPageSummaryVariations, + "AdaptiveButtonInTopToolbarPageSummary")}, + {"reader-mode-distill-in-app", + flag_descriptions::kReaderModeDistillInAppName, + flag_descriptions::kReaderModeDistillInAppDescription, kOsAndroid, + FEATURE_VALUE_TYPE(dom_distiller::kReaderModeDistillInApp)}, + {"reader-mode-heuristics", flag_descriptions::kReaderModeHeuristicsName, + flag_descriptions::kReaderModeHeuristicsDescription, kOsAndroid, + MULTI_VALUE_TYPE(kReaderModeHeuristicsChoices)}, + {"reader-mode-improvements", flag_descriptions::kReaderModeImprovementsName, + flag_descriptions::kReaderModeImprovementsDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(dom_distiller::kReaderModeImprovements, + kReaderModeImprovementsChoices, + "Reader Mode Improvements")}, + {"reader-mode-use-readability", + flag_descriptions::kReaderModeUseReadabilityName, + flag_descriptions::kReaderModeUseReadabilityDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(dom_distiller::kReaderModeUseReadability, + kReaderModeUseReadabilityChoices, + "Reader Mode use readability")}, + {"submenus-tab-context-menu-lff-tab-strip", + flag_descriptions::kSubmenusTabContextMenuLffTabStripName, + flag_descriptions::kSubmenusTabContextMenuLffTabStripDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kSubmenusTabContextMenuLffTabStrip)}, +#endif // BUILDFLAG(IS_ANDROID) + {"in-product-help-demo-mode-choice", + flag_descriptions::kInProductHelpDemoModeChoiceName, + flag_descriptions::kInProductHelpDemoModeChoiceDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + feature_engagement::kIPHDemoMode, + feature_engagement::kIPHDemoModeChoiceVariations, + "IPH_DemoMode")}, +#if BUILDFLAG(IS_CHROMEOS) + {"enable-lock-screen-notification", + flag_descriptions::kLockScreenNotificationName, + flag_descriptions::kLockScreenNotificationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kLockScreenNotifications)}, + {"enable-service-workers-for-chrome-untrusted", + flag_descriptions::kEnableServiceWorkersForChromeUntrustedName, + flag_descriptions::kEnableServiceWorkersForChromeUntrustedDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kEnableServiceWorkersForChromeUntrusted)}, + {"enterprise-reporting-ui", flag_descriptions::kEnterpriseReportingUIName, + flag_descriptions::kEnterpriseReportingUIDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnterpriseReportingUI)}, + {"chromebox-usb-passthrough-restrictions", + flag_descriptions::kChromeboxUsbPassthroughRestrictionsName, + flag_descriptions::kChromeboxUsbPassthroughRestrictionsDescription, + kOsCrOS, + PLATFORM_FEATURE_NAME_TYPE( + "CrOSLateBootChromeboxUsbPassthroughRestrictions")}, + {"disable-bruschetta-install-checks", + flag_descriptions::kDisableBruschettaInstallChecksName, + flag_descriptions::kDisableBruschettaInstallChecksDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kDisableBruschettaInstallChecks)}, + {"crostini-reset-lxd-db", flag_descriptions::kCrostiniResetLxdDbName, + flag_descriptions::kCrostiniResetLxdDbDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kCrostiniResetLxdDb)}, + {"terminal-dev", flag_descriptions::kTerminalDevName, + flag_descriptions::kTerminalDevDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kTerminalDev)}, + {"permissive-usb-passthrough", + flag_descriptions::kPermissiveUsbPassthroughName, + flag_descriptions::kPermissiveUsbPassthroughDescription, kOsCrOS, + PLATFORM_FEATURE_NAME_TYPE("CrOSLateBootPermissiveUsbPassthrough")}, + {"crostini-containerless", flag_descriptions::kCrostiniContainerlessName, + flag_descriptions::kCrostiniContainerlessDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kCrostiniContainerless)}, + {"crostini-multi-container", flag_descriptions::kCrostiniMultiContainerName, + flag_descriptions::kCrostiniMultiContainerDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kCrostiniMultiContainer)}, + {"crostini-qt-ime-support", flag_descriptions::kCrostiniQtImeSupportName, + flag_descriptions::kCrostiniQtImeSupportDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kCrostiniQtImeSupport)}, + {"crostini-virtual-keyboard-support", + flag_descriptions::kCrostiniVirtualKeyboardSupportName, + flag_descriptions::kCrostiniVirtualKeyboardSupportDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kCrostiniVirtualKeyboardSupport)}, + {"notifications-ignore-require-interaction", + flag_descriptions::kNotificationsIgnoreRequireInteractionName, + flag_descriptions::kNotificationsIgnoreRequireInteractionDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kNotificationsIgnoreRequireInteraction)}, + {"sys-ui-holdback-drive-integration", + flag_descriptions::kSysUiShouldHoldbackDriveIntegrationName, + flag_descriptions::kSysUiShouldHoldbackDriveIntegrationDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSysUiShouldHoldbackDriveIntegration)}, + {"sys-ui-holdback-task-management", + flag_descriptions::kSysUiShouldHoldbackTaskManagementName, + flag_descriptions::kSysUiShouldHoldbackTaskManagementDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSysUiShouldHoldbackTaskManagement)}, + +#endif // BUILDFLAG(IS_CHROMEOS) +#if (BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)) + {"mojo-linux-sharedmem", flag_descriptions::kMojoLinuxChannelSharedMemName, + flag_descriptions::kMojoLinuxChannelSharedMemDescription, + kOsCrOS | kOsLinux | kOsAndroid, + FEATURE_VALUE_TYPE(mojo::core::kMojoLinuxChannelSharedMem)}, +#endif +#if BUILDFLAG(IS_ANDROID) + {"enable-site-isolation-for-password-sites", + flag_descriptions::kSiteIsolationForPasswordSitesName, + flag_descriptions::kSiteIsolationForPasswordSitesDescription, kOsAndroid, + FEATURE_VALUE_TYPE( + site_isolation::features::kSiteIsolationForPasswordSites)}, + {"enable-site-per-process", flag_descriptions::kStrictSiteIsolationName, + flag_descriptions::kStrictSiteIsolationDescription, kOsAndroid, + SINGLE_VALUE_TYPE(switches::kSitePerProcess)}, +#endif + +#if !BUILDFLAG(IS_ANDROID) +#if !BUILDFLAG(IS_CHROMEOS) + {"enable-isolated-web-apps", flag_descriptions::kEnableIsolatedWebAppsName, + flag_descriptions::kEnableIsolatedWebAppsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kIsolatedWebApps)}, +#endif // !BUILDFLAG(IS_CHROMEOS) + {"direct-sockets-in-service-workers", + flag_descriptions::kDirectSocketsInServiceWorkersName, + flag_descriptions::kDirectSocketsInServiceWorkersDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kDirectSocketsInServiceWorkers)}, + {"direct-sockets-in-shared-workers", + flag_descriptions::kDirectSocketsInSharedWorkersName, + flag_descriptions::kDirectSocketsInSharedWorkersDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kDirectSocketsInSharedWorkers)}, +#if BUILDFLAG(IS_CHROMEOS) + {"enable-isolated-web-app-managed-guest-session-install", + flag_descriptions::kEnableIsolatedWebAppManagedGuestSessionInstallName, + flag_descriptions:: + kEnableIsolatedWebAppManagedGuestSessionInstallDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kIsolatedWebAppManagedGuestSessionInstall)}, + {"enable-isolated-web-app-unmanaged-install", + flag_descriptions::kEnableIsolatedWebAppUnmanagedInstallName, + flag_descriptions::kEnableIsolatedWebAppUnmanagedInstallDescription, + kOsCrOS, FEATURE_VALUE_TYPE(features::kIsolatedWebAppUnmanagedInstall)}, + {"web-app-manifest-protocol-handlers", + flag_descriptions::kWebAppManifestProtocolHandlersName, + flag_descriptions::kWebAppManifestProtocolHandlersDescription, kOsCrOS, + FEATURE_VALUE_TYPE( + chromeos::features::kWebAppManifestProtocolHandlerSupport)}, +#endif + {"enable-isolated-web-app-allowlist", + flag_descriptions::kEnableIsolatedWebAppAllowlistName, + flag_descriptions::kEnableIsolatedWebAppAllowlistDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kIsolatedWebAppManagedAllowlist)}, + {"enable-isolated-web-app-dev-mode", + flag_descriptions::kEnableIsolatedWebAppDevModeName, + flag_descriptions::kEnableIsolatedWebAppDevModeDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kIsolatedWebAppDevMode)}, +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) + {"enable-iwa-key-distribution-component", + flag_descriptions::kEnableIwaKeyDistributionComponentName, + flag_descriptions::kEnableIwaKeyDistributionComponentDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(component_updater::kIwaKeyDistributionComponent)}, +#endif // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) + {"iwa-key-distribution-component-exp-cohort", + flag_descriptions::kIwaKeyDistributionComponentExpCohortName, + flag_descriptions::kIwaKeyDistributionComponentExpCohortDescription, + kOsDesktop, + STRING_VALUE_TYPE(component_updater::kIwaKeyDistributionComponentExpCohort, + "")}, +#endif + +#if !BUILDFLAG(IS_ANDROID) + {"enable-controlled-frame", flag_descriptions::kEnableControlledFrameName, + flag_descriptions::kEnableControlledFrameDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kControlledFrame)}, +#endif // !BUILDFLAG(IS_ANDROID) + + {"isolate-origins", flag_descriptions::kIsolateOriginsName, + flag_descriptions::kIsolateOriginsDescription, kOsAll, + ORIGIN_LIST_VALUE_TYPE(switches::kIsolateOrigins, "")}, + {about_flags::kSiteIsolationTrialOptOutInternalName, + flag_descriptions::kSiteIsolationOptOutName, + flag_descriptions::kSiteIsolationOptOutDescription, kOsAll, + MULTI_VALUE_TYPE(kSiteIsolationOptOutChoices)}, + {"allow-insecure-localhost", flag_descriptions::kAllowInsecureLocalhostName, + flag_descriptions::kAllowInsecureLocalhostDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kAllowInsecureLocalhost)}, + {"text-based-audio-descriptions", + flag_descriptions::kTextBasedAudioDescriptionName, + flag_descriptions::kTextBasedAudioDescriptionDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kTextBasedAudioDescription)}, + {"enable-desktop-pwas-app-title", + flag_descriptions::kDesktopPWAsAppTitleName, + flag_descriptions::kDesktopPWAsAppTitleDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kWebAppEnableAppTitle)}, + {"enable-desktop-pwas-elided-extensions-menu", + flag_descriptions::kDesktopPWAsElidedExtensionsMenuName, + flag_descriptions::kDesktopPWAsElidedExtensionsMenuDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kDesktopPWAsElidedExtensionsMenu)}, + {"enable-desktop-pwas-tab-strip", + flag_descriptions::kDesktopPWAsTabStripName, + flag_descriptions::kDesktopPWAsTabStripDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kDesktopPWAsTabStrip)}, + {"enable-desktop-pwas-tab-strip-settings", + flag_descriptions::kDesktopPWAsTabStripSettingsName, + flag_descriptions::kDesktopPWAsTabStripSettingsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kDesktopPWAsTabStripSettings)}, + {"enable-desktop-pwas-tab-strip-customizations", + flag_descriptions::kDesktopPWAsTabStripCustomizationsName, + flag_descriptions::kDesktopPWAsTabStripCustomizationsDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kDesktopPWAsTabStripCustomizations)}, + {"enable-desktop-pwas-sub-apps", flag_descriptions::kDesktopPWAsSubAppsName, + flag_descriptions::kDesktopPWAsSubAppsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kDesktopPWAsSubApps)}, + {"enable-desktop-pwas-scope-extensions", + flag_descriptions::kDesktopPWAsScopeExtensionsName, + flag_descriptions::kDesktopPWAsScopeExtensionsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kWebAppEnableScopeExtensions)}, + {"enable-desktop-pwas-borderless", + flag_descriptions::kDesktopPWAsBorderlessName, + flag_descriptions::kDesktopPWAsBorderlessDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kWebAppBorderless)}, + {"enable-desktop-pwas-additional-windowing-controls", + flag_descriptions::kDesktopPWAsAdditionalWindowingControlsName, + flag_descriptions::kDesktopPWAsAdditionalWindowingControlsDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + blink::features::kDesktopPWAsAdditionalWindowingControls)}, + {"record-web-app-debug-info", flag_descriptions::kRecordWebAppDebugInfoName, + flag_descriptions::kRecordWebAppDebugInfoDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kRecordWebAppDebugInfo)}, + {"use-sync-sandbox", flag_descriptions::kSyncSandboxName, + flag_descriptions::kSyncSandboxDescription, kOsAll, + SINGLE_VALUE_TYPE_AND_VALUE( + syncer::kSyncServiceURL, + "https://chrome-sync.sandbox.google.com/chrome-sync/alpha")}, +#if !BUILDFLAG(IS_ANDROID) + {"media-router-cast-allow-all-ips", + flag_descriptions::kMediaRouterCastAllowAllIPsName, + flag_descriptions::kMediaRouterCastAllowAllIPsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media_router::kCastAllowAllIPsFeature)}, + {"media-remoting-without-fullscreen", + flag_descriptions::kMediaRemotingWithoutFullscreenName, + flag_descriptions::kMediaRemotingWithoutFullscreenDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media::kMediaRemotingWithoutFullscreen)}, + {"remote-playback-backend", flag_descriptions::kRemotePlaybackBackendName, + flag_descriptions::kRemotePlaybackBackendDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kRemotePlaybackBackend)}, + {"allow-all-sites-to-initiate-mirroring", + flag_descriptions::kAllowAllSitesToInitiateMirroringName, + flag_descriptions::kAllowAllSitesToInitiateMirroringDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(media_router::kAllowAllSitesToInitiateMirroring)}, + {"media-route-dial-provider", + flag_descriptions::kDialMediaRouteProviderName, + flag_descriptions::kDialMediaRouteProviderDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media_router::kDialMediaRouteProvider)}, + {"delay-media-sink-discovery", + flag_descriptions::kDelayMediaSinkDiscoveryName, + flag_descriptions::kDelayMediaSinkDiscoveryDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media_router::kDelayMediaSinkDiscovery)}, + {"show-cast-permission-rejected-error", + flag_descriptions::kShowCastPermissionRejectedErrorName, + flag_descriptions::kShowCastPermissionRejectedErrorDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media_router::kShowCastPermissionRejectedError)}, + {"cast-message-logging", flag_descriptions::kCastMessageLoggingName, + flag_descriptions::kCastMessageLoggingDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media_router::kCastMessageLogging)}, + + {"cast-streaming-hardware-h264", + flag_descriptions::kCastStreamingHardwareH264Name, + flag_descriptions::kCastStreamingHardwareH264Description, kOsDesktop, + ENABLE_DISABLE_VALUE_TYPE( + switches::kCastStreamingForceEnableHardwareH264, + switches::kCastStreamingForceDisableHardwareH264)}, + + {"cast-streaming-hardware-hevc", + flag_descriptions::kCastStreamingHardwareHevcName, + flag_descriptions::kCastStreamingHardwareHevcDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media::kCastStreamingHardwareHevc)}, + + {"cast-streaming-hardware-vp8", + flag_descriptions::kCastStreamingHardwareVp8Name, + flag_descriptions::kCastStreamingHardwareVp8Description, kOsDesktop, + ENABLE_DISABLE_VALUE_TYPE( + switches::kCastStreamingForceEnableHardwareVp8, + switches::kCastStreamingForceDisableHardwareVp8)}, + + {"cast-streaming-hardware-vp9", + flag_descriptions::kCastStreamingHardwareVp9Name, + flag_descriptions::kCastStreamingHardwareVp9Description, kOsDesktop, + ENABLE_DISABLE_VALUE_TYPE( + switches::kCastStreamingForceEnableHardwareVp9, + switches::kCastStreamingForceDisableHardwareVp9)}, + + {"cast-streaming-media-video-encoder", + flag_descriptions::kCastStreamingMediaVideoEncoderName, + flag_descriptions::kCastStreamingMediaVideoEncoderDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media::kCastStreamingMediaVideoEncoder)}, + + {"cast-streaming-performance-overlay", + flag_descriptions::kCastStreamingPerformanceOverlayName, + flag_descriptions::kCastStreamingPerformanceOverlayDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media::kCastStreamingPerformanceOverlay)}, + + {"enable-cast-streaming-av1", flag_descriptions::kCastStreamingAv1Name, + flag_descriptions::kCastStreamingAv1Description, kOsDesktop, + FEATURE_VALUE_TYPE(media::kCastStreamingAv1)}, + +#if BUILDFLAG(IS_MAC) + {"enable-cast-streaming-mac-hardware-h264", + flag_descriptions::kCastStreamingMacHardwareH264Name, + flag_descriptions::kCastStreamingMacHardwareH264Description, kOsMac, + FEATURE_VALUE_TYPE(media::kCastStreamingMacHardwareH264)}, + {"use-network-framework-for-local-discovery", + flag_descriptions::kUseNetworkFrameworkForLocalDiscoveryName, + flag_descriptions::kUseNetworkFrameworkForLocalDiscoveryDescription, + kOsMac, + FEATURE_VALUE_TYPE(media_router::kUseNetworkFrameworkForLocalDiscovery)}, +#endif + +#if BUILDFLAG(IS_WIN) + {"enable-cast-streaming-win-hardware-h264", + flag_descriptions::kCastStreamingWinHardwareH264Name, + flag_descriptions::kCastStreamingWinHardwareH264Description, kOsWin, + FEATURE_VALUE_TYPE(media::kCastStreamingWinHardwareH264)}, +#endif + + {"enable-cast-streaming-vp8", flag_descriptions::kCastStreamingVp8Name, + flag_descriptions::kCastStreamingVp8Description, kOsDesktop, + FEATURE_VALUE_TYPE(media::kCastStreamingVp8)}, + + {"enable-cast-streaming-vp9", flag_descriptions::kCastStreamingVp9Name, + flag_descriptions::kCastStreamingVp9Description, kOsDesktop, + FEATURE_VALUE_TYPE(media::kCastStreamingVp9)}, + + {"enable-cast-streaming-with-hidpi", + flag_descriptions::kCastEnableStreamingWithHiDPIName, + flag_descriptions::kCastEnableStreamingWithHiDPIDescription, kOsDesktop, + FEATURE_VALUE_TYPE(mirroring::features::kCastEnableStreamingWithHiDPI)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"force-off-text-autosizing", + flag_descriptions::kForceOffTextAutosizingName, + flag_descriptions::kForceOffTextAutosizingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(blink::features::kForceOffTextAutosizing)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_MAC) + {"mac-catap-loopback-audio-for-cast", + flag_descriptions::kMacCatapLoopbackAudioForCastName, + flag_descriptions::kMacCatapLoopbackAudioForCastDescription, kOsMac, + FEATURE_VALUE_TYPE(media::kMacCatapLoopbackAudioForCast)}, + + {"mac-catap-loopback-audio-for-screen-share", + flag_descriptions::kMacCatapLoopbackAudioForScreenShareName, + flag_descriptions::kMacCatapLoopbackAudioForScreenShareDescription, kOsMac, + FEATURE_VALUE_TYPE(media::kMacCatapLoopbackAudioForScreenShare)}, + + {"use-sc-content-sharing-picker", + flag_descriptions::kUseSCContentSharingPickerName, + flag_descriptions::kUseSCContentSharingPickerDescription, kOsMac, + FEATURE_VALUE_TYPE(media::kUseSCContentSharingPicker)}, +#endif // BUILDFLAG(IS_MAC) + +#if BUILDFLAG(IS_LINUX) + {"pulseaudio-loopback-for-cast", + flag_descriptions::kPulseaudioLoopbackForCastName, + flag_descriptions::kPulseaudioLoopbackForCastDescription, kOsLinux, + FEATURE_VALUE_TYPE(media::kPulseaudioLoopbackForCast)}, + + {"pulseaudio-loopback-for-screen-share", + flag_descriptions::kPulseaudioLoopbackForScreenShareName, + flag_descriptions::kPulseaudioLoopbackForScreenShareDescription, kOsLinux, + FEATURE_VALUE_TYPE(media::kPulseaudioLoopbackForScreenShare)}, + + {"simplified-tab-drag-ui", flag_descriptions::kSimplifiedTabDragUIName, + flag_descriptions::kSimplifiedTabDragUIDescription, kOsLinux, + FEATURE_VALUE_TYPE(features::kAllowWindowDragUsingSystemDragDrop)}, + + {"wayland-per-window-scaling", + flag_descriptions::kWaylandPerWindowScalingName, + flag_descriptions::kWaylandPerWindowScalingDescription, kOsLinux, + FEATURE_VALUE_TYPE(features::kWaylandPerSurfaceScale)}, + + {"wayland-linux-drm-syncobj", + flag_descriptions::kWaylandLinuxDrmSyncobjName, + flag_descriptions::kWaylandLinuxDrmSyncobjDescription, kOsLinux, + FEATURE_VALUE_TYPE(features::kWaylandLinuxDrmSyncobj)}, + + {"wayland-session-management", + flag_descriptions::kWaylandSessionManagementName, + flag_descriptions::kWaylandSessionManagementDescription, kOsLinux, + FEATURE_VALUE_TYPE(features::kWaylandSessionManagement)}, +#endif // BUILDFLAG(IS_LINUX) + +#if BUILDFLAG(ENABLE_VR) + {"webxr-projection-layers", flag_descriptions::kWebXrProjectionLayersName, + flag_descriptions::kWebXrProjectionLayersDescription, kOsWin | kOsAndroid, + FEATURE_VALUE_TYPE(device::features::kWebXrLayers)}, + {"webxr-webgpu-binding", flag_descriptions::kWebXrWebGpuBindingName, + flag_descriptions::kWebXrWebGpuBindingDescription, kOsWin | kOsAndroid, + FEATURE_VALUE_TYPE(device::features::kWebXrWebGpuBinding)}, + {"webxr-incubations", flag_descriptions::kWebXrIncubationsName, + flag_descriptions::kWebXrIncubationsDescription, kOsAll, + FEATURE_VALUE_TYPE(device::features::kWebXrIncubations)}, + {"webxr-internals", flag_descriptions::kWebXrInternalsName, + flag_descriptions::kWebXrInternalsDescription, kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(device::features::kWebXrInternals)}, + {"webxr-runtime", flag_descriptions::kWebXrForceRuntimeName, + flag_descriptions::kWebXrForceRuntimeDescription, kOsDesktop | kOsAndroid, + MULTI_VALUE_TYPE(kWebXrForceRuntimeChoices)}, + {"webxr-hand-anonymization", + flag_descriptions::kWebXrHandAnonymizationStrategyName, + flag_descriptions::kWebXrHandAnonymizationStrategyDescription, + kOsDesktop | kOsAndroid, MULTI_VALUE_TYPE(KWebXrHandAnonymizationChoices)}, + {"webxr-depth-performance", flag_descriptions::kWebXRDepthPerformanceName, + flag_descriptions::kWebXRDepthPerformanceDescription, kOsAndroid, + FEATURE_VALUE_TYPE(blink::features::kWebXRDepthPerformance)}, +#if BUILDFLAG(IS_ANDROID) + {"webxr-shared-buffers", flag_descriptions::kWebXrSharedBuffersName, + flag_descriptions::kWebXrSharedBuffersDescription, kOsAndroid, + FEATURE_VALUE_TYPE(device::features::kWebXrSharedBuffers)}, +#if BUILDFLAG(ENABLE_OPENXR) + {"enable-openxr-android", flag_descriptions::kOpenXRName, + flag_descriptions::kOpenXRDescription, kOsAndroid, + FEATURE_VALUE_TYPE(device::features::kOpenXR)}, + {"enable-openxr-android-smooth-depth", + flag_descriptions::kOpenXRAndroidSmoothDepthName, + flag_descriptions::kOpenXRAndroidSmoothDepthDescription, kOsAndroid, + FEATURE_VALUE_TYPE(device::features::kOpenXR)}, + {"enable-openxr-extended", flag_descriptions::kOpenXRExtendedFeaturesName, + flag_descriptions::kOpenXRExtendedFeaturesDescription, kOsAndroid, + FEATURE_VALUE_TYPE(device::features::kOpenXrExtendedFeatureSupport)}, +#endif +#endif // BUILDFLAG(IS_ANDROID) +#endif // ENABLE_VR +#if BUILDFLAG(IS_CHROMEOS) + {"disable-accelerated-mjpeg-decode", + flag_descriptions::kAcceleratedMjpegDecodeName, + flag_descriptions::kAcceleratedMjpegDecodeDescription, kOsCrOS, + SINGLE_DISABLE_VALUE_TYPE(switches::kDisableAcceleratedMjpegDecode)}, +#endif // BUILDFLAG(IS_CHROMEOS) + {"system-keyboard-lock", flag_descriptions::kSystemKeyboardLockName, + flag_descriptions::kSystemKeyboardLockDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kSystemKeyboardLock)}, +#if BUILDFLAG(IS_ANDROID) + {"notification-permission-rationale-dialog", + flag_descriptions::kNotificationPermissionRationaleName, + flag_descriptions::kNotificationPermissionRationaleDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + chrome::android::kNotificationPermissionVariant, + kNotificationPermissionRationaleVariations, + "NotificationPermissionVariant")}, + {"notification-permission-rationale-bottom-sheet", + flag_descriptions::kNotificationPermissionRationaleBottomSheetName, + flag_descriptions::kNotificationPermissionRationaleBottomSheetDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kNotificationPermissionBottomSheet)}, + {"reengagement-notification", + flag_descriptions::kReengagementNotificationName, + flag_descriptions::kReengagementNotificationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kReengagementNotification)}, + + // Enterprise Data Controls + {"enable-clipboard-data-controls-android", + flag_descriptions::kEnableClipboardDataControlsAndroidName, + flag_descriptions::kEnableClipboardDataControlsAndroidDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(data_controls::kEnableClipboardDataControlsAndroid)}, + + {"right-edge-goes-forward-gesture-nav", + flag_descriptions::kRightEdgeGoesForwardGestureNavName, + flag_descriptions::kRightEdgeGoesForwardGestureNavDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kRightEdgeGoesForwardGestureNav)}, + + // Android Edge to edge + {"draw-cutout-edge-to-edge", flag_descriptions::kDrawCutoutEdgeToEdgeName, + flag_descriptions::kDrawCutoutEdgeToEdgeDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kDrawCutoutEdgeToEdge)}, + {"draw-chrome-pages-edge-to-edge", + flag_descriptions::kDrawChromePagesEdgeToEdgeName, + flag_descriptions::kDrawChromePagesEdgeToEdgeDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kDrawChromePagesEdgeToEdge)}, + {"edge-to-edge-bottom-chin", flag_descriptions::kEdgeToEdgeBottomChinName, + flag_descriptions::kEdgeToEdgeBottomChinDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kEdgeToEdgeBottomChin)}, + {"edge-to-edge-everywhere", flag_descriptions::kEdgeToEdgeEverywhereName, + flag_descriptions::kEdgeToEdgeEverywhereDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kEdgeToEdgeEverywhere)}, + {"edge-to-edge-tablet", flag_descriptions::kEdgeToEdgeTabletName, + flag_descriptions::kEdgeToEdgeTabletDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kEdgeToEdgeTablet, + kEdgeToEdgeTabletVariations, + "EdgeToEdgeTablet")}, + + // Android floating snackbar + {"floating-snackbar", flag_descriptions::kFloatingSnackbarName, + flag_descriptions::kFloatingSnackbarDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kFloatingSnackbar)}, + + // Android nav bar color animation + {"nav-bar-color-animation", flag_descriptions::kNavBarColorAnimationName, + flag_descriptions::kNavBarColorAnimationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kNavBarColorAnimation)}, + + // Tab closure methods refactor. + {"tab-closure-method-refactor", + flag_descriptions::kTabClosureMethodRefactorName, + flag_descriptions::kTabClosureMethodRefactorDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabClosureMethodRefactor)}, + + // Grid tab switcher update. + {"grid-tab-switcher-update", flag_descriptions::kGridTabSwitcherUpdateName, + flag_descriptions::kGridTabSwitcherUpdateDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kGridTabSwitcherUpdate)}, + + // Predictive back gesture + {"allow-tab-closing-upon-minimization", + flag_descriptions::kAllowTabClosingUponMinimizationName, + flag_descriptions::kAllowTabClosingUponMinimizationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAllowTabClosingUponMinimization)}, + + // Pinned tabs. + {"android-pinned-tabs", flag_descriptions::kAndroidPinnedTabsName, + flag_descriptions::kAndroidPinnedTabsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidPinnedTabs)}, + + {"hub-back-button", flag_descriptions::kHubBackButtonName, + flag_descriptions::kHubBackButtonDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kHubBackButton)}, + + // Hub slide animation. + {"hub-slide-animation", flag_descriptions::kHubSlideAnimationName, + flag_descriptions::kHubSlideAnimationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kHubSlideAnimation)}, + + {"tab-collection-android", flag_descriptions::kTabCollectionAndroidName, + flag_descriptions::kTabCollectionAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabCollectionAndroid)}, + + {"toolbar-phone-animation-refactor", + flag_descriptions::kToolbarPhoneAnimationRefactorName, + flag_descriptions::kToolbarPhoneAnimationRefactorDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kToolbarPhoneAnimationRefactor)}, + + {"form-factor-use-window-metrics", + flag_descriptions::kFormFactorUseMaxWindowMetricsName, + flag_descriptions::kFormFactorUseMaxWindowMetricsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(ui::kFormFactorUseMaxWindowMetrics)}, + + {"toolbar-tablet-resize-refactor", + flag_descriptions::kToolbarTabletResizeRefactorName, + flag_descriptions::kToolbarTabletResizeRefactorDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kToolbarTabletResizeRefactor)}, + +#endif // BUILDFLAG(IS_ANDROID) + {"disallow-doc-written-script-loads", + flag_descriptions::kDisallowDocWrittenScriptsUiName, + flag_descriptions::kDisallowDocWrittenScriptsUiDescription, kOsAll, + // NOTE: if we want to add additional experiment entries for other + // features controlled by kBlinkSettings, we'll need to add logic to + // merge the flag values. + ENABLE_DISABLE_VALUE_TYPE_AND_VALUE( + blink::switches::kBlinkSettings, + "disallowFetchForDocWrittenScriptsInMainFrame=true", + blink::switches::kBlinkSettings, + "disallowFetchForDocWrittenScriptsInMainFrame=false")}, +#if BUILDFLAG(IS_WIN) + {"use-winrt-midi-api", flag_descriptions::kUseWinrtMidiApiName, + flag_descriptions::kUseWinrtMidiApiDescription, kOsWin, + FEATURE_VALUE_TYPE(midi::features::kMidiManagerWinrt)}, + {"webrtc-allow-wgc-screen-capturer", + flag_descriptions::kWebRtcAllowWgcScreenCapturerName, + flag_descriptions::kWebRtcAllowWgcScreenCapturerDescription, kOsWin, + FEATURE_VALUE_TYPE(features::kWebRtcAllowWgcScreenCapturer)}, + {"webrtc-wgc-require-border", + flag_descriptions::kWebRtcWgcRequireBorderName, + flag_descriptions::kWebRtcWgcRequireBorderDescription, kOsWin, + FEATURE_VALUE_TYPE(features::kWebRtcWgcRequireBorder)}, +#endif // BUILDFLAG(IS_WIN) +#if defined(TOOLKIT_VIEWS) || BUILDFLAG(IS_ANDROID) + {"enable-autofill-credit-card-upload", + flag_descriptions::kAutofillCreditCardUploadName, + flag_descriptions::kAutofillCreditCardUploadDescription, kOsAll, + FEATURE_VALUE_TYPE(autofill::features::kAutofillUpstream)}, +#endif // defined(TOOLKIT_VIEWS) || BUILDFLAG(IS_ANDROID) + {"force-ui-direction", flag_descriptions::kForceUiDirectionName, + flag_descriptions::kForceUiDirectionDescription, kOsAll, + MULTI_VALUE_TYPE(kForceUIDirectionChoices)}, + {"force-text-direction", flag_descriptions::kForceTextDirectionName, + flag_descriptions::kForceTextDirectionDescription, kOsAll, + MULTI_VALUE_TYPE(kForceTextDirectionChoices)}, +#if BUILDFLAG(IS_ANDROID) + {"force-update-menu-type", flag_descriptions::kUpdateMenuTypeName, + flag_descriptions::kUpdateMenuTypeDescription, kOsAndroid, + MULTI_VALUE_TYPE(kForceUpdateMenuTypeChoices)}, + {"update-menu-item-custom-summary", + flag_descriptions::kUpdateMenuItemCustomSummaryName, + flag_descriptions::kUpdateMenuItemCustomSummaryDescription, kOsAndroid, + SINGLE_VALUE_TYPE_AND_VALUE( + switches::kForceShowUpdateMenuItemCustomSummary, + "Custom Summary")}, + {"force-show-update-menu-badge", flag_descriptions::kUpdateMenuBadgeName, + flag_descriptions::kUpdateMenuBadgeDescription, kOsAndroid, + SINGLE_VALUE_TYPE(switches::kForceShowUpdateMenuBadge)}, + {"set-market-url-for-testing", + flag_descriptions::kSetMarketUrlForTestingName, + flag_descriptions::kSetMarketUrlForTestingDescription, kOsAndroid, + SINGLE_VALUE_TYPE_AND_VALUE(switches::kMarketUrlForTesting, + "https://play.google.com/store/apps/" + "details?id=com.android.chrome")}, + {"omaha-min-sdk-version-android", + flag_descriptions::kOmahaMinSdkVersionAndroidName, + flag_descriptions::kOmahaMinSdkVersionAndroidDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kOmahaMinSdkVersionAndroid, + kOmahaMinSdkVersionAndroidVariations, + "OmahaMinSdkVersionAndroidStudy")}, +#endif // BUILDFLAG(IS_ANDROID) + {"enable-tls13-early-data", flag_descriptions::kEnableTLS13EarlyDataName, + flag_descriptions::kEnableTLS13EarlyDataDescription, kOsAll, + FEATURE_VALUE_TYPE(net::features::kEnableTLS13EarlyData)}, + {"tls-trust-anchor-ids", flag_descriptions::kTLSTrustAnchorIDsName, + flag_descriptions::kTLSTrustAnchorIDsDescription, kOsAll, + FEATURE_VALUE_TYPE(net::features::kTLSTrustAnchorIDs)}, +#if BUILDFLAG(IS_ANDROID) + {"feed-loading-placeholder", flag_descriptions::kFeedLoadingPlaceholderName, + flag_descriptions::kFeedLoadingPlaceholderDescription, kOsAndroid, + FEATURE_VALUE_TYPE(feed::kFeedLoadingPlaceholder)}, + {"feed-signed-out-view-demotion", + flag_descriptions::kFeedSignedOutViewDemotionName, + flag_descriptions::kFeedSignedOutViewDemotionDescription, kOsAndroid, + FEATURE_VALUE_TYPE(feed::kFeedSignedOutViewDemotion)}, + {"web-feed-awareness", flag_descriptions::kWebFeedAwarenessName, + flag_descriptions::kWebFeedAwarenessDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(feed::kWebFeedAwareness, + kWebFeedAwarenessVariations, + "WebFeedAwareness")}, + {"web-feed-onboarding", flag_descriptions::kWebFeedOnboardingName, + flag_descriptions::kWebFeedOnboardingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(feed::kWebFeedOnboarding)}, + {"web-feed-sort", flag_descriptions::kWebFeedSortName, + flag_descriptions::kWebFeedSortDescription, kOsAndroid, + FEATURE_VALUE_TYPE(feed::kWebFeedSort)}, + {"xsurface-metrics-reporting", + flag_descriptions::kXsurfaceMetricsReportingName, + flag_descriptions::kXsurfaceMetricsReportingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(feed::kXsurfaceMetricsReporting)}, + {"feed-containment", flag_descriptions::kFeedContainmentName, + flag_descriptions::kFeedContainmentDescription, kOsAndroid, + FEATURE_VALUE_TYPE(feed::kFeedContainment)}, + {"feed-discofeed-endpoint", flag_descriptions::kFeedDiscoFeedEndpointName, + flag_descriptions::kFeedDiscoFeedEndpointDescription, kOsAndroid, + FEATURE_VALUE_TYPE(feed::kDiscoFeedEndpoint)}, + {"feed-follow-ui-update", flag_descriptions::kFeedFollowUiUpdateName, + flag_descriptions::kFeedFollowUiUpdateDescription, kOsAndroid, + FEATURE_VALUE_TYPE(feed::kFeedFollowUiUpdate)}, + {"refresh-feed-on-start", flag_descriptions::kRefreshFeedOnRestartName, + flag_descriptions::kRefreshFeedOnRestartDescription, kOsAndroid, + FEATURE_VALUE_TYPE(feed::kRefreshFeedOnRestart)}, + {"feed-header-removal", flag_descriptions::kFeedHeaderRemovalName, + flag_descriptions::kFeedHeaderRemovalDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(feed::kFeedHeaderRemoval, + kFeedHeaderRemovalVariations, + "FeedHeaderRemoval")}, + {"feed-audio-overviews", flag_descriptions::kFeedAudioOverviewsName, + flag_descriptions::kFeedAudioOverviewsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(feed::kFeedAudioOverviews)}, + {"web-feed-deprecation", flag_descriptions::kWebFeedDeprecationName, + flag_descriptions::kWebFeedDeprecationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(feed::kWebFeedKillSwitch)}, +#endif // BUILDFLAG(IS_ANDROID) + {"enable-force-dark", flag_descriptions::kAutoWebContentsDarkModeName, + flag_descriptions::kAutoWebContentsDarkModeDescription, kOsAll, +#if BUILDFLAG(IS_CHROMEOS) + // TODO(crbug.com/40651782): Investigate crash reports and + // re-enable variations for ChromeOS. + FEATURE_VALUE_TYPE(blink::features::kForceWebContentsDarkMode)}, +#else + FEATURE_WITH_PARAMS_VALUE_TYPE(blink::features::kForceWebContentsDarkMode, + kForceDarkVariations, + "ForceDarkVariations")}, +#endif // BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_ANDROID) + {"enable-accessibility-deprecate-type-announce", + flag_descriptions::kAccessibilityDeprecateTypeAnnounceName, + flag_descriptions::kAccessibilityDeprecateTypeAnnounceDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(features::kAccessibilityDeprecateTypeAnnounce)}, + {"enable-accessibility-include-long-click-action", + flag_descriptions::kAccessibilityIncludeLongClickActionName, + flag_descriptions::kAccessibilityIncludeLongClickActionDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(features::kAccessibilityIncludeLongClickAction)}, + {"enable-accessibility-populate-supplemental-description-api", + flag_descriptions::kAccessibilityPopulateSupplementalDescriptionApiName, + flag_descriptions:: + kAccessibilityPopulateSupplementalDescriptionApiDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + features::kAccessibilityPopulateSupplementalDescriptionApi)}, + {"enable-accessibility-text-formatting", + flag_descriptions::kAccessibilityTextFormattingName, + flag_descriptions::kAccessibilityTextFormattingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kAccessibilityTextFormatting)}, + {"enable-accessibility-unified-snapshots", + flag_descriptions::kAccessibilityUnifiedSnapshotsName, + flag_descriptions::kAccessibilityUnifiedSnapshotsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kAccessibilityUnifiedSnapshots)}, + {"enable-accessibility-manage-broadcast-recevier-on-background", + flag_descriptions::kAccessibilityManageBroadcastReceiverOnBackgroundName, + flag_descriptions:: + kAccessibilityManageBroadcastReceiverOnBackgroundDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + features::kAccessibilityManageBroadcastReceiverOnBackground)}, + {"enable-smart-zoom", flag_descriptions::kSmartZoomName, + flag_descriptions::kSmartZoomDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kSmartZoom)}, +#endif // BUILDFLAG(IS_ANDROID) + {"enable-experimental-accessibility-language-detection", + flag_descriptions::kExperimentalAccessibilityLanguageDetectionName, + flag_descriptions::kExperimentalAccessibilityLanguageDetectionDescription, + kOsAll, + SINGLE_VALUE_TYPE( + ::switches::kEnableExperimentalAccessibilityLanguageDetection)}, + {"enable-experimental-accessibility-language-detection-dynamic", + flag_descriptions::kExperimentalAccessibilityLanguageDetectionDynamicName, + flag_descriptions:: + kExperimentalAccessibilityLanguageDetectionDynamicDescription, + kOsAll, + SINGLE_VALUE_TYPE( + ::switches::kEnableExperimentalAccessibilityLanguageDetectionDynamic)}, + {"enable-aria-element-reflection", + flag_descriptions::kAriaElementReflectionName, + flag_descriptions::kAriaElementReflectionDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kEnableAriaElementReflection)}, +#if BUILDFLAG(IS_CHROMEOS) + {"enable-cros-autocorrect-params-tuning", + flag_descriptions::kAutocorrectParamsTuningName, + flag_descriptions::kAutocorrectParamsTuningDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kAutocorrectParamsTuning)}, + {"enable-cros-autocorrect-by-default", + flag_descriptions::kAutocorrectByDefaultName, + flag_descriptions::kAutocorrectByDefaultDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kAutocorrectByDefault)}, + {"enable-cros-first-party-vietnamese-input", + flag_descriptions::kFirstPartyVietnameseInputName, + flag_descriptions::kFirstPartyVietnameseInputDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFirstPartyVietnameseInput)}, + {"enable-cros-hindi-inscript-layout", + flag_descriptions::kHindiInscriptLayoutName, + flag_descriptions::kHindiInscriptLayoutDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kHindiInscriptLayout)}, + {"enable-cros-ime-assist-multi-word", + flag_descriptions::kImeAssistMultiWordName, + flag_descriptions::kImeAssistMultiWordDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kAssistMultiWord)}, + {"enable-cros-ime-fst-decoder-params-update", + flag_descriptions::kImeFstDecoderParamsUpdateName, + flag_descriptions::kImeFstDecoderParamsUpdateDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kImeFstDecoderParamsUpdate)}, + {"enable-cros-ime-manifest-v3", flag_descriptions::kImeManifestV3Name, + flag_descriptions::kImeManifestV3Description, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kImeManifestV3)}, + {"enable-cros-ime-system-emoji-picker-gif-support", + flag_descriptions::kImeSystemEmojiPickerGIFSupportName, + flag_descriptions::kImeSystemEmojiPickerGIFSupportDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kImeSystemEmojiPickerGIFSupport)}, + {"enable-cros-ime-system-emoji-picker-jelly-support", + flag_descriptions::kImeSystemEmojiPickerJellySupportName, + flag_descriptions::kImeSystemEmojiPickerJellySupportDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kImeSystemEmojiPickerJellySupport)}, + {"enable-cros-ime-system-emoji-picker-mojo-search", + flag_descriptions::kImeSystemEmojiPickerMojoSearchName, + flag_descriptions::kImeSystemEmojiPickerMojoSearchDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kImeSystemEmojiPickerMojoSearch)}, + {"enable-cros-ime-system-emoji-picker-variant-grouping", + flag_descriptions::kImeSystemEmojiPickerVariantGroupingName, + flag_descriptions::kImeSystemEmojiPickerVariantGroupingDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kImeSystemEmojiPickerVariantGrouping)}, + {"enable-cros-ime-us-english-model-update", + flag_descriptions::kImeUsEnglishModelUpdateName, + flag_descriptions::kImeUsEnglishModelUpdateDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kImeUsEnglishModelUpdate)}, + {"enable-cros-ime-korean-only-mode-switch-on-right-alt", + flag_descriptions::kImeKoreanOnlyModeSwitchOnRightAltName, + flag_descriptions::kImeKoreanOnlyModeSwitchOnRightAltDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kImeKoreanOnlyModeSwitchOnRightAlt)}, + {"enable-cros-ime-switch-check-connection-status", + flag_descriptions::kImeSwitchCheckConnectionStatusName, + flag_descriptions::kImeSwitchCheckConnectionStatusDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kImeSwitchCheckConnectionStatus)}, + {"enable-cros-japanese-os-settings", + flag_descriptions::kJapaneseOSSettingsName, + flag_descriptions::kJapaneseOSSettingsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kJapaneseOSSettings)}, + {"enable-cros-system-japanese-physical-typing", + flag_descriptions::kSystemJapanesePhysicalTypingName, + flag_descriptions::kSystemJapanesePhysicalTypingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSystemJapanesePhysicalTyping)}, + {"enable-cros-virtual-keyboard-global-emoji-preferences", + flag_descriptions::kVirtualKeyboardGlobalEmojiPreferencesName, + flag_descriptions::kVirtualKeyboardGlobalEmojiPreferencesDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kVirtualKeyboardGlobalEmojiPreferences)}, + {"enable-accessibility-bounce-keys", + flag_descriptions::kAccessibilityBounceKeysName, + flag_descriptions::kAccessibilityBounceKeysDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityBounceKeys)}, + {"enable-accessibility-slow-keys", + flag_descriptions::kAccessibilitySlowKeysName, + flag_descriptions::kAccessibilitySlowKeysDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilitySlowKeys)}, + {"enable-experimental-accessibility-dictation-context-checking", + flag_descriptions::kExperimentalAccessibilityDictationContextCheckingName, + flag_descriptions:: + kExperimentalAccessibilityDictationContextCheckingDescription, + kOsCrOS, + FEATURE_VALUE_TYPE( + features::kExperimentalAccessibilityDictationContextChecking)}, + {"enable-experimental-accessibility-google-tts-high-quality-voices", + flag_descriptions:: + kExperimentalAccessibilityGoogleTtsHighQualityVoicesName, + flag_descriptions:: + kExperimentalAccessibilityGoogleTtsHighQualityVoicesDescription, + kOsCrOS, + FEATURE_VALUE_TYPE( + features::kExperimentalAccessibilityGoogleTtsHighQualityVoices)}, + {"enable-experimental-accessibility-manifest-v3", + flag_descriptions::kExperimentalAccessibilityManifestV3Name, + flag_descriptions::kExperimentalAccessibilityManifestV3Description, + kOsCrOS, + SINGLE_VALUE_TYPE(::switches::kEnableExperimentalAccessibilityManifestV3)}, + {"enable-experimental-accessibility-switch-access-text", + flag_descriptions::kExperimentalAccessibilitySwitchAccessTextName, + flag_descriptions::kExperimentalAccessibilitySwitchAccessTextDescription, + kOsCrOS, + SINGLE_VALUE_TYPE( + ::switches::kEnableExperimentalAccessibilitySwitchAccessText)}, + {"enable-system-proxy-for-system-services", + flag_descriptions::kSystemProxyForSystemServicesName, + flag_descriptions::kSystemProxyForSystemServicesDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSystemProxyForSystemServices)}, + {"system-shortcut-behavior", flag_descriptions::kSystemShortcutBehaviorName, + flag_descriptions::kSystemShortcutBehaviorDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE(ash::features::kSystemShortcutBehavior, + kSystemShortcutBehaviorVariations, + "SystemShortcutBehavior")}, +#endif // BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_ANDROID) + {"enable-android-grammar-check", + flag_descriptions::kAndroidGrammarCheckName, + flag_descriptions::kAndroidGrammarCheckDescription, kOsAndroid, + FEATURE_VALUE_TYPE(spellcheck::kAndroidGrammarCheck)}, + {"enable-android-spellcheck-native-ui", + flag_descriptions::kAndroidSpellcheckNativeUiName, + flag_descriptions::kAndroidSpellcheckNativeUiDescription, kOsAndroid, + FEATURE_VALUE_TYPE(blink::features::kAndroidSpellcheckNativeUi)}, + {"enable-android-spellcheck-full-api-blink", + flag_descriptions::kAndroidSpellcheckFullApiBlinkName, + flag_descriptions::kAndroidSpellcheckFullApiBlinkDescription, kOsAndroid, + FEATURE_VALUE_TYPE(blink::features::kAndroidSpellcheckFullApiBlink)}, +#endif // BUILDFLAG(IS_ANDROID) + {"enable-cros-touch-text-editing-redesign", + flag_descriptions::kTouchTextEditingRedesignName, + flag_descriptions::kTouchTextEditingRedesignDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kTouchTextEditingRedesign)}, +#if BUILDFLAG(IS_MAC) + {"enable-retry-capture-device-enumeration-on-crash", + flag_descriptions::kRetryGetVideoCaptureDeviceInfosName, + flag_descriptions::kRetryGetVideoCaptureDeviceInfosDescription, kOsMac, + FEATURE_VALUE_TYPE(features::kRetryGetVideoCaptureDeviceInfos)}, + {"enable-immersive-fullscreen-toolbar", + flag_descriptions::kImmersiveFullscreenName, + flag_descriptions::kImmersiveFullscreenDescription, kOsMac, + FEATURE_VALUE_TYPE(features::kImmersiveFullscreen)}, +#endif // BUILDFLAG(IS_MAC) + {"enable-web-payments-experimental-features", + flag_descriptions::kWebPaymentsExperimentalFeaturesName, + flag_descriptions::kWebPaymentsExperimentalFeaturesDescription, kOsAll, + FEATURE_VALUE_TYPE(payments::features::kWebPaymentsExperimentalFeatures)}, + {"enable-debug-for-store-billing", + flag_descriptions::kAppStoreBillingDebugName, + flag_descriptions::kAppStoreBillingDebugDescription, kOsAll, + FEATURE_VALUE_TYPE(payments::features::kAppStoreBillingDebug)}, + {"enable-debug-for-secure-payment-confirmation", + flag_descriptions::kSecurePaymentConfirmationDebugName, + flag_descriptions::kSecurePaymentConfirmationDebugDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kSecurePaymentConfirmationDebug)}, + {"enable-secure-payment-confirmation-browser-bound-key", + flag_descriptions::kSecurePaymentConfirmationBrowserBoundKeysName, + flag_descriptions::kSecurePaymentConfirmationBrowserBoundKeysDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + blink::features::kSecurePaymentConfirmationBrowserBoundKeys)}, +#if BUILDFLAG(IS_ANDROID) + {"show-ready-to-pay-debug-info", + flag_descriptions::kShowReadyToPayDebugInfoName, + flag_descriptions::kShowReadyToPayDebugInfoDescription, kOsAndroid, + FEATURE_VALUE_TYPE(payments::android::kShowReadyToPayDebugInfo)}, +#endif // BUILDFLAG(IS_ANDROID) + {"fill-on-account-select", flag_descriptions::kFillOnAccountSelectName, + flag_descriptions::kFillOnAccountSelectDescription, kOsAll, + FEATURE_VALUE_TYPE(password_manager::features::kFillOnAccountSelect)}, +#if BUILDFLAG(IS_CHROMEOS) + {"arc-aaudio-mmap-low-latency", + flag_descriptions::kArcAAudioMMAPLowLatencyName, + flag_descriptions::kArcAAudioMMAPLowLatencyDescription, kOsCrOS, + PLATFORM_FEATURE_NAME_TYPE("CrOSLateBootArcVmAAudioMMAPLowLatency")}, + {"arc-custom-tabs-experiment", + flag_descriptions::kArcCustomTabsExperimentName, + flag_descriptions::kArcCustomTabsExperimentDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kCustomTabsExperimentFeature)}, + {kArcEnableAttestationFlag, flag_descriptions::kArcEnableAttestationName, + flag_descriptions::kArcEnableAttestationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kEnableArcAttestation)}, + {kArcEnableVirtioBlkForDataInternalName, + flag_descriptions::kArcEnableVirtioBlkForDataName, + flag_descriptions::kArcEnableVirtioBlkForDataDesc, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kEnableVirtioBlkForData)}, + {"arc-extend-intent-anr-timeout", + flag_descriptions::kArcExtendIntentAnrTimeoutName, + flag_descriptions::kArcExtendIntentAnrTimeoutDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kExtendIntentAnrTimeout)}, + {"arc-extend-service-anr-timeout", + flag_descriptions::kArcExtendServiceAnrTimeoutName, + flag_descriptions::kArcExtendServiceAnrTimeoutDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kExtendServiceAnrTimeout)}, + {"arc-external-storage-access", + flag_descriptions::kArcExternalStorageAccessName, + flag_descriptions::kArcExternalStorageAccessDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kExternalStorageAccess)}, + {"arc-friendlier-error-dialog", + flag_descriptions::kArcFriendlierErrorDialogName, + flag_descriptions::kArcFriendlierErrorDialogDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kEnableFriendlierErrorDialog)}, + {"arc-native-bridge-toggle", flag_descriptions::kArcNativeBridgeToggleName, + flag_descriptions::kArcNativeBridgeToggleDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kNativeBridgeToggleFeature)}, + {"arc-per-app-language", flag_descriptions::kArcPerAppLanguageName, + flag_descriptions::kArcPerAppLanguageDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kPerAppLanguage)}, + {"arc-resize-compat", flag_descriptions::kArcResizeCompatName, + flag_descriptions::kArcResizeCompatDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kResizeCompat)}, + {"arc-rt-vcpu-dual-core", flag_descriptions::kArcRtVcpuDualCoreName, + flag_descriptions::kArcRtVcpuDualCoreDesc, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kRtVcpuDualCore)}, + {"arc-rt-vcpu-quad-core", flag_descriptions::kArcRtVcpuQuadCoreName, + flag_descriptions::kArcRtVcpuQuadCoreDesc, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kRtVcpuQuadCore)}, + {"arc-switch-to-keymint-daemon", + flag_descriptions::kArcSwitchToKeyMintDaemonName, + flag_descriptions::kArcSwitchToKeyMintDaemonDesc, kOsCrOS, + PLATFORM_FEATURE_NAME_TYPE("CrOSLateBootArcSwitchToKeyMintDaemon")}, + {"arc-switch-to-keymint-on-t-override", + flag_descriptions::kArcSwitchToKeyMintOnTOverrideName, + flag_descriptions::kArcSwitchToKeyMintOnTOverrideDesc, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kSwitchToKeyMintOnTOverride)}, + {"arc-sync-install-priority", + flag_descriptions::kArcSyncInstallPriorityName, + flag_descriptions::kArcSyncInstallPriorityDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kSyncInstallPriority)}, + {"arc-unthrottle-on-active-audio-v2", + flag_descriptions::kArcUnthrottleOnActiveAudioV2Name, + flag_descriptions::kArcUnthrottleOnActiveAudioV2Description, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kUnthrottleOnActiveAudioV2)}, + {"arc-video-encode-use-mappable-si", + flag_descriptions::kArcVideoEncodeUseMappableSIName, + flag_descriptions::kArcVideoEncodeUseMappableSIDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kVideoEncodeUseMappableSI)}, + {"arc-vmm-swap-keyboard-shortcut", + flag_descriptions::kArcVmmSwapKBShortcutName, + flag_descriptions::kArcVmmSwapKBShortcutDesc, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kVmmSwapKeyboardShortcut)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_CHROMEOS) + {ui_devtools::switches::kEnableUiDevTools, + flag_descriptions::kUiDevToolsName, + flag_descriptions::kUiDevToolsDescription, kOsCrOS, + SINGLE_VALUE_TYPE(ui_devtools::switches::kEnableUiDevTools)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-touchscreen-calibration", + flag_descriptions::kTouchscreenCalibrationName, + flag_descriptions::kTouchscreenCalibrationDescription, kOsCrOS, + SINGLE_VALUE_TYPE(ash::switches::kEnableTouchCalibrationSetting)}, + {"enable-touchscreen-mapping", flag_descriptions::kTouchscreenMappingName, + flag_descriptions::kTouchscreenMappingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableTouchscreenMappingExperience)}, + {"force-control-face-ae", flag_descriptions::kForceControlFaceAeName, + flag_descriptions::kForceControlFaceAeDescription, kOsCrOS, + MULTI_VALUE_TYPE(kForceControlFaceAeChoices)}, + {"auto-framing-override", flag_descriptions::kAutoFramingOverrideName, + flag_descriptions::kAutoFramingOverrideDescription, kOsCrOS, + MULTI_VALUE_TYPE(kAutoFramingOverrideChoices)}, + {"face-retouch-override", flag_descriptions::kFaceRetouchOverrideName, + flag_descriptions::kFaceRetouchOverrideDescription, kOsCrOS, + MULTI_VALUE_TYPE(kFaceRetouchOverrideChoices)}, + {"crostini-gpu-support", flag_descriptions::kCrostiniGpuSupportName, + flag_descriptions::kCrostiniGpuSupportDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kCrostiniGpuSupport)}, + {"file-transfer-enterprise-connector", + flag_descriptions::kFileTransferEnterpriseConnectorName, + flag_descriptions::kFileTransferEnterpriseConnectorDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kFileTransferEnterpriseConnector)}, + {"file-transfer-enterprise-connector-ui", + flag_descriptions::kFileTransferEnterpriseConnectorUIName, + flag_descriptions::kFileTransferEnterpriseConnectorUIDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kFileTransferEnterpriseConnectorUI)}, + {"files-conflict-dialog", flag_descriptions::kFilesConflictDialogName, + flag_descriptions::kFilesConflictDialogDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFilesConflictDialog)}, + {"files-local-image-search", flag_descriptions::kFilesLocalImageSearchName, + flag_descriptions::kFilesLocalImageSearchDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFilesLocalImageSearch)}, + {"files-materialized-views", flag_descriptions::kFilesMaterializedViewsName, + flag_descriptions::kFilesMaterializedViewsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFilesMaterializedViews)}, + {"files-single-partition-format", + flag_descriptions::kFilesSinglePartitionFormatName, + flag_descriptions::kFilesSinglePartitionFormatDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFilesSinglePartitionFormat)}, + {"files-trash-auto-cleanup", flag_descriptions::kFilesTrashAutoCleanupName, + flag_descriptions::kFilesTrashAutoCleanupDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFilesTrashDrive)}, + {"files-trash-drive", flag_descriptions::kFilesTrashDriveName, + flag_descriptions::kFilesTrashDriveDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFilesTrashDrive)}, + {"file-system-provider-cloud-file-system", + flag_descriptions::kFileSystemProviderCloudFileSystemName, + flag_descriptions::kFileSystemProviderCloudFileSystemDescription, kOsCrOS, + FEATURE_VALUE_TYPE( + chromeos::features::kFileSystemProviderCloudFileSystem)}, + {"file-system-provider-content-cache", + flag_descriptions::kFileSystemProviderContentCacheName, + flag_descriptions::kFileSystemProviderContentCacheDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kFileSystemProviderContentCache)}, + {"fuse-box-debug", flag_descriptions::kFuseBoxDebugName, + flag_descriptions::kFuseBoxDebugDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFuseBoxDebug)}, + {"spectre-v2-mitigation", flag_descriptions::kSpectreVariant2MitigationName, + flag_descriptions::kSpectreVariant2MitigationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(sandbox::policy::features::kSpectreVariant2Mitigation)}, + {"upload-office-to-cloud", flag_descriptions::kUploadOfficeToCloudName, + flag_descriptions::kUploadOfficeToCloudName, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kUploadOfficeToCloud)}, + {"eap-gtc-wifi-authentication", + flag_descriptions::kEapGtcWifiAuthenticationName, + flag_descriptions::kEapGtcWifiAuthenticationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEapGtcWifiAuthentication)}, + {"eche-swa", flag_descriptions::kEcheSWAName, + flag_descriptions::kEcheSWADescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEcheSWA)}, + {"eche-launcher", flag_descriptions::kEcheLauncherName, + flag_descriptions::kEcheLauncherDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEcheLauncherListView)}, + {"eche-swa-check-android-network-info", + flag_descriptions::kEcheSWACheckAndroidNetworkInfoName, + flag_descriptions::kEcheSWACheckAndroidNetworkInfoDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEcheSWACheckAndroidNetworkInfo)}, + {"eche-swa-debug-mode", flag_descriptions::kEcheSWADebugModeName, + flag_descriptions::kEcheSWADebugModeDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEcheSWADebugMode)}, + {"eche-swa-disable-stun-server", + flag_descriptions::kEcheSWADisableStunServerName, + flag_descriptions::kEcheSWADisableStunServerDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEcheSWADisableStunServer)}, + {"eche-swa-measure-latency", flag_descriptions::kEcheSWAMeasureLatencyName, + flag_descriptions::kEcheSWAMeasureLatencyDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEcheSWAMeasureLatency)}, + {"eche-swa-send-start-signaling", + flag_descriptions::kEcheSWASendStartSignalingName, + flag_descriptions::kEcheSWASendStartSignalingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEcheSWASendStartSignaling)}, + {"print-preview-cros-app", flag_descriptions::kPrintPreviewCrosAppName, + flag_descriptions::kPrintPreviewCrosAppDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kPrintPreviewCrosApp)}, + {kGlanceablesTimeManagementClassroomStudentViewInternalName, + flag_descriptions::kGlanceablesTimeManagementClassroomStudentViewName, + flag_descriptions:: + kGlanceablesTimeManagementClassroomStudentViewDescription, + kOsCrOS, + FEATURE_VALUE_TYPE( + ash::features::kGlanceablesTimeManagementClassroomStudentView)}, + {kGlanceablesTimeManagementTasksViewInternalName, + flag_descriptions::kGlanceablesTimeManagementTasksViewName, + flag_descriptions::kGlanceablesTimeManagementTasksViewDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kGlanceablesTimeManagementTasksView)}, + {"vc-dlc-ui", flag_descriptions::kVcDlcUiName, + flag_descriptions::kVcDlcUiDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kVcDlcUi)}, + {"vc-studio-look", flag_descriptions::kVcStudioLookName, + flag_descriptions::kVcStudioLookDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kVcStudioLook)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"android-app-integration", flag_descriptions::kAndroidAppIntegrationName, + flag_descriptions::kAndroidAppIntegrationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidAppIntegration)}, + + {"android-app-integration-module", + flag_descriptions::kAndroidAppIntegrationModuleName, + flag_descriptions::kAndroidAppIntegrationModuleDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + segmentation_platform::features::kAndroidAppIntegrationModule, + kAndroidAppIntegrationModuleVariations, + "AndroidAppIntegrationModule")}, + + {"android-app-integration-multi-data-source", + flag_descriptions::kAndroidAppIntegrationMultiDataSourceName, + flag_descriptions::kAndroidAppIntegrationMultiDataSourceDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + chrome::android::kAndroidAppIntegrationMultiDataSource, + kAndroidAppIntegrationMultiDataSourceVariations, + "AndroidAppIntegrationMultiDataSource")}, + + {"android-app-integration-v2", + flag_descriptions::kAndroidAppIntegrationV2Name, + flag_descriptions::kAndroidAppIntegrationV2Description, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidAppIntegrationV2)}, + + {"new-tab-page-customization", + flag_descriptions::kNewTabPageCustomizationName, + flag_descriptions::kNewTabPageCustomizationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kNewTabPageCustomization)}, + + {"new-tab-page-customization-v2", + flag_descriptions::kNewTabPageCustomizationV2Name, + flag_descriptions::kNewTabPageCustomizationV2Description, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kNewTabPageCustomizationV2)}, + + {"android-composeplate", flag_descriptions::kAndroidComposeplateName, + flag_descriptions::kAndroidComposeplateDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kAndroidComposeplate, + kAndroidComposeplateVariations, + "AndroidComposeplate")}, + + {"new-tab-page-customization-for-mvt", + flag_descriptions::kNewTabPageCustomizationForMvtName, + flag_descriptions::kNewTabPageCustomizationForMvtDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kNewTabPageCustomizationForMvt)}, + + {"new-tab-page-customization-toolbar-button", + flag_descriptions::kNewTabPageCustomizationToolbarButtonName, + flag_descriptions::kNewTabPageCustomizationToolbarButtonDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kNewTabPageCustomizationToolbarButton)}, + + {"android-app-integration-with-favicon", + flag_descriptions::kAndroidAppIntegrationWithFaviconName, + flag_descriptions::kAndroidAppIntegrationWithFaviconDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + chrome::android::kAndroidAppIntegrationWithFavicon, + kAndroidAppIntegrationWithFaviconVariations, + "AndroidAppIntegrationWithFavicon")}, + + {"android-bottom-toolbar", flag_descriptions::kAndroidBottomToolbarName, + flag_descriptions::kAndroidBottomToolbarDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kAndroidBottomToolbar, + kAndroidBottomToolbarVariations, + "AndroidBottomToolbar")}, + + {"android-bottom-toolbar-v2", + flag_descriptions::kAndroidBottomToolbarV2Name, + flag_descriptions::kAndroidBottomToolbarV2Description, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidBottomToolbarV2)}, + + {"auxiliary-search-donation", + flag_descriptions::kAuxiliarySearchDonationName, + flag_descriptions::kAuxiliarySearchDonationDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kAuxiliarySearchDonation, + kAuxiliarySearchDonationVariations, + "AuxiliarySearchDonation")}, + + {"disable-instance-limit", flag_descriptions::kDisableInstanceLimitName, + flag_descriptions::kDisableInstanceLimitDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kDisableInstanceLimit)}, + + {"clear-instance-info-when-closed-intentionally", + flag_descriptions::kClearInstanceInfoWhenClosedIntentionallyName, + flag_descriptions::kClearInstanceInfoWhenClosedIntentionallyDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kClearInstanceInfoWhenClosedIntentionally)}, + + {"change-unfocused-priority", + flag_descriptions::kChangeUnfocusedPriorityName, + flag_descriptions::kChangeUnfocusedPriorityDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kChangeUnfocusedPriority)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"most-visited-tiles-new-scoring", + flag_descriptions::kMostVisitedTilesNewScoringName, + flag_descriptions::kMostVisitedTilesNewScoringDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(history::kMostVisitedTilesNewScoring, + kMostVisitedTilesNewScoringVariations, + "MostVisitedTilesNewScoring")}, + + {"most-visited-tiles-visual-deduplication", + flag_descriptions::kMostVisitedTilesVisualDeduplicationName, + flag_descriptions::kMostVisitedTilesVisualDeduplicationDescription, kOsAll, + FEATURE_VALUE_TYPE(history::kMostVisitedTilesVisualDeduplication)}, + + {"omnibox-local-history-zero-suggest-beyond-ntp", + flag_descriptions::kOmniboxLocalHistoryZeroSuggestBeyondNTPName, + flag_descriptions::kOmniboxLocalHistoryZeroSuggestBeyondNTPDescription, + kOsAll, FEATURE_VALUE_TYPE(omnibox::kLocalHistoryZeroSuggestBeyondNTP)}, + + {"omnibox-suggestion-answer-migration", + flag_descriptions::kOmniboxSuggestionAnswerMigrationName, + flag_descriptions::kOmniboxSuggestionAnswerMigrationDescription, kOsAll, + FEATURE_VALUE_TYPE(omnibox_feature_configs::SuggestionAnswerMigration:: + kOmniboxSuggestionAnswerMigration)}, + + {"omnibox-zero-suggest-prefetch-debouncing", + flag_descriptions::kOmniboxZeroSuggestPrefetchDebouncingName, + flag_descriptions::kOmniboxZeroSuggestPrefetchDebouncingDescription, + kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + omnibox::kZeroSuggestPrefetchDebouncing, + kOmniboxZeroSuggestPrefetchDebouncingVariations, + "OmniboxZeroSuggestPrefetchDebouncing")}, + + {"omnibox-zero-suggest-prefetching", + flag_descriptions::kOmniboxZeroSuggestPrefetchingName, + flag_descriptions::kOmniboxZeroSuggestPrefetchingDescription, kOsAll, + FEATURE_VALUE_TYPE(omnibox::kZeroSuggestPrefetching)}, + + {"omnibox-zero-suggest-prefetching-on-srp", + flag_descriptions::kOmniboxZeroSuggestPrefetchingOnSRPName, + flag_descriptions::kOmniboxZeroSuggestPrefetchingOnSRPDescription, kOsAll, + FEATURE_VALUE_TYPE(omnibox::kZeroSuggestPrefetchingOnSRP)}, + + {"omnibox-zero-suggest-prefetching-on-web", + flag_descriptions::kOmniboxZeroSuggestPrefetchingOnWebName, + flag_descriptions::kOmniboxZeroSuggestPrefetchingOnWebDescription, kOsAll, + FEATURE_VALUE_TYPE(omnibox::kZeroSuggestPrefetchingOnWeb)}, + + {"omnibox-zero-suggest-in-memory-caching", + flag_descriptions::kOmniboxZeroSuggestInMemoryCachingName, + flag_descriptions::kOmniboxZeroSuggestInMemoryCachingDescription, kOsAll, + FEATURE_VALUE_TYPE(omnibox::kZeroSuggestInMemoryCaching)}, + + {"omnibox-ml-log-url-scoring-signals", + flag_descriptions::kOmniboxMlLogUrlScoringSignalsName, + flag_descriptions::kOmniboxMlLogUrlScoringSignalsDescription, kOsAll, + FEATURE_VALUE_TYPE(omnibox::kLogUrlScoringSignals)}, + {"omnibox-ml-url-piecewise-mapped-search-blending", + flag_descriptions::kOmniboxMlUrlPiecewiseMappedSearchBlendingName, + flag_descriptions::kOmniboxMlUrlPiecewiseMappedSearchBlendingDescription, + kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + omnibox::kMlUrlPiecewiseMappedSearchBlending, + kMlUrlPiecewiseMappedSearchBlendingVariations, + "MlUrlPiecewiseMappedSearchBlending")}, + {"omnibox-ml-url-score-caching", + flag_descriptions::kOmniboxMlUrlScoreCachingName, + flag_descriptions::kOmniboxMlUrlScoreCachingDescription, kOsAll, + FEATURE_VALUE_TYPE(omnibox::kMlUrlScoreCaching)}, + {"omnibox-ml-url-scoring", flag_descriptions::kOmniboxMlUrlScoringName, + flag_descriptions::kOmniboxMlUrlScoringDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kMlUrlScoring, + kOmniboxMlUrlScoringVariations, + "MlUrlScoring")}, + {"omnibox-ml-url-search-blending", + flag_descriptions::kOmniboxMlUrlSearchBlendingName, + flag_descriptions::kOmniboxMlUrlSearchBlendingDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kMlUrlSearchBlending, + kMlUrlSearchBlendingVariations, + "MlUrlScoring")}, + {"omnibox-ml-url-scoring-model", + flag_descriptions::kOmniboxMlUrlScoringModelName, + flag_descriptions::kOmniboxMlUrlScoringModelDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kUrlScoringModel, + kUrlScoringModelVariations, + "MlUrlScoring")}, + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \ + BUILDFLAG(IS_WIN) + {"contextual-search-box-uses-contextual-search-provider", + flag_descriptions::kContextualSearchBoxUsesContextualSearchProviderName, + flag_descriptions:: + kContextualSearchBoxUsesContextualSearchProviderDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(omnibox_feature_configs::ContextualSearch:: + kContextualSearchBoxUsesContextualSearchProvider)}, + + {"contextual-search-open-lens-action-uses-thumbnail", + flag_descriptions::kContextualSearchOpenLensActionUsesThumbnailName, + flag_descriptions::kContextualSearchOpenLensActionUsesThumbnailDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(omnibox_feature_configs::ContextualSearch:: + kContextualSearchOpenLensActionUsesThumbnail)}, + + {"contextual-suggestions-ablate-others-when-present", + flag_descriptions::kContextualSuggestionsAblateOthersWhenPresentName, + flag_descriptions:: + kContextualSuggestionsAblateOthersWhenPresentDescription, + kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + omnibox_feature_configs::ContextualSearch:: + kContextualSuggestionsAblateOthersWhenPresent, + kContextualSuggestionsAblateOthersWhenPresentVariations, + "ContextualSuggestionsAblateOthersWhenPresent")}, + + {"omnibox-contextual-search-on-focus-suggestions", + flag_descriptions::kOmniboxContextualSearchOnFocusSuggestionsName, + flag_descriptions::kOmniboxContextualSearchOnFocusSuggestionsDescription, + kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + omnibox_feature_configs::ContextualSearch:: + kOmniboxContextualSearchOnFocusSuggestions, + kOmniboxContextualSearchOnFocusSuggestionsVariations, + "OmniboxContextualSearchOnFocusSuggestions")}, + + {"omnibox-contextual-suggestions", + flag_descriptions::kOmniboxContextualSuggestionsName, + flag_descriptions::kOmniboxContextualSuggestionsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(omnibox_feature_configs::ContextualSearch:: + kOmniboxContextualSuggestions)}, + + {"lens-overlay-omnibox-entry-point", + flag_descriptions::kLensOverlayOmniboxEntryPointName, + flag_descriptions::kLensOverlayOmniboxEntryPointDescription, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensOverlayOmniboxEntryPoint)}, + + {"ai-mode-omnibox-entry-point", + flag_descriptions::kAiModeOmniboxEntryPointName, + flag_descriptions::kAiModeOmniboxEntryPointDescription, kOsDesktop, + FEATURE_VALUE_TYPE(omnibox::kAiModeOmniboxEntryPoint)}, + + {"aim-server-eligibility", + flag_descriptions::kOmniboxAimServerEligibilityName, + flag_descriptions::kOmniboxAimServerEligibilityDescription, kOsAll, + FEATURE_VALUE_TYPE(omnibox::kAimServerEligibilityEnabled)}, + + {"hide-aim-omnibox-entrypoint-on-user-input", + flag_descriptions::kHideAimOmniboxEntrypointOnUserInputName, + flag_descriptions::kHideAimOmniboxEntrypointOnUserInputDescription, + kOsDesktop, FEATURE_VALUE_TYPE(omnibox::kHideAimEntrypointOnUserInput)}, + + {"omnibox-toolbelt", flag_descriptions::kOmniboxToolbeltName, + flag_descriptions::kOmniboxToolbeltDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + omnibox_feature_configs::Toolbelt::kOmniboxToolbelt, + kOmniboxToolbeltVariations, + "OmniboxToolbelt")}, + + {"omnibox-allow-ai-mode-matches", + flag_descriptions::kOmniboxAllowAiModeMatchesName, + flag_descriptions::kOmniboxAllowAiModeMatchesDescription, kOsDesktop, + FEATURE_VALUE_TYPE(omnibox_feature_configs::AiMode::kAllowAiModeMatches)}, + + {"omnibox-drive-suggestions-no-sync-requirement", + flag_descriptions::kOmniboxDriveSuggestionsNoSyncRequirementName, + flag_descriptions::kOmniboxDriveSuggestionsNoSyncRequirementDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(omnibox::kDocumentProviderNoSyncRequirement)}, + {"omnibox-force-allowed-to-be-default", + flag_descriptions::kOmniboxForceAllowedToBeDefaultName, + flag_descriptions::kOmniboxForceAllowedToBeDefaultDescription, kOsDesktop, + FEATURE_VALUE_TYPE(omnibox_feature_configs::ForceAllowedToBeDefault:: + kForceAllowedToBeDefault)}, + {"omnibox-rich-autocompletion-promising", + flag_descriptions::kOmniboxRichAutocompletionPromisingName, + flag_descriptions::kOmniboxRichAutocompletionPromisingDescription, + kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + omnibox::kRichAutocompletion, + kOmniboxRichAutocompletionPromisingVariations, + "OmniboxBundledExperimentV1")}, + {"omnibox-starter-pack-expansion", + flag_descriptions::kOmniboxStarterPackExpansionName, + flag_descriptions::kOmniboxStarterPackExpansionDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kStarterPackExpansion, + kOmniboxStarterPackExpansionVariations, + "StarterPackExpansion")}, + + {"omnibox-starter-pack-iph", flag_descriptions::kOmniboxStarterPackIPHName, + flag_descriptions::kOmniboxStarterPackIPHDescription, kOsDesktop, + FEATURE_VALUE_TYPE(omnibox::kStarterPackIPH)}, + + {"omnibox-focus-triggers-web-and-srp-zero-suggest", + flag_descriptions::kOmniboxFocusTriggersWebAndSRPZeroSuggestName, + flag_descriptions::kOmniboxFocusTriggersWebAndSRPZeroSuggestDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(omnibox::kFocusTriggersWebAndSRPZeroSuggest)}, + + {"omnibox-show-popup-on-mouse-released", + flag_descriptions::kOmniboxShowPopupOnMouseReleasedName, + flag_descriptions::kOmniboxShowPopupOnMouseReleasedDescription, kOsDesktop, + FEATURE_VALUE_TYPE(omnibox::kShowPopupOnMouseReleased)}, + + {"omnibox-hide-suggestion-group-headers", + flag_descriptions::kOmniboxHideSuggestionGroupHeadersName, + flag_descriptions::kOmniboxHideSuggestionGroupHeadersDescription, + kOsDesktop, FEATURE_VALUE_TYPE(omnibox::kHideSuggestionGroupHeaders)}, + + {"omnibox-url-suggestions-on-focus", + flag_descriptions::kOmniboxUrlSuggestionsOnFocus, + flag_descriptions::kOmniboxUrlSuggestionsOnFocusDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + omnibox_feature_configs::OmniboxUrlSuggestionsOnFocus:: + kOmniboxUrlSuggestionsOnFocus, + kOmniboxUrlSuggestionsOnFocusVariations, + "OmniboxUrlSuggestionsOnFocus")}, + + {"omnibox-zps-suggestion-limit", + flag_descriptions::kOmniboxZpsSuggestionLimit, + flag_descriptions::kOmniboxZpsSuggestionLimitDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + omnibox_feature_configs::OmniboxZpsSuggestionLimit:: + kOmniboxZpsSuggestionLimit, + kOmniboxZpsSuggestionLimitVariations, + "OmniboxZpsSuggestionLimit")}, + + {"omnibox-enterprise-search-aggregator", + flag_descriptions::kOmniboxSearchAggregatorName, + flag_descriptions::kOmniboxSearchAggregatorDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + omnibox_feature_configs::SearchAggregatorProvider:: + kSearchAggregatorProvider, + kOmniboxSearchAggregatorVariations, + "SearchAggregatorProvider")}, + + {"omnibox-adjust-indentation", + flag_descriptions::kOmniboxAdjustIndentationName, + flag_descriptions::kOmniboxAdjustIndentationDescription, kOsDesktop, + FEATURE_VALUE_TYPE( + omnibox_feature_configs::AdjustOmniboxIndent::kAdjustOmniboxIndent)}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || + // BUILDFLAG(IS_WIN) + +#if BUILDFLAG(IS_ANDROID) + {"animate-suggestions-list-appearance", + flag_descriptions::kAnimateSuggestionsListAppearanceName, + flag_descriptions::kAnimateSuggestionsListAppearanceDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(omnibox::kAnimateSuggestionsListAppearance)}, + + {"omnibox-answer-actions", flag_descriptions::kOmniboxAnswerActionsName, + flag_descriptions::kOmniboxAnswerActionsDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kOmniboxAnswerActions, + kOmniboxAnswerActionsVariants, + "OmniboxBundledExperimentV1")}, + + {"omnibox-asynchronous-view-inflation", + flag_descriptions::kOmniboxAsyncViewInflationName, + flag_descriptions::kOmniboxAsyncViewInflationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(omnibox::kOmniboxAsyncViewInflation)}, + + {"omnibox-multiline-edit-field", + flag_descriptions::kOmniboxMultilineEditFieldName, + flag_descriptions::kOmniboxMultilineEditFieldDescription, kOsAndroid, + FEATURE_VALUE_TYPE(omnibox::kMultilineEditField)}, + + {"omnibox-multimodal-input", flag_descriptions::kOmniboxMultimodalInputName, + flag_descriptions::kOmniboxMultimodalInputDescription, kOsAndroid, + FEATURE_VALUE_TYPE(omnibox::kOmniboxMultimodalInput)}, + + {"omnibox-site-search", flag_descriptions::kOmniboxSiteSearchName, + flag_descriptions::kOmniboxSiteSearchDescription, kOsAndroid, + FEATURE_VALUE_TYPE(omnibox::kOmniboxSiteSearch)}, + + {"omnibox-diagnostics", flag_descriptions::kOmniboxDiagnosticsName, + flag_descriptions::kOmniboxDiagnosticsDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kDiagnostics, + kOmniboxDiagnosticsAndroidVaiants, + "Diagnostics")}, + + {"omnibox-mobile-parity-update-v2", + flag_descriptions::kOmniboxMobileParityUpdateV2Name, + flag_descriptions::kOmniboxMobileParityUpdateV2Description, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kOmniboxMobileParityUpdateV2, + kOmniboxMobileParityV2Variants, + "OmniboxMobileParityUpdateV2")}, + +#endif // BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_WIN) + {"omnibox-on-device-head-suggestions", + flag_descriptions::kOmniboxOnDeviceHeadSuggestionsName, + flag_descriptions::kOmniboxOnDeviceHeadSuggestionsDescription, kOsWin, + FEATURE_VALUE_TYPE(omnibox::kOnDeviceHeadProviderNonIncognito)}, + {"omnibox-on-device-head-suggestions-incognito", + flag_descriptions::kOmniboxOnDeviceHeadSuggestionsIncognitoName, + flag_descriptions::kOmniboxOnDeviceHeadSuggestionsIncognitoDescription, + kOsWin, FEATURE_VALUE_TYPE(omnibox::kOnDeviceHeadProviderIncognito)}, +#endif // BUILDFLAG(IS_WIN) + + {"omnibox-on-device-tail-suggestions", + flag_descriptions::kOmniboxOnDeviceTailSuggestionsName, + flag_descriptions::kOmniboxOnDeviceTailSuggestionsDescription, kOsAll, + FEATURE_VALUE_TYPE(omnibox::kOnDeviceTailModel)}, + + {"omnibox-restore-invisible-focus-only", + flag_descriptions::kOmniboxRestoreInvisibleFocusOnlyName, + flag_descriptions::kOmniboxRestoreInvisibleFocusOnlyDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(omnibox::kOmniboxRestoreInvisibleFocusOnly)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"scheduler-configuration", flag_descriptions::kSchedulerConfigurationName, + flag_descriptions::kSchedulerConfigurationDescription, kOsCrOS, + MULTI_VALUE_TYPE(kSchedulerConfigurationChoices)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"enable-command-line-on-non-rooted-devices", + flag_descriptions::kEnableCommandLineOnNonRootedName, + flag_descriptions::kEnableCommandLineOnNoRootedDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kCommandLineOnNonRooted)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"force-color-profile", flag_descriptions::kForceColorProfileName, + flag_descriptions::kForceColorProfileDescription, kOsAll, + MULTI_VALUE_TYPE(kForceColorProfileChoices)}, + + {"forced-colors", flag_descriptions::kForcedColorsName, + flag_descriptions::kForcedColorsDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kForcedColors)}, + + {"hdr-agtm", flag_descriptions::kHdrAgtmName, + flag_descriptions::kHdrAgtmDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kHdrAgtm)}, + + {"memlog", flag_descriptions::kMemlogName, + flag_descriptions::kMemlogDescription, kOsAll, + MULTI_VALUE_TYPE(kMemlogModeChoices)}, + + {"memlog-sampling-rate", flag_descriptions::kMemlogSamplingRateName, + flag_descriptions::kMemlogSamplingRateDescription, kOsAll, + MULTI_VALUE_TYPE(kMemlogSamplingRateChoices)}, + + {"memlog-stack-mode", flag_descriptions::kMemlogStackModeName, + flag_descriptions::kMemlogStackModeDescription, kOsAll, + MULTI_VALUE_TYPE(kMemlogStackModeChoices)}, + + {"omnibox-max-zero-suggest-matches", + flag_descriptions::kOmniboxMaxZeroSuggestMatchesName, + flag_descriptions::kOmniboxMaxZeroSuggestMatchesDescription, + kOsDesktop | kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kMaxZeroSuggestMatches, + kMaxZeroSuggestMatchesVariations, + "OmniboxBundledExperimentV1")}, + + {"omnibox-ui-max-autocomplete-matches", + flag_descriptions::kOmniboxUIMaxAutocompleteMatchesName, + flag_descriptions::kOmniboxUIMaxAutocompleteMatchesDescription, + kOsDesktop | kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + omnibox::kUIExperimentMaxAutocompleteMatches, + kOmniboxUIMaxAutocompleteMatchesVariations, + "OmniboxBundledExperimentV1")}, + + {"omnibox-max-url-matches", flag_descriptions::kOmniboxMaxURLMatchesName, + flag_descriptions::kOmniboxMaxURLMatchesDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kOmniboxMaxURLMatches, + kOmniboxMaxURLMatchesVariations, + "OmniboxMaxURLMatchesVariations")}, + + {"omnibox-mia-zps", flag_descriptions::kOmniboxMiaZps, + flag_descriptions::kOmniboxMiaZpsDescription, kOsAll, +#if BUILDFLAG(IS_ANDROID) + FEATURE_WITH_PARAMS_VALUE_TYPE( + omnibox_feature_configs::MiaZPS::kOmniboxMiaZPS, + kOmniboxMiaZpsVariations, + "OmniboxMiaZpsVariations") +#else + FEATURE_VALUE_TYPE(omnibox_feature_configs::MiaZPS::kOmniboxMiaZPS) +#endif + }, + + {"omnibox-aim-shortcut-typed-state", + flag_descriptions::kOmniboxAimShortcutTypedStateName, + flag_descriptions::kOmniboxAimShortcutTypedStateDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kOmniboxAimShortcutTypedState, + kOmniboxAimShortcutTypedStateVariations, + "OmniboxAimShortcutTypedState")}, + + {"omnibox-dynamic-max-autocomplete", + flag_descriptions::kOmniboxDynamicMaxAutocompleteName, + flag_descriptions::kOmniboxDynamicMaxAutocompleteDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kDynamicMaxAutocomplete, + kOmniboxDynamicMaxAutocompleteVariations, + "OmniboxBundledExperimentV1")}, + + {"omnibox-grouping-framework-non-zps", + flag_descriptions::kOmniboxGroupingFrameworkNonZPSName, + flag_descriptions::kOmniboxGroupingFrameworkDescription, kOsAll, + FEATURE_VALUE_TYPE(omnibox::kGroupingFrameworkForNonZPS)}, + + {"omnibox-calc-provider", flag_descriptions::kOmniboxCalcProviderName, + flag_descriptions::kOmniboxCalcProviderDescription, kOsAll, + FEATURE_VALUE_TYPE(omnibox_feature_configs::CalcProvider::kCalcProvider)}, + + {"optimization-guide-debug-logs", + flag_descriptions::kOptimizationGuideDebugLogsName, + flag_descriptions::kOptimizationGuideDebugLogsDescription, kOsAll, + SINGLE_VALUE_TYPE(optimization_guide::switches::kDebugLoggingEnabled)}, + + {"optimization-guide-model-execution", + flag_descriptions::kOptimizationGuideModelExecutionName, + flag_descriptions::kOptimizationGuideModelExecutionDescription, kOsDesktop, + FEATURE_VALUE_TYPE( + optimization_guide::features::kOptimizationGuideModelExecution)}, + + {"optimization-guide-on-device-model", + flag_descriptions::kOptimizationGuideOnDeviceModelName, + flag_descriptions::kOptimizationGuideOnDeviceModelDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + optimization_guide::features::kOnDeviceModelPerformanceParams, + kOptimizationGuideOnDeviceModelVariations, + "OptimizationGuideOnDeviceModel")}, + + {"text-safety-classifier", flag_descriptions::kTextSafetyClassifierName, + flag_descriptions::kTextSafetyClassifierDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + optimization_guide::features::kTextSafetyClassifier, + kTextSafetyClassifierVariations, + "TextSafetyClassifier")}, + + {"organic-repeatable-queries", + flag_descriptions::kOrganicRepeatableQueriesName, + flag_descriptions::kOrganicRepeatableQueriesDescription, + kOsDesktop | kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(history::kOrganicRepeatableQueries, + kOrganicRepeatableQueriesVariations, + "OrganicRepeatableQueries")}, + + {"omnibox-num-ntp-zps-recent-searches", + flag_descriptions::kOmniboxNumNtpZpsRecentSearchesName, + flag_descriptions::kOmniboxNumNtpZpsRecentSearchesDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kNumNtpZpsRecentSearches, + kNumNtpZpsRecentSearches, + "PowerTools")}, + {"omnibox-num-ntp-zps-trending-searches", + flag_descriptions::kOmniboxNumNtpZpsTrendingSearchesName, + flag_descriptions::kOmniboxNumNtpZpsTrendingSearchesDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kNumNtpZpsTrendingSearches, + kNumNtpZpsTrendingSearches, + "PowerTools")}, + {"omnibox-num-web-zps-recent-searches", + flag_descriptions::kOmniboxNumWebZpsRecentSearchesName, + flag_descriptions::kOmniboxNumWebZpsRecentSearchesDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kNumWebZpsRecentSearches, + kNumWebZpsRecentSearches, + "PowerTools")}, + {"omnibox-num-web-zps-related-searches", + flag_descriptions::kOmniboxNumWebZpsRelatedSearchesName, + flag_descriptions::kOmniboxNumWebZpsRelatedSearchesDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kNumWebZpsRelatedSearches, + kNumWebZpsRelatedSearches, + "PowerTools")}, + {"omnibox-num-web-zps-most-visited-urls", + flag_descriptions::kOmniboxNumWebZpsMostVisitedUrlsName, + flag_descriptions::kOmniboxNumWebZpsMostVisitedUrlsDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kNumWebZpsMostVisitedUrls, + kNumWebZpsMostVisitedUrls, + "PowerTools")}, + {"omnibox-num-srp-zps-recent-searches", + flag_descriptions::kOmniboxNumSrpZpsRecentSearchesName, + flag_descriptions::kOmniboxNumSrpZpsRecentSearchesDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kNumSrpZpsRecentSearches, + kNumSrpZpsRecentSearches, + "PowerTools")}, + {"omnibox-num-srp-zps-related-searches", + flag_descriptions::kOmniboxNumSrpZpsRelatedSearchesName, + flag_descriptions::kOmniboxNumSrpZpsRelatedSearchesDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kNumSrpZpsRelatedSearches, + kNumSrpZpsRelatedSearches, + "PowerTools")}, +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \ + BUILDFLAG(IS_WIN) + {"history-embeddings", flag_descriptions::kHistoryEmbeddingsName, + flag_descriptions::kHistoryEmbeddingsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(history_embeddings::kHistoryEmbeddings)}, + {"history-embeddings-answers", + flag_descriptions::kHistoryEmbeddingsAnswersName, + flag_descriptions::kHistoryEmbeddingsAnswersDescription, kOsDesktop, + FEATURE_VALUE_TYPE(history_embeddings::kHistoryEmbeddingsAnswers)}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || + // BUILDFLAG(IS_WIN) + + {"history-journeys", flag_descriptions::kJourneysName, + flag_descriptions::kJourneysDescription, kOsDesktop | kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(history_clusters::internal::kJourneys, + kJourneysVariations, + "HistoryJourneys")}, + + {"extract-related-searches-from-prefetched-zps-response", + flag_descriptions::kExtractRelatedSearchesFromPrefetchedZPSResponseName, + flag_descriptions:: + kExtractRelatedSearchesFromPrefetchedZPSResponseDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(page_content_annotations::features:: + kExtractRelatedSearchesFromPrefetchedZPSResponse)}, + + {"page-image-service-optimization-guide-salient-images", + flag_descriptions::kPageImageServiceOptimizationGuideSalientImagesName, + flag_descriptions:: + kPageImageServiceOptimizationGuideSalientImagesDescription, + kOsDesktop | kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + page_image_service::kImageServiceOptimizationGuideSalientImages, + kImageServiceOptimizationGuideSalientImagesVariations, + "PageImageService")}, + + {"page-image-service-suggest-powered-images", + flag_descriptions::kPageImageServiceSuggestPoweredImagesName, + flag_descriptions::kPageImageServiceSuggestPoweredImagesDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(page_image_service::kImageServiceSuggestPoweredImages)}, + + {"page-content-annotations", flag_descriptions::kPageContentAnnotationsName, + flag_descriptions::kPageContentAnnotationsDescription, + kOsDesktop | kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + page_content_annotations::features::kPageContentAnnotations, + kPageContentAnnotationsVariations, + "PageContentAnnotations")}, + + {"page-content-annotations-persist-salient-image-metadata", + flag_descriptions::kPageContentAnnotationsPersistSalientImageMetadataName, + flag_descriptions:: + kPageContentAnnotationsPersistSalientImageMetadataDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + page_content_annotations::features:: + kPageContentAnnotationsPersistSalientImageMetadata)}, + + {"page-content-annotations-remote-page-metadata", + flag_descriptions::kPageContentAnnotationsRemotePageMetadataName, + flag_descriptions::kPageContentAnnotationsRemotePageMetadataDescription, + kOsDesktop | kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + page_content_annotations::features::kRemotePageMetadata, + kRemotePageMetadataVariations, + "RemotePageMetadata")}, + + {"page-visibility-page-content-annotations", + flag_descriptions::kPageVisibilityPageContentAnnotationsName, + flag_descriptions::kPageVisibilityPageContentAnnotationsDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(page_content_annotations::features:: + kPageVisibilityPageContentAnnotations)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"language-packs-in-settings", + flag_descriptions::kLanguagePacksInSettingsName, + flag_descriptions::kLanguagePacksInSettingsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kLanguagePacksInSettings)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"mbi-mode", flag_descriptions::kMBIModeName, + flag_descriptions::kMBIModeDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kMBIMode, + kMBIModeVariations, + "MBIMode")}, + +#if !BUILDFLAG(IS_ANDROID) + {flag_descriptions::kScrollableTabStripFlagId, + flag_descriptions::kScrollableTabStripName, + flag_descriptions::kScrollableTabStripDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(tabs::kScrollableTabStrip, + kTabScrollingVariations, + "TabScrolling")}, +#endif + {flag_descriptions::kTabScrollingButtonPositionFlagId, + flag_descriptions::kTabScrollingButtonPositionName, + flag_descriptions::kTabScrollingButtonPositionDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kTabScrollingButtonPosition, + kTabScrollingButtonPositionVariations, + "TabScrollingButtonPosition")}, + +#if !BUILDFLAG(IS_ANDROID) + {flag_descriptions::kScrollableTabStripWithDraggingFlagId, + flag_descriptions::kScrollableTabStripWithDraggingName, + flag_descriptions::kScrollableTabStripWithDraggingDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(tabs::kScrollableTabStripWithDragging, + kTabScrollingWithDraggingVariations, + "TabScrollingWithDragging")}, + + {"tabsearch-toolbar-button", + flag_descriptions::kLaunchedTabSearchToolbarName, + flag_descriptions::kLaunchedTabSearchToolbarDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kLaunchedTabSearchToolbarButton)}, + + {flag_descriptions::kTabstripComboButtonFlagId, + flag_descriptions::kTabstripComboButtonName, + flag_descriptions::kTabstripComboButtonDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kTabstripComboButton, + kTabstripComboButtonVariations, + "TabstripComboButton")}, + + {flag_descriptions::kScrollableTabStripOverflowFlagId, + flag_descriptions::kScrollableTabStripOverflowName, + flag_descriptions::kScrollableTabStripOverflowDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(tabs::kScrollableTabStripOverflow, + kScrollableTabStripOverflowVariations, + "ScrollableTabStripOverflow")}, + + {"split-tabstrip", flag_descriptions::kSplitTabStripName, + flag_descriptions::kSplitTabStripDescription, kOsDesktop, + FEATURE_VALUE_TYPE(tabs::kSplitTabStrip)}, +#endif + +#if BUILDFLAG(IS_ANDROID) + {"tab-storage-sqlite-prototype", + flag_descriptions::kTabStorageSqlitePrototypeName, + flag_descriptions::kTabStorageSqlitePrototypeDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabStorageSqlitePrototype)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {flag_descriptions::kSidePanelResizingFlagId, + flag_descriptions::kSidePanelResizingName, + flag_descriptions::kSidePanelResizingDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kSidePanelResizing)}, + + {"by-date-history-in-side-panel", + flag_descriptions::kByDateHistoryInSidePanelName, + flag_descriptions::kByDateHistoryInSidePanelDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kByDateHistoryInSidePanel)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"enable-share-custom-actions-in-cct", + flag_descriptions::kShareCustomActionsInCCTName, + flag_descriptions::kShareCustomActionsInCCTDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kShareCustomActionsInCCT)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"product-specifications", + commerce::flag_descriptions::kProductSpecificationsName, + commerce::flag_descriptions::kProductSpecificationsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(commerce::kProductSpecifications)}, + + {"compare-confirmation-toast", + commerce::flag_descriptions::kCompareConfirmationToastName, + commerce::flag_descriptions::kCompareConfirmationToastDescription, + kOsDesktop, FEATURE_VALUE_TYPE(commerce::kCompareConfirmationToast)}, + + {"shopping-list", commerce::flag_descriptions::kShoppingListName, + commerce::flag_descriptions::kShoppingListDescription, + kOsAndroid | kOsDesktop, FEATURE_VALUE_TYPE(commerce::kShoppingList)}, + + {"shopping-alternate-server", + commerce::flag_descriptions::kShoppingAlternateServerName, + commerce::flag_descriptions::kShoppingAlternateServerDescription, + kOsAndroid | kOsDesktop, + FEATURE_VALUE_TYPE(commerce::kShoppingAlternateServer)}, + + {"price-tracking-subscription-service-locale-key", + commerce::flag_descriptions:: + kPriceTrackingSubscriptionServiceLocaleKeyName, + commerce::flag_descriptions:: + kPriceTrackingSubscriptionServiceLocaleKeyDescription, + kOsAndroid | kOsDesktop, + FEATURE_VALUE_TYPE(commerce::kPriceTrackingSubscriptionServiceLocaleKey)}, + + {"price-tracking-subscription-service-product-version", + commerce::flag_descriptions:: + kPriceTrackingSubscriptionServiceProductVersionName, + commerce::flag_descriptions:: + kPriceTrackingSubscriptionServiceProductVersionDescription, + kOsAndroid | kOsDesktop, + FEATURE_VALUE_TYPE( + commerce::kPriceTrackingSubscriptionServiceProductVersion)}, + +#if BUILDFLAG(IS_ANDROID) + {"track-by-default-mobile", + commerce::flag_descriptions::kTrackByDefaultOnMobileName, + commerce::flag_descriptions::kTrackByDefaultOnMobileDescription, + kOsAndroid, FEATURE_VALUE_TYPE(commerce::kTrackByDefaultOnMobile)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"ntp-alpha-background-collections", + flag_descriptions::kNtpAlphaBackgroundCollectionsName, + flag_descriptions::kNtpAlphaBackgroundCollectionsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpAlphaBackgroundCollections)}, + + {"ntp-background-image-error-detection", + flag_descriptions::kNtpBackgroundImageErrorDetectionName, + flag_descriptions::kNtpBackgroundImageErrorDetectionDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpBackgroundImageErrorDetection)}, + + {"ntp-calendar-module", flag_descriptions::kNtpCalendarModuleName, + flag_descriptions::kNtpCalendarModuleDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_features::kNtpCalendarModule, + kNtpCalendarModuleVariations, + "DesktopNtpModules")}, + + {"ntp-compose-entrypoint", + flag_descriptions::kNtpSearchboxComposeEntrypointName, + flag_descriptions::kNtpSearchboxComposeEntrypointDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_composebox::kNtpSearchboxComposeEntrypoint)}, + + {"ntp-composebox", flag_descriptions::kNtpComposeboxName, + flag_descriptions::kNtpComposeboxDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_composebox::kNtpComposebox, + kNtpComposeboxVariations, + "NtpComposebox")}, + + {"composebox-uses-chrome-compose-client", + flag_descriptions::kNtpComposeboxUsesChromeComposeClientName, + flag_descriptions::kNtpComposeboxUsesChromeComposeClientDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(omnibox::kComposeboxUsesChromeComposeClient)}, + + {"ntp-drive-module", flag_descriptions::kNtpDriveModuleName, + flag_descriptions::kNtpDriveModuleDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_features::kNtpDriveModule, + kNtpDriveModuleVariations, + "DesktopNtpModules")}, + + {"ntp-drive-module-no-sync-requirement", + flag_descriptions::kNtpDriveModuleHistorySyncRequirementName, + flag_descriptions::kNtpDriveModuleHistorySyncRequirementDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpDriveModuleHistorySyncRequirement)}, + + {"ntp-drive-module-segmentation", + flag_descriptions::kNtpDriveModuleSegmentationName, + flag_descriptions::kNtpDriveModuleSegmentationDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpDriveModuleSegmentation)}, + + {"ntp-drive-module-show-six-files", + flag_descriptions::kNtpDriveModuleShowSixFilesName, + flag_descriptions::kNtpDriveModuleShowSixFilesDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpDriveModuleShowSixFiles)}, + +#if !defined(OFFICIAL_BUILD) + {"ntp-dummy-modules", flag_descriptions::kNtpDummyModulesName, + flag_descriptions::kNtpDummyModulesDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpDummyModules)}, +#endif + + {"ntp-footer", flag_descriptions::kNtpFooterName, + flag_descriptions::kNtpFooterDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpFooter)}, + + {"ntp-middle-slot-promo-dismissal", + flag_descriptions::kNtpMiddleSlotPromoDismissalName, + flag_descriptions::kNtpMiddleSlotPromoDismissalDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_features::kNtpMiddleSlotPromoDismissal, + kNtpMiddleSlotPromoDismissalVariations, + "DesktopNtpModules")}, + + {"ntp-mobile-promo", flag_descriptions::kNtpMobilePromoName, + flag_descriptions::kNtpMobilePromoName, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpMobilePromo)}, + + {"force-ntp-mobile-promo", flag_descriptions::kForceNtpMobilePromoName, + flag_descriptions::kForceNtpMobilePromoName, kOsDesktop, + SINGLE_VALUE_TYPE(switches::kForceNtpMobilePromo)}, + + {"ntp-module-sign-in-requirement", + flag_descriptions::kNtpModuleSignInRequirementName, + flag_descriptions::kNtpModuleSignInRequirementDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpModuleSignInRequirement)}, + + {"ntp-modules-drag-and-drop", flag_descriptions::kNtpModulesDragAndDropName, + flag_descriptions::kNtpModulesDragAndDropDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpModulesDragAndDrop)}, + + {"ntp-most-relevant-tab-resumption-module", + flag_descriptions::kNtpMostRelevantTabResumptionModuleName, + flag_descriptions::kNtpMostRelevantTabResumptionModuleDescription, + kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + ntp_features::kNtpMostRelevantTabResumptionModule, + kNtpMostRelevantTabResumptionModuleVariations, + "NtpMostRelevantTabResumptionModules")}, + + {"ntp-most-relevant-tab-resumption-module-fallback-to-host", + flag_descriptions::kNtpMostRelevantTabResumptionModuleFallbackToHostName, + flag_descriptions:: + kNtpMostRelevantTabResumptionModuleFallbackToHostDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + ntp_features::kNtpMostRelevantTabResumptionModuleFallbackToHost)}, + + {"ntp-ogb-async-bar-parts", + flag_descriptions::kNtpOneGoogleBarAsyncBarPartsName, + flag_descriptions::kNtpOneGoogleBarAsyncBarPartsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpOneGoogleBarAsyncBarParts)}, + + {"ntp-outlook-calendar-module", + flag_descriptions::kNtpOutlookCalendarModuleName, + flag_descriptions::kNtpOutlookCalendarModuleDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_features::kNtpOutlookCalendarModule, + kNtpOutlookCalendarModuleVariations, + "DesktopNtpModules")}, + + {"ntp-realbox-contextual-and-trending-suggestions", + flag_descriptions::kNtpRealboxContextualAndTrendingSuggestionsName, + flag_descriptions::kNtpRealboxContextualAndTrendingSuggestionsDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + omnibox_feature_configs::RealboxContextualAndTrendingSuggestions:: + kRealboxContextualAndTrendingSuggestions)}, + + {"ntp-realbox-cr23-theming", flag_descriptions::kNtpRealboxCr23ThemingName, + flag_descriptions::kNtpRealboxCr23ThemingDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_features::kRealboxCr23Theming, + kNtpRealboxCr23ThemingVariations, + "NtpRealboxCr23Theming")}, + + {"ntp-realbox-match-searchbox-theme", + flag_descriptions::kNtpRealboxMatchSearchboxThemeName, + flag_descriptions::kNtpRealboxMatchSearchboxThemeDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kRealboxMatchSearchboxTheme)}, + + {"ntp-realbox-use-google-g-icon", + flag_descriptions::kNtpRealboxUseGoogleGIconName, + flag_descriptions::kNtpRealboxUseGoogleGIconDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kRealboxUseGoogleGIcon)}, + + {"ntp-safe-browsing-module", flag_descriptions::kNtpSafeBrowsingModuleName, + flag_descriptions::kNtpSafeBrowsingModuleDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_features::kNtpSafeBrowsingModule, + kNtpSafeBrowsingModuleVariations, + "DesktopNtpModules")}, + + {"ntp-sharepoint-module", flag_descriptions::kNtpSharepointModuleName, + flag_descriptions::kNtpSharepointModuleDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_features::kNtpSharepointModule, + kNtpSharepointModuleVariations, + "DesktopNtpModules")}, + + {"ntp-tab-groups-module", flag_descriptions::kNtpTabGroupsModuleName, + flag_descriptions::kNtpTabGroupsModuleDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_features::kNtpTabGroupsModule, + kNtpTabGroupsModuleVariations, + "DesktopNtpModules")}, + + {"ntp-tab-groups-module-zero-state", + flag_descriptions::kNtpTabGroupsModuleZeroStateName, + flag_descriptions::kNtpTabGroupsModuleZeroStateDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpTabGroupsModuleZeroState)}, + + {"ntp-wallpaper-search-button", + flag_descriptions::kNtpWallpaperSearchButtonName, + flag_descriptions::kNtpWallpaperSearchButtonDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpWallpaperSearchButton)}, + + {"ntp-wallpaper-search-button-animation", + flag_descriptions::kNtpWallpaperSearchButtonAnimationName, + flag_descriptions::kNtpWallpaperSearchButtonAnimationDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpWallpaperSearchButtonAnimation)}, + + {"ntp-microsoft-authentication-module", + flag_descriptions::kNtpMicrosoftAuthenticationModuleName, + flag_descriptions::kNtpMicrosoftAuthenticationModuleDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kNtpMicrosoftAuthenticationModule)}, + +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION) + {"chrome-wide-echo-cancellation", + flag_descriptions::kChromeWideEchoCancellationName, + flag_descriptions::kChromeWideEchoCancellationDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(media::kChromeWideEchoCancellation)}, +#endif // BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION) + +#if BUILDFLAG(DCHECK_IS_CONFIGURABLE) + {"dcheck-is-fatal", flag_descriptions::kDcheckIsFatalName, + flag_descriptions::kDcheckIsFatalDescription, kOsWin, + FEATURE_VALUE_TYPE(base::kDCheckIsFatalFeature)}, +#endif // BUILDFLAG(DCHECK_IS_CONFIGURABLE) + + {"enable-pixel-canvas-recording", + flag_descriptions::kEnablePixelCanvasRecordingName, + flag_descriptions::kEnablePixelCanvasRecordingDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kEnablePixelCanvasRecording)}, + + {"enable-parallel-downloading", flag_descriptions::kParallelDownloadingName, + flag_descriptions::kParallelDownloadingDescription, kOsAll, + FEATURE_VALUE_TYPE(download::features::kParallelDownloading)}, + + {"download-notification-service-unified-api", + flag_descriptions::kDownloadNotificationServiceUnifiedAPIName, + flag_descriptions::kDownloadNotificationServiceUnifiedAPIDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + download::features::kDownloadNotificationServiceUnifiedAPI)}, + +#if !BUILDFLAG(IS_ANDROID) + {flag_descriptions::kTabSearchPositionSettingId, + flag_descriptions::kTabSearchPositionSettingName, + flag_descriptions::kTabSearchPositionSettingDescription, + kOsCrOS | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(tabs::kTabSearchPositionSetting)}, +#endif + + {"enable-network-logging-to-file", + flag_descriptions::kEnableNetworkLoggingToFileName, + flag_descriptions::kEnableNetworkLoggingToFileDescription, kOsAll, + SINGLE_VALUE_TYPE(network::switches::kLogNetLog)}, + +#if !BUILDFLAG(IS_ANDROID) + {"web-authentication-permit-enterprise-attestation", + flag_descriptions::kWebAuthenticationPermitEnterpriseAttestationName, + flag_descriptions:: + kWebAuthenticationPermitEnterpriseAttestationDescription, + kOsAll, + ORIGIN_LIST_VALUE_TYPE( + webauthn::switches::kPermitEnterpriseAttestationOriginList, + "")}, +#endif + + { + "zero-copy-tab-capture", + flag_descriptions::kEnableZeroCopyTabCaptureName, + flag_descriptions::kEnableZeroCopyTabCaptureDescription, + kOsMac | kOsWin | kOsCrOS, + FEATURE_VALUE_TYPE(blink::features::kZeroCopyTabCapture), + }, + +#if BUILDFLAG(ENABLE_PDF) + {"accessible-pdf-form", flag_descriptions::kAccessiblePDFFormName, + flag_descriptions::kAccessiblePDFFormDescription, kOsDesktop, + FEATURE_VALUE_TYPE(chrome_pdf::features::kAccessiblePDFForm)}, + + {"pdf-oopif", flag_descriptions::kPdfOopifName, + flag_descriptions::kPdfOopifDescription, kOsDesktop, + FEATURE_VALUE_TYPE(chrome_pdf::features::kPdfOopif)}, + + {"pdf-portfolio", flag_descriptions::kPdfPortfolioName, + flag_descriptions::kPdfPortfolioDescription, kOsDesktop, + FEATURE_VALUE_TYPE(chrome_pdf::features::kPdfPortfolio)}, + + {"pdf-use-skia-renderer", flag_descriptions::kPdfUseSkiaRendererName, + flag_descriptions::kPdfUseSkiaRendererDescription, kOsDesktop, + FEATURE_VALUE_TYPE(chrome_pdf::features::kPdfUseSkiaRenderer)}, + +#if BUILDFLAG(ENABLE_PDF_INK2) + {"pdf-ink2", flag_descriptions::kPdfInk2Name, + flag_descriptions::kPdfInk2Description, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome_pdf::features::kPdfInk2, + kPdfInk2Variations, + "PdfInk2")}, +#endif // BUILDFLAG(ENABLE_PDF_INK2) + +#if BUILDFLAG(ENABLE_PDF_SAVE_TO_DRIVE) + {"pdf-save-to-drive", flag_descriptions::kPdfSaveToDriveName, + flag_descriptions::kPdfSaveToDriveDescription, kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(chrome_pdf::features::kPdfSaveToDrive)}, +#endif // BUILDFLAG(ENABLE_PDF_SAVE_TO_DRIVE) + +#endif // BUILDFLAG(ENABLE_PDF) + +#if BUILDFLAG(ENABLE_PRINTING) +#if BUILDFLAG(IS_CHROMEOS) + {"add-printer-via-printscanmgr", + flag_descriptions::kAddPrinterViaPrintscanmgrName, + flag_descriptions::kAddPrinterViaPrintscanmgrDescription, kOsCrOS, + FEATURE_VALUE_TYPE(printing::features::kAddPrinterViaPrintscanmgr)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_LINUX) + {"cups-ipp-printing-backend", + flag_descriptions::kCupsIppPrintingBackendName, + flag_descriptions::kCupsIppPrintingBackendDescription, kOsDesktop, + FEATURE_VALUE_TYPE(printing::features::kCupsIppPrintingBackend)}, +#endif // BUILDFLAG(IS_LINUX) + +#if BUILDFLAG(IS_WIN) + {"print-with-postscript-type42-fonts", + flag_descriptions::kPrintWithPostScriptType42FontsName, + flag_descriptions::kPrintWithPostScriptType42FontsDescription, kOsWin, + FEATURE_VALUE_TYPE(printing::features::kPrintWithPostScriptType42Fonts)}, + + {"print-with-reduced-rasterization", + flag_descriptions::kPrintWithReducedRasterizationName, + flag_descriptions::kPrintWithReducedRasterizationDescription, kOsWin, + FEATURE_VALUE_TYPE(printing::features::kPrintWithReducedRasterization)}, + + {"read-printer-capabilities-with-xps", + flag_descriptions::kReadPrinterCapabilitiesWithXpsName, + flag_descriptions::kReadPrinterCapabilitiesWithXpsDescription, kOsWin, + FEATURE_VALUE_TYPE(printing::features::kReadPrinterCapabilitiesWithXps)}, + + {"use-xps-for-printing", flag_descriptions::kUseXpsForPrintingName, + flag_descriptions::kUseXpsForPrintingDescription, kOsWin, + FEATURE_VALUE_TYPE(printing::features::kUseXpsForPrinting)}, + + {"use-xps-for-printing-from-pdf", + flag_descriptions::kUseXpsForPrintingFromPdfName, + flag_descriptions::kUseXpsForPrintingFromPdfDescription, kOsWin, + FEATURE_VALUE_TYPE(printing::features::kUseXpsForPrintingFromPdf)}, +#endif // BUILDFLAG(IS_WIN) +#endif // BUILDFLAG(ENABLE_PRINTING) + +#if BUILDFLAG(IS_WIN) + {"enable-windows-gaming-input-data-fetcher", + flag_descriptions::kEnableWindowsGamingInputDataFetcherName, + flag_descriptions::kEnableWindowsGamingInputDataFetcherDescription, kOsWin, + FEATURE_VALUE_TYPE(features::kEnableWindowsGamingInputDataFetcher)}, + + {"windows11-mica-titlebar", flag_descriptions::kWindows11MicaTitlebarName, + flag_descriptions::kWindows11MicaTitlebarDescription, kOsWin, + FEATURE_VALUE_TYPE(kWindows11MicaTitlebar)}, +#endif + +#if BUILDFLAG(IS_ANDROID) + {"enable-navigation-capture-refactor-android", + flag_descriptions::kNavigationCaptureRefactorAndroidName, + flag_descriptions::kNavigationCaptureRefactorAndroidDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(external_intents::kNavigationCaptureRefactorAndroid)}, + + {"enable-auxiliary-navigation-stays-in-browser", + flag_descriptions::kAuxiliaryNavigationStaysInBrowserName, + flag_descriptions::kAuxiliaryNavigationStaysInBrowserDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + external_intents::kAuxiliaryNavigationStaysInBrowser, + kAuxiliaryNavigationStaysInBrowserVariations, + "AuxiliaryNavigationStaysInBrowser")}, + + {"enable-auxiliary-navigation-stays-in-PWA", + flag_descriptions::kAuxiliaryNavigationStaysInPWAName, + flag_descriptions::kAuxiliaryNavigationStaysInPWADescription, kOsAndroid, + FEATURE_VALUE_TYPE(external_intents::kAuxiliaryNavigationStaysInPWA)}, + + {"enable-magic-stack-android", flag_descriptions::kMagicStackAndroidName, + flag_descriptions::kMagicStackAndroidDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kMagicStackAndroid, + kMagicStackAndroidVariations, + "MagicStackAndroid")}, + + {"enable-educational-tip-module", + flag_descriptions::kEducationalTipModuleName, + flag_descriptions::kEducationalTipModuleDescription, kOsAndroid, + FEATURE_VALUE_TYPE( + segmentation_platform::features::kEducationalTipModule)}, + + {"enable-educational-tip-default-browser-promo-card", + flag_descriptions::kEducationalTipDefaultBrowserPromoCardName, + flag_descriptions::kEducationalTipDefaultBrowserPromoCardDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kEducationalTipDefaultBrowserPromoCard)}, + + {"enable-reparent-auxiliary-navigation-from-pwa", + flag_descriptions::kReparentAuxiliaryNavigationFromPWAName, + flag_descriptions::kReparentAuxiliaryNavigationFromPWADescription, + kOsAndroid, + FEATURE_VALUE_TYPE(external_intents::kReparentAuxiliaryNavigationFromPWA)}, + + {"enable-reparent-top-level-navigation-from-pwa", + flag_descriptions::kReparentTopLevelNavigationFromPWAName, + flag_descriptions::kReparentTopLevelNavigationFromPWADescription, + kOsAndroid, + FEATURE_VALUE_TYPE(external_intents::kReparentTopLevelNavigationFromPWA)}, + + {"enable-segmentation-platform-ephemeral_card_ranker", + flag_descriptions::kSegmentationPlatformEphemeralCardRankerName, + flag_descriptions::kSegmentationPlatformEphemeralCardRankerDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + segmentation_platform::features:: + kSegmentationPlatformEphemeralCardRanker, + kEphemeralCardRankerCardOverrideOptions, + "EducationalTipModule")}, + + {"maylaunchurl-uses-separate-storage-partition", + flag_descriptions::kMayLaunchUrlUsesSeparateStoragePartitionName, + flag_descriptions::kMayLaunchUrlUsesSeparateStoragePartitionDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kMayLaunchUrlUsesSeparateStoragePartition)}, + + {"mini-origin-bar", flag_descriptions::kMiniOriginBarName, + flag_descriptions::kMiniOriginBarDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kMiniOriginBar)}, + + {"enable-segmentation-platform-android-home-module-ranker-v2", + flag_descriptions::kSegmentationPlatformAndroidHomeModuleRankerV2Name, + flag_descriptions:: + kSegmentationPlatformAndroidHomeModuleRankerV2Description, + kOsAndroid, + FEATURE_VALUE_TYPE(segmentation_platform::features:: + kSegmentationPlatformAndroidHomeModuleRankerV2)}, + + {"search-in-cct", flag_descriptions::kSearchInCCTName, + flag_descriptions::kSearchInCCTDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kSearchInCCT)}, + + {"search-in-cct-alternate-tap-handling", + flag_descriptions::kSearchInCCTAlternateTapHandlingName, + flag_descriptions::kSearchInCCTAlternateTapHandlingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kSearchInCCTAlternateTapHandling)}, + + {"settings-single-activity", flag_descriptions::kSettingsSingleActivityName, + flag_descriptions::kSettingsSingleActivityDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kSettingsSingleActivity)}, + + {"android-settings-containment", + flag_descriptions::kAndroidSettingsContainmentName, + flag_descriptions::kAndroidSettingsContainmentDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidSettingsContainment)}, + + {"enable-search-resumption-module", + flag_descriptions::kSearchResumptionModuleAndroidName, + flag_descriptions::kSearchResumptionModuleAndroidDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + chrome::android::kSearchResumptionModuleAndroid, + kSearchResumptionModuleAndroidVariations, + "kSearchResumptionModuleAndroid")}, + + {"price-insights", commerce::flag_descriptions::kPriceInsightsName, + commerce::flag_descriptions::kPriceInsightsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(commerce::kPriceInsights)}, + + {"enable-start-surface-return-time", + flag_descriptions::kStartSurfaceReturnTimeName, + flag_descriptions::kStartSurfaceReturnTimeDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kStartSurfaceReturnTime, + kStartSurfaceReturnTimeVariations, + "StartSurfaceReturnTime")}, + + {"tab-switcher-drag-drop", flag_descriptions::kTabSwitcherDragDropName, + flag_descriptions::kTabSwitcherDragDropDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabSwitcherDragDropAndroid)}, + + {"tab-archival-drag-drop-android", + flag_descriptions::kTabArchivalDragDropAndroidName, + flag_descriptions::kTabArchivalDragDropAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabArchivalDragDropAndroid)}, + + {"most-visited-tiles-customization", + flag_descriptions::kMostVisitedTilesCustomizationName, + flag_descriptions::kMostVisitedTilesCustomizationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kMostVisitedTilesCustomization)}, + + {"enable-most-visited-tiles-reselect", + flag_descriptions::kMostVisitedTilesReselectName, + flag_descriptions::kMostVisitedTilesReselectDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kMostVisitedTilesReselect, + kMostVisitedTilesReselectVariations, + "kMostVisitedTilesReselect")}, + + {"show-new-tab-animations", flag_descriptions::kShowNewTabAnimationsName, + flag_descriptions::kShowNewTabAnimationsDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kShowNewTabAnimations, + kShowNewTabAnimationsVariations, + "ShowNewTabAnimations")}, + + {"global-cache-list-for-gating-notification-protections", + flag_descriptions::kGlobalCacheListForGatingNotificationProtectionsName, + flag_descriptions:: + kGlobalCacheListForGatingNotificationProtectionsDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + safe_browsing::kGlobalCacheListForGatingNotificationProtections)}, + + {"enable-annotated-page-contents-for-virtual-structure", + flag_descriptions::kAnnotatedPageContentsForVirtualStructureName, + flag_descriptions::kAnnotatedPageContentsForVirtualStructureDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kAnnotatedPageContentsVirtualStructure)}, + +#endif // BUILDFLAG(IS_ANDROID) + + {"report-notification-content-detection-data", + flag_descriptions::kReportNotificationContentDetectionDataName, + flag_descriptions::kReportNotificationContentDetectionDataDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + safe_browsing::kReportNotificationContentDetectionData, + kReportNotificationContentDetectionDataVariations, + "ReportNotificationContentDetectionData")}, + + {"show-warnings-for-suspicious-notifications", + flag_descriptions::kShowWarningsForSuspiciousNotificationsName, + flag_descriptions::kShowWarningsForSuspiciousNotificationsDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + safe_browsing::kShowWarningsForSuspiciousNotifications, + kShowWarningsForSuspiciousNotificationsVariations, + "ShowWarningsForSuspiciousNotifications")}, + + {"unsafely-treat-insecure-origin-as-secure", + flag_descriptions::kTreatInsecureOriginAsSecureName, + flag_descriptions::kTreatInsecureOriginAsSecureDescription, kOsAll, + ORIGIN_LIST_VALUE_TYPE( + network::switches::kUnsafelyTreatInsecureOriginAsSecure, + "")}, + + {"disable-process-reuse", flag_descriptions::kDisableProcessReuse, + flag_descriptions::kDisableProcessReuseDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kDisableProcessReuse)}, + + {"subframe-process-reuse-thresholds", + flag_descriptions::kSubframeProcessReuseThresholds, + flag_descriptions::kSubframeProcessReuseThresholdsDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + features::kSubframeProcessReuseThresholds, + kSubframeProcessReuseThresholdsVariations, + "SubframeProcessReuseThresholds" /* trial name */)}, + +#if BUILDFLAG(IS_WIN) + {"stylus-handwriting-win", flag_descriptions::kStylusHandwritingWinName, + flag_descriptions::kStylusHandwritingWinDescription, kOsWin, + FEATURE_VALUE_TYPE(stylus_handwriting::win::kStylusHandwritingWin)}, +#endif // BUILDFLAG(IS_WIN) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-live-caption-multilang", + flag_descriptions::kEnableLiveCaptionMultilangName, + flag_descriptions::kEnableLiveCaptionMultilangDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media::kLiveCaptionMultiLanguage)}, + + {"enable-headless-live-caption", + flag_descriptions::kEnableHeadlessLiveCaptionName, + flag_descriptions::kEnableHeadlessLiveCaptionDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media::kHeadlessLiveCaption)}, + + {"enable-media-link-helpers", + flag_descriptions::kEnableMediaLinkHelpersName, + flag_descriptions::kEnableMediaLinkHelpersDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media::kMediaLinkHelpers)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-chromeos-live-translate", + flag_descriptions::kEnableCrOSLiveTranslateName, + flag_descriptions::kEnableCrOSLiveTranslateDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kLiveTranslate)}, + {"enable-chromeos-soda-languages", + flag_descriptions::kEnableCrOSSodaLanguagesName, + flag_descriptions::kEnableCrOSSodaLanguagesDescription, kOsCrOS, + FEATURE_VALUE_TYPE(speech::kCrosExpandSodaLanguages)}, + {"enable-chromeos-soda-conch", + flag_descriptions::kEnableCrOSSodaConchLanguagesName, + flag_descriptions::kEnableCrOSSodaConchLanguagesDescription, kOsCrOS, + FEATURE_VALUE_TYPE(speech::kCrosSodaConchLanguages)}, +#endif + + {"read-anything-read-aloud", flag_descriptions::kReadAnythingReadAloudName, + flag_descriptions::kReadAnythingReadAloudDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kReadAnythingReadAloud)}, + + {"read-anything-read-aloud-phrase-highlighting", + flag_descriptions::kReadAnythingReadAloudPhraseHighlightingName, + flag_descriptions::kReadAnythingReadAloudPhraseHighlightingDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(features::kReadAnythingReadAloudPhraseHighlighting)}, + + {"read-anything-images-via-algorithm", + flag_descriptions::kReadAnythingImagesViaAlgorithmName, + flag_descriptions::kReadAnythingImagesViaAlgorithmDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kReadAnythingImagesViaAlgorithm)}, + + {"read-anything-docs-integration", + flag_descriptions::kReadAnythingDocsIntegrationName, + flag_descriptions::kReadAnythingDocsIntegrationDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kReadAnythingDocsIntegration)}, + + {"read-anything-docs-load-more-button", + flag_descriptions::kReadAnythingDocsLoadMoreButtonName, + flag_descriptions::kReadAnythingDocsLoadMoreButtonDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kReadAnythingDocsLoadMoreButton)}, + + {"support-tool-screenshot", flag_descriptions::kSupportToolScreenshot, + flag_descriptions::kSupportToolScreenshotDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kSupportToolScreenshot)}, + +#endif // !BUILDFLAG(IS_ANDROID) + + {"enable-auto-disable-accessibility", + flag_descriptions::kEnableAutoDisableAccessibilityName, + flag_descriptions::kEnableAutoDisableAccessibilityDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kAutoDisableAccessibility)}, + + {"image-descriptions-alternative-routing", + flag_descriptions::kImageDescriptionsAlternateRoutingName, + flag_descriptions::kImageDescriptionsAlternateRoutingDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kImageDescriptionsAlternateRouting)}, + +#if BUILDFLAG(IS_ANDROID) + {"app-specific-history", flag_descriptions::kAppSpecificHistoryName, + flag_descriptions::kAppSpecificHistoryDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAppSpecificHistory)}, +#endif + +#if BUILDFLAG(IS_ANDROID) + {"cct-adaptive-button", flag_descriptions::kCCTAdaptiveButtonName, + flag_descriptions::kCCTAdaptiveButtonDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kCCTAdaptiveButton, + kCCTAdaptiveButtonVariations, + "CCTAdaptiveButton")}, + {"cct-adaptive-button-test-switch", + flag_descriptions::kCCTAdaptiveButtonTestSwitchName, + flag_descriptions::kCCTAdaptiveButtonTestSwitchDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + chrome::android::kCCTAdaptiveButtonTestSwitch, + kCCTAdaptiveButtonTestSwitchVariations, + "CCTAdaptiveButtonTestSwitch")}, + {"cct-auth-tab", flag_descriptions::kCCTAuthTabName, + flag_descriptions::kCCTAuthTabDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kCCTAuthTab)}, + {"cct-auth-tab-disable-all-external-intents", + flag_descriptions::kCCTAuthTabDisableAllExternalIntentsName, + flag_descriptions::kCCTAuthTabDisableAllExternalIntentsDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kCCTAuthTabDisableAllExternalIntents)}, + {"cct-auth-tab-enable-https-redirects", + flag_descriptions::kCCTAuthTabEnableHttpsRedirectsName, + flag_descriptions::kCCTAuthTabEnableHttpsRedirectsDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + chrome::android::kCCTAuthTabEnableHttpsRedirects, + kCCTAuthTabEnableHttpsRedirectsVariations, + "CCTAuthTabEnableHttpsRedirectsVariations")}, +#endif + +#if BUILDFLAG(IS_ANDROID) + {"cct-incognito-available-to-third-party", + flag_descriptions::kCCTIncognitoAvailableToThirdPartyName, + flag_descriptions::kCCTIncognitoAvailableToThirdPartyDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kCCTIncognitoAvailableToThirdParty)}, +#endif + +#if BUILDFLAG(IS_ANDROID) + {"cct-contextual-menu-items", + flag_descriptions::kCCTContextualMenuItemsName, + flag_descriptions::kCCTContextualMenuItemsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kCCTContextualMenuItems)}, + {"cct-resizable-for-third-parties", + flag_descriptions::kCCTResizableForThirdPartiesName, + flag_descriptions::kCCTResizableForThirdPartiesDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + chrome::android::kCCTResizableForThirdParties, + kCCTResizableThirdPartiesDefaultPolicyVariations, + "CCTResizableThirdPartiesDefaultPolicy")}, + {"cct-google-bottom-bar", flag_descriptions::kCCTGoogleBottomBarName, + flag_descriptions::kCCTGoogleBottomBarDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kCCTGoogleBottomBar, + kCCTGoogleBottomBarVariations, + "CCTGoogleBottomBarVariations")}, + {"cct-google-bottom-bar-variant-layouts", + flag_descriptions::kCCTGoogleBottomBarVariantLayoutsName, + flag_descriptions::kCCTGoogleBottomBarVariantLayoutsDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + chrome::android::kCCTGoogleBottomBarVariantLayouts, + kCCTGoogleBottomBarVariantLayoutsVariations, + "CCTGoogleBottomBarVariantLayoutsVariations")}, + {"cct-open-in-browser-button-if-allowed-by-embedder", + flag_descriptions::kCCTOpenInBrowserButtonIfAllowedByEmbedderName, + flag_descriptions::kCCTOpenInBrowserButtonIfAllowedByEmbedderDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kCCTOpenInBrowserButtonIfAllowedByEmbedder)}, + {"cct-open-in-browser-button-if-enabled-by-embedder", + flag_descriptions::kCCTOpenInBrowserButtonIfEnabledByEmbedderName, + flag_descriptions::kCCTOpenInBrowserButtonIfEnabledByEmbedderDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kCCTOpenInBrowserButtonIfEnabledByEmbedder)}, + {"cct-navigation-metrics", flag_descriptions::kCCTNavigationMetricsName, + flag_descriptions::kCCTNavigationMetricsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kCCTNavigationMetrics)}, + {"cct-predictive-back-gesture", + flag_descriptions::kCCTPredictiveBackGestureName, + flag_descriptions::kCCTPredictiveBackGestureDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kCCTPredictiveBackGesture)}, + {"cct-revamped-branding", flag_descriptions::kCCTRevampedBrandingName, + flag_descriptions::kCCTRevampedBrandingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kCCTRevampedBranding)}, + {"cct-nested-security-icon", flag_descriptions::kCCTNestedSecurityIconName, + flag_descriptions::kCCTNestedSecurityIconDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kCCTNestedSecurityIcon)}, + {"cct-toolbar-refactor", flag_descriptions::kCCTToolbarRefactorName, + flag_descriptions::kCCTToolbarRefactorDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kCCTToolbarRefactor)}, + {"pcct-minimum-height", flag_descriptions::kPCCTMinimumHeightName, + flag_descriptions::kPCCTMinimumHeightDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kPCCTMinimumHeight)}, +#endif + +#if BUILDFLAG(IS_ANDROID) + {"cct-reset-timeout-enabled", + flag_descriptions::kCCTResetTimeoutEnabledName, + flag_descriptions::kCCTResetTimeoutEnabledDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kCCTResetTimeoutEnabled, + kCCTResetTimeoutVariations, + "CCTResetTimeoutVariations")}, +#endif + +#if BUILDFLAG(IS_CHROMEOS) + {"allow-dsp-based-aec", flag_descriptions::kCrOSDspBasedAecAllowedName, + flag_descriptions::kCrOSDspBasedAecAllowedDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kCrOSDspBasedAecAllowed)}, + {"allow-dsp-based-ns", flag_descriptions::kCrOSDspBasedNsAllowedName, + flag_descriptions::kCrOSDspBasedNsAllowedDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kCrOSDspBasedNsAllowed)}, + {"allow-dsp-based-agc", flag_descriptions::kCrOSDspBasedAgcAllowedName, + flag_descriptions::kCrOSDspBasedAgcAllowedDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kCrOSDspBasedAgcAllowed)}, + {"enforce-mono-audio-capture", + flag_descriptions::kCrOSEnforceMonoAudioCaptureName, + flag_descriptions::kCrOSEnforceMonoAudioCaptureDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kCrOSEnforceMonoAudioCapture)}, + {"enforce-system-aec", flag_descriptions::kCrOSEnforceSystemAecName, + flag_descriptions::kCrOSEnforceSystemAecDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kCrOSEnforceSystemAec)}, + {"enforce-system-aec-agc", flag_descriptions::kCrOSEnforceSystemAecAgcName, + flag_descriptions::kCrOSEnforceSystemAecAgcDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kCrOSEnforceSystemAecAgc)}, + {"enforce-system-aec-ns-agc", + flag_descriptions::kCrOSEnforceSystemAecNsAgcName, + flag_descriptions::kCrOSEnforceSystemAecNsAgcDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kCrOSEnforceSystemAecNsAgc)}, + {"enforce-system-aec-ns", flag_descriptions::kCrOSEnforceSystemAecNsName, + flag_descriptions::kCrOSEnforceSystemAecNsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kCrOSEnforceSystemAecNs)}, + {"system-voice-isolation-option", + flag_descriptions::kCrOSSystemVoiceIsolationOptionName, + flag_descriptions::kCrOSSystemVoiceIsolationOptionDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kCrOSSystemVoiceIsolationOption)}, + {"ignore-ui-gains", flag_descriptions::kIgnoreUiGainsName, + flag_descriptions::kIgnoreUiGainsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kIgnoreUiGains)}, + {"show-force-respect-ui-gains-toggle", + flag_descriptions::kShowForceRespectUiGainsToggleName, + flag_descriptions::kShowForceRespectUiGainsToggleDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kShowForceRespectUiGainsToggle)}, + {"show-spatial-audio-toggle", + flag_descriptions::kShowSpatialAudioToggleName, + flag_descriptions::kShowSpatialAudioToggleDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kShowSpatialAudioToggle)}, + {"single-ca-cert-verification-phase-0", + flag_descriptions::kSingleCaCertVerificationPhase0Name, + flag_descriptions::kSingleCaCertVerificationPhase0Description, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSingleCaCertVerificationPhase0)}, + {"single-ca-cert-verification-phase-1", + flag_descriptions::kSingleCaCertVerificationPhase1Name, + flag_descriptions::kSingleCaCertVerificationPhase1Description, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSingleCaCertVerificationPhase1)}, + {"single-ca-cert-verification-phase-2", + flag_descriptions::kSingleCaCertVerificationPhase2Name, + flag_descriptions::kSingleCaCertVerificationPhase2Description, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSingleCaCertVerificationPhase2)}, +#endif + + {"boundary-event-dispatch-tracks-node-removal", + flag_descriptions::kBoundaryEventDispatchTracksNodeRemovalName, + flag_descriptions::kBoundaryEventDispatchTracksNodeRemovalDescription, + kOsAll, + FEATURE_VALUE_TYPE( + blink::features::kBoundaryEventDispatchTracksNodeRemoval)}, + + // Should only be available if kResamplingScrollEvents is on, and using + // linear resampling. + {"enable-resampling-scroll-events-experimental-prediction", + flag_descriptions::kEnableResamplingScrollEventsExperimentalPredictionName, + flag_descriptions:: + kEnableResamplingScrollEventsExperimentalPredictionDescription, + kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + ::features::kResamplingScrollEventsExperimentalPrediction, + kResamplingScrollEventsExperimentalPredictionVariations, + "ResamplingScrollEventsExperimentalLatency")}, + +#if BUILDFLAG(IS_WIN) + {"calculate-native-win-occlusion", + flag_descriptions::kCalculateNativeWinOcclusionName, + flag_descriptions::kCalculateNativeWinOcclusionDescription, kOsWin, + FEATURE_VALUE_TYPE(features::kCalculateNativeWinOcclusion)}, +#endif // BUILDFLAG(IS_WIN) + +#if !BUILDFLAG(IS_ANDROID) + {"happiness-tracking-surveys-for-desktop-demo", + flag_descriptions::kHappinessTrackingSurveysForDesktopDemoName, + flag_descriptions::kHappinessTrackingSurveysForDesktopDemoDescription, + kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + features::kHappinessTrackingSurveysForDesktopDemo, + kHappinessTrackingSurveysForDesktopDemoVariations, + "HappinessTrackingSurveysForDesktopDemo")}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"android-elegant-text-height", + flag_descriptions::kAndroidElegantTextHeightName, + flag_descriptions::kAndroidElegantTextHeightDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidElegantTextHeight)}, + +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_WIN) + {"use-angle", flag_descriptions::kUseAngleName, + flag_descriptions::kUseAngleDescriptionWindows, kOsWin, + MULTI_VALUE_TYPE(kUseAngleChoicesWindows)}, +#elif BUILDFLAG(IS_ANDROID) + {"use-angle", flag_descriptions::kUseAngleName, + flag_descriptions::kUseAngleDescriptionAndroid, kOsAndroid, + MULTI_VALUE_TYPE(kUseAngleChoicesAndroid)}, +#endif + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-assistant-dsp", flag_descriptions::kEnableGoogleAssistantDspName, + flag_descriptions::kEnableGoogleAssistantDspDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::assistant::features::kEnableDspHotword)}, + {"disable-quick-answers-v2-translation", + flag_descriptions::kDisableQuickAnswersV2TranslationName, + flag_descriptions::kDisableQuickAnswersV2TranslationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kDisableQuickAnswersV2Translation)}, + {"quick-answers-rich-card", flag_descriptions::kQuickAnswersRichCardName, + flag_descriptions::kQuickAnswersRichCardDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kQuickAnswersRichCard)}, + {"quick-answers-material-next-ui", + flag_descriptions::kQuickAnswersMaterialNextUIName, + flag_descriptions::kQuickAnswersMaterialNextUIDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kQuickAnswersMaterialNextUI)}, + {"magic-boost-revamp-for-quick-answers", + flag_descriptions::kMagicBoostUpdateForQuickAnswersName, + flag_descriptions::kMagicBoostUpdateForQuickAnswersDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kMagicBoostRevampForQuickAnswers)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"enable-gamepad-multitouch", + flag_descriptions::kEnableGamepadMultitouchName, + flag_descriptions::kEnableGamepadMultitouchDescription, kOsWin, + FEATURE_VALUE_TYPE(features::kEnableGamepadMultitouch)}, + +#if !BUILDFLAG(IS_ANDROID) + {"sharing-desktop-screenshots", + flag_descriptions::kSharingDesktopScreenshotsName, + flag_descriptions::kSharingDesktopScreenshotsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(sharing_hub::kDesktopScreenshots)}, +#endif + +#if BUILDFLAG(IS_CHROMEOS) + {"cros-labs-enable-overview-from-wallpaper", + flag_descriptions::kEnterOverviewFromWallpaperName, + flag_descriptions::kEnterOverviewFromWallpaperDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnterOverviewFromWallpaper)}, + {"enable-assistant-stereo-input", + flag_descriptions::kEnableGoogleAssistantStereoInputName, + flag_descriptions::kEnableGoogleAssistantStereoInputDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::assistant::features::kEnableStereoAudioInput)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"enable-gpu-service-logging", + flag_descriptions::kEnableGpuServiceLoggingName, + flag_descriptions::kEnableGpuServiceLoggingDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableGPUServiceLogging)}, + +#if !BUILDFLAG(IS_ANDROID) + {"hardware-media-key-handling", + flag_descriptions::kHardwareMediaKeyHandling, + flag_descriptions::kHardwareMediaKeyHandlingDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media::kHardwareMediaKeyHandling)}, +#endif + +#if BUILDFLAG(IS_CHROMEOS) + {"arc-window-predictor", flag_descriptions::kArcWindowPredictorName, + flag_descriptions::kArcWindowPredictorDescription, kOsCrOS, + FEATURE_VALUE_TYPE(full_restore::features::kArcWindowPredictor)}, + + {"use-annotated-account-id", flag_descriptions::kUseAnnotatedAccountIdName, + flag_descriptions::kUseAnnotatedAccountIdDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kUseAnnotatedAccountId)}, + + {"use-fake-device-for-media-stream", + flag_descriptions::kUseFakeDeviceForMediaStreamName, + flag_descriptions::kUseFakeDeviceForMediaStreamDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kUseFakeDeviceForMediaStream)}, + +#if BUILDFLAG(USE_LINUX_VIDEO_ACCELERATION) + {"enable-vbr-encode-acceleration", + flag_descriptions::kChromeOSHWVBREncodingName, + flag_descriptions::kChromeOSHWVBREncodingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kChromeOSHWVBREncoding)}, +#if defined(ARCH_CPU_ARM_FAMILY) + {"use-gl-scaling", flag_descriptions::kUseGLForScalingName, + flag_descriptions::kUseGLForScalingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kUseGLForScaling)}, + {"prefer-gl-image-processor", + flag_descriptions::kPreferGLImageProcessorName, + flag_descriptions::kPreferGLImageProcessorDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kPreferGLImageProcessor)}, + {"prefer-software-mt21", flag_descriptions::kPreferSoftwareMT21Name, + flag_descriptions::kPreferSoftwareMT21Description, kOsCrOS, + FEATURE_VALUE_TYPE(media::kPreferSoftwareMT21)}, + {"enable-protected-vulkan-detiling", + flag_descriptions::kEnableProtectedVulkanDetilingName, + flag_descriptions::kEnableProtectedVulkanDetilingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kEnableProtectedVulkanDetiling)}, + {"enable-arm-hwdrm-10bit-overlays", + flag_descriptions::kEnableArmHwdrm10bitOverlaysName, + flag_descriptions::kEnableArmHwdrm10bitOverlaysDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kEnableArmHwdrm10bitOverlays)}, +#if BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA) + {"enable-arm-hwdrm", flag_descriptions::kEnableArmHwdrmName, + flag_descriptions::kEnableArmHwdrmDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kEnableArmHwdrm)}, +#endif // BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA) +#endif // defined(ARCH_CPU_ARM_FAMILY) +#endif // BUILDFLAG(USE_LINUX_VIDEO_ACCELERATION) +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"force-startup-signin-promo", + flag_descriptions::kForceStartupSigninPromoName, + flag_descriptions::kForceStartupSigninPromoDescription, kOsAndroid, + FEATURE_VALUE_TYPE(switches::kForceStartupSigninPromo)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"file-handling-icons", flag_descriptions::kFileHandlingIconsName, + flag_descriptions::kFileHandlingIconsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kFileHandlingIcons)}, + + {"file-system-observer", flag_descriptions::kFileSystemObserverName, + flag_descriptions::kFileSystemObserverDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kFileSystemObserver)}, + + {"strict-origin-isolation", flag_descriptions::kStrictOriginIsolationName, + flag_descriptions::kStrictOriginIsolationDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kStrictOriginIsolation)}, + +#if BUILDFLAG(IS_ANDROID) + {"lock-controls-on-tablets", + flag_descriptions::kLockTopControlsOnLargeTabletsName, + flag_descriptions::kLockTopControlsOnLargeTabletsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kLockTopControlsOnLargeTablets)}, + {"enable-logging-js-console-messages", + flag_descriptions::kLogJsConsoleMessagesName, + flag_descriptions::kLogJsConsoleMessagesDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kLogJsConsoleMessages)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"allow-cross-device-feature-suite", + flag_descriptions::kAllowCrossDeviceFeatureSuiteName, + flag_descriptions::kAllowCrossDeviceFeatureSuiteDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kAllowCrossDeviceFeatureSuite)}, + + {"link-cross-device-internals", + flag_descriptions::kLinkCrossDeviceInternalsName, + flag_descriptions::kLinkCrossDeviceInternalsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kLinkCrossDeviceInternals)}, + + {"block-telephony-device-phone-mute", + flag_descriptions::kBlockTelephonyDevicePhoneMuteName, + flag_descriptions::kBlockTelephonyDevicePhoneMuteDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ui::kBlockTelephonyDevicePhoneMute)}, + + {"enable-doze-mode-power-scheduler", + flag_descriptions::kEnableDozeModePowerSchedulerName, + flag_descriptions::kEnableDozeModePowerSchedulerDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableDozeModePowerScheduler)}, + + {"enable-fast-ink-for-software-cursor", + flag_descriptions::kEnableFastInkForSoftwareCursorName, + flag_descriptions::kEnableFastInkForSoftwareCursorDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableFastInkForSoftwareCursor)}, + + {"enable-heatmap-palm-detection", + flag_descriptions::kEnableHeatmapPalmDetectionName, + flag_descriptions::kEnableHeatmapPalmDetectionDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ui::kEnableHeatmapPalmDetection)}, + + {"enable-neural-stylus-palm-rejection", + flag_descriptions::kEnableNeuralStylusPalmRejectionName, + flag_descriptions::kEnableNeuralStylusPalmRejectionDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ui::kEnableNeuralPalmDetectionFilter)}, + + {"enable-fast-touchpad-click", + flag_descriptions::kEnableFastTouchpadClickName, + flag_descriptions::kEnableFastTouchpadClickDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ui::kEnableFastTouchpadClick)}, + + {"fast-pair-debug-metadata", flag_descriptions::kFastPairDebugMetadataName, + flag_descriptions::kFastPairDebugMetadataDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFastPairDebugMetadata)}, + + {"fast-pair-handshake-long-term-refactor", + flag_descriptions::kFastPairHandshakeLongTermRefactorName, + flag_descriptions::kFastPairHandshakeLongTermRefactorDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFastPairHandshakeLongTermRefactor)}, + + {"fast-pair-keyboards", flag_descriptions::kFastPairKeyboardsName, + flag_descriptions::kFastPairKeyboardsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFastPairKeyboards)}, + + {"fast-pair-pwa-companion", flag_descriptions::kFastPairPwaCompanionName, + flag_descriptions::kFastPairPwaCompanionDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFastPairPwaCompanion)}, + + {"nearby-ble-v2", flag_descriptions::kEnableNearbyBleV2Name, + flag_descriptions::kEnableNearbyBleV2Description, kOsCrOS, + FEATURE_VALUE_TYPE(features::kEnableNearbyBleV2)}, + + {"nearby-ble-v2-extended-adv", + flag_descriptions::kEnableNearbyBleV2ExtendedAdvertisingName, + flag_descriptions::kEnableNearbyBleV2ExtendedAdvertisingDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kEnableNearbyBleV2ExtendedAdvertising)}, + + {"nearby-ble-v2-gatt-server", + flag_descriptions::kEnableNearbyBleV2GattServerName, + flag_descriptions::kEnableNearbyBleV2GattServerDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kEnableNearbyBleV2GattServer)}, + + {"nearby-bluetooth-classic-adv", + flag_descriptions::kEnableNearbyBluetoothClassicAdvertisingName, + flag_descriptions::kEnableNearbyBluetoothClassicAdvertisingDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kEnableNearbyBluetoothClassicAdvertising)}, + + {"nearby-mdns", flag_descriptions::kEnableNearbyMdnsName, + flag_descriptions::kEnableNearbyMdnsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kEnableNearbyMdns)}, + + {"nearby-presence", flag_descriptions::kNearbyPresenceName, + flag_descriptions::kNearbyPresenceDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kNearbyPresence)}, + + {"pcie-billboard-notification", + flag_descriptions::kPcieBillboardNotificationName, + flag_descriptions::kPcieBillboardNotificationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kPcieBillboardNotification)}, + + {"use-search-click-for-right-click", + flag_descriptions::kUseSearchClickForRightClickName, + flag_descriptions::kUseSearchClickForRightClickDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kUseSearchClickForRightClick)}, + + {"display-alignment-assistance", + flag_descriptions::kDisplayAlignmentAssistanceName, + flag_descriptions::kDisplayAlignmentAssistanceDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kDisplayAlignAssist)}, + + {"enable-experimental-rgb-keyboard-patterns", + flag_descriptions::kExperimentalRgbKeyboardPatternsName, + flag_descriptions::kExperimentalRgbKeyboardPatternsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kExperimentalRgbKeyboardPatterns)}, + + {"enable-hostname-setting", flag_descriptions::kEnableHostnameSettingName, + flag_descriptions::kEnableHostnameSettingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableHostnameSetting)}, + + {"enable-oauth-ipp", flag_descriptions::kEnableOAuthIppName, + flag_descriptions::kEnableOAuthIppDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableOAuthIpp)}, + + {"enable-peripheral-customization", + flag_descriptions::kEnablePeripheralCustomizationName, + flag_descriptions::kEnablePeripheralCustomizationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kPeripheralCustomization)}, + + {"enable-peripherals-logging", + flag_descriptions::kEnablePeripheralsLoggingName, + flag_descriptions::kEnablePeripheralsLoggingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnablePeripheralsLogging)}, + + {"enable-peripheral-notification", + flag_descriptions::kEnablePeripheralNotificationName, + flag_descriptions::kEnablePeripheralNotificationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kPeripheralNotification)}, + + {"enable-accessibility-accelerator", + flag_descriptions::kAccessibilityAcceleratorName, + flag_descriptions::kAccessibilityAcceleratorDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityAccelerator)}, + + {"enable-accessibility-disable-touchpad", + flag_descriptions::kAccessibilityDisableTouchpadName, + flag_descriptions::kAccessibilityDisableTouchpadDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityDisableTouchpad)}, + + {"enable-accessibility-flash-screen-feature", + flag_descriptions::kAccessibilityFlashScreenFeatureName, + flag_descriptions::kAccessibilityFlashScreenFeatureDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityFlashScreenFeature)}, + + {"enable-accessibility-shake-to-locate", + flag_descriptions::kAccessibilityShakeToLocateName, + flag_descriptions::kAccessibilityShakeToLocateDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityShakeToLocate)}, + + {"enable-accessibility-service", + flag_descriptions::kAccessibilityServiceName, + flag_descriptions::kAccessibilityServiceDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityService)}, + + {"enable-accessibility-reduced-animations", + flag_descriptions::kAccessibilityReducedAnimationsName, + flag_descriptions::kAccessibilityReducedAnimationsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityReducedAnimations)}, + + {"enable-accessibility-reduced-animations-in-kiosk", + flag_descriptions::kAccessibilityReducedAnimationsInKioskName, + flag_descriptions::kAccessibilityReducedAnimationsInKioskDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityReducedAnimationsInKiosk)}, + + {"enable-accessibility-magnifier-follows-chromevox", + flag_descriptions::kAccessibilityMagnifierFollowsChromeVoxName, + flag_descriptions::kAccessibilityMagnifierFollowsChromeVoxDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityMagnifierFollowsChromeVox)}, + + {"enable-accessibility-manifest-v3-accessibility-common", + flag_descriptions::kAccessibilityManifestV3AccessibilityCommonName, + flag_descriptions::kAccessibilityManifestV3AccessibilityCommonDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityManifestV3AccessibilityCommon)}, + + {"enable-accessibility-manifest-v3-braille-ime", + flag_descriptions::kAccessibilityManifestV3BrailleImeName, + flag_descriptions::kAccessibilityManifestV3BrailleImeDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityManifestV3BrailleIme)}, + + {"enable-accessibility-manifest-v3-chromevox", + flag_descriptions::kAccessibilityManifestV3ChromeVoxName, + flag_descriptions::kAccessibilityManifestV3ChromeVoxDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityManifestV3ChromeVox)}, + + {"enable-accessibility-manifest-v3-enhanced-network-tts", + flag_descriptions::kAccessibilityManifestV3EnhancedNetworkTtsName, + flag_descriptions::kAccessibilityManifestV3EnhancedNetworkTtsDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityManifestV3EnhancedNetworkTts)}, + + {"enable-accessibility-manifest-v3-espeakng", + flag_descriptions::kAccessibilityManifestV3EspeakNGName, + flag_descriptions::kAccessibilityManifestV3EspeakNGDescription, kOsCrOS, + FEATURE_VALUE_TYPE(::features::kAccessibilityManifestV3EspeakNGTts)}, + + {"enable-accessibility-manifest-v3-google-tts", + flag_descriptions::kAccessibilityManifestV3GoogleTtsName, + flag_descriptions::kAccessibilityManifestV3GoogleTtsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(::features::kAccessibilityManifestV3GoogleTts)}, + + {"enable-accessibility-manifest-v3-select-to-speak", + flag_descriptions::kAccessibilityManifestV3SelectToSpeakName, + flag_descriptions::kAccessibilityManifestV3SelectToSpeakDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityManifestV3SelectToSpeak)}, + + {"enable-accessibility-manifest-v3-switch-access", + flag_descriptions::kAccessibilityManifestV3SwitchAccessName, + flag_descriptions::kAccessibilityManifestV3SwitchAccessDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityManifestV3SwitchAccess)}, + + {"enable-accessibility-mousekeys", + flag_descriptions::kAccessibilityMouseKeysName, + flag_descriptions::kAccessibilityMouseKeysDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityMouseKeys)}, + + {"enable-accessibility-captions-on-braille-display", + flag_descriptions::kAccessibilityCaptionsOnBrailleDisplayName, + flag_descriptions::kAccessibilityCaptionsOnBrailleDisplayDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kAccessibilityCaptionsOnBrailleDisplay)}, + + {"event-based-log-upload", flag_descriptions::kEventBasedLogUpload, + flag_descriptions::kEventBasedLogUploadDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kEventBasedLogUpload)}, + +#endif // BUILDFLAG(IS_CHROMEOS) + + {"enable-fenced-frames-developer-mode", + flag_descriptions::kEnableFencedFramesDeveloperModeName, + flag_descriptions::kEnableFencedFramesDeveloperModeDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kFencedFramesDefaultMode)}, + + {"enable-unsafe-webgpu", flag_descriptions::kUnsafeWebGPUName, + flag_descriptions::kUnsafeWebGPUDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableUnsafeWebGPU)}, + + {"force-high-performance-gpu", + flag_descriptions::kForceHighPerformanceGPUName, + flag_descriptions::kForceHighPerformanceGPUDescription, kOsWin, + SINGLE_VALUE_TYPE(switches::kForceHighPerformanceGPU)}, + + {"enable-webgpu-developer-features", + flag_descriptions::kWebGpuDeveloperFeaturesName, + flag_descriptions::kWebGpuDeveloperFeaturesDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableWebGPUDeveloperFeatures)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"game-dashboard-game-pwas", flag_descriptions::kGameDashboardGamePWAs, + flag_descriptions::kGameDashboardGamePWAsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kGameDashboardGamePWAs)}, + + {"game-dashboard-gamepad-support", + flag_descriptions::kGameDashboardGamepadSupport, + flag_descriptions::kGameDashboardGamepadSupport, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kGameDashboardGamepadSupport)}, + + {"game-dashboard-games-in-test", + flag_descriptions::kGameDashboardGamesInTest, + flag_descriptions::kGameDashboardGamesInTestDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kGameDashboardGamesInTest)}, + + {"game-dashboard-utilities", flag_descriptions::kGameDashboardUtilities, + flag_descriptions::kGameDashboardUtilitiesDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kGameDashboardUtilities)}, + + {"gesture-properties-dbus-service", + flag_descriptions::kEnableGesturePropertiesDBusServiceName, + flag_descriptions::kEnableGesturePropertiesDBusServiceDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kGesturePropertiesDBusService)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if !BUILDFLAG(IS_CHROMEOS) + {"global-media-controls-updated-ui", + flag_descriptions::kGlobalMediaControlsUpdatedUIName, + flag_descriptions::kGlobalMediaControlsUpdatedUIDescription, + kOsLinux | kOsMac | kOsWin, + FEATURE_VALUE_TYPE(media::kGlobalMediaControlsUpdatedUI)}, +#endif // !BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) + {"enable-network-service-sandbox", + flag_descriptions::kEnableNetworkServiceSandboxName, + flag_descriptions::kEnableNetworkServiceSandboxDescription, + kOsLinux | kOsCrOS, + FEATURE_VALUE_TYPE(sandbox::policy::features::kNetworkServiceSandbox)}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(ALLOW_OOP_VIDEO_DECODER) + {"use-out-of-process-video-decoding", + flag_descriptions::kUseOutOfProcessVideoDecodingName, + flag_descriptions::kUseOutOfProcessVideoDecodingDescription, + kOsLinux | kOsCrOS, + FEATURE_VALUE_TYPE(media::kUseOutOfProcessVideoDecoding)}, +#endif // BUILDFLAG(ALLOW_OOP_VIDEO_DECODER) + + {"notification-scheduler", flag_descriptions::kNotificationSchedulerName, + flag_descriptions::kNotificationSchedulerDescription, kOsAndroid, + FEATURE_VALUE_TYPE(notifications::features::kNotificationScheduleService)}, + + {"notification-scheduler-debug-options", + flag_descriptions::kNotificationSchedulerDebugOptionName, + flag_descriptions::kNotificationSchedulerDebugOptionDescription, + kOsAndroid, MULTI_VALUE_TYPE(kNotificationSchedulerChoices)}, + +#if BUILDFLAG(IS_ANDROID) + + {"debug-chime-notification", + flag_descriptions::kChimeAlwaysShowNotificationName, + flag_descriptions::kChimeAlwaysShowNotificationDescription, kOsAndroid, + SINGLE_VALUE_TYPE(notifications::switches::kDebugChimeNotification)}, + + {"use-chime-android-sdk", flag_descriptions::kChimeAndroidSdkName, + flag_descriptions::kChimeAndroidSdkDescription, kOsAndroid, + FEATURE_VALUE_TYPE(notifications::features::kUseChimeAndroidSdk)}, + +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"scalable-iph-debug", flag_descriptions::kScalableIphDebugName, + flag_descriptions::kScalableIphDebugDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kScalableIphDebug)}, + {"settings-app-notification-settings", + flag_descriptions::kSettingsAppNotificationSettingsName, + flag_descriptions::kSettingsAppNotificationSettingsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSettingsAppNotificationSettings)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"web-otp-backend", flag_descriptions::kWebOtpBackendName, + flag_descriptions::kWebOtpBackendDescription, kOsAndroid, + MULTI_VALUE_TYPE(kWebOtpBackendChoices)}, + + {"darken-websites-checkbox-in-themes-setting", + flag_descriptions::kDarkenWebsitesCheckboxInThemesSettingName, + flag_descriptions::kDarkenWebsitesCheckboxInThemesSettingDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + content_settings::kDarkenWebsitesCheckboxInThemesSetting)}, + +#endif // BUILDFLAG(IS_ANDROID) + + {"back-forward-cache", flag_descriptions::kBackForwardCacheName, + flag_descriptions::kBackForwardCacheDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kBackForwardCache, + kBackForwardCacheVariations, + "BackForwardCache")}, +#if BUILDFLAG(IS_ANDROID) + {"back-forward-transitions", flag_descriptions::kBackForwardTransitionsName, + flag_descriptions::kBackForwardTransitionsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(blink::features::kBackForwardTransitions)}, + {"mirror-back-forward-gestures-in-rtl", + flag_descriptions::kMirrorBackForwardGesturesInRTLName, + flag_descriptions::kMirrorBackForwardGesturesInRTLDescription, kOsAndroid, + FEATURE_VALUE_TYPE(ui::kMirrorBackForwardGesturesInRTL)}, + {"back-forward-transitions-cross-doc-shared-image", + flag_descriptions::kBackForwardTransitionsCrossDocSharedImageName, + flag_descriptions::kBackForwardTransitionsCrossDocSharedImageDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(features::kBackForwardTransitionsCrossDocSharedImage)}, +#endif + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) + {"elastic-overscroll", flag_descriptions::kElasticOverscrollName, + flag_descriptions::kElasticOverscrollDescription, kOsWin | kOsAndroid, + FEATURE_VALUE_TYPE(features::kElasticOverscroll)}, +#endif + +#if !BUILDFLAG(IS_ANDROID) + {"element-capture", flag_descriptions::kElementCaptureName, + flag_descriptions::kElementCaptureDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kElementCapture)}, + + {"element-capture-cross-tab", + flag_descriptions::kCrossTabElementCaptureName, + flag_descriptions::kCrossTabElementCaptureDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kElementCaptureOfOtherTabs)}, +#endif + + {"device-posture", flag_descriptions::kDevicePostureName, + flag_descriptions::kDevicePostureDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kDevicePosture)}, + + {"viewport-segments", flag_descriptions::kViewportSegmentsName, + flag_descriptions::kViewportSegmentsDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kViewportSegments)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-assistant-aec", flag_descriptions::kEnableGoogleAssistantAecName, + flag_descriptions::kEnableGoogleAssistantAecDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::assistant::features::kAssistantAudioEraser)}, +#endif + +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + {"enable-location-provider-manager", + flag_descriptions::kLocationProviderManagerName, + flag_descriptions::kLocationProviderManagerDescription, kOsMac | kOsWin, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kLocationProviderManager, + kLocationProviderManagerVariations, + "LocationProviderManager")}, +#endif // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + +#if !BUILDFLAG(IS_ANDROID) + {"mute-notification-snooze-action", + flag_descriptions::kMuteNotificationSnoozeActionName, + flag_descriptions::kMuteNotificationSnoozeActionDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kMuteNotificationSnoozeAction)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"notification-one-tap-unsubscribe", + flag_descriptions::kNotificationOneTapUnsubscribeName, + flag_descriptions::kNotificationOneTapUnsubscribeDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kNotificationOneTapUnsubscribe)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_MAC) + {"enable-new-mac-notification-api", + flag_descriptions::kNewMacNotificationAPIName, + flag_descriptions::kNewMacNotificationAPIDescription, kOsMac, + FEATURE_VALUE_TYPE(features::kNewMacNotificationAPI)}, +#endif + +#if BUILDFLAG(IS_CHROMEOS) + {"exo-gamepad-vibration", flag_descriptions::kExoGamepadVibrationName, + flag_descriptions::kExoGamepadVibrationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kGamepadVibration)}, + {"exo-ordinal-motion", flag_descriptions::kExoOrdinalMotionName, + flag_descriptions::kExoOrdinalMotionDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kExoOrdinalMotion)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"heavy-ad-privacy-mitigations", + flag_descriptions::kHeavyAdPrivacyMitigationsName, + flag_descriptions::kHeavyAdPrivacyMitigationsDescription, kOsAll, + FEATURE_VALUE_TYPE( + heavy_ad_intervention::features::kHeavyAdPrivacyMitigations)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"crostini-container-install", + flag_descriptions::kCrostiniContainerInstallName, + flag_descriptions::kCrostiniContainerInstallDescription, kOsCrOS, + MULTI_VALUE_TYPE(kCrostiniContainerChoices)}, + {"help-app-app-detail-page", flag_descriptions::kHelpAppAppDetailPageName, + flag_descriptions::kHelpAppAppDetailPageDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kHelpAppAppDetailPage)}, + {"help-app-apps-list", flag_descriptions::kHelpAppAppsListName, + flag_descriptions::kHelpAppAppsListDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kHelpAppAppsList)}, + {"help-app-auto-trigger-install-dialog", + flag_descriptions::kHelpAppAutoTriggerInstallDialogName, + flag_descriptions::kHelpAppAutoTriggerInstallDialogDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kHelpAppAutoTriggerInstallDialog)}, + {"help-app-home-page-app-articles", + flag_descriptions::kHelpAppHomePageAppArticlesName, + flag_descriptions::kHelpAppHomePageAppArticlesDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kHelpAppHomePageAppArticles)}, + {"help-app-launcher-search", flag_descriptions::kHelpAppLauncherSearchName, + flag_descriptions::kHelpAppLauncherSearchDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kHelpAppLauncherSearch)}, + {"help-app-onboarding-revamp", + flag_descriptions::kHelpAppOnboardingRevampName, + flag_descriptions::kHelpAppOnboardingRevampDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kHelpAppOnboardingRevamp)}, + {"help-app-opens-instead-of-release-notes-notification", + flag_descriptions::kHelpAppOpensInsteadOfReleaseNotesNotificationName, + flag_descriptions:: + kHelpAppOpensInsteadOfReleaseNotesNotificationDescription, + kOsCrOS, + FEATURE_VALUE_TYPE( + ash::features::kHelpAppOpensInsteadOfReleaseNotesNotification)}, + {"media-app-pdf-mahi", flag_descriptions::kMediaAppPdfMahiName, + flag_descriptions::kMediaAppPdfMahiDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kMediaAppPdfMahi)}, + {"media-app-image-mantis-reimagine", + flag_descriptions::kMediaAppImageMantisReimagineName, + flag_descriptions::kMediaAppImageMantisReimagineDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kMediaAppImageMantisReimagine)}, + {"on-device-app-controls", flag_descriptions::kOnDeviceAppControlsName, + flag_descriptions::kOnDeviceAppControlsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kForceOnDeviceAppControlsForAllRegions)}, + {"release-notes-notification-all-channels", + flag_descriptions::kReleaseNotesNotificationAllChannelsName, + flag_descriptions::kReleaseNotesNotificationAllChannelsDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kReleaseNotesNotificationAllChannels)}, + {"release-notes-notification-always-eligible", + flag_descriptions::kReleaseNotesNotificationAlwaysEligibleName, + flag_descriptions::kReleaseNotesNotificationAlwaysEligibleDescription, + kOsCrOS, + FEATURE_VALUE_TYPE( + ash::features::kReleaseNotesNotificationAlwaysEligible)}, + {"use-android-staging-smds", flag_descriptions::kUseAndroidStagingSmdsName, + flag_descriptions::kUseAndroidStagingSmdsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kUseAndroidStagingSmds)}, + {"use-stork-smds-server-address", + flag_descriptions::kUseStorkSmdsServerAddressName, + flag_descriptions::kUseStorkSmdsServerAddressDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kUseStorkSmdsServerAddress)}, + {"use-wallpaper-staging-url", + flag_descriptions::kUseWallpaperStagingUrlName, + flag_descriptions::kUseWallpaperStagingUrlDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kUseWallpaperStagingUrl)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(ENABLE_PAINT_PREVIEW) && BUILDFLAG(IS_ANDROID) + {"paint-preview-demo", flag_descriptions::kPaintPreviewDemoName, + flag_descriptions::kPaintPreviewDemoDescription, kOsAndroid, + FEATURE_VALUE_TYPE(paint_preview::kPaintPreviewDemo)}, +#endif // BUILDFLAG(ENABLE_PAINT_PREVIEW) && BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"panel-self-refresh-2", flag_descriptions::kPanelSelfRefresh2Name, + flag_descriptions::kPanelSelfRefresh2Description, kOsCrOS, + FEATURE_VALUE_TYPE(display::features::kPanelSelfRefresh2)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) + {"run-video-capture-service-in-browser", + flag_descriptions::kRunVideoCaptureServiceInBrowserProcessName, + flag_descriptions::kRunVideoCaptureServiceInBrowserProcessDescription, + kOsWin | kOsCrOS, + FEATURE_VALUE_TYPE(features::kRunVideoCaptureServiceInBrowserProcess)}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) + {"double-buffer-compositing", + flag_descriptions::kDoubleBufferCompositingName, + flag_descriptions::kDoubleBufferCompositingDescription, kOsCrOS, + SINGLE_VALUE_TYPE(switches::kDoubleBufferCompositing)}, + + {"tracking-protection-3pcd", flag_descriptions::kTrackingProtection3pcdName, + flag_descriptions::kTrackingProtection3pcdDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(content_settings::features::kTrackingProtection3pcd)}, + +#if BUILDFLAG(IS_CHROMEOS) + +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_WIN) + {"enable-media-foundation-video-capture", + flag_descriptions::kEnableMediaFoundationVideoCaptureName, + flag_descriptions::kEnableMediaFoundationVideoCaptureDescription, kOsWin, + FEATURE_VALUE_TYPE(media::kMediaFoundationVideoCapture)}, +#endif // BUILDFLAG(IS_WIN) + {"shared-highlighting-manager", + flag_descriptions::kSharedHighlightingManagerName, + flag_descriptions::kSharedHighlightingManagerDescription, kOsAll, + FEATURE_VALUE_TYPE(shared_highlighting::kSharedHighlightingManager)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"reset-shortcut-customizations", + flag_descriptions::kResetShortcutCustomizationsName, + flag_descriptions::kResetShortcutCustomizationsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kResetShortcutCustomizations)}, + {"shimless-rma-os-update", flag_descriptions::kShimlessRMAOsUpdateName, + flag_descriptions::kShimlessRMAOsUpdateDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kShimlessRMAOsUpdate)}, + {"shimless-rma-hw-validation-skip", + flag_descriptions::kShimlessRMAHardwareValidationSkipName, + flag_descriptions::kShimlessRMAHardwareValidationSkipDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kShimlessRMAHardwareValidationSkip)}, + {"shimless-rma-dynamic-device-info-inputs", + flag_descriptions::kShimlessRMADynamicDeviceInfoInputsName, + flag_descriptions::kShimlessRMADynamicDeviceInfoInputsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kShimlessRMADynamicDeviceInfoInputs)}, + {"quick-share-v2", flag_descriptions::kQuickShareV2Name, + flag_descriptions::kQuickShareV2Description, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kQuickShareV2)}, + {"enable-palm-suppression", flag_descriptions::kEnablePalmSuppressionName, + flag_descriptions::kEnablePalmSuppressionDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ui::kEnablePalmSuppression)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"enable-experimental-cookie-features", + flag_descriptions::kEnableExperimentalCookieFeaturesName, + flag_descriptions::kEnableExperimentalCookieFeaturesDescription, kOsAll, + MULTI_VALUE_TYPE(kEnableExperimentalCookieFeaturesChoices)}, + + {"canvas-2d-layers", flag_descriptions::kCanvas2DLayersName, + flag_descriptions::kCanvas2DLayersDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableCanvas2DLayers)}, + + {"web-machine-learning-neural-network", + flag_descriptions::kWebMachineLearningNeuralNetworkName, + flag_descriptions::kWebMachineLearningNeuralNetworkDescription, kOsAll, + FEATURE_VALUE_TYPE( + webnn::mojom::features::kWebMachineLearningNeuralNetwork)}, + + {"experimental-web-machine-learning-neural-network", + flag_descriptions::kExperimentalWebMachineLearningNeuralNetworkName, + flag_descriptions::kExperimentalWebMachineLearningNeuralNetworkDescription, + kOsAll, + FEATURE_VALUE_TYPE( + webnn::mojom::features::kExperimentalWebMachineLearningNeuralNetwork)}, + +#if BUILDFLAG(IS_MAC) + {"webnn-coreml", flag_descriptions::kWebNNCoreMLName, + flag_descriptions::kWebNNCoreMLDescription, kOsMac, + FEATURE_VALUE_TYPE(webnn::mojom::features::kWebNNCoreML)}, + + {"webnn-coreml-explicit-gpu-or-npu", + flag_descriptions::kWebNNCoreMLExplicitGPUOrNPUName, + flag_descriptions::kWebNNCoreMLExplicitGPUOrNPUDescription, kOsMac, + FEATURE_VALUE_TYPE(webnn::mojom::features::kWebNNCoreMLExplicitGPUOrNPU)}, +#endif // BUILDFLAG(IS_MAC) + +#if BUILDFLAG(IS_WIN) + {"webnn-directml", flag_descriptions::kWebNNDirectMLName, + flag_descriptions::kWebNNDirectMLDescription, kOsWin, + FEATURE_VALUE_TYPE(webnn::mojom::features::kWebNNDirectML)}, + + {"webnn-onnxruntime", flag_descriptions::kWebNNOnnxRuntimeName, + flag_descriptions::kWebNNOnnxRuntimeDescription, kOsWin, + FEATURE_VALUE_TYPE(webnn::mojom::features::kWebNNOnnxRuntime)}, +#endif // BUILDFLAG(IS_WIN) + + {"permission-element", + flag_descriptions::kPageEmbeddedPermissionControlName, + flag_descriptions::kPageEmbeddedPermissionControlDescription, + kOsMac | kOsWin | kOsCrOS | kOsAndroid | kOsLinux, + FEATURE_VALUE_TYPE(blink::features::kPermissionElement)}, + + {"geolocation-element", + flag_descriptions::kGeolocationPermissionControlName, + flag_descriptions::kGeolocationPermissionControlDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(blink::features::kGeolocationElement)}, + + {"permission-promise-lifetime-modulation", + flag_descriptions::kPermissionPromiseLifetimeModulationName, + flag_descriptions::kPermissionPromiseLifetimeModulationDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + permissions::features::kPermissionPromiseLifetimeModulation)}, + + {"left-hand-side-activity-indicators", + flag_descriptions::kLeftHandSideActivityIndicatorsName, + flag_descriptions::kLeftHandSideActivityIndicatorsDescription, kOsDesktop, + FEATURE_VALUE_TYPE( + content_settings::features::kLeftHandSideActivityIndicators)}, + +#if !BUILDFLAG(IS_ANDROID) + {"merchant-trust", flag_descriptions::kMerchantTrustName, + flag_descriptions::kMerchantTrustDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(page_info::kMerchantTrust, + kMerchantTrustVariations, + "MerchantTrust")}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"privacy-policy-insights", flag_descriptions::kPrivacyPolicyInsightsName, + flag_descriptions::kPrivacyPolicyInsightsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(page_info::kPrivacyPolicyInsights)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"cros-block-warnings", + flag_descriptions::kCrosSystemLevelPermissionBlockedWarningsName, + flag_descriptions::kCrosSystemLevelPermissionBlockedWarningsDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(content_settings::features:: + kCrosSystemLevelPermissionBlockedWarnings)}, +#endif + +#if BUILDFLAG(IS_CHROMEOS) + {"launcher-continue-section-with-recents", + flag_descriptions::kLauncherContinueSectionWithRecentsName, + flag_descriptions::kLauncherContinueSectionWithRecentsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kLauncherContinueSectionWithRecents)}, + {"launcher-item-suggest", flag_descriptions::kLauncherItemSuggestName, + flag_descriptions::kLauncherItemSuggestDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE(ash::kLauncherItemSuggest, + kLauncherItemSuggestVariations, + "LauncherItemSuggest")}, + {"shelf-auto-hide-separation", + flag_descriptions::kShelfAutoHideSeparationName, + flag_descriptions::kShelfAutoHideSeparationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kShelfAutoHideSeparation)}, + {"launcher-keyword-extraction-scoring", + flag_descriptions::kLauncherKeywordExtractionScoring, + flag_descriptions::kLauncherKeywordExtractionScoringDescription, kOsCrOS, + FEATURE_VALUE_TYPE(search_features::kLauncherKeywordExtractionScoring)}, + {"launcher-search-control", flag_descriptions::kLauncherSearchControlName, + flag_descriptions::kLauncherSearchControlDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kLauncherSearchControl)}, + {"launcher-nudge-session-reset", + flag_descriptions::kLauncherNudgeSessionResetName, + flag_descriptions::kLauncherNudgeSessionResetDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kLauncherNudgeSessionReset)}, + {"text-in-shelf", flag_descriptions::kTextInShelfName, + flag_descriptions::kTextInShelfDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kHomeButtonWithText)}, + {"launcher-local-image-search", + flag_descriptions::kLauncherLocalImageSearchName, + flag_descriptions::kLauncherLocalImageSearchDescription, kOsCrOS, + FEATURE_VALUE_TYPE(search_features::kLauncherImageSearch)}, + {"launcher-local-image-search-confidence", + flag_descriptions::kLauncherLocalImageSearchConfidenceName, + flag_descriptions::kLauncherLocalImageSearchConfidenceDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE( + search_features::kLauncherLocalImageSearchConfidence, + kLauncherLocalImageSearchConfidenceVariations, + "LauncherLocalImageSearchConfidence")}, + {"launcher-local-image-search-relevance", + flag_descriptions::kLauncherLocalImageSearchRelevanceName, + flag_descriptions::kLauncherLocalImageSearchRelevanceDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE( + search_features::kLauncherLocalImageSearchRelevance, + kLauncherLocalImageSearchRelevanceVariations, + "LauncherLocalImageSearchRelevance")}, + {"launcher-local-image-search-ocr", + flag_descriptions::kLauncherLocalImageSearchOcrName, + flag_descriptions::kLauncherLocalImageSearchOcrDescription, kOsCrOS, + FEATURE_VALUE_TYPE(search_features::kLauncherImageSearchOcr)}, + {"launcher-local-image-search-ica", + flag_descriptions::kLauncherLocalImageSearchIcaName, + flag_descriptions::kLauncherLocalImageSearchIcaDescription, kOsCrOS, + FEATURE_VALUE_TYPE(search_features::kLauncherImageSearchIca)}, + {"launcher-key-shortcut-in-best-match", + flag_descriptions::kLauncherKeyShortcutInBestMatchName, + flag_descriptions::kLauncherKeyShortcutInBestMatchDescription, kOsCrOS, + FEATURE_VALUE_TYPE(search_features::kLauncherKeyShortcutInBestMatch)}, + {"quick-app-access-test-ui", flag_descriptions::kQuickAppAccessTestUIName, + flag_descriptions::kQuickAppAccessTestUIDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kQuickAppAccessTestUI)}, + + {"mac-address-randomization", + flag_descriptions::kMacAddressRandomizationName, + flag_descriptions::kMacAddressRandomizationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kMacAddressRandomization)}, + + {"tethering-experimental-functionality", + flag_descriptions::kTetheringExperimentalFunctionalityName, + flag_descriptions::kTetheringExperimentalFunctionalityDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kTetheringExperimentalFunctionality)}, + + {"dynamic-search-update-animation", + flag_descriptions::kDynamicSearchUpdateAnimationName, + flag_descriptions::kDynamicSearchUpdateAnimationDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE( + app_list_features::kDynamicSearchUpdateAnimation, + kDynamicSearchUpdateAnimationVariations, + "LauncherDynamicAnimations")}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"smart-suggestion-for-large-downloads", + flag_descriptions::kSmartSuggestionForLargeDownloadsName, + flag_descriptions::kSmartSuggestionForLargeDownloadsDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(download::features::kSmartSuggestionForLargeDownloads)}, + + {"quick-delete-android-survey", + flag_descriptions::kQuickDeleteAndroidSurveyName, + flag_descriptions::kQuickDeleteAndroidSurveyDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kQuickDeleteAndroidSurvey)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"pwa-update-dialog-for-icon", + flag_descriptions::kPwaUpdateDialogForAppIconName, + flag_descriptions::kPwaUpdateDialogForAppIconDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kPwaUpdateDialogForIcon)}, + + {"keyboard-lock-prompt", flag_descriptions::kKeyboardLockPromptName, + flag_descriptions::kKeyboardLockPromptDescription, kOsDesktop, + FEATURE_VALUE_TYPE(permissions::features::kKeyboardLockPrompt)}, + + {"press-and-hold-esc-to-exit-browser-fullscreen", + flag_descriptions::kPressAndHoldEscToExitBrowserFullscreenName, + flag_descriptions::kPressAndHoldEscToExitBrowserFullscreenDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(features::kPressAndHoldEscToExitBrowserFullscreen)}, + +#if BUILDFLAG(ENABLE_OOP_PRINTING) + {"enable-oop-print-drivers", flag_descriptions::kEnableOopPrintDriversName, + flag_descriptions::kEnableOopPrintDriversDescription, kOsDesktop, + FEATURE_VALUE_TYPE(printing::features::kEnableOopPrintDrivers)}, +#endif + +#if BUILDFLAG(IS_ANDROID) + {"media-picker-adoption", flag_descriptions::kMediaPickerAdoptionStudyName, + flag_descriptions::kMediaPickerAdoptionStudyDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + photo_picker::features::kAndroidMediaPickerAdoption, + kPhotoPickerAdoptionStudyFeatureVariations, + "MediaPickerAdoption")}, +#endif // BUILDFLAG(IS_ANDROID) + + {"privacy-sandbox-internals", + flag_descriptions::kPrivacySandboxInternalsName, + flag_descriptions::kPrivacySandboxInternalsDescription, kOsAll, + FEATURE_VALUE_TYPE(privacy_sandbox::kPrivacySandboxInternalsDevUI)}, + + {"align-surface-layer-impl-to-pixel-grid", + flag_descriptions::kAlignSurfaceLayerImplToPixelGridName, + flag_descriptions::kAlignSurfaceLayerImplToPixelGridDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kAlignSurfaceLayerImplToPixelGrid)}, + +#if !BUILDFLAG(IS_ANDROID) + {"sct-auditing", flag_descriptions::kSCTAuditingName, + flag_descriptions::kSCTAuditingDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kSCTAuditing, + kSCTAuditingVariations, + "SCTAuditingVariations")}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"incognito-screenshot", flag_descriptions::kIncognitoScreenshotName, + flag_descriptions::kIncognitoScreenshotDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kIncognitoScreenshot)}, +#endif + + {"enable-speculation-rules-prerendering-target-hint", + flag_descriptions::kSpeculationRulesPrerenderingTargetHintName, + flag_descriptions::kSpeculationRulesPrerenderingTargetHintDescription, + kOsAll, FEATURE_VALUE_TYPE(blink::features::kPrerender2InNewTab)}, + + {"prerender-early-document-lifecycle-update", + flag_descriptions::kPrerender2EarlyDocumentLifecycleUpdateName, + flag_descriptions::kPrerender2EarlyDocumentLifecycleUpdateDescription, + kOsAll, + FEATURE_VALUE_TYPE( + blink::features::kPrerender2EarlyDocumentLifecycleUpdate)}, + + {"trees-in-viz", flag_descriptions::kTreesInVizName, + flag_descriptions::kTreesInVizDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kTreesInViz)}, + + {"omnibox-search-prefetch", + flag_descriptions::kEnableOmniboxSearchPrefetchName, + flag_descriptions::kEnableOmniboxSearchPrefetchDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(kSearchPrefetchServicePrefetching, + kSearchPrefetchServicePrefetchingVariations, + "SearchSuggestionPrefetch")}, + {"omnibox-search-client-prefetch", + flag_descriptions::kEnableOmniboxClientSearchPrefetchName, + flag_descriptions::kEnableOmniboxClientSearchPrefetchDescription, kOsAll, + FEATURE_VALUE_TYPE(kSearchNavigationPrefetch)}, + +#if BUILDFLAG(IS_ANDROID) + {"autofill-enable-offers-in-clank-keyboard-accessory", + flag_descriptions::kAutofillEnableOffersInClankKeyboardAccessoryName, + flag_descriptions:: + kAutofillEnableOffersInClankKeyboardAccessoryDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableOffersInClankKeyboardAccessory)}, +#endif + +#if BUILDFLAG(ENABLE_PDF) + {"pdf-xfa-forms", flag_descriptions::kPdfXfaFormsName, + flag_descriptions::kPdfXfaFormsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(chrome_pdf::features::kPdfXfaSupport)}, +#endif // BUILDFLAG(ENABLE_PDF) + + {"enable-managed-configuration-web-api", + flag_descriptions::kEnableManagedConfigurationWebApiName, + flag_descriptions::kEnableManagedConfigurationWebApiDescription, kOsCrOS, + FEATURE_VALUE_TYPE(blink::features::kManagedConfiguration)}, + + {"clear-cross-site-cross-browsing-context-group-window-name", + flag_descriptions::kClearCrossSiteCrossBrowsingContextGroupWindowNameName, + flag_descriptions:: + kClearCrossSiteCrossBrowsingContextGroupWindowNameDescription, + kOsAll, + FEATURE_VALUE_TYPE( + features::kClearCrossSiteCrossBrowsingContextGroupWindowName)}, + +#if BUILDFLAG(IS_CHROMEOS) + {kWallpaperFastRefreshInternalName, + flag_descriptions::kWallpaperFastRefreshName, + flag_descriptions::kWallpaperFastRefreshDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kWallpaperFastRefresh)}, + {kWallpaperGooglePhotosSharedAlbumsInternalName, + flag_descriptions::kWallpaperGooglePhotosSharedAlbumsName, + flag_descriptions::kWallpaperGooglePhotosSharedAlbumsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kWallpaperGooglePhotosSharedAlbums)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) + {"enable-get-all-screens-media", flag_descriptions::kGetAllScreensMediaName, + flag_descriptions::kGetAllScreensMediaDescription, kOsCrOS | kOsLinux, + FEATURE_VALUE_TYPE(blink::features::kGetAllScreensMedia)}, +#endif // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-run-on-os-login", flag_descriptions::kRunOnOsLoginName, + flag_descriptions::kRunOnOsLoginDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kDesktopPWAsRunOnOsLogin)}, + {"enable-prevent-close", flag_descriptions::kPreventCloseName, + flag_descriptions::kPreventCloseDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kDesktopPWAsPreventClose)}, + + {"enable-cloud-identifiers", + flag_descriptions::kFileSystemAccessGetCloudIdentifiersName, + flag_descriptions::kFileSystemAccessGetCloudIdentifiersDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(blink::features::kFileSystemAccessGetCloudIdentifiers)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"enable-global-vaapi-lock", flag_descriptions::kGlobalVaapiLockName, + flag_descriptions::kGlobalVaapiLockDescription, kOsCrOS | kOsLinux, + FEATURE_VALUE_TYPE(media::kGlobalVaapiLock)}, + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) + { + "ui-debug-tools", + flag_descriptions::kUIDebugToolsName, + flag_descriptions::kUIDebugToolsDescription, + kOsWin | kOsLinux | kOsMac, + FEATURE_VALUE_TYPE(features::kUIDebugTools), + }, + +#endif +#if BUILDFLAG(IS_ANDROID) + {"optimization-guide-personalized-fetching", + flag_descriptions::kOptimizationGuidePersonalizedFetchingName, + flag_descriptions::kOptimizationGuidePersonalizedFetchingDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + optimization_guide::features::kOptimizationGuidePersonalizedFetching, + kOptimizationGuidePersonalizedFetchingAllowPageInsightsVariations, + "OptimizationGuidePersonalizedFetchingAllowPageInsights")}, + {"optimization-guide-push-notifications", + flag_descriptions::kOptimizationGuidePushNotificationName, + flag_descriptions::kOptimizationGuidePushNotificationDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(optimization_guide::features::kPushNotifications)}, +#endif + + {"fedcm-alternative-identifiers", + flag_descriptions::kFedCmAlternativeIdentifiersName, + flag_descriptions::kFedCmAlternativeIdentifiersDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kFedCmAlternativeIdentifiers)}, + + {"fedcm-autofill", flag_descriptions::kFedCmAutofillName, + flag_descriptions::kFedCmAutofillDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kFedCmAutofill)}, + + {"fedcm-delegation", flag_descriptions::kFedCmDelegationName, + flag_descriptions::kFedCmDelegationDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kFedCmDelegation)}, + + {"fedcm-idp-registration", flag_descriptions::kFedCmIdPRegistrationName, + flag_descriptions::kFedCmIdPRegistrationDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kFedCmIdPRegistration)}, + + {"fedcm-iframe-origin", flag_descriptions::kFedCmIframeOriginName, + flag_descriptions::kFedCmIframeOriginDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kFedCmIframeOrigin)}, + + {"fedcm-lightweight-mode", flag_descriptions::kFedCmLightweightModeName, + flag_descriptions::kFedCmLightweightModeDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kFedCmLightweightMode)}, + + {"fedcm-metrics-endpoint", flag_descriptions::kFedCmMetricsEndpointName, + flag_descriptions::kFedCmMetricsEndpointDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kFedCmMetricsEndpoint)}, + + {"fedcm-without-well-known-enforcement", + flag_descriptions::kFedCmWithoutWellKnownEnforcementName, + flag_descriptions::kFedCmWithoutWellKnownEnforcementDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kFedCmWithoutWellKnownEnforcement)}, + + {"fedcm-segmentation-platform", + flag_descriptions::kFedCmSegmentationPlatformName, + flag_descriptions::kFedCmSegmentationPlatformDescription, kOsAll, + FEATURE_VALUE_TYPE( + segmentation_platform::features::kSegmentationPlatformFedCmUser)}, + + {"web-identity-digital-credentials", + flag_descriptions::kWebIdentityDigitalCredentialsName, + flag_descriptions::kWebIdentityDigitalCredentialsDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + features::kWebIdentityDigitalCredentials, + kWebIdentityDigitalIdentityCredentialVariations, + "WebIdentityDigitalCredentials")}, + + {"web-identity-digital-credentials-creation", + flag_descriptions::kWebIdentityDigitalCredentialsCreationName, + flag_descriptions::kWebIdentityDigitalCredentialsCreationDescription, + kOsAll, + FEATURE_VALUE_TYPE(features::kWebIdentityDigitalCredentialsCreation)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-input-event-logging", + flag_descriptions::kEnableInputEventLoggingName, + flag_descriptions::kEnableInputEventLoggingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ui::kEnableInputEventLogging)}, +#endif + + {flag_descriptions::kEnableLensStandaloneFlagId, + flag_descriptions::kEnableLensStandaloneName, + flag_descriptions::kEnableLensStandaloneDescription, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensStandalone)}, + +#if !BUILDFLAG(IS_ANDROID) + {"enable-lens-overlay", flag_descriptions::kLensOverlayName, + flag_descriptions::kLensOverlayDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(lens::features::kLensOverlay, + kLensOverlayVariations, + "LensOverlay")}, +#endif + +#if BUILDFLAG(IS_ANDROID) + {"enable-legacy-tabstate-deprecation", + flag_descriptions::kLegacyTabStateDeprecationName, + flag_descriptions::kLegacyTabStateDeprecationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kLegacyTabStateDeprecation)}, + + {"enable-cleanup-legacy-tabstate", + flag_descriptions::kCleanupLegacyTabStateName, + flag_descriptions::kCleanupLegacyTabStateDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kCleanupLegacyTabState)}, + + {"biometric-reauth-password-filling", + flag_descriptions::kBiometricReauthForPasswordFillingName, + flag_descriptions::kBiometricReauthForPasswordFillingDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(password_manager::features::kBiometricTouchToFill)}, +#endif + + {"bind-cookies-to-port", flag_descriptions::kBindCookiesToPortName, + flag_descriptions::kBindCookiesToPortDescription, kOsAll, + FEATURE_VALUE_TYPE(net::features::kEnablePortBoundCookies)}, + + {"bind-cookies-to-scheme", flag_descriptions::kBindCookiesToSchemeName, + flag_descriptions::kBindCookiesToSchemeDescription, kOsAll, + FEATURE_VALUE_TYPE(net::features::kEnableSchemeBoundCookies)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-keyboard-rewriter-fix", + flag_descriptions::kEnableKeyboardRewriterFixName, + flag_descriptions::kEnableKeyboardRewriterFixDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableKeyboardRewriterFix)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"align-wakeups", flag_descriptions::kAlignWakeUpsName, + flag_descriptions::kAlignWakeUpsDescription, kOsAll, + FEATURE_VALUE_TYPE(base::kAlignWakeUps)}, + +#if BUILDFLAG(ENABLE_VALIDATING_COMMAND_DECODER) + {"use-passthrough-command-decoder", + flag_descriptions::kUsePassthroughCommandDecoderName, + flag_descriptions::kUsePassthroughCommandDecoderDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kDefaultPassthroughCommandDecoder)}, +#endif // BUILDFLAG(ENABLE_VALIDATING_COMMAND_DECODER) + +#if BUILDFLAG(ENABLE_SWIFTSHADER) + {"enable-unsafe-swiftshader", + flag_descriptions::kEnableUnsafeSwiftShaderName, + flag_descriptions::kEnableUnsafeSwiftShaderDescription, kOsAll, + SINGLE_VALUE_TYPE(switches::kEnableUnsafeSwiftShader)}, +#endif // BUILDFLAG(ENABLE_SWIFTSHADER) + +#if BUILDFLAG(IS_CHROMEOS) + {"focus-follows-cursor", flag_descriptions::kFocusFollowsCursorName, + flag_descriptions::kFocusFollowsCursorDescription, kOsCrOS, + FEATURE_VALUE_TYPE(::features::kFocusFollowsCursor)}, + {"print-preview-cros-primary", + flag_descriptions::kPrintPreviewCrosPrimaryName, + flag_descriptions::kPrintPreviewCrosPrimaryDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kPrintPreviewCrosPrimary)}, +#endif + + {"prerender2", flag_descriptions::kPrerender2Name, + flag_descriptions::kPrerender2Description, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kPrerender2)}, + + {"prerender2-reuse-host", flag_descriptions::kPrerender2ReuseHostName, + flag_descriptions::kPrerender2ReuseHostDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kPrerender2ReuseHost)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-phone-hub-call-notification", + flag_descriptions::kPhoneHubCallNotificationName, + flag_descriptions::kPhoneHubCallNotificationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kPhoneHubCallNotification)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"test-third-party-cookie-phaseout", + flag_descriptions::kTestThirdPartyCookiePhaseoutName, + flag_descriptions::kTestThirdPartyCookiePhaseoutDescription, kOsAll, + SINGLE_VALUE_TYPE(network::switches::kTestThirdPartyCookiePhaseout)}, + + {"tpc-phase-out-facilitated-testing", + flag_descriptions::kTPCPhaseOutFacilitatedTestingName, + flag_descriptions::kTPCPhaseOutFacilitatedTestingDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + features::kCookieDeprecationFacilitatedTesting, + kTPCPhaseOutFacilitatedTestingVariations, + "TPCPhaseOutFacilitatedTesting")}, + + {"tpcd-heuristics-grants", flag_descriptions::kTpcdHeuristicsGrantsName, + flag_descriptions::kTpcdHeuristicsGrantsDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + content_settings::features::kTpcdHeuristicsGrants, + kTpcdHeuristicsGrantsVariations, + "TpcdHeuristicsGrants")}, + + {"tpcd-metadata-grants", flag_descriptions::kTpcdMetadataGrantsName, + flag_descriptions::kTpcdMetadataGrantsDescription, kOsAll, + FEATURE_VALUE_TYPE(net::features::kTpcdMetadataGrants)}, + +#if BUILDFLAG(IS_CHROMEOS) + {kBackgroundListeningName, flag_descriptions::kBackgroundListeningName, + flag_descriptions::kBackgroundListeningDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media::kBackgroundListening)}, + {kBorealisBigGlInternalName, flag_descriptions::kBorealisBigGlName, + flag_descriptions::kBorealisBigGlDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kBorealisBigGl)}, + {kBorealisDGPUInternalName, flag_descriptions::kBorealisDGPUName, + flag_descriptions::kBorealisDGPUDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kBorealisDGPU)}, + {kBorealisEnableUnsupportedHardwareInternalName, + flag_descriptions::kBorealisEnableUnsupportedHardwareName, + flag_descriptions::kBorealisEnableUnsupportedHardwareDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kBorealisEnableUnsupportedHardware)}, + {kBorealisForceBetaClientInternalName, + flag_descriptions::kBorealisForceBetaClientName, + flag_descriptions::kBorealisForceBetaClientDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kBorealisForceBetaClient)}, + {kBorealisForceDoubleScaleInternalName, + flag_descriptions::kBorealisForceDoubleScaleName, + flag_descriptions::kBorealisForceDoubleScaleDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kBorealisForceDoubleScale)}, + {kBorealisLinuxModeInternalName, flag_descriptions::kBorealisLinuxModeName, + flag_descriptions::kBorealisLinuxModeDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kBorealisLinuxMode)}, + {kBorealisPermittedInternalName, flag_descriptions::kBorealisPermittedName, + flag_descriptions::kBorealisPermittedDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kBorealisPermitted)}, + {kBorealisProvisionInternalName, flag_descriptions::kBorealisProvisionName, + flag_descriptions::kBorealisProvisionDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kBorealisProvision)}, + {kBorealisScaleClientByDPIInternalName, + flag_descriptions::kBorealisScaleClientByDPIName, + flag_descriptions::kBorealisScaleClientByDPIDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kBorealisScaleClientByDPI)}, + {kBorealisZinkGlDriverInternalName, + flag_descriptions::kBorealisZinkGlDriverName, + flag_descriptions::kBorealisZinkGlDriverDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE(ash::features::kBorealisZinkGlDriver, + kBorealisZinkGlDriverVariations, + "BorealisZinkGlDriver")}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"https-first-balanced-mode", + flag_descriptions::kHttpsFirstBalancedModeName, + flag_descriptions::kHttpsFirstBalancedModeDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(features::kHttpsFirstBalancedMode)}, + + {"https-first-dialog-ui", flag_descriptions::kHttpsFirstDialogUiName, + flag_descriptions::kHttpsFirstDialogUiDescription, kOsDesktop, + FEATURE_VALUE_TYPE(security_interstitials::features::kHttpsFirstDialogUi)}, + + {"https-first-mode-v2-for-engaged-sites", + flag_descriptions::kHttpsFirstModeV2ForEngagedSitesName, + flag_descriptions::kHttpsFirstModeV2ForEngagedSitesDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(features::kHttpsFirstModeV2ForEngagedSites)}, + + {"https-upgrades", flag_descriptions::kHttpsUpgradesName, + flag_descriptions::kHttpsUpgradesDescription, kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(features::kHttpsUpgrades)}, + + {"https-first-mode-incognito", + flag_descriptions::kHttpsFirstModeIncognitoName, + flag_descriptions::kHttpsFirstModeIncognitoDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(features::kHttpsFirstModeIncognito)}, + + {"https-first-mode-incognito-new-settings", + flag_descriptions::kHttpsFirstModeIncognitoNewSettingsName, + flag_descriptions::kHttpsFirstModeIncognitoNewSettingsDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(features::kHttpsFirstModeIncognitoNewSettings)}, + + {"https-first-mode-for-typically-secure-users", + flag_descriptions::kHttpsFirstModeForTypicallySecureUsersName, + flag_descriptions::kHttpsFirstModeForTypicallySecureUsersDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(features::kHttpsFirstModeV2ForTypicallySecureUsers)}, + + {"enable-drdc", flag_descriptions::kEnableDrDcName, + flag_descriptions::kEnableDrDcDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kEnableDrDc)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"traffic-counters", flag_descriptions::kTrafficCountersEnabledName, + flag_descriptions::kTrafficCountersEnabledDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kTrafficCountersEnabled)}, + + {"traffic-counters-for-wifi-testing", + flag_descriptions::kTrafficCountersForWiFiTestingName, + flag_descriptions::kTrafficCountersForWiFiTestingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kTrafficCountersForWiFiTesting)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(ENABLE_EXTENSIONS) + {"experimental-omnibox-labs", + flag_descriptions::kExperimentalOmniboxLabsName, + flag_descriptions::kExperimentalOmniboxLabsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(extensions_features::kExperimentalOmniboxLabs)}, + + {kExtensionAiDataInternalName, + flag_descriptions::kExtensionAiDataCollectionName, + flag_descriptions::kExtensionAiDataCollectionDescription, kOsDesktop, + SINGLE_VALUE_TYPE(switches::kExtensionAiDataCollection)}, + + {"extensions-collapse-main-menu", + flag_descriptions::kExtensionsCollapseMainMenuName, + flag_descriptions::kExtensionsCollapseMainMenuDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kExtensionsCollapseMainMenu)}, + + {"extensions-menu-access-control", + flag_descriptions::kExtensionsMenuAccessControlName, + flag_descriptions::kExtensionsMenuAccessControlDescription, kOsDesktop, + FEATURE_VALUE_TYPE(extensions_features::kExtensionsMenuAccessControl)}, + + {"extensions-toolbar-zero-state-variation", + flag_descriptions::kExtensionsToolbarZeroStateName, + flag_descriptions::kExtensionsToolbarZeroStateDescription, kOsDesktop, + MULTI_VALUE_TYPE(kExtensionsToolbarZeroStateChoices)}, + + {"iph-extensions-menu-feature", + flag_descriptions::kIPHExtensionsMenuFeatureName, + flag_descriptions::kIPHExtensionsMenuFeatureDescription, kOsDesktop, + FEATURE_VALUE_TYPE(feature_engagement::kIPHExtensionsMenuFeature)}, + + {"iph-extensions-request-access-button-feature", + flag_descriptions::kIPHExtensionsRequestAccessButtonFeatureName, + flag_descriptions::kIPHExtensionsRequestAccessButtonFeatureDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + feature_engagement::kIPHExtensionsRequestAccessButtonFeature)}, + + {"extension-manifest-v2-deprecation-disabled", + flag_descriptions::kExtensionManifestV2DeprecationDisabledName, + flag_descriptions::kExtensionManifestV2DeprecationDisabledDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(extensions_features::kExtensionManifestV2Disabled)}, + + {"extension-manifest-v2-deprecation-unsupported", + flag_descriptions::kExtensionManifestV2DeprecationUnsupportedName, + flag_descriptions::kExtensionManifestV2DeprecationUnsupportedDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(extensions_features::kExtensionManifestV2Unsupported)}, + +#if BUILDFLAG(IS_WIN) + {"launch-windows-native-hosts-directly", + flag_descriptions::kLaunchWindowsNativeHostsDirectlyName, + flag_descriptions::kLaunchWindowsNativeHostsDirectlyDescription, kOsWin, + FEATURE_VALUE_TYPE( + extensions_features::kLaunchWindowsNativeHostsDirectly)}, +#endif // IS_WIN +#endif // ENABLE_EXTENSIONS + +#if !BUILDFLAG(IS_ANDROID) + {"captured-surface-control", flag_descriptions::kCapturedSurfaceControlName, + flag_descriptions::kCapturedSurfaceControlDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kCapturedSurfaceControl)}, + + {"region-capture-cross-tab", flag_descriptions::kCrossTabRegionCaptureName, + flag_descriptions::kCrossTabRegionCaptureDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kRegionCaptureOfOtherTabs)}, +#endif // !BUILDFLAG(IS_ANDROID) + + {"skia-graphite", flag_descriptions::kSkiaGraphiteName, + flag_descriptions::kSkiaGraphiteDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kSkiaGraphite, + kSkiaGraphiteVariations, + "SkiaGraphite")}, + + {"skia-graphite-precompilation", + flag_descriptions::kSkiaGraphitePrecompilationName, + flag_descriptions::kSkiaGraphitePrecompilationDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kSkiaGraphitePrecompilation)}, + + {"enable-tab-audio-muting", flag_descriptions::kTabAudioMutingName, + flag_descriptions::kTabAudioMutingDescription, kOsDesktop, + FEATURE_VALUE_TYPE(media::kEnableTabMuting)}, + +#if !BUILDFLAG(IS_ANDROID) + {"customize-chrome-side-panel-extensions-card", + flag_descriptions::kCustomizeChromeSidePanelExtensionsCardName, + flag_descriptions::kCustomizeChromeSidePanelExtensionsCardDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kCustomizeChromeSidePanelExtensionsCard)}, + + {"customize-chrome-wallpaper-search", + flag_descriptions::kCustomizeChromeWallpaperSearchName, + flag_descriptions::kCustomizeChromeWallpaperSearchDescription, kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kCustomizeChromeWallpaperSearch)}, + + {"customize-chrome-wallpaper-search-button", + flag_descriptions::kCustomizeChromeWallpaperSearchButtonName, + flag_descriptions::kCustomizeChromeWallpaperSearchButtonDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(ntp_features::kCustomizeChromeWallpaperSearchButton)}, + + {"customize-chrome-wallpaper-search-inspiration-card", + flag_descriptions::kCustomizeChromeWallpaperSearchInspirationCardName, + flag_descriptions:: + kCustomizeChromeWallpaperSearchInspirationCardDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + ntp_features::kCustomizeChromeWallpaperSearchInspirationCard)}, + + {"wallpaper-search-settings-visibility", + flag_descriptions::kWallpaperSearchSettingsVisibilityName, + flag_descriptions::kWallpaperSearchSettingsVisibilityDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(optimization_guide::features::internal:: + kWallpaperSearchSettingsVisibility)}, +#endif + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-component-updater-test-request", + flag_descriptions::kComponentUpdaterTestRequestName, + flag_descriptions::kComponentUpdaterTestRequestDescription, kOsCrOS, + SINGLE_VALUE_TYPE_AND_VALUE(switches::kComponentUpdater, + component_updater::kSwitchTestRequestParam)}, + + {kGrowthCampaignsTestTag, + flag_descriptions::kCampaignsComponentUpdaterTestTagName, + flag_descriptions::kCampaignsComponentUpdaterTestTagDescription, kOsCrOS, + STRING_VALUE_TYPE(switches::kCampaignsTestTag, "")}, + + {kGrowthCampaigns, flag_descriptions::kCampaignsOverrideName, + flag_descriptions::kCampaignsOverrideDescription, kOsCrOS, + STRING_VALUE_TYPE(ash::switches::kGrowthCampaigns, "")}, + + {"demo-mode-test-tag", + flag_descriptions::kDemoModeComponentUpdaterTestTagName, + flag_descriptions::kDemoModeComponentUpdaterTestTagDescription, kOsCrOS, + STRING_VALUE_TYPE(switches::kDemoModeTestTag, "")}, +#endif + +#if BUILDFLAG(IS_WIN) + {"enable-delegated-compositing", + flag_descriptions::kEnableDelegatedCompositingName, + flag_descriptions::kEnableDelegatedCompositingDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kDelegatedCompositing)}, +#endif + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || \ + BUILDFLAG(IS_CHROMEOS) + {"media-session-enter-picture-in-picture", + flag_descriptions::kMediaSessionEnterPictureInPictureName, + flag_descriptions::kMediaSessionEnterPictureInPictureDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kMediaSessionEnterPictureInPicture)}, + + {"auto-picture-in-picture-for-video-playback", + flag_descriptions::kAutoPictureInPictureForVideoPlaybackName, + flag_descriptions::kAutoPictureInPictureForVideoPlaybackDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(media::kAutoPictureInPictureForVideoPlayback)}, + + {"video-picture-in-picture-controls-update-2024", + flag_descriptions::kVideoPictureInPictureControlsUpdate2024Name, + flag_descriptions::kVideoPictureInPictureControlsUpdate2024Description, + kOsDesktop, + FEATURE_VALUE_TYPE(media::kVideoPictureInPictureControlsUpdate2024)}, + + {"document-picture-in-picture-animate-resize", + flag_descriptions::kDocumentPictureInPictureAnimateResizeName, + flag_descriptions::kDocumentPictureInPictureAnimateResizeDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(media::kDocumentPictureInPictureAnimateResize)}, + + {"browser-initiated-automatic-picture-in-picture", + flag_descriptions::kBrowserInitiatedAutomaticPictureInPictureName, + flag_descriptions::kBrowserInitiatedAutomaticPictureInPictureDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + blink::features::kBrowserInitiatedAutomaticPictureInPicture)}, + + {"picture-in-picture-show-window-animation", + flag_descriptions::kPictureInPictureShowWindowAnimationName, + flag_descriptions::kPictureInPictureShowWindowAnimationDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(media::kPictureInPictureShowWindowAnimation)}, + +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || + // BUILDFLAG(IS_CHROMEOS) + + {"document-patching", flag_descriptions::kDocumentPatchingName, + flag_descriptions::kDocumentPatchingDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kDocumentPatching)}, + + {"dse-preload2", flag_descriptions::kDsePreload2Name, + flag_descriptions::kDsePreload2Description, kOsAll, + FEATURE_VALUE_TYPE(features::kDsePreload2)}, + {"dse-preload2-on-press", flag_descriptions::kDsePreload2OnPressName, + flag_descriptions::kDsePreload2OnPressDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kDsePreload2OnPress)}, + + {"http-cache-no-vary-search", flag_descriptions::kHttpCacheNoVarySearchName, + flag_descriptions::kHttpCacheNoVarySearchDescription, kOsAll, + FEATURE_VALUE_TYPE(net::features::kHttpCacheNoVarySearch)}, + + {"http-cache-custom-backend", + flag_descriptions::kHttpCacheCustomBackendName, + flag_descriptions::kHttpCacheCustomBackendDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(net::features::kDiskCacheBackendExperiment, + kDiskCacheBackendExperimentVariations, + "DiskCacheBackendExperiment")}, + +#if !BUILDFLAG(IS_ANDROID) + {"audio-ducking", flag_descriptions::kAudioDuckingName, + flag_descriptions::kAudioDuckingDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(media::kAudioDucking, + kAudioDuckingAttenuationVariations, + "AudioDucking")}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-libinput-to-handle-touchpad", + flag_descriptions::kEnableLibinputToHandleTouchpadName, + flag_descriptions::kEnableLibinputToHandleTouchpadDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ui::kLibinputHandleTouchpad)}, + + {"enable-desks-templates", flag_descriptions::kDesksTemplatesName, + flag_descriptions::kDesksTemplatesDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kDesksTemplates)}, + + {"vc-background-replace", flag_descriptions::kVcBackgroundReplaceName, + flag_descriptions::kVcBackgroundReplaceDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kVcBackgroundReplace)}, + + {"vc-relighting-inference-backend", + flag_descriptions::kVcRelightingInferenceBackendName, + flag_descriptions::kVcRelightingInferenceBackendDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE( + ash::features::kVcRelightingInferenceBackend, + kVcRelightingInferenceBackendVariations, + "VcRelightingInferenceBackend")}, + {"vc-retouch-inference-backend", + flag_descriptions::kVcRetouchInferenceBackendName, + flag_descriptions::kVcRetouchInferenceBackendDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE(ash::features::kVcRetouchInferenceBackend, + kVcRetouchInferenceBackendVariations, + "VcRetouchInferenceBackend")}, + {"vc-segmentation-model", flag_descriptions::kVcSegmentationModelName, + flag_descriptions::kVcSegmentationModelDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE(ash::features::kVcSegmentationModel, + kVcSegmentationModelVariations, + "VCSegmentationModel")}, + {"vc-segmentation-inference-backend", + flag_descriptions::kVcSegmentationInferenceBackendName, + flag_descriptions::kVcSegmentationInferenceBackendDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE( + ash::features::kVcSegmentationInferenceBackend, + kVcSegmentationInferenceBackendVariations, + "VcSegmentationInferenceBackend")}, + {"vc-light-intensity", flag_descriptions::kVcLightIntensityName, + flag_descriptions::kVcLightIntensityDescription, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE(ash::features::kVcLightIntensity, + kVcLightIntensityVariations, + "VCLightIntensity")}, + {"vc-web-api", flag_descriptions::kVcWebApiName, + flag_descriptions::kVcWebApiDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kVcWebApi)}, + {kVcTrayMicIndicatorInternalName, + flag_descriptions::kVcTrayMicIndicatorName, + flag_descriptions::kVcTrayMicIndicatorDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kVcTrayMicIndicator)}, + {kVcTrayTitleHeaderInternalName, flag_descriptions::kVcTrayTitleHeaderName, + flag_descriptions::kVcTrayTitleHeaderDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kVcTrayTitleHeader)}, +#endif + +#if BUILDFLAG(IS_ANDROID) + {"animated-image-drag-shadow", + flag_descriptions::kAnimatedImageDragShadowName, + flag_descriptions::kAnimatedImageDragShadowDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAnimatedImageDragShadow)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"main-node-annotations", flag_descriptions::kMainNodeAnnotationsName, + flag_descriptions::kMainNodeAnnotationsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kMainNodeAnnotations)}, +#endif + + {"origin-agent-cluster-default", + flag_descriptions::kOriginAgentClusterDefaultName, + flag_descriptions::kOriginAgentClusterDefaultDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kOriginAgentClusterDefaultEnabled)}, + + {"origin-keyed-processes-by-default", + flag_descriptions::kOriginKeyedProcessesByDefaultName, + flag_descriptions::kOriginKeyedProcessesByDefaultDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kOriginKeyedProcessesByDefault)}, + + {"collaboration-messaging", flag_descriptions::kCollaborationMessagingName, + flag_descriptions::kCollaborationMessagingDescription, kOsAll, + FEATURE_VALUE_TYPE(collaboration::features::kCollaborationMessaging)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-fake-keyboard-heuristic", + flag_descriptions::kEnableFakeKeyboardHeuristicName, + flag_descriptions::kEnableFakeKeyboardHeuristicDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ui::kEnableFakeKeyboardHeuristic)}, + {"enable-fake-mouse-heuristic", + flag_descriptions::kEnableFakeMouseHeuristicName, + flag_descriptions::kEnableFakeMouseHeuristicDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ui::kEnableFakeMouseHeuristic)}, +#endif // BUILDFLAG(IS_CHROMEOS) + {"enable-isolated-sandboxed-iframes", + flag_descriptions::kIsolatedSandboxedIframesName, + flag_descriptions::kIsolatedSandboxedIframesDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + blink::features::kIsolateSandboxedIframes, + kIsolateSandboxedIframesGroupingVariations, + "IsolateSandboxedIframes" /* trial name */)}, + + {"reduce-accept-language", flag_descriptions::kReduceAcceptLanguageName, + flag_descriptions::kReduceAcceptLanguageDescription, kOsAll, + FEATURE_VALUE_TYPE(network::features::kReduceAcceptLanguage)}, + + {"reduce-accept-language-http", + flag_descriptions::kReduceAcceptLanguageHTTPName, + flag_descriptions::kReduceAcceptLanguageHTTPDescription, kOsAll, + FEATURE_VALUE_TYPE(network::features::kReduceAcceptLanguageHTTP)}, + + {"reduce-transfer-size-updated-ipc", + flag_descriptions::kReduceTransferSizeUpdatedIPCName, + flag_descriptions::kReduceTransferSizeUpdatedIPCDescription, kOsAll, + FEATURE_VALUE_TYPE(network::features::kReduceTransferSizeUpdatedIPC)}, + +#if BUILDFLAG(IS_LINUX) + {"reduce-user-agent-data-linux-platform-version", + flag_descriptions::kReduceUserAgentDataLinuxPlatformVersionName, + flag_descriptions::kReduceUserAgentDataLinuxPlatformVersionDescription, + kOsLinux, + FEATURE_VALUE_TYPE( + blink::features::kReduceUserAgentDataLinuxPlatformVersion)}, +#endif // BUILDFLAG(IS_LINUX) + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-variable-refresh-rate", + flag_descriptions::kEnableVariableRefreshRateName, + flag_descriptions::kEnableVariableRefreshRateDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kEnableVariableRefreshRate)}, + + {"enable-projector-app-debug", flag_descriptions::kProjectorAppDebugName, + flag_descriptions::kProjectorAppDebugDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kProjectorAppDebug)}, + + {kProjectorServerSideSpeechRecognition, + flag_descriptions::kProjectorServerSideSpeechRecognitionName, + flag_descriptions::kProjectorServerSideSpeechRecognitionDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kInternalServerSideSpeechRecognition)}, + + {"enable-projector-server-side-usm", + flag_descriptions::kProjectorServerSideUsmName, + flag_descriptions::kProjectorServerSideUsmDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kProjectorUseUSMForS3)}, + + {"enable-annotator-mode", flag_descriptions::kAnnotatorModeName, + flag_descriptions::kAnnotatorModeDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kAnnotatorMode)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"approximate-geolocation-permission", + flag_descriptions::kApproximateGeolocationPermissionName, + flag_descriptions::kApproximateGeolocationPermissionDescription, + kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + content_settings::features::kApproximateGeolocationPermission, + kApproximateGeolocationPermissionVariations, + "ApproximateGeolocationPermission")}, +#endif // BUILDFLAG(IS_ANDROID) + + {"omit-cors-client-cert", flag_descriptions::kOmitCorsClientCertName, + flag_descriptions::kOmitCorsClientCertDescription, kOsAll, + FEATURE_VALUE_TYPE(network::features::kOmitCorsClientCert)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"always-enable-hdcp", flag_descriptions::kAlwaysEnableHdcpName, + flag_descriptions::kAlwaysEnableHdcpDescription, kOsCrOS, + MULTI_VALUE_TYPE(kAlwaysEnableHdcpChoices)}, + {"enable-touchpads-in-diagnostics-app", + flag_descriptions::kEnableTouchpadsInDiagnosticsAppName, + flag_descriptions::kEnableTouchpadsInDiagnosticsAppDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableTouchpadsInDiagnosticsApp)}, + {"enable-touchscreens-in-diagnostics-app", + flag_descriptions::kEnableTouchscreensInDiagnosticsAppName, + flag_descriptions::kEnableTouchscreensInDiagnosticsAppDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableTouchscreensInDiagnosticsApp)}, + {"enable-external-keyboards-in-diagnostics-app", + flag_descriptions::kEnableExternalKeyboardsInDiagnosticsAppName, + flag_descriptions::kEnableExternalKeyboardsInDiagnosticsAppDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableExternalKeyboardsInDiagnostics)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"pwa-restore-backend", flag_descriptions::kPwaRestoreBackendName, + flag_descriptions::kPwaRestoreBackendDescription, kOsAndroid, + FEATURE_VALUE_TYPE(syncer::kWebApkBackupAndRestoreBackend)}, + + {"pwa-restore-ui", flag_descriptions::kPwaRestoreUiName, + flag_descriptions::kPwaRestoreUiDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kPwaRestoreUi)}, + + {"pwa-restore-ui-at-startup", flag_descriptions::kPwaRestoreUiAtStartupName, + flag_descriptions::kPwaRestoreUiAtStartupDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kPwaRestoreUiAtStartup)}, +#endif // BUILDFLAG(IS_ANDROID) + {"autofill-enable-ranking-formula-address-profiles", + flag_descriptions::kAutofillEnableRankingFormulaAddressProfilesName, + flag_descriptions::kAutofillEnableRankingFormulaAddressProfilesDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableRankingFormulaAddressProfiles)}, + + {"autofill-enable-ranking-formula-credit-cards", + flag_descriptions::kAutofillEnableRankingFormulaCreditCardsName, + flag_descriptions::kAutofillEnableRankingFormulaCreditCardsDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableRankingFormulaCreditCards)}, + + {"safe-browsing-local-lists-use-sbv5", + flag_descriptions::kSafeBrowsingLocalListsUseSBv5Name, + flag_descriptions::kSafeBrowsingLocalListsUseSBv5Description, kOsAll, + FEATURE_VALUE_TYPE(safe_browsing::kLocalListsUseSBv5)}, + + {"xslt", flag_descriptions::kXSLTName, flag_descriptions::kXSLTDescription, + kOsAll, FEATURE_VALUE_TYPE(blink::features::kXSLT)}, + +#if BUILDFLAG(ENABLE_SYMPHONIA) + {"symphonia-audio-decoding", flag_descriptions::kSymphoniaAudioDecodingName, + flag_descriptions::kSymphoniaAudioDecodingDescription, kOsAll, + FEATURE_VALUE_TYPE(media::kSymphoniaAudioDecoding)}, +#endif + + {"safety-check-unused-site-permissions", + flag_descriptions::kSafetyCheckUnusedSitePermissionsName, + flag_descriptions::kSafetyCheckUnusedSitePermissionsDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + content_settings::features::kSafetyCheckUnusedSitePermissions, + kSafetyCheckUnusedSitePermissionsVariations, + "SafetyCheckUnusedSitePermissions")}, + + {"safety-hub", flag_descriptions::kSafetyHubName, + flag_descriptions::kSafetyHubDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(safety_check::features::kSafetyHub, + kSafetyHubVariations, + "SafetyHub")}, + + {"permission-site-settings-radio-button", + flag_descriptions::kPermissionSiteSettingsRadioButtonName, + flag_descriptions::kPermissionSiteSettingsRadioButtonDescription, kOsAll, + FEATURE_VALUE_TYPE( + permissions::features::kPermissionSiteSettingsRadioButton)}, + +#if BUILDFLAG(IS_ANDROID) + {"safety-hub-magic-stack", flag_descriptions::kSafetyHubMagicStackName, + flag_descriptions::kSafetyHubMagicStackDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kSafetyHubMagicStack)}, + + {"safety-hub-followup", flag_descriptions::kSafetyHubFollowupName, + flag_descriptions::kSafetyHubFollowupDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kSafetyHubFollowup)}, + + {"safety-hub-android-survey", + flag_descriptions::kSafetyHubAndroidSurveyName, + flag_descriptions::kSafetyHubAndroidSurveyDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kSafetyHubAndroidSurvey)}, + + {"safety-hub-android-survey-v2", + flag_descriptions::kSafetyHubAndroidSurveyV2Name, + flag_descriptions::kSafetyHubAndroidSurveyV2Description, kOsAndroid, + FEATURE_VALUE_TYPE(features::kSafetyHubAndroidSurveyV2)}, + + {"safety-hub-weak-reused-passwords", + flag_descriptions::kSafetyHubWeakAndReusedPasswordsName, + flag_descriptions::kSafetyHubWeakAndReusedPasswordsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kSafetyHubWeakAndReusedPasswords)}, + + {"safety-hub-local-passwords-module", + flag_descriptions::kSafetyHubLocalPasswordsModuleName, + flag_descriptions::kSafetyHubLocalPasswordsModuleDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kSafetyHubLocalPasswordsModule)}, + + {"safety-hub-unified-passwords-module", + flag_descriptions::kSafetyHubUnifiedPasswordsModuleName, + flag_descriptions::kSafetyHubUnifiedPasswordsModuleDescription, kOsAndroid, + MULTI_VALUE_TYPE(kSafetyHubUnifiedPasswordsModuleChoices)}, +#else + {"safety-hub-one-off-survey", + flag_descriptions::kSafetyHubHaTSOneOffSurveyName, + flag_descriptions::kSafetyHubHaTSOneOffSurveyDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kSafetyHubHaTSOneOffSurvey)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) + {"enable-web-bluetooth-confirm-pairing-support", + flag_descriptions::kWebBluetoothConfirmPairingSupportName, + flag_descriptions::kWebBluetoothConfirmPairingSupportDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(device::features::kWebBluetoothConfirmPairingSupport)}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) + + {"enable-perfetto-system-tracing", + flag_descriptions::kEnablePerfettoSystemTracingName, + flag_descriptions::kEnablePerfettoSystemTracingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kEnablePerfettoSystemTracing)}, + +#if BUILDFLAG(IS_ANDROID) + {"browsing-data-model-clank", flag_descriptions::kBrowsingDataModelName, + flag_descriptions::kBrowsingDataModelDescription, kOsAndroid, + FEATURE_VALUE_TYPE(browsing_data::features::kBrowsingDataModel)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-seamless-refresh-rate-switching", + flag_descriptions::kEnableSeamlessRefreshRateSwitchingName, + flag_descriptions::kEnableSeamlessRefreshRateSwitchingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSeamlessRefreshRateSwitching)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"click-to-call", flag_descriptions::kClickToCallName, + flag_descriptions::kClickToCallDescription, kOsAll, + FEATURE_VALUE_TYPE(kClickToCall)}, + + {"css-gamut-mapping", flag_descriptions::kCssGamutMappingName, + flag_descriptions::kCssGamutMappingDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kBakedGamutMapping)}, + + {"clipboard-maximum-age", flag_descriptions::kClipboardMaximumAgeName, + flag_descriptions::kClipboardMaximumAgeDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(kClipboardMaximumAge, + kClipboardMaximumAgeVariations, + "ClipboardMaximumAge")}, + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-media-dynamic-cgroup", flag_descriptions::kMediaDynamicCgroupName, + flag_descriptions::kMediaDynamicCgroupDescription, kOsCrOS, + PLATFORM_FEATURE_NAME_TYPE("CrOSLateBootMediaDynamicCgroup")}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"background-resource-fetch", + flag_descriptions::kBackgroundResourceFetchName, + flag_descriptions::kBackgroundResourceFetchDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kBackgroundResourceFetch)}, + + {"renderer-side-content-decoding", + flag_descriptions::kRendererSideContentDecodingName, + flag_descriptions::kRendererSideContentDecodingDescription, kOsAll, + FEATURE_VALUE_TYPE(network::features::kRendererSideContentDecoding)}, + + {"device-bound-session-access-observer-shared-remote", + flag_descriptions::kDeviceBoundSessionAccessObserverSharedRemoteName, + flag_descriptions:: + kDeviceBoundSessionAccessObserverSharedRemoteDescription, + kOsAll, + FEATURE_VALUE_TYPE( + network::features::kDeviceBoundSessionAccessObserverSharedRemote)}, + +#if BUILDFLAG(IS_ANDROID) + {"external-navigation-debug-logs", + flag_descriptions::kExternalNavigationDebugLogsName, + flag_descriptions::kExternalNavigationDebugLogsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(external_intents::kExternalNavigationDebugLogs)}, +#endif + + {"webui-omnibox-popup", flag_descriptions::kWebUIOmniboxPopupName, + flag_descriptions::kWebUIOmniboxPopupDescription, kOsDesktop, + FEATURE_VALUE_TYPE(omnibox::kWebUIOmniboxPopup)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"arc-vm-memory-size", flag_descriptions::kArcVmMemorySizeName, + flag_descriptions::kArcVmMemorySizeDesc, kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE(arc::kVmMemorySize, + kArcVmMemorySizeVariations, + "VmMemorySize")}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"tab-group-entry-points-android", + flag_descriptions::kTabGroupEntryPointsAndroidName, + flag_descriptions::kTabGroupEntryPointsAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabGroupEntryPointsAndroid)}, + + {"tab-group-parity-bottom-sheet-android", + flag_descriptions::kTabGroupParityBottomSheetAndroidName, + flag_descriptions::kTabGroupParityBottomSheetAndroidDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabGroupParityBottomSheetAndroid)}, + + {"tab-group-android-visual-data-cleanup", + flag_descriptions::kTabGroupAndroidVisualDataCleanupName, + flag_descriptions::kTabGroupAndroidVisualDataCleanupDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabGroupAndroidVisualDataCleanup)}, + + {"tab-strip-density-change-android", + flag_descriptions::kTabStripDensityChangeAndroidName, + flag_descriptions::kTabStripDensityChangeAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabStripDensityChangeAndroid)}, + + {"tab-strip-group-drag-drop-android", + flag_descriptions::kTabStripGroupDragDropAndroidName, + flag_descriptions::kTabStripGroupDragDropAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabStripGroupDragDropAndroid)}, + + {"tab-strip-incognito-migration", + flag_descriptions::kTabStripIncognitoMigrationName, + flag_descriptions::kTabStripIncognitoMigrationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabStripIncognitoMigration)}, + + {"tab-strip-layout-optimization", + flag_descriptions::kTabStripLayoutOptimizationName, + flag_descriptions::kTabStripLayoutOptimizationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabStripLayoutOptimization)}, + + {"tab-strip-mouse-close-resize-delay", + flag_descriptions::kTabStripMouseCloseResizeDelayName, + flag_descriptions::kTabStripMouseCloseResizeDelayDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabStripMouseCloseResizeDelay)}, + + {"tab-strip-transition-in-desktop-window", + flag_descriptions::kTabStripTransitionInDesktopWindowName, + flag_descriptions::kTabStripTransitionInDesktopWindowDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabStripTransitionInDesktopWindow)}, + + {"tab-switcher-group-suggestions-android", + flag_descriptions::kTabSwitcherGroupSuggestionsAndroidName, + flag_descriptions::kTabSwitcherGroupSuggestionsAndroidDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabSwitcherGroupSuggestionsAndroid)}, + + {"tab-switcher-group-suggestions-test-mode-android", + flag_descriptions::kTabSwitcherGroupSuggestionsTestModeAndroidName, + flag_descriptions::kTabSwitcherGroupSuggestionsTestModeAndroidDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kTabSwitcherGroupSuggestionsTestModeAndroid)}, + + {"chrome-native-url-overriding", + flag_descriptions::kChromeNativeUrlOverridingName, + flag_descriptions::kChromeNativeUrlOverridingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kChromeNativeUrlOverriding)}, +#endif + + {"group-promo-prototype", flag_descriptions::kGroupPromoPrototypeName, + flag_descriptions::kGroupPromoPrototypeDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + visited_url_ranking::features::kGroupSuggestionService, + kGroupSuggestionVariations, + "GroupPromoPrototype")}, + +#if BUILDFLAG(IS_ANDROID) + {"group-promo-prototype-cpa", + flag_descriptions::kGroupPromoPrototypeCpaName, + flag_descriptions::kGroupPromoPrototypeCpaDescription, kOsAndroid, + FEATURE_VALUE_TYPE( + segmentation_platform::features::kContextualPageActionTabGrouping)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"use-dmsaa-for-tiles", flag_descriptions::kUseDMSAAForTilesName, + flag_descriptions::kUseDMSAAForTilesDescription, kOsAll, + FEATURE_VALUE_TYPE(::features::kUseDMSAAForTiles)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"app-launch-shortcut", flag_descriptions::kAppLaunchShortcut, + flag_descriptions::kAppLaunchShortcutDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kAppLaunchShortcut)}, + {"enable-welcome-experience", flag_descriptions::kWelcomeExperienceName, + flag_descriptions::kWelcomeExperienceDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kWelcomeExperience)}, + {"enable-welcome-experience-test-unsupported-devices", + flag_descriptions::kWelcomeExperienceTestUnsupportedDevicesName, + flag_descriptions::kWelcomeExperienceTestUnsupportedDevicesDescription, + kOsCrOS, + FEATURE_VALUE_TYPE( + ash::features::kWelcomeExperienceTestUnsupportedDevices)}, + {"enable-welcome-tour", flag_descriptions::kWelcomeTourName, + flag_descriptions::kWelcomeTourDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kWelcomeTour)}, + {"enable-welcome-tour-force-user-eligibility", + flag_descriptions::kWelcomeTourForceUserEligibilityName, + flag_descriptions::kWelcomeTourForceUserEligibilityDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kWelcomeTourForceUserEligibility)}, +#endif + +#if BUILDFLAG(IS_CHROMEOS) + {"google-one-offer-files-banner", + flag_descriptions::kGoogleOneOfferFilesBannerName, + flag_descriptions::kGoogleOneOfferFilesBannerDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kGoogleOneOfferFilesBanner)}, +#endif + + {"sync-autofill-wallet-credential-data", + flag_descriptions::kSyncAutofillWalletCredentialDataName, + flag_descriptions::kSyncAutofillWalletCredentialDataDescription, kOsAll, + FEATURE_VALUE_TYPE(syncer::kSyncAutofillWalletCredentialData)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"cros-labs-window-cycle-shortcut", + flag_descriptions::kSameAppWindowCycleName, + flag_descriptions::kSameAppWindowCycleDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSameAppWindowCycle)}, + {"printing-ppd-channel", flag_descriptions::kPrintingPpdChannelName, + flag_descriptions::kPrintingPpdChannelDescription, kOsCrOS, + MULTI_VALUE_TYPE(kPrintingPpdChannelChoices)}, + {"arc-idle-manager", flag_descriptions::kArcIdleManagerName, + flag_descriptions::kArcIdleManagerDescription, kOsCrOS, + FEATURE_VALUE_TYPE(arc::kEnableArcIdleManager)}, +#endif + + {"power-bookmark-backend", flag_descriptions::kPowerBookmarkBackendName, + flag_descriptions::kPowerBookmarkBackendDescription, kOsAll, + FEATURE_VALUE_TYPE(power_bookmarks::kPowerBookmarkBackend)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-eol-notification-reset-dismissed-prefs", + flag_descriptions::kEolResetDismissedPrefsName, + flag_descriptions::kEolResetDismissedPrefsDescription, kOsCrOS, + SINGLE_VALUE_TYPE(ash::switches::kEolResetDismissedPrefs)}, +#endif + +#if !BUILDFLAG(IS_ANDROID) + {"enable-preferences-account-storage", + flag_descriptions::kEnablePreferencesAccountStorageName, + flag_descriptions::kEnablePreferencesAccountStorageDescription, kOsDesktop, + FEATURE_VALUE_TYPE(switches::kEnablePreferencesAccountStorage)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"render-arc-notifications-by-chrome", + flag_descriptions::kRenderArcNotificationsByChromeName, + flag_descriptions::kRenderArcNotificationsByChromeDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kRenderArcNotificationsByChrome)}, +#endif + + {"enable-compression-dictionary-transport", + flag_descriptions::kCompressionDictionaryTransportName, + flag_descriptions::kCompressionDictionaryTransportDescription, kOsAll, + FEATURE_VALUE_TYPE(network::features::kCompressionDictionaryTransport)}, + + {"enable-compression-dictionary-transport-backend", + flag_descriptions::kCompressionDictionaryTransportBackendName, + flag_descriptions::kCompressionDictionaryTransportBackendDescription, + kOsAll, + FEATURE_VALUE_TYPE( + network::features::kCompressionDictionaryTransportBackend)}, + + {"enable-compression-dictionary-transport-allow-http1", + flag_descriptions::kCompressionDictionaryTransportOverHttp1Name, + flag_descriptions::kCompressionDictionaryTransportOverHttp1Description, + kOsAll, + FEATURE_VALUE_TYPE( + net::features::kCompressionDictionaryTransportOverHttp1)}, + + {"enable-compression-dictionary-transport-allow-http2", + flag_descriptions::kCompressionDictionaryTransportOverHttp2Name, + flag_descriptions::kCompressionDictionaryTransportOverHttp2Description, + kOsAll, + FEATURE_VALUE_TYPE( + net::features::kCompressionDictionaryTransportOverHttp2)}, + + {"enable-compression-dictionary-transport-require-known-root-cert", + flag_descriptions::kCompressionDictionaryTransportRequireKnownRootCertName, + flag_descriptions:: + kCompressionDictionaryTransportRequireKnownRootCertDescription, + kOsAll, + FEATURE_VALUE_TYPE( + net::features::kCompressionDictionaryTransportRequireKnownRootCert)}, + + {"enable-container-type-no-layout-containment", + flag_descriptions::kContainerTypeNoLayoutContainmentName, + flag_descriptions::kContainerTypeNoLayoutContainmentDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kContainerTypeNoLayoutContainment)}, + +#if BUILDFLAG(IS_ANDROID) + {"deprecated-external-picker-function", + flag_descriptions::kDeprecatedExternalPickerFunctionName, + flag_descriptions::kDeprecatedExternalPickerFunctionDescription, + kOsAndroid, FEATURE_VALUE_TYPE(ui::kDeprecatedExternalPickerFunction)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"android-native-pages-in-new-tab", + flag_descriptions::kAndroidNativePagesInNewTabName, + flag_descriptions::kAndroidNativePagesInNewTabDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidNativePagesInNewTab)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"android-progress-bar-visual-update", + flag_descriptions::kAndroidProgressBarVisualUpdateName, + flag_descriptions::kAndroidProgressBarVisualUpdateDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidProgressBarVisualUpdate)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-missive-storage-config", flag_descriptions::kMissiveStorageName, + flag_descriptions::kMissiveStorageDescription, kOsCrOS, + PLATFORM_FEATURE_WITH_PARAMS_VALUE_TYPE( + "CrOSLateBootMissiveStorage", + kCrOSLateBootMissiveStorageDefaultVariations, + "CrOSLateBootMissiveStorage")}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if !BUILDFLAG(IS_ANDROID) + {"cast-mirroring-target-playout-delay", + flag_descriptions::kCastMirroringTargetPlayoutDelayName, + flag_descriptions::kCastMirroringTargetPlayoutDelayDescription, kOsDesktop, + MULTI_VALUE_TYPE(kCastMirroringTargetPlayoutDelayChoices)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"separate-web-app-shortcut-badge-icon", + flag_descriptions::kSeparateWebAppShortcutBadgeIconName, + flag_descriptions::kSeparateWebAppShortcutBadgeIconDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSeparateWebAppShortcutBadgeIcon)}, + {"enable-audio-focus-enforcement", + flag_descriptions::kEnableAudioFocusEnforcementName, + flag_descriptions::kEnableAudioFocusEnforcementDescription, kOsCrOS, + FEATURE_VALUE_TYPE(media_session::features::kAudioFocusEnforcement)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"enable-process-per-site-up-to-main-frame-threshold", + flag_descriptions::kEnableProcessPerSiteUpToMainFrameThresholdName, + flag_descriptions::kEnableProcessPerSiteUpToMainFrameThresholdDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(features::kProcessPerSiteUpToMainFrameThreshold)}, + +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) + {"camera-mic-effects", flag_descriptions::kCameraMicEffectsName, + flag_descriptions::kCameraMicEffectsDescription, + static_cast(kOsMac | kOsWin | kOsLinux), + FEATURE_VALUE_TYPE(media::kCameraMicEffects)}, + + {"camera-mic-preview", flag_descriptions::kCameraMicPreviewName, + flag_descriptions::kCameraMicPreviewDescription, + static_cast(kOsMac | kOsWin | kOsLinux), + FEATURE_VALUE_TYPE(blink::features::kCameraMicPreview)}, + +#if !BUILDFLAG(IS_ANDROID) + {"get-display-media-confers-activation", + flag_descriptions::kGetDisplayMediaConfersActivationName, + flag_descriptions::kGetDisplayMediaConfersActivationDescription, + kOsDesktop, FEATURE_VALUE_TYPE(media::kGetDisplayMediaConfersActivation)}, +#endif + + {"get-user-media-deferred-device-settings-selection", + flag_descriptions::kGetUserMediaDeferredDeviceSettingsSelectionName, + flag_descriptions::kGetUserMediaDeferredDeviceSettingsSelectionDescription, + static_cast(kOsMac | kOsWin | kOsLinux), + FEATURE_VALUE_TYPE( + blink::features::kGetUserMediaDeferredDeviceSettingsSelection)}, +#endif + + {"render-document", flag_descriptions::kRenderDocumentName, + flag_descriptions::kRenderDocumentDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kRenderDocument, + kRenderDocumentVariations, + "RenderDocument")}, + + {"default-site-instance-groups", + flag_descriptions::kDefaultSiteInstanceGroupsName, + flag_descriptions::kDefaultSiteInstanceGroupsDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kDefaultSiteInstanceGroups)}, + +#if BUILDFLAG(ENABLE_EXTENSIONS) + {"cws-info-fast-check", flag_descriptions::kCWSInfoFastCheckName, + flag_descriptions::kCWSInfoFastCheckDescription, kOsDesktop, + FEATURE_VALUE_TYPE(extensions::kCWSInfoFastCheck)}, + + {"extension-disable-unsupported-developer-mode-extensions", + flag_descriptions::kExtensionDisableUnsupportedDeveloperName, + flag_descriptions::kExtensionDisableUnsupportedDeveloperDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + extensions_features::kExtensionDisableUnsupportedDeveloper)}, +#endif // BUILDFLAG(ENABLE_EXTENSIONS) + + {"autofill-enable-cvc-storage-and-filling", + flag_descriptions::kAutofillEnableCvcStorageAndFillingName, + flag_descriptions::kAutofillEnableCvcStorageAndFillingDescription, kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableCvcStorageAndFilling)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"drive-fs-show-cse-files", flag_descriptions::kDriveFsShowCSEFilesName, + flag_descriptions::kDriveFsShowCSEFilesDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kDriveFsShowCSEFiles)}, + {"drive-fs-mirroring", flag_descriptions::kDriveFsMirroringName, + flag_descriptions::kDriveFsShowCSEFilesDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kDriveFsMirroring)}, + {"cros-labs-continuous-overview-animation", + flag_descriptions::kContinuousOverviewScrollAnimationName, + flag_descriptions::kContinuousOverviewScrollAnimationDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kContinuousOverviewScrollAnimation)}, + {"cros-labs-window-splitting", flag_descriptions::kWindowSplittingName, + flag_descriptions::kWindowSplittingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kWindowSplitting)}, + {"cros-labs-tiling-window-resize", + flag_descriptions::kTilingWindowResizeName, + flag_descriptions::kTilingWindowResizeDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kTilingWindowResize)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"privacy-sandbox-enrollment-overrides", + flag_descriptions::kPrivacySandboxEnrollmentOverridesName, + flag_descriptions::kPrivacySandboxEnrollmentOverridesDescription, kOsAll, + ORIGIN_LIST_VALUE_TYPE(privacy_sandbox::kPrivacySandboxEnrollmentOverrides, + "")}, + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-smart-card-web-api", flag_descriptions::kSmartCardWebApiName, + flag_descriptions::kSmartCardWebApiDescription, kOsCrOS, + FEATURE_VALUE_TYPE(blink::features::kSmartCard)}, + {"enable-web-printing-api", flag_descriptions::kWebPrintingApiName, + flag_descriptions::kWebPrintingApiDescription, kOsCrOS, + FEATURE_VALUE_TYPE(blink::features::kWebPrinting)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"autofill-enable-prefetching-risk-data-for-retrieval", + flag_descriptions::kAutofillEnablePrefetchingRiskDataForRetrievalName, + flag_descriptions:: + kAutofillEnablePrefetchingRiskDataForRetrievalDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnablePrefetchingRiskDataForRetrieval)}, + +#if BUILDFLAG(IS_ANDROID) + {"read-aloud", flag_descriptions::kReadAloudName, + flag_descriptions::kReadAloudDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kReadAloud)}, + + {"read-aloud-background-playback", + flag_descriptions::kReadAloudBackgroundPlaybackName, + flag_descriptions::kReadAloudBackgroundPlaybackDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kReadAloudBackgroundPlayback)}, + + {"read-aloud-in-cct", flag_descriptions::kReadAloudInCCTName, + flag_descriptions::kReadAloudInCCTDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kReadAloudInOverflowMenuInCCT)}, + + {"read-aloud-tap-to-seek", flag_descriptions::kReadAloudTapToSeekName, + flag_descriptions::kReadAloudTapToSeekDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kReadAloudTapToSeek)}, +#endif + + {"rcaps-dynamic-profile-country", + flag_descriptions::kRcapsDynamicProfileCountryName, + flag_descriptions::kRcapsDynamicProfileCountryDescription, kOsAll, + FEATURE_VALUE_TYPE(switches::kDynamicProfileCountry)}, + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + {"enable-generic-oidc-auth-profile-management", + flag_descriptions::kEnableGenericOidcAuthProfileManagementName, + flag_descriptions::kEnableGenericOidcAuthProfileManagementDescription, + kOsLinux | kOsMac | kOsWin, + FEATURE_VALUE_TYPE(profile_management::features:: + kEnableGenericOidcAuthProfileManagement)}, + {"enable-user-link-capturing-scope-extensions-pwa", + flag_descriptions::kDesktopPWAsUserLinkCapturingScopeExtensionsName, + flag_descriptions::kDesktopPWAsUserLinkCapturingScopeExtensionsDescription, + kOsLinux | kOsMac | kOsWin, + FEATURE_VALUE_TYPE(features::kPwaNavigationCapturingWithScopeExtensions)}, + {"enable-oidc-profile-remote-commands", + flag_descriptions::kEnableOidcProfileRemoteCommandsName, + flag_descriptions::kEnableOidcProfileRemoteCommandsDescription, + kOsLinux | kOsMac | kOsWin, + FEATURE_VALUE_TYPE( + profile_management::features::kEnableOidcProfileRemoteCommands)}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \ + BUILDFLAG(IS_CHROMEOS) + {"enable-user-navigation-capturing-pwa", + flag_descriptions::kPwaNavigationCapturingName, + flag_descriptions::kPwaNavigationCapturingDescription, + kOsLinux | kOsMac | kOsWin | kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kPwaNavigationCapturing, + kPwaNavigationCapturingVariations, + "PwaNavigationCapturing")}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || + // BUILDFLAG(IS_CHROMEOS) + + {"ip-protection-proxy-opt-out", + flag_descriptions::kIpProtectionProxyOptOutName, + flag_descriptions::kIpProtectionProxyOptOutDescription, kOsAll, + MULTI_VALUE_TYPE(kIpProtectionProxyOptOutChoices)}, + + {"protected-audience-debug-token", + flag_descriptions::kProtectedAudiencesConsentedDebugTokenName, + flag_descriptions::kProtectedAudiencesConsentedDebugTokenDescription, + kOsAll, + STRING_VALUE_TYPE(switches::kProtectedAudiencesConsentedDebugToken, "")}, + + {"deprecate-unload", flag_descriptions::kDeprecateUnloadName, + flag_descriptions::kDeprecateUnloadDescription, kOsAll | kDeprecated, + FEATURE_VALUE_TYPE(network::features::kDeprecateUnload)}, + + {"autofill-enable-fpan-risk-based-authentication", + flag_descriptions::kAutofillEnableFpanRiskBasedAuthenticationName, + flag_descriptions::kAutofillEnableFpanRiskBasedAuthenticationDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableFpanRiskBasedAuthentication)}, + + {"ack-on-surface-activation-when-interactive", + flag_descriptions::kAckOnSurfaceActivationWhenInteractiveName, + flag_descriptions::kAckOnSurfaceActivationWhenInteractiveDescription, + kOsAll, + FEATURE_VALUE_TYPE(features::kAckOnSurfaceActivationWhenInteractive)}, + +#if BUILDFLAG(IS_MAC) + {"enable-mac-pwas-notification-attribution", + flag_descriptions::kMacPWAsNotificationAttributionName, + flag_descriptions::kMacPWAsNotificationAttributionDescription, kOsMac, + FEATURE_VALUE_TYPE(features::kAppShimNotificationAttribution)}, + + {"use-adhoc-signing-for-web-app-shims", + flag_descriptions::kUseAdHocSigningForWebAppShimsName, + flag_descriptions::kUseAdHocSigningForWebAppShimsDescription, kOsMac, + FEATURE_VALUE_TYPE(features::kUseAdHocSigningForWebAppShims)}, +#endif // BUILDFLAG(IS_MAC) + +#if !BUILDFLAG(IS_CHROMEOS) + {"profiles-reordering", flag_descriptions::kProfilesReorderingName, + flag_descriptions::kProfilesReorderingDescription, kOsDesktop, + FEATURE_VALUE_TYPE(switches::kProfilesReordering)}, +#endif + +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + {"enable-history-sync-optin-expansion-pill", + flag_descriptions::kEnableHistorySyncOptinExpansionPillName, + flag_descriptions::kEnableHistorySyncOptinExpansionPillDescription, + kOsWin | kOsMac | kOsLinux, + FEATURE_VALUE_TYPE(switches::kEnableHistorySyncOptinExpansionPill)}, +#endif + +#if BUILDFLAG(IS_WIN) + {"avatar-button-sync-promo", flag_descriptions::kAvatarButtonSyncPromoName, + flag_descriptions::kAvatarButtonSyncPromoDescription, kOsWin, + FEATURE_WITH_PARAMS_VALUE_TYPE(switches::kAvatarButtonSyncPromo, + kAvatarButtonSyncPromoVariations, + "AvatarButtonSyncPromo")}, +#endif + +#if BUILDFLAG(ENABLE_DICE_SUPPORT) && BUILDFLAG(ENABLE_EXTENSIONS) + {"enable-extensions-explicit-browser-signin", + flag_descriptions::kEnableExtensionsExplicitBrowserSigninName, + flag_descriptions::kEnableExtensionsExplicitBrowserSigninDescription, + kOsMac | kOsWin | kOsLinux | kOsCrOS, + FEATURE_VALUE_TYPE(switches::kEnableExtensionsExplicitBrowserSignin)}, +#endif // BUILDFLAG(ENABLE_DICE_SUPPORT) && BUILDFLAG(ENABLE_EXTENSIONS) + +#if BUILDFLAG(ENABLE_HLS_DEMUXER) + {"enable-hls-playback", flag_descriptions::kEnableHlsPlaybackName, + flag_descriptions::kEnableHlsPlaybackDescription, + kOsMac | kOsWin | kOsLinux | kOsCrOS, + FEATURE_VALUE_TYPE(media::kBuiltInHlsPlayer)}, +#endif + +#if BUILDFLAG(IS_CHROMEOS) + {"flex-firmware-update", flag_descriptions::kFlexFirmwareUpdateName, + flag_descriptions::kFlexFirmwareUpdateDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFlexFirmwareUpdate)}, + + {"ipp-first-setup-for-usb-printers", + flag_descriptions::kIppFirstSetupForUsbPrintersName, + flag_descriptions::kIppFirstSetupForUsbPrintersDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kIppFirstSetupForUsbPrinters)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(ENABLE_BOUND_SESSION_CREDENTIALS) + {"enable-bound-session-credentials", + flag_descriptions::kEnableBoundSessionCredentialsName, + flag_descriptions::kEnableBoundSessionCredentialsDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_WITH_PARAMS_VALUE_TYPE(switches::kEnableBoundSessionCredentials, + kEnableBoundSessionCredentialsVariations, + "EnableBoundSessionCredentials")}, + {"enable-bound-session-credentials-software-keys-for-manual-testing", + flag_descriptions:: + kEnableBoundSessionCredentialsSoftwareKeysForManualTestingName, + flag_descriptions:: + kEnableBoundSessionCredentialsSoftwareKeysForManualTestingDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE( + unexportable_keys:: + kEnableBoundSessionCredentialsSoftwareKeysForManualTesting)}, +#endif // BUILDFLAG(ENABLE_BOUND_SESSION_CREDENTIALS) + + {"menu-elements", flag_descriptions::kMenuElementsName, + flag_descriptions::kMenuElementsDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kMenuElements)}, + +#if BUILDFLAG(IS_ANDROID) + {"android-hub-search-tab-groups", + flag_descriptions::kAndroidHubSearchTabGroupsName, + flag_descriptions::kAndroidHubSearchTabGroupsDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kAndroidHubSearchTabGroups, + kAndroidHubSearchTabGroupsVariations, + "AndroidHubSearchTabGroups")}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(ENABLE_COMPOSE) + {"compose-selection-nudge", flag_descriptions::kComposeSelectionNudgeName, + flag_descriptions::kComposeSelectionNudgeDescription, + kOsWin | kOsLinux | kOsMac | kOsCrOS, + FEATURE_WITH_PARAMS_VALUE_TYPE( + compose::features::kEnableComposeSelectionNudge, + kComposeSelectionNudgeVariations, + "ComposeSelectionNudge")}, +#endif + + {"related-website-sets-permission-grants", + flag_descriptions::kShowRelatedWebsiteSetsPermissionGrantsName, + flag_descriptions::kShowRelatedWebsiteSetsPermissionGrantsDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE( + permissions::features::kShowRelatedWebsiteSetsPermissionGrants)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"cros-switcher", flag_descriptions::kCrosSwitcherName, + flag_descriptions::kCrosSwitcherDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kCrosSwitcher)}, + {"platform-keys-changes-wave-1", + flag_descriptions::kPlatformKeysChangesWave1Name, + flag_descriptions::kPlatformKeysChangesWave1Description, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kPlatformKeysChangesWave1)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"autofill-enable-email-or-loyalty-cards-filling", + flag_descriptions::kAutofillEnableEmailOrLoyaltyCardsFillingName, + flag_descriptions::kAutofillEnableEmailOrLoyaltyCardsFillingDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableEmailOrLoyaltyCardsFilling)}, + + {"autofill-enable-loyalty-cards-filling", + flag_descriptions::kAutofillEnableLoyaltyCardsFillingName, + flag_descriptions::kAutofillEnableLoyaltyCardsFillingDescription, kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableLoyaltyCardsFilling)}, + + {"autofill-enable-syncing-of-loyalty-cards", + flag_descriptions::kAutofillEnableLoyaltyCardSyncName, + flag_descriptions::kAutofillEnableLoyaltyCardSyncDescription, kOsAll, + FEATURE_VALUE_TYPE(syncer::kSyncAutofillLoyaltyCard)}, + +#if BUILDFLAG(IS_ANDROID) + {"background-not-perceptible-binding", + flag_descriptions::kBackgroundNotPerceptibleBindingName, + flag_descriptions::kBackgroundNotPerceptibleBindingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(base::features::kBackgroundNotPerceptibleBinding)}, + {"boarding-pass-detector", flag_descriptions::kBoardingPassDetectorName, + flag_descriptions::kBoardingPassDetectorDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kBoardingPassDetector, + kBoardingPassDetectorVariations, + "Allowed Urls")}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"cloud-gaming-device", flag_descriptions::kCloudGamingDeviceName, + flag_descriptions::kCloudGamingDeviceDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kCloudGamingDevice)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"content-settings-partitioning", + flag_descriptions::kContentSettingsPartitioningName, + flag_descriptions::kContentSettingsPartitioningDescription, kOsAll, + FEATURE_VALUE_TYPE( + content_settings::features::kContentSettingsPartitioning)}, + +#if BUILDFLAG(IS_ANDROID) + {"use-fullscreen-insets-api", + flag_descriptions::kFullscreenInsetsApiMigrationName, + flag_descriptions::kFullscreenInsetsApiMigrationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kFullscreenInsetsApiMigration)}, + + {"use-fullscreen-insets-api-on-automotive", + flag_descriptions::kFullscreenInsetsApiMigrationOnAutomotiveName, + flag_descriptions::kFullscreenInsetsApiMigrationOnAutomotiveDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kFullscreenInsetsApiMigrationOnAutomotive)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_MAC) + {"enable-mac-ime-live-conversion-fix", + flag_descriptions::kMacImeLiveConversionFixName, + flag_descriptions::kMacImeLiveConversionFixDescription, kOsMac, + FEATURE_VALUE_TYPE(features::kMacImeLiveConversionFix)}, +#endif + + {"tear-off-web-app-tab-opens-web-app-window", + flag_descriptions::kTearOffWebAppAppTabOpensWebAppWindowName, + flag_descriptions::kTearOffWebAppAppTabOpensWebAppWindowDescription, + kOsAll, FEATURE_VALUE_TYPE(features::kTearOffWebAppTabOpensWebAppWindow)}, + +#if BUILDFLAG(IS_ANDROID) + {"offline-auto-fetch", flag_descriptions::kOfflineAutoFetchName, + flag_descriptions::kOfflineAutoFetchDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kOfflineAutoFetch)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {kAssistantIphInternalName, flag_descriptions::kAssistantIphName, + flag_descriptions::kAssistantIphDescription, kOsCrOS, + FEATURE_VALUE_TYPE(feature_engagement::kIPHLauncherSearchHelpUiFeature)}, + + {"battery-badge-icon", flag_descriptions::kBatteryBadgeIconName, + flag_descriptions::kBatteryBadgeIconDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kBatteryBadgeIcon)}, + + {"battery-charge-limit", flag_descriptions::kBatteryChargeLimitName, + flag_descriptions::kBatteryChargeLimitDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kBatteryChargeLimit)}, + + {"bluetooth-wifi-qs-pod-refresh", + flag_descriptions::kBluetoothWifiQSPodRefreshName, + flag_descriptions::kBluetoothWifiQSPodRefreshDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kBluetoothWifiQSPodRefresh)}, + + {"mahi", flag_descriptions::kMahiName, flag_descriptions::kMahiDescription, + kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kMahi)}, + + {"mahi-debugging", flag_descriptions::kMahiDebuggingName, + flag_descriptions::kMahiDebuggingDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kMahiDebugging)}, + + {"mahi-panel-resizable", flag_descriptions::kMahiPanelResizableName, + flag_descriptions::kMahiPanelResizableDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kMahiPanelResizable)}, + + {"notification-width-increase", + flag_descriptions::kNotificationWidthIncreaseName, + flag_descriptions::kNotificationWidthIncreaseDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kNotificationWidthIncrease)}, + + {"pompano", flag_descriptions::kPompanoName, + flag_descriptions::kPompanoDescritpion, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kPompano)}, + + {"mahi-summarize-selected", flag_descriptions::kMahiSummarizeSelectedName, + flag_descriptions::kMahiSummarizeSelectedDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kMahiSummarizeSelected)}, + + {"ash-picker-gifs", flag_descriptions::kAshPickerGifsName, + flag_descriptions::kAshPickerGifsDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kPickerGifs)}, + + {"ash-modifier-split", flag_descriptions::kAshModifierSplitName, + flag_descriptions::kAshModifierSplitDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kModifierSplit)}, + + {"ash-split-keyboard-refactor", + flag_descriptions::kAshSplitKeyboardRefactorName, + flag_descriptions::kAshSplitKeyboardRefactorDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kSplitKeyboardRefactor)}, + + {"enable-toggle-camera-shortcut", + flag_descriptions::kEnableToggleCameraShortcutName, + flag_descriptions::kEnableToggleCameraShortcutDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kEnableToggleCameraShortcut)}, + + {"ash-null-top-row-fix", flag_descriptions::kAshNullTopRowFixName, + flag_descriptions::kAshNullTopRowFixDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kNullTopRowFix)}, + +#endif // BUILDFLAG(IS_CHROMEOS) + +#if !BUILDFLAG(IS_ANDROID) + {"password-manual-fallback-available", + flag_descriptions::kPasswordManualFallbackAvailableName, + flag_descriptions::kPasswordManualFallbackAvailableDescription, kOsDesktop, + FEATURE_VALUE_TYPE( + password_manager::features::kPasswordManualFallbackAvailable)}, + + {"save-passwords-contextual-ui", + flag_descriptions::kSavePasswordsContextualUiName, + flag_descriptions::kSavePasswordsContextualUiDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kSavePasswordsContextualUi)}, + +#endif // !BUILDFLAG(IS_ANDROID) + + {"enable-unrestricted-usb", flag_descriptions::kEnableUnrestrictedUsbName, + flag_descriptions::kEnableUnrestrictedUsbDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kUnrestrictedUsb)}, + + {"autofill-enable-vcn-3ds-authentication", + flag_descriptions::kAutofillEnableVcn3dsAuthenticationName, + flag_descriptions::kAutofillEnableVcn3dsAuthenticationDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableVcn3dsAuthentication)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"cros-locked-mode", flag_descriptions::kLockedModeName, + flag_descriptions::kLockedModeDescription, kOsCrOS, + FEATURE_VALUE_TYPE(blink::features::kLockedMode)}, +#endif // BUILDFLAG_(IS_CHROMEOS) + +#if !BUILDFLAG(IS_ANDROID) + {"link-preview", flag_descriptions::kLinkPreviewName, + flag_descriptions::kLinkPreviewDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(blink::features::kLinkPreview, + kLinkPreviewTriggerTypeVariations, + "LinkPreview")}, +#endif // !BUILDFLAG_(IS_ANDROID) + + {"send-tab-ios-push-notifications", + flag_descriptions::kSendTabToSelfIOSPushNotificationsName, + flag_descriptions::kSendTabToSelfIOSPushNotificationsDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + send_tab_to_self::kSendTabToSelfIOSPushNotifications, + kSendTabIOSPushNotificationsVariations, + "SendTabToSelfIOSPushNotifications")}, + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-display-performance-mode", + flag_descriptions::kEnableDisplayPerformanceModeName, + flag_descriptions::kEnableDisplayPerformanceModeDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kDisplayPerformanceMode)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"android-tab-declutter-archive-all-but-active-tab", + flag_descriptions::kAndroidTabDeclutterArchiveAllButActiveTabName, + flag_descriptions::kAndroidTabDeclutterArchiveAllButActiveTabDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kAndroidTabDeclutterArchiveAllButActiveTab)}, + + {"android-tab-declutter-archive-tab-groups", + flag_descriptions::kAndroidTabDeclutterArchiveTabGroupsName, + flag_descriptions::kAndroidTabDeclutterArchiveTabGroupsDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidTabDeclutterArchiveTabGroups)}, + + {"android-tab-declutter-auto-delete", + flag_descriptions::kAndroidTabDeclutterAutoDeleteName, + flag_descriptions::kAndroidTabDeclutterAutoDeleteDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + chrome::android::kAndroidTabDeclutterAutoDelete, + kAndroidTabDeclutterAutoDeleteVariations, + "AndroidTabDeclutterAutoDeleteVariations")}, + + {"android-tab-declutter-auto-delete-kill-switch", + flag_descriptions::kAndroidTabDeclutterAutoDeleteKillSwitchName, + flag_descriptions::kAndroidTabDeclutterAutoDeleteKillSwitchDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kAndroidTabDeclutterAutoDeleteKillSwitch)}, + + {"android-tab-declutter-performance-improvements", + flag_descriptions::kAndroidTabDeclutterPerformanceImprovementsName, + flag_descriptions::kAndroidTabDeclutterPerformanceImprovementsDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kAndroidTabDeclutterPerformanceImprovements)}, + + {"android-tab-groups-color-update-gm3", + flag_descriptions::kAndroidTabGroupsColorUpdateGM3Name, + flag_descriptions::kAndroidTabGroupsColorUpdateGM3Description, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidTabGroupsColorUpdateGM3)}, + + {"android-tab-highlighting", flag_descriptions::kAndroidTabHighlightingName, + flag_descriptions::kAndroidTabHighlightingDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kAndroidTabHighlighting, + kAndroidTabHighlightingVariations, + "AndroidTabHighlightingVariations")}, + + {"android-tips-notifications", + flag_descriptions::kAndroidTipsNotificationsName, + flag_descriptions::kAndroidTipsNotificationsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidTipsNotifications)}, + + {"history-pane-android", flag_descriptions::kHistoryPaneAndroidName, + flag_descriptions::kHistoryPaneAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kHistoryPaneAndroid)}, + + {"bookmark-pane-android", flag_descriptions::kBookmarkPaneAndroidName, + flag_descriptions::kBookmarkPaneAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kBookmarkPaneAndroid)}, + + {"batch-tab-restore", flag_descriptions::kBatchTabRestoreName, + flag_descriptions::kBatchTabRestoreDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kBatchTabRestore)}, + +#endif // BUILDFLAG(IS_ANDROID) + + {"data-sharing-debug-logs", flag_descriptions::kDataSharingDebugLogsName, + flag_descriptions::kDataSharingDebugLogsDescription, kOsAll, + SINGLE_VALUE_TYPE(data_sharing::kDataSharingDebugLoggingEnabled)}, + + {"autofill-shared-storage-server-card-data", + flag_descriptions::kAutofillSharedStorageServerCardDataName, + flag_descriptions::kAutofillSharedStorageServerCardDataDescription, kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillSharedStorageServerCardData)}, + +#if BUILDFLAG(IS_ANDROID) + {"android-open-pdf-inline", flag_descriptions::kAndroidOpenPdfInlineName, + flag_descriptions::kAndroidOpenPdfInlineDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kAndroidOpenPdfInline)}, + + {"android-open-pdf-inline-backport", + flag_descriptions::kAndroidOpenPdfInlineBackportName, + flag_descriptions::kAndroidOpenPdfInlineBackportDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidOpenPdfInlineBackport)}, + + {"android-pdf-assist-content", + flag_descriptions::kAndroidPdfAssistContentName, + flag_descriptions::kAndroidPdfAssistContentDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidPdfAssistContent)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"multi-calendar-in-quick-settings", + flag_descriptions::kMultiCalendarSupportName, + flag_descriptions::kMultiCalendarSupportDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kMultiCalendarSupport)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"autofill-enable-syncing-of-pix-bank-accounts", + flag_descriptions::kAutofillEnableSyncingOfPixBankAccountsName, + flag_descriptions::kAutofillEnableSyncingOfPixBankAccountsDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableSyncingOfPixBankAccounts)}, + + {"enable-pix-account-linking", + flag_descriptions::kEnablePixAccountLinkingName, + flag_descriptions::kEnablePixAccountLinkingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(payments::facilitated::kEnablePixAccountLinking)}, + + {"enable-pix-payments-in-landscape-mode", + flag_descriptions::kEnablePixPaymentsInLandscapeModeName, + flag_descriptions::kEnablePixPaymentsInLandscapeModeDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + payments::facilitated::kEnablePixPaymentsInLandscapeMode)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"autofill-enable-card-benefits-for-american-express", + flag_descriptions::kAutofillEnableCardBenefitsForAmericanExpressName, + flag_descriptions:: + kAutofillEnableCardBenefitsForAmericanExpressDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableCardBenefitsForAmericanExpress)}, + + {"autofill-enable-card-benefits-sync", + flag_descriptions::kAutofillEnableCardBenefitsSyncName, + flag_descriptions::kAutofillEnableCardBenefitsSyncDescription, kOsAll, + FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableCardBenefitsSync)}, + + {"linked-services-setting", flag_descriptions::kLinkedServicesSettingName, + flag_descriptions::kLinkedServicesSettingDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kLinkedServicesSetting)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"cros-mall", flag_descriptions::kCrosMallName, + flag_descriptions::kCrosMallDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kCrosMall)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_MAC) + {"reduce-ip-address-change-notification", + flag_descriptions::kReduceIPAddressChangeNotificationName, + flag_descriptions::kReduceIPAddressChangeNotificationDescription, kOsMac, + FEATURE_VALUE_TYPE(net::features::kReduceIPAddressChangeNotification)}, +#endif // BUILDFLAG(IS_MAC) + + // LINT.IfChange(FingerprintingProtectionFilterFeatureEntries) + {"enable-fingerprinting-protection-blocklist", + flag_descriptions::kEnableFingerprintingProtectionBlocklistName, + flag_descriptions::kEnableFingerprintingProtectionBlocklistDescription, + kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + fingerprinting_protection_filter::features:: + kEnableFingerprintingProtectionFilter, + kEnableFingerprintingProtectionFilterVariations, + "EnableFingerprintingProtectionFilter")}, + + {"enable-fingerprinting-protection-blocklist-incognito", + flag_descriptions::kEnableFingerprintingProtectionBlocklistInIncognitoName, + flag_descriptions:: + kEnableFingerprintingProtectionBlocklistInIncognitoDescription, + kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + fingerprinting_protection_filter::features:: + kEnableFingerprintingProtectionFilterInIncognito, + kEnableFingerprintingProtectionFilterInIncognitoVariations, + "EnableFingerprintingProtectionFilterInIncognito")}, + // LINT.ThenChange(//ios/chrome/browser/flags/about_flags.mm:FingerprintingProtectionFeatureEntries) + + {"enable-standard-device-bound-session-credentials", + flag_descriptions::kEnableStandardBoundSessionCredentialsName, + flag_descriptions::kEnableStandardBoundSessionCredentialsDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_WITH_PARAMS_VALUE_TYPE(net::features::kDeviceBoundSessions, + kStandardBoundSessionCredentialsVariations, + "standard-device-bound-sessions")}, + {"enable-standard-device-bound-session-persistence", + flag_descriptions::kEnableStandardBoundSessionPersistenceName, + flag_descriptions::kEnableStandardBoundSessionPersistenceDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(net::features::kPersistDeviceBoundSessions)}, + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + {"replace-sync-promos-with-sign-in-promos-desktop", + flag_descriptions::kReplaceSyncPromosWithSignInPromosName, + flag_descriptions::kReplaceSyncPromosWithSignInPromosDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(syncer::kReplaceSyncPromosWithSignInPromos)}, +#elif BUILDFLAG(IS_ANDROID) + {"replace-sync-promos-with-sign-in-promos", + flag_descriptions::kReplaceSyncPromosWithSignInPromosName, + flag_descriptions::kReplaceSyncPromosWithSignInPromosDescription, + kOsAndroid, MULTI_VALUE_TYPE(kReplaceSyncPromosWithSignInPromosChoices)}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || + // BUILDFLAG(IS_ANDROID) + + {"pwm-show-suggestions-on-autofocus", + flag_descriptions::kPasswordManagerShowSuggestionsOnAutofocusName, + flag_descriptions::kPasswordManagerShowSuggestionsOnAutofocusDescription, + kOsAll, + FEATURE_VALUE_TYPE( + password_manager::features::kShowSuggestionsOnAutofocus)}, + +#if BUILDFLAG(IS_ANDROID) + {"android-browser-controls-in-viz", + flag_descriptions::kAndroidBrowserControlsInVizName, + flag_descriptions::kAndroidBrowserControlsInVizDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kAndroidBrowserControlsInViz)}, + + {"android-browser-controls-in-viz-bottom-controls", + flag_descriptions::kAndroidBcivBottomControlsName, + flag_descriptions::kAndroidBcivBottomControlsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kAndroidBcivBottomControls)}, +#endif + +#if BUILDFLAG(IS_ANDROID) + {"android-desktop-density", flag_descriptions::kAndroidDesktopDensityName, + flag_descriptions::kAndroidDesktopDensityDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidDesktopDensity)}, +#endif + + {"optimization-guide-enable-dogfood-logging", + flag_descriptions::kOptimizationGuideEnableDogfoodLoggingName, + flag_descriptions::kOptimizationGuideEnableDogfoodLoggingDescription, + kOsAll, + SINGLE_VALUE_TYPE( + optimization_guide::switches::kEnableModelQualityDogfoodLogging)}, + +#if !BUILDFLAG(IS_ANDROID) + {"hybrid-passkeys-in-context-menu", + flag_descriptions::kWebAuthnUsePasskeyFromAnotherDeviceInContextMenuName, + flag_descriptions:: + kWebAuthnUsePasskeyFromAnotherDeviceInContextMenuDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(password_manager::features:: + kWebAuthnUsePasskeyFromAnotherDeviceInContextMenu)}, + {"web-authentication-passkey-upgrade", + flag_descriptions::kWebAuthnPasskeyUpgradeName, + flag_descriptions::kWebAuthnPasskeyUpgradeDescription, kOsDesktop, + FEATURE_VALUE_TYPE(device::kWebAuthnPasskeyUpgrade)}, +#endif + +#if BUILDFLAG(IS_CHROMEOS) + {"conch", flag_descriptions::kConchName, + flag_descriptions::kConchDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kConch)}, + + {"conch-system-audio-from-mic", + flag_descriptions::kConchSystemAudioFromMicName, + flag_descriptions::kConchSystemAudioFromMicDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kConchSystemAudioFromMic)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"autofill-sync-ewallet-accounts", + flag_descriptions::kAutofillSyncEwalletAccountsName, + flag_descriptions::kAutofillSyncEwalletAccountsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(autofill::features::kAutofillSyncEwalletAccounts)}, + + {"ewallet-payments", flag_descriptions::kEwalletPaymentsName, + flag_descriptions::kEwalletPaymentsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(payments::facilitated::kEwalletPayments)}, + + {"payment-link-detection", flag_descriptions::kPaymentLinkDetectionName, + flag_descriptions::kPaymentLinkDetectionDescription, kOsAndroid, + FEATURE_VALUE_TYPE(blink::features::kPaymentLinkDetection)}, + + {"process-rank-policy-android", + flag_descriptions::kProcessRankPolicyAndroidName, + flag_descriptions::kProcessRankPolicyAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kProcessRankPolicyAndroid)}, + + {"protected-tabs-android", flag_descriptions::kProtectedTabsAndroidName, + flag_descriptions::kProtectedTabsAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kProtectedTabsAndroid)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"ruby-short-heuristics", flag_descriptions::kRubyShortHeuristicsName, + flag_descriptions::kRubyShortHeuristicsDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kRubyShortHeuristics)}, + + {"prompt-api-for-gemini-nano", + flag_descriptions::kPromptAPIForGeminiNanoName, + flag_descriptions::kPromptAPIForGeminiNanoDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(blink::features::kAIPromptAPI, + kAILangsVariation, + "kAIPromptAPI"), + flag_descriptions::kAIAPIsForGeminiNanoLinks}, + + {"prompt-api-for-gemini-nano-multimodal-input", + flag_descriptions::kPromptAPIForGeminiNanoMultimodalInputName, + flag_descriptions::kPromptAPIForGeminiNanoMultimodalInputDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kAIPromptAPIMultimodalInput), + flag_descriptions::kAIAPIsForGeminiNanoLinks}, + + {"summarization-api-for-gemini-nano", + flag_descriptions::kSummarizationAPIForGeminiNanoName, + flag_descriptions::kSummarizationAPIForGeminiNanoDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(blink::features::kAISummarizationAPI, + kAILangsVariation, + "kAISummarizationAPI"), + flag_descriptions::kAIAPIsForGeminiNanoLinks}, + + {"writer-api-for-gemini-nano", + flag_descriptions::kWriterAPIForGeminiNanoName, + flag_descriptions::kWriterAPIForGeminiNanoDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(blink::features::kAIWriterAPI, + kAILangsVariation, + "kAIWriterAPI"), + flag_descriptions::kAIAPIsForGeminiNanoLinks}, + + {"rewriter-api-for-gemini-nano", + flag_descriptions::kRewriterAPIForGeminiNanoName, + flag_descriptions::kRewriterAPIForGeminiNanoDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(blink::features::kAIRewriterAPI, + kAILangsVariation, + "kAIRewriterAPI"), + flag_descriptions::kAIAPIsForGeminiNanoLinks}, + + {"proofreader-api-for-gemini-nano", + flag_descriptions::kProofreaderAPIForGeminiNanoName, + flag_descriptions::kProofreaderAPIForGeminiNanoDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kAIProofreadingAPI), + flag_descriptions::kAIAPIsForGeminiNanoLinks}, + + {"css-masonry-layout", flag_descriptions::kCssMasonryLayoutName, + flag_descriptions::kCssMasonryLayoutDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kCSSMasonryLayout)}, + + {"storage-access-api-follows-same-origin-policy", + flag_descriptions::kStorageAccessApiFollowsSameOriginPolicyName, + flag_descriptions::kStorageAccessApiFollowsSameOriginPolicyDescription, + kOsAll, + FEATURE_VALUE_TYPE( + net::features::kStorageAccessApiFollowsSameOriginPolicy)}, + + {"canvas-2d-hibernation", flag_descriptions::kCanvasHibernationName, + flag_descriptions::kCanvasHibernationDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kCanvas2DHibernation)}, + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) + {"enable-history-sync-optin", + flag_descriptions::kEnableHistorySyncOptinName, + flag_descriptions::kEnableHistorySyncOptinDescription, + kOsWin | kOsMac | kOsLinux, + FEATURE_VALUE_TYPE(switches::kEnableHistorySyncOptin)}, + {"sync-enable-bookmarks-in-transport-mode", + flag_descriptions::kSyncEnableBookmarksInTransportModeName, + flag_descriptions::kSyncEnableBookmarksInTransportModeDescription, + kOsWin | kOsMac | kOsLinux, + FEATURE_VALUE_TYPE(switches::kSyncEnableBookmarksInTransportMode)}, + {"reading-list-enable-sync-transport-mode-upon-sign-in", + flag_descriptions::kReadingListEnableSyncTransportModeUponSignInName, + flag_descriptions:: + kReadingListEnableSyncTransportModeUponSignInDescription, + kOsWin | kOsMac | kOsLinux, + FEATURE_VALUE_TYPE(syncer::kReadingListEnableSyncTransportModeUponSignIn)}, +#endif + + {"visited-url-ranking-service-domain-deduplication", + flag_descriptions::kVisitedURLRankingServiceDeduplicationName, + flag_descriptions::kVisitedURLRankingServiceDeduplicationDescription, + kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + visited_url_ranking::features::kVisitedURLRankingDeduplication, + kVisitedURLRankingDomainDeduplicationVariations, + "visited-url-ranking-service-domain-deduplication")}, + + {"visited-url-ranking-service-history-visibility-score-filter", + flag_descriptions:: + kVisitedURLRankingServiceHistoryVisibilityScoreFilterName, + flag_descriptions:: + kVisitedURLRankingServiceHistoryVisibilityScoreFilterDescription, + kOsAll, + FEATURE_VALUE_TYPE(visited_url_ranking::features:: + kVisitedURLRankingHistoryVisibilityScoreFilter)}, + + {"autofill-unmask-card-request-timeout", + flag_descriptions::kAutofillUnmaskCardRequestTimeoutName, + flag_descriptions::kAutofillUnmaskCardRequestTimeoutDescription, kOsAll, + FEATURE_VALUE_TYPE(autofill::features::kAutofillUnmaskCardRequestTimeout)}, + +#if !BUILDFLAG(IS_ANDROID) + {"freezing-on-energy-saver", flag_descriptions::kFreezingOnEnergySaverName, + flag_descriptions::kFreezingOnEnergySaverDescription, kOsDesktop, + FEATURE_VALUE_TYPE( + performance_manager::features::kFreezingOnBatterySaver)}, + + {"freezing-on-energy-saver-testing", + flag_descriptions::kFreezingOnEnergySaverTestingName, + flag_descriptions::kFreezingOnEnergySaverTestingDescription, kOsDesktop, + FEATURE_VALUE_TYPE( + performance_manager::features::kFreezingOnBatterySaverForTesting)}, + + {"infinite-tabs-freezing", flag_descriptions::kInfiniteTabsFreezingName, + flag_descriptions::kInfiniteTabsFreezingDescription, kOsDesktop, + FEATURE_VALUE_TYPE(performance_manager::features::kInfiniteTabsFreezing)}, + + {"memory-purge-on-freeze-limit", + flag_descriptions::kMemoryPurgeOnFreezeLimitName, + flag_descriptions::kMemoryPurgeOnFreezeLimitDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kMemoryPurgeOnFreezeLimit)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_WIN) + {"hid-get-feature-report-fix", + flag_descriptions::kHidGetFeatureReportFixName, + flag_descriptions::kHidGetFeatureReportFixDescription, kOsWin, + FEATURE_VALUE_TYPE(features::kHidGetFeatureReportFix)}, +#endif // BUILDFLAG(IS_WIN) + +#if !BUILDFLAG(IS_ANDROID) + {"translate-open-settings", flag_descriptions::kTranslateOpenSettingsName, + flag_descriptions::kTranslateOpenSettingsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(language::kTranslateOpenSettings)}, +#endif + + {"language-detection-api", flag_descriptions::kLanguageDetectionAPIName, + flag_descriptions::kLanguageDetectionAPIDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kLanguageDetectionAPI)}, + +#if BUILDFLAG(IS_ANDROID) + + {"history-opt-in-educational-tip", + flag_descriptions::kHistoryOptInEducationalTipName, + flag_descriptions::kHistoryOptInEducationalTipDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(switches::kHistoryOptInEducationalTip, + kHistoryOptInEducationalTipVariations, + "HistoryOptInEducationalTipVariations")}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) + {"supervised-user-local-web-approvals", + flag_descriptions::kSupervisedUserLocalWebApprovalsName, + flag_descriptions::kSupervisedUserLocalWebApprovalsDescription, + kOsLinux | kOsMac | kOsWin, + FEATURE_VALUE_TYPE(supervised_user::kLocalWebApprovals)}, + +#endif + +#if BUILDFLAG(IS_ANDROID) + {"sensitive-content", flag_descriptions::kSensitiveContentName, + flag_descriptions::kSensitiveContentDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + sensitive_content::features::kSensitiveContent, + kSensitiveContentVariations, + "SensitiveContent")}, + + {"sensitive-content-while-switching-tabs", + flag_descriptions::kSensitiveContentWhileSwitchingTabsName, + flag_descriptions::kSensitiveContentWhileSwitchingTabsDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + sensitive_content::features::kSensitiveContentWhileSwitchingTabs)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"data-sharing", flag_descriptions::kDataSharingName, + flag_descriptions::kDataSharingDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(data_sharing::features::kDataSharingFeature, + kDatasharingVariations, + "Enabled")}, + + {"collaboration-entreprise-v2", + flag_descriptions::kCollaborationEntrepriseV2Name, + flag_descriptions::kCollaborationEntrepriseV2Description, kOsAll, + FEATURE_VALUE_TYPE(data_sharing::features::kCollaborationEntrepriseV2)}, + + {"collaboration-shared-tab-group-account-data", + flag_descriptions::kCollaborationSharedTabGroupAccountDataName, + flag_descriptions::kCollaborationSharedTabGroupAccountDataDescription, + kOsAll, FEATURE_VALUE_TYPE(syncer::kSyncSharedTabGroupAccountData)}, + + {"data-sharing-join-only", flag_descriptions::kDataSharingJoinOnlyName, + flag_descriptions::kDataSharingJoinOnlyDescription, kOsAll, + FEATURE_VALUE_TYPE(data_sharing::features::kDataSharingJoinOnly)}, + + {"data-sharing-non-production-environment", + flag_descriptions::kDataSharingNonProductionEnvironmentName, + flag_descriptions::kDataSharingNonProductionEnvironmentDescription, kOsAll, + FEATURE_VALUE_TYPE( + data_sharing::features::kDataSharingNonProductionEnvironment)}, + + // LINT.IfChange(DataSharingVersioning) + {"shared-data-types-kill-switch", + flag_descriptions::kDataSharingVersioningStatesName, + flag_descriptions::kDataSharingVersioningStatesDescription, kOsAll, + MULTI_VALUE_TYPE(kDataSharingVersioningStateChoices)}, + // LINT.ThenChange(//ios/chrome/browser/flags/about_flags.mm:DataSharingVersioning) + + {"history-sync-alternative-illustration", + flag_descriptions::kHistorySyncAlternativeIllustrationName, + flag_descriptions::kHistorySyncAlternativeIllustrationDescription, kOsAll, + FEATURE_VALUE_TYPE(tab_groups::kUseAlternateHistorySyncIllustration)}, + + {"left-click-opens-tab-group-bubble", + flag_descriptions::kLeftClickOpensTabGroupBubbleName, + flag_descriptions::kLeftClickOpensTabGroupBubbleDescription, kOsDesktop, + FEATURE_VALUE_TYPE(tab_groups::kLeftClickOpensTabGroupBubble)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"cros-content-adjusted-refresh-rate", + flag_descriptions::kCrosContentAdjustedRefreshRateName, + flag_descriptions::kCrosContentAdjustedRefreshRateDescription, kOsCrOS, + FEATURE_VALUE_TYPE(features::kCrosContentAdjustedRefreshRate)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"autofill-enable-cvc-storage-and-filling-enhancement", + flag_descriptions::kAutofillEnableCvcStorageAndFillingEnhancementName, + flag_descriptions:: + kAutofillEnableCvcStorageAndFillingEnhancementDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableCvcStorageAndFillingEnhancement)}, + +#if BUILDFLAG(IS_ANDROID) + {"discount-on-navigation", + commerce::flag_descriptions::kDiscountOnNavigationName, + commerce::flag_descriptions::kDiscountOnNavigationDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(commerce::kEnableDiscountInfoApi, + kDiscountsVariationsOnAndroid, + "DisocuntOnNavigation")}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"discount-on-navigation", + commerce::flag_descriptions::kDiscountOnNavigationName, + commerce::flag_descriptions::kDiscountOnNavigationDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(commerce::kEnableDiscountInfoApi, + kDiscountsVariations, + "DisocuntOnNavigation")}, +#endif //! BUILDFLAG(IS_ANDROID) + + {"devtools-privacy-ui", flag_descriptions::kDevToolsPrivacyUIName, + flag_descriptions::kDevToolsPrivacyUIDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kDevToolsPrivacyUI)}, + + {"permissions-ai-v1", flag_descriptions::kPermissionsAIv1Name, + flag_descriptions::kPermissionsAIv1Description, kOsDesktop, + FEATURE_VALUE_TYPE(permissions::features::kPermissionsAIv1)}, + + {"permissions-ai-v3", flag_descriptions::kPermissionsAIv3Name, + flag_descriptions::kPermissionsAIv3Description, kOsDesktop, + FEATURE_VALUE_TYPE(permissions::features::kPermissionsAIv3)}, + + {"permissions-ai-v4", flag_descriptions::kPermissionsAIv4Name, + flag_descriptions::kPermissionsAIv4Description, kOsDesktop, + FEATURE_VALUE_TYPE(permissions::features::kPermissionsAIv4)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"exclude-display-in-mirror-mode", + flag_descriptions::kExcludeDisplayInMirrorModeName, + flag_descriptions::kExcludeDisplayInMirrorModeDescription, kOsCrOS, + FEATURE_VALUE_TYPE(display::features::kExcludeDisplayInMirrorMode)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"enable-task-manager-clank", flag_descriptions::kTaskManagerClankName, + flag_descriptions::kTaskManagerClankDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kTaskManagerClank)}, +#else + {"enable-task-manager-desktop-refresh", + flag_descriptions::kTaskManagerDesktopRefreshName, + flag_descriptions::kTaskManagerDesktopRefreshDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kTaskManagerDesktopRefresh)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"cert-verification-network-time", + flag_descriptions::kCertVerificationNetworkTimeName, + flag_descriptions::kCertVerificationNetworkTimeDescription, + kOsMac | kOsWin | kOsLinux | kOsAndroid, + FEATURE_VALUE_TYPE(features::kCertVerificationNetworkTime)}, + +#if !BUILDFLAG(IS_ANDROID) + {"enable-lens-overlay-simplified-selection", + flag_descriptions::kLensOverlaySimplifiedSelectionName, + flag_descriptions::kLensOverlaySimplifiedSelectionDescription, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensOverlaySimplifiedSelection)}, + + {"enable-lens-overlay-translate-button", + flag_descriptions::kLensOverlayTranslateButtonName, + flag_descriptions::kLensOverlayTranslateButtonDescription, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensOverlayTranslateButton)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-lens-overlay-latency-optimizations", + flag_descriptions::kLensOverlayLatencyOptimizationsName, + flag_descriptions::kLensOverlayLatencyOptimizationsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensOverlayLatencyOptimizations)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-lens-overlay-image-context-menu-actions", + flag_descriptions::kLensOverlayImageContextMenuActionsName, + flag_descriptions::kLensOverlayImageContextMenuActionsDescription, + kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + lens::features::kLensOverlayImageContextMenuActions, + kLensOverlayImageContextMenuActionsVariations, + "LensOverlayImageContextMenuActions")}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-lens-overlay-updated-visuals", + flag_descriptions::kLensOverlayUpdatedVisualsName, + flag_descriptions::kLensOverlayUpdatedVisualsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensOverlayVisualSelectionUpdates)}, + + {"enable-lens-search-aim-m3", flag_descriptions::kLensSearchAimM3Name, + flag_descriptions::kLensSearchAimM3Description, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensSearchAimM3)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"jump-start-omnibox", flag_descriptions::kJumpStartOmniboxName, + flag_descriptions::kJumpStartOmniboxDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kJumpStartOmnibox, + kJumpStartOmniboxVariations, + "JumpStartOmnibox")}, +#endif // BUILDFLAG(IS_ANDROID) + + {"enable-segmentation-internals-survey", + flag_descriptions::kSegmentationSurveyPageName, + flag_descriptions::kSegmentationSurveyPageDescription, kOsAll, + FEATURE_VALUE_TYPE( + segmentation_platform::features::kSegmentationSurveyPage)}, + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ + BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + {"autofill-enable-buy-now-pay-later", + flag_descriptions::kAutofillEnableBuyNowPayLaterName, + flag_descriptions::kAutofillEnableBuyNowPayLaterDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableBuyNowPayLater)}, + + {"autofill-enable-buy-now-pay-later-syncing", + flag_descriptions::kAutofillEnableBuyNowPayLaterSyncingName, + flag_descriptions::kAutofillEnableBuyNowPayLaterSyncingDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableBuyNowPayLaterSyncing)}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || + // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"biometric-auth-identity-check", + flag_descriptions::kBiometricAuthIdentityCheckName, + flag_descriptions::kBiometricAuthIdentityCheckDescription, kOsAndroid, + FEATURE_VALUE_TYPE( + password_manager::features::kBiometricAuthIdentityCheck)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"autofill-enable-cvc-storage-and-filling-standalone-form-enhancement", + flag_descriptions:: + kAutofillEnableCvcStorageAndFillingStandaloneFormEnhancementName, + flag_descriptions:: + kAutofillEnableCvcStorageAndFillingStandaloneFormEnhancementDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features:: + kAutofillEnableCvcStorageAndFillingStandaloneFormEnhancement)}, +#if BUILDFLAG(IS_ANDROID) + {"cct-sign-in-prompt", flag_descriptions::kCCTSignInPromptName, + flag_descriptions::kCCTSignInPromptDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(switches::kCctSignInPrompt, + kCctSignInPromptVariations, + "CctSignInPrompt")}, +#endif + + {"enable-bookmarks-selected-type-on-signin-for-testing", + flag_descriptions::kEnableBookmarksSelectedTypeOnSigninForTestingName, + flag_descriptions:: + kEnableBookmarksSelectedTypeOnSigninForTestingDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + syncer::kEnableBookmarksSelectedTypeOnSigninForTesting)}, + +#if !BUILDFLAG(IS_ANDROID) + {"separate-local-and-account-themes", + flag_descriptions::kSeparateLocalAndAccountThemesName, + flag_descriptions::kSeparateLocalAndAccountThemesDescription, kOsDesktop, + FEATURE_VALUE_TYPE(syncer::kSeparateLocalAndAccountThemes)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"clank-default-browser-promo-role-manager", + flag_descriptions::kClankDefaultBrowserPromoRoleManagerName, + flag_descriptions::kClankDefaultBrowserPromoRoleManagerDescription, + kOsAndroid, + SINGLE_DISABLE_VALUE_TYPE(switches::kDisableDefaultBrowserPromo)}, + + {"clank-default-browser-promo2", + flag_descriptions::kClankDefaultBrowserPromoName, + flag_descriptions::kClankDefaultBrowserPromoDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kDefaultBrowserPromoAndroid2)}, + + {"desktop-ua-on-connected-display", + flag_descriptions::kDesktopUAOnConnectedDisplayName, + flag_descriptions::kDesktopUAOnConnectedDisplayDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kDesktopUAOnConnectedDisplay)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"cros-mall-url", flag_descriptions::kCrosMallUrlName, + flag_descriptions::kCrosMallUrlDescription, kOsCrOS, + STRING_VALUE_TYPE(ash::switches::kMallUrl, "")}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"autofill-enable-card-benefits-iph", + flag_descriptions::kAutofillEnableCardBenefitsIphName, + flag_descriptions::kAutofillEnableCardBenefitsIphDescription, kOsDesktop, + FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableCardBenefitsIph)}, + +#if BUILDFLAG(IS_ANDROID) + {"support-multiple-server-requests-for-pix-payments", + flag_descriptions::kSupportMultipleServerRequestsForPixPaymentsName, + flag_descriptions::kSupportMultipleServerRequestsForPixPaymentsDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + payments::facilitated::kSupportMultipleServerRequestsForPixPayments)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"rusty-png", flag_descriptions::kRustyPngName, + flag_descriptions::kRustyPngDescription, kOsAll, + FEATURE_VALUE_TYPE(skia::kRustyPngFeature)}, + + {"autofill-enable-card-info-runtime-retrieval", + flag_descriptions::kAutofillEnableCardInfoRuntimeRetrievalName, + flag_descriptions::kAutofillEnableCardInfoRuntimeRetrievalDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableCardInfoRuntimeRetrieval)}, + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) + {"translation-api", flag_descriptions::kTranslationAPIName, + flag_descriptions::kTranslationAPIDescription, kOsMac | kOsWin | kOsLinux, + FEATURE_WITH_PARAMS_VALUE_TYPE(blink::features::kTranslationAPI, + kTranslationAPIVariations, + "TranslationAPI")}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) + + {"password-form-grouped-affiliations", + flag_descriptions::kPasswordFormGroupedAffiliationsName, + flag_descriptions::kPasswordFormGroupedAffiliationsDescription, kOsAll, + FEATURE_VALUE_TYPE( + password_manager::features::kPasswordFormGroupedAffiliations)}, + +#if !BUILDFLAG(IS_ANDROID) + {"privacy-guide-ai-settings", + flag_descriptions::kPrivacyGuideAiSettingsName, + flag_descriptions::kPrivacyGuideAiSettingsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(optimization_guide::features::kPrivacyGuideAiSettings)}, + +#endif // !BUILDFLAG(IS_ANDROID) + + {"password-form-clientside-classifier", + flag_descriptions::kPasswordFormClientsideClassifierName, + flag_descriptions::kPasswordFormClientsideClassifierDescription, kOsAll, + FEATURE_VALUE_TYPE( + password_manager::features::kPasswordFormClientsideClassifier)}, + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) + {"contextual-cueing", flag_descriptions::kContextualCueingName, + flag_descriptions::kContextualCueingDescription, + kOsLinux | kOsMac | kOsWin, + FEATURE_WITH_PARAMS_VALUE_TYPE(contextual_cueing::kContextualCueing, + kContextualCueingEnabledOptions, + "ContextualCueingEnabledOptions")}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) + + {"partitioned-popins", flag_descriptions::kPartitionedPopinsName, + flag_descriptions::kPartitionedPopinsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kPartitionedPopins)}, + +#if !BUILDFLAG(IS_ANDROID) + {"separate-local-and-account-search-engines", + flag_descriptions::kSeparateLocalAndAccountSearchEnginesName, + flag_descriptions::kSeparateLocalAndAccountSearchEnginesDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(syncer::kSeparateLocalAndAccountSearchEngines)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + {"partition-alloc-with-advanced-checks", + flag_descriptions::kPartitionAllocWithAdvancedChecksName, + flag_descriptions::kPartitionAllocWithAdvancedChecksDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + base::features::kPartitionAllocWithAdvancedChecks, + kPartitionAllocWithAdvancedChecksEnabledProcessesOptions, + "PartitionAllocWithAdvancedChecks")}, +#endif // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + + {"partition-visited-link-database-with-self-links", + flag_descriptions::kPartitionVisitedLinkDatabaseWithSelfLinksName, + flag_descriptions::kPartitionVisitedLinkDatabaseWithSelfLinksDescription, + kOsAll, + FEATURE_VALUE_TYPE( + blink::features::kPartitionVisitedLinkDatabaseWithSelfLinks)}, + + {"predictable-reported-quota", + flag_descriptions::kPredictableReportedQuotaName, + flag_descriptions::kPredictableReportedQuotaDescription, kOsAll, + FEATURE_VALUE_TYPE(storage::features::kStaticStorageQuota)}, + +#if BUILDFLAG(IS_ANDROID) + {"use-ahardwarebuffer-usage-flags-from-vulkan", + flag_descriptions::kUseHardwareBufferUsageFlagsFromVulkanName, + flag_descriptions::kUseHardwareBufferUsageFlagsFromVulkanDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(::features::kUseHardwareBufferUsageFlagsFromVulkan)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) && PA_BUILDFLAG(HAS_MEMORY_TAGGING) && \ + PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + {"partition-alloc-memory-tagging", + flag_descriptions::kPartitionAllocMemoryTaggingName, + flag_descriptions::kPartitionAllocMemoryTaggingDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + base::features::kPartitionAllocMemoryTagging, + kPartitionAllocMemoryTaggingEnabledProcessesOptions, + "PartitionAllocMemoryTagging")}, +#endif // BUILDFLAG(IS_ANDROID) && PA_BUILDFLAG(HAS_MEMORY_TAGGING) && + // PA_BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) + +#if BUILDFLAG(IS_MAC) + {"enable-mac-a11y-api-migration", + flag_descriptions::kMacAccessibilityAPIMigrationName, + flag_descriptions::kMacAccessibilityAPIMigrationDescription, kOsMac, + FEATURE_VALUE_TYPE(features::kMacAccessibilityAPIMigration)}, +#endif // BUILDFLAG(IS_MAC) + +#if BUILDFLAG(ENABLE_EXTENSIONS) + {"allow-legacy-mv2-extensions", + flag_descriptions::kAllowLegacyMV2ExtensionsName, + flag_descriptions::kAllowLegacyMV2ExtensionsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(extensions_features::kAllowLegacyMV2Extensions)}, +#endif // BUILDFLAG(ENABLE_EXTENSIONS) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-lens-overlay-translate-languages", + flag_descriptions::kLensOverlayTranslateLanguagesName, + flag_descriptions::kLensOverlayTranslateLanguagesDescription, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensOverlayTranslateLanguages)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(ENABLE_GLIC) + {"glic", flag_descriptions::kGlicName, flag_descriptions::kGlicDescription, + kOsMac | kOsWin | kOsLinux, FEATURE_VALUE_TYPE(features::kGlic)}, + {"glic-z-order-changes", flag_descriptions::kGlicZOrderChangesName, + flag_descriptions::kGlicZOrderChangesDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(features::kGlicZOrderChanges)}, + {"glic-actor", flag_descriptions::kGlicActorName, + flag_descriptions::kGlicActorDescription, kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(features::kGlicActor)}, + {"glic-detached", flag_descriptions::kGlicDetachedName, + flag_descriptions::kGlicDetachedDescription, kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(features::kGlicDetached)}, + {"glic-panel-reset-top-chrome-button", + flag_descriptions::kGlicPanelResetTopChromeButtonName, + flag_descriptions::kGlicPanelResetTopChromeButtonDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kGlicPanelResetTopChromeButton, + kGlicPanelResetTopChromeButtonVariations, + "GlicPanelResetTopChromeButton")}, + {"glic-panel-reset-on-start", flag_descriptions::kGlicPanelResetOnStartName, + flag_descriptions::kGlicPanelResetOnStartDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(features::kGlicPanelResetOnStart)}, + {"glic-panel-set-position-on-drag", + flag_descriptions::kGlicPanelSetPositionOnDragName, + flag_descriptions::kGlicPanelSetPositionOnDragDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(features::kGlicPanelSetPositionOnDrag)}, + {"glic-panel-reset-on-session-timeout", + flag_descriptions::kGlicPanelResetOnSessionTimeoutName, + flag_descriptions::kGlicPanelResetOnSessionTimeoutDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kGlicPanelResetOnSessionTimeout, + kGlicPanelResetOnSessionTimeoutVariations, + "GlicPanelResetOnSessionTimeout")}, + {"glic-panel-reset-size-and-location-on-open", + flag_descriptions::kGlicPanelResetSizeAndLocationName, + flag_descriptions::kGlicPanelResetSizeAndLocationDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(features::kGlicPanelResetSizeAndLocationOnOpen)}, + {"glic-pre-warming", flag_descriptions::kGlicWarmingName, + flag_descriptions::kGlicWarmingDescription, kOsMac | kOsWin | kOsLinux, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kGlicWarming, + kGlicWarmingVariations, + "GlicWarming")}, + {"glic-fre-pre-warming", flag_descriptions::kGlicFreWarmingName, + flag_descriptions::kGlicFreWarmingDescription, kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(features::kGlicFreWarming)}, +#endif // BUILDFLAG(ENABLE_GLIC) + +#if BUILDFLAG(IS_ANDROID) + {"enterprise-security-event-reporting-on-android", + flag_descriptions::kEnterpriseSecurityEventReportingOnAndroidName, + flag_descriptions::kEnterpriseSecurityEventReportingOnAndroidDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + enterprise_connectors::kEnterpriseSecurityEventReportingOnAndroid)}, + +#endif // BUILDFLAG(IS_ANDROID) + + {"service-worker-auto-preload", + flag_descriptions::kServiceWorkerAutoPreloadName, + flag_descriptions::kServiceWorkerAutoPreloadDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kServiceWorkerAutoPreload, + kServiceWorkerAutoPreloadVariations, + "ServiceWorkerAutoPreload")}, + + {"autofill-enable-save-and-fill", + flag_descriptions::kAutofillEnableSaveAndFillName, + flag_descriptions::kAutofillEnableSaveAndFillDescription, kOsDesktop, + FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableSaveAndFill)}, + + {"autofill-improved-labels", flag_descriptions::kAutofillImprovedLabelsName, + flag_descriptions::kAutofillImprovedLabelsDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(autofill::features::kAutofillImprovedLabels, + kAutofillImprovedLabelsVariations, + "AutofillImprovedLabels")}, + +#if BUILDFLAG(IS_ANDROID) + {"android-appearance-settings", + flag_descriptions::kAndroidAppearanceSettingsName, + flag_descriptions::kAndroidAppearanceSettingsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidAppearanceSettings)}, + + {"android-bookmark-bar", flag_descriptions::kAndroidBookmarkBarName, + flag_descriptions::kAndroidBookmarkBarDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidBookmarkBar)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"cros-mall-managed", flag_descriptions::kCrosMallManagedName, + flag_descriptions::kCrosMallManagedDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kCrosMallManaged)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"happy-eyeballs-v3", flag_descriptions::kHappyEyeballsV3Name, + flag_descriptions::kHappyEyeballsV3Description, kOsAll, + FEATURE_VALUE_TYPE(net::features::kHappyEyeballsV3)}, + + {"signature-based-sri", flag_descriptions::kSignatureBasedSriName, + flag_descriptions::kSignatureBasedSriDescription, kOsAll, + FEATURE_VALUE_TYPE(network::features::kSRIMessageSignatureEnforcement)}, + +#if !BUILDFLAG(IS_ANDROID) + {"policy-promotion-banner-flag", + flag_descriptions::kEnablePolicyPromotionBannerName, + flag_descriptions::kEnablePolicyPromotionBannerDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kEnablePolicyPromotionBanner)}, + {"management-promotion-banner-flag", + flag_descriptions::kEnableManagementPromotionBannerName, + flag_descriptions::kEnableManagementPromotionBannerDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kEnableManagementPromotionBanner)}, +#endif + + {"privacy-sandbox-ads-api-ux-enhancements", + flag_descriptions::kPrivacySandboxAdsApiUxEnhancementsName, + flag_descriptions::kPrivacySandboxAdsApiUxEnhancementsDescription, kOsAll, + FEATURE_VALUE_TYPE(privacy_sandbox::kPrivacySandboxAdsApiUxEnhancements)}, + +#if !BUILDFLAG(IS_ANDROID) + {"safety-hub-services-on-start-up", + flag_descriptions::kSafetyHubServicesOnStartUpName, + flag_descriptions::kSafetyHubServicesOnStartUpDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kSafetyHubServicesOnStartUp)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + {"enable-oauth-multilogin-cookies-binding", + flag_descriptions::kEnableOAuthMultiloginCookiesBindingName, + flag_descriptions::kEnableOAuthMultiloginCookiesBindingDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(switches::kEnableOAuthMultiloginCookiesBinding)}, + + {"enable-chrome-refresh-token-binding", + flag_descriptions::kEnableChromeRefreshTokenBindingName, + flag_descriptions::kEnableChromeRefreshTokenBindingDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE(switches::kEnableChromeRefreshTokenBinding)}, +#endif // BUILDFLAG(ENABLE_DICE_SUPPORT) + +#if BUILDFLAG(IS_CHROMEOS) + {"use-managed-print-job-options-in-print-preview", + flag_descriptions::kUseManagedPrintJobOptionsInPrintPreviewName, + flag_descriptions::kUseManagedPrintJobOptionsInPrintPreviewDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kUseManagedPrintJobOptionsInPrintPreview)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"autofill-third-party-mode-content-provider", + flag_descriptions::kAutofillThirdPartyModeContentProviderName, + flag_descriptions::kAutofillThirdPartyModeContentProviderDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillThirdPartyModeContentProvider)}, +#endif + +#if !BUILDFLAG(IS_ANDROID) + {"three-button-password-save-dialog", + flag_descriptions::kThreeButtonPasswordSaveDialogName, + flag_descriptions::kThreeButtonPasswordSaveDialogDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kThreeButtonPasswordSaveDialog)}, + +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_MAC) + {"block-root-window-accessible-name-change-event", + flag_descriptions::kBlockRootWindowAccessibleNameChangeEventName, + flag_descriptions::kBlockRootWindowAccessibleNameChangeEventDescription, + kOsMac, + FEATURE_VALUE_TYPE(::features::kBlockRootWindowAccessibleNameChangeEvent)}, +#endif // BUILDFLAG(IS_MAC) + + {"throttle-main-thread-to-60hz", flag_descriptions::kThrottleMainTo60HzName, + flag_descriptions::kThrottleMainTo60HzDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kThrottleMainFrameTo60Hz)}, + + {"client-side-detection-brand-and-page-intent", + flag_descriptions::kClientSideDetectionBrandAndIntentForScamDetectionName, + flag_descriptions:: + kClientSideDetectionBrandAndIntentForScamDetectionDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE( + safe_browsing::kClientSideDetectionBrandAndIntentForScamDetection)}, + +#if BUILDFLAG(IS_ANDROID) + {"client-side-detection-send-intelligent-scan-info-android", + flag_descriptions::kClientSideDetectionSendIntelligentScanInfoAndroidName, + flag_descriptions:: + kClientSideDetectionSendIntelligentScanInfoAndroidDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + safe_browsing::kClientSideDetectionSendIntelligentScanInfoAndroid)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"client-side-detection-show-scam-verdict-warning", + flag_descriptions::kClientSideDetectionShowScamVerdictWarningName, + flag_descriptions::kClientSideDetectionShowScamVerdictWarningDescription, + kOsMac | kOsWin | kOsLinux, + FEATURE_VALUE_TYPE( + safe_browsing::kClientSideDetectionShowScamVerdictWarning)}, + +#if BUILDFLAG(IS_ANDROID) + {"client-side-detection-show-scam-verdict-warning-android", + flag_descriptions::kClientSideDetectionShowScamVerdictWarningAndroidName, + flag_descriptions:: + kClientSideDetectionShowScamVerdictWarningAndroidDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + safe_browsing::kClientSideDetectionShowScamVerdictWarningAndroid)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-keyboard-used-palm-suppression", + flag_descriptions::kEnableKeyboardUsedPalmSuppressionName, + flag_descriptions::kEnableKeyboardUsedPalmSuppressionDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ui::kEnableKeyboardUsedPalmSuppression)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"autofill-enable-card-benefits-for-bmo", + flag_descriptions::kAutofillEnableCardBenefitsForBmoName, + flag_descriptions::kAutofillEnableCardBenefitsForBmoDescription, kOsAll, + FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableCardBenefitsForBmo)}, + +#if BUILDFLAG(IS_WIN) + {"windows-system-tracing", flag_descriptions::kWindowsSystemTracingName, + flag_descriptions::kWindowsSystemTracingDescription, kOsWin, + FEATURE_VALUE_TYPE(kWindowsSystemTracing)}, +#endif // BUILDFLAG(IS_WIN) + +#if BUILDFLAG(IS_CHROMEOS) + {"fast-drm-master-drop", flag_descriptions::kFastDrmMasterDropName, + flag_descriptions::kFastDrmMasterDropDescription, kOsCrOS, + FEATURE_VALUE_TYPE(display::features::kFastDrmMasterDrop)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if !BUILDFLAG(IS_ANDROID) + {"bookmarks-tree-view", flag_descriptions::kBookmarksTreeViewName, + flag_descriptions::kBookmarksTreeViewDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kBookmarksTreeView)}, +#endif + + {"enable-secure-payment-confirmation-availability-api", + flag_descriptions::kSecurePaymentConfirmationAvailabilityAPIName, + flag_descriptions::kSecurePaymentConfirmationAvailabilityAPIDescription, + kOsAll, + FEATURE_VALUE_TYPE( + blink::features::kSecurePaymentConfirmationAvailabilityAPI)}, + + {"autofill-enable-allowlist-for-bmo-card-category-benefits", + flag_descriptions::kAutofillEnableAllowlistForBmoCardCategoryBenefitsName, + flag_descriptions:: + kAutofillEnableAllowlistForBmoCardCategoryBenefitsDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features:: + kAutofillEnableAllowlistForBmoCardCategoryBenefits)}, +#if BUILDFLAG(IS_ANDROID) + {"new-etc1-encoder", flag_descriptions::kNewEtc1EncoderName, + flag_descriptions::kNewEtc1EncoderDescription, kOsAndroid, + FEATURE_VALUE_TYPE(ui::kUseNewEtc1Encoder)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) + {"automatic-usb-detach", flag_descriptions::kAutomaticUsbDetachName, + flag_descriptions::kAutomaticUsbDetachDescription, kOsAndroid | kOsLinux, + FEATURE_VALUE_TYPE(features::kAutomaticUsbDetach)}, +#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_LINUX) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-lens-overlay-side-panel-open-in-new-tab", + flag_descriptions::kLensOverlaySidePanelOpenInNewTabName, + flag_descriptions::kLensOverlaySidePanelOpenInNewTabDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensOverlaySidePanelOpenInNewTab)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) + {"enforce-system-echo-cancellation", + flag_descriptions::kEnforceSystemEchoCancellationName, + flag_descriptions::kEnforceSystemEchoCancellationDescription, + kOsWin | kOsMac, + FEATURE_VALUE_TYPE(media::kEnforceSystemEchoCancellation)}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) + +#if !BUILDFLAG(IS_ANDROID) + {"improved-password-change-service", + flag_descriptions::kImprovedPasswordChangeServiceName, + flag_descriptions::kImprovedPasswordChangeServiceDescription, kOsDesktop, + FEATURE_VALUE_TYPE( + password_manager::features::kImprovedPasswordChangeService)}, + {"mark-all-credentials-as-leaked", + flag_descriptions::kMarkAllCredentialsAsLeakedName, + flag_descriptions::kMarkAllCredentialsAsLeakedDescription, kOsDesktop, + FEATURE_VALUE_TYPE( + password_manager::features::kMarkAllCredentialsAsLeaked)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"account-storage-prefs-themes-search-engines", + flag_descriptions::kAccountStoragePrefsThemesAndSearchEnginesName, + flag_descriptions::kAccountStoragePrefsThemesAndSearchEnginesDescription, + kOsDesktop, + MULTI_VALUE_TYPE(kAccountStoragePrefsThemesAndSearchEnginesChoices)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ + BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + {"autofill-enable-amount-extraction", + flag_descriptions::kAutofillEnableAmountExtractionName, + flag_descriptions::kAutofillEnableAmountExtractionDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableAmountExtraction)}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || + // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-ax-tree-fixing", flag_descriptions::kAXTreeFixingName, + flag_descriptions::kAXTreeFixingDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kAXTreeFixing)}, +#endif // !BUILDFLAG(IS_ANDROID) + {"enable-clipboardchange-event", + flag_descriptions::kClipboardChangeEventName, + flag_descriptions::kClipboardChangeEventDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kClipboardChangeEvent)}, + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ + BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + {"autofill-enable-amount-extraction-allowlist", + flag_descriptions::kAutofillEnableAmountExtractionAllowlistName, + flag_descriptions::kAutofillEnableAmountExtractionAllowlistDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableAmountExtractionAllowlist)}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || + // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"devtools-project-settings", + flag_descriptions::kDevToolsProjectSettingsName, + flag_descriptions::kDevToolsProjectSettingsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kDevToolsWellKnown)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"malicious-apk-download-check", + flag_descriptions::kMaliciousApkDownloadCheckName, + flag_descriptions::kMaliciousApkDownloadCheckDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(safe_browsing::kMaliciousApkDownloadCheck, + kMaliciousApkDownloadCheckChoices, + "MaliciousApkDownloadCheck")}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {kDisableFacilitatedPaymentsMerchantAllowlistInternalName, + flag_descriptions::kDisableFacilitatedPaymentsMerchantAllowlistName, + flag_descriptions::kDisableFacilitatedPaymentsMerchantAllowlistDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + payments::facilitated::kDisableFacilitatedPaymentsMerchantAllowlist)}, +#endif // BUILDFLAF(IS_ANDROID) + + {"drop-input-events-while-paint-holding", + flag_descriptions::kDropInputEventsWhilePaintHoldingName, + flag_descriptions::kDropInputEventsWhilePaintHoldingDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kDropInputEventsWhilePaintHolding)}, + +#if !BUILDFLAG(IS_ANDROID) + {"dbd-revamp-desktop", flag_descriptions::kDbdRevampDesktopName, + flag_descriptions::kDbdRevampDesktopDescription, kOsDesktop, + FEATURE_VALUE_TYPE(browsing_data::features::kDbdRevampDesktop)}, +#endif // !BUILDFLAG(IS_ANDROID) + + {"privacy-sandbox-ad-topics-content-parity", + flag_descriptions::kPrivacySandboxAdTopicsContentParityName, + flag_descriptions::kPrivacySandboxAdTopicsContentParityDescription, kOsAll, + FEATURE_VALUE_TYPE(privacy_sandbox::kPrivacySandboxAdTopicsContentParity)}, + +#if BUILDFLAG(IS_ANDROID) + {"enable-android-document-picture-in-picture", + flag_descriptions::kAndroidDocumentPictureInPictureName, + flag_descriptions::kAndroidDocumentPictureInPictureDescription, kOsAndroid, + FEATURE_VALUE_TYPE(blink::features::kDocumentPictureInPictureAPI)}, + + {"enable-android-mininal-ui-large-screen", + flag_descriptions::kAndroidMinimalUiLargeScreenName, + flag_descriptions::kAndroidMinimalUiLargeScreenDescription, kOsAndroid, + FEATURE_VALUE_TYPE(webapps::features::kAndroidMinimalUiLargeScreen)}, + + {"enable-android-window-controls-overlay", + flag_descriptions::kAndroidWindowControlsOverlayName, + flag_descriptions::kAndroidWindowControlsOverlayDescription, kOsAndroid, + FEATURE_VALUE_TYPE(webapps::features::kAndroidWindowControlsOverlay)}, + + {"credential-management-third-party-web-api-request-forwarding", + flag_descriptions:: + kCredentialManagementThirdPartyWebApiRequestForwardingName, + flag_descriptions:: + kCredentialManagementThirdPartyWebApiRequestForwardingDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + credential_management::features:: + kCredentialManagementThirdPartyWebApiRequestForwarding)}, + + {"third-party-disable-chrome-autofill-settings-screen", + flag_descriptions::kThirdPartyDisableChromeAutofillSettingsScreenName, + flag_descriptions:: + kThirdPartyDisableChromeAutofillSettingsScreenDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kThirdPartyDisableChromeAutofillSettingsScreen)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"enable-android-window-popup-large-screen", + flag_descriptions::kAndroidWindowPopupLargeScreenName, + flag_descriptions::kAndroidWindowPopupLargeScreenDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidWindowPopupLargeScreen)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"enable-android-window-popup-predict-final-bounds", + flag_descriptions::kAndroidWindowPopupPredictFinalBoundsName, + flag_descriptions::kAndroidWindowPopupPredictFinalBoundsDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kAndroidWindowPopupPredictFinalBounds)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"enable-android-window-popup-resize-after-spawn", + flag_descriptions::kAndroidWindowPopupResizeAfterSpawnName, + flag_descriptions::kAndroidWindowPopupResizeAfterSpawnDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidWindowPopupResizeAfterSpawn)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"enable-android-window-occlusion", + flag_descriptions::kAndroidWindowOcclusionName, + flag_descriptions::kAndroidWindowOcclusionDescription, kOsAndroid, + FEATURE_VALUE_TYPE(ui::kAndroidWindowOcclusion)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(ENTERPRISE_CONTENT_ANALYSIS) + {"enterprise-file-obfuscation", + flag_descriptions::kEnterpriseFileObfuscationName, + flag_descriptions::kEnterpriseFileObfuscationDescription, kOsDesktop, + FEATURE_VALUE_TYPE(enterprise_obfuscation::kEnterpriseFileObfuscation)}, +#endif // BUILDFLAG(ENTERPRISE_CONTENT_ANALYSIS) + + {"iph-autofill-credit-card-benefit-feature", + flag_descriptions::kIPHAutofillCreditCardBenefitFeatureName, + flag_descriptions::kIPHAutofillCreditCardBenefitFeatureDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + feature_engagement::kIPHAutofillCreditCardBenefitFeature)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"allow-user-installed-chrome-apps", + flag_descriptions::kAllowUserInstalledChromeAppsName, + flag_descriptions::kAllowUserInstalledChromeAppsDescription, kOsCrOS, + FEATURE_VALUE_TYPE( + apps::chrome_app_deprecation::kAllowUserInstalledChromeApps)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + {"chrome-web-store-navigation-throttle", + flag_descriptions::kChromeWebStoreNavigationThrottleName, + flag_descriptions::kChromeWebStoreNavigationThrottleDescription, + kOsLinux | kOsMac | kOsWin, + FEATURE_VALUE_TYPE( + enterprise::webstore::kChromeWebStoreNavigationThrottle)}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) + + {"autofill-enable-new-fop-display-desktop", + flag_descriptions::kAutofillEnableNewFopDisplayDesktopName, + flag_descriptions::kAutofillEnableNewFopDisplayDesktopDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableNewFopDisplayDesktop)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-printing-margins-and-scale", + flag_descriptions::kEnablePrintingMarginsAndScale, + flag_descriptions::kEnablePrintingMarginsAndScaleDescription, kOsCrOS, + FEATURE_VALUE_TYPE(printing::features::kApiPrintingMarginsAndScale)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"supervised-user-block-interstitial-v3", + flag_descriptions::kSupervisedUserBlockInterstitialV3Name, + flag_descriptions::kSupervisedUserBlockInterstitialV3Description, kOsAll, + FEATURE_VALUE_TYPE(supervised_user::kSupervisedUserBlockInterstitialV3)}, + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ + BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + {"autofill-enable-amount-extraction-testing", + flag_descriptions::kAutofillEnableAmountExtractionTestingName, + flag_descriptions::kAutofillEnableAmountExtractionTestingDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableAmountExtractionTesting)}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || + // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + + {"enable-web-app-predictable-app-updating", + flag_descriptions::kEnableWebAppPredictableAppUpdatingName, + flag_descriptions::kEnableWebAppPredictableAppUpdatingDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kWebAppPredictableAppUpdating)}, + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) + {"root-scrollbar-follows-browser-theme", + flag_descriptions::kRootScrollbarFollowsTheme, + flag_descriptions::kRootScrollbarFollowsThemeDescription, + kOsLinux | kOsWin, + FEATURE_VALUE_TYPE(blink::features::kRootScrollbarFollowsBrowserTheme)}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) + +#if BUILDFLAG(IS_ANDROID) + {"android-theme-module", flag_descriptions::kAndroidThemeModuleName, + flag_descriptions::kAndroidThemeModuleDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kAndroidThemeModule, + kAndroidThemeModuleVariations, + "AndroidThemeModule")}, + {"android-theme-resource-provider", + flag_descriptions::kAndroidThemeResourceProviderName, + flag_descriptions::kAndroidThemeResourceProviderDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE( + chrome::android::kAndroidThemeResourceProvider, + kAndroidThemeResourceProviderVariations, + "AndroidThemeResourceProvider")}, + {"display-edge-to-edge-fullscreen", + flag_descriptions::kDisplayEdgeToEdgeFullscreenName, + flag_descriptions::kDisplayEdgeToEdgeFullscreenDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kDisplayEdgeToEdgeFullscreen)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"local-network-access-check", + flag_descriptions::kLocalNetworkAccessChecksName, + flag_descriptions::kLocalNetworkAccessChecksDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + network::features::kLocalNetworkAccessChecks, + kLocalNetworkAccessChecksVariations, + "LocalNetworkAccessChecks")}, + {"local-network-access-check-webrtc", + flag_descriptions::kLocalNetworkAccessChecksWebRTCName, + flag_descriptions::kLocalNetworkAccessChecksWebRTCDescription, kOsAll, + FEATURE_VALUE_TYPE(network::features::kLocalNetworkAccessChecksWebRTC)}, + +#if BUILDFLAG(IS_CHROMEOS) + {"notebook-lm-app-preinstall", + flag_descriptions::kNotebookLmAppPreinstallName, + flag_descriptions::kNotebookLmAppPreinstallDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kNotebookLmAppPreinstall)}, +#endif // BUILDFLAG(IS_CHROMEOS) + + {"enable-canvas-noise", flag_descriptions::kEnableCanvasNoiseName, + flag_descriptions::kEnableCanvasNoiseDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + fingerprinting_protection_interventions::features::kCanvasNoise, + kEnableCanvasNoiseVariations, + "EnableCanvasNoise")}, + +#if !BUILDFLAG(IS_ANDROID) + {"tab-capture-infobar-links", + flag_descriptions::kTabCaptureInfobarLinksName, + flag_descriptions::kTabCaptureInfobarLinksDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kTabCaptureInfobarLinks)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"enable-empty-space-context-menu-clank", + flag_descriptions::kContextMenuEmptySpaceName, + flag_descriptions::kContextMenuEmptySpaceDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kContextMenuEmptySpace)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"android-surface-color-update", + flag_descriptions::kAndroidSurfaceColorUpdateName, + flag_descriptions::kAndroidSurfaceColorUpdateDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidSurfaceColorUpdate)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"input-on-viz", flag_descriptions::kInputOnVizName, + flag_descriptions::kInputOnVizDescription, kOsAndroid, + FEATURE_VALUE_TYPE(input::features::kInputOnViz)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"aaudio-per-stream-device-selection", + flag_descriptions::kAAudioPerStreamDeviceSelectionName, + flag_descriptions::kAAudioPerStreamDeviceSelectionDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kAAudioPerStreamDeviceSelection)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-lens-search-side-panel-new-feedback", + flag_descriptions::kLensSearchSidePanelNewFeedbackName, + flag_descriptions::kLensSearchSidePanelNewFeedbackDescription, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensSearchSidePanelNewFeedback)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"headless-tab-model", flag_descriptions::kHeadlessTabModelName, + flag_descriptions::kHeadlessTabModelDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kHeadlessTabModel)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"autofill-vcn-enroll-strike-expiry-time", + flag_descriptions::kAutofillVcnEnrollStrikeExpiryTimeName, + flag_descriptions::kAutofillVcnEnrollStrikeExpiryTimeDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + autofill::features::kAutofillVcnEnrollStrikeExpiryTime, + kAutofillVcnEnrollStrikeExpiryTimeOptions, + "AutofillVcnEnrollStrikeExpiryTime")}, + +#if BUILDFLAG(IS_ANDROID) + {"background-compact", flag_descriptions::kBackgroundCompactMessageName, + flag_descriptions::kBackgroundCompactDescription, kOsAndroid, + FEATURE_VALUE_TYPE(base::android::kShouldFreezeSelf)}, + + {"running-compact", flag_descriptions::kRunningCompactMessageName, + flag_descriptions::kRunningCompactDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(base::android::kUseRunningCompact, + kUseRunningCompactDelayOptions, + "UseRunningCompactDelay")}, + +#endif // BUILDFLAG(IS_ANDROID) + + {"autofill-enable-flat-rate-card-benefits-from-curinos", + flag_descriptions::kAutofillEnableFlatRateCardBenefitsFromCurinosName, + flag_descriptions:: + kAutofillEnableFlatRateCardBenefitsFromCurinosDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableFlatRateCardBenefitsFromCurinos)}, + +#if BUILDFLAG(IS_ANDROID) + {"grid-tab-switcher-surface-color-update", + flag_descriptions::kGridTabSwitcherSurfaceColorUpdateName, + flag_descriptions::kGridTabSwitcherSurfaceColorUpdateDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kGridTabSwitcherSurfaceColorUpdate)}, + + // Contextual Page Action button. + {"cpa-spec-update", flag_descriptions::kCpaSpecUpdateName, + flag_descriptions::kCpaSpecUpdateDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kCpaSpecUpdate)}, + + // Android Automotive back button bar streamline. + {"automotive-back-button-bar-streamline", + flag_descriptions::kAutomotiveBackButtonBarStreamlineName, + flag_descriptions::kAutomotiveBackButtonBarStreamlineDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAutomotiveBackButtonBarStreamline)}, + +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {flag_descriptions::kTabGroupShorcutsId, + flag_descriptions::kTabGroupShorcutsName, + flag_descriptions::kTabGroupShorcutsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(tabs::kTabGroupShortcuts)}, +#endif // !BUILDFLAG(IS_ANDROID) + + {"bundled-security-settings", + flag_descriptions::kBundledSecuritySettingsName, + flag_descriptions::kBundledSecuritySettingsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(safe_browsing::kBundledSecuritySettings)}, + + {"invalidate-search-engine-choice-on-device-restore-detection", + flag_descriptions:: + kInvalidateSearchEngineChoiceOnDeviceRestoreDetectionName, + flag_descriptions:: + kInvalidateSearchEngineChoiceOnDeviceRestoreDetectionDescription, + kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + switches::kInvalidateSearchEngineChoiceOnDeviceRestoreDetection, + kInvalidateSearchEngineChoiceOnRestoreVariations, + "InvalidateSearchEngineChoiceOnDeviceRestoreDetection")}, + + {"block-cross-partition-blob-url-fetching", + flag_descriptions::kBlockCrossPartitionBlobUrlFetchingName, + flag_descriptions::kBlockCrossPartitionBlobUrlFetchingDescription, kOsAll, + FEATURE_VALUE_TYPE(features::kBlockCrossPartitionBlobUrlFetching)}, + +#if BUILDFLAG(IS_ANDROID) + {"use-android-buffered-input-dispatch", + flag_descriptions::kUseAndroidBufferedInputDispatchName, + flag_descriptions::kUseAndroidBufferedInputDispatchDescription, kOsAndroid, + FEATURE_VALUE_TYPE(input::features::kUseAndroidBufferedInputDispatch)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"web-authentication-immediate-get", + flag_descriptions::kWebAuthnImmediateGetName, + flag_descriptions::kWebAuthnImmediateGetDescription, kOsAll, + FEATURE_VALUE_TYPE(device::kWebAuthnImmediateGet)}, + + {"media-playback-while-not-visible-permission-policy", + flag_descriptions::kMediaPlaybackWhileNotVisiblePermissionPolicyName, + flag_descriptions:: + kMediaPlaybackWhileNotVisiblePermissionPolicyDescription, + kOsAll, + FEATURE_VALUE_TYPE( + blink::features::kMediaPlaybackWhileNotVisiblePermissionPolicy)}, + +#if BUILDFLAG(IS_ANDROID) + {"android-adaptive-frame-rate", + flag_descriptions::kAndroidAdaptiveFrameRateName, + flag_descriptions::kAndroidAdaptiveFrameRateDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kUseFrameIntervalDeciderAdaptiveFrameRate)}, + + {"instance-switcher-v2", flag_descriptions::kInstanceSwitcherV2Name, + flag_descriptions::kInstanceSwitcherV2Description, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kInstanceSwitcherV2)}, + + {"robust-window-management", flag_descriptions::kRobustWindowManagementName, + flag_descriptions::kRobustWindowManagementDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kRobustWindowManagement)}, + + {"robust-window-management-experimental", + flag_descriptions::kRobustWindowManagementExperimentalName, + flag_descriptions::kRobustWindowManagementExperimentalDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kRobustWindowManagementExperimental)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"side-by-side", flag_descriptions::kSideBySideName, + flag_descriptions::kSideBySideDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kSideBySide, + kSideBySideVariations, + "SideBySide")}, + + {"side-by-side-session-restore", + flag_descriptions::kSideBySideSessionRestoreName, + flag_descriptions::kSideBySideSessionRestoreDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kSideBySideSessionRestore)}, +#endif + + {"enable-secure-payment-confirmation-fallback-ux", + flag_descriptions::kSecurePaymentConfirmationFallbackName, + flag_descriptions::kSecurePaymentConfirmationFallbackDescription, kOsAll, + FEATURE_VALUE_TYPE( + payments::features::kSecurePaymentConfirmationFallback)}, + +#if BUILDFLAG(IS_ANDROID) + {"android-window-management-web-api", + flag_descriptions::kAndroidWindowManagementWebApiName, + flag_descriptions::kAndroidWindowManagementWebApiDescription, kOsAndroid, + FEATURE_VALUE_TYPE(ui::kAndroidWindowManagementWebApi)}, + + {"browser-controls-debugging", + flag_descriptions::kBrowserControlsDebuggingName, + flag_descriptions::kBrowserControlsDebuggingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kBrowserControlsDebugging)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"fwupd-developer-mode", flag_descriptions::kFwupdDeveloperModeName, + flag_descriptions::kFwupdDeveloperModeDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kFwupdDeveloperMode)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"android-sms-otp-filling", flag_descriptions::kAndroidSmsOtpFillingName, + flag_descriptions::kAndroidSmsOtpFillingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(password_manager::features::kAndroidSmsOtpFilling)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \ + BUILDFLAG(IS_CHROMEOS) + {"tab-group-home", tabs::flag_descriptions::kTabGroupHomeName, + tabs::flag_descriptions::kTabGroupHomeDescription, kOsDesktop, + FEATURE_VALUE_TYPE(tabs::kTabGroupHome)}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || + // BUILDFLAG(IS_CHROMEOS) + +#if !BUILDFLAG(IS_ANDROID) + {"pinned-tab-toast-on-close", flag_descriptions::kPinnedTabToastOnCloseName, + flag_descriptions::kPinnedTabToastOnCloseDescription, kOsDesktop, + FEATURE_VALUE_TYPE(toast_features::kPinnedTabToastOnClose)}, +#endif // !BUILDFLAG(IS_ANDROID) + + {"discount-autofill", commerce::flag_descriptions::kDiscountAutofillName, + commerce::flag_descriptions::kDiscountAutofillDescription, kOsDesktop, + FEATURE_VALUE_TYPE(commerce::kDiscountAutofill)}, + +#if BUILDFLAG(IS_ANDROID) + {"android-web-app-launch-handler", + flag_descriptions::kAndroidWebAppLaunchHandler, + flag_descriptions::kAndroidWebAppLaunchHandlerDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kAndroidWebAppLaunchHandler)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_WIN) + {"ui-automation-provider", flag_descriptions::kUiaProviderName, + flag_descriptions::kUiaProviderDescription, kOsWin, + FEATURE_VALUE_TYPE(features::kUiaProvider)}, +#endif + +#if BUILDFLAG(IS_ANDROID) + {"top-controls-refactor", flag_descriptions::kTopControlsRefactorName, + flag_descriptions::kTopControlsRefactorDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTopControlsRefactor)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"touch-to-search-callout", flag_descriptions::kTouchToSearchCalloutName, + flag_descriptions::kTouchToSearchCalloutDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kTouchToSearchCallout, + kTouchToSearchCalloutVariations, + "TouchToSearchCallout")}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"notebook-lm-app-shelf-pin", flag_descriptions::kNotebookLmAppShelfPinName, + flag_descriptions::kNotebookLmAppShelfPinDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kNotebookLmAppShelfPin)}, + {"notebook-lm-app-shelf-pin-reset", + flag_descriptions::kNotebookLmAppShelfPinResetName, + flag_descriptions::kNotebookLmAppShelfPinResetDescription, kOsCrOS, + FEATURE_VALUE_TYPE(chromeos::features::kNotebookLmAppShelfPinReset)}, + {"preinstalled-web-app-always-migrate-calculator", + flag_descriptions::kPreinstalledWebAppAlwaysMigrateCalculatorName, + flag_descriptions::kPreinstalledWebAppAlwaysMigrateCalculatorDescription, + kOsCrOS, + FEATURE_VALUE_TYPE(features::kPreinstalledWebAppAlwaysMigrateCalculator)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"tablet-tab-strip-animation", + flag_descriptions::kTabletTabStripAnimationName, + flag_descriptions::kTabletTabStripAnimationDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabletTabStripAnimation)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"enable-secure-payment-confirmation-ux-refresh", + flag_descriptions::kSecurePaymentConfirmationUxRefreshName, + flag_descriptions::kSecurePaymentConfirmationUxRefreshDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(blink::features::kSecurePaymentConfirmationUxRefresh)}, + +#if BUILDFLAG(IS_ANDROID) + {"fill-recovery-password", flag_descriptions::kFillRecoveryPasswordName, + flag_descriptions::kFillRecoveryPasswordDescription, kOsAndroid, + FEATURE_VALUE_TYPE(password_manager::features::kFillRecoveryPassword)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"android-use-correct-display-work-area", + flag_descriptions::kAndroidUseCorrectDisplayWorkAreaName, + flag_descriptions::kAndroidUseCorrectDisplayWorkAreaDescription, + kOsAndroid, FEATURE_VALUE_TYPE(ui::kAndroidUseCorrectDisplayWorkArea)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"android-use-correct-window-bounds", + flag_descriptions::kAndroidUseCorrectWindowBoundsName, + flag_descriptions::kAndroidUseCorrectWindowBoundsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(ui::kAndroidUseCorrectWindowBounds)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \ + BUILDFLAG(IS_CHROMEOS) + {"enable-site-search-allow-user-override-policy", + flag_descriptions::kEnableSiteSearchAllowUserOverridePolicyName, + flag_descriptions::kEnableSiteSearchAllowUserOverridePolicyDescription, + static_cast(kOsCrOS | kOsLinux | kOsMac | kOsWin), + FEATURE_VALUE_TYPE(omnibox::kEnableSiteSearchAllowUserOverridePolicy)}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || + // BUILDFLAG(IS_CHROMEOS) + // TODO(crbug.com/40680264): Remove this flag after regression investigation + // is finished. + { + "new-content-for-checkerboarded-scrolls", + flag_descriptions::kNewContentForCheckerboardedScrollsName, + flag_descriptions::kNewContentForCheckerboardedScrollsDescription, + kOsAll, + FEATURE_VALUE_TYPE(features::kNewContentForCheckerboardedScrolls), + }, + + {"autofill-enable-multiple-request-in-virtual-card-downstream-enrollment", + flag_descriptions:: + kAutofillEnableMultipleRequestInVirtualCardDownstreamEnrollmentName, + flag_descriptions:: + kAutofillEnableMultipleRequestInVirtualCardDownstreamEnrollmentDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features:: + kAutofillEnableMultipleRequestInVirtualCardDownstreamEnrollment)}, + +#if BUILDFLAG(IS_ANDROID) + {"mvc-update-view-when-model-changed", + flag_descriptions::kMvcUpdateViewWhenModelChangedName, + flag_descriptions::kMvcUpdateViewWhenModelChangedDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kMvcUpdateViewWhenModelChanged)}, + + {"reload-tab-ui-resources-if-changed", + flag_descriptions::kReloadTabUiResourcesIfChangedName, + flag_descriptions::kReloadTabUiResourcesIfChangedDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kReloadTabUiResourcesIfChanged)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"page-actions-migration", flag_descriptions::kPageActionsMigrationName, + flag_descriptions::kPageActionsMigrationDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(features::kPageActionsMigration, + kPageActionsMigrationVariations, + "PageActionsMigration")}, + + {"field-classification-model-caching", + flag_descriptions::kFieldClassificationModelCachingName, + flag_descriptions::kFieldClassificationModelCachingDescription, kOsAll, + FEATURE_VALUE_TYPE(autofill::features::kFieldClassificationModelCaching)}, + +#if BUILDFLAG(IS_ANDROID) + {"android-restore-tabs-promo-on-fre-bypassed-kill-switch", + flag_descriptions::kAndroidShowRestoreTabsPromoOnFREBypassedKillSwitchName, + flag_descriptions:: + kAndroidShowRestoreTabsPromoOnFREBypassedKillSwitchDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + chrome::android::kAndroidShowRestoreTabsPromoOnFREBypassedKillSwitch)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_MAC) + {"web-authentication-large-blob-for-icloudkeychain", + flag_descriptions::kWebAuthnLargeBlobForICloudKeychainName, + flag_descriptions::kWebAuthnLargeBlobForICloudKeychainDescription, kOsMac, + FEATURE_VALUE_TYPE(device::kWebAuthnLargeBlobForICloudKeychain)}, +#endif // BUILDFLAG(IS_MAC) + + {"autofill-require-cvc-for-possible-card-update", + flag_descriptions::kAutofillRequireCvcForPossibleCardUpdateName, + flag_descriptions::kAutofillRequireCvcForPossibleCardUpdateDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillRequireCvcForPossibleCardUpdate)}, + {"disable-autofill-strike-system", + flag_descriptions::kDisableAutofillStrikeSystemName, + flag_descriptions::kDisableAutofillStrikeSystemDescription, kOsAll, + FEATURE_VALUE_TYPE(autofill::features::kDisableAutofillStrikeSystem)}, + +#if BUILDFLAG(IS_ANDROID) + {"allow-non-family-link-url-filter-mode", + flag_descriptions::kAllowNonFamilyLinkUrlFilterModeName, + flag_descriptions::kAllowNonFamilyLinkUrlFilterModeDescription, kOsAndroid, + FEATURE_VALUE_TYPE(supervised_user::kAllowNonFamilyLinkUrlFilterMode)}, + + {"propagate-device-content-filters-to-supervised-user", + flag_descriptions::kPropagateDeviceContentFiltersToSupervisedUserName, + flag_descriptions:: + kPropagateDeviceContentFiltersToSupervisedUserDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + supervised_user::kPropagateDeviceContentFiltersToSupervisedUser)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"show-tab-list-animations", flag_descriptions::kShowTabListAnimationsName, + flag_descriptions::kShowTabListAnimationsDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kShowTabListAnimations)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"facilitated-payments-enable-a2a-payment", + flag_descriptions::kFacilitatedPaymentsEnableA2APaymentName, + flag_descriptions::kFacilitatedPaymentsEnableA2APaymentDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + payments::facilitated::kFacilitatedPaymentsEnableA2APayment)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + {"cras-output-plugin-processor", + flag_descriptions::kCrasOutputPluginProcessorName, + flag_descriptions::kCrasOutputPluginProcessorDescription, kOsCrOS, + PLATFORM_FEATURE_NAME_TYPE("CrOSLateBootCrasOutputPluginProcessor")}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if !BUILDFLAG(IS_ANDROID) + {"web-app-installation-api", flag_descriptions::kWebAppInstallationApiName, + flag_descriptions::kWebAppInstallationApiDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kWebAppInstallation)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \ + BUILDFLAG(IS_WIN) + {"lens-search-side-panel-default-width-change", + flag_descriptions::kLensSearchSidePanelDefaultWidthChangeName, + flag_descriptions::kLensSearchSidePanelDefaultWidthChangeDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + lens::features::kLensSearchSidePanelDefaultWidthChange)}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || + // BUILDFLAG(IS_WIN) + + {"transferable-resource-pass-alpha-type-directly", + flag_descriptions::kTransferableResourcePassAlphaTypeDirectlyName, + flag_descriptions::kTransferableResourcePassAlphaTypeDirectlyDescription, + kOsAll, + FEATURE_VALUE_TYPE(features::kTransferableResourcePassAlphaTypeDirectly)}, + +#if BUILDFLAG(IS_ANDROID) + {"enable-exclusive-access-manager-on-android", + flag_descriptions::kEnableExclusiveAccessManagerName, + flag_descriptions::kEnableExclusiveAccessManagerDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kEnableExclusiveAccessManager)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"keyboard-lock-api-on-android", + flag_descriptions::kKeyboardLockApiOnAndroidName, + flag_descriptions::kKeyboardLockApiOnAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kKeyboardLockApiOnAndroid)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ + BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + {"autofill-enable-buy-now-pay-later-for-klarna", + flag_descriptions::kAutofillEnableBuyNowPayLaterForKlarnaName, + flag_descriptions::kAutofillEnableBuyNowPayLaterForKlarnaDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableBuyNowPayLaterForKlarna)}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || + // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + + {"customize-tab-group-color-palette", + flag_descriptions::kCustomizeTabGroupColorPaletteName, + flag_descriptions::kCustomizeTabGroupColorPaletteDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kCustomizeTabGroupColorPalette)}, + +#if !BUILDFLAG(IS_ANDROID) + {"lens-overlay-permission-bubble-alt", + flag_descriptions::kLensOverlayPermissionBubbleAltName, + flag_descriptions::kLensOverlayPermissionBubbleAltDescription, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensOverlayPermissionBubbleAlt)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + {"web-signin-leads-to-implicitly-signed-in-state", + flag_descriptions::kWebSigninLeadsToImplicitlySignedInStateName, + flag_descriptions::kWebSigninLeadsToImplicitlySignedInStateDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(switches::kWebSigninLeadsToImplicitlySignedInState)}, +#endif // BUILDFLAG(ENABLE_DICE_SUPPORT) + + {"autofill-enable-downstream-card-awareness-iph", + flag_descriptions::kAutofillEnableDownstreamCardAwarenessIphName, + flag_descriptions::kAutofillEnableDownstreamCardAwarenessIphDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableDownstreamCardAwarenessIph)}, + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \ + BUILDFLAG(IS_WIN) + {"enable-lens-overlay-back-to-page", + flag_descriptions::kLensOverlayBackToPageName, + flag_descriptions::kLensOverlayBackToPageDescription, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensOverlayBackToPage)}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || + // BUILDFLAG(IS_WIN) + +#if BUILDFLAG(IS_ANDROID) + {"supervised-user-interstitial-without-approvals", + flag_descriptions::kSupervisedUserInterstitialWithoutApprovalsName, + flag_descriptions::kSupervisedUserInterstitialWithoutApprovalsDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + supervised_user::kSupervisedUserInterstitialWithoutApprovals)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-ntp-browser-promos", + flag_descriptions::kEnableNtpBrowserPromosName, + flag_descriptions::kEnableNtpBrowserPromosDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + user_education::features::kEnableNtpBrowserPromos, + kEnableNtpBrowserPromosVariations, + "EnableNtpBrowserPromos")}, +#endif + +#if BUILDFLAG(IS_CHROMEOS) + {"enable-multi-capture-notification-update", + flag_descriptions::kMultiCaptureUsageIndicatorUpdateName, + flag_descriptions::kMultiCaptureUsageIndicatorUpdateDescription, kOsCrOS, + FEATURE_VALUE_TYPE( + chromeos::features::kMultiCaptureReworkedUsageIndicators)}, +#endif // BUILDFLAG(IS_CHROMEOS) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-devtools-deep-link-via-extensibility-api", + flag_descriptions::kEnableDevtoolsDeepLinkViaExtensibilityApiName, + flag_descriptions::kEnableDevtoolsDeepLinkViaExtensibilityApiDescription, + kOsDesktop, + FEATURE_VALUE_TYPE( + blink::features::kEnableDevtoolsDeepLinkViaExtensibilityApi)}, +#endif + +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + {"offer-migration-to-dice-users", + flag_descriptions::kOfferMigrationToDiceUsersName, + flag_descriptions::kOfferMigrationToDiceUsersDescription, kOsDesktop, + FEATURE_VALUE_TYPE(switches::kOfferMigrationToDiceUsers)}, +#endif // BUILDFLAG(ENABLE_DICE_SUPPORT) + +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ + BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + {"autofill-enable-buy-now-pay-later-for-externally-linked", + flag_descriptions::kAutofillEnableBuyNowPayLaterForExternallyLinkedName, + flag_descriptions:: + kAutofillEnableBuyNowPayLaterForExternallyLinkedDescription, + kOsDesktop | kOsAndroid, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableBuyNowPayLaterForExternallyLinked)}, +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || + // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"autofill-enable-separate-pix-preference-item", + flag_descriptions::kAutofillEnableSeparatePixPreferenceItemName, + flag_descriptions::kAutofillEnableSeparatePixPreferenceItemDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableSeparatePixPreferenceItem)}, + + {"android-open-incognito-as-window", + flag_descriptions::kAndroidOpenIncognitoAsWindowName, + flag_descriptions::kAndroidOpenIncognitoAsWindowDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidOpenIncognitoAsWindow)}, + + {"android-desktop-webprefs-large-display", + flag_descriptions::kAndroidDesktopWebPrefsLargeDisplaysName, + flag_descriptions::kAndroidDesktopWebPrefsLargeDisplaysDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(blink::features::kAndroidDesktopWebPrefsLargeDisplays)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"force-history-opt-in-screen", + flag_descriptions::kForceHistoryOptInScreenName, + flag_descriptions::kForceHistoryOptInScreenDescription, kOsAndroid, + FEATURE_VALUE_TYPE(switches::kForceHistoryOptInScreen)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-lens-overlay-edu-action-chip", + flag_descriptions::kLensOverlayEduActionChipName, + flag_descriptions::kLensOverlayEduActionChipDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE(lens::features::kLensOverlayEduActionChip, + kLensOverlayEduActionChipVariations, + "LensOverlayEduActionChip")}, + + {"enable-lens-overlay-entrypoint-label-alt", + flag_descriptions::kLensOverlayEntrypointLabelAltName, + flag_descriptions::kLensOverlayEntrypointLabelAltDescription, kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + lens::features::kLensOverlayEntrypointLabelAlt, + kLensOverlayEntrypointLabelAltVariations, + "LensOverlayEntrypointLabelAltVariations")}, +#endif + + {"safety-hub-disruptive-notification-revocation", + flag_descriptions::kSafetyHubDisruptiveNotificationRevocationName, + flag_descriptions::kSafetyHubDisruptiveNotificationRevocationDescription, + kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + features::kSafetyHubDisruptiveNotificationRevocation, + kSafetyHubDisruptiveNotificationRevocationVariations, + "SafetyHubDisruptiveNotificationRevocation")}, + + {"safety-hub-unused-permission-revocation-for-all-surfaces", + flag_descriptions::kSafetyHubUnusedPermissionRevocationForAllSurfacesName, + flag_descriptions:: + kSafetyHubUnusedPermissionRevocationForAllSurfacesDescription, + kOsAll, + FEATURE_VALUE_TYPE( + features::kSafetyHubUnusedPermissionRevocationForAllSurfaces)}, + +#if BUILDFLAG(IS_ANDROID) + {"android-data-importer-service", + flag_descriptions::kAndroidDataImporterServiceName, + flag_descriptions::kAndroidDataImporterServiceDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidDataImporterService)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"media-indicators-android", flag_descriptions::kMediaIndicatorsAndroidName, + flag_descriptions::kMediaIndicatorsAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kMediaIndicatorsAndroid)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"bookmark-tab-group-conversion", + flag_descriptions::kBookmarkTabGroupConversionName, + flag_descriptions::kBookmarkTabGroupConversionDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kBookmarkTabGroupConversion)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-lens-overlay-straight-to-srp", + flag_descriptions::kLensOverlayStraightToSrpName, + flag_descriptions::kLensOverlayStraightToSrpDescription, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensOverlayStraightToSrp)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"migrate-account-prefs-on-mobile", + flag_descriptions::kMigrateAccountPrefsOnMobileName, + flag_descriptions::kMigrateAccountPrefsOnMobileDescription, kOsAndroid, + FEATURE_VALUE_TYPE(syncer::kMigrateAccountPrefs)}, + + {"tab-model-init-fixes", flag_descriptions::kTabModelInitFixesName, + flag_descriptions::kTabModelInitFixesDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kTabModelInitFixes)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"autofill-android-desktop-suppress-accessory-on-empty", + flag_descriptions::kAutofillAndroidDesktopSuppressAccessoryOnEmptyName, + flag_descriptions:: + kAutofillAndroidDesktopSuppressAccessoryOnEmptyDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillAndroidDesktopSuppressAccessoryOnEmpty)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {kWebiumFlag, flag_descriptions::kWebiumName, + flag_descriptions::kWebiumDescription, kOsDesktop, + ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(switches::kEnableFeatures, + kWebiumFeatures, + switches::kDisableFeatures, + kWebiumFeatures)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"enable-fullscreen-to-any-screen-android", + flag_descriptions::kEnableFullscreenToAnyScreenAndroidName, + flag_descriptions::kEnableFullscreenToAnyScreenAndroidDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(features::kEnableFullscreenToAnyScreenAndroid)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"default-search-engine-prewarm", + flag_descriptions::kDefaultSearchEnginePrewarmName, + flag_descriptions::kDefaultSearchEnginePrewarmDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kPrewarm)}, +#endif // !BUILDFLAG(IS_ANDROID) + + {"apply-clientside-model-predictions-for-password-types", + flag_descriptions::kApplyClientsideModelPredictionsForPasswordTypesName, + flag_descriptions:: + kApplyClientsideModelPredictionsForPasswordTypesDescription, + kOsAll, + FEATURE_VALUE_TYPE(password_manager::features:: + kApplyClientsideModelPredictionsForPasswordTypes)}, + + {"apply-clientside-model-predictions-for-otps", + flag_descriptions::kApplyClientsideModelPredictionsForOtpsName, + flag_descriptions::kApplyClientsideModelPredictionsForOtpsDescription, + kOsAll, + FEATURE_VALUE_TYPE( + password_manager::features::kApplyClientsideModelPredictionsForOtps)}, + + {"canvas-draw-element", flag_descriptions::kCanvasDrawElementName, + flag_descriptions::kCanvasDrawElementDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kCanvasDrawElement)}, + +#if BUILDFLAG(IS_ANDROID) + {"toolbar-snapshot-refactor", + flag_descriptions::kToolbarSnapshotRefactorName, + flag_descriptions::kToolbarSnapshotRefactorDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kToolbarSnapshotRefactor)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(ENABLE_DICE_SUPPORT) + {"enforce-management-disclaimer", + flag_descriptions::kEnforceManagementDisclaimerName, + flag_descriptions::kEnforceManagementDisclaimerDescription, kOsDesktop, + FEATURE_VALUE_TYPE(switches::kEnforceManagementDisclaimer)}, + +#endif // BUILDFLAG(ENABLE_DICE_SUPPORT) + +#if BUILDFLAG(IS_ANDROID) + {"android-animated-progress-bar-in-viz", + flag_descriptions::kAndroidAnimatedProgressBarInVizName, + flag_descriptions::kAndroidAnimatedProgressBarInVizDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kAndroidAnimatedProgressBarInViz)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"enable-lens-overlay-force-empty-csb-query", + flag_descriptions::kLensOverlayForceEmptyCsbQueryName, + flag_descriptions::kLensOverlayForceEmptyCsbQueryDescription, kOsDesktop, + FEATURE_VALUE_TYPE(lens::features::kLensOverlayForceEmptyCsbQuery)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"android-audio-device-listener", + flag_descriptions::kAndroidAudioDeviceListenerName, + flag_descriptions::kAndroidAudioDeviceListenerDescription, kOsAndroid, + FEATURE_VALUE_TYPE(features::kAndroidAudioDeviceListener)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"browsing-history-actor-integration-M1", + flag_descriptions::kBrowsingHistoryActorIntegrationM1Name, + flag_descriptions::kBrowsingHistoryActorIntegrationM1Description, + kOsDesktop, + FEATURE_VALUE_TYPE( + browsing_data::features::kBrowsingHistoryActorIntegrationM1)}, +#endif // !BUILDFLAG(IS_ANDROID) + + {"autofill-manual-testing-data", + flag_descriptions::kAutofillManualTestingDataName, + flag_descriptions::kAutofillManualTestingDataDescription, kOsAll, + STRING_VALUE_TYPE(autofill::kManualContentImportForTestingFlag, "")}, + + {"autofill-enable-support-for-home-and-work", + flag_descriptions::kAutofillEnableSupportForHomeAndWorkName, + flag_descriptions::kAutofillEnableSupportForHomeAndWorkDescription, kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableSupportForHomeAndWork)}, + +#if !BUILDFLAG(IS_ANDROID) + {"new-tab-adds-to-active-group", + flag_descriptions::kNewTabAddsToActiveGroupName, + flag_descriptions::kNewTabAddsToActiveGroupDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kNewTabAddsToActiveGroup)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"incognito-theme-overlay-testing", + flag_descriptions::kIncognitoThemeOverlayTestingName, + flag_descriptions::kIncognitoThemeOverlayTestingDescription, kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kIncognitoThemeOverlayTesting)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"autofill-enable-support-for-name-and-email-profile", + flag_descriptions::kAutofillEnableSupportForNameAndEmailName, + flag_descriptions::kAutofillEnableSupportForNameAndEmailDescription, + kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableSupportForNameAndEmail)}, + {"mobile-promo-on-desktop", flag_descriptions::kMobilePromoOnDesktopName, + flag_descriptions::kMobilePromoOnDesktopDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE(kMobilePromoOnDesktop, + kMobilePromoOnDesktopVariations, + "MobilePromoOnDesktop")}, + +#if !BUILDFLAG(IS_ANDROID) + {"reintroduce-hybrid-passkey-entry-point", + flag_descriptions::kAutofillReintroduceHybridPasskeyDropdownItemName, + flag_descriptions:: + kAutofillReintroduceHybridPasskeyDropdownItemDescription, + kOsDesktop, + FEATURE_VALUE_TYPE(password_manager::features:: + kAutofillReintroduceHybridPasskeyDropdownItem)}, + {"enable-lens-overlay-text-selection-context-menu-entrypoint", + flag_descriptions::kLensOverlayTextSelectionContextMenuEntrypointName, + flag_descriptions:: + kLensOverlayTextSelectionContextMenuEntrypointDescription, + kOsDesktop, + FEATURE_WITH_PARAMS_VALUE_TYPE( + lens::features::kLensOverlayTextSelectionContextMenuEntrypoint, + kLensOverlayTextSelectionContextMenuEntrypointVariations, + "LensOverlayTextSelectionContextMenuEntrypoint")}, +#endif // !BUILDFLAG(IS_ANDROID), + +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \ + BUILDFLAG(IS_CHROMEOS) + {"enable-ntp-enterprise-shortcuts", + flag_descriptions::kEnableNtpEnterpriseShortcutsName, + flag_descriptions::kEnableNtpEnterpriseShortcutsDescription, + static_cast(kOsCrOS | kOsLinux | kOsMac | kOsWin), + FEATURE_WITH_PARAMS_VALUE_TYPE(ntp_tiles::kNtpEnterpriseShortcuts, + kNtpEnterpriseShortcutsVariations, + "NtpEnterpriseShortcuts")}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) ||\ + // BUILDFLAG(IS_CHROMEOS) + +#if BUILDFLAG(IS_ANDROID) + {"web-serial-wired-devices-android", + flag_descriptions::kWebSerialWiredDevicesAndroidName, + flag_descriptions::kWebSerialWiredDevicesAndroidDescription, kOsAndroid, + FEATURE_VALUE_TYPE(device::features::kWebSerialWiredDevicesAndroid)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + {"tab-group-menu-improvements", + flag_descriptions::kTabGroupMenuImprovementsName, + flag_descriptions::kTabGroupMenuImprovementsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kTabGroupMenuImprovements)}, + + {"tab-group-more-entry-points", + flag_descriptions::kTabGroupMenuMoreEntryPointsName, + flag_descriptions::kTabGroupMenuMoreEntryPointsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kTabGroupMenuMoreEntryPoints)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_MAC) + {"show-tab-groups-mac-system-menu", + flag_descriptions::kShowTabGroupsMacSystemMenuName, + flag_descriptions::kShowTabGroupsMacSystemMenuDescription, kOsMac, + FEATURE_VALUE_TYPE(features::kShowTabGroupsMacSystemMenu)}, +#endif // BUILDFLAG(IS_MAC) + +#if BUILDFLAG(IS_ANDROID) + {"autofill-update-context-for-web-contents", + flag_descriptions::kAndroidAutofillUpdateContextForWebContentsName, + flag_descriptions::kAndroidAutofillUpdateContextForWebContentsDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + autofill::features::kAndroidAutofillUpdateContextForWebContents)}, +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"autofill-android-desktop-keyboard-accessory-revamp", + flag_descriptions::kAutofillAndroidDesktopKeyboardAccessoryRevampName, + flag_descriptions:: + kAutofillAndroidDesktopKeyboardAccessoryRevampDescription, + kOsAndroid, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillAndroidDesktopKeyboardAccessoryRevamp)}, +#endif // BUILDFLAG(IS_ANDROID) +#if !BUILDFLAG(IS_ANDROID) + {"multicast-in-direct-sockets", + flag_descriptions::kMulticastInDirectSocketsName, + flag_descriptions::kMulticastInDirectSocketsDescription, kOsDesktop, + FEATURE_VALUE_TYPE(blink::features::kMulticastInDirectSockets)}, +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_ANDROID) + {"android-animated-progress-bar-in-browser", + flag_descriptions::kAndroidAnimatedProgressBarInBrowserName, + flag_descriptions::kAndroidAnimatedProgressBarInBrowserDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(chrome::android::kAndroidAnimatedProgressBarInBrowser)}, +#endif // BUILDFLAG(IS_ANDROID) + + {"enable-cross-device-pref-tracker", + flag_descriptions::kEnableCrossDevicePrefTrackerName, + flag_descriptions::kEnableCrossDevicePrefTrackerDescription, kOsAll, + FEATURE_VALUE_TYPE( + sync_preferences::features::kEnableCrossDevicePrefTracker)}, + + // Add new entries above this line. + + // NOTE: Adding a new flag requires adding a corresponding entry to enum + // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag + // Histograms" in tools/metrics/histograms/README.md (run the + // AboutFlagsHistogramTest unit test to verify this process). +}; + +class FlagsStateSingleton : public flags_ui::FlagsState::Delegate { + public: + FlagsStateSingleton() + : flags_state_( + std::make_unique(kFeatureEntries, this)) {} + FlagsStateSingleton(const FlagsStateSingleton&) = delete; + FlagsStateSingleton& operator=(const FlagsStateSingleton&) = delete; + ~FlagsStateSingleton() override = default; + + static FlagsStateSingleton* GetInstance() { + return base::Singleton::get(); + } + + static flags_ui::FlagsState* GetFlagsState() { + return GetInstance()->flags_state_.get(); + } + + void RebuildState(const std::vector& entries) { + flags_state_ = std::make_unique(entries, this); + } + + void RestoreDefaultState() { + flags_state_ = + std::make_unique(kFeatureEntries, this); + } + + private: + // flags_ui::FlagsState::Delegate: + bool ShouldExcludeFlag(const flags_ui::FlagsStorage* storage, + const FeatureEntry& entry) override { + return flags::IsFlagExpired(storage, entry.internal_name); + } + + std::unique_ptr flags_state_; +}; + +bool ShouldSkipNonDeprecatedFeatureEntry(const FeatureEntry& entry) { + return ~entry.supported_platforms & kDeprecated; +} + +} // namespace + +#if BUILDFLAG(IS_CHROMEOS) +// This method may be invoked both synchronously or asynchronously. Based on +// whether the current user is the owner of the device, generates the +// appropriate flag storage. +void GetStorageAsync(Profile* profile, + GetStorageCallback callback, + bool current_user_is_owner) { + // On ChromeOS the owner can set system wide flags and other users can only + // set flags for their own session. + if (current_user_is_owner) { + ash::OwnerSettingsServiceAsh* service = + ash::OwnerSettingsServiceAshFactory::GetForBrowserContext(profile); + std::move(callback).Run( + std::make_unique( + profile->GetPrefs(), service), + flags_ui::kOwnerAccessToFlags); + } else { + std::move(callback).Run(std::make_unique( + profile->GetPrefs()), + flags_ui::kGeneralAccessFlagsOnly); + } +} +#endif + +// ash-chrome uses different storage flag storage logic from other desktop +// platforms. +void GetStorage(Profile* profile, GetStorageCallback callback) { +#if BUILDFLAG(IS_CHROMEOS) + // Bypass possible incognito profile. + // On ChromeOS the owner can set system wide flags and other users can only + // set flags for their own session. + Profile* original_profile = profile->GetOriginalProfile(); + if (base::SysInfo::IsRunningOnChromeOS() && + ash::OwnerSettingsServiceAshFactory::GetForBrowserContext( + original_profile)) { + ash::OwnerSettingsServiceAsh* service = + ash::OwnerSettingsServiceAshFactory::GetForBrowserContext( + original_profile); + service->IsOwnerAsync(base::BindOnce(&GetStorageAsync, original_profile, + std::move(callback))); + } else { + GetStorageAsync(original_profile, std::move(callback), + /*current_user_is_owner=*/false); + } +#else + std::move(callback).Run(std::make_unique( + g_browser_process->local_state()), + flags_ui::kOwnerAccessToFlags); +#endif +} + +bool ShouldSkipConditionalFeatureEntry(const flags_ui::FlagsStorage* storage, + const FeatureEntry& entry) { +#if BUILDFLAG(IS_CHROMEOS) + version_info::Channel channel = chrome::GetChannel(); + // enable-projector-server-side-speech-recognition is only available if + // the InternalServerSideSpeechRecognitionControl flag is enabled as well. + if (!strcmp(kProjectorServerSideSpeechRecognition, entry.internal_name)) { + return !ash::features:: + IsInternalServerSideSpeechRecognitionControlEnabled(); + } + + // enable-ui-devtools is only available on for non Stable channels. + if (!strcmp(ui_devtools::switches::kEnableUiDevTools, entry.internal_name) && + channel == version_info::Channel::STABLE) { + return true; + } + + // Skip arc-enable-attestation if it is enabled by ash switch. + if (!strcmp(kArcEnableAttestationFlag, entry.internal_name)) { + return base::CommandLine::ForCurrentProcess()->HasSwitch( + ash::switches::kArcEnableAttestation); + } + + if (!strcmp(kArcEnableVirtioBlkForDataInternalName, entry.internal_name)) { + return !arc::IsArcVmEnabled(); + } + + // Only show the Background Listening flag if channel is one of + // Beta/Dev/Canary/Unknown (non-stable). + if (!strcmp(kBackgroundListeningName, entry.internal_name)) { + return channel != version_info::Channel::BETA && + channel != version_info::Channel::DEV && + channel != version_info::Channel::CANARY && + channel != version_info::Channel::UNKNOWN; + } + + // Only show Borealis flags on enabled devices. + if (!strcmp(kBorealisBigGlInternalName, entry.internal_name) || + !strcmp(kBorealisDGPUInternalName, entry.internal_name) || + !strcmp(kBorealisEnableUnsupportedHardwareInternalName, + entry.internal_name) || + !strcmp(kBorealisForceBetaClientInternalName, entry.internal_name) || + !strcmp(kBorealisForceDoubleScaleInternalName, entry.internal_name) || + !strcmp(kBorealisLinuxModeInternalName, entry.internal_name) || + !strcmp(kBorealisPermittedInternalName, entry.internal_name) || + !strcmp(kBorealisProvisionInternalName, entry.internal_name) || + !strcmp(kBorealisScaleClientByDPIInternalName, entry.internal_name) || + !strcmp(kBorealisZinkGlDriverInternalName, entry.internal_name)) { + return !base::FeatureList::IsEnabled(features::kBorealis); + } + + // Only show wallpaper fast refresh flag if channel is one of + // Dev/Canary/Unknown. + if (!strcmp(kWallpaperFastRefreshInternalName, entry.internal_name)) { + return (channel != version_info::Channel::DEV && + channel != version_info::Channel::CANARY && + channel != version_info::Channel::UNKNOWN); + } + + // Disable and prevent users from enabling LL privacy on boards that were + // explicitly built without floss or hardware does not support LL privacy. + if (!strcmp(kBluetoothUseLLPrivacyInternalName, entry.internal_name)) { + return ( + base::FeatureList::GetInstance()->IsFeatureOverriddenFromCommandLine( + floss::features::kLLPrivacyIsAvailable.name, + base::FeatureList::OVERRIDE_DISABLE_FEATURE)); + } + + // Only show Assistant Launcher search IPH flag if channel is one of + // Beta/Dev/Canary/Unknown. + if (!strcmp(kAssistantIphInternalName, entry.internal_name)) { + return channel != version_info::Channel::BETA && + channel != version_info::Channel::DEV && + channel != version_info::Channel::CANARY && + channel != version_info::Channel::UNKNOWN; + } + + // Only show Growth campaigns flag if channel is one of Beta/Dev/Canary/ + // Unknown. + if (!strcmp(kGrowthCampaigns, entry.internal_name)) { + return channel != version_info::Channel::BETA && + channel != version_info::Channel::DEV && + channel != version_info::Channel::CANARY && + channel != version_info::Channel::UNKNOWN; + } + + // Only show Growth campaigns test tag flag if channel is one of + // Beta/Dev/Canary/ Unknown. + if (!strcmp(kGrowthCampaignsTestTag, entry.internal_name)) { + return channel != version_info::Channel::BETA && + channel != version_info::Channel::DEV && + channel != version_info::Channel::CANARY && + channel != version_info::Channel::UNKNOWN; + } +#endif // BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(ENABLE_EXTENSIONS) + version_info::Channel chrome_channel = chrome::GetChannel(); + // Only show extension AI data flag in non-stable channels. + if (!strcmp(kExtensionAiDataInternalName, entry.internal_name)) { + return chrome_channel != version_info::Channel::BETA && + chrome_channel != version_info::Channel::DEV && + chrome_channel != version_info::Channel::CANARY && + chrome_channel != version_info::Channel::UNKNOWN; + } +#endif + +#if BUILDFLAG(IS_ANDROID) + // Only show the payments test flag to disable merchant allowlists if channel + // is one of Beta/Dev/Canary/ Unknown. + version_info::Channel channel = chrome::GetChannel(); + if (!strcmp(kDisableFacilitatedPaymentsMerchantAllowlistInternalName, + entry.internal_name)) { + return channel != version_info::Channel::BETA && + channel != version_info::Channel::DEV && + channel != version_info::Channel::CANARY && + channel != version_info::Channel::UNKNOWN; + } +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + // Only show Webium flag for Canary channel and developer builds. + if (!strcmp(kWebiumFlag, entry.internal_name)) { + return chrome::GetChannel() != version_info::Channel::CANARY && + version_info::IsOfficialBuild(); + } +#endif // !BUILDFLAG(IS_ANDROID) + + if (flags::IsFlagExpired(storage, entry.internal_name)) { + return true; + } + + return false; +} + +void ConvertFlagsToSwitches(flags_ui::FlagsStorage* flags_storage, + base::CommandLine* command_line, + flags_ui::SentinelsMode sentinels) { + if (command_line->HasSwitch(switches::kNoExperiments)) { + return; + } + + FlagsStateSingleton::GetFlagsState()->ConvertFlagsToSwitches( + flags_storage, command_line, sentinels, switches::kEnableFeatures, + switches::kDisableFeatures); +} + +std::vector RegisterAllFeatureVariationParameters( + flags_ui::FlagsStorage* flags_storage, + base::FeatureList* feature_list) { + return FlagsStateSingleton::GetFlagsState() + ->RegisterAllFeatureVariationParameters(flags_storage, feature_list); +} + +void GetFlagFeatureEntries(flags_ui::FlagsStorage* flags_storage, + flags_ui::FlagAccess access, + base::Value::List& supported_entries, + base::Value::List& unsupported_entries) { + FlagsStateSingleton::GetFlagsState()->GetFlagFeatureEntries( + flags_storage, access, supported_entries, unsupported_entries, + base::BindRepeating(&ShouldSkipConditionalFeatureEntry, + // Unretained: this callback doesn't outlive this + // stack frame. + base::Unretained(flags_storage))); +} + +void GetFlagFeatureEntriesForDeprecatedPage( + flags_ui::FlagsStorage* flags_storage, + flags_ui::FlagAccess access, + base::Value::List& supported_entries, + base::Value::List& unsupported_entries) { + FlagsStateSingleton::GetFlagsState()->GetFlagFeatureEntries( + flags_storage, access, supported_entries, unsupported_entries, + base::BindRepeating(&ShouldSkipNonDeprecatedFeatureEntry)); +} + +flags_ui::FlagsState* GetCurrentFlagsState() { + return FlagsStateSingleton::GetFlagsState(); +} + +bool IsRestartNeededToCommitChanges() { + return FlagsStateSingleton::GetFlagsState()->IsRestartNeededToCommitChanges(); +} + +void SetFeatureEntryEnabled(flags_ui::FlagsStorage* flags_storage, + const std::string& internal_name, + bool enable) { + FlagsStateSingleton::GetFlagsState()->SetFeatureEntryEnabled( + flags_storage, internal_name, enable); +} + +void SetOriginListFlag(const std::string& internal_name, + const std::string& value, + flags_ui::FlagsStorage* flags_storage) { + FlagsStateSingleton::GetFlagsState()->SetOriginListFlag(internal_name, value, + flags_storage); +} + +void SetStringFlag(const std::string& internal_name, + const std::string& value, + flags_ui::FlagsStorage* flags_storage) { + FlagsStateSingleton::GetFlagsState()->SetStringFlag(internal_name, value, + flags_storage); +} + +void RemoveFlagsSwitches(base::CommandLine::SwitchMap* switch_list) { + FlagsStateSingleton::GetFlagsState()->RemoveFlagsSwitches(switch_list); +} + +void ResetAllFlags(flags_ui::FlagsStorage* flags_storage) { + FlagsStateSingleton::GetFlagsState()->ResetAllFlags(flags_storage); +} + +void RecordUMAStatistics(flags_ui::FlagsStorage* flags_storage, + const std::string& histogram_name) { + std::set switches; + std::set features; + std::set variation_ids; + FlagsStateSingleton::GetFlagsState()->GetSwitchesAndFeaturesFromFlags( + flags_storage, &switches, &features, &variation_ids); + // Don't report variation IDs since we don't have an UMA histogram for them. + flags_ui::ReportAboutFlagsHistogram(histogram_name, switches, features); +} + +namespace testing { + +std::vector* GetEntriesForTesting() { + static base::NoDestructor> entries; + return entries.get(); +} + +void SetFeatureEntries(const std::vector& entries) { + auto* entries_for_testing = GetEntriesForTesting(); // IN-TEST + CHECK(entries_for_testing->empty()); + for (const auto& entry : entries) { + entries_for_testing->push_back(entry); + } + FlagsStateSingleton::GetInstance()->RebuildState(*entries_for_testing); +} + +ScopedFeatureEntries::ScopedFeatureEntries( + const std::vector& entries) { + SetFeatureEntries(entries); +} + +ScopedFeatureEntries::~ScopedFeatureEntries() { + GetEntriesForTesting()->clear(); // IN-TEST + // Restore the flag state to the production flags. + FlagsStateSingleton::GetInstance()->RestoreDefaultState(); +} + +base::span GetFeatureEntries() { + if (const auto* entries_for_testing = GetEntriesForTesting(); + !entries_for_testing->empty()) { + return *entries_for_testing; + } + return kFeatureEntries; +} + +} // namespace testing + +} // namespace about_flags diff --git a/tools/under-control/src/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/tools/under-control/src/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc index 292130dc..2608d027 100755 --- a/tools/under-control/src/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc +++ b/tools/under-control/src/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc @@ -83,7 +83,6 @@ #include "chrome/browser/translate/chrome_translate_client.h" #include "chrome/browser/ui/find_bar/find_bar_state.h" #include "chrome/browser/ui/find_bar/find_bar_state_factory.h" -#include "chrome/browser/webauthn/chrome_authenticator_request_delegate.h" #include "chrome/browser/webdata_services/web_data_service_factory.h" #include "chrome/common/buildflags.h" #include "chrome/common/url_constants.h" @@ -91,7 +90,6 @@ #include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h" #include "components/autofill/core/browser/data_manager/payments/payments_data_manager.h" #include "components/autofill/core/browser/data_manager/personal_data_manager.h" -#include "components/autofill/core/browser/strike_databases/strike_database.h" #include "components/autofill/core/browser/webdata/autofill_webdata_service.h" #include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_payments_features.h" @@ -140,6 +138,7 @@ #include "components/signin/public/identity_manager/accounts_in_cookie_jar_info.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "components/signin/public/identity_manager/identity_utils.h" +#include "components/strike_database/strike_database.h" #include "components/sync/service/sync_service.h" #include "components/sync/service/sync_user_settings.h" #include "components/tpcd/metadata/browser/manager.h" @@ -165,6 +164,7 @@ #include "net/http/http_transaction_factory.h" #include "net/net_buildflags.h" #include "services/network/public/mojom/clear_data_filter.mojom.h" +#include "third_party/perfetto/include/perfetto/tracing/track.h" #if BUILDFLAG(IS_ANDROID) #include "chrome/browser/android/customtabs/chrome_origin_verifier.h" @@ -353,10 +353,6 @@ void ChromeBrowsingDataRemoverDelegate::RemoveEmbedderData( ~content::BrowsingDataRemover::DATA_TYPE_AVOID_CLOSING_CONNECTIONS & ~constants::FILTERABLE_DATA_TYPES) == 0) || filter_builder->MatchesAllOriginsAndDomains()); -#if !BUILDFLAG(IS_ANDROID) - DCHECK(!should_clear_sync_account_settings_); -#endif - TRACE_EVENT0("browsing_data", "ChromeBrowsingDataRemoverDelegate::RemoveEmbedderData"); @@ -696,16 +692,6 @@ void ChromeBrowsingDataRemoverDelegate::RemoveEmbedderData( #endif } -#if !BUILDFLAG(IS_ANDROID) - if (nullable_filter.is_null() || - (!filter_builder->PartitionedCookiesOnly() && - nullable_filter.Run(GaiaUrls::GetInstance()->google_url()))) { - // Set a flag to clear account storage settings later instead of clearing - // it now as we can not reset this setting before passwords are deleted. - should_clear_sync_account_settings_ = true; - } -#endif - // Persistent Origin Trial tokens are only saved until the next page // load from the same origin. For that reason, they are not saved with // last-modified information, so deletion will clear all stored information. @@ -1548,11 +1534,10 @@ void ChromeBrowsingDataRemoverDelegate::OnTaskStarted( auto result = pending_sub_tasks_.insert(data_type); DCHECK(result.second) << "Task already started: " << static_cast(data_type); - TRACE_EVENT_NESTABLE_ASYNC_BEGIN1( - "browsing_data", "ChromeBrowsingDataRemoverDelegate", - TRACE_ID_WITH_SCOPE("ChromeBrowsingDataRemoverDelegate", - static_cast(data_type)), - "data_type", static_cast(data_type)); + TRACE_EVENT_BEGIN("browsing_data", "ChromeBrowsingDataRemoverDelegate", + perfetto::NamedTrack("ChromeBrowsingDataRemoverDelegate", + static_cast(data_type)), + "data_type", static_cast(data_type)); } void ChromeBrowsingDataRemoverDelegate::OnTaskComplete( @@ -1563,11 +1548,10 @@ void ChromeBrowsingDataRemoverDelegate::OnTaskComplete( DCHECK_CURRENTLY_ON(BrowserThread::UI); size_t num_erased = pending_sub_tasks_.erase(data_type); DCHECK_EQ(num_erased, 1U); - TRACE_EVENT_NESTABLE_ASYNC_END1( - "browsing_data", "ChromeBrowsingDataRemoverDelegate", - TRACE_ID_WITH_SCOPE("ChromeBrowsingDataRemoverDelegate", - static_cast(data_type)), - "data_type", static_cast(data_type)); + TRACE_EVENT_END("browsing_data", + perfetto::NamedTrack("ChromeBrowsingDataRemoverDelegate", + static_cast(data_type)), + "data_type", static_cast(data_type)); base::UmaHistogramMediumTimes( base::StrCat({"History.ClearBrowsingData.Duration.ChromeTask.", GetHistogramSuffix(data_type)}), @@ -1591,32 +1575,6 @@ void ChromeBrowsingDataRemoverDelegate::OnTaskComplete( } } -#if !BUILDFLAG(IS_ANDROID) - // Explicitly clear any per account sync settings when cookies are being - // cleared. This needs to happen after the corresponding data has been - // deleted, so it is performed when all other tasks are completed. - // Note: These usually get cleared automatically when the Google cookies are - // deleted, but there is one edge case where that doesn't work: If the user - // clears cookies via CBD while they are already signed out (but their - // account is still present in the account chooser). In that case, without the - // code below, the settings-clearing would only happen when the Google cookies - // are refreshed the next time, typically on the next browser restart. - if (should_clear_sync_account_settings_) { - should_clear_sync_account_settings_ = false; - signin::IdentityManager* identity_manager = - IdentityManagerFactory::GetForProfile(profile_); - base::flat_set gaia_ids = signin::GetAllGaiaIdsForKeyedPreferences( - identity_manager, - signin::AccountsInCookieJarInfo() /* empty_cookies */); - if (syncer::SyncService* sync_service = - SyncServiceFactory::GetForProfile(profile_); - sync_service) { - sync_service->GetUserSettings()->KeepAccountSettingsPrefsOnlyForUsers( - base::ToVector(gaia_ids)); - } - } -#endif // !BUILDFLAG(IS_ANDROID) - slow_pending_tasks_closure_.Cancel(); DCHECK(!callback_.is_null()); diff --git a/tools/under-control/src/chrome/browser/chrome_content_browser_client.cc b/tools/under-control/src/chrome/browser/chrome_content_browser_client.cc index a582e406..b8acad00 100755 --- a/tools/under-control/src/chrome/browser/chrome_content_browser_client.cc +++ b/tools/under-control/src/chrome/browser/chrome_content_browser_client.cc @@ -16,15 +16,18 @@ #include #include "base/base_switches.h" +#include "base/byte_count.h" #include "base/check_deref.h" #include "base/command_line.h" #include "base/containers/contains.h" +#include "base/containers/fixed_flat_map.h" #include "base/containers/fixed_flat_set.h" #include "base/dcheck_is_on.h" #include "base/feature_list.h" #include "base/files/file_path.h" #include "base/functional/bind.h" #include "base/functional/callback.h" +#include "base/functional/callback_helpers.h" #include "base/i18n/base_i18n_switches.h" #include "base/i18n/character_encoding.h" #include "base/memory/raw_ptr.h" @@ -49,6 +52,10 @@ #include "build/branding_buildflags.h" #include "build/build_config.h" #include "build/config/chromebox_for_meetings/buildflags.h" // PLATFORM_CFM +#include "chrome/browser/preloading/search_preload/search_preload_features.h" +#if !BUILDFLAG(IS_ANDROID) +#include "chrome/browser/actor/actor_keyed_service.h" +#endif // !BUILDFLAG(IS_ANDROID) #include "chrome/browser/after_startup_task_utils.h" #include "chrome/browser/ai/ai_manager.h" #include "chrome/browser/app_mode/app_mode_utils.h" @@ -112,6 +119,8 @@ #include "chrome/browser/performance_manager/public/chrome_browser_main_extra_parts_performance_manager.h" #include "chrome/browser/performance_manager/public/chrome_content_browser_client_performance_manager_part.h" #include "chrome/browser/performance_monitor/chrome_browser_main_extra_parts_performance_monitor.h" +#include "chrome/browser/picture_in_picture/picture_in_picture_window_manager.h" +#include "chrome/browser/picture_in_picture/scoped_tuck_picture_in_picture.h" #include "chrome/browser/plugins/plugin_utils.h" #include "chrome/browser/policy/policy_util.h" #include "chrome/browser/policy/profile_policy_connector.h" @@ -234,6 +243,7 @@ #include "components/error_page/common/error_page_switches.h" #include "components/error_page/common/localized_error.h" #include "components/fingerprinting_protection_filter/common/fingerprinting_protection_filter_features.h" +#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h" #include "components/google/core/common/google_switches.h" #include "components/heap_profiling/in_process/heap_profiler_controller.h" #include "components/keep_alive_registry/keep_alive_types.h" @@ -347,6 +357,7 @@ #include "google_apis/gaia/gaia_urls.h" #include "google_apis/google_api_keys.h" #include "gpu/config/gpu_switches.h" +#include "ipc/ipc_channel_proxy.h" #include "media/base/media_switches.h" #include "media/media_buildflags.h" #include "media/mojo/buildflags.h" @@ -387,6 +398,7 @@ #include "third_party/blink/public/public_buildflags.h" #include "third_party/widevine/cdm/buildflags.h" #include "ui/base/clipboard/clipboard_format_type.h" +#include "ui/base/clipboard/clipboard_metadata.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/page_transition_types.h" #include "ui/base/resource/resource_bundle.h" @@ -452,6 +464,8 @@ #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/smb_client/fileapi/smbfs_file_system_backend_delegate.h" #include "chrome/browser/ash/system/input_device_settings.h" +#include "chrome/browser/media/webrtc/multi_capture/multi_capture_data_service.h" +#include "chrome/browser/media/webrtc/multi_capture/multi_capture_data_service_factory.h" #include "chrome/browser/speech/tts_chromeos.h" #include "chrome/browser/speech/tts_controller_delegate_impl.h" #include "chrome/browser/ui/ash/main_extra_parts/chrome_browser_main_extra_parts_ash.h" @@ -472,7 +486,6 @@ #include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views_linux.h" #elif BUILDFLAG(IS_ANDROID) #include "base/android/application_status_listener.h" -#include "base/android/build_info.h" #include "base/feature_list.h" #include "chrome/browser/android/customtabs/client_data_header_web_contents_observer.h" #include "chrome/browser/android/devtools_manager_delegate_android.h" @@ -485,6 +498,7 @@ #include "chrome/browser/digital_credentials/digital_identity_provider_android.h" #include "chrome/browser/flags/android/chrome_feature_list.h" #include "chrome/browser/safe_browsing/android/safe_browsing_referring_app_bridge_android.h" +#include "chrome/browser/ui/android/tab_model/tab_model.h" #include "chrome/browser/ui/android/tab_model/tab_model_list.h" #include "chrome/common/chrome_descriptors_android.h" #include "components/browser_ui/accessibility/android/font_size_prefs_android.h" @@ -519,7 +533,7 @@ #include "base/debug/leak_annotations.h" #include "chrome/browser/chromeos/policy/dlp/dlp_scoped_file_access_delegate.h" #include "chrome/browser/chromeos/tablet_mode/chrome_content_browser_client_tablet_mode_part.h" -#include "chrome/browser/file_system_access/cloud_identifier/cloud_identifier_util_cros.h" +#include "chrome/browser/file_system_access/cloud_identifier/cloud_identifier_util_ash.h" #include "chrome/browser/media/webrtc/multi_capture/multi_capture_usage_indicator_service.h" #include "chrome/browser/media/webrtc/multi_capture/multi_capture_usage_indicator_service_factory.h" #include "chrome/browser/policy/system_features_disable_list_policy_handler.h" @@ -546,7 +560,9 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/browser_finder.h" +#include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/chrome_pages.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/webui/chrome_content_browser_client_webui_part.h" #include "chrome/browser/ui/webui/webui_util_desktop.h" #include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_error_page.h" @@ -571,6 +587,7 @@ #endif #if BUILDFLAG(IS_ANDROID) +#include "base/android/device_info.h" #include "components/crash/content/browser/crash_handler_host_linux.h" #endif @@ -996,6 +1013,17 @@ GetNoStatePrefetchCanceler( return canceler; } +#if !BUILDFLAG(IS_ANDROID) +mojo::AssociatedRemote +GetRendererConfiguration(content::RenderProcessHost* render_process_host) { + IPC::ChannelProxy* channel = render_process_host->GetChannel(); + mojo::AssociatedRemote + renderer_configuration; + channel->GetRemoteAssociatedInterface(&renderer_configuration); + return renderer_configuration; +} +#endif // !BUILDFLAG(IS_ANDROID) + bool ShouldHonorPolicies() { #if BUILDFLAG(IS_WIN) return policy::ManagementServiceFactory::GetForPlatform() @@ -1343,9 +1371,24 @@ bool IsDefaultSearchEngine(Profile* profile, const GURL& url) { const TemplateURL* default_search_engine = template_url_service->GetDefaultSearchProvider(); - return default_search_engine && - template_url_service->IsSearchResultsPageFromDefaultSearchProvider( - url); + if (!default_search_engine) { + return false; + } + + if (template_url_service->IsSearchResultsPageFromDefaultSearchProvider(url)) { + return true; + } + + if (base::FeatureList::IsEnabled(features::kConsiderDSEWarmUpPageAsSRP)) { + const GURL prewarm_url = GURL(features::kPrewarmUrl.Get()); + if (prewarm_url.is_valid() && url == prewarm_url && + template_url_service->GetDefaultSearchProviderOrigin().IsSameOriginWith( + prewarm_url)) { + return true; + } + } + + return false; } } // namespace @@ -1873,6 +1916,27 @@ GURL ChromeContentBrowserClient::GetEffectiveURL( #endif } +void ChromeContentBrowserClient::OnRendererProcessLockedStateUpdated( + content::RenderProcessHost* host, + const GURL& site_url) { +#if !BUILDFLAG(IS_ANDROID) + // If the feature `kInstantUsesSpareRenderer` is not enabled, we continue + // relying on the `kInstantProcess` command line switch to handle instant + // process related logic. + if (!base::FeatureList::IsEnabled(features::kInstantUsesSpareRenderer)) { + return; + } + chrome::mojom::StaticParamsPtr params = chrome::mojom::StaticParams::New(); + Profile* profile = Profile::FromBrowserContext(host->GetBrowserContext()); + if (search::ShouldAssignURLToInstantRenderer(site_url, profile)) { + params->is_instant_process = true; + } + auto renderer_configuration = GetRendererConfiguration(host); + renderer_configuration->SetConfigurationOnProcessLockUpdate( + std::move(params)); +#endif // !BUILDFLAG(IS_ANDROID) +} + bool ChromeContentBrowserClient:: ShouldCompareEffectiveURLsForSiteInstanceSelection( content::BrowserContext* browser_context, @@ -1931,7 +1995,7 @@ bool ChromeContentBrowserClient::ShouldUseProcessPerSite( } bool ChromeContentBrowserClient:: - ShouldReuseExistingProcessForNewMainFrameSiteInstance( + ShouldReuseAnyExistingProcessForNewMainFrameSiteInstance( content::BrowserContext* browser_context, const GURL& site_instance_original_url) { // When `kProcessPerSiteForDSE` is disabled, @@ -1990,11 +2054,15 @@ bool ChromeContentBrowserClient::ShouldUseSpareRenderProcessHost( } #if !BUILDFLAG(IS_ANDROID) - // Instant renderers should not use a spare process, because they require - // passing switches::kInstantProcess to the renderer process when it - // launches. A spare process is launched earlier, before it is known which - // navigation will use it, so it lacks this flag. - if (search::ShouldAssignURLToInstantRenderer(site_url, profile)) { + // Instant renderers passed by command line should not use a spare process, + // because they require passing switches::kInstantProcess to the renderer + // process when it launches. A spare process is launched earlier, before + // it is known which navigation will use it, so it lacks this flag. But + // with the feature kInstantUsesSpareRenderer enabled, the instant process + // is passed later in ProcessLock status changed, we can pass the flag + // to spare process. + if (search::ShouldAssignURLToInstantRenderer(site_url, profile) && + !base::FeatureList::IsEnabled(features::kInstantUsesSpareRenderer)) { // The NTP page chrome://new-tab-page and chrome://new-tab-page-third-party // are using WebUI and will not use instant renderer. // The only usecase is chrome-search:// URLs. @@ -2129,6 +2197,54 @@ void ChromeContentBrowserClient::OverrideURLLoaderFactoryParams( #endif } +bool IsURLAccessibleByHistoryNavigationFromWebContents( + const GURL& url, + content::WebContents* web_contents) { + if (!web_contents) { + return false; + } + content::NavigationController& controller = web_contents->GetController(); + for (int j = 0; j < controller.GetEntryCount(); ++j) { + content::NavigationEntry* entry = controller.GetEntryAtIndex(j); + if (entry && entry->GetURL().EqualsIgnoringRef(url)) { + return true; + } + } + return false; +} + +bool ChromeContentBrowserClient::IsURLAccessibleByHistoryNavigation( + const GURL& url) { +#if BUILDFLAG(IS_ANDROID) + for (const TabModel* model : TabModelList::models()) { + if (!model) { + continue; + } + for (int i = 0; i < model->GetTabCount(); ++i) { + if (IsURLAccessibleByHistoryNavigationFromWebContents( + url, model->GetWebContentsAt(i))) { + return true; + } + } + } + return false; +#else + for (Browser* browser : *BrowserList::GetInstance()) { + TabStripModel* model = browser->tab_strip_model(); + if (!model) { + continue; + } + for (int i = 0; i < model->count(); ++i) { + if (IsURLAccessibleByHistoryNavigationFromWebContents( + url, model->GetWebContentsAt(i))) { + return true; + } + } + } + return false; +#endif // BUILDFLAG(IS_ANDROID) +} + // These are treated as WebUI schemes but do not get WebUI bindings. Also, // view-source is allowed for these schemes. void ChromeContentBrowserClient::GetAdditionalWebUISchemes( @@ -2290,8 +2406,18 @@ bool ChromeContentBrowserClient::IsSuitableHost( instant_service->IsInstantProcess(process_host->GetDeprecatedID()); bool should_be_in_instant_process = search::ShouldAssignURLToInstantRenderer(site_url, profile); - if (is_instant_process || should_be_in_instant_process) { - return is_instant_process && should_be_in_instant_process; + if (is_instant_process) { + return should_be_in_instant_process; + } + if (should_be_in_instant_process) { + // If the host is a spare process that was used for instant URLs, + // `IsInstantProcess` is false as `InstantService::AddInstantProcess` + // hasn't been called yet. In this case, it's safe to allow the site + // to be in the spare process. + bool is_spare_taken = + (base::FeatureList::IsEnabled(features::kInstantUsesSpareRenderer) && + process_host->HostHasNotBeenUsed()); + return is_instant_process || is_spare_taken; } } #endif @@ -2629,11 +2755,17 @@ bool ChromeContentBrowserClient::IsIsolatedContextAllowedForUrl( #endif } -void ChromeContentBrowserClient::CheckGetAllScreensMediaAllowed( - content::RenderFrameHost* render_frame_host, - base::OnceCallback callback) { - std::move(callback).Run(capture_policy::IsMultiScreenCaptureAllowed( - render_frame_host->GetMainFrame()->GetLastCommittedOrigin().GetURL())); +bool ChromeContentBrowserClient::IsMultiCaptureAllowed( + content::RenderFrameHost* render_frame_host) { +#if BUILDFLAG(IS_CHROMEOS) + return multi_capture::MultiCaptureDataServiceFactory::GetForBrowserContext( + WebContents::FromRenderFrameHost(render_frame_host) + ->GetBrowserContext()) + ->IsMultiCaptureAllowed( + render_frame_host->GetMainFrame()->GetLastCommittedOrigin().GetURL()); +#else + return false; +#endif // BUILDFLAG(IS_CHROMEOS) } bool ChromeContentBrowserClient::IsFileAccessAllowed( @@ -2835,7 +2967,8 @@ void ChromeContentBrowserClient::AppendExtraCommandLineSwitches( InstantService* instant_service = InstantServiceFactory::GetForProfile(profile); if (instant_service && - instant_service->IsInstantProcess(process->GetDeprecatedID())) { + instant_service->IsInstantProcess(process->GetDeprecatedID()) && + !base::FeatureList::IsEnabled(features::kInstantUsesSpareRenderer)) { command_line->AppendSwitch(switches::kInstantProcess); } @@ -4012,84 +4145,68 @@ bool ShouldDisableForcedColorsForWebContent(content::WebContents* contents, return false; } -bool UpdateForcedColorsForWebContent(WebPreferences* web_prefs, - WebContents* web_contents, - const ui::NativeTheme* native_theme) { - auto old_in_forced_colors = web_prefs->in_forced_colors; - auto old_forced_colors_disabled = web_prefs->is_forced_colors_disabled; - bool in_forced_colors = native_theme->InForcedColorsMode(); - bool should_disable_forced_colors = +blink::mojom::PreferredContrast GetPreferredContrast( + const ui::NativeTheme* native_theme) { + using NC = ui::NativeTheme::PreferredContrast; + using BC = blink::mojom::PreferredContrast; + static constexpr auto kContrastMap = + base::MakeFixedFlatMap({{NC::kNoPreference, BC::kNoPreference}, + {NC::kMore, BC::kMore}, + {NC::kLess, BC::kLess}, + {NC::kCustom, BC::kCustom}}); + return kContrastMap.at(native_theme->GetPreferredContrast()); +} + +std::tuple GetForcedColorsForWebContent( + WebContents* web_contents, + const ui::NativeTheme* native_theme) { + const bool in_forced_colors = native_theme->InForcedColorsMode(); + const bool is_forced_colors_disabled = ShouldDisableForcedColorsForWebContent(web_contents, in_forced_colors); - - web_prefs->in_forced_colors = - in_forced_colors && !should_disable_forced_colors; - web_prefs->is_forced_colors_disabled = should_disable_forced_colors; - - return old_in_forced_colors != web_prefs->in_forced_colors || - old_forced_colors_disabled != web_prefs->is_forced_colors_disabled; + return {in_forced_colors && !is_forced_colors_disabled, + is_forced_colors_disabled}; } #if !BUILDFLAG(IS_ANDROID) blink::mojom::PreferredColorScheme ToBlinkPreferredColorScheme( ui::NativeTheme::PreferredColorScheme native_theme_scheme) { - switch (native_theme_scheme) { - case ui::NativeTheme::PreferredColorScheme::kDark: - return blink::mojom::PreferredColorScheme::kDark; - case ui::NativeTheme::PreferredColorScheme::kLight: - return blink::mojom::PreferredColorScheme::kLight; - } + return (native_theme_scheme == ui::NativeTheme::PreferredColorScheme::kDark) + ? blink::mojom::PreferredColorScheme::kDark + : blink::mojom::PreferredColorScheme::kLight; } #endif // !BUILDFLAG(IS_ANDROID) -// Returns true if preferred color scheme is modified based on at least one of -// the following - -// |url| - Last committed url. -// |web_contents| - For Android based on IsNightModeEnabled(). -// |native_theme| - For other platforms based on native theme scheme. -bool UpdatePreferredColorScheme(WebPreferences* web_prefs, - const GURL& url, - WebContents* web_contents, - const ui::NativeTheme* native_theme) { - auto old_preferred_color_scheme = web_prefs->preferred_color_scheme; - +std::tuple +GetPreferredColorScheme(const WebPreferences& web_prefs, + const GURL& url, + WebContents* web_contents, + const ui::NativeTheme* native_theme) { #if BUILDFLAG(IS_ANDROID) - auto* delegate = TabAndroid::FromWebContents(web_contents) - ? static_cast( - web_contents->GetDelegate()) - : nullptr; - if (delegate) { - web_prefs->preferred_color_scheme = - delegate->IsNightModeEnabled() - ? blink::mojom::PreferredColorScheme::kDark - : blink::mojom::PreferredColorScheme::kLight; - web_prefs->preferred_root_scrollbar_color_scheme = - web_prefs->preferred_color_scheme; + if (TabAndroid::FromWebContents(web_contents)) { + if (auto* delegate = static_cast( + web_contents->GetDelegate())) { + const auto preferred_color_scheme = + delegate->IsNightModeEnabled() + ? blink::mojom::PreferredColorScheme::kDark + : blink::mojom::PreferredColorScheme::kLight; + return {preferred_color_scheme, preferred_color_scheme}; + } } + return {web_prefs.preferred_color_scheme, + web_prefs.preferred_root_scrollbar_color_scheme}; #else - - Profile* profile = - Profile::FromBrowserContext(web_contents->GetBrowserContext()); - CHECK(profile); - - // Update the preferred root scrollbar color based on the lightness level of - // the toolbar's color. - web_prefs->preferred_root_scrollbar_color_scheme = - color_utils::IsDark( - web_contents->GetColorProvider().GetColor(kColorToolbar)) - ? blink::mojom::PreferredColorScheme::kDark - : blink::mojom::PreferredColorScheme::kLight; - -#endif // BUILDFLAG(IS_ANDROID) - -#if !BUILDFLAG(IS_ANDROID) - // Incognito contents follow the device color mode. - if (profile->IsIncognitoProfile() && !content::HasWebUIScheme(url)) { - web_prefs->preferred_color_scheme = + blink::mojom::PreferredColorScheme preferred_color_scheme; + if (Profile::FromBrowserContext(web_contents->GetBrowserContext()) + ->IsIncognitoProfile() && + !content::HasWebUIScheme(url)) { + // Incognito contents follow the device color mode. + preferred_color_scheme = ToBlinkPreferredColorScheme(native_theme->GetPreferredColorScheme()); } else { // WebUI and regular pages follow the browser theme color mode, provided by // the color provider. - web_prefs->preferred_color_scheme = + preferred_color_scheme = web_contents->GetColorMode() == ui::ColorProviderKey::ColorMode::kLight ? blink::mojom::PreferredColorScheme::kLight : blink::mojom::PreferredColorScheme::kDark; @@ -4101,45 +4218,49 @@ bool UpdatePreferredColorScheme(WebPreferences* web_prefs, // If the top-level WebContents is the same as the guest, then // `web_contents` is *not* a guest. if (owner_contents != web_contents) { - web_prefs->preferred_color_scheme = + preferred_color_scheme = owner_contents->GetOrCreateWebPreferences().preferred_color_scheme; } -#endif // !BUILDFLAG(IS_ANDROID) - return old_preferred_color_scheme != web_prefs->preferred_color_scheme; + // Update the preferred root scrollbar color based on the lightness level of + // the toolbar's color. + const auto preferred_root_scrollbar_color_scheme = + color_utils::IsDark( + web_contents->GetColorProvider().GetColor(kColorToolbar)) + ? blink::mojom::PreferredColorScheme::kDark + : blink::mojom::PreferredColorScheme::kLight; + + return {preferred_color_scheme, preferred_root_scrollbar_color_scheme}; +#endif } +std::optional GetRootScrollbarThemeColor(WebContents* web_contents) { + bool root_scrollbar_follows_browser_theme = false; #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) -// Sets the `root_scrollbar_theme_color` web pref if the user has enabled a -// custom colored frame for the UI. -void UpdateRootScrollbarThemeColor(Profile* profile, - const WebContents* web_contents, - WebPreferences* web_prefs) { - if (!base::FeatureList::IsEnabled( - blink::features::kRootScrollbarFollowsBrowserTheme)) { - return; + root_scrollbar_follows_browser_theme = base::FeatureList::IsEnabled( + blink::features::kRootScrollbarFollowsBrowserTheme); +#endif + if (!root_scrollbar_follows_browser_theme) { + return std::nullopt; } - if (ThemeService* theme_service = - ThemeServiceFactory::GetForProfile(profile)) { - if (!theme_service->UsingDefaultTheme() || - theme_service->GetUserColor().has_value() || - theme_service->UsingDeviceTheme()) { - color_utils::HSL hsl; - color_utils::SkColorToHSL( - web_contents->GetColorProvider().GetColor(kColorToolbar), &hsl); - // Clamp the lightness of theme colors that are too light or dark and - // have no contrast against the background. We don't use color_utils - // contrast functions because they lose saturation. - static constexpr double kTopLightnessThreshold = 0.8; - static constexpr double kBottomLightnessThreshold = 0.3; - hsl.l = - std::clamp(hsl.l, kBottomLightnessThreshold, kTopLightnessThreshold); - web_prefs->root_scrollbar_theme_color = - color_utils::HSLToSkColor(hsl, SK_AlphaOPAQUE); - } + + if (ThemeService* theme_service = ThemeServiceFactory::GetForProfile( + Profile::FromBrowserContext(web_contents->GetBrowserContext())); + !theme_service || (theme_service->UsingDefaultTheme() && + !theme_service->GetUserColor().has_value() && + !theme_service->UsingDeviceTheme())) { + return std::nullopt; } + + color_utils::HSL hsl; + color_utils::SkColorToHSL( + web_contents->GetColorProvider().GetColor(kColorToolbar), &hsl); + // Clamp the lightness of theme colors that are too light or dark and have no + // contrast against the background. We don't use color_utils contrast + // functions because they lose saturation. + hsl.l = std::clamp(hsl.l, 0.3, 0.8); + return color_utils::HSLToSkColor(hsl, SK_AlphaOPAQUE); } -#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) // Returns whether the user can be prompted to select a client certificate after // no certificate got auto-selected. @@ -4732,29 +4853,18 @@ void ChromeContentBrowserClient::OverrideWebPreferences( SubAppsAPIsRequireUserGestureAndAuthorization(web_contents); #endif // BUILDFLAG(IS_CHROMEOS) - switch (GetWebTheme()->GetPreferredContrast()) { - case ui::NativeTheme::PreferredContrast::kNoPreference: - web_prefs->preferred_contrast = - blink::mojom::PreferredContrast::kNoPreference; - break; - case ui::NativeTheme::PreferredContrast::kMore: - web_prefs->preferred_contrast = blink::mojom::PreferredContrast::kMore; - break; - case ui::NativeTheme::PreferredContrast::kLess: - web_prefs->preferred_contrast = blink::mojom::PreferredContrast::kLess; - break; - case ui::NativeTheme::PreferredContrast::kCustom: - web_prefs->preferred_contrast = blink::mojom::PreferredContrast::kCustom; - break; - } + web_prefs->preferred_contrast = GetPreferredContrast(GetWebTheme()); - UpdateForcedColorsForWebContent(web_prefs, web_contents, GetWebTheme()); + std::tie(web_prefs->in_forced_colors, web_prefs->is_forced_colors_disabled) = + GetForcedColorsForWebContent(web_contents, GetWebTheme()); - UpdatePreferredColorScheme(web_prefs, main_frame_site.GetSiteURL(), - web_contents, GetWebTheme()); -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) - UpdateRootScrollbarThemeColor(profile, web_contents, web_prefs); -#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) + std::tie(web_prefs->preferred_color_scheme, + web_prefs->preferred_root_scrollbar_color_scheme) = + GetPreferredColorScheme(*web_prefs, main_frame_site.GetSiteURL(), + web_contents, GetWebTheme()); + + web_prefs->root_scrollbar_theme_color = + GetRootScrollbarThemeColor(web_contents); web_prefs->translate_service_available = TranslateService::IsAvailable(prefs); @@ -4852,12 +4962,26 @@ bool ChromeContentBrowserClient::OverrideWebPreferencesAfterNavigation( web_contents, main_frame_site, web_prefs); } + const auto old_in_forced_colors = web_prefs->in_forced_colors; + const auto old_is_forced_colors_disabled = + web_prefs->is_forced_colors_disabled; + std::tie(web_prefs->in_forced_colors, web_prefs->is_forced_colors_disabled) = + GetForcedColorsForWebContent(web_contents, GetWebTheme()); prefs_changed |= - UpdateForcedColorsForWebContent(web_prefs, web_contents, GetWebTheme()); + web_prefs->in_forced_colors != old_in_forced_colors || + web_prefs->is_forced_colors_disabled != old_is_forced_colors_disabled; + const auto old_preferred_color_scheme = web_prefs->preferred_color_scheme; + const auto old_preferred_root_scrollbar_color_scheme = + web_prefs->preferred_root_scrollbar_color_scheme; + std::tie(web_prefs->preferred_color_scheme, + web_prefs->preferred_root_scrollbar_color_scheme) = + GetPreferredColorScheme(*web_prefs, main_frame_site.GetSiteURL(), + web_contents, GetWebTheme()); prefs_changed |= - UpdatePreferredColorScheme(web_prefs, web_contents->GetLastCommittedURL(), - web_contents, GetWebTheme()); + web_prefs->preferred_color_scheme != old_preferred_color_scheme || + web_prefs->preferred_root_scrollbar_color_scheme != + old_preferred_root_scrollbar_color_scheme; #if BUILDFLAG(IS_ANDROID) auto* delegate = TabAndroid::FromWebContents(web_contents) @@ -4883,6 +5007,23 @@ bool ChromeContentBrowserClient::OverrideWebPreferencesAfterNavigation( return prefs_changed; } +bool ChromeContentBrowserClient:: + WebPreferencesNeedUpdateForColorRelatedStateChanges( + WebContents& web_contents, + const SiteInstance& main_frame_site) const { + const WebPreferences& prefs = web_contents.GetOrCreateWebPreferences(); + return GetPreferredContrast(GetWebTheme()) != prefs.preferred_contrast || + GetForcedColorsForWebContent(&web_contents, GetWebTheme()) != + std::tie(prefs.in_forced_colors, + prefs.is_forced_colors_disabled) || + GetPreferredColorScheme(prefs, main_frame_site.GetSiteURL(), + &web_contents, GetWebTheme()) != + std::tie(prefs.preferred_color_scheme, + prefs.preferred_root_scrollbar_color_scheme) || + GetRootScrollbarThemeColor(&web_contents) != + prefs.root_scrollbar_theme_color; +} + void ChromeContentBrowserClient::BrowserURLHandlerCreated( BrowserURLHandler* handler) { // The group policy NTP URL handler must be registered before the other NTP @@ -5047,6 +5188,14 @@ void ChromeContentBrowserClient::GetAdditionalMappedFilesForChildProcess( fd = ui::GetCommonResourcesPackFd(®ion); mappings->ShareWithRegion(kAndroidChrome100PercentPakDescriptor, fd, region); + if constexpr (BUILDFLAG(ENABLE_HIDPI)) { + fd = ui::Get200PercentResourcesPackFd(®ion); + if (fd != -1) { + mappings->ShareWithRegion(kAndroidChrome200PercentPakDescriptor, fd, + region); + } + } + GetMappedLocalePacksForChildProcess(mappings); base::FilePath app_data_path; @@ -6820,6 +6969,23 @@ bool ChromeContentBrowserClient::HandleExternalProtocol( mojo::PendingRemote* out_factory) { CHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); +#if !BUILDFLAG(IS_ANDROID) + content::WebContents* web_contents = web_contents_getter.Run(); + if (web_contents) { + Profile* profile = + Profile::FromBrowserContext(web_contents->GetBrowserContext()); + const auto* tab_interface = + tabs::TabInterface::MaybeGetFromContents(web_contents); + auto* actor_service = actor::ActorKeyedService::Get(profile); + // If actor is active, bail out early to prevent it from launching external + // applications. + if (tab_interface && actor_service && + actor_service->IsAnyTaskActingOnTab(*tab_interface)) { + return false; + } + } +#endif //! BUILDFLAG(IS_ANDROID) + #if BUILDFLAG(ENABLE_EXTENSIONS) // External protocols are disabled for guests. An exception is made for the // "mailto" protocol, so that pages that utilize it work properly in a @@ -6865,6 +7031,22 @@ ChromeContentBrowserClient::CreateWindowForVideoPictureInPicture( return content::VideoOverlayWindow::Create(controller); } +base::ScopedClosureRunner +ChromeContentBrowserClient::MaybeGetScopedPictureInPictureTucker( + content::WebContents* web_contents) { +#if !BUILDFLAG(IS_ANDROID) + if (PictureInPictureWindowManager::GetInstance() + ->ShouldFileDialogTuckPictureInPicture(web_contents)) { + // Make the `ScopedTuckPictureInPicture` share the same lifecycle as the + // `ScopedClosureRunner`. + auto tucker = std::make_unique(); + return base::ScopedClosureRunner( + base::DoNothingWithBoundArgs(std::move(tucker))); + } +#endif + return base::ScopedClosureRunner(); +} + media::PictureInPictureEventsInfo::AutoPipInfo ChromeContentBrowserClient::GetAutoPipInfo( const content::WebContents& web_contents) const { @@ -6901,8 +7083,7 @@ bool ChromeContentBrowserClient::HandleWebUI( } #if BUILDFLAG(CHROME_ROOT_STORE_CERT_MANAGEMENT_UI) - if (base::FeatureList::IsEnabled(features::kEnableCertManagementUIV2) && - url->SchemeIs(content::kChromeUIScheme) && + if (url->SchemeIs(content::kChromeUIScheme) && url->host() == chrome::kChromeUISettingsHost && url->path() == chrome::kChromeUICertificateRedirectPath) { *url = GURL(chrome::kChromeUICertificateManagerDialogURL); @@ -7152,7 +7333,8 @@ void ChromeContentBrowserClient::OnNetworkServiceDataUseUpdate( int64_t recv_bytes, int64_t sent_bytes) { task_manager::TaskManagerInterface::UpdateAccumulatedStatsNetworkForRoute( - render_frame_host_id, recv_bytes, sent_bytes); + render_frame_host_id, base::ByteCount(recv_bytes), + base::ByteCount(sent_bytes)); } base::FilePath @@ -7281,8 +7463,7 @@ bool ChromeContentBrowserClient::ShouldBlockRendererDebugURL( #if BUILDFLAG(IS_ANDROID) content::ContentBrowserClient::WideColorGamutHeuristic ChromeContentBrowserClient::GetWideColorGamutHeuristic() { - if (viz::AlwaysUseWideColorGamut() || - features::IsDynamicColorGamutEnabled()) { + if (viz::AlwaysUseWideColorGamut()) { return WideColorGamutHeuristic::kUseDisplay; } @@ -7514,7 +7695,7 @@ bool ChromeContentBrowserClient::IsClipboardPasteAllowed( void ChromeContentBrowserClient::IsClipboardPasteAllowedByPolicy( const content::ClipboardEndpoint& source, const content::ClipboardEndpoint& destination, - const content::ClipboardMetadata& metadata, + const ui::ClipboardMetadata& metadata, ClipboardPasteData clipboard_paste_data, IsClipboardPasteAllowedCallback callback) { // TODO(b/352728209): Add Android-specific hook for Data Controls. @@ -7536,7 +7717,7 @@ void ChromeContentBrowserClient::IsClipboardPasteAllowedByPolicy( void ChromeContentBrowserClient::IsClipboardCopyAllowedByPolicy( const content::ClipboardEndpoint& source, - const content::ClipboardMetadata& metadata, + const ui::ClipboardMetadata& metadata, const ClipboardPasteData& data, IsClipboardCopyAllowedCallback callback) { #if BUILDFLAG(ENTERPRISE_DATA_CONTROLS) @@ -7613,7 +7794,7 @@ ChromeContentBrowserClient::ShouldOverridePrivateNetworkRequestPolicy( content::BrowserContext* browser_context, const url::Origin& origin) { #if BUILDFLAG(IS_ANDROID) - if (base::android::BuildInfo::GetInstance()->is_automotive()) { + if (base::android::device_info::is_automotive()) { return content::ContentBrowserClient::PrivateNetworkRequestPolicyOverride:: kBlockInsteadOfWarn; } @@ -7891,6 +8072,7 @@ void ChromeContentBrowserClient::OnWebContentsCreated( } #if !BUILDFLAG(IS_ANDROID) +// static base::TimeDelta ChromeContentBrowserClient::GetKeepaliveTimerTimeout( content::BrowserContext* context) { Profile* profile = Profile::FromBrowserContext(context); @@ -8221,8 +8403,7 @@ void ChromeContentBrowserClient::GetCloudIdentifiers( content::FileSystemAccessPermissionContext::HandleType handle_type, GetCloudIdentifiersCallback callback) { #if BUILDFLAG(IS_CHROMEOS) - cloud_identifier::GetCloudIdentifierFromAsh(url, handle_type, - std::move(callback)); + cloud_identifier::GetCloudIdentifier(url, handle_type, std::move(callback)); #else // BUILDFLAG(IS_CHROMEOS) return ContentBrowserClient::GetCloudIdentifiers(url, handle_type, std::move(callback)); @@ -8578,11 +8759,6 @@ void ChromeContentBrowserClient::QueryInstalledWebAppsByManifestId( } #endif // !BUILDFLAG(IS_ANDROID) -bool ChromeContentBrowserClient::IsSaveableNavigation( - content::NavigationHandle* navigation_handle) { - return tab_groups::TabGroupSyncUtils::IsSaveableNavigation(navigation_handle); -} - #if BUILDFLAG(IS_WIN) void ChromeContentBrowserClient::OnUiaProviderRequested( bool uia_provider_enabled) { @@ -8723,14 +8899,19 @@ ChromeContentBrowserClient::MaybeOverrideLocalURLCrossOriginEmbedderPolicy( return std::nullopt; } + // `pdf_extension` could be nullptr, possibly due to a race condition where + // the extension frame is deleted as the PDF content navigation is requested. + content::RenderFrameHost* pdf_extension = navigation_handle->GetParentFrame(); + if (!pdf_extension) { + return std::nullopt; + } + // TODO(crbug.com/40053796): Local URLs inherit their policy container from // the navigation initiator instead of the document creating the navigation // request, so local PDF URL navigations in the PDF renderer inherit policies // from the PDF extension frame (the parent frame) and might have the // incorrect COEP. Until this is fixed, just copy the COEP directly from the // PDF embedder. - content::RenderFrameHost* pdf_extension = navigation_handle->GetParentFrame(); - CHECK(pdf_extension); content::RenderFrameHost* pdf_embedder = pdf_extension->GetParent(); CHECK(pdf_embedder); return pdf_embedder->GetCrossOriginEmbedderPolicy(); @@ -8770,3 +8951,31 @@ ChromeContentBrowserClient::GetClipboardTypesIfPolicyApplied( return std::nullopt; } + +bool ChromeContentBrowserClient::ShouldEnableCanvasNoise( + content::BrowserContext* browser_context, + const GURL& url) { + Profile* profile = Profile::FromBrowserContext(browser_context); + bool feature_enable = fingerprinting_protection_interventions::features:: + IsCanvasInterventionsEnabledForIncognitoState( + profile->IsIncognitoProfile()); + // System profiles are considered incognito, but will not query from + // ProfileKeyedServices and will return nullptr. We should only check user + // bypass if the profile returns TrackingProtectionSettings. + privacy_sandbox::TrackingProtectionSettings* tracking_protections_settings = + TrackingProtectionSettingsFactory::GetForProfile(profile); + if (tracking_protections_settings) { + return feature_enable && + !tracking_protections_settings->HasTrackingProtectionException(url); + } + return feature_enable; +} + +bool ChromeContentBrowserClient::UsePrefetchPrerenderIntegration() { + return base::FeatureList::IsEnabled(features::kBookmarkTriggerForPrefetch) || + base::FeatureList::IsEnabled(features::kNewTabPageTriggerForPrefetch); +} + +bool ChromeContentBrowserClient::UsePreloadServingMetrics() { + return features::kDsePreload2UsePreloadServingMetrics.Get(); +} diff --git a/tools/under-control/src/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/tools/under-control/src/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index 54ba6fb8..125057be 100755 --- a/tools/under-control/src/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/tools/under-control/src/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java @@ -153,7 +153,7 @@ public abstract class ChromeFeatureList { } // Feature names. - /* Alphabetical: */ + // keep-sorted start group_prefixes=["public static final String"] public static final String ACCOUNT_FOR_SUPPRESSED_KEYBOARD_INSETS = "AccountForSuppressedKeyboardInsets"; public static final String ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_V2 = @@ -162,7 +162,10 @@ public abstract class ChromeFeatureList { "AdaptiveButtonInTopToolbarPageSummary"; public static final String ALLOW_TAB_CLOSING_UPON_MINIMIZATION = "AllowTabClosingUponMinimization"; - public static final String ALWAYS_BLOCK_3PCS_INCOGNITO = "AlwaysBlock3pcsIncognito"; + public static final String ANDROID_ANIMATED_PROGRESS_BAR_IN_BROWSER = + "AndroidAnimatedProgressBarInBrowser"; + public static final String ANDROID_ANIMATED_PROGRESS_BAR_IN_VIZ = + "AndroidAnimatedProgressBarInViz"; public static final String ANDROID_APPEARANCE_SETTINGS = "AndroidAppearanceSettings"; public static final String ANDROID_APP_INTEGRATION = "AndroidAppIntegration"; public static final String ANDROID_APP_INTEGRATION_MODULE = "AndroidAppIntegrationModule"; @@ -176,9 +179,9 @@ public abstract class ChromeFeatureList { public static final String ANDROID_BOTTOM_TOOLBAR_V2 = "AndroidBottomToolbarV2"; public static final String ANDROID_COMPOSEPLATE = "AndroidComposeplate"; public static final String ANDROID_DATA_IMPORTER_SERVICE = "AndroidDataImporterService"; + public static final String ANDROID_DESKTOP_DENSITY = "AndroidDesktopDensity"; public static final String ANDROID_ELEGANT_TEXT_HEIGHT = "AndroidElegantTextHeight"; public static final String ANDROID_FIRST_RUN_LAUNCH_BOUNDS = "AndroidFirstRunLaunchBounds"; - public static final String ANDROID_GRAMMAR_CHECK = "AndroidGrammarCheck"; public static final String ANDROID_MINIMAL_UI_LARGE_SCREEN = "AndroidMinimalUiLargeScreen"; public static final String ANDROID_NATIVE_PAGES_IN_NEW_TAB = "AndroidNativePagesInNewTab"; public static final String ANDROID_NO_VISIBLE_HINT_FOR_DIFFERENT_TLD = @@ -194,7 +197,6 @@ public abstract class ChromeFeatureList { public static final String ANDROID_SETTINGS_CONTAINMENT = "AndroidSettingsContainment"; public static final String ANDROID_SHOW_RESTORE_TABS_PROMO_ON_FRE_BYPASSED_KILL_SWITCH = "AndroidShowRestoreTabsPromoOnFREBypassedKillSwitch"; - public static final String ANDROID_SPELLCHECK_NATIVE_UI = "AndroidSpellcheckNativeUi"; public static final String ANDROID_SURFACE_COLOR_UPDATE = "AndroidSurfaceColorUpdate"; public static final String ANDROID_TAB_DECLUTTER_ARCHIVE_ALL_BUT_ACTIVE = "AndroidTabDeclutterArchiveAllButActiveTab"; @@ -215,12 +217,19 @@ public abstract class ChromeFeatureList { public static final String ANDROID_TAB_SKIP_SAVE_TABS_TASK_KILLSWITCH = "AndroidTabSkipSaveTabsTaskKillswitch"; public static final String ANDROID_THEME_MODULE = "AndroidThemeModule"; - public static final String ANDROID_WEB_APP_LAUNCH_HANDLER = "AndroidWebAppLaunchHandler"; + public static final String ANDROID_THEME_RESOURCE_PROVIDER = "AndroidThemeResourceProvider"; + public static final String ANDROID_TIPS_NOTIFICATIONS = "AndroidTipsNotifications"; public static final String ANDROID_USE_ADMINS_FOR_ENTERPRISE_INFO = "AndroidUseAdminsForEnterpriseInfo"; + public static final String ANDROID_WEB_APP_LAUNCH_HANDLER = "AndroidWebAppLaunchHandler"; + public static final String ANDROID_WINDOW_CONTROLS_OVERLAY = "AndroidWindowControlsOverlay"; public static final String ANDROID_WINDOW_POPUP_LARGE_SCREEN = "AndroidWindowPopupLargeScreen"; + public static final String ANDROID_WINDOW_POPUP_PREDICT_FINAL_BOUNDS = + "AndroidWindowPopupPredictFinalBounds"; public static final String ANDROID_WINDOW_POPUP_RESIZE_AFTER_SPAWN = "AndroidWindowPopupResizeAfterSpawn"; + public static final String ANDROID_XR_USES_SURFACE_CONTROL = + "AndroidWindowPopupResizeAfterSpawn"; public static final String ANIMATED_GIF_REFACTOR = "AnimatedGifRefactor"; public static final String ANIMATED_IMAGE_DRAG_SHADOW = "AnimatedImageDragShadow"; public static final String ANNOTATED_PAGE_CONTENTS_VIRTUAL_STRUCTURE = @@ -230,9 +239,10 @@ public abstract class ChromeFeatureList { public static final String ASYNC_NOTIFICATION_MANAGER = "AsyncNotificationManager"; public static final String ASYNC_NOTIFICATION_MANAGER_FOR_DOWNLOAD = "AsyncNotificationManagerForDownload"; - public static final String AUTO_PICTURE_IN_PICTURE_ANDROID = "AutoPictureInPictureAndroid"; public static final String AUTOFILL_ALLOW_NON_HTTP_ACTIVATION = "AutofillAllowNonHttpActivation"; + public static final String AUTOFILL_ANDROID_DESKTOP_KEYBOARD_ACCESSORY_REVAMP = + "AutofillAndroidDesktopKeyboardAccessoryRevamp"; public static final String AUTOFILL_ANDROID_DESKTOP_SUPPRESS_ACCESSORY_ON_EMPTY = "AutofillAndroidDesktopSuppressAccessoryOnEmpty"; public static final String AUTOFILL_DEEP_LINK_AUTOFILL_OPTIONS = @@ -249,10 +259,6 @@ public abstract class ChromeFeatureList { "AutofillEnableLoyaltyCardsFilling"; public static final String AUTOFILL_ENABLE_NEW_CARD_BENEFITS_TOGGLE_TEXT = "AutofillEnableNewCardBenefitsToggleText"; - public static final String AUTOFILL_ENABLE_PAYMENT_SETTINGS_CARD_PROMO_AND_SCAN_CARD = - "AutofillEnablePaymentSettingsCardPromoAndScanCard"; - public static final String AUTOFILL_ENABLE_PAYMENT_SETTINGS_SERVER_CARD_SAVE = - "AutofillEnablePaymentSettingsServerCardSave"; public static final String AUTOFILL_ENABLE_RANKING_FORMULA_ADDRESS_PROFILES = "AutofillEnableRankingFormulaAddressProfiles"; public static final String AUTOFILL_ENABLE_RANKING_FORMULA_CREDIT_CARDS = @@ -273,10 +279,9 @@ public abstract class ChromeFeatureList { public static final String AUTOFILL_SYNC_EWALLET_ACCOUNTS = "AutofillSyncEwalletAccounts"; public static final String AUTOFILL_THIRD_PARTY_MODE_CONTENT_PROVIDER = "AutofillThirdPartyModeContentProvider"; - public static final String AUTOFILL_VIRTUAL_VIEW_STRUCTURE_ANDROID = - "AutofillVirtualViewStructureAndroid"; public static final String AUTOMOTIVE_BACK_BUTTON_BAR_STREAMLINE = "AutomotiveBackButtonBarStreamline"; + public static final String AUTO_PICTURE_IN_PICTURE_ANDROID = "AutoPictureInPictureAndroid"; public static final String AVOID_RELAYOUT_DURING_FOCUS_ANIMATION = "AvoidRelayoutDuringFocusAnimation"; public static final String BACKGROUND_THREAD_POOL_FIELD_TRIAL = @@ -309,6 +314,8 @@ public abstract class ChromeFeatureList { "CCTBlockTouchesDuringEnterAnimation"; public static final String CCT_CLIENT_DATA_HEADER = "CCTClientDataHeader"; public static final String CCT_CONTEXTUAL_MENU_ITEMS = "CCTContextualMenuItems"; + public static final String CCT_DESTROY_TAB_WHEN_MODEL_IS_EMPTY = + "CCTDestroyTabWhenModelIsEmpty"; public static final String CCT_EARLY_NAV = "CCTEarlyNav"; public static final String CCT_EXTEND_TRUSTED_CDN_PUBLISHER = "CCTExtendTrustedCdnPublisher"; public static final String CCT_FIX_WARMUP = "CCTFixWarmup"; @@ -320,31 +327,31 @@ public abstract class ChromeFeatureList { "CCTIncognitoAvailableToThirdParty"; public static final String CCT_MINIMIZED_ENABLED_BY_DEFAULT = "CCTMinimizedEnabledByDefault"; public static final String CCT_NAVIGATIONAL_PREFETCH = "CCTNavigationalPrefetch"; + public static final String CCT_NAVIGATION_METRICS = "CCTNavigationMetrics"; public static final String CCT_NESTED_SECURITY_ICON = "CCTNestedSecurityIcon"; public static final String CCT_OPEN_IN_BROWSER_BUTTON_IF_ALLOWED_BY_EMBEDDER = "CCTOpenInBrowserButtonIfAllowedByEmbedder"; public static final String CCT_OPEN_IN_BROWSER_BUTTON_IF_ENABLED_BY_EMBEDDER = "CCTOpenInBrowserButtonIfEnabledByEmbedder"; public static final String CCT_PREDICTIVE_BACK_GESTURE = "CCTPredictiveBackGesture"; - // NOTE: Do not query this feature directly, use WarmupManager#isCCTPrewarmTabFeatureEnabled. - public static final String CCT_PREWARM_TAB = "CCTPrewarmTab"; public static final String CCT_REALTIME_ENGAGEMENT_EVENTS_IN_BACKGROUND = "CCTRealtimeEngagementEventsInBackground"; public static final String CCT_REPORT_PARALLEL_REQUEST_STATUS = "CCTReportParallelRequestStatus"; public static final String CCT_REPORT_PRERENDER_EVENTS = "CCTReportPrerenderEvents"; + public static final String CCT_RESET_TIMEOUT_ENABLED = "CCTResetTimeoutEnabled"; public static final String CCT_RESIZABLE_FOR_THIRD_PARTIES = "CCTResizableForThirdParties"; public static final String CCT_REVAMPED_BRANDING = "CCTRevampedBranding"; public static final String CCT_SHOW_TAB_FIX = "CCTShowTabFix"; public static final String CCT_TAB_MODAL_DIALOG = "CCTTabModalDialog"; public static final String CCT_TOOLBAR_REFACTOR = "CCTToolbarRefactor"; - public static final String CCT_RESET_TIMEOUT_ENABLED = "CCTResetTimeoutEnabled"; public static final String CHANGE_UNFOCUSED_PRIORITY = "ChangeUnfocusedPriority"; public static final String CHROME_NATIVE_URL_OVERRIDING = "ChromeNativeUrlOverriding"; public static final String CHROME_SURVEY_NEXT_ANDROID = "ChromeSurveyNextAndroid"; public static final String CLAMP_AUTOMOTIVE_SCALING = "ClampAutomotiveScaling"; public static final String CLANK_STARTUP_LATENCY_INJECTION = "ClankStartupLatencyInjection"; public static final String CLANK_WHATS_NEW = "ClankWhatsNew"; + public static final String CLEANUP_LEGACY_TABSTATE = "CleanupLegacyTabState"; public static final String CLEAR_BROWSING_DATA_ANDROID_SURVEY = "ClearBrowsingDataAndroidSurvey"; public static final String CLEAR_INSTANCE_INFO_WHEN_CLOSED_INTENTIONALLY = @@ -363,6 +370,8 @@ public abstract class ChromeFeatureList { public static final String CONTEXTUAL_SEARCH_SUPPRESS_SHORT_VIEW = "ContextualSearchSuppressShortView"; public static final String CONTEXT_MENU_EMPTY_SPACE = "ContextMenuEmptySpace"; + public static final String CONTEXT_MENU_PICTURE_IN_PICTURE_ANDROID = + "ContextMenuPictureInPictureAndroid"; public static final String CONTEXT_MENU_TRANSLATE_WITH_GOOGLE_LENS = "ContextMenuTranslateWithGoogleLens"; public static final String CONTROLS_VISIBILITY_FROM_NAVIGATIONS = @@ -373,13 +382,13 @@ public abstract class ChromeFeatureList { public static final String DARKEN_WEBSITES_CHECKBOX_IN_THEMES_SETTING = "DarkenWebsitesCheckboxInThemesSetting"; public static final String DATA_SHARING = "DataSharing"; + public static final String DATA_SHARING_ENABLE_UPDATE_CHROME_UI = + "DataSharingEnableUpdateChromeUI"; public static final String DATA_SHARING_JOIN_ONLY = "DataSharingJoinOnly"; public static final String DATA_SHARING_NON_PRODUCTION_ENVIRONMENT = "DataSharingNonProductionEnvironment"; - public static final String SHARED_DATA_TYPES_KILL_SWITCH = "SharedDataTypesKillSwitch"; - public static final String DATA_SHARING_ENABLE_UPDATE_CHROME_UI = - "DataSharingEnableUpdateChromeUI"; public static final String DEFAULT_BROWSER_PROMO_ANDROID2 = "DefaultBrowserPromoAndroid2"; + public static final String DESKTOP_UA_ON_CONNECTED_DISPLAY = "DesktopUAOnConnectedDisplay"; public static final String DETAILED_LANGUAGE_SETTINGS = "DetailedLanguageSettings"; public static final String DEVICE_AUTHENTICATOR_ANDROIDX = "DeviceAuthenticatorAndroidx"; public static final String DISABLE_INSTANCE_LIMIT = "DisableInstanceLimit"; @@ -390,7 +399,6 @@ public abstract class ChromeFeatureList { public static final String DRAW_CHROME_PAGES_EDGE_TO_EDGE = "DrawChromePagesEdgeToEdge"; public static final String DRAW_CUTOUT_EDGE_TO_EDGE = "DrawCutoutEdgeToEdge"; public static final String EDGE_TO_EDGE_BOTTOM_CHIN = "EdgeToEdgeBottomChin"; - public static final String EDGE_TO_EDGE_DEBUGGING = "EdgeToEdgeDebugging"; public static final String EDGE_TO_EDGE_EVERYWHERE = "EdgeToEdgeEverywhere"; public static final String EDGE_TO_EDGE_MONITOR_CONFIGURATIONS = "EdgeToEdgeMonitorConfigurations"; @@ -408,11 +416,11 @@ public abstract class ChromeFeatureList { public static final String ENABLE_EXCLUSIVE_ACCESS_MANAGER = "EnableExclusiveAccessManager"; public static final String ENABLE_FULLSCREEN_TO_ANY_SCREEN_ANDROID = "EnableFullscreenToAnyScreenAndroid"; - public static final String FACILITATED_PAYMENTS_ENABLE_A2A_PAYMENT = - "FacilitatedPaymentsEnableA2APayment"; public static final String ENABLE_SAVE_PACKAGE_FOR_OFF_THE_RECORD = "EnableSavePackageForOffTheRecord"; public static final String ENABLE_X_AXIS_ACTIVITY_TRANSITION = "EnableXAxisActivityTransition"; + public static final String FACILITATED_PAYMENTS_ENABLE_A2A_PAYMENT = + "FacilitatedPaymentsEnableA2APayment"; public static final String FEED_AUDIO_OVERVIEWS = "FeedAudioOverviews"; public static final String FEED_CONTAINMENT = "FeedContainment"; public static final String FEED_FOLLOW_UI_UPDATE = "FeedFollowUiUpdate"; @@ -449,6 +457,7 @@ public abstract class ChromeFeatureList { public static final String HUB_BACK_BUTTON = "HubBackButton"; public static final String HUB_SLIDE_ANIMATION = "HubSlideAnimation"; public static final String INCOGNITO_SCREENSHOT = "IncognitoScreenshot"; + public static final String INCOGNITO_THEME_OVERLAY_TESTING = "IncognitoThemeOverlayTesting"; public static final String INSTANCE_SWITCHER_V2 = "InstanceSwitcherV2"; public static final String IP_PROTECTION_UX = "IpProtectionUx"; public static final String KEYBOARD_ESC_BACK_NAVIGATION = "KeyboardEscBackNavigation"; @@ -457,8 +466,10 @@ public abstract class ChromeFeatureList { public static final String LINKED_SERVICES_SETTING = "LinkedServicesSetting"; public static final String LOADING_PREDICTOR_LIMIT_PRECONNECT_SOCKET_COUNT = "LoadingPredictorLimitPreconnectSocketCount"; + public static final String LOAD_NATIVE_EARLY = "LoadNativeEarly"; public static final String LOCAL_NETWORK_ACCESS = "LocalNetworkAccessChecks"; public static final String LOCK_BACK_PRESS_HANDLER_AT_START = "LockBackPressHandlerAtStart"; + public static final String LOCK_TOP_CONTROLS_ON_LARGE_TABLETS = "LockTopControlsOnLargeTablets"; public static final String LOOKALIKE_NAVIGATION_URL_SUGGESTIONS_UI = "LookalikeUrlNavigationSuggestionsUI"; public static final String MAGIC_STACK_ANDROID = "MagicStackAndroid"; @@ -477,8 +488,6 @@ public abstract class ChromeFeatureList { public static final String NATIVE_PAGE_TRANSITION_HARDWARE_CAPTURE = "NativePageTransitionHardwareCapture"; public static final String NAV_BAR_COLOR_ANIMATION = "NavBarColorAnimation"; - public static final String NEW_TAB_PAGE_ANDROID_TRIGGER_FOR_PRERENDER2 = - "NewTabPageAndroidTriggerForPrerender2"; public static final String NEW_TAB_PAGE_CUSTOMIZATION = "NewTabPageCustomization"; public static final String NEW_TAB_PAGE_CUSTOMIZATION_FOR_MVT = "NewTabPageCustomizationForMvt"; public static final String NEW_TAB_PAGE_CUSTOMIZATION_TOOLBAR_BUTTON = @@ -501,6 +510,7 @@ public abstract class ChromeFeatureList { public static final String PARTNER_CUSTOMIZATIONS_UMA = "PartnerCustomizationsUma"; public static final String PASSWORD_FORM_GROUPED_AFFILIATIONS = "PasswordFormGroupedAffiliations"; + public static final String PCCT_MINIMUM_HEIGHT = "PCCTMinimumHeight"; public static final String PERMISSION_DEDICATED_CPSS_SETTING_ANDROID = "PermissionDedicatedCpssSettingAndroid"; public static final String PERMISSION_SITE_SETTING_RADIO_BUTTON = @@ -513,8 +523,6 @@ public abstract class ChromeFeatureList { public static final String POWER_SAVING_MODE_BROADCAST_RECEIVER_IN_BACKGROUND = "PowerSavingModeBroadcastReceiverInBackground"; public static final String PRECONNECT_ON_TAB_CREATION = "PreconnectOnTabCreation"; - public static final String PREFETCH_BROWSER_INITIATED_TRIGGERS = - "PrefetchBrowserInitiatedTriggers"; public static final String PRERENDER2 = "Prerender2"; public static final String PRICE_ANNOTATIONS = "PriceAnnotations"; public static final String PRICE_CHANGE_MODULE = "PriceChangeModule"; @@ -525,11 +533,11 @@ public abstract class ChromeFeatureList { public static final String PRIVACY_SANDBOX_ADS_NOTICE_CCT = "PrivacySandboxAdsNoticeCCT"; public static final String PRIVACY_SANDBOX_AD_TOPICS_CONTENT_PARITY = "PrivacySandboxAdTopicsContentParity"; - public static final String PRIVACY_SANDBOX_RELATED_WEBSITE_SETS_UI = - "PrivacySandboxRelatedWebsiteSetsUi"; public static final String PRIVACY_SANDBOX_SENTIMENT_SURVEY = "PrivacySandboxSentimentSurvey"; public static final String PRIVACY_SANDBOX_SETTINGS_4 = "PrivacySandboxSettings4"; public static final String PROCESS_RANK_POLICY_ANDROID = "ProcessRankPolicyAndroid"; + // Do not access directly, use SupervisedUserService::IsLocallySupervised() or + // supervised_user::UseLocalSupervision() instead. Exposed only for testing. public static final String PROPAGATE_DEVICE_CONTENT_FILTERS_TO_SUPERVISED_USER = "PropagateDeviceContentFiltersToSupervisedUser"; public static final String PUSH_MESSAGING_DISALLOW_SENDER_IDS = @@ -556,6 +564,7 @@ public abstract class ChromeFeatureList { public static final String REENGAGEMENT_NOTIFICATION = "ReengagementNotification"; public static final String RELATED_SEARCHES_ALL_LANGUAGE = "RelatedSearchesAllLanguage"; public static final String RELATED_SEARCHES_SWITCH = "RelatedSearchesSwitch"; + public static final String RELATED_WEBSITE_SETS_UI = "RelatedWebsiteSetsUi"; public static final String REMOVE_TAB_FOCUS_ON_SHOWING_AND_SELECT = "RemoveTabFocusOnShowingAndSelect"; public static final String RENAME_JOURNEYS = "RenameJourneys"; @@ -564,6 +573,8 @@ public abstract class ChromeFeatureList { public static final String RIGHT_EDGE_GOES_FORWARD_GESTURE_NAV = "RightEdgeGoesForwardGestureNav"; public static final String ROBUST_WINDOW_MANAGEMENT = "RobustWindowManagement"; + public static final String ROBUST_WINDOW_MANAGEMENT_EXPERIMENTAL = + "RobustWindowManagementExperimental"; public static final String SAFETY_HUB = "SafetyHub"; public static final String SAFETY_HUB_ANDROID_ORGANIC_SURVEY = "SafetyHubAndroidOrganicSurvey"; public static final String SAFETY_HUB_ANDROID_SURVEY = "SafetyHubAndroidSurvey"; @@ -583,10 +594,10 @@ public abstract class ChromeFeatureList { public static final String SEARCH_IN_CCT = "SearchInCCT"; public static final String SEARCH_IN_CCT_ALTERNATE_TAP_HANDLING = "SearchInCCTAlternateTapHandling"; - public static final String SEARCH_IN_CCT_IF_ENABLED_BY_EMBEDDER = - "SearchInCCTIfEnabledByEmbedder"; public static final String SEARCH_IN_CCT_ALTERNATE_TAP_HANDLING_IF_ENABLED_BY_EMBEDDER = "SearchInCCTAlternateTapHandlingIfEnabledByEmbedder"; + public static final String SEARCH_IN_CCT_IF_ENABLED_BY_EMBEDDER = + "SearchInCCTIfEnabledByEmbedder"; public static final String SEARCH_RESUMPTION_MODULE_ANDROID = "SearchResumptionModuleAndroid"; public static final String SEED_ACCOUNTS_REVAMP = "SeedAccountsRevamp"; public static final String SEGMENTATION_PLATFORM_ANDROID_HOME_MODULE_RANKER = @@ -599,6 +610,7 @@ public abstract class ChromeFeatureList { public static final String SENSITIVE_CONTENT_WHILE_SWITCHING_TABS = "SensitiveContentWhileSwitchingTabs"; public static final String SETTINGS_SINGLE_ACTIVITY = "SettingsSingleActivity"; + public static final String SHARED_DATA_TYPES_KILL_SWITCH = "SharedDataTypesKillSwitch"; public static final String SHARE_CUSTOM_ACTIONS_IN_CCT = "ShareCustomActionsInCCT"; public static final String SHOW_CLOSE_ALL_INCOGNITO_TABS_BUTTON = "ShowCloseAllIncognitoTabsButton"; @@ -619,8 +631,6 @@ public abstract class ChromeFeatureList { public static final String SUGGESTION_ANSWERS_COLOR_REVERSE = "SuggestionAnswersColorReverse"; public static final String SUPPRESS_TOOLBAR_CAPTURES_AT_GESTURE_END = "SuppressToolbarCapturesAtGestureEnd"; - public static final String SWAP_NEW_TAB_AND_NEW_TAB_IN_GROUP_ANDROID = - "SwapNewTabAndNewTabInGroupAndroid"; public static final String SYNC_ENABLE_PASSWORDS_SYNC_ERROR_MESSAGE_ALTERNATIVE = "SyncEnablePasswordsSyncErrorMessageAlternative"; public static final String TABLET_TAB_STRIP_ANIMATION = "TabletTabStripAnimation"; @@ -629,6 +639,8 @@ public abstract class ChromeFeatureList { public static final String TAB_COLLECTION_ANDROID = "TabCollectionAndroid"; public static final String TAB_FREEZE_ON_UNDOABLE_CLOSURE_KILL_SWITCH = "TabFreezeOnUndoableClosureKillSwitch"; + public static final String TAB_GROUP_ANDROID_VISUAL_DATA_CLEANUP = + "TabGroupAndroidVisualDataCleanup"; public static final String TAB_GROUP_ENTRY_POINTS_ANDROID = "TabGroupEntryPointsAndroid"; public static final String TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID = "TabGroupParityBottomSheetAndroid"; @@ -659,9 +671,9 @@ public abstract class ChromeFeatureList { "ThirdPartyDisableChromeAutofillSettingsScreen"; public static final String TINKER_TANK_BOTTOM_SHEET = "TinkerTankBottomSheet"; public static final String TOOLBAR_PHONE_ANIMATION_REFACTOR = "ToolbarPhoneAnimationRefactor"; - public static final String TOOLBAR_TABLET_RESIZE_REFACTOR = "ToolbarTabletResizeRefactor"; public static final String TOOLBAR_SCROLL_ABLATION = "AndroidToolbarScrollAblation"; public static final String TOOLBAR_SNAPSHOT_REFACTOR = "ToolbarSnapshotRefactor"; + public static final String TOOLBAR_TABLET_RESIZE_REFACTOR = "ToolbarTabletResizeRefactor"; public static final String TOP_CONTROLS_REFACTOR = "TopControlsRefactor"; public static final String TOUCH_TO_SEARCH_CALLOUT = "TouchToSearchCallout"; public static final String TRACE_BINDER_IPC = "TraceBinderIpc"; @@ -672,6 +684,7 @@ public abstract class ChromeFeatureList { "TrackingProtectionUserBypassPwaTrigger"; public static final String TRANSLATE_MESSAGE_UI = "TranslateMessageUI"; public static final String TRANSLATE_TFLITE = "TFLiteLanguageDetectionEnabled"; + public static final String UMA_SESSION_CORRECTNESS_FIXES = "UmaSessionCorrectnessFixes"; public static final String UNO_PHASE_2_FOLLOW_UP = "UnoPhase2FollowUp"; public static final String UPDATE_COMPOSTIROR_FOR_SURFACE_CONTROL = "UpdateCompositorForSurfaceControl"; @@ -694,8 +707,9 @@ public abstract class ChromeFeatureList { public static final String WEB_FEED_SORT = "WebFeedSort"; public static final String WEB_OTP_CROSS_DEVICE_SIMPLE_STRING = "WebOtpCrossDeviceSimpleString"; public static final String XSURFACE_METRICS_REPORTING = "XsurfaceMetricsReporting"; + // keep-sorted end - /* Alphabetical: */ + // keep-sorted start group_prefixes=["public static final CachedFlag"] public static final CachedFlag sAccountForSuppressedKeyboardInsets = newCachedFlag(ACCOUNT_FOR_SUPPRESSED_KEYBOARD_INSETS, /* defaultValue= */ true); public static final CachedFlag sAllowTabClosingUponMinimization = @@ -703,6 +717,10 @@ public abstract class ChromeFeatureList { ALLOW_TAB_CLOSING_UPON_MINIMIZATION, /* defaultValue= */ false, /* defaultValueInTests= */ true); + public static final CachedFlag sAndroidAnimatedProgressBarInBrowser = + newCachedFlag(ANDROID_ANIMATED_PROGRESS_BAR_IN_BROWSER, false); + public static final CachedFlag sAndroidAnimatedProgressBarInViz = + newCachedFlag(ANDROID_ANIMATED_PROGRESS_BAR_IN_VIZ, false); public static final CachedFlag sAndroidAppIntegration = newCachedFlag(ANDROID_APP_INTEGRATION, true); public static final CachedFlag sAndroidAppIntegrationModule = @@ -721,6 +739,8 @@ public abstract class ChromeFeatureList { newCachedFlag(ANDROID_COMPOSEPLATE, false, true); public static final CachedFlag sAndroidDataImporterService = newCachedFlag(ANDROID_DATA_IMPORTER_SERVICE, true); + public static final CachedFlag sAndroidDesktopDensity = + newCachedFlag(ANDROID_DESKTOP_DENSITY, false); public static final CachedFlag sAndroidElegantTextHeight = newCachedFlag(ANDROID_ELEGANT_TEXT_HEIGHT, true); public static final CachedFlag sAndroidMinimalUiLargeScreen = @@ -732,11 +752,13 @@ public abstract class ChromeFeatureList { ANDROID_PROGRESS_BAR_VISUAL_UPDATE, /* defaultValue= */ false, /* defaultValueInTests= */ true); + public static final CachedFlag sAndroidSettingsContainment = + newCachedFlag(ANDROID_SETTINGS_CONTAINMENT, false); public static final CachedFlag sAndroidSurfaceColorUpdate = newCachedFlag( ANDROID_SURFACE_COLOR_UPDATE, /* defaultValue= */ false, - /* defaultValueInTests= */ true); + /* defaultValueInTests= */ false); public static final CachedFlag sAndroidTabDeclutterDedupeTabIdsKillSwitch = newCachedFlag(ANDROID_TAB_DECLUTTER_DEDUPE_TAB_IDS_KILL_SWITCH, true); public static final CachedFlag sAndroidTabGroupsColorUpdateGm3 = @@ -746,6 +768,8 @@ public abstract class ChromeFeatureList { newCachedFlag(ANDROID_TAB_SKIP_SAVE_TABS_TASK_KILLSWITCH, true, true); public static final CachedFlag sAndroidThemeModule = newCachedFlag(ANDROID_THEME_MODULE, false, /* defaultValueInTests= */ true); + public static final CachedFlag sAndroidThemeResourceProvider = + newCachedFlag(ANDROID_THEME_RESOURCE_PROVIDER, false, /* defaultValueInTests= */ false); public static final CachedFlag sAndroidUseAdminsForEnterpriseInfo = newCachedFlag( ANDROID_USE_ADMINS_FOR_ENTERPRISE_INFO, @@ -753,8 +777,12 @@ public abstract class ChromeFeatureList { /* defaultValueInTests= */ true); public static final CachedFlag sAndroidWebAppLaunchHandler = newCachedFlag(ANDROID_WEB_APP_LAUNCH_HANDLER, false, true); + public static final CachedFlag sAndroidWindowControlsOverlay = + newCachedFlag(ANDROID_WINDOW_CONTROLS_OVERLAY, false); public static final CachedFlag sAndroidWindowPopupLargeScreen = newCachedFlag(ANDROID_WINDOW_POPUP_LARGE_SCREEN, false, true); + public static final CachedFlag sAndroidWindowPopupPredictFinalBounds = + newCachedFlag(ANDROID_WINDOW_POPUP_PREDICT_FINAL_BOUNDS, false); public static final CachedFlag sAndroidWindowPopupResizeAfterSpawn = newCachedFlag(ANDROID_WINDOW_POPUP_RESIZE_AFTER_SPAWN, false); public static final CachedFlag sAppSpecificHistory = newCachedFlag(APP_SPECIFIC_HISTORY, true); @@ -765,9 +793,15 @@ public abstract class ChromeFeatureList { public static final CachedFlag sAsyncNotificationManagerForDownload = newCachedFlag(ASYNC_NOTIFICATION_MANAGER_FOR_DOWNLOAD, true); public static final CachedFlag sAutomotiveBackButtonBarStreamline = - newCachedFlag(AUTOMOTIVE_BACK_BUTTON_BAR_STREAMLINE, false); + newCachedFlag( + AUTOMOTIVE_BACK_BUTTON_BAR_STREAMLINE, + /* defaultValue= */ false, + /* defaultValueInTests= */ true); public static final CachedFlag sBackgroundThreadPoolFieldTrial = - newCachedFlag(BACKGROUND_THREAD_POOL_FIELD_TRIAL, false); + newCachedFlag( + BACKGROUND_THREAD_POOL_FIELD_TRIAL, + /* defaultValue= */ false, + /* defaultValueInTests= */ true); public static final CachedFlag sBatchTabRestore = newCachedFlag(BATCH_TAB_RESTORE, true); public static final CachedFlag sBlockIntentsWhileLocked = newCachedFlag(BLOCK_INTENTS_WHILE_LOCKED, false); @@ -792,9 +826,10 @@ public abstract class ChromeFeatureList { newCachedFlag(CCT_BLOCK_TOUCHES_DURING_ENTER_ANIMATION, true); public static final CachedFlag sCctContextualMenuItems = newCachedFlag(CCT_CONTEXTUAL_MENU_ITEMS, false); + public static final CachedFlag sCctDestroyTabWhenModelIsEmpty = + newCachedFlag(CCT_DESTROY_TAB_WHEN_MODEL_IS_EMPTY, true); public static final CachedFlag sCctFixWarmup = - newCachedFlag( - CCT_FIX_WARMUP, /* defaultValue= */ false, /* defaultValueInTests= */ true); + newCachedFlag(CCT_FIX_WARMUP, /* defaultValue= */ true); public static final CachedFlag sCctFreInSameTask = newCachedFlag(CCT_FRE_IN_SAME_TASK, true); public static final CachedFlag sCctGoogleBottomBar = newCachedFlag( @@ -822,22 +857,25 @@ public abstract class ChromeFeatureList { /* defaultValue= */ false, /* defaultValueInTests= */ true); public static final CachedFlag sCctRealtimeEngagementEventsInBackground = - newCachedFlag( - CCT_REALTIME_ENGAGEMENT_EVENTS_IN_BACKGROUND, - /* defaultValue= */ false, - /* defaultValueInTests= */ true); + newCachedFlag(CCT_REALTIME_ENGAGEMENT_EVENTS_IN_BACKGROUND, true); + public static final CachedFlag sCctResetTimeoutEnabled = + newCachedFlag(CCT_RESET_TIMEOUT_ENABLED, false); public static final CachedFlag sCctResizableForThirdParties = newCachedFlag(CCT_RESIZABLE_FOR_THIRD_PARTIES, true); public static final CachedFlag sCctRevampedBranding = newCachedFlag(CCT_REVAMPED_BRANDING, true); public static final CachedFlag sCctTabModalDialog = newCachedFlag(CCT_TAB_MODAL_DIALOG, true); - public static final CachedFlag sCctToolbarRefactor = newCachedFlag(CCT_TOOLBAR_REFACTOR, false); - public static final CachedFlag sCctResetTimeoutEnabled = - newCachedFlag(CCT_RESET_TIMEOUT_ENABLED, false); + public static final CachedFlag sCctToolbarRefactor = + newCachedFlag(CCT_TOOLBAR_REFACTOR, false, true); public static final CachedFlag sClampAutomotiveScaling = newCachedFlag(CLAMP_AUTOMOTIVE_SCALING, true); public static final CachedFlag sClankStartupLatencyInjection = newCachedFlag(CLANK_STARTUP_LATENCY_INJECTION, false); + public static final CachedFlag sCleanupLegacyTabState = + newCachedFlag( + CLEANUP_LEGACY_TABSTATE, + /* defaultValue= */ false, + /* defaultValueInTests= */ true); public static final CachedFlag sCollectAndroidFrameTimelineMetrics = newCachedFlag( COLLECT_ANDROID_FRAME_TIMELINE_METRICS, @@ -845,6 +883,8 @@ public abstract class ChromeFeatureList { /* defaultValueInTests= */ true); public static final CachedFlag sCommandLineOnNonRooted = newCachedFlag(COMMAND_LINE_ON_NON_ROOTED, false); + public static final CachedFlag sContextMenuPictureInPictureAndroid = + newCachedFlag(CONTEXT_MENU_PICTURE_IN_PICTURE_ANDROID, false); public static final CachedFlag sCpaSpecUpdate = newCachedFlag( CPA_SPEC_UPDATE, /* defaultValue= */ false, /* defaultValueInTests= */ true); @@ -855,6 +895,11 @@ public abstract class ChromeFeatureList { /* defaultValueInTests= */ true); public static final CachedFlag sCrossDeviceTabPaneAndroid = newCachedFlag(CROSS_DEVICE_TAB_PANE_ANDROID, false); + public static final CachedFlag sDesktopUAOnConnectedDisplay = + newCachedFlag( + DESKTOP_UA_ON_CONNECTED_DISPLAY, + /* defaultValue= */ false, + /* defaultValueInTests= */ false); public static final CachedFlag sDisableInstanceLimit = newCachedFlag( DISABLE_INSTANCE_LIMIT, @@ -866,8 +911,6 @@ public abstract class ChromeFeatureList { newCachedFlag(DRAW_CHROME_PAGES_EDGE_TO_EDGE, /* defaultValue= */ true); public static final CachedFlag sEdgeToEdgeBottomChin = newCachedFlag(EDGE_TO_EDGE_BOTTOM_CHIN, /* defaultValue= */ true); - public static final CachedFlag sEdgeToEdgeDebugging = - newCachedFlag(EDGE_TO_EDGE_DEBUGGING, /* defaultValue= */ false); public static final CachedFlag sEdgeToEdgeEverywhere = newCachedFlag( EDGE_TO_EDGE_EVERYWHERE, @@ -886,8 +929,6 @@ public abstract class ChromeFeatureList { newCachedFlag(EDUCATIONAL_TIP_DEFAULT_BROWSER_PROMO_CARD, false); public static final CachedFlag sEducationalTipModule = newCachedFlag(EDUCATIONAL_TIP_MODULE, false, true); - public static final CachedFlag sEnableDiscountInfoApi = - newCachedFlag(ENABLE_DISCOUNT_INFO_API, false, true); public static final CachedFlag sEnableExclusiveAccessManager = newCachedFlag(ENABLE_EXCLUSIVE_ACCESS_MANAGER, false); public static final CachedFlag sEnableFullscreenToAnyScreenAndroid = @@ -905,7 +946,7 @@ public abstract class ChromeFeatureList { newCachedFlag( GRID_TAB_SWITCHER_SURFACE_COLOR_UPDATE, /* defaultValue= */ false, - /* defaultValueInTests= */ true); + /* defaultValueInTests= */ false); public static final CachedFlag sGridTabSwitcherUpdate = newCachedFlag(GRID_TAB_SWITCHER_UPDATE, false, /* defaultValueInTests= */ true); public static final CachedFlag sHistoryPaneAndroid = @@ -914,16 +955,23 @@ public abstract class ChromeFeatureList { /* defaultValue= */ false, /* defaultValueInTests= */ true); public static final CachedFlag sHomepageIsNewTabPagePolicyAndroid = - newCachedFlag(HOMEPAGE_IS_NEW_TAB_PAGE_POLICY_ANDROID, false); + newCachedFlag(HOMEPAGE_IS_NEW_TAB_PAGE_POLICY_ANDROID, true); + public static final CachedFlag sIncognitoThemeOverlayTesting = + newCachedFlag(INCOGNITO_THEME_OVERLAY_TESTING, false); public static final CachedFlag sKeyboardEscBackNavigation = newCachedFlag(KEYBOARD_ESC_BACK_NAVIGATION, true); public static final CachedFlag sLegacyTabStateDeprecation = newCachedFlag( LEGACY_TAB_STATE_DEPRECATION, - /* defaultValue= */ false, + /* defaultValue= */ true, /* defaultValueInTests= */ true); + public static final CachedFlag sLoadNativeEarly = + newCachedFlag( + LOAD_NATIVE_EARLY, /* defaultValue= */ false, /* defaultValueInTests= */ true); public static final CachedFlag sLockBackPressHandlerAtStart = newCachedFlag(LOCK_BACK_PRESS_HANDLER_AT_START, true); + public static final CachedFlag sLockTopControlsOnLargeTablets = + newCachedFlag(LOCK_TOP_CONTROLS_ON_LARGE_TABLETS, false); public static final CachedFlag sMagicStackAndroid = newCachedFlag(MAGIC_STACK_ANDROID, true); public static final CachedFlag sMaliciousApkDownloadCheck = newCachedFlag( @@ -949,10 +997,8 @@ public abstract class ChromeFeatureList { /* defaultValueInTests= */ true); public static final CachedFlag sNavBarColorAnimation = newCachedFlag(NAV_BAR_COLOR_ANIMATION, /* defaultValue= */ true); - public static final CachedFlag sNewTabPageAndroidTriggerForPrerender2 = - newCachedFlag(NEW_TAB_PAGE_ANDROID_TRIGGER_FOR_PRERENDER2, true); public static final CachedFlag sNewTabPageCustomization = - newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION, false, true); + newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION, true); public static final CachedFlag sNewTabPageCustomizationForMvt = newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION_FOR_MVT, false, true); public static final CachedFlag sNewTabPageCustomizationToolbarButton = @@ -963,13 +1009,12 @@ public abstract class ChromeFeatureList { newCachedFlag(NOTIFICATION_TRAMPOLINE, false); public static final CachedFlag sOptimizationGuidePushNotifications = newCachedFlag(OPTIMIZATION_GUIDE_PUSH_NOTIFICATIONS, true); + public static final CachedFlag sPCctMinimumHeight = newCachedFlag(PCCT_MINIMUM_HEIGHT, true); public static final CachedFlag sPaintPreviewDemo = newCachedFlag(PAINT_PREVIEW_DEMO, false); public static final CachedFlag sPostGetMyMemoryStateToBackground = newCachedFlag(POST_GET_MEMORY_PRESSURE_TO_BACKGROUND, true); public static final CachedFlag sPowerSavingModeBroadcastReceiverInBackground = newCachedFlag(POWER_SAVING_MODE_BROADCAST_RECEIVER_IN_BACKGROUND, true); - public static final CachedFlag sPrefetchBrowserInitiatedTriggers = - newCachedFlag(PREFETCH_BROWSER_INITIATED_TRIGGERS, true); public static final CachedFlag sPriceChangeModule = newCachedFlag(PRICE_CHANGE_MODULE, true); public static final CachedFlag sReportNotificationContentDetectionData = newCachedFlag( @@ -987,10 +1032,10 @@ public abstract class ChromeFeatureList { SEARCH_IN_CCT, /* defaultValue= */ false, /* defaultValueInTests= */ true); public static final CachedFlag sSearchInCCTAlternateTapHandling = newCachedFlag(SEARCH_IN_CCT_ALTERNATE_TAP_HANDLING, false); - public static final CachedFlag sSearchInCCTIfEnabledByEmbedder = - newCachedFlag(SEARCH_IN_CCT_IF_ENABLED_BY_EMBEDDER, true); public static final CachedFlag sSearchInCCTAlternateTapHandlingIfEnabledByEmbedder = newCachedFlag(SEARCH_IN_CCT_ALTERNATE_TAP_HANDLING_IF_ENABLED_BY_EMBEDDER, true); + public static final CachedFlag sSearchInCCTIfEnabledByEmbedder = + newCachedFlag(SEARCH_IN_CCT_IF_ENABLED_BY_EMBEDDER, true); public static final CachedFlag sSettingsSingleActivity = newCachedFlag( SETTINGS_SINGLE_ACTIVITY, @@ -1031,6 +1076,11 @@ public abstract class ChromeFeatureList { public static final CachedFlag sTestDefaultDisabled = newCachedFlag(TEST_DEFAULT_DISABLED, false); public static final CachedFlag sTestDefaultEnabled = newCachedFlag(TEST_DEFAULT_ENABLED, true); + public static final CachedFlag sToolbarPhoneAnimationRefactor = + newCachedFlag( + TOOLBAR_PHONE_ANIMATION_REFACTOR, + /* defaultValue= */ false, + /* defaultValueInTests= */ false); public static final CachedFlag sToolbarSnapshotRefactor = newCachedFlag( TOOLBAR_SNAPSHOT_REFACTOR, @@ -1054,19 +1104,20 @@ public abstract class ChromeFeatureList { public static final CachedFlag sUseChimeAndroidSdk = newCachedFlag(USE_CHIME_ANDROID_SDK, false); public static final CachedFlag sUseInitialNetworkStateAtStartup = - newCachedFlag( - USE_INITIAL_NETWORK_STATE_AT_STARTUP, - /* defaultValue= */ false, - /* defaultValueInTests= */ true); + newCachedFlag(USE_INITIAL_NETWORK_STATE_AT_STARTUP, true); public static final CachedFlag sUseLibunwindstackNativeUnwinderAndroid = newCachedFlag(USE_LIBUNWINDSTACK_NATIVE_UNWINDER_ANDROID, true); public static final CachedFlag sWebApkMinShellApkVersion = newCachedFlag(WEB_APK_MIN_SHELL_APK_VERSION, true); + // keep-sorted end public static final List sFlagsCachedFullBrowser = List.of( + // keep-sorted start sAccountForSuppressedKeyboardInsets, sAllowTabClosingUponMinimization, + sAndroidAnimatedProgressBarInBrowser, + sAndroidAnimatedProgressBarInViz, sAndroidAppIntegration, sAndroidAppIntegrationModule, sAndroidAppIntegrationMultiDataSource, @@ -1076,18 +1127,23 @@ public abstract class ChromeFeatureList { sAndroidBottomToolbarV2, sAndroidComposeplate, sAndroidDataImporterService, + sAndroidDesktopDensity, sAndroidElegantTextHeight, sAndroidMinimalUiLargeScreen, sAndroidOpenIncognitoAsWindow, sAndroidProgressBarVisualUpdate, + sAndroidSettingsContainment, sAndroidSurfaceColorUpdate, sAndroidTabDeclutterDedupeTabIdsKillSwitch, sAndroidTabGroupsColorUpdateGm3, sAndroidTabSkipSaveTabsKillswitch, sAndroidThemeModule, + sAndroidThemeResourceProvider, sAndroidUseAdminsForEnterpriseInfo, sAndroidWebAppLaunchHandler, + sAndroidWindowControlsOverlay, sAndroidWindowPopupLargeScreen, + sAndroidWindowPopupPredictFinalBounds, sAndroidWindowPopupResizeAfterSpawn, sAppSpecificHistory, sAppSpecificHistoryViewIntent, @@ -1106,6 +1162,7 @@ public abstract class ChromeFeatureList { sCctAutoTranslate, sCctBlockTouchesDuringEnterAnimation, sCctContextualMenuItems, + sCctDestroyTabWhenModelIsEmpty, sCctFixWarmup, sCctFreInSameTask, sCctGoogleBottomBar, @@ -1117,30 +1174,31 @@ public abstract class ChromeFeatureList { sCctOpenInBrowserButtonIfEnabledByEmbedder, sCctPredictiveBackGesture, sCctRealtimeEngagementEventsInBackground, + sCctResetTimeoutEnabled, sCctResizableForThirdParties, sCctRevampedBranding, sCctTabModalDialog, sCctToolbarRefactor, - sCctResetTimeoutEnabled, sClampAutomotiveScaling, sClankStartupLatencyInjection, + sCleanupLegacyTabState, sCollectAndroidFrameTimelineMetrics, sCommandLineOnNonRooted, + sContextMenuPictureInPictureAndroid, sCpaSpecUpdate, sCpaTabGroupingButton, sCrossDeviceTabPaneAndroid, + sDesktopUAOnConnectedDisplay, sDisableInstanceLimit, sDisplayEdgeToEdgeFullscreen, sDrawChromePagesEdgeToEdge, sEdgeToEdgeBottomChin, - sEdgeToEdgeDebugging, sEdgeToEdgeEverywhere, sEdgeToEdgeMonitorConfigurations, sEdgeToEdgeTablet, sEdgeToEdgeUseBackupNavbarInsets, sEducationalTipDefaultBrowserPromoCard, sEducationalTipModule, - sEnableDiscountInfoApi, sEnableExclusiveAccessManager, sEnableFullscreenToAnyScreenAndroid, sEnableXAxisActivityTransition, @@ -1152,9 +1210,12 @@ public abstract class ChromeFeatureList { sGridTabSwitcherUpdate, sHistoryPaneAndroid, sHomepageIsNewTabPagePolicyAndroid, + sIncognitoThemeOverlayTesting, sKeyboardEscBackNavigation, sLegacyTabStateDeprecation, + sLoadNativeEarly, sLockBackPressHandlerAtStart, + sLockTopControlsOnLargeTablets, sMagicStackAndroid, sMaliciousApkDownloadCheck, sMiniOriginBar, @@ -1164,17 +1225,16 @@ public abstract class ChromeFeatureList { sMultiInstanceApplicationStatusCleanup, sMvcUpdateViewWhenModelChanged, sNavBarColorAnimation, - sNewTabPageAndroidTriggerForPrerender2, sNewTabPageCustomization, sNewTabPageCustomizationForMvt, sNewTabPageCustomizationToolbarButton, sNewTabPageCustomizationV2, sNotificationTrampoline, sOptimizationGuidePushNotifications, + sPCctMinimumHeight, sPaintPreviewDemo, sPostGetMyMemoryStateToBackground, sPowerSavingModeBroadcastReceiverInBackground, - sPrefetchBrowserInitiatedTriggers, sPriceChangeModule, sReportNotificationContentDetectionData, sRightEdgeGoesForwardGestureNav, @@ -1182,8 +1242,8 @@ public abstract class ChromeFeatureList { sSafetyHubWeakAndReusedPasswords, sSearchInCCT, sSearchInCCTAlternateTapHandling, - sSearchInCCTIfEnabledByEmbedder, sSearchInCCTAlternateTapHandlingIfEnabledByEmbedder, + sSearchInCCTIfEnabledByEmbedder, sSettingsSingleActivity, sShowHomeButtonPolicyAndroid, sSmallerTabStripTitleLimit, @@ -1195,6 +1255,7 @@ public abstract class ChromeFeatureList { sTabStripLayoutOptimization, sTabWindowManagerReportIndicesMismatch, sTabletTabStripAnimation, + sToolbarPhoneAnimationRefactor, sToolbarSnapshotRefactor, sTopControlsRefactor, sTouchToSearchCallout, @@ -1203,7 +1264,9 @@ public abstract class ChromeFeatureList { sUseChimeAndroidSdk, sUseInitialNetworkStateAtStartup, sUseLibunwindstackNativeUnwinderAndroid, - sWebApkMinShellApkVersion); + sWebApkMinShellApkVersion + // keep-sorted end + ); public static final List sFlagsCachedInMinimalBrowser = List.of(sAsyncNotificationManagerForDownload); @@ -1219,7 +1282,7 @@ public abstract class ChromeFeatureList { sTestCachedFlags)); // MutableFlagWithSafeDefault instances. - /* Alphabetical: */ + // keep-sorted start group_prefixes=["public static final MutableFlagWithSafeDefault"] public static final MutableFlagWithSafeDefault sAdaptiveButtonInTopToolbarCustomizationV2 = newMutableFlagWithSafeDefault(ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_V2, false); public static final MutableFlagWithSafeDefault sAndroidAppearanceSettings = @@ -1248,6 +1311,8 @@ public abstract class ChromeFeatureList { newMutableFlagWithSafeDefault(ANDROID_TAB_DECLUTTER_RESCUE_KILLSWITCH, true); public static final MutableFlagWithSafeDefault sAndroidTabHighlighting = newMutableFlagWithSafeDefault(ANDROID_TAB_HIGHLIGHTING, false); + public static final MutableFlagWithSafeDefault sAndroidTipsNotifications = + newMutableFlagWithSafeDefault(ANDROID_TIPS_NOTIFICATIONS, false); public static final MutableFlagWithSafeDefault sBcivBottomControls = newMutableFlagWithSafeDefault(BCIV_BOTTOM_CONTROLS, true); public static final MutableFlagWithSafeDefault sBrowserControlsEarlyResize = @@ -1282,8 +1347,6 @@ public abstract class ChromeFeatureList { newMutableFlagWithSafeDefault(READALOUD_TAP_TO_SEEK, false); public static final MutableFlagWithSafeDefault sRecordSuppressionMetrics = newMutableFlagWithSafeDefault(RECORD_SUPPRESSION_METRICS, true); - public static final MutableFlagWithSafeDefault sSafetyHub = - newMutableFlagWithSafeDefault(SAFETY_HUB, true); public static final MutableFlagWithSafeDefault sSafetyHubAndroidOrganicSurvey = newMutableFlagWithSafeDefault(SAFETY_HUB_ANDROID_ORGANIC_SURVEY, false); public static final MutableFlagWithSafeDefault sSafetyHubAndroidSurvey = @@ -1298,8 +1361,6 @@ public abstract class ChromeFeatureList { newMutableFlagWithSafeDefault(SHOW_TAB_LIST_ANIMATIONS, false); public static final MutableFlagWithSafeDefault sSuppressToolbarCapturesAtGestureEnd = newMutableFlagWithSafeDefault(SUPPRESS_TOOLBAR_CAPTURES_AT_GESTURE_END, false); - public static final MutableFlagWithSafeDefault sSwapNewTabAndNewTabInGroupAndroid = - newMutableFlagWithSafeDefault(SWAP_NEW_TAB_AND_NEW_TAB_IN_GROUP_ANDROID, false); public static final MutableFlagWithSafeDefault sTabArchivalDragDropAndroid = newMutableFlagWithSafeDefault(TAB_ARCHIVAL_DRAG_DROP_ANDROID, true); public static final MutableFlagWithSafeDefault sTabCollectionAndroid = @@ -1307,30 +1368,34 @@ public abstract class ChromeFeatureList { // Default value will only ever be reached in tests. public static final MutableFlagWithSafeDefault sTabFreezeOnUndoableClosureKillSwitch = newMutableFlagWithSafeDefault(TAB_FREEZE_ON_UNDOABLE_CLOSURE_KILL_SWITCH, true); + public static final MutableFlagWithSafeDefault sTabGroupAndroidVisualDataCleanup = + newMutableFlagWithSafeDefault(TAB_GROUP_ANDROID_VISUAL_DATA_CLEANUP, false); public static final MutableFlagWithSafeDefault sTabGroupEntryPointsAndroid = - newMutableFlagWithSafeDefault(TAB_GROUP_ENTRY_POINTS_ANDROID, false); + newMutableFlagWithSafeDefault(TAB_GROUP_ENTRY_POINTS_ANDROID, true); public static final MutableFlagWithSafeDefault sTabGroupParityBottomSheetAndroid = - newMutableFlagWithSafeDefault(TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID, false); + newMutableFlagWithSafeDefault(TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID, true); public static final MutableFlagWithSafeDefault sTabStorageSqlitePrototype = newMutableFlagWithSafeDefault(TAB_STORAGE_SQLITE_PROTOTYPE, false); + public static final MutableFlagWithSafeDefault sTabSwitcherForeignFaviconSupport = + newMutableFlagWithSafeDefault(TAB_SWITCHER_FOREIGN_FAVICON_SUPPORT, true); public static final MutableFlagWithSafeDefault sTabSwitcherGroupSuggestionsAndroid = newMutableFlagWithSafeDefault(TAB_SWITCHER_GROUP_SUGGESTIONS_ANDROID, false); public static final MutableFlagWithSafeDefault sTabSwitcherGroupSuggestionsTestModeAndroid = newMutableFlagWithSafeDefault(TAB_SWITCHER_GROUP_SUGGESTIONS_TEST_MODE_ANDROID, false); - public static final MutableFlagWithSafeDefault sTabSwitcherForeignFaviconSupport = - newMutableFlagWithSafeDefault(TAB_SWITCHER_FOREIGN_FAVICON_SUPPORT, true); - public static final MutableFlagWithSafeDefault sToolbarPhoneAnimationRefactor = - newMutableFlagWithSafeDefault(TOOLBAR_PHONE_ANIMATION_REFACTOR, false); - public static final MutableFlagWithSafeDefault sToolbarTabletResizeRefactor = - newMutableFlagWithSafeDefault(TOOLBAR_TABLET_RESIZE_REFACTOR, false); public static final MutableFlagWithSafeDefault sToolbarScrollAblation = newMutableFlagWithSafeDefault(TOOLBAR_SCROLL_ABLATION, false); + public static final MutableFlagWithSafeDefault sToolbarTabletResizeRefactor = + newMutableFlagWithSafeDefault(TOOLBAR_TABLET_RESIZE_REFACTOR, false); + // keep-sorted end // CachedFeatureParam instances. /* Alphabetical order by feature name, arbitrary order by param name: */ public static final BooleanCachedFeatureParam sAndroidThemeModuleForceDependencies = newBooleanCachedFeatureParam( ANDROID_THEME_MODULE, "force_theme_module_dependencies", false); + public static final BooleanCachedFeatureParam sAndroidThemeResourceProviderForceLight = + newBooleanCachedFeatureParam( + ANDROID_THEME_RESOURCE_PROVIDER, "force_light_theme", false); public static final BooleanCachedFeatureParam sCctAdaptiveButtonEnableOpenInBrowser = newBooleanCachedFeatureParam(CCT_ADAPTIVE_BUTTON, "open_in_browser", false); public static final BooleanCachedFeatureParam sCctAdaptiveButtonEnableVoice = @@ -1393,11 +1458,13 @@ public abstract class ChromeFeatureList { public static final BooleanCachedFeatureParam sAndroidComposeplateHideIncognitoButton = newBooleanCachedFeatureParam(ANDROID_COMPOSEPLATE, "hide_incognito_button", false); + public static final BooleanCachedFeatureParam sAndroidComposeplateV2Enabled = + newBooleanCachedFeatureParam(ANDROID_COMPOSEPLATE, "v2_enabled", false); public static final BooleanCachedFeatureParam sAndroidBottomToolbarDefaultToTop = newBooleanCachedFeatureParam(ANDROID_BOTTOM_TOOLBAR, "default_to_top", true); public static final IntCachedFeatureParam sBackgroundThreadPoolFieldTrialConfig = - newIntCachedFeatureParam(BACKGROUND_THREAD_POOL_FIELD_TRIAL, "config", 0); + newIntCachedFeatureParam(BACKGROUND_THREAD_POOL_FIELD_TRIAL, "config", 4); public static final IntCachedFeatureParam sBatchTabRestoreBatchSize = newIntCachedFeatureParam(BATCH_TAB_RESTORE, "batch_tab_restore_batch_size", 5); @@ -1516,24 +1583,16 @@ public abstract class ChromeFeatureList { newIntCachedFeatureParam( COLLECT_ANDROID_FRAME_TIMELINE_METRICS, "delayed_start_ms", 3000); - /*** - * Feature parameter for TabState deprecation which indicates that legacy TabState - * files should be deleted after restore if they have been migrated to FlatBuffer. - */ - public static final BooleanCachedFeatureParam sDeleteMigratedLegacyTabStateFilesAfterRestore = - newBooleanCachedFeatureParam( - LEGACY_TAB_STATE_DEPRECATION, "delete_migrated_files_after_restore", false); - /** Batch size for number of legacy TabState files that should be deleted in a batch. */ - public static final IntCachedFeatureParam sDeleteLegacyTabStateFilesBatchSize = + public static final IntCachedFeatureParam sCleanupLegacyTabStateBatchSize = newIntCachedFeatureParam( - LEGACY_TAB_STATE_DEPRECATION, "delete_legacy_tabstate_files_batch_size", 5); + CLEANUP_LEGACY_TABSTATE, "cleanup_legacy_tab_state_batch_size", 5); /** Maximum number of legacy TabState files that can be deleted per session. */ - public static final IntCachedFeatureParam sMaxLegacyTabStateFilesDeletedPerSession = + public static final IntCachedFeatureParam sMaxLegacyTabStateFilesCleanedUpPerSession = newIntCachedFeatureParam( - LEGACY_TAB_STATE_DEPRECATION, - "max_legacy_tab_state_files_deleted_per_session", + CLEANUP_LEGACY_TABSTATE, + "max_legacy_tab_state_files_cleaned_up_per_session", 100); public static final IntCachedFeatureParam sDisableInstanceLimitMemoryThresholdMb = @@ -1603,9 +1662,6 @@ public abstract class ChromeFeatureList { newBooleanCachedFeatureParam( EDGE_TO_EDGE_USE_BACKUP_NAVBAR_INSETS, "use_gesture_insets", true); - public static final BooleanCachedFeatureParam sEdgeToEdgeEverywhereIsDebugging = - newBooleanCachedFeatureParam(EDGE_TO_EDGE_EVERYWHERE, "e2e_everywhere_debug", false); - public static final IntCachedFeatureParam sEdgeToEdgeTabletInvisibleBottomChinMinWidth = newIntCachedFeatureParam( EDGE_TO_EDGE_TABLET, "e2e_tablet_invisible_bottom_chin_min_width", -1); @@ -1613,6 +1669,9 @@ public abstract class ChromeFeatureList { public static final IntCachedFeatureParam sEdgeToEdgeTabletMinWidthThreshold = newIntCachedFeatureParam(EDGE_TO_EDGE_TABLET, "e2e_tablet_width_threshold", -1); + public static final BooleanCachedFeatureParam sLoadNativeEarlyConcurrentLoad = + newBooleanCachedFeatureParam(LOAD_NATIVE_EARLY, "concurrent_load", true); + public static final BooleanCachedFeatureParam sTabGroupListContainment = newBooleanCachedFeatureParam( GRID_TAB_SWITCHER_SURFACE_COLOR_UPDATE, "tab_group_list_containment", true); @@ -1646,6 +1705,9 @@ public abstract class ChromeFeatureList { public static final IntCachedFeatureParam sOptimizationGuidePushNotificationsMaxCacheSize = newIntCachedFeatureParam(OPTIMIZATION_GUIDE_PUSH_NOTIFICATIONS, "max_cache_size", 100); + public static final DoubleCachedFeatureParam sPCctMinimumHeightRatio = + newDoubleCachedFeatureParam(PCCT_MINIMUM_HEIGHT, "pcct_minimum_height_ratio", 0.3); + public static final BooleanCachedFeatureParam sPriceChangeModuleSkipShoppingPersistedTabDataDelayedInit = newBooleanCachedFeatureParam( @@ -1726,6 +1788,7 @@ public abstract class ChromeFeatureList { /** All {@link CachedFeatureParam}s of features in this FeatureList */ public static final List> sParamsCached = List.of( + // keep-sorted start sAndroidAppIntegrationModuleForceCardShow, sAndroidAppIntegrationModuleShowThirdPartyCard, sAndroidAppIntegrationMultiDataSourceHistoryContentTtlHours, @@ -1738,9 +1801,11 @@ public abstract class ChromeFeatureList { sAndroidAppIntegrationWithFaviconUseLargeFavicon, sAndroidAppIntegrationWithFaviconZeroStateFaviconNumber, sAndroidBottomToolbarDefaultToTop, - sAndroidComposeplateSkipLocaleCheck, sAndroidComposeplateHideIncognitoButton, + sAndroidComposeplateSkipLocaleCheck, + sAndroidComposeplateV2Enabled, sAndroidThemeModuleForceDependencies, + sAndroidThemeResourceProviderForceLight, sBackgroundThreadPoolFieldTrialConfig, sBatchTabRestoreBatchSize, sCctAdaptiveButtonContextualOnly, @@ -1762,25 +1827,24 @@ public abstract class ChromeFeatureList { sCctResizableForThirdPartiesDenylistEntries, sClampAutomotiveScalingMaxScalingPercentage, sClankStartupLatencyInjectionAmountMs, + sCleanupLegacyTabStateBatchSize, sCollectAndroidFrameTimelineMetricsJankTrackerDelayedStartMs, - sDeleteLegacyTabStateFilesBatchSize, - sDeleteMigratedLegacyTabStateFilesAfterRestore, sDisableInstanceLimitMaxCount, sDisableInstanceLimitMemoryThresholdMb, sEdgeToEdgeBottomChinOemList, sEdgeToEdgeBottomChinOemMinVersions, - sEdgeToEdgeUseBackupNavbarInsetsOemMinVersions, - sEdgeToEdgeEverywhereIsDebugging, sEdgeToEdgeEverywhereOemList, - sEdgeToEdgeUseBackupNavbarInsetsOemList, - sEdgeToEdgeUseBackupNavbarInsetsUseTappable, - sEdgeToEdgeUseBackupNavbarInsetsUseGestures, sEdgeToEdgeEverywhereOemMinVersions, sEdgeToEdgeTabletInvisibleBottomChinMinWidth, sEdgeToEdgeTabletMinWidthThreshold, + sEdgeToEdgeUseBackupNavbarInsetsOemList, + sEdgeToEdgeUseBackupNavbarInsetsOemMinVersions, + sEdgeToEdgeUseBackupNavbarInsetsUseGestures, + sEdgeToEdgeUseBackupNavbarInsetsUseTappable, + sLoadNativeEarlyConcurrentLoad, sMagicStackAndroidShowAllModules, sMaliciousApkDownloadCheckTelemetryOnly, - sMaxLegacyTabStateFilesDeletedPerSession, + sMaxLegacyTabStateFilesCleanedUpPerSession, sMostVisitedTilesReselectLaxPath, sMostVisitedTilesReselectLaxQuery, sMostVisitedTilesReselectLaxRef, @@ -1793,6 +1857,7 @@ public abstract class ChromeFeatureList { sNotificationTrampolineTimeoutPriorNativeInitMs, sOmahaMinSdkVersionMinSdkVersion, sOptimizationGuidePushNotificationsMaxCacheSize, + sPCctMinimumHeightRatio, sPriceChangeModuleSkipShoppingPersistedTabDataDelayedInit, sReadAloudAudioOverviewsSpeedAdditionPercentage, sSearchinCctApplyReferrerId, @@ -1808,7 +1873,9 @@ public abstract class ChromeFeatureList { sTouchToSearchCalloutIph, sTouchToSearchCalloutSnippetAsSubtitle, sUseChimeAndroidSdkAlwaysRegister, - sWebApkMinShellApkVersionValue); + sWebApkMinShellApkVersionValue + // keep-sorted end + ); // Mutable*ParamWithSafeDefault instances. /* Alphabetical: */ @@ -1841,4 +1908,9 @@ public abstract class ChromeFeatureList { sShowNewTabAnimations.newBooleanParam("logs", false); public static final MutableBooleanParamWithSafeDefault sShowNewTabAnimationsListeners = sShowNewTabAnimations.newBooleanParam("listeners", false); + + public static final MutableBooleanParamWithSafeDefault sAndroidTabHighlightingForceCtrlClick = + sAndroidTabHighlighting.newBooleanParam("force_ctrl_click", false); + public static final MutableBooleanParamWithSafeDefault sAndroidTabHighlightingForceShiftClick = + sAndroidTabHighlighting.newBooleanParam("force_shift_click", false); } diff --git a/tools/under-control/src/chrome/browser/prefs/browser_prefs.cc b/tools/under-control/src/chrome/browser/prefs/browser_prefs.cc index d016286d..581384fc 100755 --- a/tools/under-control/src/chrome/browser/prefs/browser_prefs.cc +++ b/tools/under-control/src/chrome/browser/prefs/browser_prefs.cc @@ -18,7 +18,7 @@ #include "chrome/browser/about_flags.h" #include "chrome/browser/accessibility/accessibility_labels_service.h" #include "chrome/browser/accessibility/invert_bubble_prefs.h" -#include "chrome/browser/accessibility/page_colors.h" +#include "chrome/browser/accessibility/page_colors_controller.h" #include "chrome/browser/accessibility/prefers_default_scrollbar_styles_prefs.h" #include "chrome/browser/actor/ui/actor_ui_state_manager_prefs.h" #include "chrome/browser/browser_process_impl.h" @@ -95,7 +95,6 @@ #include "chrome/browser/ui/webui/policy/policy_ui.h" #include "chrome/browser/ui/webui/print_preview/policy_settings.h" #include "chrome/browser/updates/announcement_notification/announcement_notification_service.h" -#include "chrome/browser/webauthn/chrome_authenticator_request_delegate.h" #include "chrome/browser/webauthn/webauthn_pref_names.h" #include "chrome/common/buildflags.h" #include "chrome/common/pref_names.h" @@ -132,6 +131,7 @@ #include "components/metrics/metrics_pref_names.h" #include "components/network_time/network_time_tracker.h" #include "components/ntp_tiles/custom_links_manager_impl.h" +#include "components/ntp_tiles/enterprise/enterprise_shortcuts_manager_impl.h" #include "components/ntp_tiles/most_visited_sites.h" #include "components/offline_pages/buildflags/buildflags.h" #include "components/omnibox/browser/aim_eligibility_service.h" @@ -146,7 +146,7 @@ #include "components/performance_manager/public/user_tuning/prefs.h" #include "components/permissions/permission_hats_trigger_helper.h" #include "components/permissions/pref_names.h" -#include "components/plus_addresses/plus_address_prefs.h" +#include "components/plus_addresses/core/common/plus_address_prefs.h" #include "components/policy/core/browser/browser_policy_connector.h" #include "components/policy/core/browser/url_blocklist_manager.h" #include "components/policy/core/common/local_test_policy_provider.h" @@ -289,6 +289,7 @@ #include "chrome/browser/new_tab_page/modules/v2/calendar/google_calendar_page_handler.h" #include "chrome/browser/new_tab_page/modules/v2/calendar/outlook_calendar_page_handler.h" #include "chrome/browser/new_tab_page/modules/v2/most_relevant_tab_resumption/most_relevant_tab_resumption_page_handler.h" +#include "chrome/browser/new_tab_page/modules/v2/tab_groups/tab_groups_page_handler.h" #include "chrome/browser/new_tab_page/promos/promo_service.h" #include "chrome/browser/promos/promos_utils.h" // nogncheck crbug.com/1125897 #include "chrome/browser/screen_ai/pref_names.h" @@ -311,11 +312,13 @@ #include "chrome/browser/ui/webui/new_tab_footer/new_tab_footer_ui.h" #include "chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h" #include "chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.h" +#include "chrome/browser/ui/webui/new_tab_page/ntp_pref_names.h" #include "chrome/browser/ui/webui/settings/settings_ui.h" #include "chrome/browser/ui/webui/side_panel/read_anything/read_anything_prefs.h" #include "chrome/browser/ui/webui/tab_search/tab_search_prefs.h" #include "chrome/browser/upgrade_detector/upgrade_detector.h" #include "chrome/browser/user_education/browser_user_education_storage_service.h" +#include "chrome/browser/webauthn/chrome_authenticator_request_delegate.h" #include "components/headless/policy/headless_mode_prefs.h" #include "components/lens/lens_overlay_permission_utils.h" #include "components/live_caption/live_caption_controller.h" @@ -384,6 +387,7 @@ #include "chrome/browser/ash/login/session/user_session_manager.h" #include "chrome/browser/ash/login/signin/legacy_token_handle_fetcher.h" #include "chrome/browser/ash/login/signin/signin_error_notifier.h" +#include "chrome/browser/ash/login/signin/token_handle_store_impl.h" #include "chrome/browser/ash/login/startup_utils.h" #include "chrome/browser/ash/login/users/avatar/user_image_manager_impl.h" #include "chrome/browser/ash/login/users/avatar/user_image_prefs.h" @@ -396,7 +400,6 @@ #include "chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h" #include "chrome/browser/ash/policy/enrollment/enrollment_requisition_manager.h" #include "chrome/browser/ash/policy/enrollment/enrollment_state_fetcher.h" -#include "chrome/browser/ash/policy/external_data/handlers/device_wallpaper_image_external_data_handler.h" #include "chrome/browser/ash/policy/handlers/adb_sideloading_allowance_mode_policy_handler.h" #include "chrome/browser/ash/policy/handlers/minimum_version_policy_handler.h" #include "chrome/browser/ash/policy/handlers/tpm_auto_update_mode_policy_handler.h" @@ -406,7 +409,6 @@ #include "chrome/browser/ash/policy/scheduled_task_handler/reboot_notifications_scheduler.h" #include "chrome/browser/ash/policy/status_collector/device_status_collector.h" #include "chrome/browser/ash/policy/status_collector/status_collector.h" -#include "chrome/browser/ash/power/auto_screen_brightness/metrics_reporter.h" #include "chrome/browser/ash/power/power_metrics_reporter.h" #include "chrome/browser/ash/preferences/preferences.h" #include "chrome/browser/ash/printing/cups_printers_manager.h" @@ -1105,6 +1107,42 @@ inline constexpr char kInvalidationClientIDCache[] = inline constexpr char kInvalidationTopicsToHandler[] = "invalidation.per_sender_topics_to_handler"; +#if BUILDFLAG(IS_ANDROID) +// Deprecated 08/2025. +constexpr char kObsoleteAccountStorageNoticeShown[] = + "password_manager.account_storage_notice_shown"; +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) +// Deprecated 08/2025. +constexpr char kObsoleteAutofillableCredentialsProfileStoreLoginDatabase[] = + "password_manager.autofillable_credentials_profile_store_login_database"; +constexpr char kObsoleteAutofillableCredentialsAccountStoreLoginDatabase[] = + "password_manager.autofillable_credentials_account_store_login_database"; +#endif // BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) +// Deprecated 08/2025. +constexpr char kAutoScreenBrightnessMetricsDailySample[] = + "auto_screen_brightness.metrics.daily_sample"; +constexpr char kAutoScreenBrightnessMetricsAtlasUserAdjustmentCount[] = + "auto_screen_brightness.metrics.atlas_user_adjustment_count"; +constexpr char kAutoScreenBrightnessMetricsEveUserAdjustmentCount[] = + "auto_screen_brightness.metrics.eve_user_adjustment_count"; +constexpr char kAutoScreenBrightnessMetricsNocturneUserAdjustmentCount[] = + "auto_screen_brightness.metrics.nocturne_user_adjustment_count"; +constexpr char kAutoScreenBrightnessMetricsKohakuUserAdjustmentCount[] = + "auto_screen_brightness.metrics.kohaku_user_adjustment_count"; +constexpr char kAutoScreenBrightnessMetricsNoAlsUserAdjustmentCount[] = + "auto_screen_brightness.metrics.no_als_user_adjustment_count"; +constexpr char kAutoScreenBrightnessMetricsSupportedAlsUserAdjustmentCount[] = + "auto_screen_brightness.metrics.supported_als_user_adjustment_count"; +constexpr char kAutoScreenBrightnessMetricsUnsupportedAlsUserAdjustmentCount[] = + "auto_screen_brightness.metrics.unsupported_als_user_adjustment_count"; +constexpr char kDesksLacrosProfileIdList[] = + "ash.desks.desks_lacros_profile_id_list"; +#endif // BUILDFLAG(IS_CHROMEOS) + // Register local state used only for migration (clearing or moving to a new // key). void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) { @@ -1210,6 +1248,25 @@ void RegisterLocalStatePrefsForMigration(PrefRegistrySimple* registry) { // Deprecated 08/2025. registry->RegisterDictionaryPref(kInvalidationClientIDCache); registry->RegisterDictionaryPref(kInvalidationTopicsToHandler); + +#if BUILDFLAG(IS_CHROMEOS) + // Deprecated 08/2025. + registry->RegisterDictionaryPref(kAutoScreenBrightnessMetricsDailySample); + registry->RegisterIntegerPref( + kAutoScreenBrightnessMetricsAtlasUserAdjustmentCount, 0); + registry->RegisterIntegerPref( + kAutoScreenBrightnessMetricsEveUserAdjustmentCount, 0); + registry->RegisterIntegerPref( + kAutoScreenBrightnessMetricsNocturneUserAdjustmentCount, 0); + registry->RegisterIntegerPref( + kAutoScreenBrightnessMetricsKohakuUserAdjustmentCount, 0); + registry->RegisterIntegerPref( + kAutoScreenBrightnessMetricsNoAlsUserAdjustmentCount, 0); + registry->RegisterIntegerPref( + kAutoScreenBrightnessMetricsSupportedAlsUserAdjustmentCount, 0); + registry->RegisterIntegerPref( + kAutoScreenBrightnessMetricsUnsupportedAlsUserAdjustmentCount, 0); +#endif } // Register prefs used only for migration (clearing or moving to a new key). @@ -1568,6 +1625,29 @@ void RegisterProfilePrefsForMigration( // Deprecated 08/2025. registry->RegisterDictionaryPref(kInvalidationClientIDCache); registry->RegisterDictionaryPref(kInvalidationTopicsToHandler); + +#if BUILDFLAG(IS_ANDROID) + // Deprecated 08/2025. + registry->RegisterBooleanPref(kObsoleteAccountStorageNoticeShown, false); +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + // Deprecated 08/2025. + registry->RegisterBooleanPref( + kObsoleteAutofillableCredentialsProfileStoreLoginDatabase, false); + registry->RegisterBooleanPref( + kObsoleteAutofillableCredentialsAccountStoreLoginDatabase, false); +#endif // !BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + // Deprecated 08/2025. + registry->RegisterBooleanPref(ntp_prefs::kNtpUseMostVisitedTiles, false); +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + // Deprecated 08/2025. + registry->RegisterListPref(kDesksLacrosProfileIdList); +#endif // BUILDFLAG(IS_CHROMEOS) } } // namespace @@ -1751,8 +1831,6 @@ void RegisterLocalState(PrefRegistrySimple* registry) { ash::PowerMetricsReporter::RegisterLocalStatePrefs(registry); ash::platform_keys::KeyPermissionsManagerImpl::RegisterLocalStatePrefs( registry); - ash::power::auto_screen_brightness::MetricsReporter::RegisterLocalStatePrefs( - registry); ash::Preferences::RegisterPrefs(registry); ash::ResetScreen::RegisterPrefs(registry); ash::SchedulerConfigurationManager::RegisterLocalStatePrefs(registry); @@ -1777,7 +1855,6 @@ void RegisterLocalState(PrefRegistrySimple* registry) { policy::DeviceRestrictionScheduleController::RegisterLocalStatePrefs( registry); policy::DeviceStatusCollector::RegisterPrefs(registry); - policy::DeviceWallpaperImageExternalDataHandler::RegisterPrefs(registry); policy::EnrollmentRequisitionManager::RegisterPrefs(registry); policy::EnrollmentStateFetcher::RegisterPrefs(registry); policy::EuiccStatusUploader::RegisterLocalStatePrefs(registry); @@ -1940,7 +2017,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, ntp_tiles::MostVisitedSites::RegisterProfilePrefs(registry); optimization_guide::prefs::RegisterProfilePrefs(registry); optimization_guide::model_execution::prefs::RegisterProfilePrefs(registry); - PageColors::RegisterProfilePrefs(registry); + PageColorsController::RegisterProfilePrefs(registry); password_manager::PasswordManager::RegisterProfilePrefs(registry); payments::RegisterProfilePrefs(registry); performance_manager::user_tuning::prefs::RegisterProfilePrefs(registry); @@ -2097,6 +2174,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, signin::RegisterProfilePrefs(registry); StartupBrowserCreator::RegisterProfilePrefs(registry); MostRelevantTabResumptionPageHandler::RegisterProfilePrefs(registry); + TabGroupsPageHandler::RegisterProfilePrefs(registry); tab_groups::saved_tab_groups::prefs::RegisterProfilePrefs(registry); tab_organization_prefs::RegisterProfilePrefs(registry); tab_search_prefs::RegisterProfilePrefs(registry); @@ -2119,6 +2197,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, chromeos::cloud_upload::RegisterProfilePrefs(registry); policy::NetworkAnnotationBlocklistHandler::RegisterPrefs(registry); quickoffice::RegisterProfilePrefs(registry); + registry->RegisterBooleanPref(prefs::kAutoSignOutEnabled, false); registry->RegisterBooleanPref(prefs::kDeskAPIThirdPartyAccessEnabled, false); registry->RegisterBooleanPref(prefs::kDeskAPIDeskSaveAndShareEnabled, false); registry->RegisterListPref(prefs::kDeskAPIThirdPartyAllowlist); @@ -2233,6 +2312,7 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ BUILDFLAG(IS_CHROMEOS) device_signals::RegisterProfilePrefs(registry); + ntp_tiles::EnterpriseShortcutsManagerImpl::RegisterProfilePrefs(registry); #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || // BUILDFLAG(IS_CHROMEOS) @@ -2327,6 +2407,12 @@ void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry, registry->RegisterDictionaryPref(prefs::kReportingEndpoints); registry->RegisterBooleanPref(prefs::kViewSourceLineWrappingEnabled, false); + +#if BUILDFLAG(IS_ANDROID) + registry->RegisterBooleanPref( + omnibox::kIsOmniboxInBottomPosition, false, + user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); +#endif } void RegisterUserProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { @@ -2343,6 +2429,7 @@ void RegisterUserProfilePrefs(user_prefs::PrefRegistrySyncable* registry, #if BUILDFLAG(IS_CHROMEOS) ash::RegisterUserProfilePrefs(registry, locale); ash::LegacyTokenHandleFetcher::RegisterPrefs(registry); + ash::TokenHandleStoreImpl::RegisterPrefs(registry); #endif } @@ -2483,6 +2570,21 @@ void MigrateObsoleteLocalStatePrefs(PrefService* local_state) { local_state->ClearPref(kInvalidationClientIDCache); local_state->ClearPref(kInvalidationTopicsToHandler); +#if BUILDFLAG(IS_CHROMEOS) + // Added 08/2025. + local_state->ClearPref(kAutoScreenBrightnessMetricsDailySample); + local_state->ClearPref(kAutoScreenBrightnessMetricsNoAlsUserAdjustmentCount); + local_state->ClearPref( + kAutoScreenBrightnessMetricsSupportedAlsUserAdjustmentCount); + local_state->ClearPref( + kAutoScreenBrightnessMetricsUnsupportedAlsUserAdjustmentCount); + local_state->ClearPref(kAutoScreenBrightnessMetricsAtlasUserAdjustmentCount); + local_state->ClearPref(kAutoScreenBrightnessMetricsEveUserAdjustmentCount); + local_state->ClearPref( + kAutoScreenBrightnessMetricsNocturneUserAdjustmentCount); + local_state->ClearPref(kAutoScreenBrightnessMetricsKohakuUserAdjustmentCount); +#endif // BUILDFLAG(IS_CHROMEOS) + // Please don't delete the following line. It is used by PRESUBMIT.py. // END_MIGRATE_OBSOLETE_LOCAL_STATE_PREFS @@ -2868,6 +2970,29 @@ void MigrateObsoleteProfilePrefs(PrefService* profile_prefs, profile_prefs->ClearPref(kInvalidationClientIDCache); profile_prefs->ClearPref(kInvalidationTopicsToHandler); +#if BUILDFLAG(IS_ANDROID) + // Added 08/2025. + profile_prefs->ClearPref(kObsoleteAccountStorageNoticeShown); +#endif // BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + // Deprecated 08/2025. + profile_prefs->ClearPref( + kObsoleteAutofillableCredentialsProfileStoreLoginDatabase); + profile_prefs->ClearPref( + kObsoleteAutofillableCredentialsAccountStoreLoginDatabase); +#endif // !BUILDFLAG(IS_ANDROID) + +#if !BUILDFLAG(IS_ANDROID) + // Added 08/2025. + NewTabPageUI::MigrateDeprecatedUseMostVisitedTilesPref(profile_prefs); +#endif // !BUILDFLAG(IS_ANDROID) + +#if BUILDFLAG(IS_CHROMEOS) + // Added 08/2025. + profile_prefs->ClearPref(kDesksLacrosProfileIdList); +#endif // BUILDFLAG(IS_CHROMEOS) + // Please don't delete the following line. It is used by PRESUBMIT.py. // END_MIGRATE_OBSOLETE_PROFILE_PREFS diff --git a/tools/under-control/src/chrome/browser/ui/tab_helpers.cc b/tools/under-control/src/chrome/browser/ui/tab_helpers.cc index e9f46281..43e893f4 100755 --- a/tools/under-control/src/chrome/browser/ui/tab_helpers.cc +++ b/tools/under-control/src/chrome/browser/ui/tab_helpers.cc @@ -52,6 +52,7 @@ #include "chrome/browser/page_load_metrics/page_load_metrics_initialize.h" #include "chrome/browser/password_manager/chrome_password_manager_client.h" #include "chrome/browser/permissions/one_time_permissions_tracker_helper.h" +#include "chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper.h" #include "chrome/browser/predictors/loading_predictor_factory.h" #include "chrome/browser/predictors/loading_predictor_tab_helper.h" #include "chrome/browser/preloading/prefetch/no_state_prefetch/no_state_prefetch_manager_factory.h" @@ -95,6 +96,8 @@ #include "chrome/browser/ui/tab_contents/core_tab_helper.h" #include "chrome/browser/ui/tab_dialogs.h" #include "chrome/browser/ui/thumbnails/thumbnail_tab_helper.h" +#include "chrome/browser/ui/views/tab_sharing/tab_capture_contents_border_helper.h" +#include "chrome/browser/ui/webui_browser/webui_browser.h" #include "chrome/browser/v8_compile_hints/v8_compile_hints_tab_helper.h" #include "chrome/browser/vr/vr_tab_helper.h" #include "chrome/common/buildflags.h" @@ -118,8 +121,6 @@ #include "components/download/content/factory/navigation_monitor_factory.h" #include "components/download/content/public/download_navigation_observer.h" #include "components/enterprise/buildflags/buildflags.h" -#include "components/fingerprinting_protection_filter/interventions/browser/interventions_web_contents_helper.h" -#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h" #include "components/history/content/browser/web_contents_top_sites_observer.h" #include "components/history/core/browser/top_sites.h" #include "components/infobars/content/content_infobar_manager.h" @@ -143,6 +144,7 @@ #include "components/search/ntp_features.h" #include "components/site_engagement/content/site_engagement_helper.h" #include "components/site_engagement/content/site_engagement_service.h" +#include "components/tabs/public/tab_interface.h" #include "components/tracing/common/tracing_switches.h" #include "components/ukm/content/source_url_recorder.h" #include "components/webapps/browser/installable/installable_manager.h" @@ -159,7 +161,7 @@ #include "ui/accessibility/accessibility_features.h" #if BUILDFLAG(IS_ANDROID) -#include "base/android/build_info.h" +#include "base/android/android_info.h" #include "base/functional/bind.h" #include "base/memory/ptr_util.h" #include "chrome/browser/android/oom_intervention/oom_intervention_tab_helper.h" @@ -186,7 +188,6 @@ #include "content/public/common/content_features.h" #else #include "chrome/browser/banners/app_banner_manager_desktop.h" -#include "chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper.h" #include "chrome/browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper.h" #include "chrome/browser/tab_contents/form_interaction_tab_helper.h" #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" @@ -208,6 +209,7 @@ #if BUILDFLAG(IS_CHROMEOS) #include "chrome/browser/ash/boot_times_recorder/boot_times_recorder_tab_helper.h" +#include "chrome/browser/ash/child_accounts/time_limits/web_time_navigation_observer.h" #include "chrome/browser/ash/growth/campaigns_manager_session_tab_helper.h" #include "chrome/browser/ash/mahi/web_contents/mahi_tab_helper.h" #include "chrome/browser/chromeos/cros_apps/cros_apps_tab_helper.h" @@ -344,12 +346,23 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) { autofill::AutofillClientProvider& autofill_client_provider = autofill::AutofillClientProviderFactory::GetForProfile(profile); autofill_client_provider.CreateClientForWebContents(web_contents); + + if (base::FeatureList::IsEnabled( + blink::features::kMediaSessionEnterPictureInPicture)) { +#if BUILDFLAG(IS_ANDROID) + if (base::FeatureList::IsEnabled(media::kAutoPictureInPictureAndroid)) { + AutoPictureInPictureTabHelper::CreateForWebContents(web_contents); + } +#else + AutoPictureInPictureTabHelper::CreateForWebContents(web_contents); +#endif + } #if BUILDFLAG(IS_ANDROID) // The sensitive content client has to be instantiated after the autofill // client, because the sensitive content client starts a flow which uses // `ScopedAutofillManagersObservation`. - if (base::android::BuildInfo::GetInstance()->sdk_int() >= - base::android::SdkVersion::SDK_VERSION_V && + if (base::android::android_info::sdk_int() >= + base::android::android_info::SdkVersion::SDK_VERSION_V && base::FeatureList::IsEnabled( sensitive_content::features::kSensitiveContent)) { sensitive_content::AndroidSensitiveContentClient::CreateForWebContents( @@ -366,13 +379,6 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) { profile->IsIncognitoProfile()); } - if (fingerprinting_protection_interventions::features:: - IsCanvasInterventionsEnabledForIncognitoState( - profile->IsIncognitoProfile())) { - fingerprinting_protection_interventions::InterventionsWebContentsHelper:: - CreateForWebContents(web_contents, profile->IsIncognitoProfile()); - } - // Only create the IpProtectionStatus if the User Bypass feature is enabled. if (net::features::kIpPrivacyEnableUserBypass.Get()) { ip_protection::IpProtectionStatus::CreateForWebContents(web_contents); @@ -487,7 +493,17 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) { performance_manager::PerformanceManagerRegistry::GetInstance()) { pm_registry->SetPageType(web_contents, performance_manager::PageType::kTab); } - permissions::PermissionRequestManager::CreateForWebContents(web_contents); + // The tab interface is only needed on Desktop to support Split View. + tabs::TabInterface* desktop_tab_interface = +#if BUILDFLAG(IS_ANDROID) + nullptr; +#else + base::FeatureList::IsEnabled(features::kSideBySide) + ? tabs::TabInterface::MaybeGetFromContents(web_contents) + : nullptr; +#endif // BUILDFLAG(IS_ANDROID) + permissions::PermissionRequestManager::CreateForWebContents( + web_contents, desktop_tab_interface); permissions::PermissionRecoverySuccessRateTracker::CreateForWebContents( web_contents); // The PopupBlockerTabHelper has an implicit dependency on @@ -571,22 +587,15 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) { tpcd::metadata::TpcdMetadataDevtoolsObserver::CreateForWebContents( web_contents); tpcd::trial::ValidityService::MaybeCreateForWebContents(web_contents); +#if !BUILDFLAG(IS_ANDROID) + TabCaptureContentsBorderHelper::CreateForWebContents(web_contents); +#endif // BUILDFLAG(IS_ANDROID) TrustedVaultEncryptionKeysTabHelper::CreateForWebContents(web_contents); -#if BUILDFLAG(IS_ANDROID) - if (base::FeatureList::IsEnabled(features::kSafetyHub)) { - auto* service = RevokedPermissionsServiceFactory::GetForProfile(profile); - if (service) { - RevokedPermissionsService::TabHelper::CreateForWebContents(web_contents, - service); - } - } -#else // BUILDFLAG(IS_ANDROID) auto* service = RevokedPermissionsServiceFactory::GetForProfile(profile); if (service) { RevokedPermissionsService::TabHelper::CreateForWebContents(web_contents, service); } -#endif // BUILDFLAG(IS_ANDROID) ukm::InitializeSourceUrlRecorderForWebContents(web_contents); v8_compile_hints::V8CompileHintsTabHelper::MaybeCreateForWebContents( web_contents); @@ -637,10 +646,6 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) { webapps::MLInstallabilityPromoter::CreateForWebContents(web_contents); webapps::AppBannerManagerDesktop::CreateForWebContents(web_contents); } - if (base::FeatureList::IsEnabled( - blink::features::kMediaSessionEnterPictureInPicture)) { - AutoPictureInPictureTabHelper::CreateForWebContents(web_contents); - } BookmarkTabHelper::CreateForWebContents(web_contents); BrowserSyncedTabDelegate::CreateForWebContents(web_contents); FocusTabAfterNavigationHelper::CreateForWebContents(web_contents); @@ -660,7 +665,9 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) { SearchEngineChoiceTabHelper::CreateForWebContents(web_contents); } - SadTabHelper::CreateForWebContents(web_contents); + if (!webui_browser::IsWebUIBrowserEnabled()) { + SadTabHelper::CreateForWebContents(web_contents); + } SearchTabHelper::CreateForWebContents(web_contents); TabDialogs::CreateForWebContents(web_contents); if (base::FeatureList::IsEnabled(features::kTabHoverCardImages) || @@ -696,6 +703,8 @@ void TabHelpers::AttachTabHelpers(WebContents* web_contents) { GeminiAppTabHelper::MaybeCreateForWebContents(web_contents); mahi::MahiTabHelper::MaybeCreateForWebContents(web_contents); policy::DlpContentTabHelper::MaybeCreateForWebContents(web_contents); + ash::app_time::WebTimeNavigationObserver::MaybeCreateForWebContents( + web_contents); #endif #if BUILDFLAG(ENABLE_EXTENSIONS) diff --git a/tools/under-control/src/chrome/browser/ui/webui/chrome_content_browser_client_webui_part.cc b/tools/under-control/src/chrome/browser/ui/webui/chrome_content_browser_client_webui_part.cc index 9210b158..cd4aebac 100755 --- a/tools/under-control/src/chrome/browser/ui/webui/chrome_content_browser_client_webui_part.cc +++ b/tools/under-control/src/chrome/browser/ui/webui/chrome_content_browser_client_webui_part.cc @@ -8,6 +8,7 @@ #include "chrome/common/pref_names.h" #include "chrome/common/webui_url_constants.h" #include "components/prefs/pref_service.h" +#include "content/public/browser/navigation_controller.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/web_contents.h" #include "extensions/common/constants.h" diff --git a/tools/under-control/src/chrome/common/extensions/api/autofill_private.idl b/tools/under-control/src/chrome/common/extensions/api/autofill_private.idl index 820cec06..26470970 100755 --- a/tools/under-control/src/chrome/common/extensions/api/autofill_private.idl +++ b/tools/under-control/src/chrome/common/extensions/api/autofill_private.idl @@ -124,7 +124,6 @@ namespace autofillPrivate { ADDRESS_HOME_APT_TYPE, ADDRESS_HOME_HOUSE_NUMBER_AND_APT, SINGLE_USERNAME_WITH_INTERMEDIATE_VALUES, - PASSPORT_NAME_TAG, PASSPORT_NUMBER, PASSPORT_ISSUING_COUNTRY, PASSPORT_EXPIRATION_DATE, @@ -132,12 +131,10 @@ namespace autofillPrivate { LOYALTY_MEMBERSHIP_PROGRAM, LOYALTY_MEMBERSHIP_PROVIDER, LOYALTY_MEMBERSHIP_ID, - VEHICLE_OWNER_TAG, VEHICLE_LICENSE_PLATE, VEHICLE_VIN, VEHICLE_MAKE, VEHICLE_MODEL, - DRIVERS_LICENSE_NAME_TAG, DRIVERS_LICENSE_REGION, DRIVERS_LICENSE_NUMBER, DRIVERS_LICENSE_EXPIRATION_DATE, diff --git a/tools/under-control/src/chrome/common/extensions/api/developer_private.idl b/tools/under-control/src/chrome/common/extensions/api/developer_private.idl index 4e891277..b9c4ce84 100755 --- a/tools/under-control/src/chrome/common/extensions/api/developer_private.idl +++ b/tools/under-control/src/chrome/common/extensions/api/developer_private.idl @@ -115,6 +115,7 @@ namespace developerPrivate { long renderViewId; long renderProcessId; boolean canInspect; + boolean isServiceWorker; StackFrame[] stackTrace; }; diff --git a/tools/under-control/src/chrome/common/extensions/api/file_manager_private.idl b/tools/under-control/src/chrome/common/extensions/api/file_manager_private.idl index 34b46e5f..1980bb21 100755 --- a/tools/under-control/src/chrome/common/extensions/api/file_manager_private.idl +++ b/tools/under-control/src/chrome/common/extensions/api/file_manager_private.idl @@ -90,7 +90,8 @@ enum MountError { unsupported_filesystem, need_password, cancelled, - busy + busy, + corrupted }; // Filesystem to format to. @@ -1357,15 +1358,6 @@ dictionary BulkPinProgress { boolean emptiedQueue; }; -// Represents a custom view of files to be displayed. -dictionary MaterializedView { - // Unique indentifier for the view. - long viewId; - - // Name of the view displayed to the user. - DOMString name; -}; - // Used by EntryData to store the file system of the entry. dictionary FileSystemData { // Name of the file system. Will be unique. @@ -1537,10 +1529,6 @@ callback ParseTrashInfoFilesCallback = void(ParsedTrashInfoFile[] files); callback GetBulkPinProgressCallback = void(BulkPinProgress progress); -callback GetMaterializedViewsCallback = void(MaterializedView[] views); - -callback ReadMaterializedViewCallback = void(EntryData[] files); - interface Functions { // Cancels file selection. static void cancelDialog(); @@ -2082,13 +2070,6 @@ interface Functions { // drive. [doesNotSupportPromises] static void calculateBulkPinRequiredSpace(SimpleCallback callback); - - // Returns a list of views that can be displayed to the user. - static void getMaterializedViews(GetMaterializedViewsCallback callback); - - // Returns the list of entries contained in the view identified by `viewId`. - static void readMaterializedView(long viewId, - ReadMaterializedViewCallback callback); }; // Events supported by fileManagerPrivate API. These events are broadcasted. diff --git a/tools/under-control/src/chrome/common/extensions/api/pdf_viewer_private.idl b/tools/under-control/src/chrome/common/extensions/api/pdf_viewer_private.idl index 798e9e09..df879af1 100755 --- a/tools/under-control/src/chrome/common/extensions/api/pdf_viewer_private.idl +++ b/tools/under-control/src/chrome/common/extensions/api/pdf_viewer_private.idl @@ -61,6 +61,9 @@ namespace pdfViewerPrivate { // The number of bytes that have been uploaded. long? uploadedBytes; + + // The localized metadata and progress of the file. + DOMString? fileMetadata; }; // Nearly identical to mimeHandlerPrivate.StreamInfo, but without a mime type diff --git a/tools/under-control/src/chrome/common/extensions/api/reading_list.idl b/tools/under-control/src/chrome/common/extensions/api/reading_list.idl deleted file mode 100755 index c25885a0..00000000 --- a/tools/under-control/src/chrome/common/extensions/api/reading_list.idl +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Use the chrome.readingList API to read from and modify -// the items in the -// Reading List. -namespace readingList{ - dictionary ReadingListEntry { - // The url of the entry. - DOMString url; - - // The title of the entry. - DOMString title; - - // Will be true if the entry has been read. - boolean hasBeenRead; - - // The last time the entry was updated. - // This value is in milliseconds since Jan 1, 1970. - double lastUpdateTime; - - // The time the entry was created. - // Recorded in milliseconds since Jan 1, 1970. - double creationTime; - }; - - dictionary AddEntryOptions { - // The url of the entry. - DOMString url; - - // The title of the entry. - DOMString title; - - // Will be true if the entry has been read. - boolean hasBeenRead; - }; - - dictionary RemoveOptions { - // The url to remove. - DOMString url; - }; - - dictionary UpdateEntryOptions { - // The url that will be updated. - DOMString url; - - // The new title. The existing tile remains if a value isn't provided. - DOMString? title; - - // The updated read status. The existing status remains if a value - // isn't provided. - boolean? hasBeenRead; - }; - - dictionary QueryInfo { - // A url to search for. - DOMString? url; - - // A title to search for. - DOMString? title; - - // Indicates whether to search for read (true) or unread - // (false) items. - boolean? hasBeenRead; - }; - - callback AddEntryCallback = void (); - callback RemoveEntryCallback = void(); - callback UpdateEntryCallback = void(); - callback QueryCallback = void(ReadingListEntry[] entries); - - interface Functions { - // Adds an entry to the reading list if it does not exist. - // |entry|: The entry to add to the reading list. - // |callback|: Invoked once the entry has been added. - static void addEntry( - AddEntryOptions entry, - optional AddEntryCallback callback); - - // Removes an entry from the reading list if it exists. - // |info|: The entry to remove from the reading list. - // |callback|: Invoked once the entry has been removed. - static void removeEntry( - RemoveOptions info, - optional RemoveEntryCallback callback); - - // Updates a reading list entry if it exists. - // |info|: The entry to update. - // |callback|: Invoked once the matched entries have been updated. - static void updateEntry( - UpdateEntryOptions info, - optional UpdateEntryCallback callback); - - // Retrieves all entries that match the QueryInfo properties. - // Properties that are not provided will not be matched. - // |info|: The properties to search for. - // |callback|: Invoked once the entries have been matched. - static void query( - QueryInfo info, - QueryCallback callback); - }; - - interface Events { - // Triggered when a ReadingListEntry is added to the reading list. - // |entry|: The entry that was added. - static void onEntryAdded(ReadingListEntry entry); - - // Triggered when a ReadingListEntry is removed from the reading list. - // |entry|: The entry that was removed. - static void onEntryRemoved(ReadingListEntry entry); - - // Triggered when a ReadingListEntry is updated in the reading list. - // |entry|: The entry that was updated. - static void onEntryUpdated(ReadingListEntry entry); - }; -}; diff --git a/tools/under-control/src/chrome/common/extensions/api/side_panel.idl b/tools/under-control/src/chrome/common/extensions/api/side_panel.idl index 2631e105..c0c89373 100755 --- a/tools/under-control/src/chrome/common/extensions/api/side_panel.idl +++ b/tools/under-control/src/chrome/common/extensions/api/side_panel.idl @@ -77,6 +77,37 @@ namespace sidePanel { long? tabId; }; + // Options for closing the side panel. + // At least one of `tabId` or `windowId` must be specified. + dictionary CloseOptions { + // The window in which to close the side panel. If a global side panel is + // open in the specified window, it will be closed for all tabs in that + // window where no tab-specific panel is active. At least one of this or + // tabId must be provided. + long? windowId; + + // The tab in which to close the side panel. If a tab-specific side panel + // is open in the specified tab, it will be closed for that tab. + // At least one of this or windowId must be provided. + long? tabId; + }; + + // Information about the opened side panel. It is fired when the extension's + // side panel is opened. + dictionary PanelOpenedInfo { + // The ID of the window where the side panel is opened. This is available + // for both global and tab-specific panels. + long windowId; + + // The optional ID of the tab where the side panel is opened. This is + // provided only when the panel is tab-specific. + long? tabId; + + // The path of the local resource within the extension package whose content + // is displayed in the panel. + DOMString path; + }; + callback VoidCallback = void(); callback PanelOptionsCallback = void(PanelOptions options); callback PanelBehaviorCallback = void(PanelBehavior behavior); @@ -121,5 +152,18 @@ namespace sidePanel { // Returns the side panel's current layout. // |callback|: Called with a $(ref:PanelLayout) containing the side value. static void getLayout(PanelLayoutCallback callback); + + // Closes the extension's side panel. + // This is a no-op if the panel is already closed. + // |options|: Specifies the context in which to close the side panel. + // |callback|: Called when the side panel has been closed. + [nodoc] static void close( + CloseOptions options, + VoidCallback callback); + }; + + interface Events { + // Fired when the extension's side panel is opened. + static void onOpened(PanelOpenedInfo info); }; }; diff --git a/tools/under-control/src/chrome/common/extensions/api/web_authentication_proxy.idl b/tools/under-control/src/chrome/common/extensions/api/web_authentication_proxy.idl deleted file mode 100755 index c59885ae..00000000 --- a/tools/under-control/src/chrome/common/extensions/api/web_authentication_proxy.idl +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// The chrome.webAuthenticationProxy API lets remote desktop -// software running on a remote host intercept Web Authentication API -// (WebAuthn) requests in order to handle them on a local client. -namespace webAuthenticationProxy { - // An object representing a - // PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() - // call. - dictionary IsUvpaaRequest { - // An opaque identifier for the request. - long requestId; - }; - - // An object representing a WebAuthn - // navigator.credentials.create() call. - dictionary CreateRequest { - // An opaque identifier for the request. - long requestId; - - // The PublicKeyCredentialCreationOptions passed to - // navigator.credentials.create(), serialized as a JSON - // string. The serialization format is compatible with - // PublicKeyCredential.parseCreationOptionsFromJSON(). - DOMString requestDetailsJson; - }; - - // An object representing a WebAuthn navigator.credentials.get() - // call. - dictionary GetRequest { - // An opaque identifier for the request. - long requestId; - - // The PublicKeyCredentialRequestOptions passed to - // navigator.credentials.get(), serialized as a JSON string. - // The serialization format is compatible with - // PublicKeyCredential.parseRequestOptionsFromJSON(). - DOMString requestDetailsJson; - }; - - // This interface defines Events that fire when any website makes a WebAuthn - // request. Regular processing of WebAuthn requests in the local Chrome - // instance is disabled when these events are subscribed to. - interface Events { - // A native application associated with this extension can cause this - // event to be fired by writing to a file with a name equal to the - // extension's ID in a directory named - // WebAuthenticationProxyRemoteSessionStateChange inside the - // default - // user data directory - // - // The contents of the file should be empty. I.e., it is not necessary to - // change the contents of the file in order to trigger this event. - // - // The native host application may use this event mechanism to signal a - // possible remote session state change (i.e. from detached to attached, or - // vice versa) while the extension service worker is possibly suspended. In - // the handler for this event, the extension can call the - // attach() or detach() API methods accordingly. - // - // The event listener must be registered synchronously at load time. - static void onRemoteSessionStateChange(); - - // Fires when a WebAuthn navigator.credentials.create() call - // occurs. The extension must supply a response by calling - // completeCreateRequest() with the requestId from - // requestInfo. - static void onCreateRequest(CreateRequest requestInfo); - - // Fires when a WebAuthn navigator.credentials.get() call occurs. The - // extension must supply a response by calling - // completeGetRequest() with the requestId from - // requestInfo - static void onGetRequest(GetRequest requestInfo); - - // Fires when a - // PublicKeyCredential.isUserVerifyingPlatformAuthenticatorAvailable() - // call occurs. The extension must supply a response by calling - // completeIsUvpaaRequest() with the requestId - // from requestInfo - static void onIsUvpaaRequest(IsUvpaaRequest requestInfo); - - // Fires when a onCreateRequest or onGetRequest - // event is canceled (because the WebAuthn request was aborted by the - // caller, or because it timed out). When receiving this event, the - // extension should cancel processing of the corresponding request on the - // client side. Extensions cannot complete a request once it has been - // canceled. - static void onRequestCanceled(long requestId); - }; - - callback ErrorCallback = void(optional DOMString error); - callback VoidCallback = void(); - - dictionary DOMExceptionDetails { - DOMString name; - DOMString message; - }; - - dictionary CreateResponseDetails { - // The requestId of the CreateRequest. - long requestId; - - // The DOMException yielded by the remote request, if any. - DOMExceptionDetails? error; - - // The PublicKeyCredential, yielded by the remote request, if - // any, serialized as a JSON string by calling - // href="https://w3c.github.io/webauthn/#dom-publickeycredential-tojson"> - // PublicKeyCredential.toJSON(). - DOMString? responseJson; - }; - - dictionary GetResponseDetails { - // The requestId of the CreateRequest. - long requestId; - - // The DOMException yielded by the remote request, if any. - DOMExceptionDetails? error; - - // The PublicKeyCredential, yielded by the remote request, if - // any, serialized as a JSON string by calling - // href="https://w3c.github.io/webauthn/#dom-publickeycredential-tojson"> - // PublicKeyCredential.toJSON(). - DOMString? responseJson; - }; - - dictionary IsUvpaaResponseDetails { - long requestId; - boolean isUvpaa; - }; - - interface Functions { - // Reports the result of a navigator.credentials.create() - // call. The extension must call this for every - // onCreateRequest event it has received, unless the request - // was canceled (in which case, an onRequestCanceled event is - // fired). - static void completeCreateRequest( - CreateResponseDetails details, - VoidCallback callback); - - // Reports the result of a navigator.credentials.get() call. - // The extension must call this for every onGetRequest event - // it has received, unless the request was canceled (in which case, an - // onRequestCanceled event is fired). - static void completeGetRequest( - GetResponseDetails details, - VoidCallback callback); - - // Reports the result of a - // PublicKeyCredential.isUserVerifyingPlatformAuthenticator() - // call. The extension must call this for every - // onIsUvpaaRequest event it has received. - static void completeIsUvpaaRequest( - IsUvpaaResponseDetails details, - VoidCallback callback); - - // Makes this extension the active Web Authentication API request proxy. - // - // Remote desktop extensions typically call this method after detecting - // attachment of a remote session to this host. Once this method returns - // without error, regular processing of WebAuthn requests is suspended, and - // events from this extension API are raised. - // - // This method fails with an error if a different extension is already - // attached. - // - // The attached extension must call detach() once the remote - // desktop session has ended in order to resume regular WebAuthn request - // processing. Extensions automatically become detached if they are - // unloaded. - // - // Refer to the onRemoteSessionStateChange event for signaling - // a change of remote session attachment from a native application to to - // the (possibly suspended) extension. - static void attach(ErrorCallback callback); - - // Removes this extension from being the active Web Authentication API - // request proxy. - // - // This method is typically called when the extension detects that a remote - // desktop session was terminated. Once this method returns, the extension - // ceases to be the active Web Authentication API request proxy. - // - // Refer to the onRemoteSessionStateChange event for signaling - // a change of remote session attachment from a native application to to - // the (possibly suspended) extension. - static void detach(ErrorCallback callback); - }; -}; diff --git a/tools/under-control/src/chrome/renderer/chrome_content_renderer_client.cc b/tools/under-control/src/chrome/renderer/chrome_content_renderer_client.cc index e6978319..a69564cd 100755 --- a/tools/under-control/src/chrome/renderer/chrome_content_renderer_client.cc +++ b/tools/under-control/src/chrome/renderer/chrome_content_renderer_client.cc @@ -14,6 +14,7 @@ #include "base/check_op.h" #include "base/command_line.h" #include "base/debug/crash_logging.h" +#include "base/debug/dump_without_crashing.h" #include "base/feature_list.h" #include "base/functional/bind.h" #include "base/metrics/histogram_functions.h" @@ -26,6 +27,7 @@ #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "base/task/single_thread_task_runner.h" +#include "base/threading/thread_restrictions.h" #include "base/time/time.h" #include "base/values.h" #include "build/build_config.h" @@ -62,12 +64,14 @@ #include "chrome/renderer/net_benchmarking_extension.h" #include "chrome/renderer/plugins/non_loadable_plugin_placeholder.h" #include "chrome/renderer/plugins/pdf_plugin_placeholder.h" +#include "chrome/renderer/process_state.h" #include "chrome/renderer/supervised_user/supervised_user_error_page_controller_delegate_impl.h" #include "chrome/renderer/trusted_vault_encryption_keys_extension.h" #include "chrome/renderer/url_loader_throttle_provider_impl.h" #include "chrome/renderer/v8_unwinder.h" #include "chrome/renderer/web_link_preview_triggerer_impl.h" #include "chrome/renderer/websocket_handshake_throttle_provider_impl.h" +#include "chrome/renderer/webui_browser/webui_browser_renderer_extension.h" #include "chrome/renderer/worker_content_settings_client.h" #include "chrome/services/speech/buildflags/buildflags.h" #include "components/autofill/content/renderer/autofill_agent.h" @@ -502,10 +506,27 @@ void ChromeContentRendererClient::RenderThreadStarted() { isolated_app_scheme); } - // The Instant process can only display the content but not read it. Other - // processes can't display it or read it. - if (!command_line->HasSwitch(switches::kInstantProcess)) + // The Instant process can only display the content but not read it. Other + // processes can't display it or read it. (see http://crbug.com/40309067 for + // more context on why chrome-search scheme registration is skipped for the + // instant process). + bool should_restrict_chrome_search_scheme = + !command_line->HasSwitch(switches::kInstantProcess); + +#if !BUILDFLAG(IS_ANDROID) + // If the feature is enabled, the `kInstantProcess` command line switch is + // replaced by the `is_instant_process` flag, which is set later. As a result, + // we cannot perform chrome-search scheme registration at this stage. This + // registration will instead be handled in + // `SetConfigurationOnProcessLockUpdate()` where the instant process flag + // has been set. + if (base::FeatureList::IsEnabled(features::kInstantUsesSpareRenderer)) { + should_restrict_chrome_search_scheme = false; + } +#endif // !BUILDFLAG(IS_ANDROID) + if (should_restrict_chrome_search_scheme) { WebSecurityPolicy::RegisterURLSchemeAsDisplayIsolated(chrome_search_scheme); + } WebString dom_distiller_scheme( WebString::FromASCII(dom_distiller::kDomDistillerScheme)); @@ -702,9 +723,7 @@ void ChromeContentRendererClient::RenderFrameCreated( } #if !BUILDFLAG(IS_ANDROID) - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); - if (command_line->HasSwitch(switches::kInstantProcess) && - render_frame->IsMainFrame()) { + if (process_state::IsInstantProcess() && render_frame->IsMainFrame()) { new SearchBox(render_frame); } #endif @@ -743,6 +762,12 @@ void ChromeContentRendererClient::RenderFrameCreated( new wallet::BoardingPassExtractor(render_frame, registry); } #endif + +#if !BUILDFLAG(IS_ANDROID) + if (base::FeatureList::IsEnabled(features::kWebium)) { + WebUIBrowserRendererExtension::Create(render_frame); + } +#endif } void ChromeContentRendererClient::WebViewCreated( @@ -1201,6 +1226,44 @@ ChromeContentRendererClient::GetProtocolHandlerSecurityLevel( #endif } +void ChromeContentRendererClient::WaitForProcessReady() { +#if !BUILDFLAG(IS_ANDROID) + if (!base::FeatureList::IsEnabled(features::kInstantUsesSpareRenderer)) { + return; + } + + bool process_was_ready = chrome_observer_->IsProcessReady(); + bool is_extension = IsStandaloneContentExtensionProcess(); + base::UmaHistogramBoolean( + is_extension ? "Renderer.ProcessReadyWaitRequired.ExtensionProcess" + : "Renderer.ProcessReadyWaitRequired.RegularProcess", + !process_was_ready); + if (process_was_ready) { + return; + } + + base::TimeTicks start_time = base::TimeTicks::Now(); + base::ScopedAllowBaseSyncPrimitivesOutsideBlockingScope allow_wait; + bool ready_within_timeout = + chrome_observer_->WaitForProcessReady(base::Seconds(5)); + // Add DumpWithoutCrashing() if the process did not become ready after 5 + // seconds. After the timeout, the wait is skipped and execution continues. + // TODO(http://crbug.com/434977609): Determine whether a crash should be + // triggered after a timeout, as this may pose a security risk. + if (!ready_within_timeout) { + SCOPED_CRASH_KEY_BOOL("WaitForProcessReady", "IsExtensionProcess", + is_extension); + base::debug::DumpWithoutCrashing(); + } + + base::TimeDelta wait_duration = base::TimeTicks::Now() - start_time; + base::UmaHistogramTimes( + is_extension ? "Renderer.WaitTimeForProcessReady.ExtensionProcess" + : "Renderer.WaitTimeForProcessReady.RegularProcess", + wait_duration); +#endif // !BUILDFLAG(IS_ANDROID) +} + void ChromeContentRendererClient::WillSendRequest( WebLocalFrame* frame, ui::PageTransition transition_type, diff --git a/tools/under-control/src/components/policy/resources/templates/policies.yaml b/tools/under-control/src/components/policy/resources/templates/policies.yaml index 5a3a5e86..06abbfda 100755 --- a/tools/under-control/src/components/policy/resources/templates/policies.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policies.yaml @@ -1386,6 +1386,9 @@ policies: 1385: DeviceLoginScreenSecurityKeyPermitAttestation 1386: RestrictCoreSharingOnRenderer 1387: OriginKeyedProcessesEnabled + 1388: NTPShortcuts + 1389: AutoSignOutEnabled + 1390: ExtensionInstallCloudPolicyChecksEnabled atomic_groups: 1: Homepage 2: RemoteAccess diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/ContentSettings/AutoSelectCertificateForUrls.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/ContentSettings/AutoSelectCertificateForUrls.yaml index b280169d..3968c338 100755 --- a/tools/under-control/src/components/policy/resources/templates/policy_definitions/ContentSettings/AutoSelectCertificateForUrls.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/ContentSettings/AutoSelectCertificateForUrls.yaml @@ -26,6 +26,7 @@ features: per_profile: true future_on: - fuchsia +- android owners: - chromeos-commercial-networking-team@google.com - miersh@google.com diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/DeviceUpdate/DeviceRollbackAllowedMilestones.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/DeviceUpdate/DeviceRollbackAllowedMilestones.yaml index 93af4a8e..292fabab 100755 --- a/tools/under-control/src/components/policy/resources/templates/policy_definitions/DeviceUpdate/DeviceRollbackAllowedMilestones.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/DeviceUpdate/DeviceRollbackAllowedMilestones.yaml @@ -1,21 +1,25 @@ -caption: Number of milestones rollback is allowed +caption: Number of milestones kernel key increments are held back default: 4 desc: |- - Specifies the minimum number of $2Google ChromeOS milestones rollback should be allowed starting from the stable version at any time. + Depending on the board and critical vulnerability patches, $2Google ChromeOS milestones may include kernel key increments that are incompatible with earlier milestones. - Default is 0 for consumer, 4 (approx. half a year) for enterprise enrolled devices. + On consumer devices, these increments are applied as soon as a release with the increment is installed. In verified mode, this prevents rollback to older versions that do not have the increment. - Setting this policy prevents rollback protection to apply for at least this number of milestones. + On enrolled devices, this policy controls when the increment is applied: the increment can be held back for up to 4 milestones (approximately 4 months) after the first milestone with the increment was released on the Stable channel. This allows enterprises to postpone rollback protection for this duration. - Setting this policy to a lower value has a permanent effect: the device MAY not be able to roll back to earlier versions even after the policy is reset to a larger value. + Default is 4 for enrolled devices. - Actual rollback possibilities may also depend on the board and critical vulnerability patches. + Setting the value to 0 enforces the same behavior as in consumer devices. + + Setting this policy to a lower value can have a permanent effect: Once the increment is applied on the device, the device cannot rollback to milestone with lower kernel key version. + + This cannot be undone by setting the policy to a larger value afterwards. device_only: true example_value: 4 features: dynamic_refresh: true owners: -- mpolzer@google.com +- rbock@google.com - chromeos-commercial-remote-management@google.com schema: maximum: 4 diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Extensions/ExtensionInstallCloudPolicyChecksEnabled.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Extensions/ExtensionInstallCloudPolicyChecksEnabled.yaml new file mode 100755 index 00000000..b4feacde --- /dev/null +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Extensions/ExtensionInstallCloudPolicyChecksEnabled.yaml @@ -0,0 +1,40 @@ +caption: Enables additional cloud policy checks to allow/block installation of extensions. +default: false +desc: |- + This policy incidates to browsers that they need to perform additional checks for extensions such as checking if an extension is in a category blocked by administrator. + + This policy will automatically be set to Enabled if any rules are configured in the $1Google Admin console, + and will be Disabled otherwise. + + When this policy is set to Enabled, it signals to $1Google Chrome that it needs to consult the Cloud service to determine if an extension should be blocked. + This policy check is performed for new installations and on all currently installed extensions, both at startup and periodically. + + When this policy is set to Disabled, this signals to $1Google Chrome that it does not need to perform any additional checks + to determine if an extension should be blocked based on enterprise rules defined in the $1Google Admin console. + + If the extension is not allowed, $1Google Chrome will block the installation. For already installed extensions, $1Google Chrome will disable them. + + Chrome policies will take precedence over this policy such as if the extension is in ExtensionInstallAllowlist, ExtensionInstallBlocklist, + or ExtensionInstallForced. + +example_value: true +features: + cloud_only: true + dynamic_refresh: true + per_profile: true +items: +- caption: Validate whether an extension can be installed or not with a cloud service. + value: true +- caption: Do not validate whether an extension can be installed or not with a cloud service. + value: false +owners: +- macourteau@chromium.org +- pmoench@google.com +- file://extensions/OWNERS +schema: + type: boolean +future_on: +- chrome.* +- chrome_os +type: main +tags: [] diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/FloatingSso/AutoSignOutEnabled.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/FloatingSso/AutoSignOutEnabled.yaml new file mode 100755 index 00000000..4b4c436e --- /dev/null +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/FloatingSso/AutoSignOutEnabled.yaml @@ -0,0 +1,27 @@ +caption: Enable Automatic Sign-out Service +default: false +desc: |- + This policy controls whether a user is automatically signed out of their previous session when they sign in to a new $2Google ChromeOS device. + + Setting the policy to Enabled will sign out the user from their previous session upon a successful sign-in to a new $2Google ChromeOS device. + + Setting the policy to Disabled or not set will sign out the user from their previous session only if either FloatingSsoEnabled or FloatingWorkspaceV2Enabled policies are Enabled. +example_value: true +features: + dynamic_refresh: true + per_profile: true +future_on: +- chrome_os +items: +- caption: Sign out user from previous session upon sign-in to a new device + value: true +- caption: Sign out user from previous session upon sign-in to new device only if windows or cookies are synced + value: false +owners: +- andreydav@google.com +- mpetrisor@chromium.org +- chromeos-commercial-identity@google.com +schema: + type: boolean +tags: [] +type: main \ No newline at end of file diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/FloatingSso/policy_atomic_groups.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/FloatingSso/policy_atomic_groups.yaml index 0dfbe952..44845c69 100755 --- a/tools/under-control/src/components/policy/resources/templates/policy_definitions/FloatingSso/policy_atomic_groups.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/FloatingSso/policy_atomic_groups.yaml @@ -4,4 +4,4 @@ FloatingSso: - FloatingSsoEnabled - FloatingSsoDomainBlocklist - FloatingSsoDomainBlocklistExceptions - - FloatingSsoSessionCookiesIncluded + - FloatingSsoSessionCookiesIncluded \ No newline at end of file diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/GenerativeAI/GenAILocalFoundationalModelSettings.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/GenerativeAI/GenAILocalFoundationalModelSettings.yaml index 7f4bac06..d165ff51 100755 --- a/tools/under-control/src/components/policy/resources/templates/policy_definitions/GenerativeAI/GenAILocalFoundationalModelSettings.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/GenerativeAI/GenAILocalFoundationalModelSettings.yaml @@ -1,7 +1,7 @@ caption: Settings for GenAI local foundational model desc: |- - Configure how $1Google Chrome downloads the foundational GenAI model and uses for inference locally. + Configure how $1Google Chrome downloads the foundational GenAI model and uses for inference locally. When the policy is set to Allowed (0) or not set, the model is downloaded automatically, and used for inference. @@ -12,7 +12,7 @@ desc: |- default: 0 example_value: 1 features: - dynamic_refresh: false + dynamic_refresh: true per_profile: false future_on: - chrome_os diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/GenerativeAI/TabOrganizerSettings.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/GenerativeAI/TabOrganizerSettings.yaml index fc4f4626..f86c587a 100755 --- a/tools/under-control/src/components/policy/resources/templates/policy_definitions/GenerativeAI/TabOrganizerSettings.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/GenerativeAI/TabOrganizerSettings.yaml @@ -1,6 +1,8 @@ caption: Settings for Tab Organizer deprecated: true desc: |- + This policy is deprecated since tab organizer has been sunset as a feature. + Tab Organizer is an AI-based tool that automatically creates tab groups based on a user's open tabs. Suggestions are based on open tabs (but not page content). 0 = Allow the feature to be used, while allowing Google to use relevant data to improve its AI models. Relevant data may include prompts, inputs, outputs, source materials, and written feedback, depending on the feature. It may also be reviewed by humans to improve AI models. 0 is the default value, except when noted below. diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Kiosk/KioskApplicationLogCollectionEnabled.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Kiosk/KioskApplicationLogCollectionEnabled.yaml index 8c0ab1f5..de46fe97 100755 --- a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Kiosk/KioskApplicationLogCollectionEnabled.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Kiosk/KioskApplicationLogCollectionEnabled.yaml @@ -20,6 +20,6 @@ items: - caption: Disable Kiosk application logs value: false example_value: false -future_on: -- chrome_os +supported_on: +- chrome_os:141- tags: [] diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/BrowserThemeColor.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/BrowserThemeColor.yaml index cf63df68..952cc849 100755 --- a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/BrowserThemeColor.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/BrowserThemeColor.yaml @@ -12,6 +12,7 @@ features: per_profile: true future_on: - fuchsia +- ios owners: - igorruvinov@google.com - ydago@google.com diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/GloballyScopeHTTPAuthCacheEnabled.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/GloballyScopeHTTPAuthCacheEnabled.yaml index 9e60a7f1..73f1f412 100755 --- a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/GloballyScopeHTTPAuthCacheEnabled.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/GloballyScopeHTTPAuthCacheEnabled.yaml @@ -2,7 +2,7 @@ caption: Enable globally scoped HTTP auth cache desc: |- This policy configures a single global per profile cache with HTTP server authentication credentials. - If this policy is unset or disabled, the browser will use the default behavior of cross-site auth, which as of version 80, will be to scope HTTP server authentication credentials by top-level site, so if two sites use resources from the same authenticating domain, credentials will need to be provided independently in the context of both sites. Cached proxy credentials will be reused across sites. + If this policy is unset or disabled, the browser will use the default behavior of cross-site auth, this behavior will be to scope HTTP server authentication credentials by top-level site, so if two sites use resources from the same authenticating domain, credentials will need to be provided independently in the context of both sites. Cached proxy credentials will be reused across sites. If the policy is enabled, HTTP auth credentials entered in the context of one site will automatically be used in the context of another. @@ -29,5 +29,6 @@ schema: supported_on: - chrome.*:80- - chrome_os:80- +- android:141- tags: [] type: main diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPCustomBackgroundEnabled.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPCustomBackgroundEnabled.yaml index e47378ee..f2320125 100755 --- a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPCustomBackgroundEnabled.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPCustomBackgroundEnabled.yaml @@ -11,6 +11,7 @@ features: per_profile: true future_on: - fuchsia +- ios items: - caption: Users can customize the New Tab page background value: true diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPShortcuts.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPShortcuts.yaml new file mode 100755 index 00000000..8e43b852 --- /dev/null +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/NTPShortcuts.yaml @@ -0,0 +1,51 @@ +caption: Setting shortcuts on the New Tab Page (Beta) +desc: |- + In development: for early preview only. + + Setting the policy pre-configures up to 10 custom shortcuts on the $1Google Chrome New Tab page. + + If set, users will see these shortcuts by default and users can toggle between “My shortcuts," "Most visited sites" or "My organization's shortcuts" on the "Customize Chrome" panel. If empty or unset, the user will only be able to toggle between “My shortcuts" or "Most visited sites" on the "Customize Chrome" panel. + + Shortcut URLs must be unique. + + If allow_user_edit is set to true, users can change the name of the shortcut. If set to false or unset, users cannot edit the name. + + If allow_user_delete is set to true, users can remove the shortcut. If set to false or unset, users cannot remove the shortcut. +example_value: +- name: Google + url: https://www.google.com +- name: YouTube + url: https://www.youtube.com +- name: Google Drive + url: https://www.drive.google.com + allow_user_edit: true + allow_user_delete: true +features: + dynamic_refresh: true + per_profile: true +owners: +- alexwchen@chromium.org +- rtatum@google.com +- tiborg@chromium.org +- chrome-desktop-ntp@google.com +schema: + type: array + items: + type: object + properties: + name: + type: string + url: + type: string + allow_user_edit: + type: boolean + allow_user_delete: + type: boolean + required: + - name + - url +supported_on: +- chrome.*:141- +- chrome_os:141- +tags: [] +type: dict diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/ProvisionManagedClientCertificateForBrowser.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/ProvisionManagedClientCertificateForBrowser.yaml index 63c9e9f1..2c7011fd 100755 --- a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/ProvisionManagedClientCertificateForBrowser.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/ProvisionManagedClientCertificateForBrowser.yaml @@ -10,6 +10,8 @@ desc: |- supported_on: - chrome.*:136- +future_on: +- android features: dynamic_refresh: true per_profile: false diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/ProvisionManagedClientCertificateForUser.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/ProvisionManagedClientCertificateForUser.yaml index 1f3dab87..b22d5c85 100755 --- a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/ProvisionManagedClientCertificateForUser.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Miscellaneous/ProvisionManagedClientCertificateForUser.yaml @@ -11,6 +11,8 @@ supported_on: - chrome.win:126- - chrome.mac:126- - chrome.linux:128- +future_on: +- android features: dynamic_refresh: true per_profile: true diff --git a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Signin/ProfileSeparationSettings.yaml b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Signin/ProfileSeparationSettings.yaml index 1bd3e90a..6e799c52 100755 --- a/tools/under-control/src/components/policy/resources/templates/policy_definitions/Signin/ProfileSeparationSettings.yaml +++ b/tools/under-control/src/components/policy/resources/templates/policy_definitions/Signin/ProfileSeparationSettings.yaml @@ -17,6 +17,8 @@ desc: |- This policy has no effect when set on a machine level. + This policy does not apply to or function within Incognito mode. + supported_on: - chrome.*:119- diff --git a/tools/under-control/src/content/browser/web_contents/web_contents_impl.cc b/tools/under-control/src/content/browser/web_contents/web_contents_impl.cc index be06cbb8..c1cd8903 100755 --- a/tools/under-control/src/content/browser/web_contents/web_contents_impl.cc +++ b/tools/under-control/src/content/browser/web_contents/web_contents_impl.cc @@ -54,7 +54,6 @@ #include "cc/input/browser_controls_offset_tag_modifications.h" #include "components/attribution_reporting/features.h" #include "components/download/public/common/download_stats.h" -#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h" #include "components/input/cursor_manager.h" #include "components/input/features.h" #include "components/input/render_widget_host_input_event_router.h" @@ -87,7 +86,6 @@ #include "content/browser/download/save_package.h" #include "content/browser/fenced_frame/fenced_frame.h" #include "content/browser/find_request_manager.h" -#include "content/browser/fingerprinting_protection/canvas_noise_token_data.h" #include "content/browser/gpu/gpu_data_manager_impl.h" #include "content/browser/guest_page_holder_impl.h" #include "content/browser/host_zoom_map_impl.h" @@ -96,6 +94,7 @@ #include "content/browser/permissions/permission_controller_impl.h" #include "content/browser/permissions/permission_util.h" #include "content/browser/preloading/prefetch/prefetch_service.h" +#include "content/browser/preloading/prefetch/prefetch_type.h" #include "content/browser/preloading/preloading.h" #include "content/browser/preloading/prerender/prerender_final_status.h" #include "content/browser/preloading/prerender/prerender_host_registry.h" @@ -212,6 +211,7 @@ #include "ui/accessibility/ax_tree_combiner.h" #include "ui/accessibility/platform/browser_accessibility.h" #include "ui/accessibility/platform/browser_accessibility_manager.h" +#include "ui/base/clipboard/clipboard_metadata.h" #include "ui/base/ime/mojom/virtual_keyboard_types.mojom.h" #include "ui/base/mojom/window_show_state.mojom.h" #include "ui/base/pointer/pointer_device.h" @@ -234,14 +234,16 @@ #endif // BUILDFLAG(IS_WIN) #if BUILDFLAG(IS_ANDROID) -#include "base/android/build_info.h" +#include "base/android/device_info.h" #include "base/check.h" #include "content/browser/android/java_interfaces_impl.h" #include "content/browser/android/nfc_host.h" +#include "content/browser/android/selection/selection_popup_controller.h" #include "content/browser/navigation_transitions/back_forward_transition_animation_manager_android.h" #include "content/browser/web_contents/web_contents_android.h" #include "content/browser/web_contents/web_contents_view_android.h" #include "content/public/browser/android/child_process_importance.h" +#include "content/public/browser/android/selection_popup_delegate.h" #include "services/device/public/mojom/nfc.mojom.h" #include "services/service_manager/public/cpp/interface_provider.h" #include "ui/android/event_forwarder.h" @@ -294,8 +296,7 @@ enum class CrashRepHandlingOutcome { constexpr auto kUpdateLoadStatesInterval = base::Milliseconds(250); // Kill switch for inner WebContents visibility updates. -BASE_FEATURE(kUpdateInnerWebContentsVisibility, - "UpdateInnerWebContentsVisibility", +BASE_FEATURE(UpdateInnerWebContentsVisibility, base::FEATURE_ENABLED_BY_DEFAULT); using LifecycleState = RenderFrameHost::LifecycleState; @@ -561,7 +562,7 @@ bool IsAutomaticFullscreenGranted(RenderFrameHost* host) { // enforced later should resolve most inaccuracies, but this early enforcement // is needed to ensure bounds indicate the appropriate display. int64_t AdjustWindowRectForDisplay(gfx::Rect* rect, RenderFrameHost* host) { - auto* screen = display::Screen::GetScreen(); + auto* screen = display::Screen::Get(); auto display = screen->GetDisplayMatching(*rect); // Check, but do not prompt, for permission to place windows on other screens. @@ -1192,8 +1193,18 @@ void WebContentsImpl::WebContentsTreeNode::OnFrameTreeNodeDestroyed( "FrameTreeNode in its outer WebContents that hosts it."; node->RemoveObserver(this); - // Deletes |this| too. - outer_web_contents_->node_.DetachInnerWebContents(current_web_contents_); + + if (outer_web_contents_->node_.IsUnownedInnerWebContents( + current_web_contents_)) { + // Detach at all levels (WebContentsTreeNode and FrameTreeNode, + // RenderFrameProxyHost, etc.). This will not delete `this` (the inner + // WebContents). + outer_web_contents_->DetachUnownedInnerWebContents(current_web_contents_); + } else { + // Detach only at the WebContentsTreeNode level. This will delete `this` ( + // the inner WebContents). + outer_web_contents_->node_.DetachInnerWebContents(current_web_contents_); + } } FrameTree* WebContentsImpl::WebContentsTreeNode::focused_frame_tree() { @@ -1412,16 +1423,10 @@ WebContentsImpl::WebContentsImpl(BrowserContext* browser_context) safe_area_insets_host_ = SafeAreaInsetsHost::Create(this); #endif - ui::NativeTheme* native_theme = ui::NativeTheme::GetInstanceForWeb(); + auto* const native_theme = ui::NativeTheme::GetInstanceForWeb(); native_theme_observation_.Observe(native_theme); slow_web_preference_cache_observation_.Observe( SlowWebPreferenceCache::GetInstance()); - using_dark_colors_ = native_theme->ShouldUseDarkColors(); - in_forced_colors_ = native_theme->InForcedColorsMode(); - preferred_color_scheme_ = native_theme->GetPreferredColorScheme(); - preferred_contrast_ = native_theme->GetPreferredContrast(); - prefers_reduced_transparency_ = native_theme->GetPrefersReducedTransparency(); - inverted_colors_ = native_theme->GetInvertedColors(); renderer_preferences_.caret_blink_interval = native_theme->GetCaretBlinkInterval(); #if BUILDFLAG(IS_CHROMEOS) @@ -1436,12 +1441,6 @@ WebContentsImpl::WebContentsImpl(BrowserContext* browser_context) if (base::FeatureList::IsEnabled(network::features::kSharedStorageAPI)) { SharedStorageBudgetCharger::CreateForWebContents(this); } - - if (base::FeatureList::IsEnabled( - fingerprinting_protection_interventions::features::kCanvasNoise)) { - renderer_preferences_.canvas_noise_token = - CanvasNoiseTokenData::GetToken(browser_context); - } } WebContentsImpl::~WebContentsImpl() { @@ -2502,14 +2501,6 @@ void WebContentsImpl::SetUserAgentOverride( ua_override); } -void WebContentsImpl::SetRendererInitiatedUserAgentOverrideOption( - NavigationController::UserAgentOverrideOption option) { - OPTIONAL_TRACE_EVENT0( - "content", - "WebContentsImpl::SetRendererInitiatedUserAgentOverrideOption"); - renderer_initiated_user_agent_override_option_ = option; -} - const blink::UserAgentOverride& WebContentsImpl::GetUserAgentOverride() { return renderer_preferences_.user_agent_override; } @@ -2524,22 +2515,14 @@ const blink::UserAgentOverride& WebContentsImpl::GetUserAgentOverride( } bool WebContentsImpl::ShouldOverrideUserAgentForRendererInitiatedNavigation() { + // Inherits the current entry setting if it exists and not initial. NavigationEntryImpl* current_entry = GetController().GetLastCommittedEntry(); - if (!current_entry || current_entry->IsInitialEntry()) { - return should_override_user_agent_in_new_tabs_; + if (current_entry && !current_entry->IsInitialEntry()) { + return current_entry->GetIsOverridingUserAgent(); } - - switch (renderer_initiated_user_agent_override_option_) { - case NavigationController::UA_OVERRIDE_INHERIT: - return current_entry->GetIsOverridingUserAgent(); - case NavigationController::UA_OVERRIDE_TRUE: - return true; - case NavigationController::UA_OVERRIDE_FALSE: - return false; - default: - break; - } - return false; + // Otherwise, follows the setting from the last user-agent override. See + // `override_in_new_tabs` in `SetUserAgentOverride()`. + return should_override_user_agent_in_new_tabs_; } bool WebContentsImpl::IsWebContentsOnlyAccessibilityModeForTesting() { @@ -3032,6 +3015,10 @@ bool WebContentsImpl::HasRecentInteraction() { return delta <= kMaxInterval; } +base::TimeTicks WebContentsImpl::GetLastInteractionTimeTicks() { + return last_interaction_time_; +} + WebContents::ScopedIgnoreInputEvents WebContentsImpl::IgnoreInputEvents( std::optional audit_callback) { OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::IgnoreInputEvents"); @@ -3404,10 +3391,15 @@ void WebContentsImpl::DetachUnownedInnerWebContents( inner_web_contents_impl->GetPrimaryFrameTree().ForEachRenderViewHost( [&list_of_rvh_with_rwhv](RenderViewHostImpl* rvh) { if (rvh->GetWidget() && rvh->GetWidget()->GetView()) { - CHECK( - rvh->GetWidget()->GetView()->IsRenderWidgetHostViewChildFrame()); + // While in theory only child frame RWHVs should exist at this stage, + // in practice, a race with navigation cleanup could result in a main + // frame RWHV that is pending deletion still existing here. + // This might happen when a WebContents is destroyed immediately + // after it navigates and then attaches to an outer WebContents. + if (rvh->GetWidget()->GetView()->IsRenderWidgetHostViewChildFrame()) { + list_of_rvh_with_rwhv.push_back(rvh); + } rvh->GetWidget()->GetView()->Destroy(); - list_of_rvh_with_rwhv.push_back(rvh); } }); @@ -3706,6 +3698,10 @@ const blink::web_pref::WebPreferences WebContentsImpl::ComputeWebPreferences( gfx::Animation::ScrollAnimationsEnabledBySystem()); prefs.prefers_reduced_motion = gfx::Animation::PrefersReducedMotion(); + + const auto* const theme = ui::NativeTheme::GetInstanceForWeb(); + prefers_reduced_transparency_ = theme->GetPrefersReducedTransparency(); + inverted_colors_ = theme->GetInvertedColors(); prefs.prefers_reduced_transparency = prefers_reduced_transparency_; prefs.inverted_colors = inverted_colors_; @@ -3721,7 +3717,7 @@ const blink::web_pref::WebPreferences WebContentsImpl::ComputeWebPreferences( // TODO(crbug.com/40925473): GetPrimaryDisplay() won't be correct for // externally connected displays. Get the display where Chrome is opened // instead. - display::Display display = display::Screen::GetScreen()->GetPrimaryDisplay(); + display::Display display = display::Screen::Get()->GetPrimaryDisplay(); gfx::Size size = display.GetSizeInPixel(); int min_width = size.width() < size.height() ? size.width() : size.height(); int min_width_in_dp = @@ -3832,7 +3828,7 @@ const blink::web_pref::WebPreferences WebContentsImpl::ComputeWebPreferences( #if BUILDFLAG(IS_ANDROID) if (base::FeatureList::IsEnabled(features::kWebauthnDisabledOnAuto) && - base::android::BuildInfo::GetInstance()->is_automotive()) { + base::android::device_info::is_automotive()) { prefs.disable_webauthn = true; } #endif // BUILDFLAG(IS_ANDROID) @@ -4426,12 +4422,6 @@ void WebContentsImpl::RenderWidgetWasResized( width_changed); } -bool WebContentsImpl::PreHandleMouseEvent(const blink::WebMouseEvent& event) { - OPTIONAL_TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("content.verbose"), - "WebContentsImpl::PreHandleMouseEvent"); - return delegate_ ? delegate_->PreHandleMouseEvent(this, event) : false; -} - void WebContentsImpl::PreHandleDragUpdate(const DropData& drop_data, const gfx::PointF& client_pt) { if (delegate_) { @@ -4623,16 +4613,12 @@ void WebContentsImpl::EnterFullscreenMode( DCHECK(CanEnterFullscreenMode(requesting_frame)); DCHECK(requesting_frame->IsActive()); DCHECK(ContainsOrIsFocusedWebContents()); - if (base::FeatureList::IsEnabled( - features::kAutomaticFullscreenContentSetting)) { - // Ensure the window is made active to take input focus. The user may have - // activated another window between making a gesture and the site handling - // that gesture to request fullscreen. The experimental automatic fullscreen - // feature also enables allowlisted sites to request fullscreen without any - // gesture, even if the window was inactive. Note: requests from inactive - // tabs of multi-tab windows should be rejected before reaching this code. - Activate(); - } + // Ensure the window is made active to take input focus. The window may be + // inactive when sites request fullscreen via capability delegation, consume + // transient activation from a gesture made before another window was focused, + // or if the site has been granted the Automatic Fullscreen content setting. + // Note: requests by inactive tabs of multi-tab windows are rejected earlier. + Activate(); // When WebView is the `delegate_` we can end up with VisualProperties changes // synchronously. Notify the view ahead so it can handle the transition. @@ -6785,21 +6771,6 @@ void WebContentsImpl::GenerateMHTML( const MHTMLGenerationParams& params, base::OnceCallback callback) { OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::GenerateMHTML"); - base::OnceCallback wrapper_callback = - base::BindOnce( - [](base::OnceCallback size_callback, - const MHTMLGenerationResult& result) { - std::move(size_callback).Run(result.file_size); - }, - std::move(callback)); - MHTMLGenerationManager::GetInstance()->SaveMHTML(this, params, - std::move(wrapper_callback)); -} - -void WebContentsImpl::GenerateMHTMLWithResult( - const MHTMLGenerationParams& params, - MHTMLGenerationResult::GenerateMHTMLCallback callback) { - OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::GenerateMHTMLWithResult"); MHTMLGenerationManager::GetInstance()->SaveMHTML(this, params, std::move(callback)); } @@ -7045,9 +7016,10 @@ int WebContentsImpl::DownloadImageFromAxNode(const ui::AXTreeID tree_id, tree_id.ToString() + "," + base::ToString(node_id)); DCHECK_CURRENTLY_ON(BrowserThread::UI); const int download_id = GetNextDownloadId(); - // Always use the main frame when downloading via A11y ids. - RenderFrameHostImpl* main_frame = GetPrimaryMainFrame(); - if (!main_frame->IsRenderFrameLive()) { + + RenderFrameHostImpl* target_frame = + RenderFrameHostImpl::FromAXTreeID(tree_id); + if (!target_frame || !target_frame->IsRenderFrameLive()) { // If the renderer process is dead (i.e. crash, or memory pressure on // Android), the downloader service will be invalid. Pre-Mojo, this would // hang the callback indefinitely since the IPC would be dropped. Now, @@ -7057,19 +7029,21 @@ int WebContentsImpl::DownloadImageFromAxNode(const ui::AXTreeID tree_id, GetUIThreadTaskRunner({})->PostTask( FROM_HERE, base::BindOnce(&WebContentsImpl::OnDidDownloadImage, - weak_factory_.GetWeakPtr(), main_frame->GetWeakPtr(), + weak_factory_.GetWeakPtr(), + target_frame ? target_frame->GetWeakPtr() : nullptr, std::move(callback), download_id, GURL(), 400, std::vector(), std::vector())); return download_id; } - CHECK_EQ(main_frame->GetAXTreeID(), tree_id); - main_frame->GetMojoImageDownloader()->DownloadImageFromAxNode( + CHECK_EQ(target_frame->GetAXTreeID(), tree_id); + target_frame->GetMojoImageDownloader()->DownloadImageFromAxNode( node_id, preferred_size, max_bitmap_size, bypass_cache, base::BindOnce(&WebContentsImpl::OnDidDownloadImage, - weak_factory_.GetWeakPtr(), main_frame->GetWeakPtr(), + weak_factory_.GetWeakPtr(), target_frame->GetWeakPtr(), std::move(callback), download_id, GURL())); return download_id; } + int WebContentsImpl::DownloadImage( const GURL& url, bool is_favicon, @@ -8960,6 +8934,10 @@ void WebContentsImpl::RunFileChooser( // Do not allow background tab to open file chooser. return; } + if (!delegate_->IsContentsActive(this)) { + // Do not allow inactive tabs to open file chooser. + return; + } if (active_file_chooser_) { // Only allow one active file chooser at one time. return; @@ -9097,11 +9075,6 @@ const blink::RendererPreferences& WebContentsImpl::GetRendererPrefs( *render_view_host->frame_tree()->GetMainFrame())) { return guest->GetRendererPrefs(); } - if (base::FeatureList::IsEnabled( - fingerprinting_protection_interventions::features::kCanvasNoise)) { - renderer_preferences_.canvas_noise_token = - CanvasNoiseTokenData::GetToken(GetBrowserContext()); - } RenderViewHostImpl::GetPlatformSpecificPrefs(&renderer_preferences_); return renderer_preferences_; } @@ -9195,7 +9168,7 @@ void WebContentsImpl::InnerWebContentsCreated(WebContents* inner_web_contents) { void WebContentsImpl::InnerWebContentsAttached( WebContents* inner_web_contents) { - OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::InnerWebContentsDetached"); + OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::InnerWebContentsAttached"); if (inner_web_contents->IsCurrentlyAudible()) { OnAudioStateChanged(); } @@ -9203,7 +9176,7 @@ void WebContentsImpl::InnerWebContentsAttached( void WebContentsImpl::InnerWebContentsDetached( WebContents* inner_web_contents) { - OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::InnerWebContentsCreated"); + OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::InnerWebContentsDetached"); if (!IsBeingDestroyed()) { OnAudioStateChanged(); } @@ -9427,10 +9400,10 @@ void WebContentsImpl::DidStartLoading(FrameTreeNode* frame_tree_node) { OPTIONAL_TRACE_EVENT1("content", "WebContentsImpl::DidStartLoading", "frame_tree_node", frame_tree_node); - TRACE_EVENT_NESTABLE_ASYNC_BEGIN2( - "browser,navigation", "WebContentsImpl Loading", this, "URL", "NULL", - "Primary Main FrameTreeNode id", - GetPrimaryFrameTree().root()->frame_tree_node_id()); + TRACE_EVENT_BEGIN("browser,navigation", "WebContentsImpl Loading", + perfetto::Track::FromPointer(this), "URL", "NULL", + "Primary Main FrameTreeNode id", + GetPrimaryFrameTree().root()->frame_tree_node_id()); SCOPED_UMA_HISTOGRAM_TIMER("WebContentsObserver.DidStartLoading"); observers_.NotifyObservers(&WebContentsObserver::DidStartLoading); @@ -9463,8 +9436,9 @@ void WebContentsImpl::DidStopLoading() { std::string url = (entry ? entry->GetVirtualURL().possibly_invalid_spec() : "NULL"); - TRACE_EVENT_NESTABLE_ASYNC_END1("browser,navigation", - "WebContentsImpl Loading", this, "URL", url); + // WebContentsImpl Loading + TRACE_EVENT_END("browser,navigation", perfetto::Track::FromPointer(this), + "URL", url); SCOPED_UMA_HISTOGRAM_TIMER("WebContentsObserver.DidStopLoading"); observers_.NotifyObservers(&WebContentsObserver::DidStopLoading); @@ -10568,6 +10542,12 @@ service_manager::InterfaceProvider* WebContentsImpl::GetJavaInterfaces() { return java_interfaces_.get(); } +void WebContentsImpl::SetSelectionPopupDelegate( + std::unique_ptr delegate) { + SelectionPopupController::FromWebContents(*this)->SetDelegate( + std::move(delegate)); +} + #endif bool WebContentsImpl::CompletedFirstVisuallyNonEmptyPaint() { @@ -11410,7 +11390,7 @@ std::vector WebContentsImpl::GetUnattachedOwnedNodes( void WebContentsImpl::IsClipboardPasteAllowedByPolicy( const ClipboardEndpoint& source, const ClipboardEndpoint& destination, - const ClipboardMetadata& metadata, + const ui::ClipboardMetadata& metadata, ClipboardPasteData clipboard_paste_data, IsClipboardPasteAllowedCallback callback) { ++suppress_unresponsive_renderer_count_; @@ -11623,59 +11603,39 @@ void WebContentsImpl::SetVisibilityForChildViews(bool visible) { GetPrimaryMainFrame()->SetVisibilityForChildViews(visible); } -void WebContentsImpl::OnNativeThemeUpdated(ui::NativeTheme* observed_theme) { - OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::OnNativeThemeUpdated"); - DCHECK(native_theme_observation_.IsObservingSource(observed_theme)); - - const bool using_dark_colors = observed_theme->ShouldUseDarkColors(); - const bool in_forced_colors = observed_theme->InForcedColorsMode(); - const ui::NativeTheme::PreferredColorScheme preferred_color_scheme = - observed_theme->GetPreferredColorScheme(); - const ui::NativeTheme::PreferredContrast preferred_contrast = - observed_theme->GetPreferredContrast(); - const bool prefers_reduced_transparency = - observed_theme->GetPrefersReducedTransparency(); - const bool inverted_colors = observed_theme->GetInvertedColors(); - const base::TimeDelta caret_blink_interval = - observed_theme->GetCaretBlinkInterval(); -#if BUILDFLAG(IS_CHROMEOS) - const bool use_overlay_scrollbar = observed_theme->use_overlay_scrollbar(); -#endif - bool preferences_changed = false; - - if (using_dark_colors_ != using_dark_colors) { - using_dark_colors_ = using_dark_colors; - preferences_changed = true; - } - if (in_forced_colors_ != in_forced_colors) { - in_forced_colors_ = in_forced_colors; - preferences_changed = true; - } - if (preferred_color_scheme_ != preferred_color_scheme) { - preferred_color_scheme_ = preferred_color_scheme; - preferences_changed = true; - } - if (preferred_contrast_ != preferred_contrast) { - preferred_contrast_ = preferred_contrast; - preferences_changed = true; - } - if (prefers_reduced_transparency_ != prefers_reduced_transparency) { - prefers_reduced_transparency_ = prefers_reduced_transparency; - preferences_changed = true; - } - if (inverted_colors_ != inverted_colors) { - inverted_colors_ = inverted_colors; - preferences_changed = true; +void WebContentsImpl::HandleColorRelatedStateChanges() { + if (blink::ColorProviderColorMaps color_maps = GetColorProviderColorMaps(); + color_maps_ != color_maps) { + color_maps_.swap(color_maps); + ExecutePageBroadcastMethodForAllPages([this](RenderViewHostImpl* rvh) { + if (auto& broadcast = rvh->GetAssociatedPageBroadcast()) { + broadcast->UpdateColorProviders(color_maps_); + } + }); } - if (preferences_changed) { + if (const auto* const theme = ui::NativeTheme::GetInstanceForWeb(); + prefers_reduced_transparency_ != theme->GetPrefersReducedTransparency() || + inverted_colors_ != theme->GetInvertedColors() || + GetContentClient() + ->browser() + ->WebPreferencesNeedUpdateForColorRelatedStateChanges( + *this, *GetPrimaryMainFrame()->GetSiteInstance())) { NotifyPreferencesChanged(); } +} +void WebContentsImpl::OnNativeThemeUpdated(ui::NativeTheme* observed_theme) { + OPTIONAL_TRACE_EVENT0("content", "WebContentsImpl::OnNativeThemeUpdated"); + DCHECK_EQ(observed_theme, ui::NativeTheme::GetInstanceForWeb()); + + HandleColorRelatedStateChanges(); + + const auto caret_blink_interval = observed_theme->GetCaretBlinkInterval(); +#if BUILDFLAG(IS_CHROMEOS) + const auto use_overlay_scrollbar = observed_theme->use_overlay_scrollbar(); +#endif bool renderer_preference_changed = false; - // Only caret blink interval from NativeTheme impacts - // blink::RendererPreferences, which are not synced in - // NotifyPreferencesChanged(). Sync these if the interval has changed. if (renderer_preferences_.caret_blink_interval != caret_blink_interval) { renderer_preferences_.caret_blink_interval = caret_blink_interval; renderer_preference_changed = true; @@ -11701,32 +11661,14 @@ void WebContentsImpl::OnColorProviderChanged() { // observed source being reset. If this is the case fallback to the default // source. if (!GetColorProviderSource()) { + // This will synchronously call `OnColorProviderChanged()` again. SetColorProviderSource(DefaultColorProviderSource::GetInstance()); return; } - blink::ColorProviderColorMaps color_map = GetColorProviderColorMaps(); - ExecutePageBroadcastMethodForAllPages([&color_map](RenderViewHostImpl* rvh) { - if (auto& broadcast = rvh->GetAssociatedPageBroadcast()) { - broadcast->UpdateColorProviders(color_map); - } - }); - observers_.NotifyObservers(&WebContentsObserver::OnColorProviderChanged); - // Web preferences may change in response to events such as - // OnNativeThemeUpdated(). However web preferences may also depend on - // ColorProvider state and the associated ColorProvider may change - // independently of the native theme. Ensure we propagate web preferences here - // to cover this case. - // OnColorProviderChanged() can be emitted during the WebContentsImpl's - // constructor in response to setting the ColorProviderSource. In this case - // Init() will not yet have been called and the current frame host will not be - // defined, so we must guard against this here. - // TODO(tluk): There may be a more appropriate way to identify this condition. - if (GetRenderManager()->current_frame_host()) { - NotifyPreferencesChanged(); - } + HandleColorRelatedStateChanges(); } const ui::ColorProvider& WebContentsImpl::GetColorProvider() const { @@ -12041,11 +11983,6 @@ std::unique_ptr WebContentsImpl::StartPrefetch( base::WeakPtr attempt, std::optional holdback_status_override, std::optional ttl) { - if (!base::FeatureList::IsEnabled( - features::kPrefetchBrowserInitiatedTriggers)) { - return nullptr; - } - PrefetchService* prefetch_service = BrowserContextImpl::From(GetBrowserContext())->GetPrefetchService(); if (!prefetch_service) { @@ -12242,6 +12179,19 @@ void WebContentsImpl::SetLongPressLinkSelectText(bool enabled) { long_press_link_select_text_ = enabled; NotifyPreferencesChanged(); } + +void WebContentsImpl::SetCanAcceptLoadDrops(bool enabled) { + if (renderer_preferences_.can_accept_load_drops == enabled) { + return; + } + renderer_preferences_.can_accept_load_drops = enabled; + SyncRendererPrefs(); +} + +bool WebContentsImpl::GetCanAcceptLoadDropsForTesting() { + return renderer_preferences_.can_accept_load_drops; +} + #endif net::handles::NetworkHandle WebContentsImpl::GetTargetNetwork() { diff --git a/tools/under-control/src/content/child/runtime_features.cc b/tools/under-control/src/content/child/runtime_features.cc index 0abe213d..f5dace05 100755 --- a/tools/under-control/src/content/child/runtime_features.cc +++ b/tools/under-control/src/content/child/runtime_features.cc @@ -50,7 +50,7 @@ #include "ui/native_theme/native_theme_utils.h" #if BUILDFLAG(IS_ANDROID) -#include "base/android/build_info.h" +#include "base/android/android_info.h" #endif #if BUILDFLAG(ENABLE_VR) @@ -106,8 +106,8 @@ void SetRuntimeFeatureDefaultsForPlatform( #endif #if BUILDFLAG(IS_ANDROID) - if (base::android::BuildInfo::GetInstance()->sdk_int() >= - base::android::SDK_VERSION_P) { + if (base::android::android_info::sdk_int() >= + base::android::android_info::SDK_VERSION_P) { // Display Cutout is limited to Android P+. WebRuntimeFeatures::EnableDisplayCutoutAPI(true); } @@ -196,6 +196,8 @@ void SetRuntimeFeaturesFromChromiumFeatures() { {wf::EnableAudioOutputDevices, raw_ref(features::kAAudioPerStreamDeviceSelection)}, #endif + {wf::EnableAuthenticatorPasswordsOnlyImmediateRequests, + raw_ref(device::kAuthenticatorPasswordsOnlyImmediateRequests)}, {wf::EnableBackgroundFetch, raw_ref(features::kBackgroundFetch)}, {wf::EnableBoundaryEventDispatchTracksNodeRemoval, raw_ref(blink::features::kBoundaryEventDispatchTracksNodeRemoval)}, @@ -223,9 +225,7 @@ void SetRuntimeFeaturesFromChromiumFeatures() { kSetOnlyIfOverridden}, {wf::EnableSharedStorageAPI, raw_ref(features::kPrivacySandboxAdsAPIsM1Override)}, - {wf::EnableFedCmMultipleIdentityProviders, - raw_ref(features::kFedCmMultipleIdentityProviders), - kSetOnlyIfOverridden}, + {wf::EnableFencedFrames, raw_ref(features::kPrivacySandboxAdsAPIsOverride), kSetOnlyIfOverridden}, @@ -239,6 +239,11 @@ void SetRuntimeFeaturesFromChromiumFeatures() { #if BUILDFLAG(IS_ANDROID) {wf::EnableGetDisplayMedia, raw_ref(features::kUserMediaScreenCapturing)}, + {wf::EnableRegionCapture, + raw_ref(features::kUserMediaScreenCapturing)}, + {wf::EnableElementCapture, + raw_ref(features::kUserMediaScreenCapturing)}, + #endif {wf::EnableInstalledApp, raw_ref(features::kInstalledApp)}, {wf::EnableIntegrityPolicyScript, @@ -284,7 +289,7 @@ void SetRuntimeFeaturesFromChromiumFeatures() { kSetOnlyIfOverridden}, {wf::EnableWebIdentityDigitalCredentials, raw_ref(features::kWebIdentityDigitalCredentials), - kSetOnlyIfOverridden}, + kDefault}, {wf::EnableWebIdentityDigitalCredentialsCreation, raw_ref(features::kWebIdentityDigitalCredentialsCreation), kSetOnlyIfOverridden}, @@ -355,7 +360,6 @@ void SetRuntimeFeaturesFromChromiumFeatures() { raw_ref(network::features::kCompressionDictionaryTransportBackend)}, {"CookieDeprecationFacilitatedTesting", raw_ref(features::kCookieDeprecationFacilitatedTesting)}, - {"CSPHashesV1", raw_ref(network::features::kCSPScriptSrcHashesInV1)}, {"DocumentPolicyIncludeJSCallStacksInCrashReports", raw_ref(blink::features:: kDocumentPolicyIncludeJSCallStacksInCrashReports), @@ -378,12 +382,13 @@ void SetRuntimeFeaturesFromChromiumFeatures() { raw_ref(network::features::kReduceAcceptLanguage)}, {"RelatedWebsitePartitionAPI", raw_ref(net::features::kRelatedWebsitePartitionAPI)}, -#if BUILDFLAG(IS_ANDROID) - {"Serial", raw_ref(device::features::kBluetoothRfcommAndroid)}, -#endif {"SerialPortConnected", raw_ref(features::kSerialPortConnected)}, {"SignatureBasedIntegrity", raw_ref(network::features::kSRIMessageSignatureEnforcement)}, +#if BUILDFLAG(IS_MAC) + {"SystemDefaultAccentColors", + raw_ref(features::kUseSystemDefaultAccentColors)}, +#endif {"TopicsAPI", raw_ref(features::kPrivacySandboxAdsAPIsOverride), kSetOnlyIfOverridden}, {"TopicsAPI", raw_ref(features::kPrivacySandboxAdsAPIsM1Override)}, @@ -408,8 +413,6 @@ void SetRuntimeFeaturesFromChromiumFeatures() { #if BUILDFLAG(IS_ANDROID) {"WebAppLaunchQueue", raw_ref(features::kAndroidWebAppLaunchHandler)}, #endif - {"WebAuthenticationNewBfCacheHandlingBlink", - raw_ref(device::kWebAuthnNewBfCacheHandling)}, {"LocalNetworkAccessPermissionPolicy", raw_ref(network::features::kLocalNetworkAccessChecks)}}; for (const auto& mapping : runtimeFeatureNameToChromiumFeatureMapping) { @@ -639,6 +642,13 @@ void ResolveInvalidConfigurations() { << blink::features::kPermissionElement.name << " instead."; WebRuntimeFeatures::EnablePermissionElement(false); } + + // CSP Hashes in V1 cannot be enabled without the support of the network + // service. + if (!base::FeatureList::IsEnabled( + network::features::kCSPScriptSrcHashesInV1)) { + WebRuntimeFeatures::EnableCSPHashesV1(false); + } } } // namespace diff --git a/tools/under-control/src/content/public/browser/content_browser_client.cc b/tools/under-control/src/content/public/browser/content_browser_client.cc index 689203b1..051c38eb 100755 --- a/tools/under-control/src/content/public/browser/content_browser_client.cc +++ b/tools/under-control/src/content/public/browser/content_browser_client.cc @@ -88,6 +88,7 @@ #include "third_party/blink/public/mojom/file_system_access/file_system_access_error.mojom.h" #include "third_party/blink/public/mojom/origin_trials/origin_trials_settings.mojom.h" #include "third_party/blink/public/mojom/payments/secure_payment_confirmation_service.mojom.h" +#include "ui/base/clipboard/clipboard_metadata.h" #include "ui/gfx/image/image_skia.h" #include "ui/shell_dialogs/select_file_policy.h" #include "url/gurl.h" @@ -167,6 +168,10 @@ bool ContentBrowserClient::ShouldCompareEffectiveURLsForSiteInstanceSelection( return true; } +void ContentBrowserClient::OnRendererProcessLockedStateUpdated( + RenderProcessHost* host, + const GURL& site_url) {} + bool ContentBrowserClient::IsExplicitNavigation(ui::PageTransition transition) { return transition & ui::PAGE_TRANSITION_FROM_ADDRESS_BAR; } @@ -179,7 +184,7 @@ bool ContentBrowserClient::ShouldUseProcessPerSite( } bool ContentBrowserClient:: - ShouldReuseExistingProcessForNewMainFrameSiteInstance( + ShouldReuseAnyExistingProcessForNewMainFrameSiteInstance( BrowserContext* browser_context, const GURL& site_instance_original_url) { DCHECK(browser_context); @@ -254,6 +259,13 @@ void ContentBrowserClient::OverrideURLLoaderFactoryParams( bool is_for_service_worker, network::mojom::URLLoaderFactoryParams* factory_params) {} +// Returns true if the given URL is in any of the NavigationEntries for the +// given |browser_context|. This is used to determine if a URL is already +// in the navigation history of any of the tabs in a given browser context. +bool ContentBrowserClient::IsURLAccessibleByHistoryNavigation(const GURL& url) { + return false; +} + void ContentBrowserClient::GetAdditionalViewSourceSchemes( std::vector* additional_schemes) { GetAdditionalWebUISchemes(additional_schemes); @@ -413,10 +425,9 @@ bool ContentBrowserClient::IsIsolatedContextAllowedForUrl( return false; } -void ContentBrowserClient::CheckGetAllScreensMediaAllowed( - content::RenderFrameHost* render_frame_host, - base::OnceCallback callback) { - std::move(callback).Run(false); +bool ContentBrowserClient::IsMultiCaptureAllowed( + content::RenderFrameHost* render_frame_host) { + return false; } size_t ContentBrowserClient::GetMaxRendererProcessCountOverride() { @@ -538,6 +549,12 @@ bool ContentBrowserClient::OverrideWebPreferencesAfterNavigation( return false; } +bool ContentBrowserClient::WebPreferencesNeedUpdateForColorRelatedStateChanges( + WebContents& web_contents, + const SiteInstance& main_frame_site) const { + return false; +} + bool ContentBrowserClient::IsDataSaverEnabled(BrowserContext* context) { DCHECK(context); return false; @@ -1353,6 +1370,12 @@ ContentBrowserClient::CreateWindowForVideoPictureInPicture( return nullptr; } +base::ScopedClosureRunner +ContentBrowserClient::MaybeGetScopedPictureInPictureTucker( + WebContents* web_contents) { + return base::ScopedClosureRunner(); +} + media::PictureInPictureEventsInfo::AutoPipInfo ContentBrowserClient::GetAutoPipInfo(const WebContents& web_contents) const { return media::PictureInPictureEventsInfo::AutoPipInfo(); @@ -1530,7 +1553,7 @@ bool ContentBrowserClient::IsClipboardPasteAllowed( void ContentBrowserClient::IsClipboardPasteAllowedByPolicy( const ClipboardEndpoint& source, const ClipboardEndpoint& destination, - const ClipboardMetadata& metadata, + const ui::ClipboardMetadata& metadata, ClipboardPasteData clipboard_paste_data, IsClipboardPasteAllowedCallback callback) { std::move(callback).Run(std::move(clipboard_paste_data)); @@ -1538,7 +1561,7 @@ void ContentBrowserClient::IsClipboardPasteAllowedByPolicy( void ContentBrowserClient::IsClipboardCopyAllowedByPolicy( const ClipboardEndpoint& source, - const ClipboardMetadata& metadata, + const ui::ClipboardMetadata& metadata, const ClipboardPasteData& data, IsClipboardCopyAllowedCallback callback) { std::move(callback).Run(metadata.format_type, data, std::nullopt); @@ -1920,11 +1943,6 @@ void ContentBrowserClient::QueryInstalledWebAppsByManifestId( } #endif // !BUILDFLAG(IS_ANDROID) -bool ContentBrowserClient::IsSaveableNavigation( - NavigationHandle* navigation_handle) { - return false; -} - #if BUILDFLAG(IS_WIN) void ContentBrowserClient::OnUiaProviderRequested(bool uia_provider_enabled) {} void ContentBrowserClient::OnUiaProviderDisabled() {} @@ -1975,4 +1993,18 @@ ContentBrowserClient::GetClipboardTypesIfPolicyApplied( return std::nullopt; } +bool ContentBrowserClient::ShouldEnableCanvasNoise( + BrowserContext* browser_context, + const GURL& origin) { + return false; +} + +bool ContentBrowserClient::UsePrefetchPrerenderIntegration() { + return false; +} + +bool ContentBrowserClient::UsePreloadServingMetrics() { + return false; +} + } // namespace content diff --git a/tools/under-control/src/extensions/common/api/audio.idl b/tools/under-control/src/extensions/common/api/audio.idl deleted file mode 100755 index d36cf6ca..00000000 --- a/tools/under-control/src/extensions/common/api/audio.idl +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2013 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// The chrome.audio API is provided to allow users to -// get information about and control the audio devices attached to the -// system. -// This API is currently only available in kiosk mode for ChromeOS. -namespace audio { - - // Type of stream an audio device provides. - enum StreamType { - INPUT, - OUTPUT - }; - - // Available audio device types. - enum DeviceType { - HEADPHONE, - MIC, - USB, - BLUETOOTH, - HDMI, - INTERNAL_SPEAKER, - INTERNAL_MIC, - FRONT_MIC, - REAR_MIC, - KEYBOARD_MIC, - HOTWORD, - LINEOUT, - POST_MIX_LOOPBACK, - POST_DSP_LOOPBACK, - ALSA_LOOPBACK, - OTHER - }; - - dictionary AudioDeviceInfo { - // The unique identifier of the audio device. - DOMString id; - // Stream type associated with this device. - StreamType streamType; - // Type of the device. - DeviceType deviceType; - // The user-friendly name (e.g. "USB Microphone"). - DOMString displayName; - // Device name. - DOMString deviceName; - // True if this is the current active device. - boolean isActive; - // The sound level of the device, volume for output, gain for input. - long level; - // The stable/persisted device id string when available. - DOMString? stableDeviceId; - }; - - dictionary DeviceFilter { - // If set, only audio devices whose stream type is included in this list - // will satisfy the filter. - StreamType[]? streamTypes; - - // If set, only audio devices whose active state matches this value will - // satisfy the filter. - boolean? isActive; - }; - - dictionary DeviceProperties { - //

- // The audio device's desired sound level. Defaults to the device's - // current sound level. - //

- //

If used with audio input device, represents audio device gain.

- //

If used with audio output device, represents audio device volume.

- long? level; - }; - - dictionary DeviceIdLists { - //

List of input devices specified by their ID.

- //

To indicate input devices should be unaffected, leave this property - // unset.

- DOMString[]? input; - - //

List of output devices specified by their ID.

- //

To indicate output devices should be unaffected, leave this property - // unset.

- DOMString[]? output; - }; - - dictionary MuteChangedEvent { - // The type of the stream for which the mute value changed. The updated mute - // value applies to all devices with this stream type. - StreamType streamType; - - // Whether or not the stream is now muted. - boolean isMuted; - }; - - dictionary LevelChangedEvent { - // ID of device whose sound level has changed. - DOMString deviceId; - - // The device's new sound level. - long level; - }; - - callback GetDevicesCallback = void(AudioDeviceInfo[] devices); - callback GetMuteCallback = void(boolean value); - callback EmptyCallback = void(); - - interface Functions { - // Gets a list of audio devices filtered based on |filter|. - // |filter|: Device properties by which to filter the list of returned - // audio devices. If the filter is not set or set to {}, - // returned device list will contain all available audio devices. - // |callback|: Reports the requested list of audio devices. - static void getDevices( - optional DeviceFilter filter, - GetDevicesCallback callback); - - // Sets lists of active input and/or output devices. - // |ids|:

Specifies IDs of devices that should be active. If either the - // input or output list is not set, devices in that category are - // unaffected. - //

- //

It is an error to pass in a non-existent device ID.

- static void setActiveDevices( - DeviceIdLists ids, - EmptyCallback callback); - - // Sets the properties for the input or output device. - static void setProperties( - DOMString id, - DeviceProperties properties, - EmptyCallback callback); - - // Gets the system-wide mute state for the specified stream type. - // |streamType|: Stream type for which mute state should be fetched. - // |callback|: Callback reporting whether mute is set or not for specified - // stream type. - static void getMute( - StreamType streamType, - GetMuteCallback callback); - - // Sets mute state for a stream type. The mute state will apply to all audio - // devices with the specified audio stream type. - // |streamType|: Stream type for which mute state should be set. - // |isMuted|: New mute value. - static void setMute( - StreamType streamType, - boolean isMuted, - optional EmptyCallback callback); - }; - - interface Events { - // Fired when sound level changes for an active audio device. - static void onLevelChanged(LevelChangedEvent event); - - // Fired when the mute state of the audio input or output changes. - // Note that mute state is system-wide and the new value applies to every - // audio device with specified stream type. - static void onMuteChanged(MuteChangedEvent event); - - // Fired when audio devices change, either new devices being added, or - // existing devices being removed. - // |devices|: List of all present audio devices after the change. - static void onDeviceListChanged(AudioDeviceInfo[] devices); - }; -}; diff --git a/tools/under-control/src/extensions/common/api/automation.idl b/tools/under-control/src/extensions/common/api/automation.idl index 615005b1..ea918441 100755 --- a/tools/under-control/src/extensions/common/api/automation.idl +++ b/tools/under-control/src/extensions/common/api/automation.idl @@ -296,6 +296,7 @@ menuItem, menuItemCheckBox, menuItemRadio, + menuItemSeparator, menuListOption, menuListPopup, meter, diff --git a/tools/under-control/src/extensions/common/api/bluetooth.idl b/tools/under-control/src/extensions/common/api/bluetooth.idl deleted file mode 100755 index 0000d129..00000000 --- a/tools/under-control/src/extensions/common/api/bluetooth.idl +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2012 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Use the chrome.bluetooth API to connect to a Bluetooth -// device. All functions report failures via chrome.runtime.lastError. -namespace bluetooth { - // Allocation authorities for Vendor IDs. - enum VendorIdSource {bluetooth, usb}; - - // Common device types recognized by Chrome. - enum DeviceType {computer, phone, modem, audio, carAudio, video, peripheral, - joystick, gamepad, keyboard, mouse, tablet, - keyboardMouseCombo}; - - // Types for filtering bluetooth devices. - enum FilterType {all, known}; - - // Transport type of the bluetooth device. - enum Transport {invalid, classic, le, dual}; - - // Information about the state of the Bluetooth adapter. - dictionary AdapterState { - // The address of the adapter, in the format 'XX:XX:XX:XX:XX:XX'. - DOMString address; - - // The human-readable name of the adapter. - DOMString name; - - // Indicates whether or not the adapter has power. - boolean powered; - - // Indicates whether or not the adapter is available (i.e. enabled). - boolean available; - - // Indicates whether or not the adapter is currently discovering. - boolean discovering; - }; - - // Callback from the getAdapterState method. - // |adapterInfo| : Object containing the adapter information. - callback AdapterStateCallback = void(AdapterState adapterInfo); - - // Information about the state of a known Bluetooth device. Note: this - // dictionary is also used in bluetooth_private.idl - dictionary Device { - // The address of the device, in the format 'XX:XX:XX:XX:XX:XX'. - DOMString address; - - // The human-readable name of the device. - DOMString? name; - - // The class of the device, a bit-field defined by - // http://www.bluetooth.org/en-us/specification/assigned-numbers/baseband. - long? deviceClass; - - // The Device ID record of the device, where available. - VendorIdSource? vendorIdSource; - long? vendorId; - long? productId; - long? deviceId; - - // The type of the device, if recognized by Chrome. This is obtained from - // the |deviceClass| field and only represents a small fraction of the - // possible device types. When in doubt you should use the |deviceClass| - // field directly. - DeviceType? type; - - // Indicates whether or not the device is paired with the system. - boolean? paired; - - // Indicates whether the device is currently connected to the system. - boolean? connected; - - // Indicates whether the device is currently connecting to the system. - boolean? connecting; - - // Indicates whether the device is connectable. - boolean? connectable; - - // UUIDs of protocols, profiles and services advertised by the device. - // For classic Bluetooth devices, this list is obtained from EIR data and - // SDP tables. For Low Energy devices, this list is obtained from AD and - // GATT primary services. For dual mode devices this may be obtained from - // both. - DOMString[]? uuids; - - // The received signal strength, in dBm. This field is avaliable and valid - // only during discovery. Outside of discovery it's value is not specified. - long? inquiryRssi; - - // The transmitted power level. This field is avaliable only for LE devices - // that include this field in AD. It is avaliable and valid only during - // discovery. - long? inquiryTxPower; - - // The transport type of the bluetooth device. - Transport? transport; - - // The remaining battery of the device. - long? batteryPercentage; - }; - - dictionary BluetoothFilter { - // Type of filter to apply to the device list. Default is all. - FilterType? filterType; - - // Maximum number of bluetooth devices to return. Default is 0 (no limit) - // if unspecified. - long? limit; - }; - - // Callback from the getDevice method. - // |deviceInfo| : Object containing the device information. - callback GetDeviceCallback = void(Device deviceInfo); - - // Callback from the getDevices method. - // |deviceInfos| : Array of object containing device information. - callback GetDevicesCallback = void(Device[] deviceInfos); - - // Callback from the startDiscovery method. - callback StartDiscoveryCallback = void(); - - // Callback from the stopDiscovery method. - callback StopDiscoveryCallback = void(); - - // These functions all report failures via chrome.runtime.lastError. - interface Functions { - // Get information about the Bluetooth adapter. - // |callback| : Called with an AdapterState object describing the adapter - // state. - static void getAdapterState( - AdapterStateCallback callback); - - // Get information about a Bluetooth device known to the system. - // |deviceAddress| : Address of device to get. - // |callback| : Called with the Device object describing the device. - static void getDevice( - DOMString deviceAddress, - GetDeviceCallback callback); - - // Get a list of Bluetooth devices known to the system, including paired - // and recently discovered devices. - // |filter|: Some criteria to filter the list of returned bluetooth devices. - // If the filter is not set or set to {}, returned device list - // will contain all bluetooth devices. Right now this is only supported in - // ChromeOS, for other platforms, a full list is returned. - // |callback| : Called when the search is completed. - static void getDevices( - optional BluetoothFilter filter, - GetDevicesCallback callback); - - // Start discovery. Newly discovered devices will be returned via the - // onDeviceAdded event. Previously discovered devices already known to - // the adapter must be obtained using getDevices and will only be updated - // using the |onDeviceChanged| event if information about them changes. - // - // Discovery will fail to start if this application has already called - // startDiscovery. Discovery can be resource intensive: stopDiscovery - // should be called as soon as possible. - // |callback| : Called to indicate success or failure. - static void startDiscovery( - optional StartDiscoveryCallback callback); - - // Stop discovery. - // |callback| : Called to indicate success or failure. - static void stopDiscovery( - optional StopDiscoveryCallback callback); - }; - - interface Events { - // Fired when the state of the Bluetooth adapter changes. - // |state| : The new state of the adapter. - static void onAdapterStateChanged(AdapterState state); - - // Fired when information about a new Bluetooth device is available. - static void onDeviceAdded(Device device); - - // Fired when information about a known Bluetooth device has changed. - static void onDeviceChanged(Device device); - - // Fired when a Bluetooth device that was previously discovered has been - // out of range for long enough to be considered unavailable again, and - // when a paired device is removed. - static void onDeviceRemoved(Device device); - }; -}; diff --git a/tools/under-control/src/chrome/common/extensions/api/chrome_url_overrides.idl b/tools/under-control/src/extensions/common/api/chrome_url_overrides.idl similarity index 100% rename from tools/under-control/src/chrome/common/extensions/api/chrome_url_overrides.idl rename to tools/under-control/src/extensions/common/api/chrome_url_overrides.idl diff --git a/tools/under-control/src/extensions/common/api/declarative_net_request.idl b/tools/under-control/src/extensions/common/api/declarative_net_request.idl index 13e0df81..668d9626 100755 --- a/tools/under-control/src/extensions/common/api/declarative_net_request.idl +++ b/tools/under-control/src/extensions/common/api/declarative_net_request.idl @@ -305,6 +305,41 @@ namespace declarativeNetRequest { // DOMString[]? excludedRequestDomains; + // The rule will only match network requests when the associated top-level + // frame's domain matches one from the list of topDomains. If + // the list is omitted, the rule is applied to requests associated with all + // top-level frame domains. An empty list is not allowed. + // + // Notes: + //
    + //
  • Sub-domains like "a.example.com" are also allowed.
  • + //
  • The entries must consist of only ascii characters.
  • + //
  • Use punycode encoding for internationalized domains.
  • + //
  • Sub-domains of the listed domains are also matched.
  • + //
  • For requests with no associated top-level frame (e.g. ServiceWorker + // initiated requests, the request initiator's domain is considered + // instead.
  • + //
+ [nodoc] DOMString[]? topDomains; + + // The rule will not match network requests when the associated top-level + // frame's domain matches one from the list of + // excludedTopDomains. If the list is empty or omitted, no + // domains are excluded. This takes precedence over + // topDomains. + // + // Notes: + //
    + //
  • Sub-domains like "a.example.com" are also allowed.
  • + //
  • The entries must consist of only ascii characters.
  • + //
  • Use punycode encoding for internationalized domains.
  • + //
  • Sub-domains of the listed domains are also excluded.
  • + //
  • For requests with no associated top-level frame (e.g. ServiceWorker + // initiated requests, the request initiator's domain is considered + // instead.
  • + //
+ [nodoc] DOMString[]? excludedTopDomains; + // The rule will only match network requests originating from the list of // domains. [deprecated="Use $(ref:initiatorDomains) instead"] @@ -550,6 +585,9 @@ namespace declarativeNetRequest { // the request isn't related to a tab. long? tabId; + // The associated top-level frame URL (if any) for the request. + [nodoc] DOMString? topUrl; + // The headers provided by a hypothetical response if the request does not // get blocked or redirected before it is sent. Represented as an object // which maps a header name to a list of string values. If not specified, diff --git a/tools/under-control/src/gin/v8_initializer.cc b/tools/under-control/src/gin/v8_initializer.cc index fe0e40ad..5bb090c9 100755 --- a/tools/under-control/src/gin/v8_initializer.cc +++ b/tools/under-control/src/gin/v8_initializer.cc @@ -419,6 +419,9 @@ void SetFeatureFlags() { SetV8FlagsIfOverridden(features::kV8IdleGcOnContextDisposal, "--idle-gc-on-context-disposal", "--no-idle-gc-on-context-disposal"); + SetV8FlagsIfOverridden(features::kV8MemoryPoolReleaseOnMallocFailures, + "--memory-pool-release-on-malloc-failures", + "--no-memory-pool-release-on-malloc-failures"); SetV8FlagsIfOverridden(features::kV8MinorMS, "--minor-ms", "--no-minor-ms"); if (base::FeatureList::IsEnabled(features::kV8ScavengerHigherCapacity)) { SetV8FlagsFormatted("--scavenger-max-new-space-capacity-mb=%i", @@ -490,8 +493,6 @@ void SetFeatureFlags() { bool any_slow_histograms_alias = base::FeatureList::IsEnabled( features::kV8SlowHistogramsCodeMemoryWriteProtection) || - base::FeatureList::IsEnabled( - features::kV8SlowHistogramsIntelJCCErratumMitigation) || base::FeatureList::IsEnabled(features::kV8SlowHistogramsSparkplug) || base::FeatureList::IsEnabled( features::kV8SlowHistogramsSparkplugAndroid) || @@ -507,10 +508,6 @@ void SetFeatureFlags() { "--ignition-elide-redundant-tdz-checks", "--no-ignition-elide-redundant-tdz-checks"); - SetV8FlagsIfOverridden(features::kV8IntelJCCErratumMitigation, - "--intel-jcc-erratum-mitigation", - "--no-intel-jcc-erratum-mitigation"); - SetV8FlagsIfOverridden(features::kV8UseLibmTrigFunctions, "--use-libm-trig-functions", "--no-use-libm-trig-functions"); diff --git a/tools/under-control/src/services/network/network_context.cc b/tools/under-control/src/services/network/network_context.cc index 553d9c01..26019db9 100755 --- a/tools/under-control/src/services/network/network_context.cc +++ b/tools/under-control/src/services/network/network_context.cc @@ -108,6 +108,7 @@ #include "services/network/cookie_manager.h" #include "services/network/data_remover_util.h" #include "services/network/device_bound_session_manager.h" +#include "services/network/devtools_durable_msg_collector.h" #include "services/network/disk_cache/mojo_backend_file_operations_factory.h" #include "services/network/host_resolver.h" #include "services/network/http_auth_cache_copier.h" @@ -793,9 +794,6 @@ NetworkContext::NetworkContext( InitializeCorsParams(); - SetSplitAuthCacheByNetworkAnonymizationKey( - params_->split_auth_cache_by_network_anonymization_key); - #if BUILDFLAG(IS_CT_SUPPORTED) if (params_->ct_policy) { SetCTPolicy(std::move(params_->ct_policy)); @@ -1755,6 +1753,28 @@ void NetworkContext::SetNetworkConditions( std::move(network_conditions)); } +void NetworkContext::OnDevToolsDurableMessageClientsDisconnected( + const base::UnguessableToken& throttling_profile_id) { + devtools_profile_to_durable_message_collectors_.erase(throttling_profile_id); +} + +void NetworkContext::EnableDurableMessageCollector( + const base::UnguessableToken& throttling_profile_id, + mojo::PendingReceiver receiver) { + auto [it, inserted] = + devtools_profile_to_durable_message_collectors_.try_emplace( + throttling_profile_id); + if (inserted) { + auto disconnect_callback = base::BindOnce( + &NetworkContext::OnDevToolsDurableMessageClientsDisconnected, + base::Unretained(this), throttling_profile_id); + it->second = std::make_unique( + std::move(disconnect_callback)); + } + + it->second->AddReceiver(std::move(receiver)); +} + void NetworkContext::SetAcceptLanguage(const std::string& new_accept_language) { // This may only be called on NetworkContexts created with the constructor // that calls MakeURLRequestContext(). @@ -2497,24 +2517,6 @@ void NetworkContext::SetCorsNonWildcardRequestHeadersSupport(bool value) { cors::NonWildcardRequestHeadersSupport(value); } -void NetworkContext::LookupServerBasicAuthCredentials( - const GURL& url, - const net::NetworkAnonymizationKey& network_anonymization_key, - LookupServerBasicAuthCredentialsCallback callback) { - net::HttpAuthCache* http_auth_cache = - url_request_context_->http_transaction_factory() - ->GetSession() - ->http_auth_cache(); - net::HttpAuthCache::Entry* entry = http_auth_cache->LookupByPath( - url::SchemeHostPort(url), net::HttpAuth::AUTH_SERVER, - network_anonymization_key, url.path()); - if (entry && entry->scheme() == net::HttpAuth::AUTH_SCHEME_BASIC) { - std::move(callback).Run(entry->credentials()); - } else { - std::move(callback).Run(std::nullopt); - } -} - #if BUILDFLAG(IS_CHROMEOS) void NetworkContext::LookupProxyAuthCredentials( const net::ProxyServer& proxy_server, @@ -2965,14 +2967,8 @@ URLRequestContextOwner NetworkContext::MakeURLRequestContext( session_params.disable_idle_sockets_close_on_memory_pressure = params_->disable_idle_sockets_close_on_memory_pressure; - if (network_service_) { - session_params.key_auth_cache_server_entries_by_network_anonymization_key = - network_service_->split_auth_cache_by_network_isolation_key(); - } - session_params.key_auth_cache_server_entries_by_network_anonymization_key = - base::FeatureList::IsEnabled( - features::kSplitAuthCacheByNetworkIsolationKey); + params_->split_auth_cache_by_network_anonymization_key; builder.set_http_network_session_params(session_params); builder.set_quic_context(std::move(quic_context)); @@ -2989,8 +2985,25 @@ URLRequestContextOwner NetworkContext::MakeURLRequestContext( std::move(network_layer)); })); - builder.set_host_mapping_rules( - command_line->GetSwitchValueASCII(switches::kHostResolverRules)); + if (command_line->HasSwitch(switches::kHostResolverRules)) { + builder.set_host_mapping_rules( + command_line->GetSwitchValueASCII(switches::kHostResolverRules)); + } else if (command_line->HasSwitch(switches::kHostRules)) { + LOG(WARNING) + << "The --" << switches::kHostRules + << " command line switch is deprecated, and now has the same behavior " + "as --" + << switches::kHostResolverRules << ". Use --" + << switches::kHostResolverRules + << " directly to avoid this LOG message. If you get certificate error " + "where --" + << switches::kHostRules + << " previously did not give one, you need to ensure the server has a " + "valid certificate for the mapped hostname, not the destination " + "hostname."; + builder.set_host_mapping_rules( + command_line->GetSwitchValueASCII(switches::kHostRules)); + } #if BUILDFLAG(IS_WIN) if (params_->socket_brokers) { @@ -3515,6 +3528,31 @@ void NetworkContext::GetDeviceBoundSessionManager( } } +void NetworkContext::GetIpProxyStatus(GetIpProxyStatusCallback callback) { + ip_protection::IpProxyStatus status = + ip_protection::IpProxyStatus::kUnavailable; + + if (!base::FeatureList::IsEnabled(net::features::kEnableIpProtectionProxy)) { + status = ip_protection::IpProxyStatus::kFeatureNotEnabled; + std::move(callback).Run(status); + return; + } + if (!base::FeatureList::IsEnabled(features::kMaskedDomainList)) { + status = ip_protection::IpProxyStatus::kMaskedDomainListNotEnabled; + std::move(callback).Run(status); + return; + } + if (ip_protection_core()) { + // ip_protection_core() should be null if either of the above features are + // disabled, so check beforehand + status = ip_protection_core()->GetIpProxyStatus(); + std::move(callback).Run(status); + return; + } + + std::move(callback).Run(status); +} + bool NetworkContext::IsNetworkForNonceAndUrlAllowed( const base::UnguessableToken& nonce, const GURL& url) const { @@ -3540,4 +3578,21 @@ void NetworkContext::InitializePrefetchURLLoaderFactory() { CreateURLLoaderFactoryParamsForPrefetch()); } +base::WeakPtr NetworkContext::MaybeCreateDurableMessage( + const std::optional& throttling_profile_id, + const std::optional& devtools_request_id) { + if (!throttling_profile_id.has_value() || !devtools_request_id.has_value()) { + return nullptr; + } + + auto collector_it = devtools_profile_to_durable_message_collectors_.find( + throttling_profile_id.value()); + if (collector_it == devtools_profile_to_durable_message_collectors_.end()) { + return nullptr; + } + + return collector_it->second->CreateDurableMessage( + devtools_request_id.value()); +} + } // namespace network diff --git a/tools/under-control/src/testing/variations/fieldtrial_testing_config.json b/tools/under-control/src/testing/variations/fieldtrial_testing_config.json index e887bbb4..99b089f4 100755 --- a/tools/under-control/src/testing/variations/fieldtrial_testing_config.json +++ b/tools/under-control/src/testing/variations/fieldtrial_testing_config.json @@ -1,4 +1,25 @@ { + "AIMEligibilityService": [ + { + "platforms": [ + "android", + "chromeos", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AimServerEligibilityChangedNotification", + "AimServerEligibilityEnabledEn" + ] + } + ] + } + ], "ANGLEPerContextBlobCache": [ { "platforms": [ @@ -107,6 +128,22 @@ ] } ], + "AcceleratedVideoDecodeLinuxGL": [ + { + "platforms": [ + "linux" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AcceleratedVideoDecodeLinuxGL", + "AcceleratedVideoDecodeLinuxZeroCopyGL" + ] + } + ] + } + ], "AccessibilityDeprecateJavaNodeCache": [ { "platforms": [ @@ -421,29 +458,6 @@ ] } ], - "AccessibilityUseAXBitset": [ - { - "platforms": [ - "android", - "android_weblayer", - "android_webview", - "chromeos", - "chromeos_lacros", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AccessibilityUseAXBitset" - ] - } - ] - } - ], "AddSuggestStrongPasswordFromAddPassword": [ { "platforms": [ @@ -538,6 +552,37 @@ ] } ], + "AllowlistScopesForMdmErrors": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AllowlistScopesForMdmErrors" + ] + } + ] + } + ], + "AlwaysUseAudioManagerOutputFramesPerBuffer": [ + { + "platforms": [ + "android", + "android_webview" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AlwaysUseAudioManagerOutputFramesPerBuffer" + ] + } + ] + } + ], "AndroidAnimateSuggestionsListAppearance": [ { "platforms": [ @@ -568,6 +613,37 @@ ] } ], + "AndroidAutofillForwardIframeOrigin": [ + { + "platforms": [ + "android", + "android_webview" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AndroidAutofillForwardIframeOrigin" + ] + } + ] + } + ], + "AndroidAutofillUpdateContextForWebContents": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AndroidAutofillUpdateContextForWebContents" + ] + } + ] + } + ], "AndroidBookmarkBar": [ { "platforms": [ @@ -620,6 +696,15 @@ "android" ], "experiments": [ + { + "name": "EnabledV2", + "params": { + "v2_enabled": "true" + }, + "enable_features": [ + "AndroidComposeplate" + ] + }, { "name": "Enabled", "enable_features": [ @@ -697,6 +782,9 @@ "experiments": [ { "name": "Enabled", + "params": { + "enable_hub_search_tab_groups_pane": "true" + }, "enable_features": [ "AndroidHubSearchTabGroups" ] @@ -760,6 +848,37 @@ ] } ], + "AndroidOmniboxAimShortcut": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled_all_20250815", + "enable_features": [ + "OmniboxAimShortcutTypedState" + ] + } + ] + } + ], + "AndroidPauseMutedBackgroundAudio": [ + { + "platforms": [ + "android", + "android_webview" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "PauseMutedBackgroundAudio" + ] + } + ] + } + ], "AndroidPdfSummarization": [ { "platforms": [ @@ -775,21 +894,6 @@ ] } ], - "AndroidProgressBarVisualUpdate": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AndroidProgressBarVisualUpdate" - ] - } - ] - } - ], "AndroidRaiseDisplayCriticalThreadPriority": [ { "platforms": [ @@ -909,21 +1013,6 @@ ] } ], - "AndroidSurfaceColorUpdate": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AndroidSurfaceColorUpdate" - ] - } - ] - } - ], "AndroidSystemTracing": [ { "platforms": [ @@ -1015,7 +1104,7 @@ ] } ], - "AndroidTabGroupsColorUpdateGm3": [ + "AndroidTabHighlighting": [ { "platforms": [ "android" @@ -1024,7 +1113,7 @@ { "name": "Enabled", "enable_features": [ - "AndroidTabGroupsColorUpdateGM3" + "AndroidTabHighlighting" ] } ] @@ -1039,18 +1128,29 @@ { "name": "Enabled", "enable_features": [ + "AndroidProgressBarVisualUpdate", + "AndroidTabGroupsColorUpdateGM3", "AndroidThemeModule", "CpaSpecUpdate", - "GridTabSwitcherSurfaceColorUpdate", "GridTabSwitcherUpdate", "TabletTabStripAnimation" ] }, { - "name": "Enabled_Gts", + "name": "Enabled_M139", + "enable_features": [ + "AndroidProgressBarVisualUpdate", + "AndroidTabGroupsColorUpdateGM3", + "AndroidThemeModule", + "CpaSpecUpdate", + "GridTabSwitcherUpdate", + "TabletTabStripAnimation" + ] + }, + { + "name": "Enabled_GtsOnly", "enable_features": [ "AndroidThemeModule", - "GridTabSwitcherSurfaceColorUpdate", "GridTabSwitcherUpdate" ] } @@ -1202,6 +1302,41 @@ ] } ], + "AnnotatedPageContentExtraction": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Glic", + "params": { + "capture_delay": "5s", + "include_inner_text": "true", + "on_critical_path": "true" + }, + "enable_features": [ + "AnnotatedPageContentExtraction" + ] + } + ] + } + ], + "AnnotatedPageContentsVirtualStructure": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AnnotatedPageContentsVirtualStructure" + ] + } + ] + } + ], "ApiPrintingMarginsAndScale": [ { "platforms": [ @@ -1247,6 +1382,21 @@ ] } ], + "AppBundlePromoMagicStackStudy": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AppBundlePromoEphemeralCard" + ] + } + ] + } + ], "AppListLaunchRecorder": [ { "platforms": [ @@ -1262,6 +1412,21 @@ ] } ], + "ApproximateGeolocationPermission": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "ApproximateGeolocationPermission" + ] + } + ] + } + ], "AppsCollectionsFeature": [ { "platforms": [ @@ -1692,6 +1857,26 @@ ] } ], + "AsyncTouchMovesImmediatelyAfterScroll": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AsyncTouchMovesImmediatelyAfterScroll" + ] + } + ] + } + ], "AttributionReportNavigationBasedRetry": [ { "platforms": [ @@ -2023,29 +2208,22 @@ ] } ], - "AutofillAiUs": [ + "AutofillAiVoteForFormatStringsForAffixes": [ { "platforms": [ + "android", "chromeos", + "chromeos_lacros", + "ios", "linux", "mac", "windows" ], "experiments": [ { - "name": "EnabledWithoutApc", + "name": "Enabled", "enable_features": [ - "AutofillAiWithDataSchema", - "FormsClassificationsMqlsLogging" - ] - }, - { - "name": "EnabledWithApc", - "enable_features": [ - "AutofillAiServerModel", - "AutofillAiUploadModelRequestAndResponse", - "AutofillAiWithDataSchema", - "FormsClassificationsMqlsLogging" + "AutofillAiVoteForFormatStringsForAffixes" ] } ] @@ -2072,6 +2250,21 @@ ] } ], + "AutofillAndroidDesktopKeyboardAccessoryRevamp": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AutofillAndroidDesktopKeyboardAccessoryRevamp" + ] + } + ] + } + ], "AutofillAndroidDesktopSuppressAccessoryOnEmpty": [ { "platforms": [ @@ -2107,6 +2300,26 @@ ] } ], + "AutofillConsiderServerOnlyFormsInKeyMetrics": [ + { + "platforms": [ + "android", + "chromeos", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AutofillConsiderServerOnlyFormsInKeyMetrics" + ] + } + ] + } + ], "AutofillCreditCardUserPerceptionSurvey": [ { "platforms": [ @@ -2129,13 +2342,11 @@ ] } ], - "AutofillDetectFieldVisibility": [ + "AutofillDeduplicateAccountAddresses": [ { "platforms": [ "android", - "android_webview", "chromeos", - "chromeos_lacros", "ios", "linux", "mac", @@ -2143,9 +2354,9 @@ ], "experiments": [ { - "name": "Enabled_20250523", + "name": "Enabled", "enable_features": [ - "AutofillDetectFieldVisibility" + "AutofillDeduplicateAccountAddresses" ] } ] @@ -2171,6 +2382,25 @@ ] } ], + "AutofillEnableBuyNowPayLaterForKlarna": [ + { + "platforms": [ + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AutofillEnableBuyNowPayLaterForKlarna" + ] + } + ] + } + ], "AutofillEnableCardBenefitsForBmo": [ { "platforms": [ @@ -2293,26 +2523,6 @@ ] } ], - "AutofillEnableLogFormEventsToAllParsedFormTypes": [ - { - "platforms": [ - "android", - "chromeos", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AutofillEnableLogFormEventsToAllParsedFormTypes" - ] - } - ] - } - ], "AutofillEnableLoyaltyCardsFilling": [ { "platforms": [ @@ -2334,6 +2544,27 @@ ] } ], + "AutofillEnableMultipleRequestInVirtualCardDownstreamEnrollment": [ + { + "platforms": [ + "android", + "ios", + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AutofillEnableMultipleRequestInVirtualCardDownstreamEnrollment" + ] + } + ] + } + ], "AutofillEnableNewCardProfileRankingAlgorithm": [ { "platforms": [ @@ -2562,21 +2793,6 @@ ] } ], - "AutofillLocalSaveCardBottomSheet": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AutofillLocalSaveCardBottomSheet" - ] - } - ] - } - ], "AutofillModelPredictions": [ { "platforms": [ @@ -2738,21 +2954,6 @@ ] } ], - "AutofillSaveCardBottomSheet": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AutofillSaveCardBottomSheet" - ] - } - ] - } - ], "AutofillServerExperimentalSignatures": [ { "platforms": [ @@ -2974,27 +3175,6 @@ ] } ], - "AutofillUnifyRationalizationAndSectioningOrder": [ - { - "platforms": [ - "android", - "android_webview", - "chromeos", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AutofillUnifyRationalizationAndSectioningOrder" - ] - } - ] - } - ], "AutofillUnmaskCardRequestTimeout": [ { "platforms": [ @@ -3060,7 +3240,7 @@ ] } ], - "AutomatedPasswordChangeStudy": [ + "AutomatedPasswordChangeStudyV2": [ { "platforms": [ "chromeos", @@ -3072,6 +3252,8 @@ { "name": "Enabled", "enable_features": [ + "ApplyClientsideModelPredictionsForPasswordTypes", + "CheckLoginStateBeforePasswordChange", "ImprovedPasswordChangeService", "PasswordChangeSubmissionMqlsLogging" ] @@ -3094,6 +3276,21 @@ ] } ], + "AutomotiveBackButtonBarStreamline": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled_140", + "enable_features": [ + "AutomotiveBackButtonBarStreamline" + ] + } + ] + } + ], "AvatarButtonSyncPromoWindows": [ { "platforms": [ @@ -3417,31 +3614,16 @@ ] } ], - "BackForwardTransitions": [ + "BackForwardTransitionsCrossDocSharedImage": [ { "platforms": [ "android" ], "experiments": [ { - "name": "IPH", - "params": { - "availability": "any", - "compress-screenshot-when-quiet": "true", - "event_trigger": "name:rtl_gesture_iph_trigger;comparator:==0;window:365;storage:365", - "event_used": "name:rtl_gesture_iph_show;comparator:==0;window:365;storage:365", - "min-required-physical-ram-mb": "3200", - "percentage-of-ram-to-use": "0.5", - "screenshot-send-result-delay-ms": "400", - "session_rate": "<1", - "x_trigger": "", - "x_unhandled_gesture_threshold": "2" - }, + "name": "Enabled", "enable_features": [ - "BackForwardTransitions", - "IPH_RtlGestureNavigation", - "MirrorBackForwardGesturesInRTL", - "NativePageTransitionHardwareCapture" + "BackForwardTransitionsCrossDocSharedImage" ] } ] @@ -3510,6 +3692,24 @@ ] } ], + "BackgroundThreadPoolPISupported": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "EnabledBoth_20250805", + "params": { + "config": "4" + }, + "enable_features": [ + "BackgroundThreadPoolFieldTrial" + ] + } + ] + } + ], "BatchNativeEventsInMessagePumpEpoll": [ { "platforms": [ @@ -3563,22 +3763,6 @@ ] } ], - "BatteryStatusManagerBroadcastReceiverInBackground": [ - { - "platforms": [ - "android", - "android_webview" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "BatteryStatusManagerBroadcastReceiverInBackground" - ] - } - ] - } - ], "BeaconLeakageLogging": [ { "platforms": [ @@ -3602,6 +3786,21 @@ ] } ], + "BeginCursorAtPointTentativeFix": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "BeginCursorAtPointTentativeFix" + ] + } + ] + } + ], "BinderIpcTracing": [ { "platforms": [ @@ -3779,6 +3978,23 @@ ] } ], + "BookmarksImportOnFirstRun": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "BookmarksImportOnFirstRun" + ] + } + ] + } + ], "BookmarksUseBinaryTreeInTitledUrlIndex": [ { "platforms": [ @@ -4028,9 +4244,9 @@ ], "experiments": [ { - "name": "Enabled_1ms", + "name": "Enabled_2ms", "params": { - "busy_loop_for": "1ms" + "busy_loop_for": "2ms" }, "enable_features": [ "BusyLoopOnMainThread" @@ -4126,22 +4342,6 @@ ] } ], - "CCTEarlyNav": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "CCTEarlyNav", - "CCTFixWarmup" - ] - } - ] - } - ], "CCTEphemeralMediaViewerExperiment": [ { "platforms": [ @@ -4202,7 +4402,7 @@ ] } ], - "CCTPredictiveBackGesture": [ + "CCTToolbarRefactor": [ { "platforms": [ "android" @@ -4211,37 +4411,7 @@ { "name": "Enabled", "enable_features": [ - "CCTPredictiveBackGesture" - ] - } - ] - } - ], - "CCTPrewarmTab": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "CCTPrewarmTab" - ] - } - ] - } - ], - "CCTRealtimeEngagementEventsInBackground": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "CCTRealtimeEngagementEventsInBackground" + "CCTToolbarRefactor" ] } ] @@ -4694,6 +4864,258 @@ ] } ], + "ChromeIdentitySurveyAddressBubbleSignin": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "en_site_id": "QLEtVmyw80ugnJ3q1cK0UGdNayod", + "probability": "0.008" + }, + "enable_features": [ + "ChromeIdentitySurveyAddressBubbleSignin" + ] + } + ] + } + ], + "ChromeIdentitySurveyDiceWebSigninAccepted": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "en_site_id": "xEt7e5g7R0ugnJ3q1cK0VZ7N4MUU", + "probability": "0.008" + }, + "enable_features": [ + "ChromeIdentitySurveyDiceWebSigninAccepted" + ] + } + ] + } + ], + "ChromeIdentitySurveyDiceWebSigninDeclined": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "en_site_id": "2LBpsLxW40ugnJ3q1cK0YRjYGpmV", + "probability": "0.008" + }, + "enable_features": [ + "ChromeIdentitySurveyDiceWebSigninDeclined" + ] + } + ] + } + ], + "ChromeIdentitySurveyFirstRunSignin": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "en_site_id": "RyaBY3Nkt0ugnJ3q1cK0NsYdHNN6", + "probability": "0.008" + }, + "enable_features": [ + "ChromeIdentitySurveyFirstRunSignin" + ] + } + ] + } + ], + "ChromeIdentitySurveyPasswordBubbleSignin": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "en_site_id": "Y6Y4fzSar0ugnJ3q1cK0WNKdFDWW", + "probability": "0.008" + }, + "enable_features": [ + "ChromeIdentitySurveyPasswordBubbleSignin" + ] + } + ] + } + ], + "ChromeIdentitySurveyProfileMenuDismissed": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "en_site_id": "AHS3hpM2h0ugnJ3q1cK0TTUsr4mM", + "probability": "0.008" + }, + "enable_features": [ + "ChromeIdentitySurveyProfileMenuDismissed" + ] + } + ] + } + ], + "ChromeIdentitySurveyProfileMenuSignin": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "en_site_id": "5BV1ygFHd0ugnJ3q1cK0WVqeKyud", + "probability": "0.008" + }, + "enable_features": [ + "ChromeIdentitySurveyProfileMenuSignin" + ] + } + ] + } + ], + "ChromeIdentitySurveyProfilePickerAddProfileSignin": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "en_site_id": "dQhvVytAT0ugnJ3q1cK0WmcCsZxn", + "probability": "0.008" + }, + "enable_features": [ + "ChromeIdentitySurveyProfilePickerAddProfileSignin" + ] + } + ] + } + ], + "ChromeIdentitySurveySigninInterceptProfileSeparation": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "en_site_id": "EpkbgSho80ugnJ3q1cK0XfvvYoum", + "probability": "0.008" + }, + "enable_features": [ + "ChromeIdentitySurveySigninInterceptProfileSeparation" + ] + } + ] + } + ], + "ChromeIdentitySurveySigninPromoBubbleDismissed": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "en_site_id": "LSwnpVNg60ugnJ3q1cK0Uj5JGisJ", + "probability": "0.008" + }, + "enable_features": [ + "ChromeIdentitySurveySigninPromoBubbleDismissed" + ] + } + ] + } + ], + "ChromeIdentitySurveySwitchProfileFromProfileMenu": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "en_site_id": "buPSkStWM0ugnJ3q1cK0RmiQgzK1", + "probability": "0.008" + }, + "enable_features": [ + "ChromeIdentitySurveySwitchProfileFromProfileMenu" + ] + } + ] + } + ], + "ChromeIdentitySurveySwitchProfileFromProfilePicker": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "en_site_id": "b5zoUGRaf0ugnJ3q1cK0RaxK8yrp", + "probability": "0.008" + }, + "enable_features": [ + "ChromeIdentitySurveySwitchProfileFromProfilePicker" + ] + } + ] + } + ], "ChromeOSARCVMLmkPerceptibleMinState": [ { "platforms": [ @@ -5331,21 +5753,6 @@ ] } ], - "ChromeRefreshTokenBinding": [ - { - "platforms": [ - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "EnableChromeRefreshTokenBinding" - ] - } - ] - } - ], "ChromeWallpaperSearchGlobal": [ { "platforms": [ @@ -5471,6 +5878,27 @@ ] } ], + "ChromnientAimM3": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "enable-client-side-header": "true" + }, + "enable_features": [ + "LensSearchAimM3" + ] + } + ] + } + ], "ChromnientEduActionChip": [ { "platforms": [ @@ -5498,6 +5926,27 @@ ] } ], + "ChromnientEntrypointLabelAlt": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "id": "1" + }, + "enable_features": [ + "LensOverlayEntrypointLabelAlt" + ] + } + ] + } + ], "ChromnientFetchSrp": [ { "platforms": [ @@ -5615,6 +6064,45 @@ ] } ], + "ChromnientTextSelectionContextMenuEntrypoint": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_Contextualized", + "params": { + "contextualize": "true" + }, + "enable_features": [ + "LensOverlayTextSelectionContextMenuEntrypoint" + ] + } + ] + } + ], + "ChromnientUpdatedClientContext": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_20250826", + "enable_features": [ + "LensOverlayUpdatedClientContext" + ] + } + ] + } + ], "ChromnientUpdatedVisuals": [ { "platforms": [ @@ -5747,22 +6235,7 @@ ] } ], - "ClassManagementEnabledMetricsProvider": [ - { - "platforms": [ - "chromeos" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "ClassManagementEnabledMetricsProvider" - ] - } - ] - } - ], - "ClaySnackbarOnAndroid": [ + "CleanupLegacyTabState": [ { "platforms": [ "android" @@ -5771,7 +6244,7 @@ { "name": "Enabled", "enable_features": [ - "ClaySnackbar" + "CleanupLegacyTabState" ] } ] @@ -5844,6 +6317,12 @@ "experiments": [ { "name": "Enabled", + "params": { + "HCAcceptanceRate": "1.0", + "MaxLength": "100", + "MinLength": "30", + "SampleRate": "1.0" + }, "enable_features": [ "ClientSideDetectionClipboardCopyApi" ] @@ -6013,26 +6492,6 @@ ] } ], - "CodeBasedRBD": [ - { - "platforms": [ - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled_20230420", - "params": { - "code-based-rbd": "true" - }, - "enable_features": [ - "CodeBasedRBD" - ] - } - ] - } - ], "CollectAndroidFrameTimelineMetricsStudy": [ { "platforms": [ @@ -6594,16 +7053,19 @@ ] } ], - "ContextualPageActionTabGrouping": [ + "ContentVerifyJobUseJobVersionForHashing": [ { "platforms": [ - "android" + "chromeos", + "linux", + "mac", + "windows" ], "experiments": [ { "name": "Enabled", "enable_features": [ - "ContextualPageActionTabGrouping" + "ContentVerifyJobUseJobVersionForHashing" ] } ] @@ -6644,6 +7106,24 @@ ] } ], + "ContextualSuggestionsAnimationImprovements": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "LoadingSuggestionsAnimationEnabled", + "enable_features": [ + "LoadingSuggestionsAnimation" + ] + } + ] + } + ], "ControlsVisibilityFromNavigations": [ { "platforms": [ @@ -7348,6 +7828,21 @@ ] } ], + "CreateTabHelperOnlyForRealizedWebStates": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "CreateTabHelperOnlyForRealizedWebStates" + ] + } + ] + } + ], "CreateURLLoaderPipeAsync": [ { "platforms": [ @@ -7416,6 +7911,21 @@ ] } ], + "CrosBatteryChargeLimit": [ + { + "platforms": [ + "chromeos" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "CrosBatteryChargeLimit" + ] + } + ] + } + ], "CrosBatterySaver": [ { "platforms": [ @@ -7542,6 +8052,22 @@ ] } ], + "D3D12VideoEncodeAccelerator": [ + { + "platforms": [ + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "D3D12SharedImageEncode", + "D3D12VideoEncodeAccelerator" + ] + } + ] + } + ], "DOMStorageReliabilityEnhancements": [ { "platforms": [ @@ -7596,6 +8122,7 @@ "DSEPrewarm": [ { "platforms": [ + "android", "chromeos", "linux" ], @@ -7609,7 +8136,8 @@ }, "enable_features": [ "Prerender2ReuseHost", - "Prewarm" + "Prewarm", + "ReusePrerenderingProcessForMainFrames" ] } ] @@ -7820,7 +8348,6 @@ "params": { "create_speculative_rfh_delay_ms": "1", "create_speculative_rfh_filter_restore": "true", - "wait_until_final_response": "true", "warmup_spare_process": "true" }, "enable_features": [ @@ -7961,6 +8488,24 @@ ] } ], + "DesktopMediaPickerMultiLineTitle": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "DesktopMediaPickerMultiLineTitle" + ] + } + ] + } + ], "DesktopNtpDriveCache": [ { "platforms": [ @@ -7982,6 +8527,24 @@ ] } ], + "DesktopNtpDriveHistorySyncRequirement": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "NtpDriveModuleHistorySyncRequirement" + ] + } + ] + } + ], "DesktopNtpFooter": [ { "platforms": [ @@ -8141,46 +8704,6 @@ ] } ], - "DesktopOmniboxContextualSearch": [ - { - "platforms": [ - "chromeos", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "_enabled_OnFocusZPS_NoPrefetch_ContextualSearch_LensAction", - "params": { - "OmniboxZpsMaxSearchSuggestions": "6", - "OmniboxZpsMaxSuggestions": "6", - "OmniboxZpsMaxUrlSuggestions": "0" - }, - "enable_features": [ - "ContextualSuggestionsAblateOthersWhenPresent", - "ContextualZeroSuggestLensFulfillment", - "HappinessTrackingSurveyForOmniboxOnFocusZps", - "LensOverlayContextualSearchboxForOmniboxSuggestions", - "LensOverlayVisualSelectionUpdatesForOmniboxSuggestions", - "OmniboxContextualSearchOnFocusSuggestions", - "OmniboxFocusTriggersWebAndSRPZeroSuggest", - "OmniboxHideSuggestionGroupHeaders", - "OmniboxShowPopupOnMouseReleased", - "OmniboxZpsSuggestionLimit", - "SendContextualUrlSuggestParam", - "SendPageTitleSuggestParam", - "ShowSuggestionsOnNoApc", - "UseApcPaywallSignal" - ], - "disable_features": [ - "LensOverlayOmniboxEntryPoint", - "OmniboxUrlSuggestionsOnFocus" - ] - } - ] - } - ], "DesktopOmniboxRichAutocompletionMinChar": [ { "platforms": [ @@ -8291,6 +8814,27 @@ ] } ], + "DevToolsAiSubmenuPrompts": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "DevToolsAiSubmenuPrompts" + ], + "disable_features": [ + "DevToolsAiDebugWithAi" + ] + } + ] + } + ], "DeviceBoundSessionAccessObserverSharedRemote": [ { "platforms": [ @@ -8418,7 +8962,7 @@ ], "experiments": [ { - "name": "DirtyWritebackMaxBytes", + "name": "Enabled", "enable_features": [ "CrOSLateBootDirtyWritebackMaxBytes" ] @@ -8709,21 +9253,6 @@ ] } ], - "DiscountsOnAndroid": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "EnableDiscountInfoApi" - ] - } - ] - } - ], "DiskCacheBackendExperiment": [ { "platforms": [ @@ -8762,6 +9291,24 @@ ] } ], + "DisplayMediaRejectLongDomains": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "DisplayMediaRejectLongDomains" + ] + } + ] + } + ], "DlpRegionalizedEndpoints": [ { "platforms": [ @@ -9033,21 +9580,6 @@ ] } ], - "EdgeToEdgeDebugging": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Control", - "disable_features": [ - "EdgeToEdgeDebugging" - ] - } - ] - } - ], "EdgeToEdgeEverywhere": [ { "platforms": [ @@ -9155,6 +9687,22 @@ ] } ], + "EnableA2APayments": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AutofillEnableSeparatePixPreferenceItem", + "FacilitatedPaymentsEnableA2APayment" + ] + } + ] + } + ], "EnableADPFSeparateRendererMainSession": [ { "platforms": [ @@ -9221,6 +9769,21 @@ ] } ], + "EnableClipboardDataControlsAndroid": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled_140", + "enable_features": [ + "EnableClipboardDataControlsAndroid" + ] + } + ] + } + ], "EnableConfigurableThreadCacheMultiplier": [ { "platforms": [ @@ -9515,6 +10078,22 @@ ] } ], + "EnablePreferencesAccountStorageChromeOS": [ + { + "platforms": [ + "chromeos" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "EnablePreferencesAccountStorage", + "SyncSupportAlwaysSyncingPriorityPreferences" + ] + } + ] + } + ], "EnablePrintWatermark": [ { "platforms": [ @@ -10236,63 +10815,6 @@ ] } ], - "FedCmIntrusionMitigation": [ - { - "platforms": [ - "android", - "android_weblayer", - "chromeos", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "CooldownOnIgnore", - "params": { - "FirstDismissal": "24", - "FourthDismissal": "28", - "SecondDismissal": "5", - "ThirdDismissal": "14" - }, - "enable_features": [ - "FedCmCooldownOnIgnore" - ], - "disable_features": [ - "FedCmUpdatedCooldownPeriod" - ] - }, - { - "name": "UpdatedCooldownPeriod", - "params": { - "FirstDismissal": "24", - "FourthDismissal": "28", - "SecondDismissal": "5", - "ThirdDismissal": "14" - }, - "enable_features": [ - "FedCmUpdatedCooldownPeriod" - ], - "disable_features": [ - "FedCmCooldownOnIgnore" - ] - }, - { - "name": "CooldownOnIgnoreAndUpdatedCooldown", - "params": { - "FirstDismissal": "24", - "FourthDismissal": "28", - "SecondDismissal": "5", - "ThirdDismissal": "14" - }, - "enable_features": [ - "FedCmCooldownOnIgnore", - "FedCmUpdatedCooldownPeriod" - ] - } - ] - } - ], "FedCmSegmentationPlatform": [ { "platforms": [ @@ -10539,32 +11061,6 @@ }, "enable_features": [ "EnableFingerprintingProtectionFilter" - ], - "disable_features": [ - "FingerprintingProtectionUx" - ] - } - ] - } - ], - "FingerprintingProtectionFilterIncognito": [ - { - "platforms": [ - "android", - "chromeos", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled_20250416", - "params": { - "enable_console_logging": "true", - "performance_measurement_rate": "1.0" - }, - "enable_features": [ - "EnableFingerprintingProtectionFilterInIncognito" ] } ] @@ -10909,7 +11405,7 @@ ] } ], - "GlicAssetsUpdate": [ + "Glic1PTools": [ { "platforms": [ "mac", @@ -10919,8 +11415,24 @@ { "name": "Enabled", "enable_features": [ - "GlicAssetsV2", - "GlicParameterizedShader" + "GlicExtensions" + ] + } + ] + } + ], + "GlicAppendModelQualityClientId": [ + { + "platforms": [ + "mac", + "windows", + "linux" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "GlicAppendModelQualityClientId" ] } ] @@ -11026,6 +11538,60 @@ ] } ], + "GlicMultitabContext": [ + { + "platforms": [ + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "GlicMultiTab", + "GlicMultitabUnderlines" + ] + } + ] + } + ], + "GlicResetPanelPositionOnNewThread": [ + { + "platforms": [ + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "glic-panel-reset-session-timeout-delay-h": "1" + }, + "enable_features": [ + "GlicPanelResetOnSessionTimeout", + "GlicPanelResetOnStart", + "GlicPanelSetPositionOnDrag" + ] + } + ] + } + ], + "GlicResetPanelSizeAndLocationOnOpen": [ + { + "platforms": [ + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "GlicPanelResetSizeAndLocationOnOpen" + ] + } + ] + } + ], "GlicRolloutDogfood": [ { "platforms": [ @@ -11119,6 +11685,21 @@ ] } ], + "GlobalCacheListForGatingNotificationProtections": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "GlobalCacheListForGatingNotificationProtections" + ] + } + ] + } + ], "GlobalVaapiLock": [ { "platforms": [ @@ -11888,13 +12469,8 @@ "experiments": [ { "name": "EnabledMultiKey_20250708", - "params": { - "nonstable-probability": "1.0", - "stable-probability": "1.0" - }, "enable_features": [ - "HeapProfilerMultiKeyHashSet", - "HeapProfilerReporting" + "HeapProfilerMultiKeyHashSet" ] } ] @@ -12105,18 +12681,35 @@ ], "experiments": [ { - "name": "Enabled_NVS_Omnibox_Prefetch", + "name": "Enabled_NVS_HttpCache_Only", "enable_features": [ - "HttpCacheNoVarySearch", - "LogDuplicateRequests", - "SearchPrefetchWithNoVarySearchDiskCache" + "HttpCacheNoVarySearch" + ], + "disable_features": [ + "DsePreload2", + "PrefetchPrerenderIntegration" ] }, { - "name": "Enabled_NVS_HttpCache_Only", + "name": "Enabled_NVS_Omnibox_Prefetch", "enable_features": [ "HttpCacheNoVarySearch", - "LogDuplicateRequests" + "SearchPrefetchWithNoVarySearchDiskCache" + ], + "disable_features": [ + "DsePreload2", + "PrefetchPrerenderIntegration" + ] + }, + { + "name": "Enabled_DsePreload2", + "enable_features": [ + "DsePreload2", + "HttpCacheNoVarySearch", + "PrefetchPrerenderIntegration" + ], + "disable_features": [ + "SearchPrefetchWithNoVarySearchDiskCache" ] } ] @@ -12206,6 +12799,21 @@ ] } ], + "IOSAIHubNewBadge": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AIHubNewBadge" + ] + } + ] + } + ], "IOSAIModeNTPEntryPoint": [ { "platforms": [ @@ -12247,6 +12855,30 @@ "enable_features": [ "kNTPMIAEntrypoint" ] + }, + { + "name": "EnabledWithAIMInQuickActions", + "params": { + "kNTPMIAEntrypointParam": "kNTPMIAEntrypointParamAIMInQuickActions" + }, + "enable_features": [ + "kNTPMIAEntrypoint" + ] + } + ] + } + ], + "IOSAutofillBadgeRemoval": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AutofillBadgeRemoval" + ] } ] } @@ -12411,21 +13043,6 @@ ] } ], - "IOSChromeAsyncExperience": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "ChromeStartupParametersAsync" - ] - } - ] - } - ], "IOSChromnientEscapeHatch": [ { "platforms": [ @@ -12442,36 +13059,6 @@ ] } ], - "IOSChromnientIPad": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "EnableLensOverlayForceIPadSupport" - ] - } - ] - } - ], - "IOSContainedTabGroup": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "ContainedTabGroup" - ] - } - ] - } - ], "IOSCriteriaExperimentEnabled": [ { "platforms": [ @@ -12487,6 +13074,21 @@ ] } ], + "IOSDefaultBrowserOffCyclePromo": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "IOSDefaultBrowserOffCyclePromo" + ] + } + ] + } + ], "IOSDefaultBrowserPromoPropensityStudy": [ { "platforms": [ @@ -12517,24 +13119,6 @@ ] } ], - "IOSDeprecateFeedHeader": [ - { - "platforms": [ - "ios" - ], - "form_factors": [ - "phone" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "DeprecateFeedHeader" - ] - } - ] - } - ], "IOSDockingPromo": [ { "platforms": [ @@ -12715,21 +13299,6 @@ ] } ], - "IOSFeedbackGWSVariationsIds": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "FeedbackIncludeGWSVariations" - ] - } - ] - } - ], "IOSFullscreenImprovement": [ { "platforms": [ @@ -12856,21 +13425,6 @@ ] } ], - "IOSKeyboardAccessoryUpgradeForIPad": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "IOSKeyboardAccessoryUpgradeForIPad" - ] - } - ] - } - ], "IOSLensFetchSrp": [ { "platforms": [ @@ -12937,6 +13491,21 @@ ] } ], + "IOSLogInstallAttribution": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "IOSLogInstallAttribution" + ] + } + ] + } + ], "IOSManageAccountStorage": [ { "platforms": [ @@ -12967,6 +13536,21 @@ ] } ], + "IOSMemoryAblation": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "IOSMemoryAblation" + ] + } + ] + } + ], "IOSMiniMapUniversalLink": [ { "platforms": [ @@ -13052,36 +13636,30 @@ ], "experiments": [ { - "name": "Enabled_8", + "name": "Default", "params": { - "brp-extra-extras-size": "8" + "brp-suppress-corruption-detected-crash": "true" }, "enable_features": [ "PartitionAllocBackupRefPtr" ] }, { - "name": "Enabled_24", + "name": "Enabled_Without_Supression_Holdback", "params": { - "brp-extra-extras-size": "24" + "brp-suppress-corruption-detected-crash": "false" }, "enable_features": [ "PartitionAllocBackupRefPtr" ] - } - ] - } - ], - "IOSPartitionAllocMemoryReclaimer": [ - { - "platforms": [ - "ios" - ], - "experiments": [ + }, { - "name": "Disabled", + "name": "Control_Holdback", + "params": { + "brp-suppress-corruption-detected-crash": "false" + }, "disable_features": [ - "PartitionAllocMemoryReclaimer" + "PartitionAllocBackupRefPtr" ] } ] @@ -13169,10 +13747,13 @@ { "name": "Enabled", "enable_features": [ + "EnableReadabilityHeuristic", "EnableReaderMode", "EnableReaderModeDefaultBrowserPromo", - "EnableReaderModePageEligibilityForToolsMenu", "ReaderModeUseReadability" + ], + "disable_features": [ + "EnableReaderModePageEligibilityForToolsMenu" ] } ] @@ -13253,21 +13834,6 @@ ] } ], - "IOSSignInButtonWithoutAvatar": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "SignInButtonNoAvatar" - ] - } - ] - } - ], "IOSSkipCookieCaching": [ { "platforms": [ @@ -13464,7 +14030,7 @@ ] } ], - "IOSYoutubeIncogntoBlingIncognitoExperience": [ + "IOSYoutubeIncognitoBlingIncognitoExperience": [ { "platforms": [ "ios" @@ -13473,6 +14039,7 @@ { "name": "Enabled", "enable_features": [ + "ChromeStartupParametersAsync", "YoutubeIncognito" ] } @@ -13499,28 +14066,33 @@ "platforms": [ "android", "chromeos", + "chromeos_lacros", "linux", "mac", "windows" ], "experiments": [ { - "name": "enabled_baseline_2025-03-19_Stable_Perf_External", + "name": "enabled_incognito_full_mdl_Canary_Dev_2025-08-06_North_America", "params": { - "IpPrivacyAuthTokenCacheBatchSize": "64", - "IpPrivacyAuthTokenCacheLowWaterMark": "16", - "IpPrivacyBsaEnablePrivacyPass": "true", - "IpPrivacyCacheTokensByGeo": "true", - "IpPrivacyDebugExperimentArm": "6", + "BypassProbabilisticRevealTokenRegistry": "false", + "IpPrivacyDebugExperimentArm": "30", "IpPrivacyDirectOnly": "false", - "IpPrivacyUseProxyChains": "true", + "IpPrivacyEnableIppInDevTools": "true", + "IpPrivacyEnableUserBypass": "true", + "IpPrivacyOnlyInIncognito": "true", "IpPrivacyUseQuicProxies": "false", - "MaskedDomainListExperimentalVersion": "" + "MaskedDomainListExperimentalVersion": "2025.8.8.0", + "ProbabilisticRevealTokenFetchOnly": "false", + "ProbabilisticRevealTokensOnlyInIncognito": "false" }, "enable_features": [ "EnableIpPrivacyProxy", - "MaskedDomainList", - "PartitionProxyChains" + "IpProtectionUx", + "MaskedDomainList" + ], + "disable_features": [ + "EnableProbabilisticRevealTokens" ] } ] @@ -13679,7 +14251,7 @@ ], "experiments": [ { - "name": "Enabled", + "name": "InputOnVizEnabled", "enable_features": [ "InputOnViz" ] @@ -14305,30 +14877,6 @@ ] } ], - "LegacyTabStateDeprecation": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled_Delete_Migrated_Files_After_Restore_20250319", - "params": { - "delete_migrated_files_after_restore": "true" - }, - "enable_features": [ - "LegacyTabStateDeprecation" - ] - }, - { - "name": "Enabled_20250319", - "enable_features": [ - "LegacyTabStateDeprecation" - ] - } - ] - } - ], "LensOverlayBackToLivePage": [ { "platforms": [ @@ -14457,6 +15005,30 @@ ] } ], + "LoadNativeEarly": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled_ConcurrentLoad", + "params": { + "concurrent_load": "true" + }, + "enable_features": [ + "LoadNativeEarly" + ] + }, + { + "name": "Enabled", + "enable_features": [ + "LoadNativeEarly" + ] + } + ] + } + ], "LoadingPhaseBufferTimeAfterFirstMeaningfulPaint": [ { "platforms": [ @@ -14659,7 +15231,10 @@ { "platforms": [ "android", - "android_webview" + "android_webview", + "linux", + "mac", + "windows" ], "experiments": [ { @@ -14716,6 +15291,7 @@ { "name": "Enabled", "enable_features": [ + "GetDisplayMediaIgnoreAudioPermissionFailures", "MacCatapLoopbackAudioForScreenShare" ] } @@ -14755,21 +15331,6 @@ ] } ], - "MacKeychainApiMigration": [ - { - "platforms": [ - "mac" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "AppleKeychainUseSecItem" - ] - } - ] - } - ], "MahiEnabled": [ { "platforms": [ @@ -15008,10 +15569,27 @@ ] } ], + "MemoryCacheIntelligentPruning": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "MemoryCacheIntelligentPruning" + ] + } + ] + } + ], "MemoryCacheStrongRefPruningTuneUp": [ { "platforms": [ - "android", "chromeos", "linux", "mac", @@ -15028,18 +15606,10 @@ "enable_features": [ "MemoryCacheChangeStrongReferencePruneDelay", "MemoryCacheStrongReference" - ] - }, - { - "name": "DefaultsX3", - "params": { - "memory_cache_strong_ref_resource_size_threshold": "9437184", - "memory_cache_strong_ref_total_size_threshold": "47185920", - "strong_reference_prune_delay": "15m" - }, - "enable_features": [ - "MemoryCacheChangeStrongReferencePruneDelay", - "MemoryCacheStrongReference" + ], + "disable_features": [ + "ReleaseResourceDecodedDataOnMemoryPressure", + "ReleaseResourceStrongReferencesOnMemoryPressure" ] }, { @@ -15052,63 +15622,10 @@ "enable_features": [ "MemoryCacheChangeStrongReferencePruneDelay", "MemoryCacheStrongReference" - ] - } - ] - } - ], - "MemoryPurgeInBackground": [ - { - "platforms": [ - "android", - "chromeos", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "DisableAll", - "enable_features": [ - "ForwardMemoryPressureToBlinkIsolates", + ], + "disable_features": [ "ReleaseResourceDecodedDataOnMemoryPressure", "ReleaseResourceStrongReferencesOnMemoryPressure" - ], - "disable_features": [ - "MemoryPurgeInBackground" - ] - }, - { - "name": "DisableGC", - "enable_features": [ - "MemoryPurgeInBackground", - "ReleaseResourceDecodedDataOnMemoryPressure", - "ReleaseResourceStrongReferencesOnMemoryPressure" - ], - "disable_features": [ - "ForwardMemoryPressureToBlinkIsolates" - ] - }, - { - "name": "DisableStrongReferences", - "enable_features": [ - "ForwardMemoryPressureToBlinkIsolates", - "MemoryPurgeInBackground", - "ReleaseResourceDecodedDataOnMemoryPressure" - ], - "disable_features": [ - "ReleaseResourceStrongReferencesOnMemoryPressure" - ] - }, - { - "name": "DisableDecodedData", - "enable_features": [ - "ForwardMemoryPressureToBlinkIsolates", - "MemoryPurgeInBackground", - "ReleaseResourceStrongReferencesOnMemoryPressure" - ], - "disable_features": [ - "ReleaseResourceDecodedDataOnMemoryPressure" ] } ] @@ -15253,6 +15770,21 @@ ] } ], + "MigrateIOSKeychainAccessibility": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "MigrateIOSKeychainAccessibility" + ] + } + ] + } + ], "MiniOriginBar": [ { "platforms": [ @@ -15325,27 +15857,6 @@ ] } ], - "MojoIpcChannelReceive": [ - { - "platforms": [ - "android", - "chromeos", - "fuchsia", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Disabled", - "disable_features": [ - "MojoIpcChannelReceive" - ] - } - ] - } - ], "MojoPredictiveAllocation": [ { "platforms": [ @@ -15365,21 +15876,6 @@ ] } ], - "MostVisitedTilesVisualDeduplication": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "MostVisitedTilesVisualDeduplication" - ] - } - ] - } - ], "MultiCalendarSupport": [ { "platforms": [ @@ -15431,21 +15927,6 @@ ] } ], - "MvcUpdateViewWhenModelChanged": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "MvcUpdateViewWhenModelChanged" - ] - } - ] - } - ], "NavigationThrottleRegistryAttributeCache": [ { "platforms": [ @@ -15627,7 +16108,6 @@ { "name": "Enabled", "params": { - "http_cache_transaction": "true", "http_proxy_connect_job": "true", "http_stream_factory_job": "true", "http_stream_factory_job_controller": "true", @@ -15642,6 +16122,17 @@ "NetTaskScheduler", "NetworkServiceTaskScheduler" ] + }, + { + "name": "Enabled2", + "params": { + "http_cache": "true", + "http_cache_transaction": "true" + }, + "enable_features": [ + "NetTaskScheduler", + "NetworkServiceTaskScheduler" + ] } ] } @@ -15677,20 +16168,14 @@ "enable_features": [ "NewContentForCheckerboardedScrolls" ] - } - ] - } - ], - "NewTabPageCustomization": [ - { - "platforms": [ - "android" - ], - "experiments": [ + }, { - "name": "Enabled", + "name": "per_frame", + "params": { + "mode": "per_frame" + }, "enable_features": [ - "NewTabPageCustomization" + "NewContentForCheckerboardedScrolls" ] } ] @@ -15711,6 +16196,24 @@ ] } ], + "NewTabsInGroups": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "NewTabAddsToActiveGroup" + ] + } + ] + } + ], "NimbleCollisionAvoidanceV1": [ { "platforms": [ @@ -15726,25 +16229,6 @@ ] } ], - "NoLateBeginFrames": [ - { - "platforms": [ - "android", - "android_webview", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "NoLateBeginFrames" - ] - } - ] - } - ], "NoPasswordSuggestionFiltering": [ { "platforms": [ @@ -15866,6 +16350,29 @@ ] } ], + "NotificationTelemetrySwb": [ + { + "platforms": [ + "android", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "NotificationTelemetrySwbPollingInterval": "60", + "NotificationTelemetrySwbSendReports": "true" + }, + "enable_features": [ + "NotificationTelemetrySwb" + ] + } + ] + } + ], "NotificationWidthIncrease": [ { "platforms": [ @@ -15896,6 +16403,27 @@ ] } ], + "NtpBrowserPromos": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "promo-type": "setuplist" + }, + "enable_features": [ + "EnableNtpBrowserPromos" + ] + } + ] + } + ], "NtpComposeboxDesktop": [ { "platforms": [ @@ -15909,9 +16437,13 @@ { "name": "Enabled", "params": { - "ConfigParam": "CgIIAxI8CAEQARoXCAAQ4MZbGMAMIMAMKCgyB2ltYWdlLyoiGwiAhK9fEhQucGRmLGFwcGxpY2F0aW9uL3BkZigB" + "ConfigParam": "CgIIAxI8CAEQARoXCAAQ4MZbGMAMIMAMKCgyB2ltYWdlLyoiGwiAhK9fEhQucGRmLGFwcGxpY2F0aW9uL3BkZigB", + "SendLnsSurfaceParam": "true", + "ShowComposeboxZps": "true", + "ShowContextMenu": "true" }, "enable_features": [ + "ComposeboxUsesChromeComposeClient", "NtpComposebox" ] } @@ -16048,6 +16580,22 @@ ] } ], + "OfferPinToTaskbarInfoBar": [ + { + "platforms": [ + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "OfferPinToTaskbarInfoBar" + ] + } + ] + } + ], "OfferPinToTaskbarWhenSettingDefault": [ { "platforms": [ @@ -16078,6 +16626,25 @@ "enable_features": [ "OffloadAcceptCHFrameCheck" ] + }, + { + "name": "EnabledWithRedirect", + "params": { + "AcceptCHOffloadWithRedirect": "true" + }, + "enable_features": [ + "OffloadAcceptCHFrameCheck" + ] + }, + { + "name": "EnabledWithRedirectAndSubframe", + "params": { + "AcceptCHOffloadForSubframe": "true", + "AcceptCHOffloadWithRedirect": "true" + }, + "enable_features": [ + "OffloadAcceptCHFrameCheck" + ] } ] } @@ -16255,21 +16822,6 @@ ] } ], - "OmniboxElegantTextHeight": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "OmniboxElegantTextHeight" - ] - } - ] - } - ], "OmniboxInspireMePhase2": [ { "platforms": [ @@ -16365,6 +16917,36 @@ ] } ], + "OmniboxMobileParityUpdateV3": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "OmniboxMobileParityUpdateV3" + ] + } + ] + } + ], + "OmniboxMultimodalInput": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "disable_features": [ + "OmniboxMultimodalInput" + ] + } + ] + } + ], "OmniboxOnDeviceBrainModel": [ { "platforms": [ @@ -16459,22 +17041,6 @@ ] } ], - "OmniboxTextAndAnimationOptimizations": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled_20230811", - "enable_features": [ - "AvoidRelayoutDuringFocusAnimation", - "ScrollToTLDOptimization" - ] - } - ] - } - ], "OnDeviceStorage": [ { "platforms": [ @@ -16566,6 +17132,23 @@ ] } ], + "OptimizationGuideOnDeviceModelCpuBackend": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "OnDeviceModelCpuBackend" + ] + } + ] + } + ], "OptimizeAssociateWindowsAndroid": [ { "platforms": [ @@ -16775,44 +17358,6 @@ ] } ], - "PWANavigationCapturingV2WindowMacLinux": [ - { - "platforms": [ - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "EnabledSettingOnByDefault20241105", - "params": { - "link_capturing_state": "reimpl_default_on" - }, - "enable_features": [ - "PwaNavigationCapturing" - ] - }, - { - "name": "EnabledSettingOffByDefault20241105", - "params": { - "link_capturing_state": "reimpl_default_off" - }, - "enable_features": [ - "PwaNavigationCapturing" - ] - }, - { - "name": "EnabledSettingOnForClientModes", - "params": { - "link_capturing_state": "reimpl_on_via_client_mode" - }, - "enable_features": [ - "PwaNavigationCapturing" - ] - } - ] - } - ], "PageActionsMigration": [ { "platforms": [ @@ -16826,6 +17371,8 @@ "name": "Enabled", "params": { "autofill_address": "true", + "click_to_call": "true", + "collaboration_messaging": "true", "discounts": "true", "file_system_access": "true", "find": "true", @@ -16837,7 +17384,7 @@ "offer_notification": "true", "price_insights": "true", "price_tracking": "true", - "product_specifications": "true", + "pwa_install": "true", "translate": "true", "zoom": "true" }, @@ -17238,25 +17785,22 @@ { "platforms": [ "android", - "android_webview", "chromeos", - "fuchsia", "linux", "mac", "windows" ], "experiments": [ { - "name": "Enabled", + "name": "enabled_1M_20250822", "params": { - "PartitionAllocSchedulerLoopQuarantineConfig": "{\"browser\":{\"main\":{\"enable-quarantine\":true,\"enable-zapping\":true,\"leak-on-destruction\":false,\"branch-capacity-in-bytes\":1048576}}}", + "PartitionAllocSchedulerLoopQuarantineConfig": "{\"browser\":{\"main\":{\"branch-capacity-in-bytes\":1048576,\"enable-quarantine\":true,\"enable-zapping\":true,\"leak-on-destruction\":false}}}", "enabled-processes": "browser-only" }, "enable_features": [ "PartitionAllocSchedulerLoopQuarantine", "PartitionAllocSchedulerLoopQuarantineTaskObserverForBrowserUIThread", - "PartitionAllocWithAdvancedChecks", - "PartitionAllocZappingByFreeFlags" + "PartitionAllocWithAdvancedChecks" ] } ] @@ -18311,6 +18855,24 @@ ] } ], + "PrefetchNewTabPageTrigger": [ + { + "platforms": [ + "linux", + "mac", + "windows", + "chromeos" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "NewTabPageTriggerForPrefetch" + ] + } + ] + } + ], "PrefetchProxyDesktop": [ { "platforms": [ @@ -18432,74 +18994,9 @@ ] } ], - "PreloadingDeterministicViewportBasedPredictorAndroid": [ + "PreloadingEagerHeuristicsForDesktop": [ { "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Aggressive_20250428", - "params": { - "delay": "500ms", - "distance_from_ptr_down_hi": "0.0", - "distance_from_ptr_down_low": "-0.3", - "enact_candidates": "true", - "intersection_observation_after_fcp_only": "true", - "intersection_observer_delay": "1000ms", - "largest_anchor_threshold": "0.25", - "max_intersection_observations": "60", - "random_anchor_sampling_period": "1" - }, - "enable_features": [ - "NavigationPredictor", - "PreloadingViewportHeuristics" - ] - }, - { - "name": "Moderate_20250428", - "params": { - "delay": "1000ms", - "distance_from_ptr_down_hi": "0.0", - "distance_from_ptr_down_low": "-0.3", - "enact_candidates": "true", - "intersection_observation_after_fcp_only": "true", - "intersection_observer_delay": "1000ms", - "largest_anchor_threshold": "0.25", - "max_intersection_observations": "60", - "random_anchor_sampling_period": "1" - }, - "enable_features": [ - "NavigationPredictor", - "PreloadingViewportHeuristics" - ] - }, - { - "name": "Conservative_20250428", - "params": { - "delay": "1000ms", - "distance_from_ptr_down_hi": "0.0", - "distance_from_ptr_down_low": "-0.3", - "enact_candidates": "true", - "intersection_observation_after_fcp_only": "true", - "intersection_observer_delay": "1000ms", - "largest_anchor_threshold": "0.5", - "max_intersection_observations": "60", - "random_anchor_sampling_period": "1" - }, - "enable_features": [ - "NavigationPredictor", - "PreloadingViewportHeuristics" - ] - } - ] - } - ], - "PreloadingNoSamePageFragmentAnchorTracking": [ - { - "platforms": [ - "android", - "android_webview", "chromeos", "chromeos_lacros", "linux", @@ -18508,9 +19005,39 @@ ], "experiments": [ { - "name": "Enabled", + "name": "5ms", + "params": { + "hover_dwell_time": "5ms" + }, "enable_features": [ - "PreloadingNoSamePageFragmentAnchorTracking" + "PreloadingEagerHeuristics" + ] + }, + { + "name": "10ms", + "params": { + "hover_dwell_time": "10ms" + }, + "enable_features": [ + "PreloadingEagerHeuristics" + ] + }, + { + "name": "20ms", + "params": { + "hover_dwell_time": "20ms" + }, + "enable_features": [ + "PreloadingEagerHeuristics" + ] + }, + { + "name": "35ms", + "params": { + "hover_dwell_time": "35ms" + }, + "enable_features": [ + "PreloadingEagerHeuristics" ] } ] @@ -18557,47 +19084,6 @@ ] } ], - "Prerender2NewTabPageTriggerV2": [ - { - "platforms": [ - "linux", - "mac", - "windows", - "chromeos" - ], - "experiments": [ - { - "name": "BothMouseDownAndMouseHover_20241010", - "params": { - "prerender_new_tab_page_on_mouse_hover_trigger": "true", - "prerender_new_tab_page_on_mouse_pressed_trigger": "true", - "prerender_start_delay_on_mouse_hover_ms": "300" - }, - "enable_features": [ - "NewTabPageTriggerForPrerender2" - ] - } - ] - } - ], - "Prerender2ReuseSearchResultHostAndroid": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "params": { - "reuse_search_host": "true" - }, - "enable_features": [ - "Prerender2ReuseHost" - ] - } - ] - } - ], "PreserveDiscardableImageMapQuality": [ { "platforms": [ @@ -18861,6 +19347,25 @@ ] } ], + "PrivacySandboxGetPromptFromNoticeService": [ + { + "platforms": [ + "linux", + "windows", + "android", + "mac", + "chromeos" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "PrivacySandboxGetPromptFromNoticeService" + ] + } + ] + } + ], "PrivacySandboxInternalsDevUI": [ { "platforms": [ @@ -19600,6 +20105,27 @@ ] } ], + "ProtoBasedEnterpriseReporting": [ + { + "platforms": [ + "chromeos", + "fuchsia", + "linux", + "mac", + "windows", + "android", + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "UploadRealtimeReportingEventsUsingProto" + ] + } + ] + } + ], "ProvisionalNotificationAlert": [ { "platforms": [ @@ -19938,24 +20464,6 @@ ] } ], - "ReadAnythingPermanentAccessibility": [ - { - "platforms": [ - "chromeos", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "ReadAnythingPermanentAccessibility" - ] - } - ] - } - ], "ReadAnythingReadAloudDesktop": [ { "platforms": [ @@ -20087,6 +20595,37 @@ ] } ], + "ReduceAcceptLanguageCount": [ + { + "platforms": [ + "android", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_5", + "params": { + "MaxAcceptLanguage": "5" + }, + "enable_features": [ + "ReduceAcceptLanguageCount" + ] + }, + { + "name": "Enabled_10", + "params": { + "MaxAcceptLanguage": "10" + }, + "enable_features": [ + "ReduceAcceptLanguageCount" + ] + } + ] + } + ], "ReduceAcceptLanguageHTTP": [ { "platforms": [ @@ -20106,28 +20645,6 @@ ] } ], - "ReduceCallingServiceWorkerRegisteredStorageKeysOnStartup": [ - { - "platforms": [ - "android", - "android_webview", - "chromeos", - "chromeos_lacros", - "fuchsia", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "ReduceCallingServiceWorkerRegisteredStorageKeysOnStartup", - "enable_features": [ - "ReduceCallingServiceWorkerRegisteredStorageKeysOnStartup" - ] - } - ] - } - ], "ReduceCpuUtilization2": [ { "platforms": [ @@ -20317,21 +20834,6 @@ ] } ], - "ReloadTabUiResourcesIfChanged": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "ReloadTabUiResourcesIfChanged" - ] - } - ] - } - ], "RemotePageMetadataAndroid": [ { "platforms": [ @@ -20427,6 +20929,21 @@ ] } ], + "RemoveGreySnapshot": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "RemoveGreySnapshot" + ] + } + ] + } + ], "RemoveRendererProcessLimit": [ { "platforms": [ @@ -20586,17 +21103,7 @@ }, "enable_features": [ "RenderDocument", - "WebViewRenderDocument" - ] - }, - { - "name": "EnabledSubframe", - "params": { - "level": "subframe", - "queueing_level": "full" - }, - "enable_features": [ - "RenderDocument", + "WebViewAsyncDrawOnly", "WebViewRenderDocument" ] } @@ -20641,25 +21148,6 @@ ] } ], - "ReportNotificationContentDetectionDataAndroid": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "params": { - "ReportNotificationContentDetectionDataRate": "100" - }, - "enable_features": [ - "NotificationContentDetectionMqlsLogging", - "ReportNotificationContentDetectionData" - ] - } - ] - } - ], "ReportingEventsForAndroid": [ { "platforms": [ @@ -20675,27 +21163,6 @@ ] } ], - "ReportingServiceAlwaysFlush": [ - { - "platforms": [ - "android", - "android_webview", - "chromeos", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "ReportingServiceAlwaysFlush" - ] - } - ] - } - ], "RequestMainFrameAfterFirstVideoFrame": [ { "platforms": [ @@ -20939,6 +21406,28 @@ ] } ], + "SafeBrowsingExtensionTelemetrySearchHijackingSignal": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "HeuristicCheckIntervalSeconds": "28800", + "HeuristicThreshold": "2" + }, + "enable_features": [ + "SafeBrowsingExtensionTelemetrySearchHijackingSignal" + ] + } + ] + } + ], "SafeBrowsingExternalAppRedirectTelemetry": [ { "platforms": [ @@ -21082,6 +21571,33 @@ ] } ], + "SafetyHubDisruptiveNotificationRevocationDesktop": [ + { + "platforms": [ + "windows", + "mac", + "linux", + "chromeos" + ], + "experiments": [ + { + "name": "Enabled_Moderate_v1", + "params": { + "experiment_version": "1", + "max_engagement_score": "0.0", + "min_engagement_score_delta": "3.0", + "min_notification_count": "4", + "shadow_run": "false", + "waiting_for_metrics_days": "1", + "waiting_time_as_proposed": "1d" + }, + "enable_features": [ + "SafetyHubDisruptiveNotificationRevocation" + ] + } + ] + } + ], "SafetyHubOneOffHats": [ { "platforms": [ @@ -22349,6 +22865,44 @@ ] } ], + "ScriptBlockingDryRunIOS": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "EnableFingerprintingProtectionFilteriOSDryRun" + ] + } + ] + } + ], + "ScriptBlockingIncognito": [ + { + "platforms": [ + "android", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_20250812", + "params": { + "performance_measurement_rate": "1.0" + }, + "enable_features": [ + "EnableFingerprintingProtectionFilterInIncognito", + "FingerprintingProtectionUx" + ] + } + ] + } + ], "SeaPenQueryRewrite": [ { "platforms": [ @@ -22656,6 +23210,35 @@ ] } ], + "SendEmptyGestureScrollUpdate": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "SendEmptyGestureScrollUpdate" + ] + }, + { + "name": "FilterOutEmptyUpdates", + "params": { + "filter_out_empty_updates": "true" + }, + "enable_features": [ + "SendEmptyGestureScrollUpdate" + ] + } + ] + } + ], "SendTabToSelfIOSPushNotifications": [ { "platforms": [ @@ -22733,23 +23316,6 @@ ] } ], - "SeparateProfilesForManagedAccounts": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "IdentityConfirmationSnackbar", - "IdentityDiscAccountMenu", - "SeparateProfilesForManagedAccounts" - ] - } - ] - } - ], "ServerBasedTranscriptionForScreencast": [ { "platforms": [ @@ -22875,6 +23441,27 @@ ] } ], + "ServiceWorkerSyntheticResponse": [ + { + "platforms": [ + "android", + "chromeos", + "chromeos_lacros", + "fuchsia", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "ServiceWorkerSyntheticResponse" + ] + } + ] + } + ], "SettingSearchExplorationHaTS": [ { "platforms": [ @@ -23511,6 +24098,39 @@ ] } ], + "SkiaGraphiteSmallPathAtlas": [ + { + "platforms": [ + "mac" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "min_path_size_for_msaa": "32" + }, + "enable_features": [ + "SkiaGraphiteSmallPathAtlas" + ] + } + ] + } + ], + "SkipDefaultBrowserPromoInFirstRun": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "SkipDefaultBrowserPromoInFirstRun" + ] + } + ] + } + ], "SkipModerateMemoryPressureLevelMac": [ { "platforms": [ @@ -23661,6 +24281,26 @@ ] } ], + "SoftNavigationDetectionPrePaintBasedAttribution": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "SoftNavigationDetectionPrePaintBasedAttribution" + ] + } + ] + } + ], "SonomaAccessibilityActivationRefinements": [ { "platforms": [ @@ -23785,29 +24425,6 @@ ] } ], - "SqlFixedMmapSize": [ - { - "platforms": [ - "android", - "android_weblayer", - "android_webview", - "chromeos", - "fuchsia", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "SqlFixedMmapSize" - ] - } - ] - } - ], "SqlScopedTransactionWebDatabase": [ { "platforms": [ @@ -23831,29 +24448,6 @@ ] } ], - "SqlWalMode": [ - { - "platforms": [ - "android", - "android_weblayer", - "android_webview", - "chromeos", - "fuchsia", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "SqlWALModeOnWebDatabase" - ] - } - ] - } - ], "StandardizedBrowserZoom": [ { "platforms": [ @@ -23909,6 +24503,27 @@ ] } ], + "StickyActivationTest": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "ReportingServiceAlwaysFlush" + ] + } + ] + } + ], "StorageBuckets": [ { "platforms": [ @@ -24022,6 +24637,46 @@ ] } ], + "SuppressMemoryListeners": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_empty", + "params": { + "suppress_memory_listeners_mask": "" + }, + "enable_features": [ + "SuppressMemoryListeners" + ] + } + ] + } + ], + "SuppressMemoryMonitor": [ + { + "platforms": [ + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_empty", + "params": { + "suppress_memory_monitor_mask": "" + }, + "enable_features": [ + "SuppressMemoryMonitor" + ] + } + ] + } + ], "SuppressesNetworkActivitiesOnSlowNetwork": [ { "platforms": [ @@ -24048,21 +24703,6 @@ ] } ], - "SwapNewTabAndNewTabInGroupAndroid": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "SwapNewTabAndNewTabInGroupAndroid" - ] - } - ] - } - ], "SwiftShaderDeprecation": [ { "platforms": [ @@ -24084,6 +24724,26 @@ ] } ], + "SyncDetermineAccountManagedStatus": [ + { + "platforms": [ + "android", + "chromeos", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "SyncDetermineAccountManagedStatus" + ] + } + ] + } + ], "SyncIncreaseNudgeDelayForSingleClient": [ { "platforms": [ @@ -24129,21 +24789,6 @@ ] } ], - "SyncTrustedVaultInfobarImprovements": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "SyncTrustedVaultInfobarImprovements" - ] - } - ] - } - ], "SysPkJPandVKMv3": [ { "platforms": [ @@ -24295,6 +24940,37 @@ ] } ], + "TabCollectionAndroid": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "TabCollectionAndroid", + "TabGroupAndroidVisualDataCleanup" + ] + } + ] + } + ], + "TabGridNewTransitions": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "TabGridNewTransitions" + ] + } + ] + } + ], "TabGroupParityAndroidV2": [ { "platforms": [ @@ -24311,7 +24987,7 @@ ] } ], - "TabGroupSuggestionMetricsOnly": [ + "TabGroupSuggestions": [ { "platforms": [ "android" @@ -24327,7 +25003,9 @@ "group_suggestion_trigger_calculation_on_page_load": "false" }, "enable_features": [ - "GroupSuggestionService" + "ContextualPageActionTabGrouping", + "GroupSuggestionService", + "TabSwitcherGroupSuggestionsAndroid" ] } ] @@ -24406,6 +25084,22 @@ ] } ], + "TabletTabStripOptimizations": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "MvcUpdateViewWhenModelChanged", + "ReloadTabUiResourcesIfChanged" + ] + } + ] + } + ], "TabstripComboButton": [ { "platforms": [ @@ -24552,24 +25246,6 @@ ] } ], - "TcpPortRandomizationWin": [ - { - "platforms": [ - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "params": { - "TcpPortRandomizationWinVersionMinimum": "23" - }, - "enable_features": [ - "TcpPortRandomizationWin" - ] - } - ] - } - ], "TerminateRendererOnBrowserCommitExhaustion": [ { "platforms": [ @@ -25141,16 +25817,16 @@ ] } ], - "UiaProviderWin": [ + "UmaSessionCorrectnessFixes": [ { "platforms": [ - "windows" + "android" ], "experiments": [ { "name": "Enabled", "enable_features": [ - "UiaProvider" + "UmaSessionCorrectnessFixes" ] } ] @@ -25247,29 +25923,6 @@ ] } ], - "UnlockDatabaseOnClose": [ - { - "platforms": [ - "android", - "android_weblayer", - "android_webview", - "chromeos", - "fuchsia", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "UnlockDatabaseOnClose" - ] - } - ] - } - ], "UnoDesktopBookmarksAndReadingList": [ { "platforms": [ @@ -25288,44 +25941,10 @@ ] } ], - "UnoDesktopHistorySyncPillExperiment": [ - { - "platforms": [ - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "EnabledWithBrowseAcrossDevices", - "params": { - "history-sync-optin-expansion-pill-option": "browse-across-devices" - }, - "enable_features": [ - "EnableHistorySyncOptinExpansionPill" - ] - } - ] - } - ], "UpdateStateBeforeUnbinding": [ { "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "UpdateStateBeforeUnbinding" - ] - } - ] - } - ], - "UpdateStateBeforeUnbindingWebview": [ - { - "platforms": [ + "android", "android_webview" ], "experiments": [ @@ -25441,6 +26060,21 @@ ] } ], + "UseEncryptedReportingPipelineToReportArcAppInstallEvents": [ + { + "platforms": [ + "chromeos" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "UseEncryptedReportingPipelineToReportArcAppInstallEvents" + ] + } + ] + } + ], "UseFinchPermanentCountyForFetchCountryId": [ { "platforms": [ @@ -25532,21 +26166,6 @@ ] } ], - "UseInitialNetworkStateAtStartup": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "UseInitialNetworkStateAtStartup" - ] - } - ] - } - ], "UseSCContentSharingPicker": [ { "platforms": [ @@ -25562,25 +26181,6 @@ ] } ], - "UseSharedRebindServiceConnectionWebview": [ - { - "platforms": [ - "android_webview" - ], - "experiments": [ - { - "name": "EnabledDeferredBindings10", - "params": { - "max-deferred-bindings": "10" - }, - "enable_features": [ - "GroupRebindingForGroupImportance", - "UseSharedRebindServiceConnection" - ] - } - ] - } - ], "UseSmartRefForGPUFenceHandle": [ { "platforms": [ @@ -25749,6 +26349,26 @@ ] } ], + "V8IncrementalMarkingAlwaysUserVisible": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "V8Flag_incremental_marking_always_user_visible" + ] + } + ] + } + ], "V8IncrementalMarkingStartUserVisible": [ { "platforms": [ @@ -25769,40 +26389,6 @@ ] } ], - "V8IntelJCCErratumMitigation": [ - { - "platforms": [ - "chromeos", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "EnabledNoSlowHistogram", - "enable_features": [ - "V8IntelJCCErratumMitigation" - ] - }, - { - "name": "Enabled", - "enable_features": [ - "V8IntelJCCErratumMitigation", - "V8SlowHistogramsIntelJCCErratumMitigation" - ] - }, - { - "name": "Control", - "enable_features": [ - "V8SlowHistogramsIntelJCCErratumMitigation" - ], - "disable_features": [ - "V8IntelJCCErratumMitigation" - ] - } - ] - } - ], "V8LargePagePool": [ { "platforms": [ @@ -25866,6 +26452,26 @@ ] } ], + "V8MemoryPoolReleaseOnMallocFailures": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "V8MemoryPoolReleaseOnMallocFailures" + ] + } + ] + } + ], "V8ParserAblation": [ { "platforms": [ @@ -26071,6 +26677,25 @@ ] } ], + "VariationsHeaderForCrossSiteSpeculationRulesPrefetch": [ + { + "platforms": [ + "android", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "VariationsHeaderForCrossSiteSpeculationRulesPrefetch" + ] + } + ] + } + ], "VerifyDidCommitParams": [ { "platforms": [ @@ -26259,14 +26884,20 @@ ] } ], - "VizDirectCompositorThreadIpcNonRoot": [ + "VizDirectCompositorThreadIpcAndroid": [ { "platforms": [ "android" ], "experiments": [ { - "name": "Enabled", + "name": "EnabledFSM", + "enable_features": [ + "VizDirectCompositorThreadIpcFrameSinkManager" + ] + }, + { + "name": "EnabledNonRoot", "enable_features": [ "VizDirectCompositorThreadIpcNonRoot" ] @@ -26274,14 +26905,20 @@ ] } ], - "VizDirectCompositorThreadIpcNonRootWindows": [ + "VizDirectCompositorThreadIpcWindows": [ { "platforms": [ "windows" ], "experiments": [ { - "name": "Enabled", + "name": "EnabledFSM", + "enable_features": [ + "VizDirectCompositorThreadIpcFrameSinkManager" + ] + }, + { + "name": "EnabledNonRoot", "enable_features": [ "VizDirectCompositorThreadIpcNonRoot" ] @@ -26393,25 +27030,6 @@ ] } ], - "WebAudioBypassOutputBuffering": [ - { - "platforms": [ - "chromeos", - "ios", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "WebAudioBypassOutputBuffering" - ] - } - ] - } - ], "WebAuthenticationAndroidPasskeyCacheMigration": [ { "platforms": [ @@ -26910,6 +27528,24 @@ ] } ], + "WebRTC-TimestampExtrapolatorConfig": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "ios", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled,outlier_rejection_stddev:2,_v20250825_CANARY_DEV" + } + ] + } + ], "WebRTC-UseAbsCapTimeForG2gMetric": [ { "platforms": [ @@ -27225,21 +27861,6 @@ ] } ], - "WebViewAsyncDrawOnly": [ - { - "platforms": [ - "android_webview" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "WebViewAsyncDrawOnly" - ] - } - ] - } - ], "WebViewAutoGrantStorageAccessAPI": [ { "platforms": [ @@ -27398,6 +28019,24 @@ ] } ], + "WebViewPrefetchHighestPrefetchPriority": [ + { + "platforms": [ + "android_webview" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "WebViewPrefetchHighestPrefetchPriorityBurstLimit": "1" + }, + "enable_features": [ + "WebViewPrefetchHighestPrefetchPriority" + ] + } + ] + } + ], "WebViewPrefetchNativeLibrary": [ { "platforms": [ @@ -27491,6 +28130,34 @@ ] } ], + "WebViewReducedFinchTime": [ + { + "platforms": [ + "android_webview" + ], + "experiments": [ + { + "name": "BothEnabled", + "enable_features": [ + "WebViewReducedSeedExpiration", + "WebViewReducedSeedRequestPeriod" + ] + }, + { + "name": "ReducedSeedExpiration", + "enable_features": [ + "WebViewReducedSeedExpiration" + ] + }, + { + "name": "ReducedSeedRequestPeriod", + "enable_features": [ + "WebViewReducedSeedRequestPeriod" + ] + } + ] + } + ], "WebViewSafeAreaIncludesSystemBars": [ { "platforms": [ @@ -27571,6 +28238,25 @@ ] } ], + "WebViewStartupTasksExperiment": [ + { + "platforms": [ + "android_webview" + ], + "experiments": [ + { + "name": "Enabled_Phase3", + "enable_features": [ + "WebViewStartupTasksYieldToNative" + ], + "disable_features": [ + "WebViewUseStartupTasksLogic", + "WebViewUseStartupTasksLogicP2" + ] + } + ] + } + ], "WebViewSurfaceControl": [ { "platforms": [ @@ -27670,6 +28356,21 @@ ] } ], + "WebViewUseBackgroundThreadForGms": [ + { + "platforms": [ + "android_webview" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "WebViewUseBackgroundThreadForGms" + ] + } + ] + } + ], "WebViewUseMetricsUploadServiceOnlySdkRuntime": [ { "platforms": [ @@ -27685,7 +28386,7 @@ ] } ], - "WebViewUseStartupTasksLogic": [ + "WebViewUseRenderingHeuristic": [ { "platforms": [ "android_webview" @@ -27694,7 +28395,7 @@ { "name": "Enabled", "enable_features": [ - "WebViewUseStartupTasksLogic" + "WebViewUseRenderingHeuristic" ] } ] @@ -27995,37 +28696,40 @@ ] } ], - "ZramHugePageRecompression": [ + "ZeroStateSuggestionsV2": [ { "platforms": [ - "chromeos" + "linux", + "mac", + "windows" ], "experiments": [ { - "name": "DisableHugePageRecompression", + "name": "Enabled", "params": { - "recompression_huge": "false" + "ZSSMaxPinnedPagesForTriggeringSuggestions": "10" }, "enable_features": [ - "CrOSLateBootSwapZramRecompression" + "ZeroStateSuggestionsV2" ] } ] } ], - "ZramHugePageWriteback": [ + "ZstdForCrossSiteSpeculationRulesPrefetch": [ { "platforms": [ - "chromeos" + "android", + "chromeos", + "linux", + "mac", + "windows" ], "experiments": [ { - "name": "DisableHugePageWriteback", - "params": { - "writeback_huge": "false" - }, + "name": "Enabled", "enable_features": [ - "CrOSLateBootSwapZramWriteback" + "ZstdForCrossSiteSpeculationRulesPrefetch" ] } ] diff --git a/tools/under-control/src/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/tools/under-control/src/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom index d07f1cd2..c1ee0c11 100755 --- a/tools/under-control/src/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom +++ b/tools/under-control/src/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom @@ -3216,7 +3216,7 @@ enum WebFeature { kSameSiteNoneIncludedBySamePartyAncestors = 3955, kSameSiteNoneIncludedBySameSiteLax = 3956, kSameSiteNoneIncludedBySameSiteStrict = 3957, - kPrivateNetworkAccessNonSecureContextsAllowedDeprecationTrial = 3958, + kOBSOLETE_PrivateNetworkAccessNonSecureContextsAllowedDeprecationTrial = 3958, kV8URLPattern_Constructor = 3959, kV8URLPattern_Test_Method = 3960, kV8URLPattern_Exec_Method = 3961, @@ -3580,7 +3580,7 @@ enum WebFeature { kSendBeaconWithURLSearchParams = 4309, kSendBeaconWithUSVString = 4310, kReplacedElementPaintedWithOverflow = 4311, - kImageAd = 4312, + kOBSOLETE_kImageAd = 4312, kLinkRelPrefetchAsDocumentSameOrigin = 4313, kLinkRelPrefetchAsDocumentCrossOrigin = 4314, kPersistentQuotaType = 4315, @@ -3623,7 +3623,7 @@ enum WebFeature { kAudioContextSetSinkId = 4350, kViewportDependentLazyLoadedImageWithSizesAttribute = 4351, kXRWebGLBindingGetCameraImage = 4352, - kSelectiveInOrderScript = 4353, + kOBSOLETE_SelectiveInOrderScript = 4353, kV8AsyncStackTaggingCreateTaskCall = 4354, kWebkitBoxWithoutWebkitLineClamp = 4355, kDataUrlInSvgUse = 4356, @@ -4520,7 +4520,7 @@ enum WebFeature { kV8AuthenticatorAttestationResponse_GetPublicKey_Method = 5214, kCloseWatcherScriptConstructor = 5215, kCanvas2DImageSmoothingQuality2 = 5216, - kNonNoneTouchActionWouldLoseEditableHandwriting = 5217, + kOBSOLETENonNoneTouchActionWouldLoseEditableHandwriting = 5217, kCSSEnvironmentVariable_SafeAreaInsetBottom_FastPath = 5218, kSrcSetUsedHigherDensityImageFromCache = 5219, kHTMLElementWritingSuggestions = 5220, @@ -4639,8 +4639,8 @@ enum WebFeature { kWebAppManifestUpdate = 5331, kCSSEnvironmentVariable_PreferredTextScale = 5332, kButtonTypeAttrInvalidWithCommandOrCommandfor = 5333, - kCSSVarFallbackCycle = 5334, - kCSSAttrFallbackCycle = 5335, + kOBSOLETE_CSSVarFallbackCycle = 5334, + kOBSOLETE_CSSAttrFallbackCycle = 5335, // The items above roughly this point are available in the M135 branch. kCSSRainbowGradientPattern = 5336, kWebAppManifestStartUrl = 5337, @@ -4697,7 +4697,7 @@ enum WebFeature { kOBSOLETE_V8AILanguageModel_MeasureInputUsage_Method = 5388, kCredentialsGetImmediateMediationWithWebAuthnOnly = 5389, kCredentialsGetImmediateMediationWithWebAuthnAndPasswords = 5390, - kNonNoneTouchActionWouldLoseEditableHandwritingRestoredByScroller = 5391, + kOBSOLETENonNoneTouchActionWouldLoseEditableHandwritingRestoredByScroller = 5391, kTranslator_Create = 5392, kTranslator_Availability = 5393, kTranslator_SourceLanguage = 5394, @@ -4937,6 +4937,31 @@ enum WebFeature { kSharedWorkerStartOnAndroid = 5626, kLocalNetworkAccessWithinSharedWorker = 5627, kLocalNetworkAccessWithinDedicatedWorker = 5628, + kCSSPseudoParentInScope = 5629, + kInterestHintPseudoElement = 5630, + kCookieStoreEmptyPath = 5631, + kV8CookieListItem_Domain_AttributeGetter = 5632, + kV8CookieListItem_Path_AttributeGetter = 5633, + kV8CookieListItem_Expires_AttributeGetter = 5634, + kV8CookieListItem_Secure_AttributeGetter = 5635, + kV8CookieListItem_SameSite_AttributeGetter = 5636, + kV8CookieListItem_Partitioned_AttributeGetter = 5637, + kWebkitLineClampWithHeight = 5638, + kLineClampAuto = 5639, + kLineClampByLinesAndHeight = 5640, + kV8RegExpStaticPropertiesWithLastMatch = 5641, + kGetStatusForPolicyCrossOriginIframe = 5642, + kComputedBorderTopWidthWithNoneOrHiddenStyle = 5643, + kComputedBorderRightWidthWithNoneOrHiddenStyle = 5644, + kComputedBorderBottomWidthWithNoneOrHiddenStyle = 5645, + kComputedBorderLeftWidthWithNoneOrHiddenStyle = 5646, + kComputedBorderWidthWithNoneOrHiddenStyle = 5647, + kComputedColumnRuleWidthWithNoneOrHiddenStyle = 5648, + kComputedOutlineWidthWithNoneOrHiddenStyle = 5649, + kNavigationNavigateJavaScriptURL = 5650, + kV8WasmCustomDescriptors = 5651, + kSRIIntegrityAttributeOnInlineScript = 5652, + kCredentialsGetImmediateMediationWithPasswordsOnly = 5653, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots. Also don't add extra diff --git a/tools/under-control/src/third_party/blink/public/mojom/webpreferences/web_preferences.mojom b/tools/under-control/src/third_party/blink/public/mojom/webpreferences/web_preferences.mojom index 60432eee..dd6185b0 100755 --- a/tools/under-control/src/third_party/blink/public/mojom/webpreferences/web_preferences.mojom +++ b/tools/under-control/src/third_party/blink/public/mojom/webpreferences/web_preferences.mojom @@ -509,4 +509,7 @@ struct WebPreferences { bool api_based_fingerprinting_interventions_enabled = false; bool content_based_fingerprinting_protection_enabled = false; + + [EnableIf=is_android] + bool increment_local_surface_id_for_mainframe_same_doc_navigation = true; }; diff --git a/tools/under-control/src/third_party/blink/renderer/core/animation/animation_trigger.idl b/tools/under-control/src/third_party/blink/renderer/core/animation/animation_trigger.idl index 7928b5f1..845d72fb 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/animation/animation_trigger.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/animation/animation_trigger.idl @@ -10,13 +10,7 @@ enum AnimationTriggerBehavior { "once", "repeat", "alternate", "state" }; Exposed=Window, RuntimeEnabled=AnimationTrigger ] interface AnimationTrigger { - [CallWith=ExecutionContext, Measure, RaisesException] constructor(optional AnimationTriggerOptions options = {}); - readonly attribute AnimationTimeline? timeline; readonly attribute AnimationTriggerBehavior behavior; - [CallWith=ExecutionContext] readonly attribute (TimelineRangeOffset or DOMString) rangeStart; - [CallWith=ExecutionContext] readonly attribute (TimelineRangeOffset or DOMString) rangeEnd; - [CallWith=ExecutionContext] readonly attribute (TimelineRangeOffset or DOMString) exitRangeStart; - [CallWith=ExecutionContext] readonly attribute (TimelineRangeOffset or DOMString) exitRangeEnd; [RaisesException] void addAnimation(Animation animation); void removeAnimation(Animation animation); }; diff --git a/tools/under-control/src/third_party/blink/renderer/core/animation/timeline_trigger.idl b/tools/under-control/src/third_party/blink/renderer/core/animation/timeline_trigger.idl new file mode 100755 index 00000000..ef60d683 --- /dev/null +++ b/tools/under-control/src/third_party/blink/renderer/core/animation/timeline_trigger.idl @@ -0,0 +1,17 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://drafts.csswg.org/web-animations-2/#the-animationtrigger-interface + +[ + Exposed=Window, + RuntimeEnabled=AnimationTrigger +] interface TimelineTrigger : AnimationTrigger { + [CallWith=ExecutionContext, MeasureAs=V8AnimationTrigger_Constructor, RaisesException] constructor(optional TimelineTriggerOptions options = {}); + readonly attribute AnimationTimeline? timeline; + [CallWith=ExecutionContext] readonly attribute (TimelineRangeOffset or DOMString) rangeStart; + [CallWith=ExecutionContext] readonly attribute (TimelineRangeOffset or DOMString) rangeEnd; + [CallWith=ExecutionContext] readonly attribute (TimelineRangeOffset or DOMString) exitRangeStart; + [CallWith=ExecutionContext] readonly attribute (TimelineRangeOffset or DOMString) exitRangeEnd; +}; diff --git a/tools/under-control/src/third_party/blink/renderer/core/animation/animation_trigger_options.idl b/tools/under-control/src/third_party/blink/renderer/core/animation/timeline_trigger_options.idl similarity index 93% rename from tools/under-control/src/third_party/blink/renderer/core/animation/animation_trigger_options.idl rename to tools/under-control/src/third_party/blink/renderer/core/animation/timeline_trigger_options.idl index 54faa02c..76c86cfe 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/animation/animation_trigger_options.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/animation/timeline_trigger_options.idl @@ -4,7 +4,7 @@ // https://drafts.csswg.org/web-animations-2/#the-animationtriggeroptions-dictionary -dictionary AnimationTriggerOptions { +dictionary TimelineTriggerOptions { AnimationTriggerBehavior behavior = "once"; AnimationTimeline? timeline; (DOMString or TimelineRangeOffset) rangeStart = "normal"; diff --git a/tools/under-control/src/third_party/blink/renderer/core/css/css_apply_mixin_rule.idl b/tools/under-control/src/third_party/blink/renderer/core/css/css_apply_mixin_rule.idl new file mode 100755 index 00000000..5adefb92 --- /dev/null +++ b/tools/under-control/src/third_party/blink/renderer/core/css/css_apply_mixin_rule.idl @@ -0,0 +1,8 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +[Exposed=Window, RuntimeEnabled=CSSMixins] +interface CSSApplyMixinRule : CSSRule { + readonly attribute CSSOMString name; +}; diff --git a/tools/under-control/src/third_party/blink/renderer/core/css/css_contents_mixin_rule.idl b/tools/under-control/src/third_party/blink/renderer/core/css/css_contents_mixin_rule.idl new file mode 100755 index 00000000..17490918 --- /dev/null +++ b/tools/under-control/src/third_party/blink/renderer/core/css/css_contents_mixin_rule.idl @@ -0,0 +1,7 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +[Exposed=Window, RuntimeEnabled=CSSMixins] +interface CSSContentsMixinRule : CSSRule { +}; diff --git a/tools/under-control/src/third_party/blink/renderer/core/css/css_mixin_rule.idl b/tools/under-control/src/third_party/blink/renderer/core/css/css_mixin_rule.idl new file mode 100755 index 00000000..a0a63dfe --- /dev/null +++ b/tools/under-control/src/third_party/blink/renderer/core/css/css_mixin_rule.idl @@ -0,0 +1,8 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +[Exposed=Window, RuntimeEnabled=CSSMixins] +interface CSSMixinRule : CSSGroupingRule { + readonly attribute CSSOMString name; +}; diff --git a/tools/under-control/src/third_party/blink/renderer/core/dom/common_definitions.idl b/tools/under-control/src/third_party/blink/renderer/core/dom/common_definitions.idl index bbea18ae..b30a2ec2 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/dom/common_definitions.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/dom/common_definitions.idl @@ -7,7 +7,6 @@ typedef (ArrayBuffer or ArrayBufferView) BufferSource; typedef unsigned long long DOMTimeStamp; // https://webidl.spec.whatwg.org/#Function -[SupportsTaskAttribution] callback Function = any (any... arguments); // Blink-specific forEach iterator's callback diff --git a/tools/under-control/src/third_party/blink/renderer/core/dom/document.idl b/tools/under-control/src/third_party/blink/renderer/core/dom/document.idl index 8ec82f57..f791b314 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/dom/document.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/dom/document.idl @@ -192,9 +192,6 @@ typedef (HTMLScriptElement or SVGScriptElement) HTMLOrSVGScriptElement; // https://wicg.github.io/nav-speculation/prerendering.html#dom-document-prerendering [Measure] readonly attribute boolean prerendering; - // Non-exposed API, used to evaluate and test soft navigation heuristics - [RuntimeEnabled=SoftNavigationHeuristics] readonly attribute unsigned long softNavigations; - // Non-standard APIs [MeasureAs=DocumentCaretRangeFromPoint] Range caretRangeFromPoint(optional long x = 0, optional long y = 0); diff --git a/tools/under-control/src/third_party/blink/renderer/core/dom/element.idl b/tools/under-control/src/third_party/blink/renderer/core/dom/element.idl index 44fb1a29..2b4cdb43 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/dom/element.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/dom/element.idl @@ -174,6 +174,7 @@ dictionary SetHTMLUnsafeOptions { [CEReactions, Reflect=elementtiming] attribute DOMString elementTiming; [RuntimeEnabled=ContainerTiming, CEReactions, Reflect=containertiming] attribute DOMString containerTiming; [RuntimeEnabled=ContainerTiming, CEReactions, Reflect=containertiming-ignore] attribute boolean containerTimingIgnore; + [RuntimeEnabled=ContainerTiming, CEReactions, Reflect=containertiming-nesting] attribute DOMString containerTimingNesting; // Heading Offset [CEReactions, RuntimeEnabled=HeadingOffset] attribute unsigned long headingOffset; @@ -183,7 +184,7 @@ dictionary SetHTMLUnsafeOptions { [RuntimeEnabled=ScopedCustomElementRegistry] readonly attribute CustomElementRegistry? customElementRegistry; // Declarative document updates - [RuntimeEnabled=DocumentPatching] readonly attribute PatchStatus? currentPatch; + [RuntimeEnabled=DocumentPatching] readonly attribute Patch? currentPatch; }; Element includes ParentNode; diff --git a/tools/under-control/src/third_party/blink/renderer/core/dom/form_control_range.idl b/tools/under-control/src/third_party/blink/renderer/core/dom/form_control_range.idl new file mode 100755 index 00000000..3e9b1411 --- /dev/null +++ b/tools/under-control/src/third_party/blink/renderer/core/dom/form_control_range.idl @@ -0,0 +1,10 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +[ + Exposed=Window, + RuntimeEnabled=FormControlRange +] interface FormControlRange : AbstractRange { + [CallWith=Document] constructor(); +}; diff --git a/tools/under-control/src/third_party/blink/renderer/core/dom/parent_node.idl b/tools/under-control/src/third_party/blink/renderer/core/dom/parent_node.idl index 2fedb9f9..17d89218 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/dom/parent_node.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/dom/parent_node.idl @@ -42,7 +42,7 @@ interface mixin ParentNode { [Affects=Nothing, RaisesException] Element? querySelector(DOMString selectors); [Affects=Nothing, NewObject, RaisesException] NodeList querySelectorAll(DOMString selectors); - [RuntimeEnabled=DocumentPatching, CallWith=ScriptState] WritableStream patchSelf(); + [RuntimeEnabled=DocumentPatching, CallWith=ScriptState, RaisesException] WritableStream patchSelf(); [RuntimeEnabled=DocumentPatching, CallWith=ScriptState, RaisesException] WritableStream patchBetween(Node prev_child, Node next_child); [RuntimeEnabled=DocumentPatching, CallWith=ScriptState, RaisesException] WritableStream patchAfter(Node ref); [RuntimeEnabled=DocumentPatching, CallWith=ScriptState, RaisesException] WritableStream patchBefore(Node ref); diff --git a/tools/under-control/src/third_party/blink/renderer/core/dom/popover_invoker_element.idl b/tools/under-control/src/third_party/blink/renderer/core/dom/popover_target_attributes.idl similarity index 90% rename from tools/under-control/src/third_party/blink/renderer/core/dom/popover_invoker_element.idl rename to tools/under-control/src/third_party/blink/renderer/core/dom/popover_target_attributes.idl index 3a1b6e58..4914391a 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/dom/popover_invoker_element.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/dom/popover_target_attributes.idl @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -interface mixin PopoverInvokerElement { +interface mixin PopoverTargetAttributes { [CEReactions,Reflect=popovertarget] attribute Element? popoverTargetElement; [CEReactions,Reflect,ReflectOnly=("toggle","show","hide"),ReflectEmpty="toggle",ReflectInvalid="toggle",ReflectMissing="toggle"] attribute DOMString popoverTargetAction; }; diff --git a/tools/under-control/src/third_party/blink/renderer/core/dom/void_function.idl b/tools/under-control/src/third_party/blink/renderer/core/dom/void_function.idl index 9dfcaca2..01ede179 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/dom/void_function.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/dom/void_function.idl @@ -3,5 +3,4 @@ // found in the LICENSE file. // https://webidl.spec.whatwg.org/#VoidFunction -[SupportsTaskAttribution] callback VoidFunction = undefined (); diff --git a/tools/under-control/src/third_party/blink/renderer/core/editing/selection.idl b/tools/under-control/src/third_party/blink/renderer/core/editing/selection.idl index 025dc252..26b722c9 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/editing/selection.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/editing/selection.idl @@ -58,8 +58,8 @@ [MeasureAs=SelectionContainsNode] boolean containsNode(Node node, optional boolean allowPartialContainment = false); [MeasureAs=SelectionDOMString] stringifier; - [MeasureAs=SelectionDirection, RuntimeEnabled=SelectionAcrossShadowDOM] readonly attribute DOMString direction; - [MeasureAs=SelectionGetComposedRanges, RuntimeEnabled=SelectionAcrossShadowDOM] sequence getComposedRanges(optional GetComposedRangesOptions options = {}); + [MeasureAs=SelectionDirection] readonly attribute DOMString direction; + [MeasureAs=SelectionGetComposedRanges] sequence getComposedRanges(optional GetComposedRangesOptions options = {}); // Non-standard APIs diff --git a/tools/under-control/src/third_party/blink/renderer/core/exported/web_view_impl.cc b/tools/under-control/src/third_party/blink/renderer/core/exported/web_view_impl.cc index b0a8c14c..714b713c 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/tools/under-control/src/third_party/blink/renderer/core/exported/web_view_impl.cc @@ -477,7 +477,7 @@ void MaybePreloadSystemFonts(Page* page) { is_first_run = false; page->GetAgentGroupScheduler().DefaultTaskRunner()->PostTask( - FROM_HERE, WTF::BindOnce([]() { FontCache::MaybePreloadSystemFonts(); })); + FROM_HERE, BindOnce([]() { FontCache::MaybePreloadSystemFonts(); })); } } // namespace @@ -502,7 +502,8 @@ WebView* WebView::Create( const ColorProviderColorMaps* color_provider_colors, blink::mojom::PartitionedPopinParamsPtr partitioned_popin_params, int32_t history_index, - int32_t history_length) { + int32_t history_length, + const std::optional& canvas_noise_token) { return WebViewImpl::Create( client, is_hidden ? mojom::blink::PageVisibilityState::kHidden @@ -512,7 +513,7 @@ WebView* WebView::Create( agent_group_scheduler, session_storage_namespace_id, std::move(page_base_background_color), browsing_context_group_token, color_provider_colors, std::move(partitioned_popin_params), history_index, - history_length); + history_length, canvas_noise_token); } WebViewImpl* WebViewImpl::Create( @@ -532,14 +533,16 @@ WebViewImpl* WebViewImpl::Create( const ColorProviderColorMaps* color_provider_colors, blink::mojom::PartitionedPopinParamsPtr partitioned_popin_params, int32_t history_index, - int32_t history_length) { + int32_t history_length, + const std::optional& canvas_noise_token) { return new WebViewImpl( client, visibility, std::move(prerender_param), fenced_frame_mode, compositing_enabled, widgets_never_composited, opener, std::move(page_handle), agent_group_scheduler, session_storage_namespace_id, std::move(page_base_background_color), browsing_context_group_token, color_provider_colors, - std::move(partitioned_popin_params), history_index, history_length); + std::move(partitioned_popin_params), history_index, history_length, + canvas_noise_token); } size_t WebView::GetWebViewCount() { @@ -606,7 +609,8 @@ WebViewImpl::WebViewImpl( const ColorProviderColorMaps* color_provider_colors, blink::mojom::PartitionedPopinParamsPtr partitioned_popin_params, int32_t history_index, - int32_t history_length) + int32_t history_length, + const std::optional& canvas_noise_token) : widgets_never_composited_(widgets_never_composited), web_view_client_(client), chrome_client_(MakeGarbageCollected(this)), @@ -632,7 +636,7 @@ WebViewImpl::WebViewImpl( // corresponding browser-side `RenderViewHostImpl` (e.g. tests or // printing), call `Close()` directly instead to delete `this`. receiver_.set_disconnect_handler( - WTF::BindOnce(&WebViewImpl::MojoDisconnected, WTF::Unretained(this))); + BindOnce(&WebViewImpl::MojoDisconnected, Unretained(this))); } if (!web_view_client_) DCHECK(!does_composite_); @@ -640,7 +644,7 @@ WebViewImpl::WebViewImpl( *chrome_client_, opener ? opener->GetPage() : nullptr, agent_group_scheduler.GetAgentGroupScheduler(), browsing_context_group_token, color_provider_colors, - std::move(partitioned_popin_params)); + std::move(partitioned_popin_params), canvas_noise_token); CoreInitializer::GetInstance().ProvideModulesToPage( *page_, session_storage_namespace_id_); @@ -1343,6 +1347,16 @@ void WebViewImpl::DidUpdateBrowserControls() { } } +void WebViewImpl::DidUpdateLoadProgress(float progress) { + WebLocalFrameImpl* main_frame = MainFrameImpl(); + if (!main_frame) { + return; + } + + WebFrameWidgetImpl* widget = main_frame->LocalRootFrameWidget(); + widget->SetLoadProgress(progress); +} + void WebViewImpl::DidUpdateMaxSafeAreaInsets( const gfx::InsetsF& max_safe_area_insets) { WebLocalFrameImpl* main_frame = MainFrameImpl(); @@ -1918,6 +1932,7 @@ void WebView::ApplyWebPreferences(const web_pref::WebPreferences& prefs, prefs.payment_request_enabled); if (prefs.api_based_fingerprinting_interventions_enabled) { + RuntimeEnabledFeatures::SetReduceDeviceMemoryEnabled(true); RuntimeEnabledFeatures::SetReduceHardwareConcurrencyEnabled(true); RuntimeEnabledFeatures::SetReduceScreenSizeEnabled(true); } @@ -3111,7 +3126,7 @@ void WebViewImpl::Show(const LocalFrameToken& opener_frame_token, local_main_frame_host_remote_->ShowCreatedWindow( opener_frame_token, NavigationPolicyToDisposition(policy), std::move(window_features), opened_by_user_gesture, - WTF::BindOnce(&WebViewImpl::DidShowCreatedWindow, WTF::Unretained(this))); + BindOnce(&WebViewImpl::DidShowCreatedWindow, Unretained(this))); } void WebViewImpl::DidShowCreatedWindow() { @@ -3176,18 +3191,18 @@ void WebViewImpl::UpdateTargetURL(const WebURL& url, } void WebViewImpl::SendUpdatedTargetURLToBrowser(const KURL& target_url) { - // Note: WTF::Unretained() usage below is safe, since `this` owns both + // Note: blink::Unretained() usage below is safe, since `this` owns both // `mojo::Remote` objects. if (GetPage()->MainFrame()->IsLocalFrame()) { DCHECK(local_main_frame_host_remote_); local_main_frame_host_remote_->UpdateTargetURL( - target_url, WTF::BindOnce(&WebViewImpl::TargetURLUpdatedInBrowser, - WTF::Unretained(this))); + target_url, + BindOnce(&WebViewImpl::TargetURLUpdatedInBrowser, Unretained(this))); } else { DCHECK(remote_main_frame_host_remote_); remote_main_frame_host_remote_->UpdateTargetURL( - target_url, WTF::BindOnce(&WebViewImpl::TargetURLUpdatedInBrowser, - WTF::Unretained(this))); + target_url, + BindOnce(&WebViewImpl::TargetURLUpdatedInBrowser, Unretained(this))); } } @@ -3461,6 +3476,15 @@ void WebViewImpl::UpdateUseOverlayScrollbar(bool use_overlay_scrollbar) { } #endif +void WebViewImpl::UpdateCanvasNoiseToken( + std::optional canvas_noise_token) { + GetPage()->SetCanvasNoiseToken(canvas_noise_token); +} + +std::optional WebViewImpl::CanvasNoiseTokenForTesting() { + return GetPage()->CanvasNoiseToken(); +} + void WebViewImpl::ActivatePrerenderedPage( mojom::blink::PrerenderPageActivationParamsPtr prerender_page_activation_params, @@ -3591,7 +3615,6 @@ void WebViewImpl::UpdateRendererPreferences( } #endif - CanvasNoiseToken::Set(renderer_preferences_.canvas_noise_token); ViewSourceLineWrappingPreference::Set( renderer_preferences_.view_source_line_wrap_enabled); @@ -4131,7 +4154,7 @@ void WebViewImpl::MojoDisconnected() { // process, and is used to release ownership of the corresponding // RenderViewImpl instance. https://crbug.com/1000035. GetPage()->GetAgentGroupScheduler().DefaultTaskRunner()->PostNonNestableTask( - FROM_HERE, WTF::BindOnce(&WebViewImpl::Close, WTF::Unretained(this))); + FROM_HERE, BindOnce(&WebViewImpl::Close, Unretained(this))); } void WebViewImpl::CreateRemoteMainFrame( diff --git a/tools/under-control/src/third_party/blink/renderer/core/fileapi/blob.idl b/tools/under-control/src/third_party/blink/renderer/core/fileapi/blob.idl index 404de753..9ae17a23 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/fileapi/blob.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/fileapi/blob.idl @@ -39,9 +39,17 @@ typedef (ArrayBuffer or ArrayBufferView or Blob or USVString) BlobPart; readonly attribute unsigned long long size; readonly attribute DOMString type; - // TODO(jsbell): start and end arguments should be [Clamp] - [RaisesException] Blob slice(optional long long start, optional long long end, optional DOMString contentType); + // NOTE: According to the File API spec, the `end` argument should + // be treated as the Blob's size when `undefined`. However, our + // binding layer converts `undefined` to `0`, making it impossible + // for the C++ implementation to distinguish an explicitly passed + // `0` from an omitted argument. To workaround the binding issue, we + // provide a default value here, similar to WebKit's approach. + // This is slightly different from the spec but matches the expected + // behavior. + [RaisesException] Blob slice(optional [Clamp] long long start = 0, optional [Clamp] long long end = 0x7FFFFFFFFFFFFFFF, optional DOMString contentType = ""); [CallWith=ScriptState] ReadableStream stream(); [CallWith=ScriptState] Promise text(); [CallWith=ScriptState] Promise arrayBuffer(); + [RuntimeEnabled=BlobBytes, CallWith=ScriptState] Promise bytes(); }; diff --git a/tools/under-control/src/third_party/blink/renderer/core/fileapi/file_reader.idl b/tools/under-control/src/third_party/blink/renderer/core/fileapi/file_reader.idl index 4aa6ee97..5f62105f 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/fileapi/file_reader.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/fileapi/file_reader.idl @@ -37,12 +37,12 @@ ] interface FileReader : EventTarget { [CallWith=ExecutionContext] constructor(); // async read methods - [RaisesException] void readAsArrayBuffer(Blob blob); - [RaisesException] void readAsBinaryString(Blob blob); - [RaisesException] void readAsText(Blob blob, optional DOMString label); - [RaisesException] void readAsDataURL(Blob blob); + [RaisesException] undefined readAsArrayBuffer(Blob blob); + [RaisesException] undefined readAsBinaryString(Blob blob); + [RaisesException] undefined readAsText(Blob blob, optional DOMString encoding); + [RaisesException] undefined readAsDataURL(Blob blob); - void abort(); + undefined abort(); // states const unsigned short EMPTY = 0; diff --git a/tools/under-control/src/third_party/blink/renderer/core/fileapi/url_file_api.idl b/tools/under-control/src/third_party/blink/renderer/core/fileapi/url_file_api.idl index f66e06c3..68b199de 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/fileapi/url_file_api.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/fileapi/url_file_api.idl @@ -4,8 +4,9 @@ // https://w3c.github.io/FileAPI/#creating-revoking [ - ImplementedAs=URLFileAPI + ImplementedAs=URLFileAPI, + Exposed=(Window,DedicatedWorker,SharedWorker) ] partial interface URL { - [Exposed=(Window,DedicatedWorker,SharedWorker), CallWith=ScriptState, RaisesException] static DOMString createObjectURL(Blob blob); - [Exposed=(Window,DedicatedWorker,SharedWorker), CallWith=ScriptState] static void revokeObjectURL(DOMString url); + [CallWith=ScriptState, RaisesException] static DOMString createObjectURL(Blob blob); + [CallWith=ScriptState] static undefined revokeObjectURL(DOMString url); }; diff --git a/tools/under-control/src/third_party/blink/renderer/core/frame/crash_report_storage.idl b/tools/under-control/src/third_party/blink/renderer/core/frame/crash_report_storage.idl index 1a5779a6..343c9a8f 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/frame/crash_report_storage.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/frame/crash_report_storage.idl @@ -6,7 +6,7 @@ [Exposed=Window, RuntimeEnabled=CrashReportingStorageAPI] interface CrashReportStorage { - [CallWith=ScriptState, RaisesException, MeasureAs="WebDXFeature::kCrashReportStorageAPIInitialize"] Promise initialize(unsigned long long length); + [CallWith=ScriptState, RaisesException, MeasureAs="WebDXFeature::kDRAFT_CrashReportStorageAPIInitialize"] Promise initialize(unsigned long long length); [RaisesException] void set(DOMString key, DOMString value); [RaisesException] void remove(DOMString key); // Promise clear(); diff --git a/tools/under-control/src/third_party/blink/renderer/core/frame/visual_viewport.idl b/tools/under-control/src/third_party/blink/renderer/core/frame/visual_viewport.idl index 5ef0a4fd..de6a952f 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/frame/visual_viewport.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/frame/visual_viewport.idl @@ -43,5 +43,5 @@ attribute EventHandler onresize; attribute EventHandler onscroll; - [RuntimeEnabled=VisualViewportOnScrollEnd] attribute EventHandler onscrollend; + attribute EventHandler onscrollend; }; diff --git a/tools/under-control/src/third_party/blink/renderer/core/html/canvas/image_data_settings.idl b/tools/under-control/src/third_party/blink/renderer/core/html/canvas/image_data_settings.idl index 268c8f9b..e3f373d4 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/html/canvas/image_data_settings.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/html/canvas/image_data_settings.idl @@ -9,6 +9,7 @@ enum PredefinedColorSpace { "rec2100-hlg", // Enabled only in CanvasHDR "rec2100-pq", // Enabled only in CanvasHDR "srgb-linear", // Enabled only in CanvasHDR + "rec2100-linear", // Enabled in ColorSpaceRec2100Linear }; enum ImageDataPixelFormat { diff --git a/tools/under-control/src/third_party/blink/renderer/core/html/custom/custom_element_registry.idl b/tools/under-control/src/third_party/blink/renderer/core/html/custom/custom_element_registry.idl index 71e441ad..536eb75c 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/html/custom/custom_element_registry.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/html/custom/custom_element_registry.idl @@ -13,7 +13,7 @@ interface CustomElementRegistry { [CallWith=ScriptState,RaisesException] Promise whenDefined(DOMString name); [CEReactions] void upgrade(Node root); - [RuntimeEnabled=ScopedCustomElementRegistry] void initialize((Element or ShadowRoot) root); + [RuntimeEnabled=ScopedCustomElementRegistry, RaisesException] void initialize(Node root); }; callback CustomElementConstructor = any (); diff --git a/tools/under-control/src/third_party/blink/renderer/core/html/forms/html_button_element.idl b/tools/under-control/src/third_party/blink/renderer/core/html/forms/html_button_element.idl index e98fdaef..fb7d6c3e 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/html/forms/html_button_element.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/html/forms/html_button_element.idl @@ -51,5 +51,5 @@ readonly attribute NodeList labels; }; -HTMLButtonElement includes PopoverInvokerElement; +HTMLButtonElement includes PopoverTargetAttributes; HTMLButtonElement includes InterestInvokerElement; diff --git a/tools/under-control/src/third_party/blink/renderer/core/html/forms/html_input_element.idl b/tools/under-control/src/third_party/blink/renderer/core/html/forms/html_input_element.idl index d8f1bd6c..d6c7366a 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/html/forms/html_input_element.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/html/forms/html_input_element.idl @@ -114,4 +114,4 @@ enum SelectionMode { "select", "start", "end", "preserve" }; [Reflect, MeasureAs=IncrementalAttribute] attribute boolean incremental; }; -HTMLInputElement includes PopoverInvokerElement; +HTMLInputElement includes PopoverTargetAttributes; diff --git a/tools/under-control/src/third_party/blink/renderer/core/html/forms/html_selected_content_element.idl b/tools/under-control/src/third_party/blink/renderer/core/html/forms/html_selected_content_element.idl index 37172fc5..1b381b8f 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/html/forms/html_selected_content_element.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/html/forms/html_selected_content_element.idl @@ -4,6 +4,5 @@ [ Exposed=Window, - HTMLConstructor, - RuntimeEnabled=CustomizableSelect + HTMLConstructor ] interface HTMLSelectedContentElement : HTMLElement {}; diff --git a/tools/under-control/src/third_party/blink/renderer/core/html/html_embed_element.idl b/tools/under-control/src/third_party/blink/renderer/core/html/html_embed_element.idl index 11c33685..c553162f 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/html/html_embed_element.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/html/html_embed_element.idl @@ -31,7 +31,7 @@ [CEReactions, Reflect] attribute DOMString type; [CEReactions, Reflect] attribute DOMString width; [CEReactions, Reflect] attribute DOMString height; - [CheckSecurity=ReturnValue, RaisesException] Document? getSVGDocument(); + [CheckSecurity=ReturnValue] Document? getSVGDocument(); // obsolete members // https://html.spec.whatwg.org/C/#HTMLEmbedElement-partial diff --git a/tools/under-control/src/third_party/blink/renderer/core/html/html_iframe_element.idl b/tools/under-control/src/third_party/blink/renderer/core/html/html_iframe_element.idl index 6f56be7a..c53a110f 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/html/html_iframe_element.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/html/html_iframe_element.idl @@ -35,7 +35,7 @@ [CheckSecurity=ReturnValue] readonly attribute Document? contentDocument; readonly attribute Window? contentWindow; - [CheckSecurity=ReturnValue, RaisesException] Document? getSVGDocument(); + [CheckSecurity=ReturnValue] Document? getSVGDocument(); [CEReactions, Reflect, ReflectOnly=("","no-referrer","origin","no-referrer-when-downgrade","origin-when-cross-origin","unsafe-url"), ReflectMissing="", ReflectInvalid=""] attribute DOMString referrerPolicy; // https://w3c.github.io/webappsec-csp/embedded/#dom-htmliframeelement-csp [CEReactions, Reflect] attribute DOMString csp; diff --git a/tools/under-control/src/third_party/blink/renderer/core/html/html_object_element.idl b/tools/under-control/src/third_party/blink/renderer/core/html/html_object_element.idl index f1484205..9a58fc67 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/html/html_object_element.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/html/html_object_element.idl @@ -39,7 +39,7 @@ [CheckSecurity=ReturnValue] readonly attribute Document? contentDocument; // TODO(shanmuga.m): The spec uses the WindowProxy type for this attribute. readonly attribute Window? contentWindow; - [CheckSecurity=ReturnValue, RaisesException] Document? getSVGDocument(); + [CheckSecurity=ReturnValue] Document? getSVGDocument(); readonly attribute boolean willValidate; readonly attribute ValidityState validity; diff --git a/tools/under-control/src/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc b/tools/under-control/src/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc index eb7159ff..fbf97606 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc +++ b/tools/under-control/src/third_party/blink/renderer/core/origin_trials/origin_trial_context.cc @@ -575,6 +575,9 @@ bool OriginTrialContext::CanEnableTrialFromName(const StringView& trial_name) { #endif } + if (trial_name == "AIProofreadingAPI") { + return base::FeatureList::IsEnabled(features::kAIProofreadingAPI); + } return true; } diff --git a/tools/under-control/src/third_party/blink/renderer/core/patching/patch_status.idl b/tools/under-control/src/third_party/blink/renderer/core/patching/patch.idl similarity index 57% rename from tools/under-control/src/third_party/blink/renderer/core/patching/patch_status.idl rename to tools/under-control/src/third_party/blink/renderer/core/patching/patch.idl index 1c3a7aa9..19e8a502 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/patching/patch_status.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/patching/patch.idl @@ -1,5 +1,5 @@ -[Exposed=Window, RuntimeEnabled=DocumentPatching, ImplementedAs=DOMPatchStatus] -interface PatchStatus { +[Exposed=Window, RuntimeEnabled=DocumentPatching] +interface Patch { [SameObject, CallWith=ScriptState] readonly attribute Promise finished; [SameObject] readonly attribute HTMLTemplateElement source; -}; +}; \ No newline at end of file diff --git a/tools/under-control/src/third_party/blink/renderer/core/patching/patch_event.idl b/tools/under-control/src/third_party/blink/renderer/core/patching/patch_event.idl index e6569e81..e3121959 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/patching/patch_event.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/patching/patch_event.idl @@ -7,5 +7,5 @@ RuntimeEnabled=DocumentPatching ] interface PatchEvent : Event { constructor(DOMString type, PatchEventInit init); - [SameObject] readonly attribute PatchStatus patch; + [SameObject] readonly attribute Patch patch; }; diff --git a/tools/under-control/src/third_party/blink/renderer/core/patching/patch_event_init.idl b/tools/under-control/src/third_party/blink/renderer/core/patching/patch_event_init.idl index 81e71c72..6a6517bc 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/patching/patch_event_init.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/patching/patch_event_init.idl @@ -3,6 +3,6 @@ // found in the LICENSE file. dictionary PatchEventInit : EventInit { - PatchStatus patch; + Patch patch; }; diff --git a/tools/under-control/src/third_party/blink/renderer/core/streams/readable_stream.idl b/tools/under-control/src/third_party/blink/renderer/core/streams/readable_stream.idl index 141cce37..b0b9dfb7 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/streams/readable_stream.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/streams/readable_stream.idl @@ -12,7 +12,7 @@ enum ReadableStreamType { "bytes" }; [ Exposed=* ] interface ReadableStream { - [HasAsyncIteratorReturnAlgorithm] async iterable(optional ReadableStreamIteratorOptions options = {}); + [HasAsyncIteratorReturnAlgorithm] async_iterable(optional ReadableStreamIteratorOptions options = {}); [CallWith=ScriptState, RaisesException] constructor(optional any underlyingSource, optional any strategy); readonly attribute boolean locked; diff --git a/tools/under-control/src/third_party/blink/renderer/core/svg/svg_a_element.idl b/tools/under-control/src/third_party/blink/renderer/core/svg/svg_a_element.idl index ef5ce7d3..a2022a3f 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/svg/svg_a_element.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/svg/svg_a_element.idl @@ -28,6 +28,7 @@ [Exposed=Window] interface SVGAElement : SVGGraphicsElement { [ImplementedAs=svgTarget, Measure] readonly attribute SVGAnimatedString target; + [RuntimeEnabled=SvgAnchorElementDownloadAttribute, Reflect] attribute DOMString download; [RuntimeEnabled=SvgAnchorElementRelAttributes, Reflect] attribute DOMString rel; [RuntimeEnabled=SvgAnchorElementRelAttributes, SameObject, PutForwards=value] readonly attribute DOMTokenList relList; diff --git a/tools/under-control/src/third_party/blink/renderer/core/testing/internals.idl b/tools/under-control/src/third_party/blink/renderer/core/testing/internals.idl index 9b0731c8..6156fe1a 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/testing/internals.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/testing/internals.idl @@ -200,6 +200,8 @@ interface Internals { [RaisesException] DOMString layerTreeAsText(Document document, optional unsigned short flags); + [RaisesException] DOMString dumpContentNodeTree(Document document); + [RaisesException] DOMString mainThreadScrollingReasons(Document document); void evictAllResources(); diff --git a/tools/under-control/src/third_party/blink/renderer/core/testing/type_conversions.idl b/tools/under-control/src/third_party/blink/renderer/core/testing/type_conversions.idl index e8f28a45..9d1cc2eb 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/testing/type_conversions.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/testing/type_conversions.idl @@ -31,8 +31,10 @@ interface TypeConversions { attribute long long testLongLong; [ImplementedAs=testLongLong] attribute [EnforceRange] long long testEnforceRangeLongLong; + [ImplementedAs=testLongLong] attribute [Clamp] long long testClampLongLong; attribute unsigned long long testUnsignedLongLong; [ImplementedAs=testUnsignedLongLong] attribute [EnforceRange] unsigned long long testEnforceRangeUnsignedLongLong; + [ImplementedAs=testUnsignedLongLong] attribute [Clamp] unsigned long long testClampUnsignedLongLong; attribute byte testByte; [ImplementedAs=testByte] attribute [EnforceRange] byte testEnforceRangeByte; diff --git a/tools/under-control/src/third_party/blink/renderer/core/view_transition/view_transition_supplement.idl b/tools/under-control/src/third_party/blink/renderer/core/view_transition/view_transition_supplement.idl index 1698514f..fed63023 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/view_transition/view_transition_supplement.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/view_transition/view_transition_supplement.idl @@ -8,4 +8,6 @@ [MeasureAs=ViewTransition, CallWith=ScriptState, RaisesException] ViewTransition startViewTransition(); [MeasureAs=ViewTransition, CallWith=ScriptState, RaisesException] ViewTransition startViewTransition(ViewTransitionCallback update); [MeasureAs=ViewTransition, CallWith=ScriptState, RaisesException] ViewTransition startViewTransition(ViewTransitionOptions opts); + + [MeasureAs=ViewTransition, RuntimeEnabled=DocumentActiveViewTransition] readonly attribute ViewTransition? activeViewTransition; }; diff --git a/tools/under-control/src/third_party/blink/renderer/core/xml/xslt_processor.idl b/tools/under-control/src/third_party/blink/renderer/core/xml/xslt_processor.idl index f82808af..cbf66ed2 100755 --- a/tools/under-control/src/third_party/blink/renderer/core/xml/xslt_processor.idl +++ b/tools/under-control/src/third_party/blink/renderer/core/xml/xslt_processor.idl @@ -30,7 +30,7 @@ // their interface definition remains the closest thing to a spec: // https://hg.mozilla.org/mozilla-central/file/012853bd80b7/dom/webidl/XSLTProcessor.webidl -[ Exposed=Window ] interface XSLTProcessor { +[ Exposed=Window, RuntimeEnabled=XSLT ] interface XSLTProcessor { [CallWith=Document, MeasureAs=XSLTProcessor] constructor(); void importStylesheet(Node style); diff --git a/tools/under-control/src/third_party/blink/renderer/modules/ai/language_model_create_options.idl b/tools/under-control/src/third_party/blink/renderer/modules/ai/language_model_create_options.idl index 2f457156..490fd509 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/ai/language_model_create_options.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/ai/language_model_create_options.idl @@ -58,10 +58,6 @@ dictionary LanguageModelCreateOptions : LanguageModelCreateCoreOptions { CreateMonitorCallback monitor; sequence initialPrompts; - - // DEPRECATED: Use `initialPrompts: [{role: 'system', content: ... }, ...]`. - // TODO(crbug.com/381974893): Remove this along with the console warning. - DOMString systemPrompt; }; dictionary LanguageModelExpected { diff --git a/tools/under-control/src/third_party/blink/renderer/modules/ai/proofreader.idl b/tools/under-control/src/third_party/blink/renderer/modules/ai/proofreader.idl index 64ce1dfc..77b6afed 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/ai/proofreader.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/ai/proofreader.idl @@ -29,6 +29,10 @@ dictionary ProofreaderCreateOptions : ProofreaderCreateCoreOptions { CreateMonitorCallback monitor; }; +dictionary ProofreaderProofreadOptions { + AbortSignal signal; +}; + dictionary ProofreadResult { DOMString correctedInput; sequence corrections; @@ -70,7 +74,8 @@ interface Proofreader { RaisesException ] Promise proofread( - DOMString input + DOMString input, + optional ProofreaderProofreadOptions options = {} ); [ diff --git a/tools/under-control/src/third_party/blink/renderer/modules/animationworklet/worklet_animation.idl b/tools/under-control/src/third_party/blink/renderer/modules/animationworklet/worklet_animation.idl index c28cc1e1..b96f9dea 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/animationworklet/worklet_animation.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/animationworklet/worklet_animation.idl @@ -24,6 +24,6 @@ [CallWith=ScriptState] attribute double playbackRate; [RaisesException] void play(); - [RaisesException] void pause(); + void pause(); void cancel(); }; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.idl b/tools/under-control/src/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.idl index 0a7e54e5..44bafa3c 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/broadcastchannel/broadcast_channel.idl @@ -8,7 +8,7 @@ Exposed=(Window,Worker), ActiveScriptWrappable ] interface BroadcastChannel : EventTarget { - [CallWith=ExecutionContext, RaisesException, Measure] constructor(DOMString name); + [CallWith=ExecutionContext, Measure] constructor(DOMString name); readonly attribute DOMString name; [RaisesException, Measure] void postMessage(any message); diff --git a/tools/under-control/src/third_party/blink/renderer/modules/canvas/canvas2d/canvas_2d_draw_element_option.idl b/tools/under-control/src/third_party/blink/renderer/modules/canvas/canvas2d/canvas_2d_draw_element_option.idl index b5f29dfc..b790dcfd 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/canvas/canvas2d/canvas_2d_draw_element_option.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/canvas/canvas2d/canvas_2d_draw_element_option.idl @@ -2,7 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Used by method `drawElement` as defined in canvas_rendering_context_2d.idl +// Used by method `drawHTMLElement` as defined in +// canvas_rendering_context_2d.idl dictionary Canvas2DDrawElementOption { // The element should be drawn in a way that allows readback in // `getImageData`. diff --git a/tools/under-control/src/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.idl b/tools/under-control/src/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.idl index e763988d..a96e5ca4 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/canvas/canvas2d/canvas_rendering_context_2d.idl @@ -65,6 +65,17 @@ interface CanvasRenderingContext2D { unrestricted double dwidth, unrestricted double dheight, optional Canvas2DDrawElementOption options = {}); + [RuntimeEnabled=CanvasDrawElement, RaisesException] + void drawHTMLElement(Element element, + unrestricted double x, unrestricted double y, + optional Canvas2DDrawElementOption options = {}); + + [RuntimeEnabled=CanvasDrawElement, RaisesException] + void drawHTMLElement(Element element, + unrestricted double x, unrestricted double y, + unrestricted double dwidth, unrestricted double dheight, + optional Canvas2DDrawElementOption options = {}); + [RuntimeEnabled=CanvasDrawElement, RaisesException] void setHitTestRegions(sequence hitTestRegions); diff --git a/tools/under-control/src/third_party/blink/renderer/modules/cookie_store/cookie_list_item.idl b/tools/under-control/src/third_party/blink/renderer/modules/cookie_store/cookie_list_item.idl index 6310480b..7200b96f 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/cookie_store/cookie_list_item.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/cookie_store/cookie_list_item.idl @@ -7,12 +7,12 @@ dictionary CookieListItem { USVString name; USVString value; - USVString? domain; - USVString path; - DOMHighResTimeStamp? expires; - boolean secure; - CookieSameSite sameSite; - boolean partitioned; + [Measure] USVString? domain; + [Measure] USVString path; + [Measure] DOMHighResTimeStamp? expires; + [Measure] boolean secure; + [Measure] CookieSameSite sameSite; + [Measure] boolean partitioned; }; typedef sequence CookieList; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/credentialmanagement/identity_provider_config.idl b/tools/under-control/src/third_party/blink/renderer/modules/credentialmanagement/identity_provider_config.idl index 6a5d1e75..54d65ff8 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/credentialmanagement/identity_provider_config.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/credentialmanagement/identity_provider_config.idl @@ -24,6 +24,7 @@ dictionary IdentityProviderField { }; dictionary IdentityProviderRequestOptions : IdentityProviderConfig { + // TODO(crbug.com/441895082): Remove nonce field when FedCmNonceInParams is enabled by default. USVString nonce; DOMString loginHint; DOMString domainHint; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/credentialmanagement/testing/internals_fed_cm.idl b/tools/under-control/src/third_party/blink/renderer/modules/credentialmanagement/testing/internals_fed_cm.idl index 002c3587..ea82ffe0 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/credentialmanagement/testing/internals_fed_cm.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/credentialmanagement/testing/internals_fed_cm.idl @@ -9,11 +9,16 @@ enum DialogButton { "ErrorMoreDetails", }; +dictionary FedCmTitleAndSubtitle { + required DOMString title; + DOMString subtitle; +}; + [ ImplementedAs=InternalsFedCm ] partial interface Internals { [CallWith=ScriptState] Promise getFedCmDialogType(); - [CallWith=ScriptState] Promise getFedCmTitle(); + [CallWith=ScriptState] Promise getFedCmTitleAndSubtitle(); [CallWith=ScriptState, RaisesException] Promise selectFedCmAccount(long accountIndex); [CallWith=ScriptState] Promise dismissFedCmDialog(); [CallWith=ScriptState] Promise clickFedCmDialogButton(DialogButton dialogButton); diff --git a/tools/under-control/src/third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.idl b/tools/under-control/src/third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.idl index e17755ee..9b7cbd8d 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/file_system_access/file_system_directory_handle.idl @@ -9,7 +9,7 @@ Serializable, RuntimeEnabled=FileSystemAccess ] interface FileSystemDirectoryHandle : FileSystemHandle { - async iterable; + async_iterable; [ CallWith=ScriptState, diff --git a/tools/under-control/src/third_party/blink/renderer/modules/ml/ml_context.idl b/tools/under-control/src/third_party/blink/renderer/modules/ml/ml_context.idl index d8081307..834699e0 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/ml/ml_context.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/ml/ml_context.idl @@ -200,6 +200,8 @@ dictionary MLOpSupportLimits { MLBinarySupportLimits logicalOr; MLBinarySupportLimits logicalXor; MLLogicalNotSupportLimits logicalNot; + MLLogicalNotSupportLimits isNaN; + MLLogicalNotSupportLimits isInfinite; // Element-wise unary ops. MLSingleInputSupportLimits abs; @@ -212,6 +214,7 @@ dictionary MLOpSupportLimits { MLSingleInputSupportLimits log; MLSingleInputSupportLimits neg; MLSingleInputSupportLimits reciprocal; + MLSingleInputSupportLimits roundEven; MLSingleInputSupportLimits sign; MLSingleInputSupportLimits sin; MLSingleInputSupportLimits sqrt; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.idl b/tools/under-control/src/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.idl index 4b00ec2c..9529a187 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/ml/webnn/ml_graph_builder.idl @@ -287,11 +287,14 @@ dictionary MLTriangularOptions : MLOperatorOptions { [RaisesException] MLOperand floor(MLOperand x, optional MLOperatorOptions options = {}); [RaisesException] MLOperand log(MLOperand x, optional MLOperatorOptions options = {}); [RaisesException] MLOperand neg(MLOperand x, optional MLOperatorOptions options = {}); + [RaisesException] MLOperand roundEven(MLOperand x, optional MLOperatorOptions options = {}); [RaisesException] MLOperand sign(MLOperand x, optional MLOperatorOptions options = {}); [RaisesException] MLOperand sin(MLOperand x, optional MLOperatorOptions options = {}); [RaisesException] MLOperand tan(MLOperand x, optional MLOperatorOptions options = {}); [RaisesException] MLOperand erf(MLOperand x, optional MLOperatorOptions options = {}); [RaisesException] MLOperand identity(MLOperand x, optional MLOperatorOptions options = {}); + [RaisesException] MLOperand isNaN(MLOperand x, optional MLOperatorOptions options = {}); + [RaisesException] MLOperand isInfinite(MLOperand x, optional MLOperatorOptions options = {}); [RaisesException] MLOperand logicalNot(MLOperand x, optional MLOperatorOptions options = {}); [RaisesException] MLOperand reciprocal(MLOperand x, optional MLOperatorOptions options = {}); [RaisesException] MLOperand sqrt(MLOperand x, optional MLOperatorOptions options = {}); diff --git a/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_frame_metadata.idl b/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_frame_metadata.idl index 41092e69..bfa3d464 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_frame_metadata.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_encoded_audio_frame_metadata.idl @@ -2,18 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://github.com/alvestrand/webrtc-media-streams/blob/master/explainer.md#api -// TODO(guidou): Add standards link when available. +// https://www.w3.org/TR/webrtc-encoded-transform/#RTCEncodedAudioFrameMetadata -dictionary RTCEncodedAudioFrameMetadata { - unsigned long synchronizationSource; - sequence contributingSources; - octet payloadType; - DOMString mimeType; - unsigned short? sequenceNumber; - unsigned long rtpTimestamp; - [RuntimeEnabled=RTCEncodedFrameTimestamps] DOMHighResTimeStamp receiveTime; - [RuntimeEnabled=RTCEncodedFrameTimestamps] DOMHighResTimeStamp captureTime; - [RuntimeEnabled=RTCEncodedFrameTimestamps] DOMHighResTimeStamp senderCaptureTimeOffset; +dictionary RTCEncodedAudioFrameMetadata : RTCEncodedFrameMetadata { + unsigned short sequenceNumber; [RuntimeEnabled=RTCEncodedFrameAudioLevel] double audioLevel; }; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_encoded_frame_metadata.idl b/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_encoded_frame_metadata.idl new file mode 100755 index 00000000..7c31c0db --- /dev/null +++ b/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_encoded_frame_metadata.idl @@ -0,0 +1,16 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://www.w3.org/TR/webrtc-encoded-transform/#RTCEncodedFrameMetadata + +dictionary RTCEncodedFrameMetadata { + unsigned long synchronizationSource; + octet payloadType; + sequence contributingSources; + unsigned long rtpTimestamp; + [RuntimeEnabled=RTCEncodedFrameTimestamps] DOMHighResTimeStamp receiveTime; + [RuntimeEnabled=RTCEncodedFrameTimestamps] DOMHighResTimeStamp captureTime; + [RuntimeEnabled=RTCEncodedFrameTimestamps] DOMHighResTimeStamp senderCaptureTimeOffset; + DOMString mimeType; +}; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_encoded_video_frame_metadata.idl b/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_encoded_video_frame_metadata.idl index 13d5ea63..f921d0da 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_encoded_video_frame_metadata.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_encoded_video_frame_metadata.idl @@ -2,41 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// https://github.com/alvestrand/webrtc-media-streams/blob/master/explainer.md#api -// TODO(guidou): Add standards link when available. +// https://www.w3.org/TR/webrtc-encoded-transform/#RTCEncodedVideoFrameMetadata -enum RTCVideoCodecType { - "vp8", - "vp9", - "h264", - "av1", -}; - -enum RTCDecodeTargetIndication { - "not-present", - "discardable", - "switch", - "required", -}; - -dictionary RTCEncodedVideoFrameMetadata { +dictionary RTCEncodedVideoFrameMetadata : RTCEncodedFrameMetadata { // Encoding related metadata long long frameId; sequence dependencies; unsigned short width; unsigned short height; - long spatialIndex; - long temporalIndex; - - // RTP related metadata - unsigned long synchronizationSource; - sequence contributingSources; - octet payloadType; - DOMString mimeType; + unsigned long spatialIndex; + unsigned long temporalIndex; [RuntimeEnabled=RTCEncodedVideoFrameAdditionalMetadata] long long timestamp; // Presentation timestamp, microseconds. - unsigned long rtpTimestamp; - [RuntimeEnabled=RTCEncodedFrameTimestamps] DOMHighResTimeStamp receiveTime; - [RuntimeEnabled=RTCEncodedFrameTimestamps] DOMHighResTimeStamp captureTime; - [RuntimeEnabled=RTCEncodedFrameTimestamps] DOMHighResTimeStamp senderCaptureTimeOffset; }; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.idl b/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.idl index b10eca09..72713912 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.idl @@ -97,8 +97,8 @@ enum RTCPeerConnectionState { // https://w3c.github.io/webrtc-pc/#legacy-interface-extensions // These methods return Promise because having Promise-based versions requires that all overloads return Promises. - [CallWith=ScriptState, RaisesException] Promise createOffer(RTCSessionDescriptionCallback successCallback, RTCPeerConnectionErrorCallback failureCallback, optional RTCOfferOptions options = {}); - [CallWith=ScriptState, RaisesException] Promise createAnswer(RTCSessionDescriptionCallback successCallback, RTCPeerConnectionErrorCallback failureCallback); + [CallWith=ScriptState] Promise createOffer(RTCSessionDescriptionCallback successCallback, RTCPeerConnectionErrorCallback failureCallback, optional RTCOfferOptions options = {}); + [CallWith=ScriptState] Promise createAnswer(RTCSessionDescriptionCallback successCallback, RTCPeerConnectionErrorCallback failureCallback); // TODO(guidou): The failureCallback argument should be non-optional. // TODO(crbug.com/841185): |failureCallback| is not nullable in the spec. [CallWith=ScriptState] Promise setLocalDescription(RTCSessionDescriptionInit description, VoidFunction successCallback, optional RTCPeerConnectionErrorCallback? failureCallback); diff --git a/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.idl b/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.idl index af07f3ab..89afa006 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/peerconnection/rtc_stats_report.idl @@ -167,6 +167,8 @@ dictionary RTCOutboundRtpStreamStats : RTCSentRtpStreamStats { unsigned long framesEncoded; unsigned long keyFramesEncoded; unsigned long long qpSum; + record psnrSum; + unsigned long psnrMeasurements; double totalEncodeTime; double totalPacketSendDelay; RTCQualityLimitationReason qualityLimitationReason; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/printing/web_printer.idl b/tools/under-control/src/third_party/blink/renderer/modules/printing/web_printer.idl index d12e1927..c3416352 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/printing/web_printer.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/printing/web_printer.idl @@ -16,7 +16,7 @@ interface WebPrinter { Promise fetchAttributes(); [CallWith=ScriptState, RaisesException, MeasureAs=WebPrinterPrintJobFunction] - Promise printJob( + Promise submitPrintJob( DOMString job_name, WebPrintDocumentDescription document, WebPrintJobTemplateAttributes attributes); diff --git a/tools/under-control/src/third_party/blink/renderer/modules/private_attribution/private_attribution.idl b/tools/under-control/src/third_party/blink/renderer/modules/private_attribution/private_attribution.idl deleted file mode 100755 index 95a2de10..00000000 --- a/tools/under-control/src/third_party/blink/renderer/modules/private_attribution/private_attribution.idl +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// https://github.com/patcg-individual-drafts/ipa - -dictionary PrivateAttributionHelperShare { - octet keyId; - - ArrayBuffer encryptedShare; -}; - -dictionary PrivateAttributionEncryptedMatchKey { - record shares; -}; - -dictionary PrivateAttributionOptions { - PrivateAttributionEvent eventType; - - unsigned long helperNetworkId; -}; - -dictionary PrivateAttributionHelperInfo { - DOMString origin; - - DOMString publicKey; -}; - -dictionary PrivateAttributionNetwork { - unsigned long id; - - sequence helpers; -}; - -enum PrivateAttributionEvent { - "source", - "trigger", -}; - -[ - Exposed=(Window), - SecureContext, - RuntimeEnabled=InteroperablePrivateAttribution -] interface PrivateAttribution { - [ - CallWith=ScriptState, - RaisesException - ] Promise getEncryptedMatchKey( - DOMString reportCollector, - - PrivateAttributionOptions options); - - [ - CallWith=ScriptState, - RaisesException - ] Promise> getHelperNetworks(); -}; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/private_attribution/window_private_attribution.idl b/tools/under-control/src/third_party/blink/renderer/modules/private_attribution/window_private_attribution.idl deleted file mode 100755 index 4676f5fd..00000000 --- a/tools/under-control/src/third_party/blink/renderer/modules/private_attribution/window_private_attribution.idl +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - - -// https://github.com/patcg-individual-drafts/ipa - -[ - ImplementedAs=WindowPrivateAttribution, - SecureContext, - RuntimeEnabled=InteroperablePrivateAttribution -] partial interface Window { - [SameObject, Replaceable] readonly attribute PrivateAttribution privateAttribution; -}; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/shared_storage/shared_storage.idl b/tools/under-control/src/third_party/blink/renderer/modules/shared_storage/shared_storage.idl index 0fdbc16c..85e1e0ff 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/shared_storage/shared_storage.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/shared_storage/shared_storage.idl @@ -5,7 +5,7 @@ RuntimeEnabled=SharedStorageAPI, Exposed=(Window, SharedStorageWorklet) ] interface SharedStorage { - [Exposed=SharedStorageWorklet] async iterable; + [Exposed=SharedStorageWorklet] async_iterable; [ CallWith=ScriptState, diff --git a/tools/under-control/src/third_party/blink/renderer/modules/webaudio/audio_context_options.idl b/tools/under-control/src/third_party/blink/renderer/modules/webaudio/audio_context_options.idl index 3a0dbe31..8d34212b 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/webaudio/audio_context_options.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/webaudio/audio_context_options.idl @@ -10,4 +10,5 @@ dictionary AudioContextOptions { (AudioContextLatencyCategory or double) latencyHint = "interactive"; float sampleRate; (DOMString or AudioSinkOptions) sinkId; + [RuntimeEnabled=WebAudioConfigurableRenderQuantum] (AudioContextRenderSizeCategory or unsigned long) renderSizeHint = "default"; }; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/webaudio/audio_context_render_size_category.idl b/tools/under-control/src/third_party/blink/renderer/modules/webaudio/audio_context_render_size_category.idl new file mode 100755 index 00000000..fe913d40 --- /dev/null +++ b/tools/under-control/src/third_party/blink/renderer/modules/webaudio/audio_context_render_size_category.idl @@ -0,0 +1,9 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// See https://webaudio.github.io/web-audio-api/#enumdef-audiocontextrendersizecategory +enum AudioContextRenderSizeCategory { + "default", + "hardware" +}; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.idl b/tools/under-control/src/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.idl index 04329562..f7812e7b 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/webaudio/audio_worklet_global_scope.idl @@ -12,6 +12,7 @@ readonly attribute unsigned long long currentFrame; readonly attribute double currentTime; readonly attribute float sampleRate; + [RuntimeEnabled=WebAudioConfigurableRenderQuantum] readonly attribute unsigned long renderQuantumSize; }; // Blink-specific types diff --git a/tools/under-control/src/third_party/blink/renderer/modules/webaudio/base_audio_context.idl b/tools/under-control/src/third_party/blink/renderer/modules/webaudio/base_audio_context.idl index fa68a8b9..30af8567 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/webaudio/base_audio_context.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/webaudio/base_audio_context.idl @@ -22,6 +22,7 @@ callback DecodeSuccessCallback = void (AudioBuffer decodedData); readonly attribute double currentTime; readonly attribute AudioListener listener; readonly attribute AudioContextState state; + [RuntimeEnabled=WebAudioConfigurableRenderQuantum] readonly attribute unsigned long renderQuantumSize; [SecureContext] readonly attribute AudioWorklet audioWorklet; attribute EventHandler onstatechange; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/webaudio/offline_audio_context_options.idl b/tools/under-control/src/third_party/blink/renderer/modules/webaudio/offline_audio_context_options.idl index 4af9e623..af142c35 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/webaudio/offline_audio_context_options.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/webaudio/offline_audio_context_options.idl @@ -7,4 +7,5 @@ dictionary OfflineAudioContextOptions { unsigned long numberOfChannels = 1; required unsigned long length; required float sampleRate; + [RuntimeEnabled=WebAudioConfigurableRenderQuantum] (AudioContextRenderSizeCategory or unsigned long) renderSizeHint = "default"; }; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.idl b/tools/under-control/src/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.idl index ac5b0163..f924e7de 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.idl @@ -646,6 +646,9 @@ interface mixin WebGLRenderingContextBase { GLenum format, GLenum type, VideoFrame frame); [RuntimeEnabled=CanvasDrawElement, RaisesException] + void texHTMLElement2D(GLenum target, GLint level, GLint internalformat, + GLenum format, GLenum type, Element element); + [RuntimeEnabled=CanvasDrawElement, RaisesException] void texElement2D(GLenum target, GLint level, GLint internalformat, GLenum format, GLenum type, Element element); diff --git a/tools/under-control/src/third_party/blink/renderer/modules/webgpu/gpu_supported_features.idl b/tools/under-control/src/third_party/blink/renderer/modules/webgpu/gpu_supported_features.idl index e1483eb7..bf412aed 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/webgpu/gpu_supported_features.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/webgpu/gpu_supported_features.idl @@ -24,6 +24,7 @@ enum GPUFeatureName { "dual-source-blending", "subgroups", "texture-component-swizzle", + "primitive-index", // Non-standard (not currently in the spec). "chromium-experimental-timestamp-query-inside-passes", @@ -31,7 +32,6 @@ enum GPUFeatureName { "chromium-experimental-unorm16-texture-formats", "chromium-experimental-snorm16-texture-formats", "chromium-experimental-subgroup-matrix", - "chromium-experimental-primitive-id", }; [ diff --git a/tools/under-control/src/third_party/blink/renderer/modules/webtransport/web_transport.idl b/tools/under-control/src/third_party/blink/renderer/modules/webtransport/web_transport.idl index aec6924a..422cf43a 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/webtransport/web_transport.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/webtransport/web_transport.idl @@ -25,4 +25,7 @@ [CallWith=ScriptState, RuntimeEnabled=WebTransportStats] Promise getStats(); + + [RuntimeEnabled=WebTransportApplicationProtocol] + readonly attribute DOMString protocol; }; diff --git a/tools/under-control/src/third_party/blink/renderer/modules/webtransport/web_transport_options.idl b/tools/under-control/src/third_party/blink/renderer/modules/webtransport/web_transport_options.idl index ed383598..1e060c9a 100755 --- a/tools/under-control/src/third_party/blink/renderer/modules/webtransport/web_transport_options.idl +++ b/tools/under-control/src/third_party/blink/renderer/modules/webtransport/web_transport_options.idl @@ -6,4 +6,5 @@ dictionary WebTransportOptions { [RuntimeEnabled=WebTransportCustomCertificates] sequence serverCertificateHashes; + [RuntimeEnabled=WebTransportApplicationProtocol] sequence protocols; }; diff --git a/tools/under-control/src/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/tools/under-control/src/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 485025e4..25e2cf6b 100755 --- a/tools/under-control/src/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/tools/under-control/src/third_party/blink/renderer/platform/runtime_enabled_features.json5 @@ -367,7 +367,18 @@ }, { name: "AIProofreadingAPI", - status: "test", + status: { + "Win": "experimental", + "Mac": "experimental", + "Linux": "experimental", + "ChromeOS": "experimental", + "default": "", + }, + origin_trial_feature_name: "AIProofreaderAPI", + origin_trial_os: ["win", "mac", "linux"], + origin_trial_allows_third_party: true, + base_feature_status: "enabled", + copied_from_base_feature_if: "overridden", }, { name: "AIRewriterAPI", @@ -472,6 +483,14 @@ name: "AllowURNsInIframes", base_feature: "none", }, + { + // Enables the new behavior for this spec change: + // https://github.com/whatwg/html/pull/11457 + // https://issues.chromium.org/issues/433545121 + // https://chromestatus.com/feature/5179013869993984 + name: "AncestorRevealingNewSpec", + status: "stable", + }, { // Kill switch for https://crbug.com/415834974 which changes anchor // positioning adjustments to occur even in cases where there is no @@ -525,7 +544,7 @@ }, { name: "AriaNotify", - status: {"Android": "experimental", "Win": "experimental", "Mac": "experimental", "Linux": "experimental"}, + status: {"Android": "stable", "Win": "stable", "Mac": "stable", "Linux": "stable"}, implied_by: ["AriaNotifyV2"], }, { @@ -584,6 +603,11 @@ name: "AudioVideoTracks", status: "experimental", }, + { + name: "AuthenticatorPasswordsOnlyImmediateRequests", + base_feature: "none", + public: true, + }, { name: "AutoDarkMode", base_feature: "none", @@ -650,6 +674,9 @@ { // Used to enable Blink side of features flags for Default Nav Transition. name: "BackForwardTransitions", + status: { + "Android": "stable", + }, }, { name: "BackgroundFetch", @@ -701,6 +728,11 @@ { name: "BlinkRuntimeCallStats", }, + { + // https://chromestatus.com/feature/4830298126417920 + name: "BlobBytes", + status: "experimental", + }, { name: "BlockingFocusWithoutUserActivation", status: "experimental", @@ -802,7 +834,7 @@ status: "test", }, { - // Remove the restriction that drawElement can only draw immediate + // Remove the restriction that drawHTMLElement can only draw immediate // children of the canvas, and allow drawing canvas descendants. name: "CanvasDrawElementInSubtree", depends_on: ["CanvasDrawElement"], @@ -910,16 +942,6 @@ name: "CheckVisibilityExtraProperties", status: "stable", }, - // This flag shifts the timing of clearing the popover invoker so that it - // happens after the `beforetoggle` event is fired. This is something of a - // bug fix: see the spec discussion at - // https://github.com/whatwg/html/issues/11246#issuecomment-2860876897. - // This is enabled by default, and is a kill switch. It shipped in M138, - // and can be removed in M140. - { - name: "ClearPopoverInvokerAfterBeforeToggle", - status: "stable", - }, { // Allows top-level sites to restrict collection of high-entropy UA client // hints (from 3Ps, or itself) via the getHighEntropyValues API. @@ -984,6 +1006,18 @@ name: "ColorInputDatalistLooksNormal", status: "stable", }, + // Enable the rec2100-linear color space in CSS and PredefinedColorSpace. + { + name: "ColorSpaceRec2100Linear", + status: "experimental", + }, + { + // Makes the command event not composed. Launched in M141. + // https://github.com/whatwg/html/pull/11255 + // https://issues.chromium.org/issues/414826954 + name: "CommandEventNotComposed", + status: "stable", + }, { name: "CompositeBGColorAnimation", public: true, @@ -1131,11 +1165,16 @@ }, { // When enabled, allowlisting script urls and scripts used in eval via - // hashes will be supported in script-src. Controlled by the - // network::features::kCSPScriptSrcHashesInV1 flag. + // hashes will be supported in script-src. This is a no-op if the + // network::features::kCSPScriptSrcHashesInV1 flag is off, since it + // controls parsing in the network service. // See crbug.com/392657736 for details. name: "CSPHashesV1", base_feature: "none", + origin_trial_feature_name: "CSPExtendedScriptSrcHashes", + origin_trial_os: ["win", "linux", "mac", "android", "chromeos"], + status: "experimental", + public: true, }, { name: "CSPReportHash", @@ -1146,13 +1185,6 @@ name: "CSSAccentColorKeyword", status: "experimental", }, - { - // CSS attr() function that accepts not only string types - // and can be used in all properties. - // https://drafts.csswg.org/css-values-5/#attr-notation - name: "CSSAdvancedAttrFunction", - status: "stable", - }, { // Allows using counter() and counters() in alt text (after / in content property). name: "CSSAltCounter", @@ -1164,6 +1196,18 @@ name: "CSSAnchorScope", status: "stable", }, + { + // An anchor-positioned element should stay within its containing block, + // and not "escape" beyond the fragmentation context root and use the + // bounding box of the fragmented anchor with fragmentation applied. + name: "CSSAnchorSimplifiedFragmentation", + status: "stable", + }, + { + // An update of anchor positioning (primarily how scrolling affects + // layout, but includes other inter-connected changes). + name: "CSSAnchorUpdate", + }, { // Let transforms affect anchor() and anchor-size() functions. name: "CSSAnchorWithTransforms", @@ -1178,17 +1222,6 @@ name: "CSSAtRuleCounterStyleSpeakAsDescriptor", status: "test", }, - { - // Replaces `string` type in CSS attr() function syntax with `raw-string`. - // https://github.com/w3c/csswg-drafts/issues/11645#issuecomment-2701601350 - name: "CSSAttrRawString", - status: "stable", - }, - { - // https://chromestatus.com/feature/5125388091260928 - name: "CSSBackgroundClipUnprefix", - status: "stable", - }, // https://chromestatus.com/feature/5459864205393920 { // https://chromestatus.com/feature/5125388091260928 @@ -1269,11 +1302,6 @@ name: "CSSCustomMedia", status: "test", }, - { - // Allows getComputedStyle() and similar to get information about :visited colors. - // Only safe if PartitionVisitedLinkDatabaseWithSelfLinks is enabled. - name: "CSSDoNotHideVisitedColor", - }, { name: "CSSDynamicRangeLimit", status: "stable", @@ -1282,7 +1310,7 @@ // Include custom properties in CSSComputedStyleDeclaration::item/length. // https://crbug.com/949807 name: "CSSEnumeratedCustomProperties", - status: "test", + status: "stable", }, { name: "CSSExponentialFunctions", @@ -1301,6 +1329,10 @@ name: "CssFitWidthText", status: "experimental", }, + { + // crbug.com/417306102 + name: "CssFitWidthTextConsistent", + }, { name: "CSSFontSizeAdjust", status: "stable", @@ -1315,6 +1347,10 @@ name: "CSSGapDecoration", status: "experimental", }, + { + // https://issues.chromium.org/issues/436140061 + name: "CSSGapDecorationOptimized", + }, { // This needs to be kept as a runtime flag as long as we need to forcibly // disable it for WebView on Android versions older than P. See @@ -1366,6 +1402,12 @@ name: "CSSKeyframesRuleLength", status: "stable", }, + { + // Support for extended language ranges in :lang() + // https://chromestatus.com/feature/5071058079055872 + name: "CSSLangExtendedRanges", + status: "experimental", + }, { name: "CSSLayoutAPI", status: "experimental", @@ -1470,28 +1512,8 @@ status: "stable", depends_on: ["PseudoElementsFocusable"], }, - { - // TODO(crbug.com/40932006): CSS 'reading-flow' property for reading order - // of grid, flexbox and block items. - // https://drafts.csswg.org/css-display-4/#reading-flow - // This should ship in M137, and it can be removed after M139. - name: "CSSReadingFlow", - status: "stable", - }, - { - // TODO(crbug.com/393550130): CSS 'reading-order' property to overwrite - // reading-flow order. - // https://drafts.csswg.org/css-display-4/#reading-order - // This should ship in M137, and it can be removed after M139. - name: "CSSReadingOrder", - status: "stable", - depends_on: ["CSSReadingFlow"], - }, - { - // crbug.com/359616070 - name: "CSSRelativeColorLateResolveAlways", - status: "stable", - }, + + { // Non-standard 'auto' keyword for the CSS resize property. Used for // selectively enable resize corner for textarea via UA stylesheet, but @@ -1500,6 +1522,10 @@ name: "CSSResizeAuto", status: "stable", }, + { + name: "CSSRevertRule", + status: "experimental", + }, { name: "CSSSafePrintableInset", status: "experimental", @@ -1524,6 +1550,12 @@ name: "CSSScrollMarkerGroupModes", status: "experimental", }, + { + // https://github.com/w3c/csswg-drafts/issues/11600 + // :target-before and :target-after pseudo classes for scroll markers. + name: "CSSScrollMarkerTargetBeforeAfter", + status: "experimental", + }, { // https://drafts.csswg.org/css-scroll-snap-2/#scrollsnapchange name: "CSSScrollSnapChangeEvent", @@ -1556,16 +1588,16 @@ name: "CSSScrollTargetGroup", status: "stable", }, + { + // scroll-target-group property sets aria-current=true on :target-current html scroll marker. + name: "CSSScrollTargetGroupAriaCurrent", + status: "experimental", + }, { name: "CSSSelectorFragmentAnchor", status: "experimental", base_feature: "CssSelectorFragmentAnchor", }, - { - // Ignore cycles in unused var()/attr() fallbacks. - name: "CSSShortCircuitVarAttr", - status: "stable", - }, { // sibling-index() and sibling-count() name: "CSSSiblingFunctions", @@ -1580,11 +1612,6 @@ name: "CSSSignRelatedFunctions", status: "stable", }, - { - // Explainer: https://drafts.csswg.org/css-values/#round-func - name: "CSSSteppedValueFunctions", - status: "stable", - }, { name: "CSSSupportsAtRuleFunction", status: "experimental", @@ -1603,6 +1630,11 @@ "default": "experimental", }, }, + { + // https://issues.chromium.org/40787216: CSS `text-align: match-parent` value + name: "CSSTextAlignMatchParent", + status: "experimental", + }, { // crbug.com/1463890: CSS `text-autospace` property name: "CSSTextAutoSpace", @@ -1649,22 +1681,12 @@ name: "CSSViewTransitionAutoName", status: "experimental", }, - { - // Adds the appearance:base-select CSS value which makes - // than just . name: "InputInSelect", status: "experimental", - depends_on: ["SelectParserRelaxation"], }, { name: "InputMultipleFieldsUI", @@ -2804,10 +2853,6 @@ public: true, status: "stable", }, - { - name: "InteroperablePrivateAttribution", - status: "experimental", - }, { // If enabled, IntersectionObserverScrollMargin will be parsed. name: "IntersectionObserverScrollMargin", @@ -2856,18 +2901,6 @@ name: "LanguageDetectionAPIForWorkers", public: true, }, - { - name: "LayoutAddChildBeforeDescendantFix", - status: "stable", - }, - { - // LayoutBox::PhysicalLocation() to return a truly visual offset - the - // offset of its first fragment relatively to the first fragment of its - // containing block, also when block-fragmented (used to be in the - // "stitched" flow-thread coordinate space). - name: "LayoutBoxVisualLocation", - status: "stable", - }, { name: "LayoutFlexNewRowAlgorithm", status: "stable", @@ -2879,23 +2912,11 @@ name: "LayoutMinSizeAutoIndefinite", status: "stable", }, - { - name: "LayoutNewReplacedLogic", - status: "stable", - }, { name: "LayoutNGShapeCache", status: "stable", base_feature: "LayoutNGShapeCache", }, - { - name: "LayoutStretch", - status: "stable", - }, - { - name: "LayoutStretchCacheFix", - status: "stable", - }, { name: "LazyInitializeMediaControls", base_feature: "none", @@ -3020,7 +3041,7 @@ }, { name: "MaskDeserializationTimeForCrossOriginMessages", - status: "experimental", + status: "stable", }, { // Enables mirroring for stretchy and large MathML operators when @@ -3170,13 +3191,7 @@ name: "MessagePortCloseEvent", status: "test", }, - // This is a killswitch for no - // longer accepting fractions, landed around M125. - // It can be removed in M127 if there are no problems. - { - name: "MetaRefreshNoFractional", - status: "stable", - }, + // This is enabled by default on Windows only. The only part that's // "experimental" is the support on other platforms. { @@ -3218,6 +3233,13 @@ name: "MoveToParagraphStartOrEndSkipsNonEditable", status: "stable", }, + { + // Experimental support for Multicast in Direct Sockets API. + // https://github.com/explainers-by-googlers/multicast-in-direct-sockets + name: "MulticastInDirectSockets", + status: "test", + depends_on: ["DirectSockets"] + }, { name: "MulticolColumnWrapping", status: "experimental", @@ -3227,7 +3249,7 @@ }, { name: "NavigateEventCommitBehavior", - status: "experimental", + status: "stable", }, { name: "NavigateEventPopstateLimitations", @@ -3248,6 +3270,11 @@ // Android does not yet support NavigatorContentUtils. status: {"Android": "", "default": "stable"}, }, + { + // crbug.com/437612643 + name: "NestedRubyMinMaxFix", + status: "stable", + }, { name: "NestedViewTransition", status: "stable", @@ -3266,13 +3293,7 @@ }, base_feature: "none", }, - { - // This is a killswitch for the behavior of Element::GetFocusableArea - // on delegatesFocus shadow hosts. This flag can be removed in M127 if - // things are stable. - name: "NewGetFocusableAreaBehavior", - status: "stable", - }, + { // This turns off all font antialiasing for tests unless it is // explicitly required and enabled using the @@ -3507,6 +3528,11 @@ // Android does not have support for PagePopup status: {"Android": "", "iOS": "", "default": "stable"}, }, + { + name: "PagePopupCopyPaste", + depends_on: ["PagePopup"], + status: "stable", + }, { name: "PageRevealEvent", status: "stable", @@ -3516,11 +3542,13 @@ status: "stable", }, { - name: "PaintHighlightsForFirstLetter", + name: "PaintHoldingForIframes", status: "stable", }, { - name: "PaintHoldingForIframes", + // Fix for https://crbug.com/40716515. + // Killswitch M141. + name: "PaintOffsetTranslationForBackdropFilterWithInlineElement", status: "stable", }, { @@ -3728,6 +3756,12 @@ status: "stable", base_feature: "none", }, + { + // When enabled, preserves dropEffect in drag event set during dragover + // events. + name: "PreserveDropEffect", + status: "stable", + }, { // When enabled, prevents undo to be applied if the enclosing block // is not editable @@ -3750,14 +3784,6 @@ name: "PrivateAggregationApiMaxContributions", status: "stable", }, - { - name: "PrivateNetworkAccessNonSecureContextsAllowed", - origin_trial_feature_name: "PrivateNetworkAccessNonSecureContextsAllowed", - origin_trial_type: "deprecation", - origin_trial_allows_insecure: true, - status: "experimental", - base_feature: "none", - }, { name: "PrivateNetworkAccessNullIpAddress", status: "experimental", @@ -3883,12 +3909,22 @@ name: "ReadableStreamBYOBReaderReadMinOption", status: "stable", }, + { + name: "RecordSameDocumentPresentationTimeOnce", + status: "stable", + }, // If enabled, both Accept-Language HTTP header and JavaScript getter will // be reduced. { name: "ReduceAcceptLanguage", base_feature: "none", }, + { + // If enabled, the amount of RAM reported through the `Navigator` + // interface will be hard-coded to 8gb. + name: "ReduceDeviceMemory", + settable_from_internals: true, + }, { // If enabled, the number of CPU cores reported through the `Navigator` // interface will be hard-coded to 8. @@ -3931,8 +3967,9 @@ status: {"Android": "", "default": "stable"}, }, { + public: true, name: "RegionCapture", - status: {"Android": "", "default": "stable"}, + status: {"Android": "experimental", "iOS": "", "default": "stable"}, }, { name: "RelatedWebsitePartitionAPI", @@ -3979,6 +4016,12 @@ name: "RemoveCharsetAutoDetectionForISO2022JP", status: "stable", }, + // After paste operation removes the placeholder
tag + // that gets inserted in contenteditable as placeholder for newline + { + name: "RemoveCollapsedPlaceholderForContentEditable", + status: "stable" + }, { name: "RemoveDanglingMarkupInTarget", status: "stable", @@ -3988,9 +4031,11 @@ status: "stable", }, { - // This feature was shipped in M138, so this flag can be removed in M140. - // See https://issues.chromium.org/issues/415911524. - name: "RemoveNodeDetermineNodeFullySelected", + // Fix for removeFormat command incorrectly preserving background-color + // when removing styles from elements. Prevents background-color from being + // re-applied to child elements during style removal. + // See https://crbug.com/41438799 + name: "RemoveFormatFilterBackgroundColor", status: "stable", }, { @@ -4067,35 +4112,26 @@ }, { name: "RestrictOwnAudio", - status: "experimental", + status: "stable", }, { name: "RestrictTabFocusForHiddenSVGElements", status: "stable", }, - // Killswitch for retargeting drag events to UA shadow hosts. - // Added in M139, can be removed in M141. - { - name: "RetargetDragEvents", - status: "stable", - }, - { - // Kill-switch for crbug.com/414129878. - // Added in M139, and it can be removed in M141. - name: "RevealSelectionInIframe", - status: "stable", - }, - { - // New behavior when line breaker rewinds floats. crbug.com/1499290 - name: "RewindFloats", - status: "stable", - }, { // If enabled, makes the root scrollbars' foreground elements follow the // browser name: "RootScrollbarFollowsBrowserTheme", status: {"Linux": "test", "Win": "test"}, }, + // Route matching, @route CSS rule, script type="routemap". + // https://chromestatus.com/feature/4771962874363904 + { + name: "RouteMatching", + status: { + "default": "test", + }, + }, { name: "RtcAudioJitterBufferMaxPackets", origin_trial_feature_name: "RtcAudioJitterBufferMaxPackets", @@ -4149,7 +4185,7 @@ }, { name: "RTCRtpScriptTransform", - status: "experimental", + status: "stable", }, { name: "RTCRtpTransport", @@ -4222,11 +4258,10 @@ }, { name: "ScriptRunIteratorCombiningMarks", - status: "stable", }, { name: "ScriptTools", - status: "test", + status: "experimental", }, { name: "ScrollAnchorPriorityCandidateSubtree", @@ -4329,23 +4364,6 @@ "default": "test", }, }, - { - // Implements improved accessibility mappings for having an - // inside of a in the a11y tree at - // the same place that its at in the DOM tree, but automatically setting - // up a controls relationship to the menu list popup. - name: "SelectAccessibilityNestedInput", - status: "test", - depends_on: ["CustomizableSelect"], - }, - { - // Implements improved accessibility mappings for having an - // inside of a in the - // accessibility tree to be a sibling of the menu list popup. - name: "SelectAccessibilityReparentInput", - status: "test", - depends_on: ["CustomizableSelect"], - }, { // SelectAudioOutput API // https://chromestatus.com/feature/5164535504437248 @@ -4361,27 +4379,24 @@ // https://github.com/openui/open-ui/issues/1063 name: "SelectedcontentelementAttribute", status: "test", - depends_on: ["CustomizableSelect"], - }, - { - // Implement Selection API across shadow DOM: direction and - // getComposedRanges(). - // https://w3c.github.io/selection-api/#dom-selection-getcomposedranges - // https://w3c.github.io/selection-api/#dom-selection-direction - // This should ship in M137, and it can be removed after M139. - name: "SelectionAcrossShadowDOM", - status: "stable", }, + { // See https://crbug.com/40664519 name: "SelectionAndFocusedVisiblePositionMatch", status: "stable", }, { - // See https://crbug.com/417823377 - name: "SelectionDeleteFromDocumentUaShadowFix", + // Killswitch M141. + name: "SelectionHandleWithBottomClipped", status: "stable", }, + { + // https://issues.chromium.org/issues/40502558 + name: "SelectionSetBaseAndExtentNonNullNode", + status: "experimental", + settable_from_internals: true, + }, { // See https://crbug.com/395544401 name: "SelectionUpdateToInitialSelectionInListify", @@ -4393,33 +4408,12 @@ status: "experimental", }, { - // If enabled, the select element will not dispatch a mouseup event when - // an option is selected using the keyboard. - // This should ship in M135, and it can be removed after M137. - // http://crbug.com/396611142 - name: "SelectNoMouseUpForKeyboardSelection", - status: "stable", - }, - { - // Makes the HTML parser allow most tags inside of a ListBox. + name: "SelectMobileDesktopParity", + status: "experimental", }, { name: "SendBeaconThrowForBlobWithNonSimpleType", @@ -4435,7 +4429,7 @@ }, { name: "Serial", - status: {"Android": "test", "default": "stable"}, + status: "stable", base_feature: "WebSerialAPI", }, { @@ -4540,9 +4534,7 @@ }, { name: "SignatureBasedIntegrity", - status: "experimental", - origin_trial_feature_name: "SignatureBasedIntegrity", - origin_trial_allows_third_party: true, + status: "stable", }, { name: "SkipAd", @@ -4612,6 +4604,7 @@ }, { name: "SoftNavigationDetectionPrePaintBasedAttribution", + status: "experimental", depends_on: ["SoftNavigationDetection"], }, { @@ -4720,6 +4713,13 @@ name: "StylusHandwriting", base_feature: "none", }, + { + name: "Svg2Cascade", + }, + { + name: "SvgAnchorElementDownloadAttribute", + status: "experimental", + }, { name: "SvgAnchorElementRelAttributes", status: "stable", @@ -4734,6 +4734,12 @@ name: "SvgEagerPresAttrStyleUpdate", status: "stable", }, + { + // Treat SVG documents in / as replaced elements + // https://issues.chromium.org/41302806 + name: "SVGEmbeddedAsReplacedElement", + status: "experimental", + }, { // Enables loading of external SVG resource documents for the 'clip-path', // 'fill', 'stroke' and 'marker-*' properties. @@ -4744,6 +4750,10 @@ name: "SvgFeConvolveMatrixZeroDivisorBehavior", status: "stable", }, + { + name: "SvgFilterPaintsForHiddenContent", + status: "stable", + }, { name: "SvgIgnoreNegativeEllipseRadii", status: "stable", @@ -4760,6 +4770,10 @@ name: "SvgScriptElementAsyncAttribute", status: "experimental", }, + { + name: "SvgSmilPruneInstanceTimes", + status: "stable", + }, { name: "SvgTextCentralBaselineTextDecorationFix", status: "stable", @@ -4776,6 +4790,14 @@ name: "SynthesizedKeyboardEventsForAccessibilityActions", status: "experimental", }, + { + name: "SystemDefaultAccentColors", + status: "stable", + base_feature: "none", + + // This feature is controlled by the corresponding Chromium feature + // features::kUseSystemDefaultAccentColors. + }, { // This is used for emoji variation selectors support in system // fallback matching. This is a workaround solution that helps to @@ -4867,23 +4889,32 @@ name: "TestFeatureStable", status: "stable", }, + { + // crbug.com/442551790 + name: "TextareaLastLineRemovalFix", + status: "stable", + }, { // crbug.com/414858401 name: "TextareaLineEndingsAsBr", status: "stable", - depends_on: ["EditingFastRichReplace"], }, { // crbug.com/414858401 name: "TextareaMultipleIfcs", status: "stable", - depends_on: ["FastSelectionSync", "TextareaLineEndingsAsBr"], + depends_on: ["TextareaLineEndingsAsBr"], }, { // crbug.com/341564372 name: "TextareaSplitText", status: "stable", }, + { + // crbug.com/435186193 + name: "TextDecorationOmitCurrentColor", + status: "stable", + }, { // crbug.com/40098316 name: "TextDecorationShortSerialization", @@ -4943,6 +4974,11 @@ depends_on: ["TextSpacingTrimFallback"], status: "test", }, + { + // crbug.com/331123676 + name: "TextSpacingTrimYuGothicUI", + status: "stable", + }, // This feature is used to inform the renderer of a user bypass from the // browser process to disable third-party storage partitioning. { @@ -5011,13 +5047,13 @@ // Please see https://issues.chromium.org/40823294 { name: "TouchDragAndContextMenu", - implied_by: ["TouchDragOnShortPress"], base_feature: "none", public: true, }, // This feature enables drag and drop using touch input devices. Replaces // the old "--enable-touch-drag-drop" and "--disable-touch-drag-drop" // switches. + // Enabled by default in Android and ChromeOS. { name: "TouchDragAndDrop", base_feature: "none", @@ -5028,9 +5064,6 @@ { name: "TouchDragOnShortPress", depends_on: ["TouchDragAndDrop"], - status: { - "Win": "stable", - }, }, // Many websites disable mouse support when touch APIs are available. We'd // like to enable this always but can't until more websites fix this bug. @@ -5102,12 +5135,6 @@ name: "TreatMhtmlInitialDocumentLoadsAsCrossDocument", status: "stable", }, - { - // Ensures symbols are treated as word boundaries during traversal. - // See https://crbug.com/40252642 - name: "TreatSymbolsAsWordBoundary", - status: "stable", - }, { name: "TrustedTypeBeforePolicyCreationEvent", status: "experimental", @@ -5133,12 +5160,7 @@ }, { name: "UnencodedDigest", - status: "experimental", - implied_by: ["SignatureBasedIntegrity"], - // It's unclear whether we'll trial this feature separately from - // `SignatureBasedIntegrity`, but we must specify an origin trial feature - // name in order for the `implied_by` relationship above to function. - origin_trial_feature_name: "UnencodedDigest" + status: "stable", }, { name: "UnexposedTaskIds", @@ -5181,6 +5203,13 @@ { name: "UpdateSelectionOnNodeInsertion" }, + // Fix for https://crbug.com/436624850 + // Ensures trivial_text_ is updated after fragment creation from text + // by calling UpdateTrivialReplacementText() + { + name: "UpdateTrivalTextAfterFragmentCreationFromText", + status: "stable", + }, { name: "URLPatternCompareComponent", status: "experimental", @@ -5236,13 +5265,6 @@ name: "UseShadowHostStyleCheckEditable", status: "stable", }, - { - // For invalidation set tracking, we build a map from style rules to - // their containing sheets. When this flag is enabled, we use that same - // map for the Selector Stats feature. - name: "UseStyleRuleMapForSelectorStats", - status: "stable", - }, { name: "UseUndoStepElementDispatchBeforeInput", status: "stable", @@ -5252,10 +5274,6 @@ base_feature: "none", public: true, }, - { - name: "VideoAspectRatioNaturalDimension", - status: "stable", - }, { // Whether a video element should automatically play fullscreen unless // 'playsinline' is set. @@ -5318,15 +5336,6 @@ { name: "VisibilityCollapseColumn", }, - { - // When enabled, makes links `:visited` even when the visit results in an - // HTTP error response code of 404. - name: "VisitedLinksOnErrorNavigation", - }, - { - name: "VisualViewportOnScrollEnd", - status: "stable", - }, { // The "WakeLock" feature was originally implied_by "ScreenWakeLock" and // "SystemWakeLock". The former was removed after being promoted to @@ -5384,6 +5393,13 @@ status: "experimental", base_feature: "WebAppEnableTranslations", }, + { + // https://chromestatus.com/feature/6024844719947776 + name: "WebAssemblyCustomDescriptors", + origin_trial_feature_name: "WebAssemblyCustomDescriptors", + status: "experimental", + base_feature: "none", + }, { // WebAssembly JS Promise Integration, // https://github.com/WebAssembly/js-promise-integration/blob/main/proposals/js-promise-integration @@ -5392,11 +5408,6 @@ status: "experimental", base_feature: "none", }, - { - name: "WebAssemblyJSStringBuiltins", - origin_trial_feature_name: "WebAssemblyJSStringBuiltins", - status: "stable", - }, { // https://chromestatus.com/feature/5077691662073856 name: "WebAudioBypassOutputBuffering", @@ -5413,6 +5424,10 @@ name: "WebAudioBypassOutputBufferingOptOut", public: true, }, + { + // https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-renderquantumsize + name: "WebAudioConfigurableRenderQuantum", + }, // WebAuth is disabled on Android versions prior to N (7.0) due to lack of // supporting APIs, see runtime_features.cc. { @@ -5470,12 +5485,6 @@ name: "WebAuthenticationJSONSerialization", status: "stable", }, - { - name: "WebAuthenticationNewBfCacheHandlingBlink", - // No status because this blink runtime feature doesn't work by itself. - // It's controlled by the corresponding Chromium feature which needs to - // be enabled to make the whole feature work. - }, // https://w3c.github.io/webauthn/#prf-extension { name: "WebAuthenticationPRF", @@ -5609,12 +5618,8 @@ }, { name: "WebIdentityDigitalCredentials", - origin_trial_feature_name: "WebIdentityDigitalCredentials", - origin_trial_os: ["android", "win", "mac", "linux", "chromeos"], - origin_trial_allows_third_party: true, - implied_by: ["WebIdentityDigitalCredentialsCreation"], public: true, - status: "experimental", + status: "stable", base_feature: "none", }, { @@ -5673,6 +5678,11 @@ name: "WebSpeechRecognitionContext", status: "experimental", }, + { + name: "WebTransportApplicationProtocol", + status: "experimental", + base_feature: "none", + }, { name: "WebTransportCustomCertificates", origin_trial_feature_name: "WebTransportCustomCertificates", @@ -5812,7 +5822,7 @@ }, { name: "WidthAndHeightAsPresentationAttributesOnNestedSvg", - status: "experimental", + status: "stable", }, { name: "WidthAndHeightStylePropertiesOnUseAndSymbol", @@ -5825,10 +5835,20 @@ { name: "WindowDefaultStatus", }, + { + name: "WordSpacingWhiteSpacePre", + status: "stable", + }, { name: "XMLSerializerConsistentDefaultNsDeclMatching", status: "test", }, + { + // A feature flag that controls whether XSLT is supported by the browser. + // crbug.com/435623334. + name: "XSLT", + status: "stable", + }, { // If enabled, the `getDisplayMedia()` family of APIs will ask for NV12 // frames, which should trigger a zero-copy path in the tab capture code. diff --git a/tools/under-control/src/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/tools/under-control/src/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt index 426e61c0..b8e7e106 100755 --- a/tools/under-control/src/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/tools/under-control/src/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt @@ -1690,6 +1690,13 @@ interface DevicePosture : EventTarget getter type method constructor setter onchange +interface DigitalCredential : Credential + static method userAgentAllowsProtocol + attribute @@toStringTag + getter data + getter protocol + method constructor + method toJSON interface DisposableStack attribute @@toStringTag getter disposed @@ -1894,6 +1901,7 @@ interface Document : Node getter xmlVersion method adoptNode method append + method ariaNotify method browsingTopics method captureEvents method caretPositionFromPoint @@ -2264,6 +2272,7 @@ interface Element : Node method after method animate method append + method ariaNotify method attachShadow method before method checkVisibility @@ -5004,6 +5013,7 @@ interface IDBIndex method get method getAll method getAllKeys + method getAllRecords method getKey method openCursor method openKeyCursor @@ -5037,6 +5047,7 @@ interface IDBObjectStore method get method getAll method getAllKeys + method getAllRecords method getKey method index method openCursor @@ -5050,6 +5061,12 @@ interface IDBOpenDBRequest : IDBRequest method constructor setter onblocked setter onupgradeneeded +interface IDBRecord + attribute @@toStringTag + getter key + getter primaryKey + getter value + method constructor interface IDBRequest : EventTarget attribute @@toStringTag getter error @@ -6121,6 +6138,10 @@ interface NavigationHistoryEntry : EventTarget method constructor method getState setter ondispose +interface NavigationPrecommitController + attribute @@toStringTag + method constructor + method redirect interface NavigationPreloadManager attribute @@toStringTag method constructor @@ -6130,6 +6151,7 @@ interface NavigationPreloadManager method setHeaderValue interface NavigationTransition attribute @@toStringTag + getter committed getter finished getter from getter navigationType @@ -7288,6 +7310,7 @@ interface RTCRtpReceiver getter playoutDelayHint getter rtcpTransport getter track + getter transform getter transport method constructor method createEncodedStreams @@ -7297,12 +7320,17 @@ interface RTCRtpReceiver method getSynchronizationSources setter jitterBufferTarget setter playoutDelayHint + setter transform +interface RTCRtpScriptTransform + attribute @@toStringTag + method constructor interface RTCRtpSender static method getCapabilities attribute @@toStringTag getter dtmf getter rtcpTransport getter track + getter transform getter transport method constructor method createEncodedStreams @@ -7311,6 +7339,7 @@ interface RTCRtpSender method replaceTrack method setParameters method setStreams + setter transform interface RTCRtpTransceiver attribute @@toStringTag getter currentDirection @@ -7490,6 +7519,7 @@ interface Request getter referrer getter referrerPolicy getter signal + getter targetAddressSpace getter url method arrayBuffer method blob