blob: a755fa936b8fc0f4847fc9a6857a75faa30d7450 [file] [log] [blame] [edit]
// 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 <iterator>
#include <map>
#include <memory>
#include <set>
#include <utility>
#include "base/base_switches.h"
#include "base/command_line.h"
#include "base/feature_list.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/apps/link_capturing/link_capturing_features.h"
#include "chrome/browser/browser_features.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/companion/core/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/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/toasts/toast_features.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/unexpire_flags.h"
#include "chrome/browser/unexpire_flags_gen.h"
#include "chrome/browser/web_applications/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 "chromeos/constants/chromeos_features.h"
#include "components/assist_ranker/predictor_config_definitions.h"
#include "components/autofill/content/common/content_autofill_features.h"
#include "components/autofill/core/browser/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/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/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/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/flags_ui/feature_entry.h"
#include "components/flags_ui/feature_entry_macros.h"
#include "components/flags_ui/flags_state.h"
#include "components/flags_ui/flags_storage.h"
#include "components/flags_ui/flags_ui_metrics.h"
#include "components/flags_ui/flags_ui_switches.h"
#include "components/flags_ui/pref_service_flags_storage.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/invalidation/impl/invalidation_switches.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/nacl/common/buildflags.h"
#include "components/nacl/common/nacl_switches.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/omnibox_feature_configs.h"
#include "components/omnibox/browser/omnibox_field_trial.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/power_bookmarks/core/power_bookmark_features.h"
#include "components/privacy_sandbox/privacy_sandbox_features.h"
#include "components/reading_list/features/reading_list_switches.h"
#include "components/remote_cocoa/app_shim/features.h"
#include "components/safe_browsing/core/common/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_state/core/security_state.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/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/common/switches.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 "flag_descriptions.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 "pdf/buildflags.h"
#include "ppapi/buildflags/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/buildflags.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/native_theme_features.h"
#include "ui/ui_features.h"
#include "url/url_features.h"
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
#include "base/allocator/buildflags.h"
#endif
#if BUILDFLAG(IS_CHROMEOS)
#include "base/process/process.h"
#include "chromeos/constants/chromeos_features.h"
#endif
#if BUILDFLAG(IS_ANDROID)
#include "chrome/browser/flags/android/chrome_feature_list.h"
#include "chrome/browser/notifications/chime/android/features.h"
#include "chrome/browser/push_messaging/push_messaging_features.h"
#include "components/browser_ui/photo_picker/android/features.h"
#include "components/browsing_data/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/segmentation_platform/public/features.h"
#include "components/translate/content/android/translate_message.h"
#include "ui/android/ui_android_features.h"
#else // BUILDFLAG(IS_ANDROID)
#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_notes/user_notes_features.h"
#endif // BUILDFLAG(IS_ANDROID)
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ash/components/arc/arc_features.h"
#include "ash/components/arc/arc_util.h"
#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 "chrome/browser/ash/app_list/search/search_features.h"
#include "chrome/browser/ash/crosapi/browser_manager.h"
#include "chrome/browser/ash/crosapi/browser_util.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/chrome_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/components/standalone_browser/channel_util.h"
#include "chromeos/ash/components/standalone_browser/lacros_availability.h"
#include "chromeos/ash/components/standalone_browser/lacros_selection.h"
#include "chromeos/ash/components/standalone_browser/standalone_browser_features.h"
#include "chromeos/ash/services/assistant/public/cpp/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"
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
#if BUILDFLAG(IS_CHROMEOS_LACROS)
#include "chrome/browser/lacros/lacros_url_handling.h"
#include "chrome/common/webui_url_constants.h"
#endif
#if BUILDFLAG(IS_MAC)
#include "chrome/browser/enterprise/platform_auth/platform_auth_features.h"
#include "chrome/browser/ui/browser_dialogs.h"
#endif // BUILDFLAG(IS_MAC)
#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"
#endif
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
#include "ui/ozone/public/ozone_switches.h"
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS_ASH)
#if BUILDFLAG(IS_WIN)
#include "chrome/browser/enterprise/platform_auth/platform_auth_features.h"
#include "chrome/browser/win/mica_titlebar.h"
#endif
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
#include "chrome/browser/enterprise/profile_management/profile_management_features.h"
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
#if !BUILDFLAG(IS_ANDROID)
// This causes a gn error on Android builds, because gn does not understand
// buildflags.
#include "components/user_education/common/user_education_features.h" // nogncheck
#endif
#if BUILDFLAG(IS_LINUX)
#include "chrome/browser/ui/ui_features.h"
#include "ui/base/ui_base_features.h"
#endif
#if defined(TOOLKIT_VIEWS)
#include "ui/views/views_features.h"
#include "ui/views/views_switches.h"
#endif // defined(TOOLKIT_VIEWS)
#if BUILDFLAG(ENABLE_BOUND_SESSION_CREDENTIALS)
#include "components/unexportable_keys/features.h" // nogncheck
#endif
#if BUILDFLAG(SKIA_BUILD_RUST_PNG)
#include "skia/rusty_png_feature.h"
#endif
using flags_ui::FeatureEntry;
using flags_ui::kDeprecated;
using flags_ui::kOsAndroid;
using flags_ui::kOsCrOS;
using flags_ui::kOsCrOSOwnerOnly;
using flags_ui::kOsLacros;
using flags_ui::kOsLinux;
using flags_ui::kOsMac;
using flags_ui::kOsWin;
namespace about_flags {
namespace {
const unsigned kOsAll =
kOsMac | kOsWin | kOsLinux | kOsCrOS | kOsAndroid | kOsLacros;
const unsigned kOsDesktop = kOsMac | kOsWin | kOsLinux | kOsCrOS | kOsLacros;
#if defined(USE_AURA)
const unsigned kOsAura = kOsWin | kOsLinux | kOsCrOS | kOsLacros;
#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::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::kUseAngleGL, switches::kUseANGLE,
gl::kANGLEImplementationOpenGLName},
{flag_descriptions::kUseAngleD3D11, switches::kUseANGLE,
gl::kANGLEImplementationD3D11Name},
{flag_descriptions::kUseAngleD3D9, switches::kUseANGLE,
gl::kANGLEImplementationD3D9Name},
{flag_descriptions::kUseAngleD3D11on12, switches::kUseANGLE,
gl::kANGLEImplementationD3D11on12Name}};
#elif BUILDFLAG(IS_MAC)
const FeatureEntry::Choice kUseAngleChoicesMac[] = {
{flag_descriptions::kUseAngleDefault, "", ""},
{flag_descriptions::kUseAngleGL, switches::kUseANGLE,
gl::kANGLEImplementationOpenGLName},
{flag_descriptions::kUseAngleMetal, switches::kUseANGLE,
gl::kANGLEImplementationMetalName}};
#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(IS_LINUX)
const FeatureEntry::Choice kOzonePlatformHintRuntimeChoices[] = {
{flag_descriptions::kOzonePlatformHintChoiceDefault, "", ""},
{flag_descriptions::kOzonePlatformHintChoiceAuto,
switches::kOzonePlatformHint, "auto"},
#if BUILDFLAG(IS_OZONE_X11)
{flag_descriptions::kOzonePlatformHintChoiceX11,
switches::kOzonePlatformHint, "x11"},
#endif
#if BUILDFLAG(IS_OZONE_WAYLAND)
{flag_descriptions::kOzonePlatformHintChoiceWayland,
switches::kOzonePlatformHint, "wayland"},
#endif
};
#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},
};
#endif // ENABLE_VR
#if BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kAndroidDefaultFontFamilyDevTesting[] = {
{"dev_testing", "true"}};
const FeatureEntry::FeatureVariation kAndroidDefaultFontFamilyVariations[] = {
{"Use dev testing font families", kAndroidDefaultFontFamilyDevTesting,
std::size(kAndroidDefaultFontFamilyDevTesting), nullptr}};
const FeatureEntry::FeatureParam kCCTMinimizedDefaultIcon[] = {
{"icon_variant", "0"}};
const FeatureEntry::FeatureParam kCCTMinimizedAlternativeIcon[] = {
{"icon_variant", "1"}};
const FeatureEntry::FeatureVariation kCCTMinimizedIconVariations[] = {
{"Use default minimize icon", kCCTMinimizedDefaultIcon,
std::size(kCCTMinimizedDefaultIcon), nullptr},
{"Use alternative minimize icon", kCCTMinimizedAlternativeIcon,
std::size(kCCTMinimizedAlternativeIcon), 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::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 kAccessibilityPageZoomNoOSAdjustment[] = {
{"AdjustForOSLevel", "false"},
};
const FeatureEntry::FeatureParam kAccessibilityPageZoomWithOSAdjustment[] = {
{"AdjustForOSLevel", "true"},
};
const FeatureEntry::FeatureVariation kAccessibilityPageZoomVariations[] = {
{"- With OS Adjustment", kAccessibilityPageZoomWithOSAdjustment,
std::size(kAccessibilityPageZoomWithOSAdjustment), nullptr},
{"- No OS Adjustment (default)", kAccessibilityPageZoomNoOSAdjustment,
std::size(kAccessibilityPageZoomNoOSAdjustment), nullptr},
};
#endif // BUILDFLAG(IS_ANDROID)
#if !BUILDFLAG(IS_CHROMEOS_ASH)
const FeatureEntry::FeatureParam kForceDark_SimpleHsl[] = {
{"inversion_method", "hsl_based"},
{"image_behavior", "none"},
{"foreground_lightness_threshold", "150"},
{"background_lightness_threshold", "205"}};
const FeatureEntry::FeatureParam kForceDark_SimpleCielab[] = {
{"inversion_method", "cielab_based"},
{"image_behavior", "none"},
{"foreground_lightness_threshold", "150"},
{"background_lightness_threshold", "205"}};
const FeatureEntry::FeatureParam kForceDark_SimpleRgb[] = {
{"inversion_method", "rgb_based"},
{"image_behavior", "none"},
{"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"},
{"image_behavior", "none"},
{"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_ASH)
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_ASH)
const FeatureEntry::Choice kEnableGpuRasterizationChoices[] = {
{flags_ui::kGenericExperimentChoiceDefault, "", ""},
{flags_ui::kGenericExperimentChoiceEnabled,
switches::kEnableGpuRasterization, ""},
{flags_ui::kGenericExperimentChoiceDisabled,
switches::kDisableGpuRasterization, ""},
};
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 kToastWith6Seconds[] = {
{"toast_timeout", "6s"},
{"toast_without_action_timeout", "6s"},
{"toast_demo_mode", "true"}};
const FeatureEntry::FeatureParam kToastWith8Seconds[] = {
{"toast_timeout", "8s"},
{"toast_without_action_timeout", "8s"},
{"toast_demo_mode", "true"}};
const FeatureEntry::FeatureParam kToastWith10Seconds[] = {
{"toast_timeout", "10s"},
{"toast_without_action_timeout", "10s"},
{"toast_demo_mode", "true"}};
const FeatureEntry::FeatureParam kToastWith12Seconds[] = {
{"toast_timeout", "12s"},
{"toast_without_action_timeout", "12s"},
{"toast_demo_mode", "true"}};
const FeatureEntry::FeatureVariation kToastVariations[] = {
{"with 6s", kToastWith6Seconds, std::size(kToastWith6Seconds), nullptr},
{"with 8s", kToastWith8Seconds, std::size(kToastWith8Seconds), nullptr},
{"with 10s", kToastWith10Seconds, std::size(kToastWith10Seconds), nullptr},
{"with 12s", kToastWith12Seconds, std::size(kToastWith12Seconds), nullptr}};
#endif
#if BUILDFLAG(IS_CHROMEOS_ASH)
const FeatureEntry::FeatureParam kRoundedWindowRadius8 = {
chromeos::features::kRoundedWindowsRadius, "8"};
const FeatureEntry::FeatureParam kRoundedWindowRadius10 = {
chromeos::features::kRoundedWindowsRadius, "10"};
const FeatureEntry::FeatureParam kRoundedWindowRadius12 = {
chromeos::features::kRoundedWindowsRadius, "12"};
const FeatureEntry::FeatureParam kRoundedWindowRadius14 = {
chromeos::features::kRoundedWindowsRadius, "14"};
const FeatureEntry::FeatureParam kRoundedWindowRadius16 = {
chromeos::features::kRoundedWindowsRadius, "16"};
const FeatureEntry::FeatureParam kRoundedWindowRadius18 = {
chromeos::features::kRoundedWindowsRadius, "18"};
const FeatureEntry::FeatureVariation kRoundedWindowsRadiusVariation[] = {
{"8", &kRoundedWindowRadius8, 1, nullptr},
{"10", &kRoundedWindowRadius10, 1, nullptr},
{"12", &kRoundedWindowRadius12, 1, nullptr},
{"14", &kRoundedWindowRadius14, 1, nullptr},
{"16", &kRoundedWindowRadius16, 1, nullptr},
{"18", &kRoundedWindowRadius18, 1, nullptr},
};
const FeatureEntry::FeatureParam
kArcRoundedWindowCompatStrategyLeftRightBottomGesture = {
arc::kRoundedWindowCompatStrategy,
arc::kRoundedWindowCompatStrategy_LeftRightBottomGesture};
const FeatureEntry::FeatureParam
kArcRoundedWindowCompatStrategyBottomOnlyGesture = {
arc::kRoundedWindowCompatStrategy,
arc::kRoundedWindowCompatStrategy_BottomOnlyGesture};
const FeatureEntry::FeatureVariation kArcRoundedWindowCompatVariation[] = {
{"Left-Right-Bottom Gesture Exclusion",
&kArcRoundedWindowCompatStrategyLeftRightBottomGesture, 1, nullptr},
{"Bottom-only Gesture Exclusion",
&kArcRoundedWindowCompatStrategyBottomOnlyGesture, 1, nullptr},
};
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 kPreferDcheckInternalName[] = "prefer-dcheck";
const char kLacrosAvailabilityIgnoreInternalName[] =
"lacros-availability-ignore";
const char kLacrosStabilityInternalName[] = "lacros-stability";
const char kLacrosWaylandLoggingInternalName[] = "lacros-wayland-logging";
const char kArcEnableVirtioBlkForDataInternalName[] =
"arc-enable-virtio-blk-for-data";
const FeatureEntry::Choice kPreferDcheckChoices[] = {
{flags_ui::kGenericExperimentChoiceDefault, "", ""},
{component_updater::kPreferDcheckOptIn,
component_updater::kPreferDcheckSwitch,
component_updater::kPreferDcheckOptIn},
{component_updater::kPreferDcheckOptOut,
component_updater::kPreferDcheckSwitch,
component_updater::kPreferDcheckOptOut},
};
const FeatureEntry::Choice kLacrosStabilityChoices[] = {
{flags_ui::kGenericExperimentChoiceDefault, "", ""},
{ash::standalone_browser::kLacrosStabilityChannelCanary,
ash::standalone_browser::kLacrosStabilitySwitch,
ash::standalone_browser::kLacrosStabilityChannelCanary},
{ash::standalone_browser::kLacrosStabilityChannelDev,
ash::standalone_browser::kLacrosStabilitySwitch,
ash::standalone_browser::kLacrosStabilityChannelDev},
{ash::standalone_browser::kLacrosStabilityChannelBeta,
ash::standalone_browser::kLacrosStabilitySwitch,
ash::standalone_browser::kLacrosStabilityChannelBeta},
{ash::standalone_browser::kLacrosStabilityChannelStable,
ash::standalone_browser::kLacrosStabilitySwitch,
ash::standalone_browser::kLacrosStabilityChannelStable},
};
const char kLacrosSelectionInternalName[] = "lacros-selection";
const char kProjectorServerSideSpeechRecognition[] =
"enable-projector-server-side-speech-recognition";
const FeatureEntry::Choice kLacrosSelectionChoices[] = {
{flags_ui::kGenericExperimentChoiceDefault, "", ""},
{flag_descriptions::kLacrosSelectionStatefulDescription,
ash::standalone_browser::kLacrosSelectionSwitch,
ash::standalone_browser::kLacrosSelectionStateful},
{flag_descriptions::kLacrosSelectionRootfsDescription,
ash::standalone_browser::kLacrosSelectionSwitch,
ash::standalone_browser::kLacrosSelectionRootfs},
};
const char kLacrosSelectionPolicyIgnoreInternalName[] =
"lacros-selection-ignore";
const FeatureEntry::Choice kLacrosAvailabilityPolicyChoices[] = {
{flags_ui::kGenericExperimentChoiceDefault, "", ""},
{ash::standalone_browser::kLacrosAvailabilityPolicyUserChoice,
ash::standalone_browser::kLacrosAvailabilityPolicySwitch,
ash::standalone_browser::kLacrosAvailabilityPolicyUserChoice},
{ash::standalone_browser::kLacrosAvailabilityPolicyLacrosDisabled,
ash::standalone_browser::kLacrosAvailabilityPolicySwitch,
ash::standalone_browser::kLacrosAvailabilityPolicyLacrosDisabled},
{ash::standalone_browser::kLacrosAvailabilityPolicyLacrosOnly,
ash::standalone_browser::kLacrosAvailabilityPolicySwitch,
ash::standalone_browser::kLacrosAvailabilityPolicyLacrosOnly},
};
const FeatureEntry::Choice kLacrosDataBackwardMigrationModePolicyChoices[] = {
{flags_ui::kGenericExperimentChoiceDefault, "", ""},
{crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyNone,
crosapi::browser_util::kLacrosDataBackwardMigrationModePolicySwitch,
crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyNone},
{crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepNone,
crosapi::browser_util::kLacrosDataBackwardMigrationModePolicySwitch,
crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepNone},
{crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepSafeData,
crosapi::browser_util::kLacrosDataBackwardMigrationModePolicySwitch,
crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepSafeData},
{crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepAll,
crosapi::browser_util::kLacrosDataBackwardMigrationModePolicySwitch,
crosapi::browser_util::kLacrosDataBackwardMigrationModePolicyKeepAll},
};
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
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_ASH)
const FeatureEntry::Choice kSchedulerConfigurationChoices[] = {
{flags_ui::kGenericExperimentChoiceDefault, "", ""},
{flag_descriptions::kSchedulerConfigurationConservative,
switches::kSchedulerConfiguration,
switches::kSchedulerConfigurationConservative},
{flag_descriptions::kSchedulerConfigurationPerformance,
switches::kSchedulerConfiguration,
switches::kSchedulerConfigurationPerformance},
};
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
#if BUILDFLAG(IS_CHROMEOS_ASH)
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_ASH)
#if BUILDFLAG(ENABLE_NACL)
// Note: This needs to be kept in sync with parsing in
// content/common/zygote/zygote_communication_linux.cc
const FeatureEntry::Choice kVerboseLoggingInNaclChoices[] = {
{flag_descriptions::kVerboseLoggingInNaclChoiceDefault, "", ""},
{flag_descriptions::kVerboseLoggingInNaclChoiceLow,
switches::kVerboseLoggingInNacl, switches::kVerboseLoggingInNaclChoiceLow},
{flag_descriptions::kVerboseLoggingInNaclChoiceMedium,
switches::kVerboseLoggingInNacl,
switches::kVerboseLoggingInNaclChoiceMedium},
{flag_descriptions::kVerboseLoggingInNaclChoiceHigh,
switches::kVerboseLoggingInNacl,
switches::kVerboseLoggingInNaclChoiceHigh},
{flag_descriptions::kVerboseLoggingInNaclChoiceHighest,
switches::kVerboseLoggingInNacl,
switches::kVerboseLoggingInNaclChoiceHighest},
{flag_descriptions::kVerboseLoggingInNaclChoiceDisabled,
switches::kVerboseLoggingInNacl,
switches::kVerboseLoggingInNaclChoiceDisabled},
};
#endif // ENABLE_NACL
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},
};
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", "*"},
{"on_device_retract_unsafe_content", "true"},
};
const FeatureEntry::FeatureParam
kOptimizationGuideOnDeviceModelBypassTextSafetyParams[] = {
{"on_device_retract_unsafe_content", "false"},
};
const FeatureEntry::FeatureParam
kOptimizationGuideOnDeviceModelBypassPerfAndTextSafetyParams[] = {
{"compatible_on_device_performance_classes", "*"},
{"on_device_retract_unsafe_content", "false"},
};
const FeatureEntry::FeatureVariation
kOptimizationGuideOnDeviceModelVariations[] = {
{"BypassPerfRequirement",
kOptimizationGuideOnDeviceModelBypassPerfParams,
std::size(kOptimizationGuideOnDeviceModelBypassPerfParams), nullptr},
{"BypassTextSafety",
kOptimizationGuideOnDeviceModelBypassTextSafetyParams,
std::size(kOptimizationGuideOnDeviceModelBypassTextSafetyParams),
nullptr},
{"BypassPerfAndTextSafety",
kOptimizationGuideOnDeviceModelBypassPerfAndTextSafetyParams,
std::size(
kOptimizationGuideOnDeviceModelBypassPerfAndTextSafetyParams),
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::FeatureVariation kPageContentAnnotationsVariations[] = {
{"All Annotations and Persistence on Content",
kPageContentAnnotationsContentParams,
std::size(kPageContentAnnotationsContentParams), nullptr},
{"All Annotations and Persistence on Title",
kPageContentAnnotationsTitleParams,
std::size(kPageContentAnnotationsTitleParams), nullptr},
};
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
BUILDFLAG(IS_WIN)
const FeatureEntry::FeatureParam kHistoryEmbeddingsAtKeywordAcceleration[]{
{"AtKeywordAcceleration", "true"},
};
const FeatureEntry::FeatureVariation kHistoryEmbeddingsVariations[] = {
{"with AtKeywordAcceleration", kHistoryEmbeddingsAtKeywordAcceleration,
std::size(kHistoryEmbeddingsAtKeywordAcceleration), nullptr},
};
#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) ||
// BUILDFLAG(IS_WIN)
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::FeatureParam kSidePanelJourneysOpensFromOmniboxParams[] = {
{"SidePanelJourneysOpensFromOmnibox", "true"},
};
const FeatureEntry::FeatureVariation
kSidePanelJourneysOpensFromOmniboxVariations[] = {
{"Omnibox opens Side Panel Journeys",
kSidePanelJourneysOpensFromOmniboxParams,
std::size(kSidePanelJourneysOpensFromOmniboxParams), nullptr},
};
#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \
BUILDFLAG(IS_WIN)
const FeatureEntry::FeatureParam kShortcutBoostSingleUrl[] = {
{"ShortcutBoostSearchScore", "0"},
{"ShortcutBoostNonTopHitThreshold", "0"},
{"ShortcutBoostGroupWithSearches", "false"},
};
const FeatureEntry::FeatureParam kShortcutBoostMultipleUrls[] = {
{"ShortcutBoostSearchScore", "0"},
{"ShortcutBoostNonTopHitThreshold", "2"},
{"ShortcutBoostGroupWithSearches", "true"},
};
const FeatureEntry::FeatureParam kShortcutBoostMultipleSearchesAndUrls[] = {
{"ShortcutBoostSearchScore", "1414"},
{"ShortcutBoostNonTopHitThreshold", "2"},
{"ShortcutBoostNonTopHitSearchThreshold", "3"},
{"ShortcutBoostGroupWithSearches", "true"},
};
const FeatureEntry::FeatureVariation kOmniboxShortcutBoostVariations[] = {
{"Single URL", kShortcutBoostSingleUrl, std::size(kShortcutBoostSingleUrl),
nullptr},
{"Multiple URLs", kShortcutBoostMultipleUrls,
std::size(kShortcutBoostMultipleUrls), nullptr},
{"Multiple Searches and URLs", kShortcutBoostMultipleSearchesAndUrls,
std::size(kShortcutBoostMultipleSearchesAndUrls), nullptr},
};
// A limited number of combinations of the rich autocompletion params.
const FeatureEntry::FeatureParam
kOmniboxRichAutocompletionConservativeModerate[] = {
{"RichAutocompletionAutocompleteTitles", "true"},
{"RichAutocompletionAutocompleteNonPrefixShortcutProvider", "true"},
{"RichAutocompletionAutocompleteTitlesMinChar", "3"},
{"RichAutocompletionAutocompleteNonPrefixMinChar", "5"}};
const FeatureEntry::FeatureParam
kOmniboxRichAutocompletionConservativeModerate2[] = {
{"RichAutocompletionAutocompleteTitlesShortcutProvider", "true"},
{"RichAutocompletionAutocompleteNonPrefixShortcutProvider", "true"},
{"RichAutocompletionAutocompleteTitlesMinChar", "3"},
{"RichAutocompletionAutocompleteNonPrefixMinChar", "5"}};
const FeatureEntry::FeatureParam kOmniboxRichAutocompletionAggressive2[] = {
{"RichAutocompletionAutocompleteTitlesShortcutProvider", "true"},
{"RichAutocompletionAutocompleteTitlesMinChar", "2"},
{"RichAutocompletionAutocompleteShortcutText", "true"},
{"RichAutocompletionAutocompleteShortcutTextMinChar", "2"}};
const FeatureEntry::FeatureParam kOmniboxRichAutocompletionAggressive3[] = {
{"RichAutocompletionAutocompleteTitlesShortcutProvider", "true"},
{"RichAutocompletionAutocompleteTitlesMinChar", "3"},
{"RichAutocompletionAutocompleteShortcutText", "true"},
{"RichAutocompletionAutocompleteShortcutTextMinChar", "3"}};
const FeatureEntry::FeatureParam kOmniboxRichAutocompletionAggressive4[] = {
{"RichAutocompletionAutocompleteTitlesShortcutProvider", "true"},
{"RichAutocompletionAutocompleteTitlesMinChar", "4"},
{"RichAutocompletionAutocompleteShortcutText", "true"},
{"RichAutocompletionAutocompleteShortcutTextMinChar", "4"}};
const FeatureEntry::FeatureVariation
kOmniboxRichAutocompletionPromisingVariations[] = {
{"Conservative Moderate - Title, Shortcut Non-Prefix, min 3/5",
kOmniboxRichAutocompletionConservativeModerate,
std::size(kOmniboxRichAutocompletionConservativeModerate), nullptr},
{"Conservative Moderate 2 - Shortcut Title, Shortcut Non-Prefix, min "
"3/5",
kOmniboxRichAutocompletionConservativeModerate2,
std::size(kOmniboxRichAutocompletionConservativeModerate2), nullptr},
{"Aggressive 2 - Title Shortcut Title 2, Shortcut Text 2",
kOmniboxRichAutocompletionAggressive2,
std::size(kOmniboxRichAutocompletionAggressive2), nullptr},
{"Aggressive 3 - Title Shortcut Title 3, Shortcut Text 3",
kOmniboxRichAutocompletionAggressive3,
std::size(kOmniboxRichAutocompletionAggressive3), nullptr},
{"Aggressive 4 - Title Shortcut Title 4, Shortcut Text 4",
kOmniboxRichAutocompletionAggressive4,
std::size(kOmniboxRichAutocompletionAggressive4), nullptr},
};
const FeatureEntry::FeatureParam
kOmniboxDriveSuggestionsIgnoreWhenDebouncing[] = {
{"DocumentProviderIgnoreWhenDebouncing", "true"}};
const FeatureEntry::FeatureVariation kOmniboxDriveSuggestionsVariations[] = {
{"ignore when debouncing", kOmniboxDriveSuggestionsIgnoreWhenDebouncing,
std::size(kOmniboxDriveSuggestionsIgnoreWhenDebouncing), 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}};
#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[] = {
{history::kMvtScoringParamRecencyFactor,
history::kMvtScoringParamRecencyFactor_DecayStaircase},
{history::kMvtScoringParamDailyVisitCountCap, "10"},
};
const FeatureEntry::FeatureVariation kMostVisitedTilesNewScoringVariations[] = {
{"Decay Staircase, Cap 10", kMostVitedTilesNewScoring_DecayStaircaseCap10,
std::size(kMostVitedTilesNewScoring_DecayStaircaseCap10), 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 kOmniboxActionsInSuggestTreatment1[] = {
{OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "true"},
{OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "true"},
{OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, ""}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment2[] = {
{OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "false"},
{OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "true"},
{OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, ""}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment3[] = {
{OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "true"},
{OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "false"},
{OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, ""}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment4[] = {
{OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "true"},
{OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "true"},
{OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, "reviews"}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment5[] = {
{OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "true"},
{OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "true"},
{OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, "call"}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment6[] = {
{OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "true"},
{OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "true"},
{OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, "directions"}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment7[] = {
{OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "true"},
{OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "false"},
{OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, "call"}};
constexpr FeatureEntry::FeatureParam kOmniboxActionsInSuggestTreatment8[] = {
{OmniboxFieldTrial::kActionsInSuggestPromoteEntitySuggestion.name, "false"},
{OmniboxFieldTrial::kActionsInSuggestPromoteReviewsAction.name, "false"},
{OmniboxFieldTrial::kActionsInSuggestRemoveActionTypes.name, "call"}};
constexpr FeatureEntry::FeatureVariation kOmniboxActionsInSuggestVariants[] = {
{"T1: Promote, Reviews, Directions, Calls",
kOmniboxActionsInSuggestTreatment1,
std::size(kOmniboxActionsInSuggestTreatment1), "t3366528"},
{"T2: Reviews, Directions, Calls", kOmniboxActionsInSuggestTreatment2,
std::size(kOmniboxActionsInSuggestTreatment2), "t3366528"},
{"T3: Promote, Calls, Directions, Reviews",
kOmniboxActionsInSuggestTreatment3,
std::size(kOmniboxActionsInSuggestTreatment3), "t3366528"},
{"T4: Promote, Directions, Calls", kOmniboxActionsInSuggestTreatment4,
std::size(kOmniboxActionsInSuggestTreatment4), "t3366528"},
{"T5: Promote, Reviews, Directions", kOmniboxActionsInSuggestTreatment5,
std::size(kOmniboxActionsInSuggestTreatment5), "t3366528"},
{"T6: Promote, Reviews, Calls", kOmniboxActionsInSuggestTreatment6,
std::size(kOmniboxActionsInSuggestTreatment6), "t3366528"},
{"T7: Promote, Directions, Reviews", kOmniboxActionsInSuggestTreatment7,
std::size(kOmniboxActionsInSuggestTreatment7), "t3366528"},
{"T8: Directions, Reviews", kOmniboxActionsInSuggestTreatment8,
std::size(kOmniboxActionsInSuggestTreatment8), "t3366528"},
};
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"},
};
#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}};
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},
};
#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_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
BUILDFLAG(IS_CHROMEOS)
const FeatureEntry::FeatureParam kTabstripDeclutterQuickModeParams[] = {
{"stale_threshold_duration", "10s"},
{"declutter_timer_interval", "10s"},
{"nudge_timer_interval", "30s"},
};
const FeatureEntry::FeatureVariation kTabstripDeclutterVariations[] = {
{"Quick Mode", kTabstripDeclutterQuickModeParams,
std::size(kTabstripDeclutterQuickModeParams)},
};
#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
const FeatureEntry::FeatureParam kChromeLabsEnabledInFlags[] = {
{features::kChromeLabsActivationParameterName, "100"}};
const FeatureEntry::FeatureVariation kChromeLabsVariations[] = {
{" use this one!", kChromeLabsEnabledInFlags,
std::size(kChromeLabsEnabledInFlags), nullptr}};
#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 kNtpChromeCartModuleFakeData[] = {
{ntp_features::kNtpChromeCartModuleDataParam, "fake"},
{ntp_features::kNtpChromeCartModuleAbandonedCartDiscountParam, "true"}};
const FeatureEntry::FeatureParam kNtpChromeCartModuleAbandonedCartDiscount[] = {
{ntp_features::kNtpChromeCartModuleAbandonedCartDiscountParam, "true"},
{ntp_features::kNtpChromeCartModuleAbandonedCartDiscountUseUtmParam,
"true"},
{"partner-merchant-pattern",
"(electronicexpress.com|zazzle.com|wish.com|homesquare.com|iherb.com|"
"zappos.com|otterbox.com)"}};
const FeatureEntry::FeatureParam kNtpChromeCartModuleHeuristicsImprovement[] = {
{ntp_features::kNtpChromeCartModuleHeuristicsImprovementParam, "true"}};
const FeatureEntry::FeatureParam kNtpChromeCartModuleRBDAndCouponDiscount[] = {
{ntp_features::kNtpChromeCartModuleHeuristicsImprovementParam, "true"},
{ntp_features::kNtpChromeCartModuleAbandonedCartDiscountParam, "true"},
{ntp_features::kNtpChromeCartModuleAbandonedCartDiscountUseUtmParam,
"true"},
{"partner-merchant-pattern",
"(electronicexpress.com|zazzle.com|wish.com|homesquare.com)"},
{ntp_features::kNtpChromeCartModuleCouponParam, "true"}};
const FeatureEntry::FeatureVariation kNtpChromeCartModuleVariations[] = {
{"- Fake Data And Discount", kNtpChromeCartModuleFakeData,
std::size(kNtpChromeCartModuleFakeData), nullptr},
{"- Abandoned Cart Discount", kNtpChromeCartModuleAbandonedCartDiscount,
std::size(kNtpChromeCartModuleAbandonedCartDiscount), nullptr},
{"- Heuristics Improvement", kNtpChromeCartModuleHeuristicsImprovement,
std::size(kNtpChromeCartModuleHeuristicsImprovement), nullptr},
{"- RBD and Coupons", kNtpChromeCartModuleRBDAndCouponDiscount,
std::size(kNtpChromeCartModuleRBDAndCouponDiscount), nullptr},
};
// The following are consent v2 variations in the Chrome Cart module.
const flags_ui::FeatureEntry::FeatureParam kDiscountConsentNtpDialog[] = {
{commerce::kNtpChromeCartModuleDiscountConsentNtpVariationParam, "3"}};
const flags_ui::FeatureEntry::FeatureParam kDiscountConsentNtpNativeDialog[] = {
{commerce::kNtpChromeCartModuleDiscountConsentNtpVariationParam, "4"}};
const FeatureEntry::FeatureVariation kDiscountConsentV2Variations[] = {
{"WebUi Dialog Consent", kDiscountConsentNtpDialog,
std::size(kDiscountConsentNtpDialog), nullptr},
{"Native Dialog Consent", kDiscountConsentNtpNativeDialog,
std::size(kDiscountConsentNtpNativeDialog), nullptr},
};
// The following is Code-based RBD variation.
const flags_ui::FeatureEntry::FeatureParam kCodeBasedRBDEnabled[] = {
{commerce::kCodeBasedRuleDiscountParam, "true"}};
const FeatureEntry::FeatureVariation kCodeBasedRBDVariations[] = {
{"code-based RBD", kCodeBasedRBDEnabled, std::size(kCodeBasedRBDEnabled),
"t3362898"},
};
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::FeatureVariation kNtpOutlookCalendarModuleVariations[] = {
{"- Fake Data", kNtpOutlookCalendarModuleFakeData,
std::size(kNtpOutlookCalendarModuleFakeData), 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 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
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},
{"- All Visits", kNtpMostRelevantTabResumptionModuleVisitData,
std::size(kNtpMostRelevantTabResumptionModuleVisitData), nullptr},
};
#endif // !BUILDFLAG(IS_ANDROID)
#if !BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kPerformanceInterventionStringVersion1[] = {
{"intervention_dialog_version", "1"}};
const FeatureEntry::FeatureParam kPerformanceInterventionStringVersion2[] = {
{"intervention_dialog_version", "2"}};
const FeatureEntry::FeatureParam kPerformanceInterventionStringVersion3[] = {
{"intervention_dialog_version", "3"}};
const FeatureEntry::FeatureVariation
kPerformanceInterventionStringVariations[] = {
{"String version 1", kPerformanceInterventionStringVersion1,
std::size(kPerformanceInterventionStringVersion1), nullptr},
{"String version 2", kPerformanceInterventionStringVersion2,
std::size(kPerformanceInterventionStringVersion2), nullptr},
{"String version 3", kPerformanceInterventionStringVersion3,
std::size(kPerformanceInterventionStringVersion3), nullptr},
};
#endif // !BUILDFLAG(IS_ANDROID)
#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 kRichAutocompletionFullUrlThreeMinChar[] = {
{"rich_autocomplete_full_url", "true"},
{"rich_autocomplete_minimum_characters", "3"}};
const FeatureEntry::FeatureParam kRichAutocompletionNoFullUrlThreeMinChar[] = {
{"rich_autocomplete_full_url", "false"},
{"rich_autocomplete_minimum_characters", "3"}};
const FeatureEntry::FeatureParam kRichAutocompletionFullUrlFourMinChar[] = {
{"rich_autocomplete_full_url", "true"},
{"rich_autocomplete_minimum_characters", "4"}};
const FeatureEntry::FeatureParam kRichAutocompletionNoFullUrlFourMinChar[] = {
{"rich_autocomplete_full_url", "false"},
{"rich_autocomplete_minimum_characters", "4"}};
const FeatureEntry::FeatureVariation kRichAutocompletionAndroidVariations[] = {
{"(full url, 3 chars at least)", kRichAutocompletionFullUrlThreeMinChar,
std::size(kRichAutocompletionFullUrlThreeMinChar), nullptr},
{"(no full url, 3 chars at least)",
kRichAutocompletionNoFullUrlThreeMinChar,
std::size(kRichAutocompletionNoFullUrlThreeMinChar), nullptr},
{"(full url, 4 chars at least)", kRichAutocompletionFullUrlFourMinChar,
std::size(kRichAutocompletionFullUrlFourMinChar), nullptr},
{"(no full url, 4 chars at least)", kRichAutocompletionNoFullUrlFourMinChar,
std::size(kRichAutocompletionNoFullUrlFourMinChar), nullptr},
};
#endif // BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam
kResamplingScrollEventsPredictionTimeBasedEnabled[] = {
{"mode", features::kPredictionTypeTimeBased},
{"latency", features::kPredictionTypeDefaultTime}};
const FeatureEntry::FeatureParam
kResamplingScrollEventsPredictionFramesBasedEnabled[] = {
{"mode", features::kPredictionTypeFramesBased},
{"latency", features::kPredictionTypeDefaultFramesRatio}};
const FeatureEntry::FeatureVariation
kResamplingScrollEventsExperimentalPredictionVariations[] = {
{features::kPredictionTypeTimeBased,
kResamplingScrollEventsPredictionTimeBasedEnabled,
std::size(kResamplingScrollEventsPredictionTimeBasedEnabled), nullptr},
{features::kPredictionTypeFramesBased,
kResamplingScrollEventsPredictionFramesBasedEnabled,
std::size(kResamplingScrollEventsPredictionFramesBasedEnabled),
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 kEducationalTipModule_force_default_browser[] =
{{"force_default_browser", "true"}};
const FeatureEntry::FeatureParam kEducationalTipModule_force_tab_group[] = {
{"force_tab_group", "true"}};
const FeatureEntry::FeatureParam kEducationalTipModule_force_tab_group_sync[] =
{{"force_tab_group_sync", "true"}};
const FeatureEntry::FeatureParam kEducationalTipModule_force_quick_delete[] = {
{"force_quick_delete", "true"}};
const FeatureEntry::FeatureVariation kEducationalTipModuleVariations[] = {
{"Show default browser promo", kEducationalTipModule_force_default_browser,
std::size(kEducationalTipModule_force_default_browser), nullptr},
{"Show tab group promo", kEducationalTipModule_force_tab_group,
std::size(kEducationalTipModule_force_tab_group), nullptr},
{"Show tab group sync promo", kEducationalTipModule_force_tab_group_sync,
std::size(kEducationalTipModule_force_tab_group_sync), nullptr},
{"Show quick delete promo", kEducationalTipModule_force_quick_delete,
std::size(kEducationalTipModule_force_quick_delete), nullptr},
};
const FeatureEntry::FeatureParam
kAccountReauthenticationRecentTimeWindow_0Minutes[] = {
{"account_reauthentication_recent_time_window_minutes", "0"},
};
const FeatureEntry::FeatureParam
kAccountReauthenticationRecentTimeWindow_1Minutes[] = {
{"account_reauthentication_recent_time_window_minutes", "1"},
};
const FeatureEntry::FeatureParam
kAccountReauthenticationRecentTimeWindow_5Minutes[] = {
{"account_reauthentication_recent_time_window_minutes", "5"},
};
const FeatureEntry::FeatureParam
kAccountReauthenticationRecentTimeWindow_10Minutes[] = {
{"account_reauthentication_recent_time_window_minutes", "10"},
};
const FeatureEntry::FeatureVariation
kAccountReauthenticationRecentTimeWindowVariations[] = {
{"0 minutes", kAccountReauthenticationRecentTimeWindow_0Minutes,
std::size(kAccountReauthenticationRecentTimeWindow_0Minutes), nullptr},
{"1 minutes", kAccountReauthenticationRecentTimeWindow_1Minutes,
std::size(kAccountReauthenticationRecentTimeWindow_1Minutes), nullptr},
{"5 minutes", kAccountReauthenticationRecentTimeWindow_5Minutes,
std::size(kAccountReauthenticationRecentTimeWindow_5Minutes), nullptr},
{"10 minutes", kAccountReauthenticationRecentTimeWindow_10Minutes,
std::size(kAccountReauthenticationRecentTimeWindow_10Minutes),
nullptr},
};
#endif // BUILDFLAG(IS_ANDROID)
#if BUILDFLAG(IS_ANDROID)
const FeatureEntry::FeatureParam kLogoPolish_large[] = {
{"polish_logo_size_large", "true"},
{"polish_logo_size_medium", "false"}};
const FeatureEntry::FeatureParam kLogoPolish_medium[] = {
{"polish_logo_size_large", "false"},
{"polish_logo_size_medium", "true"}};
const FeatureEntry::FeatureParam kLogoPolish_small[] = {
{"polish_logo_size_large", "false"},
{"polish_logo_size_medium", "false"}};
const FeatureEntry::FeatureVariation kLogoPolishVariations[] = {
{"Logo height is large", kLogoPolish_large, std::size(kLogoPolish_large),
nullptr},
{"Logo height is medium", kLogoPolish_medium, std::size(kLogoPolish_medium),
nullptr},
{"Logo height is small", kLogoPolish_small, std::size(kLogoPolish_small),
nullptr},
};
const FeatureEntry::FeatureParam kFeedPositionAndroid_pull_up_feed[] = {
{"pull_up_feed", "true"}};
const FeatureEntry::FeatureParam
kFeedPositionAndroid_push_down_feed_target_feed_active[] = {
{"feed_active_targeting", "active"}};
const FeatureEntry::FeatureParam
kFeedPositionAndroid_push_down_feed_target_non_feed_active[] = {
{"feed_active_targeting", "non-active"}};
const FeatureEntry::FeatureParam
kFeedPositionAndroid_pull_up_feed_target_feed_active[] = {
{"pull_up_feed", "true"},
{"feed_active_targeting", "active"}};
const FeatureEntry::FeatureParam
kFeedPositionAndroid_pull_up_feed_target_non_feed_active[] = {
{"pull_up_feed", "true"},
{"feed_active_targeting", "non-active"}};
const FeatureEntry::FeatureVariation kFeedPositionAndroidVariations[] = {
{"Pull up Feed", kFeedPositionAndroid_pull_up_feed,
std::size(kFeedPositionAndroid_pull_up_feed), nullptr},
{"Push down Feed with targeting Feed active users",
kFeedPositionAndroid_push_down_feed_target_feed_active,
std::size(kFeedPositionAndroid_push_down_feed_target_feed_active),
nullptr},
{"Push down Feed with targeting non-Feed active users",
kFeedPositionAndroid_push_down_feed_target_non_feed_active,
std::size(kFeedPositionAndroid_push_down_feed_target_non_feed_active),
nullptr},
{"Pull up Feed with targeting Feed active users",
kFeedPositionAndroid_pull_up_feed_target_feed_active,
std::size(kFeedPositionAndroid_pull_up_feed_target_feed_active), nullptr},
{"Pull up Feed with targeting non-Feed active users",
kFeedPositionAndroid_pull_up_feed_target_non_feed_active,
std::size(kFeedPositionAndroid_pull_up_feed_target_non_feed_active),
nullptr},
};
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 kTabResumptionModule_defaul_app_filter[] = {
{"show_see_more", "true"},
{"use_default_app_filter", "true"},
};
const FeatureEntry::FeatureParam kTabResumptionModule_salient_image[] = {
{"show_see_more", "true"},
{"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
kTabResumptionModule_single_tile_with_salient_image[] = {
{"max_tiles_number", "1"},
{"show_see_more", "true"},
{"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
kTabResumptionModule_single_tile_with_salient_image_show_default_reason[] =
{
{"max_tiles_number", "1"}, {"show_default_reason", "true"},
{"show_see_more", "true"}, {"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
kTabResumptionModule_combine_tabs_with_salient_image[] = {
{"show_see_more", "true"},
{"show_tabs_in_one_module", "true"},
{"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
kTabResumptionModule_combine_tabs_with_salient_image_single_tab_show_default_reason
[] = {
{"max_tiles_number", "1"},
{"show_default_reason", "true"},
{"show_see_more", "true"},
{"show_tabs_in_one_module", "true"},
{"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam kTabResumptionModule_enable_v2_arm1[] = {
{"disable_blend", "true"}, {"enable_v2", "true"},
{"show_see_more", "true"}, {"show_tabs_in_one_module", "true"},
{"use_default_app_filter", "true"},
};
const FeatureEntry::FeatureParam kTabResumptionModule_enable_v2_arm2[] = {
{"enable_v2", "true"},
{"show_see_more", "true"},
{"show_tabs_in_one_module", "true"},
{"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam kTabResumptionModule_enable_v2_arm3[] = {
{"disable_blend", "true"}, {"enable_v2", "true"},
{"max_tiles_number", "1"}, {"show_see_more", "true"},
{"show_tabs_in_one_module", "true"}, {"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
kTabResumptionModule_enable_v2_arm3_show_default_reason[] = {
{"disable_blend", "true"}, {"enable_v2", "true"},
{"max_tiles_number", "1"}, {"show_default_reason", "true"},
{"show_see_more", "true"}, {"show_tabs_in_one_module", "true"},
{"use_default_app_filter", "true"}, {"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam kTabResumptionModule_enable_v2_arm4[] = {
{"disable_blend", "true"}, {"enable_v2", "true"},
{"show_see_more", "true"}, {"show_tabs_in_one_module", "true"},
{"use_default_app_filter", "true"}, {"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam kTabResumptionModule_enable_v2_ml[] = {
{"enable_v2", "true"},
{"fetch_history_backend", "true"},
{"fetch_local_tabs_backend", "true"},
{"show_see_more", "true"},
{"show_tabs_in_one_module", "true"},
{"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
kTabResumptionModule_enable_v2_ml_show_decorator_default_reason[] = {
{"enable_v2", "true"},
{"fetch_history_backend", "true"},
{"fetch_local_tabs_backend", "true"},
{"max_tiles_number", "1"},
{"show_default_reason", "true"},
{"show_see_more", "true"},
{"show_tabs_in_one_module", "true"},
{"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
kTabResumptionModule_enable_v2_ml_show_decorator_visited_x_ago[] = {
{"enable_v2", "true"},
{"fetch_history_backend", "true"},
{"fetch_local_tabs_backend", "true"},
{"override_decoration", "1"}, // kVisitedXAgo
{"max_tiles_number", "1"},
{"show_default_reason", "true"},
{"show_see_more", "true"},
{"show_tabs_in_one_module", "true"},
{"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
kTabResumptionModule_enable_v2_ml_show_decorator_most_visited[] = {
{"enable_v2", "true"},
{"fetch_history_backend", "true"},
{"fetch_local_tabs_backend", "true"},
{"override_decoration", "2"}, // kMostRecent
{"max_tiles_number", "1"},
{"show_default_reason", "true"},
{"show_see_more", "true"},
{"show_tabs_in_one_module", "true"},
{"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
kTabResumptionModule_enable_v2_ml_show_decorator_frequently_visited[] = {
{"enable_v2", "true"},
{"fetch_history_backend", "true"},
{"fetch_local_tabs_backend", "true"},
{"override_decoration", "3"}, // kFrequentlyVisited
{"max_tiles_number", "1"},
{"show_default_reason", "true"},
{"show_see_more", "true"},
{"show_tabs_in_one_module", "true"},
{"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureParam
kTabResumptionModule_enable_v2_ml_show_decorator_frequently_visited_at_time
[] = {
{"enable_v2", "true"},
{"fetch_history_backend", "true"},
{"fetch_local_tabs_backend", "true"},
{"override_decoration", "4"}, // kFrequentlyVisitedAtTime
{"max_tiles_number", "1"},
{"show_default_reason", "true"},
{"show_see_more", "true"},
{"show_tabs_in_one_module", "true"},
{"use_default_app_filter", "true"},
{"use_salient_image", "true"},
};
const FeatureEntry::FeatureVariation kTabResumptionModuleAndroidVariations[] = {
{"Default app filter", kTabResumptionModule_defaul_app_filter,
std::size(kTabResumptionModule_defaul_app_filter), nullptr},
{"Default app filter + Salient image", kTabResumptionModule_salient_image,
std::size(kTabResumptionModule_salient_image), nullptr},
{"Default app filter + Salient image + single tile",
kTabResumptionModule_single_tile_with_salient_image,
std::size(kTabResumptionModule_single_tile_with_salient_image), nullptr},
{"Default app filter + Salient image + one Tab module",
kTabResumptionModule_combine_tabs_with_salient_image,
std::size(kTabResumptionModule_combine_tabs_with_salient_image), nullptr},
{"V2 Arm1", kTabResumptionModule_enable_v2_arm1,
std::size(kTabResumptionModule_enable_v2_arm1), nullptr},
{"V2 Arm2", kTabResumptionModule_enable_v2_arm2,
std::size(kTabResumptionModule_enable_v2_arm2), nullptr},
{"V2 Arm3", kTabResumptionModule_enable_v2_arm3,
std::size(kTabResumptionModule_enable_v2_arm3), nullptr},
{"V2 Arm4", kTabResumptionModule_enable_v2_arm4,
std::size(kTabResumptionModule_enable_v2_arm4), nullptr},
{"V2 ML (collect data)", kTabResumptionModule_enable_v2_ml,
std::size(kTabResumptionModule_enable_v2_ml), nullptr},
{"Default app filter + Salient image + single tile + default reason",
kTabResumptionModule_single_tile_with_salient_image_show_default_reason,
std::size(
kTabResumptionModule_single_tile_with_salient_image_show_default_reason),
nullptr},
{"Default app filter + one Tab module + single tab + default reason",
kTabResumptionModule_combine_tabs_with_salient_image_single_tab_show_default_reason,
std::size(
kTabResumptionModule_combine_tabs_with_salient_image_single_tab_show_default_reason),
nullptr},
{"V2 Arm3 with default reason",
kTabResumptionModule_enable_v2_arm3_show_default_reason,
std::size(kTabResumptionModule_enable_v2_arm3_show_default_reason),
nullptr},
{"V2 ML: with default reason",
kTabResumptionModule_enable_v2_ml_show_decorator_default_reason,
std::size(kTabResumptionModule_enable_v2_ml_show_decorator_default_reason),
nullptr},
{"V2 ML: visited x ago decorator",
kTabResumptionModule_enable_v2_ml_show_decorator_visited_x_ago,
std::size(kTabResumptionModule_enable_v2_ml_show_decorator_visited_x_ago),
nullptr},
{"V2 ML: most visited decorator",
kTabResumptionModule_enable_v2_ml_show_decorator_most_visited,
std::size(kTabResumptionModule_enable_v2_ml_show_decorator_most_visited),
nullptr},
{"V2 ML: frequently visited decorator",
kTabResumptionModule_enable_v2_ml_show_decorator_frequently_visited,
std::size(
kTabResumptionModule_enable_v2_ml_show_decorator_frequently_visited),
nullptr},
{"V2 ML: frequently visited at time decorator",
kTabResumptionModule_enable_v2_ml_show_decorator_frequently_visited_at_time,
std::size(
kTabResumptionModule_enable_v2_ml_show_decorator_frequently_visited_at_time),
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 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)
// 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},