blob: 91659c53208d0c3324ae7780ca1cb791e0e8a705 [file]
// 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.
// Implementation of about_flags for iOS that sets flags based on experimental
// settings.
#import "ios/chrome/browser/flags/about_flags.h"
#import <UIKit/UIKit.h>
#import <stddef.h>
#import <stdint.h>
#import "base/apple/foundation_util.h"
#import "base/base_switches.h"
#import "base/check_op.h"
#import "base/debug/debugging_buildflags.h"
#import "base/functional/bind.h"
#import "base/functional/callback_helpers.h"
#import "base/no_destructor.h"
#import "base/strings/stringprintf.h"
#import "base/strings/sys_string_conversions.h"
#import "base/system/sys_info.h"
#import "components/autofill/core/browser/manual_testing_import.h"
#import "components/autofill/core/common/autofill_debug_features.h"
#import "components/autofill/core/common/autofill_features.h"
#import "components/autofill/core/common/autofill_payments_features.h"
#import "components/autofill/core/common/autofill_switches.h"
#import "components/autofill/ios/common/features.h"
#import "components/bookmarks/common/bookmark_features.h"
#import "components/browser_sync/browser_sync_switches.h"
#import "components/collaboration/public/features.h"
#import "components/commerce/core/commerce_feature_list.h"
#import "components/commerce/core/flag_descriptions.h"
#import "components/content_settings/core/common/features.h"
#import "components/data_sharing/public/features.h"
#import "components/data_sharing/public/switches.h"
#import "components/desktop_to_mobile_promos/features.h"
#import "components/dom_distiller/core/dom_distiller_features.h"
#import "components/dom_distiller/core/dom_distiller_switches.h"
#import "components/download/public/background_service/features.h"
#import "components/enterprise/browser/enterprise_switches.h"
#import "components/enterprise/buildflags/buildflags.h"
#import "components/enterprise/client_certificates/core/features.h"
#import "components/enterprise/connectors/core/features.h"
#import "components/feature_engagement/public/feature_constants.h"
#import "components/feature_engagement/public/feature_list.h"
#import "components/feed/feed_feature_list.h"
#import "components/history/core/browser/features.h"
#import "components/ntp_tiles/features.h"
#import "components/ntp_tiles/switches.h"
#import "components/omnibox/browser/aim_eligibility_service_features.h"
#import "components/omnibox/browser/omnibox_field_trial.h"
#import "components/omnibox/common/omnibox_feature_configs.h"
#import "components/omnibox/common/omnibox_features.h"
#import "components/optimization_guide/core/optimization_guide_features.h"
#import "components/optimization_guide/core/optimization_guide_switches.h"
#import "components/page_content_annotations/core/page_content_annotations_features.h"
#import "components/password_manager/core/browser/features/password_features.h"
#import "components/password_manager/core/common/password_manager_features.h"
#import "components/payments/core/features.h"
#import "components/policy/core/common/policy_loader_ios_constants.h"
#import "components/policy/policy_constants.h"
#import "components/regional_capabilities/regional_capabilities_switches.h"
#import "components/safe_browsing/core/common/features.h"
#import "components/safe_browsing/ios/browser/web_ui/features.h"
#import "components/search/ntp_features.cc"
#import "components/search_engines/search_engines_switches.h"
#import "components/segmentation_platform/embedder/home_modules/constants.h"
#import "components/segmentation_platform/public/constants.h"
#import "components/segmentation_platform/public/features.h"
#import "components/send_tab_to_self/features.h"
#import "components/shared_highlighting/core/common/shared_highlighting_features.h"
#import "components/sharing_message/features.h"
#import "components/signin/core/browser/account_reconcilor.h"
#import "components/signin/ios/browser/features.h"
#import "components/signin/public/base/signin_switches.h"
#import "components/strike_database/strike_database_features.h"
#import "components/strings/grit/components_strings.h"
#import "components/supervised_user/core/common/features.h"
#import "components/sync/base/command_line_switches.h"
#import "components/sync/base/features.h"
#import "components/sync/base/pref_names.h"
#import "components/sync_preferences/features.h"
#import "components/translate/core/browser/translate_prefs.h"
#import "components/translate/core/common/translate_util.h"
#import "components/variations/net/variations_command_line.h"
#import "components/variations/variations_switches.h"
#import "components/webui/flags/feature_entry.h"
#import "components/webui/flags/feature_entry_macros.h"
#import "components/webui/flags/flags_storage.h"
#import "components/webui/flags/flags_ui_switches.h"
#import "crypto/features.h"
#import "ios/chrome/app/background_mode_buildflags.h"
#import "ios/chrome/browser/autofill/model/features.h"
#import "ios/chrome/browser/badges/model/features.h"
#import "ios/chrome/browser/composebox/public/features.h"
#import "ios/chrome/browser/crash_report/model/features.h"
#import "ios/chrome/browser/credential_provider/model/features.h"
#import "ios/chrome/browser/default_browser/model/features.h"
#import "ios/chrome/browser/default_browser/model/utils.h"
#import "ios/chrome/browser/default_browser/promo/public/features.h"
#import "ios/chrome/browser/download/ui/features.h"
#import "ios/chrome/browser/enterprise/data_protection/features.h"
#import "ios/chrome/browser/first_run/public/features.h"
#import "ios/chrome/browser/flags/chrome_switches.h"
#import "ios/chrome/browser/flags/ios_chrome_flag_descriptions.h"
#import "ios/chrome/browser/intelligence/features/features.h"
#import "ios/chrome/browser/lens/ui_bundled/features.h"
#import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_feature.h"
#import "ios/chrome/browser/omnibox/public/omnibox_ui_features.h"
#import "ios/chrome/browser/page_info/certificate/features/features.h"
#import "ios/chrome/browser/policy/model/policy_util.h"
#import "ios/chrome/browser/policy/model/reporting/features.h"
#import "ios/chrome/browser/reader_mode/model/features.h"
#import "ios/chrome/browser/settings/ui_bundled/clear_browsing_data/public/features.h"
#import "ios/chrome/browser/settings/ui_bundled/password/password_manager_ui_features.h"
#import "ios/chrome/browser/shared/public/features/features.h"
#import "ios/chrome/browser/shared/public/features/system_flags.h"
#import "ios/chrome/browser/start_surface/ui_bundled/start_surface_features.h"
#import "ios/chrome/browser/text_selection/model/text_selection_util.h"
#import "ios/chrome/browser/variations/model/ios_chrome_variations_seed_fetcher.h"
#import "ios/chrome/browser/welcome_back/model/features.h"
#import "ios/chrome/browser/whats_new/coordinator/whats_new_util.h"
#import "ios/chrome/grit/ios_strings.h"
#import "ios/components/enterprise/analysis/features.h"
#import "ios/components/security_interstitials/https_only_mode/feature.h"
#import "ios/public/provider/chrome/browser/app_utils/app_utils_api.h"
#import "ios/web/common/features.h"
#import "ios/web/common/user_agent.h"
#import "ios/web/common/web_view_creation_util.h"
using flags_ui::FeatureEntry;
namespace {
const FeatureEntry::Choice kSendTabToSelfEnhancedHandoffChoices[] = {
{flags_ui::kGenericExperimentChoiceDefault, "", ""},
{flags_ui::kGenericExperimentChoiceEnabled, switches::kEnableFeatures,
"SendTabToSelfPropagateFormFields,"
"SendTabToSelfPropagateScrollPosition"},
{flags_ui::kGenericExperimentChoiceDisabled, switches::kDisableFeatures,
"SendTabToSelfPropagateFormFields,"
"SendTabToSelfPropagateScrollPosition"},
};
const FeatureEntry::Choice
kWaitThresholdMillisecondsForCapabilitiesApiChoices[] = {
{flags_ui::kGenericExperimentChoiceDefault, "", ""},
{"200", signin::kWaitThresholdMillisecondsForCapabilitiesApi, "200"},
{"500", signin::kWaitThresholdMillisecondsForCapabilitiesApi, "500"},
{"5000", signin::kWaitThresholdMillisecondsForCapabilitiesApi, "5000"},
};
const FeatureEntry::FeatureParam
kNTPMIAEntrypointOmniboxContainedSingleButton[] = {
{kNTPMIAEntrypointParam,
kNTPMIAEntrypointParamOmniboxContainedSingleButton}};
const FeatureEntry::FeatureParam kNTPMIAEntrypointOmniboxContainedInline[] = {
{kNTPMIAEntrypointParam, kNTPMIAEntrypointParamOmniboxContainedInline}};
const FeatureEntry::FeatureParam
kNTPMIAEntrypointOmniboxContainedEnlargedFakebox[] = {
{kNTPMIAEntrypointParam,
kNTPMIAEntrypointParamOmniboxContainedEnlargedFakebox}};
const FeatureEntry::FeatureParam kNTPMIAEntrypointEnlargedFakeboxNoIncognito[] =
{{kNTPMIAEntrypointParam,
kNTPMIAEntrypointParamEnlargedFakeboxNoIncognito}};
const FeatureEntry::FeatureParam kNTPMIAEntrypointAIMInQuickActions[] = {
{kNTPMIAEntrypointParam, kNTPMIAEntrypointParamAIMInQuickActions}};
const FeatureEntry::FeatureVariation kNTPMIAEntrypointVariations[] = {
{"A: Contained in Omnibox, single button",
kNTPMIAEntrypointOmniboxContainedSingleButton, nullptr},
{"B: Contained in Omnibox, inline with Voice and Lens",
kNTPMIAEntrypointOmniboxContainedInline, nullptr},
{"C: Contained in Omnibox, enlarged fakebox",
kNTPMIAEntrypointOmniboxContainedEnlargedFakebox, nullptr},
{"D: Contained in enlarged fakebox, without incognito shortcut",
kNTPMIAEntrypointEnlargedFakeboxNoIncognito, nullptr},
{"E: AIM entry point in quick actions, enlarged fakebox",
kNTPMIAEntrypointAIMInQuickActions, nullptr},
};
const FeatureEntry::FeatureParam kDisableKeyboardAccessoryOnlySymbolsParam[] = {
{kDisableKeyboardAccessoryParam, kDisableKeyboardAccessoryOnlySymbols}};
const FeatureEntry::FeatureParam kDisableKeyboardAccessoryOnlyFeaturesParam[] =
{{kDisableKeyboardAccessoryParam, kDisableKeyboardAccessoryOnlyFeatures}};
const FeatureEntry::FeatureParam kDisableKeyboardAccessoryCompletelyParam[] = {
{kDisableKeyboardAccessoryParam, kDisableKeyboardAccessoryCompletely}};
const FeatureEntry::FeatureVariation kDisableKeyboardAccessoryVariations[] = {
{"A) only show symbols", kDisableKeyboardAccessoryOnlySymbolsParam,
nullptr},
{"B) only show lens and voice search",
kDisableKeyboardAccessoryOnlyFeaturesParam, nullptr},
{"C) disable completely", kDisableKeyboardAccessoryCompletelyParam,
nullptr}};
const FeatureEntry::FeatureParam
kEnableFuseboxKeyboardAccessoryOnlySymbolsParam[] = {
{kEnableFuseboxKeyboardAccessoryParam,
kEnableFuseboxKeyboardAccessoryOnlySymbols}};
const FeatureEntry::FeatureParam
kEnableFuseboxKeyboardAccessoryOnlyFeaturesParam[] = {
{kEnableFuseboxKeyboardAccessoryParam,
kEnableFuseboxKeyboardAccessoryOnlyFeatures}};
const FeatureEntry::FeatureParam kEnableFuseboxKeyboardAccessoryBothParam[] = {
{kEnableFuseboxKeyboardAccessoryParam,
kEnableFuseboxKeyboardAccessoryBoth}};
const FeatureEntry::FeatureVariation
kEnableFuseboxKeyboardAccessoryVariations[] = {
{"A) only show symbols",
kEnableFuseboxKeyboardAccessoryOnlySymbolsParam, nullptr},
{"B) only show lens and voice search",
kEnableFuseboxKeyboardAccessoryOnlyFeaturesParam, nullptr},
{"C) enable both", kEnableFuseboxKeyboardAccessoryBothParam, nullptr}};
const FeatureEntry::FeatureParam
kIOSKeyboardAccessoryTwoBubbleWithKeyboardIcon[] = {
{kIOSKeyboardAccessoryTwoBubbleKeyboardIconParamName, "true"}};
const FeatureEntry::FeatureParam
kIOSKeyboardAccessoryTwoBubbleWithCheckmarkIcon[] = {
{kIOSKeyboardAccessoryTwoBubbleKeyboardIconParamName, "false"}};
const FeatureEntry::FeatureVariation
kIOSKeyboardAccessoryTwoBubbleVariations[] = {
{"With Keyboard Icon", kIOSKeyboardAccessoryTwoBubbleWithKeyboardIcon,
nullptr},
{"With Checkmark Icon", kIOSKeyboardAccessoryTwoBubbleWithCheckmarkIcon,
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 kOmniboxUIMaxAutocompleteMatches8[] = {
{OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "8"}};
const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches10[] = {
{OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "10"}};
const FeatureEntry::FeatureParam kOmniboxUIMaxAutocompleteMatches12[] = {
{OmniboxFieldTrial::kUIMaxAutocompleteMatchesParam, "12"}};
const FeatureEntry::FeatureVariation
kOmniboxUIMaxAutocompleteMatchesVariations[] = {
{"3 matches", kOmniboxUIMaxAutocompleteMatches3, nullptr},
{"4 matches", kOmniboxUIMaxAutocompleteMatches4, nullptr},
{"5 matches", kOmniboxUIMaxAutocompleteMatches5, nullptr},
{"6 matches", kOmniboxUIMaxAutocompleteMatches6, nullptr},
{"8 matches", kOmniboxUIMaxAutocompleteMatches8, nullptr},
{"10 matches", kOmniboxUIMaxAutocompleteMatches10, nullptr},
{"12 matches", kOmniboxUIMaxAutocompleteMatches12, nullptr}};
const FeatureEntry::FeatureParam kContentPushNotificationsEnabledPromo[] = {
{kContentPushNotificationsExperimentType, "1"}};
const FeatureEntry::FeatureParam kContentPushNotificationsEnabledSetupLists[] =
{{kContentPushNotificationsExperimentType, "2"}};
const FeatureEntry::FeatureParam kContentPushNotificationsEnabledProvisional[] =
{{kContentPushNotificationsExperimentType, "3"}};
const FeatureEntry::FeatureParam
kContentPushNotificationsPromoRegistrationOnly[] = {
{kContentPushNotificationsExperimentType, "5"}};
const FeatureEntry::FeatureParam
kContentPushNotificationsProvisionalRegistrationOnly[] = {
{kContentPushNotificationsExperimentType, "6"}};
const FeatureEntry::FeatureParam
kContentPushNotificationsSetUpListRegistrationOnly[] = {
{kContentPushNotificationsExperimentType, "7"}};
const FeatureEntry::FeatureVariation kContentPushNotificationsVariations[] = {
{"Promo", kContentPushNotificationsEnabledPromo, nullptr},
{"Set up list", kContentPushNotificationsEnabledSetupLists, nullptr},
{"Provisional Notification", kContentPushNotificationsEnabledProvisional,
nullptr},
{"Promo Registeration Only", kContentPushNotificationsPromoRegistrationOnly,
nullptr},
{"Provisional Notification Registeration Only",
kContentPushNotificationsProvisionalRegistrationOnly, nullptr},
{"Set up list Registeration Only",
kContentPushNotificationsSetUpListRegistrationOnly, nullptr}};
const FeatureEntry::FeatureParam kEnableDefaultModel[] = {
{segmentation_platform::kDefaultModelEnabledParam, "true"}};
const FeatureEntry::FeatureVariation
kSegmentationPlatformIosModuleRankerVariations[]{
{"Enabled With Default Model Parameter (Must Set this!)",
kEnableDefaultModel, nullptr},
};
const FeatureEntry::FeatureParam
kIOSReactivationNotifications10SecondTrigger[] = {
{kIOSReactivationNotificationsTriggerTimeParam, "10s"},
};
const FeatureEntry::FeatureParam
kIOSReactivationNotifications30SecondTrigger[] = {
{kIOSReactivationNotificationsTriggerTimeParam, "30s"},
};
const FeatureEntry::FeatureVariation kIOSReactivationNotificationsVariations[] =
{
{"(10s trigger)", kIOSReactivationNotifications10SecondTrigger,
nullptr},
{"(30s trigger)", kIOSReactivationNotifications30SecondTrigger,
nullptr},
};
#if BUILDFLAG(IOS_BACKGROUND_MODE_ENABLED)
// Feed Background Refresh Feature Params.
const FeatureEntry::FeatureParam kOneHourIntervalOneHourMaxAgeOnce[] = {
{kEnableServerDrivenBackgroundRefreshSchedule, "false"},
{kEnableRecurringBackgroundRefreshSchedule, "false"},
{kMaxCacheAgeInSeconds, /*60*60*/ "3600"},
{kBackgroundRefreshIntervalInSeconds, /* 60*60= */ "3600"}};
const FeatureEntry::FeatureParam kFourHourIntervalSixHourMaxAgeOnce[] = {
{kEnableServerDrivenBackgroundRefreshSchedule, "false"},
{kEnableRecurringBackgroundRefreshSchedule, "false"},
{kMaxCacheAgeInSeconds, /*6*60*60*/ "21600"},
{kBackgroundRefreshIntervalInSeconds, /* 4*60*60= */ "14400"}};
const FeatureEntry::FeatureParam kOneHourIntervalOneHourMaxAgeRecurring[] = {
{kEnableServerDrivenBackgroundRefreshSchedule, "false"},
{kEnableRecurringBackgroundRefreshSchedule, "true"},
{kMaxCacheAgeInSeconds, /*60*60*/ "3600"},
{kBackgroundRefreshIntervalInSeconds, /* 60*60= */ "3600"}};
const FeatureEntry::FeatureParam kFourHourIntervalSixHourMaxAgeRecurring[] = {
{kEnableServerDrivenBackgroundRefreshSchedule, "false"},
{kEnableRecurringBackgroundRefreshSchedule, "true"},
{kMaxCacheAgeInSeconds, /*6*60*60*/ "21600"},
{kBackgroundRefreshIntervalInSeconds, /* 4*60*60= */ "14400"}};
const FeatureEntry::FeatureParam kServerDrivenOneHourMaxAgeOnce[] = {
{kEnableServerDrivenBackgroundRefreshSchedule, "true"},
{kEnableRecurringBackgroundRefreshSchedule, "false"},
{kMaxCacheAgeInSeconds, /*60*60*/ "3600"},
{kBackgroundRefreshIntervalInSeconds, "0"}};
const FeatureEntry::FeatureParam kServerDrivenOneHourMaxAgeRecurring[] = {
{kEnableServerDrivenBackgroundRefreshSchedule, "true"},
{kEnableRecurringBackgroundRefreshSchedule, "true"},
{kMaxCacheAgeInSeconds, /*60*60*/ "3600"},
{kBackgroundRefreshIntervalInSeconds, "0"}};
const FeatureEntry::FeatureParam kServerDrivenSixHourMaxAgeOnce[] = {
{kEnableServerDrivenBackgroundRefreshSchedule, "true"},
{kEnableRecurringBackgroundRefreshSchedule, "false"},
{kMaxCacheAgeInSeconds, /*6*60*60*/ "21600"},
{kBackgroundRefreshIntervalInSeconds, "0"}};
const FeatureEntry::FeatureParam kServerDrivenSixHourMaxAgeRecurring[] = {
{kEnableServerDrivenBackgroundRefreshSchedule, "true"},
{kEnableRecurringBackgroundRefreshSchedule, "true"},
{kMaxCacheAgeInSeconds, /*6*60*60*/ "21600"},
{kBackgroundRefreshIntervalInSeconds, "0"}};
// Feed Background Refresh Feature Variations.
const FeatureEntry::FeatureVariation kFeedBackgroundRefreshVariations[] = {
{"1hr Interval 1hr Max Age Once", kOneHourIntervalOneHourMaxAgeOnce,
nullptr},
{"4hr Interval 6hr Max Age Once", kFourHourIntervalSixHourMaxAgeOnce,
nullptr},
{"1hr Interval 1hr Max Age Recurring",
kOneHourIntervalOneHourMaxAgeRecurring, nullptr},
{"4hr Interval 6hr Max Age Recurring",
kFourHourIntervalSixHourMaxAgeRecurring, nullptr},
{"Server Driven 1hr Max Age Once", kServerDrivenOneHourMaxAgeOnce, nullptr},
{"Server Driven 1hr Max Age Recurring", kServerDrivenOneHourMaxAgeRecurring,
nullptr},
{"Server Driven 6hr Max Age Once", kServerDrivenSixHourMaxAgeOnce, nullptr},
{"Server Driven 6hr Max Age Recurring", kServerDrivenSixHourMaxAgeRecurring,
nullptr},
};
#endif // BUILDFLAG(IOS_BACKGROUND_MODE_ENABLED)
// Download List UI feature flag parameters.
// IMPORTANT: These values must match DownloadListUIType enum in features.h
const FeatureEntry::FeatureParam kDownloadListDefaultUIParam[] = {
{kDownloadListUITypeParam, "0"}};
const FeatureEntry::FeatureParam kDownloadListCustomUIParam[] = {
{kDownloadListUITypeParam, "1"}};
const FeatureEntry::FeatureVariation kDownloadListVariations[] = {
{"Default UI", kDownloadListDefaultUIParam, nullptr},
{"Custom UI", kDownloadListCustomUIParam, nullptr},
};
// Default browser promo refresh feature flag parameters.
const FeatureEntry::FeatureParam kDefaultBrowserPictureInPictureArm1[] = {
{kDefaultBrowserPictureInPictureParam,
kDefaultBrowserPictureInPictureParamEnabled}};
const FeatureEntry::FeatureParam kDefaultBrowserPictureInPictureArm2[] = {
{kDefaultBrowserPictureInPictureParam,
kDefaultBrowserPictureInPictureParamDisabledDefaultApps}};
const FeatureEntry::FeatureParam kDefaultBrowserPictureInPictureArm3[] = {
{kDefaultBrowserPictureInPictureParam,
kDefaultBrowserPictureInPictureParamEnabledDefaultApps}};
const FeatureEntry::FeatureVariation
kDefaultBrowserPictureInPictureVariations[] = {
{"Picture-in-picture instructions.",
kDefaultBrowserPictureInPictureArm1, nullptr},
{"No picture in picture, default apps destination.",
kDefaultBrowserPictureInPictureArm2, nullptr},
{"Picture-in-picture instructions, default apps destination.",
kDefaultBrowserPictureInPictureArm3, nullptr},
};
const FeatureEntry::FeatureParam kIOSDockingPromoV2Header1[] = {
{kIOSDockingPromoV2VariationParam, kIOSDockingPromoV2VariationHeader1}};
const FeatureEntry::FeatureParam kIOSDockingPromoV2Header2[] = {
{kIOSDockingPromoV2VariationParam, kIOSDockingPromoV2VariationHeader2}};
const FeatureEntry::FeatureParam kIOSDockingPromoV2Header3[] = {
{kIOSDockingPromoV2VariationParam, kIOSDockingPromoV2VariationHeader3}};
const FeatureEntry::FeatureVariation kIOSDockingPromoV2Variations[] = {
{"Display Header #1", kIOSDockingPromoV2Header1, nullptr},
{"Display Header #2", kIOSDockingPromoV2Header2, nullptr},
{"Display Header #3 without Subheader", kIOSDockingPromoV2Header3,
nullptr}};
const FeatureEntry::FeatureParam kIOSDockingPromoDisplayedAfterFRE[] = {
{kIOSDockingPromoExperimentType, "0"}};
const FeatureEntry::FeatureParam kIOSDockingPromoDisplayedAtAppLaunch[] = {
{kIOSDockingPromoExperimentType, "1"}};
const FeatureEntry::FeatureParam kIOSDockingPromoDisplayedDuringFRE[] = {
{kIOSDockingPromoExperimentType, "2"}};
const FeatureEntry::FeatureVariation kIOSDockingPromoVariations[] = {
{"Display promo after FRE", kIOSDockingPromoDisplayedAfterFRE, nullptr},
{"Display promo at app launch", kIOSDockingPromoDisplayedAtAppLaunch,
nullptr},
{"Display promo during FRE", kIOSDockingPromoDisplayedDuringFRE, nullptr}};
// Uses int values from Lens filters ablation mode enum.
const FeatureEntry::FeatureParam kLensFiltersAblationModeDisabled[] = {
{kLensFiltersAblationMode, "0"}};
const FeatureEntry::FeatureParam kLensFiltersAblationModePostCapture[] = {
{kLensFiltersAblationMode, "1"}};
const FeatureEntry::FeatureParam kLensFiltersAblationModeLVF[] = {
{kLensFiltersAblationMode, "2"}};
const FeatureEntry::FeatureParam kLensFiltersAblationModeAlways[] = {
{kLensFiltersAblationMode, "3"}};
const FeatureEntry::FeatureVariation kLensFiltersAblationModeVariations[] = {
{"(Disabled)", kLensFiltersAblationModeDisabled, nullptr},
{"(Post Capture)", kLensFiltersAblationModePostCapture, nullptr},
{"(LVF)", kLensFiltersAblationModeLVF, nullptr},
{"(Always)", kLensFiltersAblationModeAlways, nullptr}};
// Uses int values from Lens translate toggle mode enum.
const FeatureEntry::FeatureParam kLensTranslateToggleModeDisabled[] = {
{kLensTranslateToggleMode, "0"}};
const FeatureEntry::FeatureParam kLensTranslateToggleModePostCapture[] = {
{kLensTranslateToggleMode, "1"}};
const FeatureEntry::FeatureParam kLensTranslateToggleModeLVF[] = {
{kLensTranslateToggleMode, "2"}};
const FeatureEntry::FeatureParam kLensTranslateToggleModeAlways[] = {
{kLensTranslateToggleMode, "3"}};
const FeatureEntry::FeatureVariation kLensTranslateToggleModeVariations[] = {
{"(Disabled)", kLensTranslateToggleModeDisabled, nullptr},
{"(Post Capture)", kLensTranslateToggleModePostCapture, nullptr},
{"(LVF)", kLensTranslateToggleModeLVF, nullptr},
{"(Always)", kLensTranslateToggleModeAlways, 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,
nullptr},
{"demoted by 50", kMlUrlPiecewiseMappedSearchBlendingDemotedBy50,
nullptr},
{"promoted by 50", kMlUrlPiecewiseMappedSearchBlendingPromotedBy50,
nullptr},
{"promoted by 100", kMlUrlPiecewiseMappedSearchBlendingPromotedBy100,
nullptr},
{"mobile mapping", kMlUrlPiecewiseMappedSearchBlendingMobileMapping,
nullptr},
};
const FeatureEntry::FeatureParam kOmniboxMiaZpsEnabledWithHistoryAblation[] = {
{OmniboxFieldTrial::kSuppressPsuggestBackfillWithMIAParam, "true"}};
const FeatureEntry::FeatureVariation kOmniboxMiaZpsVariations[] = {
{"with History Ablation", kOmniboxMiaZpsEnabledWithHistoryAblation,
nullptr}};
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"},
};
const FeatureEntry::FeatureVariation kOmniboxMlUrlScoringVariations[] = {
{"Enabled with fixes", kOmniboxMlUrlScoringEnabledWithFixes, nullptr},
{"unlimited suggestion candidates",
kOmniboxMlUrlScoringUnlimitedNumCandidates, nullptr},
{"Increase provider max limit to 10",
kOmniboxMlUrlScoringMaxMatchesByProvider10, 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, nullptr},
{"Mapped conservative urls", kMlUrlSearchBlendingMappedConservativeUrls,
nullptr},
{"Mapped moderate urls", kMlUrlSearchBlendingMappedModerateUrls, nullptr},
{"Mapped aggressive urls", kMlUrlSearchBlendingMappedAggressiveUrls,
nullptr},
};
const FeatureEntry::FeatureVariation kUrlScoringModelVariations[] = {
{"Small model", {}, "3379590"},
{"Full model", {}, "3380197"},
};
const FeatureEntry::FeatureParam kPriceTrackingPromoForceShowArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceShowCardParam,
segmentation_platform::kPriceTrackingNotificationPromo},
};
const FeatureEntry::FeatureParam kPriceTrackingPromoForceHideArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceHideCardParam,
segmentation_platform::kPriceTrackingNotificationPromo},
};
// ShopCard variants
const FeatureEntry::FeatureParam kPriceDropOnTabArm[] = {
{"ShopCardVariant", "arm_3"},
};
const FeatureEntry::FeatureParam kPriceTrackableProductOnTabArm[] = {
{"ShopCardVariant", "arm_4"},
};
const FeatureEntry::FeatureParam kTabResumptionWithImpressionLimitsArm[] = {
{"ShopCardVariant", "arm_5"},
};
const FeatureEntry::FeatureParam kPriceDropOnTabFront[] = {
{"ShopCardVariant", "arm_3"},
{"ShopCardPosition", "shop_card_front"},
};
const FeatureEntry::FeatureParam kPriceTrackableProductOnTabFront[] = {
{"ShopCardVariant", "arm_4"},
{"ShopCardPosition", "shop_card_front"},
};
const FeatureEntry::FeatureParam kTabResumptionWithImpressionLimitsFront[] = {
{"ShopCardVariant", "arm_5"},
{"ShopCardPosition", "shop_card_front"},
};
const FeatureEntry::FeatureParam kPriceDropOnTabDelayedDataAcquisition[] = {
{"ShopCardVariant", "arm_6"},
};
const FeatureEntry::FeatureParam kPriceDropOnTabDelayedDataAcquisitionFront[] =
{
{"ShopCardVariant", "arm_6"},
{"ShopCardPosition", "shop_card_front"},
};
// Address Bar Position
const FeatureEntry::FeatureParam kTipsAddressBarPositionForceShowArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceShowCardParam,
segmentation_platform::kAddressBarPositionEphemeralModule},
};
const FeatureEntry::FeatureParam kTipsAddressBarPositionForceHideArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceHideCardParam,
segmentation_platform::kAddressBarPositionEphemeralModule},
};
// Autofill Passwords
const FeatureEntry::FeatureParam kTipsAutofillPasswordsForceShowArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceShowCardParam,
segmentation_platform::kAutofillPasswordsEphemeralModule},
};
const FeatureEntry::FeatureParam kTipsAutofillPasswordsForceHideArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceHideCardParam,
segmentation_platform::kAutofillPasswordsEphemeralModule},
};
// Enhanced Safe Browsing
const FeatureEntry::FeatureParam kTipsEnhancedSafeBrowsingForceShowArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceShowCardParam,
segmentation_platform::kEnhancedSafeBrowsingEphemeralModule},
};
const FeatureEntry::FeatureParam kTipsEnhancedSafeBrowsingForceHideArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceHideCardParam,
segmentation_platform::kEnhancedSafeBrowsingEphemeralModule},
};
// Lens Search
const FeatureEntry::FeatureParam kTipsLensSearchForceShowArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceShowCardParam,
segmentation_platform::kLensEphemeralModuleSearchVariation},
};
const FeatureEntry::FeatureParam kTipsLensSearchForceHideArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceHideCardParam,
segmentation_platform::kLensEphemeralModuleSearchVariation},
};
// Lens Shop
const FeatureEntry::FeatureParam kTipsLensShopForceShowArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceShowCardParam,
segmentation_platform::kLensEphemeralModuleShopVariation},
};
const FeatureEntry::FeatureParam kTipsLensShopForceHideArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceHideCardParam,
segmentation_platform::kLensEphemeralModuleShopVariation},
};
// Lens Translate
const FeatureEntry::FeatureParam kTipsLensTranslateForceShowArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceShowCardParam,
segmentation_platform::kLensEphemeralModuleTranslateVariation},
};
const FeatureEntry::FeatureParam kTipsLensTranslateForceHideArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceHideCardParam,
segmentation_platform::kLensEphemeralModuleTranslateVariation},
};
// Save Passwords
const FeatureEntry::FeatureParam kTipsSavePasswordsForceShowArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceShowCardParam,
segmentation_platform::kSavePasswordsEphemeralModule},
};
const FeatureEntry::FeatureParam kTipsSavePasswordsForceHideArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceHideCardParam,
segmentation_platform::kSavePasswordsEphemeralModule},
};
// Send Tab Promo
const FeatureEntry::FeatureParam kSendTabPromoForceShowArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceShowCardParam,
segmentation_platform::kSendTabNotificationPromo},
};
const FeatureEntry::FeatureParam kSendTabPromoForceHideArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceHideCardParam,
segmentation_platform::kSendTabNotificationPromo},
};
// App Bundle Promo
const FeatureEntry::FeatureParam kAppBundlePromoForceShowArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceShowCardParam,
segmentation_platform::kAppBundlePromoEphemeralModule},
};
const FeatureEntry::FeatureParam kAppBundlePromoForceHideArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceHideCardParam,
segmentation_platform::kAppBundlePromoEphemeralModule},
};
// Default Browser Promo
const FeatureEntry::FeatureParam kDefaultBrowserPromoForceShowArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceShowCardParam,
segmentation_platform::kDefaultBrowserPromoEphemeralModule},
};
const FeatureEntry::FeatureParam kDefaultBrowserPromoForceHideArm[] = {
{segmentation_platform::features::kEphemeralCardRankerForceHideCardParam,
segmentation_platform::kDefaultBrowserPromoEphemeralModule},
};
// ShopCard experiment arms
const FeatureEntry::FeatureVariation kShopCardOverrideOptions[] = {
{"Card 3 Price Drop on Tab Resumption", kPriceDropOnTabArm, nullptr},
{"Card 4 Price Trackable on Tab Resumption", kPriceTrackableProductOnTabArm,
nullptr},
{"Card 5 Tab Resumption with Impression Limits",
kTabResumptionWithImpressionLimitsArm, nullptr},
{"Card 3 Price Drop on Tab Resumption at front of magic stack",
kPriceDropOnTabFront, nullptr},
{"Card 4 Price Trackable on Tab Resumption at front of magic stack",
kPriceTrackableProductOnTabFront, nullptr},
{"Card 5 Tab Resumption with Impression Limits at front of magic stack",
kTabResumptionWithImpressionLimitsFront, nullptr},
{"Card 6 Price Drop on Tab Resumption with delayed data acquisition",
kPriceDropOnTabDelayedDataAcquisition, nullptr},
{"Card 6 Price Drop on Tab Resumption with delayed data acquisition at "
"front of magic stack",
kPriceDropOnTabDelayedDataAcquisitionFront, nullptr},
};
const FeatureEntry::FeatureVariation kEphemeralCardRankerCardOverrideOptions[] =
{
{"- Force Show Price Tracking Notification",
kPriceTrackingPromoForceShowArm, nullptr},
{"- Force Hide Price Tracking Notification",
kPriceTrackingPromoForceHideArm, nullptr},
// Address Bar Position
{"- Force Show Address Bar Position Tip",
kTipsAddressBarPositionForceShowArm, nullptr},
{"- Force Hide Address Bar Position Tip",
kTipsAddressBarPositionForceHideArm, nullptr},
// Autofill Passwords
{"- Force Show Autofill Passwords Tip",
kTipsAutofillPasswordsForceShowArm, nullptr},
{"- Force Hide Autofill Passwords Tip",
kTipsAutofillPasswordsForceHideArm, nullptr},
// Enhanced Safe Browsing
{"- Force Show Enhanced Safe Browsing Tip",
kTipsEnhancedSafeBrowsingForceShowArm, nullptr},
{"- Force Hide Enhanced Safe Browsing Tip",
kTipsEnhancedSafeBrowsingForceHideArm, nullptr},
// Lens Search
{"- Force Show Lens Search Tip", kTipsLensSearchForceShowArm, nullptr},
{"- Force Hide Lens Search Tip", kTipsLensSearchForceHideArm, nullptr},
// Lens Shop
{"- Force Show Lens Shop Tip", kTipsLensShopForceShowArm, nullptr},
{"- Force Hide Lens Shop Tip", kTipsLensShopForceHideArm, nullptr},
// Lens Translate
{"- Force Show Lens Translate Tip", kTipsLensTranslateForceShowArm,
nullptr},
{"- Force Hide Lens Translate Tip", kTipsLensTranslateForceHideArm,
nullptr},
// Save Passwords
{"- Force Show Save Passwords Tip", kTipsSavePasswordsForceShowArm,
nullptr},
{"- Force Hide Save Passwords Tip", kTipsSavePasswordsForceHideArm,
nullptr},
// Send Tab Promo.
{"- Force Show Send Tab Promo", kSendTabPromoForceShowArm, nullptr},
{"- Force Hide Send Tab Promo", kSendTabPromoForceHideArm, nullptr},
// App Bundle Promo.
{"- Force Show App Bundle Promo", kAppBundlePromoForceShowArm, nullptr},
{"- Force Hide App Bundle Promo", kAppBundlePromoForceHideArm, nullptr},
// Default Browser Promo.
{"- Force Show Default Browser Promo", kDefaultBrowserPromoForceShowArm,
nullptr},
{"- Force Hide Default Browser Promo", kDefaultBrowserPromoForceHideArm,
nullptr},
};
// Soft Lock
const FeatureEntry::FeatureParam kIOSSoftLockNoDelay[] = {
{kIOSSoftLockBackgroundThresholdParam, "0m"},
};
const FeatureEntry::FeatureVariation kIOSSoftLockVariations[] = {
{" - No delay", kIOSSoftLockNoDelay, nullptr}};
constexpr flags_ui::FeatureEntry::FeatureParam
kAutofillThrottleDocFormScanShortPeriodParam[] = {{"period-ms", "250"}};
constexpr flags_ui::FeatureEntry::FeatureParam
kAutofillThrottleDocFormScanMediumPeriodParam[] = {{"period-ms", "500"}};
constexpr flags_ui::FeatureEntry::FeatureParam
kAutofillThrottleDocFormScanLongPeriodParam[] = {{"period-ms", "1000"}};
constexpr flags_ui::FeatureEntry::FeatureVariation
kAutofillThrottleDocFormScanVariations[] = {
{"Short period", kAutofillThrottleDocFormScanShortPeriodParam, nullptr},
{"Medium period", kAutofillThrottleDocFormScanMediumPeriodParam,
nullptr},
{"Long period", kAutofillThrottleDocFormScanLongPeriodParam, nullptr}};
constexpr flags_ui::FeatureEntry::FeatureParam
kAutofillThrottleFilteredDocFormScanShortPeriodParam[] = {
{"period-ms", "100"}};
constexpr flags_ui::FeatureEntry::FeatureParam
kAutofillThrottleFilteredDocFormScanMediumPeriodParam[] = {
{"period-ms", "250"}};
constexpr flags_ui::FeatureEntry::FeatureParam
kAutofillThrottleFilteredDocFormScanLongPeriodParam[] = {
{"period-ms", "500"}};
constexpr flags_ui::FeatureEntry::FeatureVariation
kAutofillThrottleFilteredDocFormScanVariations[] = {
{"Short period", kAutofillThrottleFilteredDocFormScanShortPeriodParam,
nullptr},
{"Medium period", kAutofillThrottleFilteredDocFormScanMediumPeriodParam,
nullptr},
{"Long period", kAutofillThrottleFilteredDocFormScanLongPeriodParam,
nullptr}};
const FeatureEntry::FeatureParam kUpdatedFirstRunSequenceArm1[] = {
{first_run::kUpdatedFirstRunSequenceParam, "1"}};
const FeatureEntry::FeatureParam kUpdatedFirstRunSequenceArm2[] = {
{first_run::kUpdatedFirstRunSequenceParam, "2"}};
const FeatureEntry::FeatureParam kUpdatedFirstRunSequenceArm3[] = {
{first_run::kUpdatedFirstRunSequenceParam, "3"}};
const FeatureEntry::FeatureVariation kUpdatedFirstRunSequenceVariations[] = {
{" - Default browser promo first", kUpdatedFirstRunSequenceArm1, nullptr},
{" - Remove sign in & sync conditionally", kUpdatedFirstRunSequenceArm2,
nullptr},
{" - DB promo first and remove sign in & sync",
kUpdatedFirstRunSequenceArm3, nullptr}};
const FeatureEntry::FeatureParam kSlowFullscreenTransitionSpeed[] = {
{kFullscreenTransitionSpeedParam, "0"}};
const FeatureEntry::FeatureParam kDefaultFullscreenTransitionSpeed[] = {
{kFullscreenTransitionSpeedParam, "1"}};
const FeatureEntry::FeatureParam kFastFullscreenTransitionSpeed[] = {
{kFullscreenTransitionSpeedParam, "2"}};
const FeatureEntry::FeatureVariation kFullscreenTransitionVariations[] = {
{"Slow speed", kSlowFullscreenTransitionSpeed, nullptr},
{"Default speed", kDefaultFullscreenTransitionSpeed, nullptr},
{"Fast speed", kFastFullscreenTransitionSpeed, nullptr}};
const FeatureEntry::FeatureParam kFullscreenScrollThreshold1[] = {
{web::features::kFullscreenScrollThresholdAmount, "1"}};
const FeatureEntry::FeatureParam kFullscreenScrollThreshold5[] = {
{web::features::kFullscreenScrollThresholdAmount, "5"}};
const FeatureEntry::FeatureParam kFullscreenScrollThreshold10[] = {
{web::features::kFullscreenScrollThresholdAmount, "10"}};
const FeatureEntry::FeatureParam kFullscreenScrollThreshold20[] = {
{web::features::kFullscreenScrollThresholdAmount, "20"}};
const FeatureEntry::FeatureVariation kFullscreenScrollThresholdVariations[] = {
{"1px", kFullscreenScrollThreshold1, nullptr},
{"5px", kFullscreenScrollThreshold5, nullptr},
{"10px", kFullscreenScrollThreshold10, nullptr},
{"20px", kFullscreenScrollThreshold20, nullptr}};
const FeatureEntry::FeatureParam kAnimatedDBPInFREWithActionButtons[] = {
{first_run::kAnimatedDefaultBrowserPromoInFREExperimentType, "0"}};
const FeatureEntry::FeatureParam kAnimatedDBPInFREWithShowMeHow[] = {
{first_run::kAnimatedDefaultBrowserPromoInFREExperimentType, "1"}};
const FeatureEntry::FeatureParam kAnimatedDBPInFREWithInstructions[] = {
{first_run::kAnimatedDefaultBrowserPromoInFREExperimentType, "2"}};
const FeatureEntry::FeatureVariation
kAnimatedDefaultBrowserPromoInFREVariations[] = {
{" - with Action Buttons", kAnimatedDBPInFREWithActionButtons, nullptr},
{" - with Show Me How", kAnimatedDBPInFREWithShowMeHow, nullptr},
{" - with Instructions", kAnimatedDBPInFREWithInstructions, nullptr}};
const FeatureEntry::FeatureParam kBestFeaturesScreenInFirstRunArm2[] = {
{first_run::kBestFeaturesScreenInFirstRunParam, "2"}};
const FeatureEntry::FeatureParam kBestFeaturesScreenInFirstRunArm3[] = {
{first_run::kBestFeaturesScreenInFirstRunParam, "3"}};
const FeatureEntry::FeatureParam kBestFeaturesScreenInFirstRunArm4[] = {
{first_run::kBestFeaturesScreenInFirstRunParam, "4"}};
const FeatureEntry::FeatureParam kBestFeaturesScreenInFirstRunArm5[] = {
{first_run::kBestFeaturesScreenInFirstRunParam, "5"}};
const FeatureEntry::FeatureParam kBestFeaturesScreenInFirstRunArm6[] = {
{first_run::kBestFeaturesScreenInFirstRunParam, "6"}};
const FeatureEntry::FeatureVariation kBestFeaturesScreenInFirstRunVariations[] =
{{" - Variant A: General screen, after DB promo",
kUpdatedFirstRunSequenceArm1, nullptr},
{" - Variant B: General screen, before DB promo",
kBestFeaturesScreenInFirstRunArm2, nullptr},
{" - Variant C: General screen with passwords item",
kBestFeaturesScreenInFirstRunArm3, nullptr},
{" - Variant D: Shopping users screen, variant C as fallback",
kBestFeaturesScreenInFirstRunArm4, nullptr},
{" - Variant E: Show screen to signed-in users only",
kBestFeaturesScreenInFirstRunArm5, nullptr},
{" - Variant F: Show address bar promo", kBestFeaturesScreenInFirstRunArm6,
nullptr}};
const FeatureEntry::FeatureParam kIOSOneTapMiniMapRestrictionCrossValidate[] = {
{kIOSOneTapMiniMapRestrictionCrossValidateParamName, "true"}};
const FeatureEntry::FeatureParam kIOSOneTapMiniMapRestrictionThreshold999[] = {
{kIOSOneTapMiniMapRestrictionThreshholdParamName, "0.999"}};
const FeatureEntry::FeatureParam kIOSOneTapMiniMapRestrictionMinLength20[] = {
{kIOSOneTapMiniMapRestrictionMinCharsParamName, "20"}};
const FeatureEntry::FeatureParam kIOSOneTapMiniMapRestrictionMaxSections6[] = {
{kIOSOneTapMiniMapRestrictionMaxSectionsParamName, "6"}};
const FeatureEntry::FeatureParam kIOSOneTapMiniMapRestrictionLongWords4[] = {
{kIOSOneTapMiniMapRestrictionLongestWordMinCharsParamName, "4"}};
const FeatureEntry::FeatureParam kIOSOneTapMiniMapRestrictionMinAlphaNum60[] = {
{kIOSOneTapMiniMapRestrictionMinAlphanumProportionParamName, "0.6"}};
const FeatureEntry::FeatureVariation kIOSOneTapMiniMapRestrictionsVariations[] =
{{"Revalidate with NSDataDetector",
kIOSOneTapMiniMapRestrictionCrossValidate, nullptr},
{"Confidence Level (0.999)", kIOSOneTapMiniMapRestrictionThreshold999,
nullptr},
{"Minimum address length (20 chars)",
kIOSOneTapMiniMapRestrictionMinLength20, nullptr},
{"Maximum sections (6)", kIOSOneTapMiniMapRestrictionMaxSections6,
nullptr},
{"Longest word length (4)", kIOSOneTapMiniMapRestrictionLongWords4,
nullptr},
{"Proportion of alnum chars (60%)",
kIOSOneTapMiniMapRestrictionMinAlphaNum60, nullptr}};
const FeatureEntry::FeatureParam kFeedSwipeInProductHelpStaticInFirstRun[] = {
{kFeedSwipeInProductHelpArmParam, "1"}};
const FeatureEntry::FeatureParam kFeedSwipeInProductHelpStaticInSecondRun[] = {
{kFeedSwipeInProductHelpArmParam, "2"}};
const FeatureEntry::FeatureParam kFeedSwipeInProductHelpAnimated[] = {
{kFeedSwipeInProductHelpArmParam, "3"}};
const FeatureEntry::FeatureVariation kFeedSwipeInProductHelpVariations[] = {
{" - Static IPH after the FRE", kFeedSwipeInProductHelpStaticInFirstRun,
nullptr},
{"- Static IPH after the second run",
kFeedSwipeInProductHelpStaticInSecondRun, nullptr},
{"- Animated IPH", kFeedSwipeInProductHelpAnimated, nullptr}};
// LINT.IfChange(AutofillVcnEnrollStrikeExpiryTime)
const FeatureEntry::FeatureParam kAutofillVcnEnrollStrikeExpiryTime_120Days[] =
{{"autofill_vcn_strike_expiry_time_days", "120"}};
const FeatureEntry::FeatureParam kAutofillVcnEnrollStrikeExpiryTime_60Days[] = {
{"autofill_vcn_strike_expiry_time_days", "60"}};
const FeatureEntry::FeatureParam kAutofillVcnEnrollStrikeExpiryTime_30Days[] = {
{"autofill_vcn_strike_expiry_time_days", "30"}};
const FeatureEntry::FeatureVariation
kAutofillVcnEnrollStrikeExpiryTimeOptions[] = {
{"120 days", kAutofillVcnEnrollStrikeExpiryTime_120Days, nullptr},
{"60 days", kAutofillVcnEnrollStrikeExpiryTime_60Days, nullptr},
{"30 days", kAutofillVcnEnrollStrikeExpiryTime_30Days, nullptr}};
// LINT.ThenChange(/chrome/browser/about_flags.cc:AutofillVcnEnrollStrikeExpiryTime)
const FeatureEntry::FeatureParam kWelcomeBackArm1[] = {
{kWelcomeBackParam, "1"}};
const FeatureEntry::FeatureParam kWelcomeBackArm2[] = {
{kWelcomeBackParam, "2"}};
const FeatureEntry::FeatureParam kWelcomeBackArm3[] = {
{kWelcomeBackParam, "3"}};
const FeatureEntry::FeatureParam kWelcomeBackArm4[] = {
{kWelcomeBackParam, "4"}};
const FeatureEntry::FeatureVariation kWelcomeBackVariations[] = {
{" - Variant A: Basics with Locked Incognito", kWelcomeBackArm1, nullptr},
{" - Variant B: Basics with Save & Autofill Passwords", kWelcomeBackArm2,
nullptr},
{" - Variant C: Productivity & Shopping", kWelcomeBackArm3, nullptr},
{" - Variant D: Sign-in Benefits", kWelcomeBackArm4, nullptr},
};
const FeatureEntry::FeatureParam kBestOfAppFREArm1[] = {{"variant", "1"}};
const FeatureEntry::FeatureParam kBestOfAppFREArm2[] = {{"variant", "2"}};
const FeatureEntry::FeatureParam kBestOfAppFREArm4[] = {{"variant", "4"}};
const FeatureEntry::FeatureParam kBestOfAppFREArm4Upload[] = {
{"variant", "4"},
{"manual_upload_uma", "true"}};
const FeatureEntry::FeatureVariation kBestOfAppFREVariations[] = {
{" - Variant A: Lens Interactive Promo", kBestOfAppFREArm1, nullptr},
{" - Variant A: Lens Animated Promo", kBestOfAppFREArm2, nullptr},
{" - Variant D: Guided Tour", kBestOfAppFREArm4, nullptr},
{" - Variant D: Guided Tour with manual metric upload",
kBestOfAppFREArm4Upload, nullptr},
};
const FeatureEntry::FeatureParam
kInvalidateChoiceOnRestoreIsRetroactiveOption[] = {
{"is_retroactive", "true"}};
const FeatureEntry::FeatureVariation
kInvalidateSearchEngineChoiceOnRestoreVariations[] = {
{"(retroactive)", kInvalidateChoiceOnRestoreIsRetroactiveOption,
nullptr}};
const FeatureEntry::FeatureParam kSingleScreenForBWGPromoConsent[] = {
{kBWGPromoConsentParams, "1"}};
const FeatureEntry::FeatureParam kDoubleScreenForBWGPromoConsent[] = {
{kBWGPromoConsentParams, "2"}};
const FeatureEntry::FeatureParam kSkipBWGPromoConsent[] = {
{kBWGPromoConsentParams, "3"}};
const FeatureEntry::FeatureParam kForceBWGFirstTimeRun[] = {
{kBWGPromoConsentParams, "4"}};
const FeatureEntry::FeatureParam kSkipNewUserDelay[] = {
{kBWGPromoConsentParams, "5"}};
const FeatureEntry::FeatureVariation kBWGPromoConsentVariations[] = {
{"Single screen for BWG Promo Consent Flow",
kSingleScreenForBWGPromoConsent, nullptr},
{"Double screen for BWG Promo Consent Flow",
kDoubleScreenForBWGPromoConsent, nullptr},
{"Skip FRE", kSkipBWGPromoConsent, nullptr},
{"Force FRE", kForceBWGFirstTimeRun, nullptr},
{"Skip new user delay", kSkipNewUserDelay, nullptr}};
const FeatureEntry::FeatureParam kOmniboxMobileParityEnableFeedForGoogleOnly[] =
{{OmniboxFieldTrial::kMobileParityEnableFeedForGoogleOnly.name, "true"}};
const FeatureEntry::FeatureVariation kOmniboxMobileParityVariations[] = {
{"- feed only when searching with Google",
kOmniboxMobileParityEnableFeedForGoogleOnly, nullptr}};
const FeatureEntry::FeatureParam kPageActionMenuDirectEntryPoint[] = {
{kPageActionMenuDirectEntryPointParam, "true"},
};
const FeatureEntry::FeatureParam kPageActionMenuBWGSessionValidityDuration[] = {
{kBWGSessionValidityDurationParam, "1"}};
const FeatureEntry::FeatureVariation kPageActionMenuVariations[] = {
{"Direct Entry Point", kPageActionMenuDirectEntryPoint, nullptr},
{"1 min session validity duration",
kPageActionMenuBWGSessionValidityDuration, nullptr},
};
const FeatureEntry::FeatureParam
kProactiveSuggestionsFrameworkPopupBlockerParam[] = {
{kProactiveSuggestionsFrameworkPopupBlocker, "true"}};
const FeatureEntry::FeatureVariation
kProactiveSuggestionsFrameworkVariations[] = {
{"Popup Blocker", kProactiveSuggestionsFrameworkPopupBlockerParam,
nullptr}};
const FeatureEntry::FeatureParam kAskGeminiChipIgnoreCriteriaVariation[] = {
{kAskGeminiChipIgnoreCriteria, "true"},
};
const FeatureEntry::FeatureParam kAskGeminiChipPrepopulateFloatyVariation[] = {
{kAskGeminiChipPrepopulateFloaty, "true"},
};
const FeatureEntry::FeatureParam
kAskGeminiChipPrepopulateAndIgnoreCriteriaVariation[] = {
{kAskGeminiChipPrepopulateAndIgnoreCriteria, "true"},
};
const FeatureEntry::FeatureParam
kAskGeminiChipAllowNonconsentedUsersVariation[] = {
{kAskGeminiChipAllowNonconsentedUsers, "true"},
};
const FeatureEntry::FeatureVariation kAskGeminiChipVariations[] = {
{"Ignore FET and Time Criteria", kAskGeminiChipIgnoreCriteriaVariation,
nullptr},
{"Prepopulate Floaty", kAskGeminiChipPrepopulateFloatyVariation, nullptr},
{"Prepopulate Floaty and Ignore Criteria",
kAskGeminiChipPrepopulateAndIgnoreCriteriaVariation, nullptr},
{"Allow non-consented users", kAskGeminiChipAllowNonconsentedUsersVariation,
nullptr},
};
// LINT.IfChange(DataSharingVersioningChoices)
const FeatureEntry::Choice kDataSharingVersioningStateChoices[] = {
{"Default", "", ""},
{flag_descriptions::kDataSharingSharedDataTypesEnabled,
switches::kEnableFeatures, "SharedDataTypesKillSwitch"},
{flag_descriptions::kDataSharingSharedDataTypesEnabledWithUi,
switches::kEnableFeatures,
"SharedDataTypesKillSwitch,DataSharingEnableUpdateChromeUI"},
{"Disabled", switches::kDisableFeatures,
"SharedDataTypesKillSwitch, DataSharingEnableUpdateChromeUI"},
};
// LINT.ThenChange(//chrome/browser/about_flags.cc:DataSharingVersioningChoices)
const FeatureEntry::FeatureParam kComposeboxDevToolsForceFailure[] = {
{kForceUploadFailureParam, "true"}};
const FeatureEntry::FeatureParam kComposeboxDevToolsSlowLoad[] = {
{kImageLoadDelayMsParam, "1000"}};
const FeatureEntry::FeatureParam kComposeboxDevToolsSlowUpload[] = {
{kUploadDelayMsParam, "3000"}};
const FeatureEntry::FeatureVariation kComposeboxDevToolsVariations[] = {
{"Force Failure", kComposeboxDevToolsForceFailure, nullptr},
{"Slow Load (1s)", kComposeboxDevToolsSlowLoad, nullptr},
{"Slow Upload (3s)", kComposeboxDevToolsSlowUpload, nullptr}};
const FeatureEntry::FeatureParam kMobilePromoOnDesktopLens[] = {
{kMobilePromoOnDesktopPromoTypeParam, "1"},
{kMobilePromoOnDesktopNotificationParam, "false"}};
const FeatureEntry::FeatureParam kMobilePromoOnDesktopLensNotification[] = {
{kMobilePromoOnDesktopPromoTypeParam, "1"},
{kMobilePromoOnDesktopNotificationParam, "true"}};
const FeatureEntry::FeatureParam kMobilePromoOnDesktopESB[] = {
{kMobilePromoOnDesktopPromoTypeParam, "2"},
{kMobilePromoOnDesktopNotificationParam, "false"}};
const FeatureEntry::FeatureParam kMobilePromoOnDesktopESBNotification[] = {
{kMobilePromoOnDesktopPromoTypeParam, "2"},
{kMobilePromoOnDesktopNotificationParam, "true"}};
const FeatureEntry::FeatureParam kMobilePromoOnDesktopAutofill[] = {
{kMobilePromoOnDesktopPromoTypeParam, "3"},
{kMobilePromoOnDesktopNotificationParam, "false"}};
const FeatureEntry::FeatureParam kMobilePromoOnDesktopAutofillNotification[] = {
{kMobilePromoOnDesktopPromoTypeParam, "3"},
{kMobilePromoOnDesktopNotificationParam, "true"}};
const FeatureEntry::FeatureParam kMobilePromoOnDesktopTabGroups[] = {
{kMobilePromoOnDesktopPromoTypeParam, "4"},
{kMobilePromoOnDesktopNotificationParam, "false"}};
const FeatureEntry::FeatureParam kMobilePromoOnDesktopTabGroupsNotification[] =
{{kMobilePromoOnDesktopPromoTypeParam, "4"},
{kMobilePromoOnDesktopNotificationParam, "true"}};
const FeatureEntry::FeatureParam kMobilePromoOnDesktopPriceTracking[] = {
{kMobilePromoOnDesktopPromoTypeParam, "5"},
{kMobilePromoOnDesktopNotificationParam, "false"}};
const FeatureEntry::FeatureParam
kMobilePromoOnDesktopPriceTrackingNotification[] = {
{kMobilePromoOnDesktopPromoTypeParam, "5"},
{kMobilePromoOnDesktopNotificationParam, "true"}};
const FeatureEntry::FeatureVariation kMobilePromoOnDesktopVariations[] = {
{" - Lens Promo", kMobilePromoOnDesktopLens, nullptr},
{" - Lens Promo with push notification",
kMobilePromoOnDesktopLensNotification, nullptr},
{" - ESB", kMobilePromoOnDesktopESB, nullptr},
{" - ESB with push notification", kMobilePromoOnDesktopESBNotification,
nullptr},
{" - PW Autofill", kMobilePromoOnDesktopAutofill, nullptr},
{" - PW Autofill with push notification",
kMobilePromoOnDesktopAutofillNotification, nullptr},
};
const FeatureEntry::FeatureVariation kMobilePromoOnDesktopWave1Variations[] = {
{" - Tab Groups", kMobilePromoOnDesktopTabGroups, nullptr},
{" - Tab Groups with push notification",
kMobilePromoOnDesktopTabGroupsNotification, nullptr},
{" - Price Tracking", kMobilePromoOnDesktopPriceTracking, nullptr},
{" - Price Tracking with push notification",
kMobilePromoOnDesktopPriceTrackingNotification, nullptr},
};
// Tips Notifications alternative strings.
const FeatureEntry::FeatureParam kTipsNotificationsAlternative1[] = {
{kTipsNotificationsAlternativeStringVersion, "1"}};
const FeatureEntry::FeatureParam kTipsNotificationsAlternative2[] = {
{kTipsNotificationsAlternativeStringVersion, "2"}};
const FeatureEntry::FeatureParam kTipsNotificationsAlternative3[] = {
{kTipsNotificationsAlternativeStringVersion, "3"}};
const FeatureEntry::FeatureVariation
kTipsNotificationsAlternativeStringVariation[] = {
{" - 1", kTipsNotificationsAlternative1, nullptr},
{" - 2", kTipsNotificationsAlternative2, nullptr},
{" - 3", kTipsNotificationsAlternative3, nullptr}};
const FeatureEntry::FeatureParam kZeroStateSuggestionsPlacementAIHubParam[] = {
{kZeroStateSuggestionsPlacementAIHub, "true"}};
const FeatureEntry::FeatureParam
kZeroStateSuggestionsPlacementAskGeminiParam[] = {
{kZeroStateSuggestionsPlacementAskGemini, "true"}};
const FeatureEntry::FeatureParam kGeminiImageRemixToolShowFRERowParam[] = {
{kGeminiImageRemixToolShowFRERow, "true"}};
const FeatureEntry::FeatureParam
kGeminiImageRemixToolShowAboveSearchImageParam[] = {
{kGeminiImageRemixToolShowAboveSearchImage, "true"}};
const FeatureEntry::FeatureParam
kGeminiImageRemixToolShowBelowSearchImageParam[] = {
{kGeminiImageRemixToolShowBelowSearchImage, "true"}};
const FeatureEntry::FeatureParam kGeminiImageRemixToolRemovePageContextParam[] =
{{kGeminiImageRemixToolRemovePageContext, "true"}};
const FeatureEntry::FeatureVariation kGeminiImageRemixToolVariations[] = {
{"(Show FRE Row)", kGeminiImageRemixToolShowFRERowParam, nullptr},
{"(Show Above Search Image)",
kGeminiImageRemixToolShowAboveSearchImageParam, nullptr},
{"(Show Below Search Image)",
kGeminiImageRemixToolShowBelowSearchImageParam, nullptr},
{"(Disable Page Context)", kGeminiImageRemixToolRemovePageContextParam,
nullptr},
};
const FeatureEntry::FeatureVariation kZeroStateSuggestionsVariations[] = {
{"AI Hub", kZeroStateSuggestionsPlacementAIHubParam, nullptr},
{"Ask Gemini Overlay", kZeroStateSuggestionsPlacementAskGeminiParam,
nullptr},
};
const FeatureEntry::FeatureParam kGeminiCopresenceResponseReadyIntervalParam[] =
{{kGeminiCopresenceResponseReadyInterval, "7.0"}};
const FeatureEntry::FeatureParam
kGeminiCopresenceWithFullscreenDisablerParam[] = {
{kGeminiCopresenceWithFullscreenDisabler, "true"}};
const FeatureEntry::FeatureParam kGeminiCopresenceTrackSourcesParam[] = {
{kGeminiCopresenceTrackSources, "true"}};
const FeatureEntry::FeatureVariation kGeminiCopresenceVariations[] = {
{"Response Ready Interval", kGeminiCopresenceResponseReadyIntervalParam,
nullptr},
{"With Fullscreen Disabler", kGeminiCopresenceWithFullscreenDisablerParam,
nullptr},
{"Track Sources", kGeminiCopresenceTrackSourcesParam, nullptr},
};
const char kFRESignInHeaderTextUpdateParamName[] =
"FRESignInHeaderTextUpdateParam";
const FeatureEntry::FeatureParam kFRESignInHeaderTextUpdateArm0[] = {
{kFRESignInHeaderTextUpdateParamName, "Arm0"}};
const FeatureEntry::FeatureParam kFRESignInHeaderTextUpdateArm1[] = {
{kFRESignInHeaderTextUpdateParamName, "Arm1"}};
const FeatureEntry::FeatureVariation kFRESignInHeaderTextUpdateVariations[] = {
{"Header variation #1", kFRESignInHeaderTextUpdateArm0, nullptr},
{"Header variation #2", kFRESignInHeaderTextUpdateArm1, nullptr},
};
const FeatureEntry::FeatureParam
kPersistTabContextFileSystem_WasHidden_FullContext[] = {
{kPersistTabContextStorageParam, "0"},
{kPersistTabContextExtractionTimingParam, "0"},
{kPersistTabContextDataParam, "0"}};
const FeatureEntry::FeatureParam
kPersistTabContextSqlite_WasHidden_FullContext[] = {
{kPersistTabContextStorageParam, "1"},
{kPersistTabContextExtractionTimingParam, "0"},
{kPersistTabContextDataParam, "0"}};
const FeatureEntry::FeatureParam
kPersistTabContextSqlite_WasHiddenPageLoad_FullContext[] = {
{kPersistTabContextStorageParam, "1"},
{kPersistTabContextExtractionTimingParam, "1"},
{kPersistTabContextDataParam, "0"}};
const FeatureEntry::FeatureParam
kPersistTabContextSqlite_WasHidden_InnerTextOnly[] = {
{kPersistTabContextStorageParam, "1"},
{kPersistTabContextExtractionTimingParam, "0"},
{kPersistTabContextDataParam, "1"}};
const FeatureEntry::FeatureVariation kPersistTabContextVariations[] = {
{"FileSystem, On Tab Hide, APC + Inner Text",
kPersistTabContextFileSystem_WasHidden_FullContext, nullptr},
{"SQLite, On Tab Hide, APC + Inner Text",
kPersistTabContextSqlite_WasHidden_FullContext, nullptr},
{"SQLite, On Tab Hide & Page Load, APC + Inner Text",
kPersistTabContextSqlite_WasHiddenPageLoad_FullContext, nullptr},
{"SQLite, On Tab Hide, Inner Text",
kPersistTabContextSqlite_WasHidden_InnerTextOnly, nullptr}};
const FeatureEntry::FeatureParam kIOSExpandedSetupListSafariImport[] = {
{kIOSExpandedSetupListVariationParam,
kIOSExpandedSetupListVariationParamSafariImport}};
const FeatureEntry::FeatureParam
kIOSExpandedSetupListBackgroundCustomization[] = {
{kIOSExpandedSetupListVariationParam,
kIOSExpandedSetupListVariationParamBackgroundCustomization}};
const FeatureEntry::FeatureParam
IOSExpandedSetupListVariationParamAllExceptCPE[] = {
{kIOSExpandedSetupListVariationParam,
kIOSExpandedSetupListVariationParamAllExceptCPE}};
const FeatureEntry::FeatureParam kIOSExpandedSetupListAll[] = {
{kIOSExpandedSetupListVariationParam,
kIOSExpandedSetupListVariationParamAll}};
const FeatureEntry::FeatureVariation kIOSExpandedSetupListVariations[] = {
{"Safari Data Import", kIOSExpandedSetupListSafariImport, nullptr},
{"Home Background Customization",
kIOSExpandedSetupListBackgroundCustomization, nullptr},
{"Safari Data Import & Home Background Customization (without CPE)",
IOSExpandedSetupListVariationParamAllExceptCPE, nullptr},
{"Safari Data Import, Home Background Customization, CPE",
kIOSExpandedSetupListAll, nullptr}};
const FeatureEntry::FeatureParam kModelBasedPageClassificationParam1[] = {
{kModelBasedPageClassificationExecutionRateParam, "1"}};
const FeatureEntry::FeatureParam kModelBasedPageClassificationParam10[] = {
{kModelBasedPageClassificationExecutionRateParam, "10"}};
const FeatureEntry::FeatureParam kModelBasedPageClassificationParam25[] = {
{kModelBasedPageClassificationExecutionRateParam, "25"}};
const FeatureEntry::FeatureParam kModelBasedPageClassificationParam50[] = {
{kModelBasedPageClassificationExecutionRateParam, "50"}};
const FeatureEntry::FeatureParam kModelBasedPageClassificationParam75[] = {
{kModelBasedPageClassificationExecutionRateParam, "75"}};
const FeatureEntry::FeatureParam kModelBasedPageClassificationParam100[] = {
{kModelBasedPageClassificationExecutionRateParam, "100"}};
const FeatureEntry::FeatureVariation kModelBasedPageClassificationVariations[] =
{
{"(1%)", kModelBasedPageClassificationParam1, nullptr},
{"(10%)", kModelBasedPageClassificationParam10, nullptr},
{"(25%)", kModelBasedPageClassificationParam25, nullptr},
{"(50%)", kModelBasedPageClassificationParam50, nullptr},
{"(75%)", kModelBasedPageClassificationParam75, nullptr},
{"(100%)", kModelBasedPageClassificationParam100, nullptr},
};
const FeatureEntry::FeatureParam kAfterEditForExplainGeminiEditMenu[] = {
{kExplainGeminiEditMenuParams, "1"}};
const FeatureEntry::FeatureParam kAfterSearchForExplainGeminiEditMenu[] = {
{kExplainGeminiEditMenuParams, "2"}};
const FeatureEntry::FeatureVariation kPositionForExplainGeminiEditMenu[] = {
{"Explain Gemini shows up after Edit", kAfterEditForExplainGeminiEditMenu,
nullptr},
{"Explain Gemini shows up after Search with Google",
kAfterSearchForExplainGeminiEditMenu, nullptr}};
const FeatureEntry::FeatureParam kPageActionMenuIconSparkles1[] = {
{kPageActionMenuIconParams, "1"}};
const FeatureEntry::FeatureParam kPageActionMenuIconSparkles2[] = {
{kPageActionMenuIconParams, "2"}};
const FeatureEntry::FeatureVariation kPageActionMenuIconVariations[] = {
{"Sparkles 1", kPageActionMenuIconSparkles1, nullptr},
{"Sparkles 2", kPageActionMenuIconSparkles2, nullptr}};
const FeatureEntry::FeatureParam kAssistantContainerParamDebugDetents[] = {
{kAssistantContainerParam, kAssistantContainerParamDebug}};
const FeatureEntry::FeatureVariation kAssistantContainerVariations[] = {
{"with debug elements", kAssistantContainerParamDebugDetents, nullptr}};
// To add a new entry, add to the end of kFeatureEntries. There are four
// distinct types of entries:
// . ENABLE_DISABLE_VALUE: entry is either enabled, disabled, or uses the
// default value for this feature. Use the ENABLE_DISABLE_VALUE_TYPE
// macro for this type supplying the command line to the macro.
// . MULTI_VALUE: a list of choices, the first of which should correspond to a
// deactivated state for this lab (i.e. no command line option). To specify
// this type of entry use the macro MULTI_VALUE_TYPE supplying it the
// array of choices.
// . FEATURE_VALUE: entry is associated with a base::Feature instance. Entry is
// either enabled, disabled, or uses the default value of the associated
// base::Feature instance. To specify this type of entry use the macro
// FEATURE_VALUE_TYPE supplying it the base::Feature instance.
// . FEATURE_WITH_PARAM_VALUES: a list of choices associated with a
// base::Feature instance. Choices corresponding to the default state, a
// universally enabled state, and a universally disabled state are
// automatically included. To specify this type of entry use the macro
// FEATURE_WITH_PARAMS_VALUE_TYPE supplying it the base::Feature instance and
// the array of choices.
//
// See the documentation of FeatureEntry for details on the fields.
//
// When adding a new choice, add it to the end of the list.
constexpr auto kFeatureEntries = std::to_array<flags_ui::FeatureEntry>({
{"in-product-help-demo-mode-choice",
flag_descriptions::kInProductHelpDemoModeName,
flag_descriptions::kInProductHelpDemoModeDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(
feature_engagement::kIPHDemoMode,
feature_engagement::kIPHDemoModeChoiceVariations,
"IPH_DemoMode")},
{"enable-autofill-credit-card-upload",
flag_descriptions::kAutofillCreditCardUploadName,
flag_descriptions::kAutofillCreditCardUploadDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(autofill::features::kAutofillUpstream)},
{"use-sync-sandbox", flag_descriptions::kSyncSandboxName,
flag_descriptions::kSyncSandboxDescription, flags_ui::kOsIos,
SINGLE_VALUE_TYPE_AND_VALUE(
syncer::kSyncServiceURL,
"https://chrome-sync.sandbox.google.com/chrome-sync/alpha")},
{"wallet-service-use-sandbox",
flag_descriptions::kWalletServiceUseSandboxName,
flag_descriptions::kWalletServiceUseSandboxDescription, flags_ui::kOsIos,
ENABLE_DISABLE_VALUE_TYPE_AND_VALUE(
autofill::switches::kWalletServiceUseSandbox,
"1",
autofill::switches::kWalletServiceUseSandbox,
"0")},
{"show-autofill-type-predictions",
flag_descriptions::kShowAutofillTypePredictionsName,
flag_descriptions::kShowAutofillTypePredictionsDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
autofill::features::debug::kAutofillShowTypePredictions)},
{"ntp-background-customization",
flag_descriptions::kNTPBackgroundCustomizationName,
flag_descriptions::kNTPBackgroundCustomizationDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kNTPBackgroundCustomization)},
{"ntp-background-color-slider",
flag_descriptions::kNTPBackgroundColorSliderName,
flag_descriptions::kNTPBackgroundColorSliderDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kNTPBackgroundColorSlider)},
{"ntp-background-image-cache",
flag_descriptions::kEnableNTPBackgroundImageCacheName,
flag_descriptions::kEnableNTPBackgroundImageCacheDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kEnableNTPBackgroundImageCache)},
{"ntp-alpha-background-collections",
flag_descriptions::kNtpAlphaBackgroundCollectionsName,
flag_descriptions::kNtpAlphaBackgroundCollectionsDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(ntp_features::kNtpAlphaBackgroundCollections)},
{"confirmation-button-swap-order",
flag_descriptions::kConfirmationButtonSwapOrderName,
flag_descriptions::kConfirmationButtonSwapOrderDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kConfirmationButtonSwapOrder)},
{"fullscreen-viewport-adjustment-experiment",
flag_descriptions::kFullscreenSmoothScrollingName,
flag_descriptions::kFullscreenSmoothScrollingDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(web::features::kSmoothScrollingDefault)},
{"fullscreen-scroll-threshold",
flag_descriptions::kFullscreenScrollThresholdName,
flag_descriptions::kFullscreenScrollThresholdDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(web::features::kFullscreenScrollThreshold,
kFullscreenScrollThresholdVariations,
"FullscreenScrollThreshold")},
{"aim-server-eligibility",
flag_descriptions::kIOSOmniboxAimServerEligibilityName,
flag_descriptions::kIOSOmniboxAimServerEligibilityDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(omnibox::kAimServerEligibilityEnabled)},
{"omnibox-ui-max-autocomplete-matches",
flag_descriptions::kOmniboxUIMaxAutocompleteMatchesName,
flag_descriptions::kOmniboxUIMaxAutocompleteMatchesDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(
omnibox::kUIExperimentMaxAutocompleteMatches,
kOmniboxUIMaxAutocompleteMatchesVariations,
"OmniboxUIMaxAutocompleteVariations")},
{"omnibox-local-history-zero-suggest-beyond-ntp",
flag_descriptions::kOmniboxLocalHistoryZeroSuggestBeyondNTPName,
flag_descriptions::kOmniboxLocalHistoryZeroSuggestBeyondNTPDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(omnibox::kLocalHistoryZeroSuggestBeyondNTP)},
{"omnibox-mobile-parity-update",
flag_descriptions::kOmniboxMobileParityUpdateName,
flag_descriptions::kOmniboxMobileParityUpdateDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kOmniboxMobileParityUpdate,
kOmniboxMobileParityVariations,
"OmniboxMobileParityUpdate")},
{"omnibox-mobile-parity-update-v2",
flag_descriptions::kOmniboxMobileParityUpdateV2Name,
flag_descriptions::kOmniboxMobileParityUpdateV2Description,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(omnibox::kOmniboxMobileParityUpdateV2)},
{"force-startup-signin-promo",
flag_descriptions::kForceStartupSigninPromoName,
flag_descriptions::kForceStartupSigninPromoDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(switches::kForceStartupSigninPromo)},
{"shared-highlighting-ios", flag_descriptions::kSharedHighlightingIOSName,
flag_descriptions::kSharedHighlightingIOSDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kSharedHighlightingIOS)},
{"ios-reactivation-notifications",
flag_descriptions::kIOSReactivationNotificationsName,
flag_descriptions::kIOSReactivationNotificationsDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kIOSReactivationNotifications,
kIOSReactivationNotificationsVariations,
"IOSReactivationNotifications")},
{"ios-expanded-setup-list", flag_descriptions::kIOSExpandedSetupListName,
flag_descriptions::kIOSExpandedSetupListDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kIOSExpandedSetupList,
kIOSExpandedSetupListVariations,
"IOSExpandedSetupList")},
{"ios-expanded-tips", flag_descriptions::kIOSExpandedTipsName,
flag_descriptions::kIOSExpandedTipsDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kIOSExpandedTips)},
{"one-time-default-browser-notification",
flag_descriptions::kIOSOneTimeDefaultBrowserNotificationName,
flag_descriptions::kIOSOneTimeDefaultBrowserNotificationDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kIOSOneTimeDefaultBrowserNotification)},
{"invalidate-search-engine-choice-on-device-restore-detection",
flag_descriptions::
kInvalidateSearchEngineChoiceOnDeviceRestoreDetectionName,
flag_descriptions::
kInvalidateSearchEngineChoiceOnDeviceRestoreDetectionDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(
switches::kInvalidateSearchEngineChoiceOnDeviceRestoreDetection,
kInvalidateSearchEngineChoiceOnRestoreVariations,
"InvalidateSearchEngineChoiceOnDeviceRestoreDetection")},
{"ios-provides-app-notification-settings",
flag_descriptions::kIOSProvidesAppNotificationSettingsName,
flag_descriptions::kIOSProvidesAppNotificationSettingsDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kIOSProvidesAppNotificationSettings)},
{"wait-threshold-seconds-for-capabilities-api",
flag_descriptions::kWaitThresholdMillisecondsForCapabilitiesApiName,
flag_descriptions::kWaitThresholdMillisecondsForCapabilitiesApiDescription,
flags_ui::kOsIos,
MULTI_VALUE_TYPE(kWaitThresholdMillisecondsForCapabilitiesApiChoices)},
{"consistent-logo-doodle-height",
flag_descriptions::kConsistentLogoDoodleHeightName,
flag_descriptions::kConsistentLogoDoodleHeightDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kConsistentLogoDoodleHeight)},
{"content-notification-provisional-ignore-conditions",
flag_descriptions::kContentNotificationProvisionalIgnoreConditionsName,
flag_descriptions::
kContentNotificationProvisionalIgnoreConditionsDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kContentNotificationProvisionalIgnoreConditions)},
{"content-push-notifications",
flag_descriptions::kContentPushNotificationsName,
flag_descriptions::kContentPushNotificationsDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kContentPushNotifications,
kContentPushNotificationsVariations,
"ContentPushNotifications")},
{"enable-lens-in-omnibox-copied-image",
flag_descriptions::kEnableLensInOmniboxCopiedImageName,
flag_descriptions::kEnableLensInOmniboxCopiedImageDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kEnableLensInOmniboxCopiedImage)},
{"price-insights", commerce::flag_descriptions::kPriceInsightsName,
commerce::flag_descriptions::kPriceInsightsDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(commerce::kPriceInsights)},
{"optimization-guide-debug-logs",
flag_descriptions::kOptimizationGuideDebugLogsName,
flag_descriptions::kOptimizationGuideDebugLogsDescription,
flags_ui::kOsIos,
SINGLE_VALUE_TYPE(optimization_guide::switches::kDebugLoggingEnabled)},
{"intents-on-measurements", flag_descriptions::kMeasurementsName,
flag_descriptions::kMeasurementsDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(web::features::kEnableMeasurements)},
{"omnibox-https-upgrades", flag_descriptions::kOmniboxHttpsUpgradesName,
flag_descriptions::kOmniboxHttpsUpgradesDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(omnibox::kDefaultTypedNavigationsToHttps)},
{"enable-feed-ablation", flag_descriptions::kEnableFeedAblationName,
flag_descriptions::kEnableFeedAblationDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kEnableFeedAblation)},
{"ios-keyboard-accessory-default-view",
flag_descriptions::kIOSKeyboardAccessoryDefaultViewName,
flag_descriptions::kIOSKeyboardAccessoryDefaultViewDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kIOSKeyboardAccessoryDefaultView)},
{"ios-keyboard-accessory-two-bubble",
flag_descriptions::kIOSKeyboardAccessoryTwoBubbleName,
flag_descriptions::kIOSKeyboardAccessoryTwoBubbleDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kIOSKeyboardAccessoryTwoBubble,
kIOSKeyboardAccessoryTwoBubbleVariations,
"IOSKeyboardAccessoryTwoBubble")},
{"ios-magic-stack-segmentation-ranking",
flag_descriptions::kSegmentationPlatformIosModuleRankerName,
flag_descriptions::kSegmentationPlatformIosModuleRankerDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(
segmentation_platform::features::kSegmentationPlatformIosModuleRanker,
kSegmentationPlatformIosModuleRankerVariations,
flag_descriptions::kSegmentationPlatformIosModuleRankerName)},
{"ios-magic-stack-segmentation-ranking-caching",
flag_descriptions::kSegmentationPlatformIosModuleRankerCachingName,
flag_descriptions::kSegmentationPlatformIosModuleRankerCachingDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kSegmentationPlatformIosModuleRankerCaching)},
{"ios-magic-stack-segmentation-ranking-split-by-surface",
flag_descriptions::kSegmentationPlatformIosModuleRankerSplitBySurfaceName,
flag_descriptions::
kSegmentationPlatformIosModuleRankerSplitBySurfaceDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
segmentation_platform::features::
kSegmentationPlatformIosModuleRankerSplitBySurface)},
{"ios-proactive-password-generation-bottom-sheet",
flag_descriptions::kIOSProactivePasswordGenerationBottomSheetName,
flag_descriptions::kIOSProactivePasswordGenerationBottomSheetDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(password_manager::features::
kIOSProactivePasswordGenerationBottomSheet)},
{"omnibox-zero-suggest-prefetching-on-srp",
flag_descriptions::kOmniboxZeroSuggestPrefetchingOnSRPName,
flag_descriptions::kOmniboxZeroSuggestPrefetchingOnSRPDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(omnibox::kZeroSuggestPrefetchingOnSRP)},
{"omnibox-zero-suggest-prefetching-on-web",
flag_descriptions::kOmniboxZeroSuggestPrefetchingOnWebName,
flag_descriptions::kOmniboxZeroSuggestPrefetchingOnWebDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(omnibox::kZeroSuggestPrefetchingOnWeb)},
{"omnibox-on-device-tail-suggestions",
flag_descriptions::kOmniboxOnDeviceTailSuggestionsName,
flag_descriptions::kOmniboxOnDeviceTailSuggestionsDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(omnibox::kOnDeviceTailModel)},
{"omnibox-most-visited-tiles-horizontal-render-group",
flag_descriptions::kMostVisitedTilesHorizontalRenderGroupName,
flag_descriptions::kMostVisitedTilesHorizontalRenderGroupDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(omnibox::kMostVisitedTilesHorizontalRenderGroup)},
{"metrickit-non-crash-reports",
flag_descriptions::kMetrickitNonCrashReportName,
flag_descriptions::kMetrickitNonCrashReportDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kMetrickitNonCrashReport)},
{"default-browser-off-cycle-promo",
flag_descriptions::kDefaultBrowserOffCyclePromoName,
flag_descriptions::kDefaultBrowserOffCyclePromoDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kIOSDefaultBrowserOffCyclePromo)},
{"use-default-apps-page-for-promos",
flag_descriptions::kUseDefaultAppsDestinationForPromosName,
flag_descriptions::kUseDefaultAppsDestinationForPromosDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kIOSUseDefaultAppsDestinationForPromos)},
{"use-scene-view-controller",
flag_descriptions::kUseSceneViewControllerName,
flag_descriptions::kUseSceneViewControllerDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kUseSceneViewController)},
{"persistent-default-browser-promo",
flag_descriptions::kPersistentDefaultBrowserPromoName,
flag_descriptions::kPersistentDefaultBrowserPromoDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kPersistentDefaultBrowserPromo)},
{"default-browser-promo-ipad-instructions",
flag_descriptions::kDefaultBrowserPromoIpadInstructionsName,
flag_descriptions::kDefaultBrowserPromoIpadInstructionsDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kDefaultBrowserPromoIpadInstructions)},
{"default-browser-picture-in-picture",
flag_descriptions::kDefaultBrowserPictureInPictureName,
flag_descriptions::kDefaultBrowserPictureInPictureDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kDefaultBrowserPictureInPicture,
kDefaultBrowserPictureInPictureVariations,
"DefaultBrowserPictureInPicture")},
#if BUILDFLAG(IOS_BACKGROUND_MODE_ENABLED)
{"feed-background-refresh-ios",
flag_descriptions::kFeedBackgroundRefreshName,
flag_descriptions::kFeedBackgroundRefreshDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kEnableFeedBackgroundRefresh,
kFeedBackgroundRefreshVariations,
"FeedBackgroundRefresh")},
#endif // BUILDFLAG(IOS_BACKGROUND_MODE_ENABLED)
{"tab-grid-drag-and-drop", flag_descriptions::kTabGridDragAndDropName,
flag_descriptions::kTabGridDragAndDropDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kTabGridDragAndDrop)},
{"tab-grid-new-transitions", flag_descriptions::kTabGridNewTransitionsName,
flag_descriptions::kTabGridNewTransitionsDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kTabGridNewTransitions)},
{"shopping-list", commerce::flag_descriptions::kShoppingListName,
commerce::flag_descriptions::kShoppingListDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(commerce::kShoppingList)},
{"ios-browser-edit-menu-metrics",
flag_descriptions::kIOSBrowserEditMenuMetricsName,
flag_descriptions::kIOSBrowserEditMenuMetricsDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kIOSBrowserEditMenuMetrics)},
{"ios-docking-promo", flag_descriptions::kIOSDockingPromoName,
flag_descriptions::kIOSDockingPromoDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kIOSDockingPromo,
kIOSDockingPromoVariations,
"IOSDockingPromo")},
{"ios-docking-promo-v2", flag_descriptions::kIOSDockingPromoV2Name,
flag_descriptions::kIOSDockingPromoV2Description, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kIOSDockingPromoV2,
kIOSDockingPromoV2Variations,
"IOSDockingPromoV2")},
{"omnibox-grouping-framework-non-zps",
flag_descriptions::kOmniboxGroupingFrameworkForTypedSuggestionsName,
flag_descriptions::kOmniboxGroupingFrameworkForTypedSuggestionsDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(omnibox::kGroupingFrameworkForNonZPS)},
{"bwg-precise-location", flag_descriptions::kBWGPreciseLocationName,
flag_descriptions::kBWGPreciseLocationDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kBWGPreciseLocation)},
{"ai-hub-new-badge", flag_descriptions::kAIHubNewBadgeName,
flag_descriptions::kAIHubNewBadgeDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kAIHubNewBadge)},
{"autofill-payments-field-swapping",
flag_descriptions::kAutofillPaymentsFieldSwappingName,
flag_descriptions::kAutofillPaymentsFieldSwappingDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(autofill::features::kAutofillPaymentsFieldSwapping)},
{"https-upgrades-ios", flag_descriptions::kHttpsUpgradesName,
flag_descriptions::kHttpsUpgradesDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(security_interstitials::features::kHttpsUpgrades)},
{"reader-mode-omnibox-entrypoint-in-us",
flag_descriptions::kReaderModeOmniboxEntrypointInUSName,
flag_descriptions::kReaderModeOmniboxEntrypointInUSDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kEnableReaderModeOmniboxEntryPointInUS)},
{"disable-lens-camera", flag_descriptions::kDisableLensCameraName,
flag_descriptions::kDisableLensCameraDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kDisableLensCamera)},
{"autofill-enable-card-benefits-for-american-express",
flag_descriptions::kAutofillEnableCardBenefitsForAmericanExpressName,
flag_descriptions::
kAutofillEnableCardBenefitsForAmericanExpressDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
autofill::features::kAutofillEnableCardBenefitsForAmericanExpress)},
{"autofill-enable-card-benefits-sync",
flag_descriptions::kAutofillEnableCardBenefitsSyncName,
flag_descriptions::kAutofillEnableCardBenefitsSyncDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableCardBenefitsSync)},
{"autofill-enable-prefetching-risk-data-for-retrieval",
flag_descriptions::kAutofillEnablePrefetchingRiskDataForRetrievalName,
flag_descriptions::
kAutofillEnablePrefetchingRiskDataForRetrievalDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
autofill::features::kAutofillEnablePrefetchingRiskDataForRetrieval)},
{"page-content-annotations", flag_descriptions::kPageContentAnnotationsName,
flag_descriptions::kPageContentAnnotationsDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
page_content_annotations::features::kPageContentAnnotations)},
{"page-content-annotations-remote-page-metadata",
flag_descriptions::kPageContentAnnotationsRemotePageMetadataName,
flag_descriptions::kPageContentAnnotationsRemotePageMetadataDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
page_content_annotations::features::kRemotePageMetadata)},
{"page-info-certificate-information",
flag_descriptions::kViewCertificateInformationName,
flag_descriptions::kViewCertificateInformationDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(page_info_certificate::kViewCertificateInformation)},
{"cpe-passkey-prf-support",
flag_descriptions::kCredentialProviderPasskeyPRFName,
flag_descriptions::kCredentialProviderPasskeyPRFDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kCredentialProviderPasskeyPRF)},
{"migrate-ios-keychain-accessibility",
flag_descriptions::kMigrateIOSKeychainAccessibilityName,
flag_descriptions::kMigrateIOSKeychainAccessibilityDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(crypto::features::kMigrateIOSKeychainAccessibility)},
{"send-tab-to-self-enhanced-handoff",
flag_descriptions::kSendTabToSelfEnhancedHandoffName,
flag_descriptions::kSendTabToSelfEnhancedHandoffDescription,
flags_ui::kOsIos, MULTI_VALUE_TYPE(kSendTabToSelfEnhancedHandoffChoices)},
{"lens-filters-ablation-mode-enabled",
flag_descriptions::kLensFiltersAblationModeEnabledName,
flag_descriptions::kLensFiltersAblationModeEnabledDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kLensFiltersAblationModeEnabled,
kLensFiltersAblationModeVariations,
"LensFiltersAblationMode")},
{"lens-translate-toogle-mode-enabled",
flag_descriptions::kLensTranslateToggleModeEnabledName,
flag_descriptions::kLensTranslateToggleModeEnabledDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kLensTranslateToggleModeEnabled,
kLensTranslateToggleModeVariations,
"LensTranslateToggleMode")},
{"omnibox-mia-zps", flag_descriptions::kOmniboxMiaZpsName,
flag_descriptions::kOmniboxMiaZpsDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(
omnibox_feature_configs::MiaZPS::kOmniboxMiaZPS,
kOmniboxMiaZpsVariations,
"OmniboxMiaZpsVariations")},
{"omnibox-ml-log-url-scoring-signals",
flag_descriptions::kOmniboxMlLogUrlScoringSignalsName,
flag_descriptions::kOmniboxMlLogUrlScoringSignalsDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(omnibox::kLogUrlScoringSignals)},
{"omnibox-ml-url-piecewise-mapped-search-blending",
flag_descriptions::kOmniboxMlUrlPiecewiseMappedSearchBlendingName,
flag_descriptions::kOmniboxMlUrlPiecewiseMappedSearchBlendingDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(
omnibox::kMlUrlPiecewiseMappedSearchBlending,
kMlUrlPiecewiseMappedSearchBlendingVariations,
"MlUrlPiecewiseMappedSearchBlending")},
{"omnibox-ml-url-score-caching",
flag_descriptions::kOmniboxMlUrlScoreCachingName,
flag_descriptions::kOmniboxMlUrlScoreCachingDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(omnibox::kMlUrlScoreCaching)},
{"omnibox-ml-url-scoring", flag_descriptions::kOmniboxMlUrlScoringName,
flag_descriptions::kOmniboxMlUrlScoringDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kMlUrlScoring,
kOmniboxMlUrlScoringVariations,
"MlUrlScoring")},
{"omnibox-ml-url-search-blending",
flag_descriptions::kOmniboxMlUrlSearchBlendingName,
flag_descriptions::kOmniboxMlUrlSearchBlendingDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kMlUrlSearchBlending,
kMlUrlSearchBlendingVariations,
"MlUrlScoring")},
{"omnibox-ml-url-scoring-model",
flag_descriptions::kOmniboxMlUrlScoringModelName,
flag_descriptions::kOmniboxMlUrlScoringModelDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kUrlScoringModel,
kUrlScoringModelVariations,
"MlUrlScoring")},
{"app-background-refresh-ios", flag_descriptions::kAppBackgroundRefreshName,
flag_descriptions::kAppBackgroundRefreshDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kEnableAppBackgroundRefresh)},
{"lens-web-page-load-optimization-enabled",
flag_descriptions::kLensWebPageLoadOptimizationEnabledName,
flag_descriptions::kLensWebPageLoadOptimizationEnabledDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensWebPageLoadOptimizationEnabled)},
{"autofill-unmask-card-request-timeout",
flag_descriptions::kAutofillUnmaskCardRequestTimeoutName,
flag_descriptions::kAutofillUnmaskCardRequestTimeoutDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(autofill::features::kAutofillUnmaskCardRequestTimeout)},
{"autofill-across-iframes", flag_descriptions::kAutofillAcrossIframesName,
flag_descriptions::kAutofillAcrossIframesDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(autofill::features::kAutofillAcrossIframesIos)},
{"enable-trait-collection-registration",
flag_descriptions::kEnableTraitCollectionRegistrationName,
flag_descriptions::kEnableTraitCollectionRegistrationDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kEnableTraitCollectionRegistration)},
{"safe-browsing-local-lists-use-sbv5",
flag_descriptions::kSafeBrowsingLocalListsUseSBv5Name,
flag_descriptions::kSafeBrowsingLocalListsUseSBv5Description,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(safe_browsing::kLocalListsUseSBv5)},
{"ios-shop-card", flag_descriptions::kShopCardName,
flag_descriptions::kShopCardDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(commerce::kTabResumptionShopCard,
kShopCardOverrideOptions,
"TabResumptionShopCard")},
{"ios-shop-card-impression-limits",
flag_descriptions::kShopCardImpressionLimitsName,
flag_descriptions::kShopCardImpressionLimitsDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(commerce::kShopCardImpressionLimits)},
{"ios-segmentation-ephemeral-card-ranker",
flag_descriptions::kSegmentationPlatformEphemeralCardRankerName,
flag_descriptions::kSegmentationPlatformEphemeralCardRankerDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(
segmentation_platform::features::
kSegmentationPlatformEphemeralCardRanker,
kEphemeralCardRankerCardOverrideOptions,
"SegmentationPlatformEphemeralCardRanker")},
{"lens-overlay-enable-landscape-compatibility",
flag_descriptions::kLensOverlayEnableLandscapeCompatibilityName,
flag_descriptions::kLensOverlayEnableLandscapeCompatibilityDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kLensOverlayEnableLandscapeCompatibility)},
{"data-sharing", flag_descriptions::kDataSharingName,
flag_descriptions::kDataSharingDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(data_sharing::features::kDataSharingFeature)},
{"data-sharing-join-only", flag_descriptions::kDataSharingJoinOnlyName,
flag_descriptions::kDataSharingJoinOnlyDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(data_sharing::features::kDataSharingJoinOnly)},
{"ios-soft-lock", flag_descriptions::kIOSSoftLockName,
flag_descriptions::kIOSSoftLockDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kIOSSoftLock,
kIOSSoftLockVariations,
"IOSSoftLock")},
{"lens-unary-apis-with-http-transport-enabled",
flag_descriptions::kLensUnaryApisWithHttpTransportEnabledName,
flag_descriptions::kLensUnaryApisWithHttpTransportEnabledDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kLensUnaryApisWithHttpTransportEnabled)},
{"ios-provisional-notification-alert",
flag_descriptions::kProvisionalNotificationAlertName,
flag_descriptions::kProvisionalNotificationAlertDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kProvisionalNotificationAlert)},
{"autofill-throttle-doc-form-scans",
flag_descriptions::kAutofillThrottleDocumentFormScanName,
flag_descriptions::kAutofillThrottleDocumentFormScanDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kAutofillThrottleDocumentFormScanIos,
kAutofillThrottleDocFormScanVariations,
"AutofillThrottleDocumentFormScan")},
{"autofill-throttle-filtered-doc-form-scan",
flag_descriptions::kAutofillThrottleFilteredDocumentFormScanName,
flag_descriptions::kAutofillThrottleFilteredDocumentFormScanDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(
kAutofillThrottleFilteredDocumentFormScanIos,
kAutofillThrottleFilteredDocFormScanVariations,
"AutofillThrottleFilteredDocumentFormScan")},
{"autofill-payments-sheet-v2",
flag_descriptions::kAutofillPaymentsSheetV2Name,
flag_descriptions::kAutofillPaymentsSheetV2Description, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kAutofillPaymentsSheetV2Ios)},
{"lens-unary-http-transport-enabled",
flag_descriptions::kLensUnaryHttpTransportEnabledName,
flag_descriptions::kLensUnaryHttpTransportEnabledDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensUnaryHttpTransportEnabled)},
{"collaboration-messaging", flag_descriptions::kCollaborationMessagingName,
flag_descriptions::kCollaborationMessagingDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(collaboration::features::kCollaborationMessaging)},
{"lens-single-tap-text-selection-disabled",
flag_descriptions::kLensSingleTapTextSelectionDisabledName,
flag_descriptions::kLensSingleTapTextSelectionDisabledDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensSingleTapTextSelectionDisabled)},
{"updated-fre-screens-sequence", flag_descriptions::kUpdatedFRESequenceName,
flag_descriptions::kUpdatedFRESequenceDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(first_run::kUpdatedFirstRunSequence,
kUpdatedFirstRunSequenceVariations,
"UpdatedFirstRunSequence")},
{"autofill-enable-card-benefits-for-bmo",
flag_descriptions::kAutofillEnableCardBenefitsForBmoName,
flag_descriptions::kAutofillEnableCardBenefitsForBmoDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableCardBenefitsForBmo)},
{"download-auto-deletion", flag_descriptions::kDownloadAutoDeletionName,
flag_descriptions::kDownloadAutoDeletionDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kDownloadAutoDeletionFeatureEnabled)},
{"download-auto-deletion-clear-files-on-every-startup",
flag_descriptions::kDownloadAutoDeletionClearFilesOnEveryStartupName,
flag_descriptions::
kDownloadAutoDeletionClearFilesOnEveryStartupDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kDownloadAutoDeletionClearFilesOnEveryStartup)},
{"download-list-ios", flag_descriptions::kDownloadListName,
flag_descriptions::kDownloadListDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kDownloadList,
kDownloadListVariations,
"IOSDownloadList")},
{"animated-default-browser-promo-in-fre",
flag_descriptions::kAnimatedDefaultBrowserPromoInFREName,
flag_descriptions::kAnimatedDefaultBrowserPromoInFREDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(
first_run::kAnimatedDefaultBrowserPromoInFRE,
kAnimatedDefaultBrowserPromoInFREVariations,
"AnimatedDBPInFRE-Layout")},
{"fullscreen-transition-speed",
flag_descriptions::kFullscreenTransitionSpeedName,
flag_descriptions::kFullscreenTransitionSpeedDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kFullscreenTransitionSpeed,
kFullscreenTransitionVariations,
"IOSFullscreenTransitionSpeed")},
{"refactor-toolbars-size", flag_descriptions::kRefactorToolbarsSizeName,
flag_descriptions::kRefactorToolbarsSizeDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kRefactorToolbarsSize)},
{"lens-gesture-text-selection-disabled",
flag_descriptions::kLensGestureTextSelectionDisabledName,
flag_descriptions::kLensGestureTextSelectionDisabledDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensGestureTextSelectionDisabled)},
{"ios-best-features-screen",
flag_descriptions::kBestFeaturesScreenInFirstRunName,
flag_descriptions::kBestFeaturesScreenInFirstRunDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(first_run::kBestFeaturesScreenInFirstRun,
kBestFeaturesScreenInFirstRunVariations,
"BestFeaturesScreenInFirstRun")},
{"manual-log-uploads-in-the-fre",
flag_descriptions::kManualLogUploadsInFREName,
flag_descriptions::kManualLogUploadsInFREDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(first_run::kManualLogUploadsInTheFRE)},
{"lens-unary-api-salient-text-enabled",
flag_descriptions::kLensUnaryApiSalientTextEnabledName,
flag_descriptions::kLensUnaryApiSalientTextEnabledDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensUnaryApiSalientTextEnabled)},
{"ios-one-tap-mini-map-restrictions",
flag_descriptions::kIOSOneTapMiniMapRestrictionsName,
flag_descriptions::kIOSOneTapMiniMapRestrictionsDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kIOSOneTapMiniMapRestrictions,
kIOSOneTapMiniMapRestrictionsVariations,
"IOSOneTapMiniMapRestrictions")},
{"lens-block-fetch-objects-interaction-rpcs-on-separate-handshake",
flag_descriptions::
kLensBlockFetchObjectsInteractionRPCsOnSeparateHandshakeName,
flag_descriptions::
kLensBlockFetchObjectsInteractionRPCsOnSeparateHandshakeDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
kLensBlockFetchObjectsInteractionRPCsOnSeparateHandshake)},
{"lens-prewarm-hard-stickiness-in-input-selection",
flag_descriptions::kLensPrewarmHardStickinessInInputSelectionName,
flag_descriptions::kLensPrewarmHardStickinessInInputSelectionDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kLensPrewarmHardStickinessInInputSelection)},
{"lens-prewarm-hard-stickiness-in-query-formulation",
flag_descriptions::kLensPrewarmHardStickinessInQueryFormulationName,
flag_descriptions::kLensPrewarmHardStickinessInQueryFormulationDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kLensPrewarmHardStickinessInQueryFormulation)},
{"enhanced-calendar", flag_descriptions::kEnhancedCalendarName,
flag_descriptions::kEnhancedCalendarDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kEnhancedCalendar)},
{"explain-gemini-edit-menu", flag_descriptions::kExplainGeminiEditMenuName,
flag_descriptions::kExplainGeminiEditMenuDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kExplainGeminiEditMenu,
kPositionForExplainGeminiEditMenu,
"ExplainGeminiEditMenu")},
{"data-sharing-debug-logs", flag_descriptions::kDataSharingDebugLogsName,
flag_descriptions::kDataSharingDebugLogsDescription, flags_ui::kOsIos,
SINGLE_VALUE_TYPE(data_sharing::kDataSharingDebugLoggingEnabled)},
{"supervised-user-block-interstitial-v3",
flag_descriptions::kSupervisedUserBlockInterstitialV3Name,
flag_descriptions::kSupervisedUserBlockInterstitialV3Description,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(supervised_user::kSupervisedUserBlockInterstitialV3)},
{"supervised-user-emit-log-record-separately",
flag_descriptions::kSupervisedUserEmitLogRecordSeparatelyName,
flag_descriptions::kSupervisedUserEmitLogRecordSeparatelyDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
supervised_user::kSupervisedUserEmitLogRecordSeparately)},
{"supervised-user-merge-device-parental-controls-and-family-link-prefs",
flag_descriptions::
kSupervisedUserMergeDeviceParentalControlsAndFamilyLinkPrefsName,
flag_descriptions::
kSupervisedUserMergeDeviceParentalControlsAndFamilyLinkPrefsDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
supervised_user::
kSupervisedUserMergeDeviceParentalControlsAndFamilyLinkPrefs)},
{"supervised-user-use-url-filtering-service",
flag_descriptions::kSupervisedUserUseUrlFilteringServiceName,
flag_descriptions::kSupervisedUserUseUrlFilteringServiceDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
supervised_user::kSupervisedUserUseUrlFilteringService)},
{"lens-fetch-srp-api-enabled",
flag_descriptions::kLensFetchSrpApiEnabledName,
flag_descriptions::kLensFetchSrpApiEnabledDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kLensFetchSrpApiEnabled)},
{"autofill-enable-card-info-runtime-retrieval",
flag_descriptions::kAutofillEnableCardInfoRuntimeRetrievalName,
flag_descriptions::kAutofillEnableCardInfoRuntimeRetrievalDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
autofill::features::kAutofillEnableCardInfoRuntimeRetrieval)},
{"feed-swipe-iph", flag_descriptions::kFeedSwipeInProductHelpName,
flag_descriptions::kFeedSwipeInProductHelpDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kFeedSwipeInProductHelp,
kFeedSwipeInProductHelpVariations,
"FeedSwipeInProductHelp")},
{"notification-collision-management",
flag_descriptions::kNotificationCollisionManagementName,
flag_descriptions::kNotificationCollisionManagementDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kNotificationCollisionManagement)},
{"ntp-mia-entrypoint", flag_descriptions::kNTPMIAEntrypointName,
flag_descriptions::kNTPMIAEntrypointDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kNTPMIAEntrypoint,
kNTPMIAEntrypointVariations,
"kNTPMIAEntrypoint")},
{"autofill-enable-support-for-home-and-work",
flag_descriptions::kAutofillEnableSupportForHomeAndWorkName,
flag_descriptions::kAutofillEnableSupportForHomeAndWorkDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
autofill::features::kAutofillEnableSupportForHomeAndWork)},
{"lens-overlay-navigation-history",
flag_descriptions::kLensOverlayNavigationHistoryName,
flag_descriptions::kLensOverlayNavigationHistoryDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensOverlayNavigationHistory)},
{"lens-overlay-custom-bottom-sheet",
flag_descriptions::kLensOverlayCustomBottomSheetName,
flag_descriptions::kLensOverlayCustomBottomSheetDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensOverlayCustomBottomSheet)},
{"page-action-menu", flag_descriptions::kPageActionMenuName,
flag_descriptions::kPageActionMenuDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kPageActionMenu,
kPageActionMenuVariations,
"IOSPageActionMenu")},
{"proactive-suggestions-framework",
flag_descriptions::kProactiveSuggestionsFrameworkName,
flag_descriptions::kProactiveSuggestionsFrameworkDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kProactiveSuggestionsFramework,
kProactiveSuggestionsFrameworkVariations,
"ProactiveSuggestionsFramework")},
{"ask-gemini-chip", flag_descriptions::kAskGeminiChipName,
flag_descriptions::kAskGeminiChipDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kAskGeminiChip,
kAskGeminiChipVariations,
"IOSAskGeminiChip")},
{"gemini-copresence", flag_descriptions::kGeminiCopresenceName,
flag_descriptions::kGeminiCopresenceDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kGeminiCopresence,
kGeminiCopresenceVariations,
"GeminiCopresence")},
{"bwg-promo-consent", flag_descriptions::kBWGPromoConsentName,
flag_descriptions::kBWGPromoConsentDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kBWGPromoConsent,
kBWGPromoConsentVariations,
"IOSBWGPromoConsent")},
{"safe-browsing-trusted-url",
flag_descriptions::kSafeBrowsingTrustedURLName,
flag_descriptions::kSafeBrowsingTrustedURLDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kSafeBrowsingTrustedURL)},
{"sync-trusted-vault-infobar-message-improvements",
flag_descriptions::kSyncTrustedVaultInfobarMessageImprovementsName,
flag_descriptions::kSyncTrustedVaultInfobarMessageImprovementsDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(syncer::kSyncTrustedVaultInfobarMessageImprovements)},
{"autofill-vcn-enroll-strike-expiry-time",
flag_descriptions::kAutofillVcnEnrollStrikeExpiryTimeName,
flag_descriptions::kAutofillVcnEnrollStrikeExpiryTimeDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(
autofill::features::kAutofillVcnEnrollStrikeExpiryTime,
kAutofillVcnEnrollStrikeExpiryTimeOptions,
"AutofillVcnEnrollStrikeExpiryTime")},
{"ios-welcome-back-screen", flag_descriptions::kWelcomeBackName,
flag_descriptions::kWelcomeBackDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kWelcomeBack,
kWelcomeBackVariations,
"WelcomeBack")},
{"autofill-enable-flat-rate-card-benefits-from-curinos",
flag_descriptions::kAutofillEnableFlatRateCardBenefitsFromCurinosName,
flag_descriptions::
kAutofillEnableFlatRateCardBenefitsFromCurinosDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
autofill::features::kAutofillEnableFlatRateCardBenefitsFromCurinos)},
{"reader-mode-translation-with-infobar-enabled",
flag_descriptions::kReaderModeTranslationWithInfobarName,
flag_descriptions::kReaderModeTranslationWithInfobarDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kEnableReaderModeTranslationWithInfobar)},
{"reader-mode-optimization-guide-eligibility",
flag_descriptions::kReaderModeOptimizationGuideEligibilityName,
flag_descriptions::kReaderModeOptimizationGuideEligibilityDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kEnableReaderModeOptimizationGuideEligibility)},
{"reader-mode-readability-heuristic-enabled",
flag_descriptions::kReaderModeReadabilityHeuristicName,
flag_descriptions::kReaderModeReadabilityHeuristicDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kEnableReadabilityHeuristic)},
{"reader-mode-support-new-fonts",
flag_descriptions::kReaderModeSupportNewFontsName,
flag_descriptions::kReaderModeSupportNewFontsDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(dom_distiller::kReaderModeSupportNewFonts)},
{"reader-mode-us-enabled", flag_descriptions::kReaderModeUSEnabledName,
flag_descriptions::kReaderModeUSEnabledDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kEnableReaderModeInUS)},
{"reader-mode-readability-distiller-enabled",
flag_descriptions::kReaderModeReadabilityDistillerName,
flag_descriptions::kReaderModeReadabilityDistillerDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(dom_distiller::kReaderModeUseReadability)},
{"reader-mode-content-settings-for-links",
flag_descriptions::kReaderModeContentSettingsForLinksName,
flag_descriptions::kReaderModeContentSettingsForLinksDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kEnableContentSettingsOptionForLinks)},
{"best-of-app-fre", flag_descriptions::kBestOfAppFREName,
flag_descriptions::kBestOfAppFREDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kBestOfAppFRE,
kBestOfAppFREVariations,
"BestOfAppFRE")},
{"use-new-feed-eligibility-service",
flag_descriptions::kUseFeedEligibilityServiceName,
flag_descriptions::kUseFeedEligibilityServiceDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kUseFeedEligibilityService)},
{"enable-profile-reporting",
flag_descriptions::kIOSEnableCloudProfileReportingName,
flag_descriptions::kIOSEnableCloudProfileReportingDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(enterprise_reporting::kCloudProfileReporting)},
{"browser-report-include-all-profiles",
flag_descriptions::kIOSBrowserReportIncludeAllProfilesName,
flag_descriptions::kIOSBrowserReportIncludeAllProfilesDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
enterprise_reporting::kBrowserReportIncludeAllProfiles)},
{"lens-load-aim-in-lens-result-page",
flag_descriptions::kLensLoadAIMInLensResultPageName,
flag_descriptions::kLensLoadAIMInLensResultPageDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensLoadAIMInLensResultPage)},
{"lens-exact-matches-enabled",
flag_descriptions::kLensExactMatchesEnabledName,
flag_descriptions::kLensExactMatchesEnabledDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kLensExactMatchesEnabled)},
{"disable-autofill-strike-system",
flag_descriptions::kDisableAutofillStrikeSystemName,
flag_descriptions::kDisableAutofillStrikeSystemDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(strike_database::features::kDisableStrikeSystem)},
{"ios-default-browser-promo-propensity-model",
flag_descriptions::kDefaultBrowserPromoPropensityModelName,
flag_descriptions::kDefaultBrowserPromoPropensityModelDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
segmentation_platform::features::kDefaultBrowserPromoPropensityModel)},
{"shopping-alternate-server",
commerce::flag_descriptions::kShoppingAlternateServerName,
commerce::flag_descriptions::kShoppingAlternateServerDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(commerce::kShoppingAlternateServer)},
{"taiyaki-all-surfaces", flag_descriptions::kTaiyakiAllSurfacesName,
flag_descriptions::kTaiyakiAllSurfacesDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(switches::kTaiyakiAllSurfaces)},
{"lens-camera-no-still-output-required",
flag_descriptions::kLensCameraNoStillOutputRequiredName,
flag_descriptions::kLensCameraNoStillOutputRequiredDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensCameraNoStillOutputRequired)},
{"lens-camera-unbinned-capture-formats-preferred",
flag_descriptions::kLensCameraUnbinnedCaptureFormatsPreferredName,
flag_descriptions::kLensCameraUnbinnedCaptureFormatsPreferredDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kLensCameraUnbinnedCaptureFormatsPreferred)},
{"lens-continuous-zoom-enabled",
flag_descriptions::kLensContinuousZoomEnabledName,
flag_descriptions::kLensContinuousZoomEnabledDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kLensContinuousZoomEnabled)},
{"lens-initial-lvf-zoom-level-90-percent",
flag_descriptions::kLensInitialLvfZoomLevel90PercentName,
flag_descriptions::kLensInitialLvfZoomLevel90PercentDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensInitialLvfZoomLevel90Percent)},
{"lens-triple-camera-enabled",
flag_descriptions::kLensTripleCameraEnabledName,
flag_descriptions::kLensTripleCameraEnabledDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kLensTripleCameraEnabled)},
// LINT.IfChange(DataSharingVersioning)
{"shared-data-types-kill-switch",
flag_descriptions::kDataSharingVersioningStatesName,
flag_descriptions::kDataSharingVersioningStatesDescription,
flags_ui::kOsIos, MULTI_VALUE_TYPE(kDataSharingVersioningStateChoices)},
// LINT.ThenChange(//chrome/browser/about_flags.cc:DataSharingVersioning)
{"share-ablation-hide-share-in-toolbar",
flag_descriptions::kDisableShareButtonName,
flag_descriptions::kDisableShareButtonDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kDisableShareButton)},
{"share-ablation-omnibox-long-press",
flag_descriptions::kShareInOmniboxLongPressName,
flag_descriptions::kShareInOmniboxLongPressDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kShareInOmniboxLongPress)},
{"share-ablation-omnibox-overflow-menu",
flag_descriptions::kShareInOverflowMenuName,
flag_descriptions::kShareInOverflowMenuDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kShareInOverflowMenu)},
{"share-ablation-verbatim-match",
flag_descriptions::kShareInVerbatimMatchName,
flag_descriptions::kShareInVerbatimMatchDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kShareInVerbatimMatch)},
{"ios-trusted-vault-notification",
flag_descriptions::kIOSTrustedVaultNotificationName,
flag_descriptions::kIOSTrustedVaultNotificationDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kIOSTrustedVaultNotification)},
{"omnibox-drs-prototype", flag_descriptions::kOmniboxDRSPrototypeName,
flag_descriptions::kOmniboxDRSPrototypeDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kOmniboxDRSPrototype)},
{"sync-autofill-wallet-credential-data",
flag_descriptions::kSyncAutofillWalletCredentialDataName,
flag_descriptions::kSyncAutofillWalletCredentialDataDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(syncer::kSyncAutofillWalletCredentialData)},
{"autofill-enable-cvc-storage-and-filling",
flag_descriptions::kAutofillEnableCvcStorageAndFillingName,
flag_descriptions::kAutofillEnableCvcStorageAndFillingDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
autofill::features::kAutofillEnableCvcStorageAndFilling)},
{"autofill-enable-cvc-storage-and-filling-enhancement",
flag_descriptions::kAutofillEnableCvcStorageAndFillingEnhancementName,
flag_descriptions::
kAutofillEnableCvcStorageAndFillingEnhancementDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
autofill::features::kAutofillEnableCvcStorageAndFillingEnhancement)},
{"autofill-enable-cvc-storage-and-filling-standalone-form-enhancement",
flag_descriptions::
kAutofillEnableCvcStorageAndFillingStandaloneFormEnhancementName,
flag_descriptions::
kAutofillEnableCvcStorageAndFillingStandaloneFormEnhancementDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
autofill::features::
kAutofillEnableCvcStorageAndFillingStandaloneFormEnhancement)},
{"rcaps-dynamic-profile-country",
flag_descriptions::kRcapsDynamicProfileCountryName,
flag_descriptions::kRcapsDynamicProfileCountryDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(switches::kDynamicProfileCountry)},
{"ios-skip-fre-default-browser-promo-in-eea",
flag_descriptions::kSkipDefaultBrowserPromoInFirstRunName,
flag_descriptions::kSkipDefaultBrowserPromoInFirstRunDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(first_run::kSkipDefaultBrowserPromoInFirstRun)},
{"apply-clientside-model-predictions-for-password-types",
flag_descriptions::kApplyClientsideModelPredictionsForPasswordTypesName,
flag_descriptions::
kApplyClientsideModelPredictionsForPasswordTypesDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(password_manager::features::
kApplyClientsideModelPredictionsForPasswordTypes)},
{"cpe-passkey-largeblob-support",
flag_descriptions::kCredentialProviderPasskeyLargeBlobName,
flag_descriptions::kCredentialProviderPasskeyLargeBlobDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kCredentialProviderPasskeyLargeBlob)},
{"autofill-credit-card-scanner-ios",
flag_descriptions::kAutofillCreditCardScannerIosName,
flag_descriptions::kAutofillCreditCardScannerIosDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(autofill::features::kAutofillCreditCardScannerIos)},
{"lens-strokes-api-enabled", flag_descriptions::kStrokesAPIEnabledName,
flag_descriptions::kStrokesAPIEnabledDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kLensStrokesAPIEnabled)},
{"composebox-deep-search", flag_descriptions::kComposeboxDeepSearchName,
flag_descriptions::kComposeboxDeepSearchDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kComposeboxDeepSearch)},
{"composebox-server-side-state",
flag_descriptions::kComposeboxServerSideStateName,
flag_descriptions::kComposeboxServerSideStateDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kComposeboxServerSideState)},
{"composebox-devtools", flag_descriptions::kComposeboxDevToolsName,
flag_descriptions::kComposeboxDevToolsDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kComposeboxDevTools,
kComposeboxDevToolsVariations,
"ComposeboxDevTools")},
{"autofill-manual-testing-data",
flag_descriptions::kAutofillManualTestingDataName,
flag_descriptions::kAutofillManualTestingDataDescription, flags_ui::kOsIos,
STRING_VALUE_TYPE(autofill::kManualContentImportForTestingFlag, "")},
{"autofill-enable-support-for-name-and-email-profile",
flag_descriptions::kAutofillEnableSupportForNameAndEmailName,
flag_descriptions::kAutofillEnableSupportForNameAndEmailDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
autofill::features::kAutofillEnableSupportForNameAndEmail)},
{"mobile-promo-on-desktop-data-collection",
flag_descriptions::kMobilePromoOnDesktopRecordActiveDaysName,
flag_descriptions::kMobilePromoOnDesktopRecordActiveDaysDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kMobilePromoOnDesktopRecordActiveDays)},
{"mobile-promo-on-desktop-with-reminder",
flag_descriptions::kMobilePromoOnDesktopName,
flag_descriptions::kMobilePromoOnDesktopDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kMobilePromoOnDesktopWithReminder,
kMobilePromoOnDesktopVariations,
"MobilePromoOnDesktopWithReminder")},
{"lens-search-headers-check-enabled",
flag_descriptions::kLensSearchHeadersCheckEnabledName,
flag_descriptions::kLensSearchHeadersCheckEnabledDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensSearchHeadersCheckEnabled)},
{"autofill-bottom-sheet-new-blur",
flag_descriptions::kAutofillBottomSheetNewBlurName,
flag_descriptions::kAutofillBottomSheetNewBlurDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kAutofillBottomSheetNewBlur)},
{"hide-fusebox-voice-lens-actions",
flag_descriptions::kHideFuseboxVoiceLensActionsName,
flag_descriptions::kHideFuseboxVoiceLensActionsDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kHideFuseboxVoiceLensActions)},
{"hide-toolbars-in-overflow-menu",
flag_descriptions::kHideToolbarsInOverflowMenuName,
flag_descriptions::kHideToolbarsInOverflowMenuDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kHideToolbarsInOverflowMenu)},
{"smart-tab-grouping", flag_descriptions::kSmartTabGroupingName,
flag_descriptions::kSmartTabGroupingDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kSmartTabGrouping)},
{"persist-tab-context", flag_descriptions::kPersistTabContextName,
flag_descriptions::kPersistTabContextDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kPersistTabContext,
kPersistTabContextVariations,
"PersistTabContext")},
{"composebox-immersive-srp", flag_descriptions::kComposeboxImmersiveSRPName,
flag_descriptions::kComposeboxImmersiveSRPDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kComposeboxImmersiveSRP)},
{"composebox-uses-chrome-compose-client",
flag_descriptions::kNtpComposeboxUsesChromeComposeClientName,
flag_descriptions::kNtpComposeboxUsesChromeComposeClientDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(omnibox::kComposeboxUsesChromeComposeClient)},
{"ios-custom-file-upload-menu",
flag_descriptions::kIOSCustomFileUploadMenuName,
flag_descriptions::kIOSCustomFileUploadMenuDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kIOSCustomFileUploadMenu)},
{"ios-tab-group-entry-point-overflow-menu",
flag_descriptions::kTabGroupInOverflowMenuName,
flag_descriptions::kTabGroupInOverflowMenuDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kTabGroupInOverflowMenu)},
{"ios-tab-group-entry-point-tab-icon",
flag_descriptions::kTabGroupInTabIconContextMenuName,
flag_descriptions::kTabGroupInTabIconContextMenuDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kTabGroupInTabIconContextMenu)},
{"ios-tab-group-entry-point-tab-recall",
flag_descriptions::kTabRecallNewTabGroupButtonName,
flag_descriptions::kTabRecallNewTabGroupButtonDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kTabRecallNewTabGroupButton)},
{"ios-tab-group-entry-point-tab-switcher",
flag_descriptions::kTabSwitcherOverflowMenuName,
flag_descriptions::kTabSwitcherOverflowMenuDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kTabSwitcherOverflowMenu)},
{"cache-identity-list-in-chrome",
flag_descriptions::kCacheIdentityListInChromeName,
flag_descriptions::kCacheIdentityListInChromeDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(switches::kCacheIdentityListInChrome)},
{"gemini-dynamic-settings", flag_descriptions::kGeminiDynamicSettingsName,
flag_descriptions::kGeminiDynamicSettingsDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiDynamicSettings)},
{"enable-ac-prefetch", flag_descriptions::kEnableACPrefetchName,
flag_descriptions::kEnableACPrefetchDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(switches::kEnableACPrefetch)},
{"show-tab-group-in-grid-on-start",
flag_descriptions::kShowTabGroupInGridOnStartName,
flag_descriptions::kShowTabGroupInGridOnStartDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kShowTabGroupInGridOnStart)},
{"ios-tips-notifications-string-alternatives",
flag_descriptions::kIOSTipsNotificationsStringAlternativesName,
flag_descriptions::kIOSTipsNotificationsStringAlternativesDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(
kIOSTipsNotificationsAlternativeStrings,
kTipsNotificationsAlternativeStringVariation,
"IOSTipsNotificationsAlternativeStrings")},
{"variations-experimental-corpus",
flag_descriptions::kVariationsExperimentalCorpusName,
flag_descriptions::kVariationsExperimentalCorpusDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kVariationsExperimentalCorpus)},
{"variations-restrict-dogfood",
flag_descriptions::kVariationsRestrictDogfoodName,
flag_descriptions::kVariationsRestrictDogfoodDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kVariationsRestrictDogfood)},
{"zero-state-suggestions", flag_descriptions::kZeroStateSuggestionsName,
flag_descriptions::kZeroStateSuggestionsDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kZeroStateSuggestions,
kZeroStateSuggestionsVariations,
"ZeroStateSuggestions")},
{"ios-synced-set-up", flag_descriptions::kIOSSyncedSetUpName,
flag_descriptions::kIOSSyncedSetUpDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kIOSSyncedSetUp)},
{"gemini-floaty-all-pages", flag_descriptions::kGeminiFloatyAllPagesName,
flag_descriptions::kGeminiFloatyAllPagesDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiFloatyAllPages)},
{"ios-save-to-drive-client-folder",
flag_descriptions::kIOSSaveToDriveClientFolderName,
flag_descriptions::kIOSSaveToDriveClientFolderDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kIOSSaveToDriveClientFolder)},
{"disable-keyboard-accessory",
flag_descriptions::kDisableKeyboardAccessoryName,
flag_descriptions::kDisableKeyboardAccessoryDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kDisableKeyboardAccessory,
kDisableKeyboardAccessoryVariations,
"DisableKeyboardAccessoryVariations")},
{"enable-fusebox-keyboard-accessory",
flag_descriptions::kEnableFuseboxKeyboardAccessoryName,
flag_descriptions::kEnableFuseboxKeyboardAccessoryDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(
kEnableFuseboxKeyboardAccessory,
kEnableFuseboxKeyboardAccessoryVariations,
"EnableFuseboxKeyboardAccessoryVariations")},
{"mdm-errors-for-dasher-accounts-handling",
flag_descriptions::kHandleMdmErrorsForDasherAccountsName,
flag_descriptions::kHandleMdmErrorsForDasherAccountsDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(switches::kHandleMdmErrorsForDasherAccounts)},
{"location-bar-badge-migration",
flag_descriptions::kLocationBarBadgeMigrationName,
flag_descriptions::kLocationBarBadgeMigrationDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kLocationBarBadgeMigration)},
{"composebox-additional-advanced-tools",
flag_descriptions::kComposeboxAdditionalAdvancedToolsName,
flag_descriptions::kComposeboxAdditionalAdvancedToolsDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kComposeboxAdditionalAdvancedTools)},
{"composebox-close-button-top-align",
flag_descriptions::kComposeboxCloseButtonTopAlignName,
flag_descriptions::kComposeboxCloseButtonTopAlignDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kComposeboxCloseButtonTopAlign)},
{"composebox-compact-mode", flag_descriptions::kComposeboxCompactModeName,
flag_descriptions::kComposeboxCompactModeDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kComposeboxCompactMode)},
{"composebox-force-top", flag_descriptions::kComposeboxForceTopName,
flag_descriptions::kComposeboxForceTopDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kComposeboxForceTop)},
{"composebox-aim-nudge", flag_descriptions::kComposeboxAIMNudgeName,
flag_descriptions::kComposeboxAIMNudgeDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kComposeboxAIMNudge)},
{"composebox-ios", flag_descriptions::kComposeboxIOSName,
flag_descriptions::kComposeboxIOSDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kComposeboxIOS)},
{"gemini-navigation-promo", flag_descriptions::kGeminiNavigationPromoName,
flag_descriptions::kGeminiNavigationPromoDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiNavigationPromo)},
{"fre-sign-in-header-text-update",
flag_descriptions::kFRESignInHeaderTextUpdateName,
flag_descriptions::kFRESignInHeaderTextUpdateDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kFRESignInHeaderTextUpdate,
kFRESignInHeaderTextUpdateVariations,
"FRESignInHeaderTextUpdate")},
{"most-visited-tiles-customization-ios",
flag_descriptions::kMostVisitedTilesCustomizationName,
flag_descriptions::kMostVisitedTilesCustomizationDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kMostVisitedTilesCustomizationIOS)},
{"tab-group-color-on-surface",
flag_descriptions::kTabGroupColorOnSurfaceName,
flag_descriptions::kTabGroupColorOnSurfaceDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kTabGroupColorOnSurface)},
{"gemini-live", flag_descriptions::kGeminiLiveName,
flag_descriptions::kGeminiLiveDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiLive)},
{"omnibox-crash-fix-kill-switch",
flag_descriptions::kOmniboxCrashFixKillSwitchName,
flag_descriptions::kOmniboxCrashFixKillSwitchDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kOmniboxCrashFixKillSwitch)},
{"aim-eligibility-service-start-with-profile",
flag_descriptions::kAIMEligibilityServiceStartWithProfileName,
flag_descriptions::kAIMEligibilityServiceStartWithProfileDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kAIMEligibilityServiceStartWithProfile)},
{"lens-omnient-shader-v2-enabled",
flag_descriptions::kLensOmnientShaderV2EnabledName,
flag_descriptions::kLensOmnientShaderV2EnabledDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kLensOmnientShaderV2Enabled)},
{"lens-stream-service-web-channel-transport-enabled",
flag_descriptions::kLensStreamServiceWebChannelTransportEnabledName,
flag_descriptions::kLensStreamServiceWebChannelTransportEnabledDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kLensStreamServiceWebChannelTransportEnabled)},
{"aimntp-entrypoint-tablet", flag_descriptions::kAIMNTPEntrypointTabletName,
flag_descriptions::kAIMNTPEntrypointTabletDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kAIMNTPEntrypointTablet)},
{"aim-eligibility-refresh-ntp-modules",
flag_descriptions::kAIMEligibilityRefreshNTPModulesName,
flag_descriptions::kAIMEligibilityRefreshNTPModulesDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kAIMEligibilityRefreshNTPModules)},
{"ios-web-context-menu-new-title",
flag_descriptions::kIOSWebContextMenuNewTitleName,
flag_descriptions::kIOSWebContextMenuNewTitleDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kIOSWebContextMenuNewTitle)},
{"composebox-menu-title", flag_descriptions::kComposeboxMenuTitleName,
flag_descriptions::kComposeboxMenuTitleDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kComposeboxMenuTitle)},
{"gemini-refactored-fre", flag_descriptions::kGeminiRefactoredFREName,
flag_descriptions::kGeminiRefactoredFREDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiRefactoredFRE)},
{"composebox-fetch-contextual-suggestions-for-multiple-attachments",
flag_descriptions::
kComposeboxFetchContextualSuggestionsForMultipleAttachmentsName,
flag_descriptions::
kComposeboxFetchContextualSuggestionsForMultipleAttachmentsDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
kComposeboxFetchContextualSuggestionsForMultipleAttachments)},
{"composebox-attachments-typed-state",
flag_descriptions::kComposeboxAttachmentsTypedStateName,
flag_descriptions::kComposeboxAttachmentsTypedStateDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(omnibox::kComposeboxAttachmentsTypedState)},
{"password-removal-from-delete-browsing-data",
flag_descriptions::kPasswordRemovalFromDeleteBrowsingDataName,
flag_descriptions::kPasswordRemovalFromDeleteBrowsingDataDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kPasswordRemovalFromDeleteBrowsingData)},
{"close-other-tabs", flag_descriptions::kCloseOtherTabsName,
flag_descriptions::kCloseOtherTabsDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kCloseOtherTabs)},
{"autofill-enable-wallet-branding",
flag_descriptions::kAutofillEnableWalletBrandingName,
flag_descriptions::kAutofillEnableWalletBrandingDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(autofill::features::kAutofillEnableWalletBranding)},
{"assistant-container", flag_descriptions::kAssistantContainerName,
flag_descriptions::kAssistantContainerDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kAssistantContainer,
kAssistantContainerVariations,
"AssistantContainer")},
{"composebox-ipad", flag_descriptions::kComposeboxIpadName,
flag_descriptions::kComposeboxIpadDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kComposeboxIpad)},
{"chrome-next-ia", flag_descriptions::kChromeNextIaName,
flag_descriptions::kChromeNextIaDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kChromeNextIa)},
{"gemini-image-remix-tool", flag_descriptions::kGeminiImageRemixToolName,
flag_descriptions::kGeminiImageRemixToolDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kGeminiImageRemixTool,
kGeminiImageRemixToolVariations,
"GeminiImageRemixTool")},
{"composebox-aim-disabled", flag_descriptions::kComposeboxAIMDisabledName,
flag_descriptions::kComposeboxAIMDisabledDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kComposeboxAIMDisabled)},
{"enable-new-startup-flow", flag_descriptions::kEnableNewStartupFlowName,
flag_descriptions::kEnableNewStartupFlowDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kEnableNewStartupFlow)},
{"gemini-updated-eligibility",
flag_descriptions::kGeminiUpdatedEligibilityName,
flag_descriptions::kGeminiUpdatedEligibilityDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiUpdatedEligibility)},
{"enable-file-download-connector-ios",
flag_descriptions::kEnableFileDownloadConnectorIOSName,
flag_descriptions::kEnableFileDownloadConnectorIOSDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
enterprise_connectors::kEnableFileDownloadConnectorIOS)},
{"disable-composebox-from-aimntp",
flag_descriptions::kDisableComposeboxFromAIMNTPName,
flag_descriptions::kDisableComposeboxFromAIMNTPDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kDisableComposeboxFromAIMNTP)},
{"ios-save-to-drive-signed-out",
flag_descriptions::kIOSSaveToDriveSignedOutName,
flag_descriptions::kIOSSaveToDriveSignedOutDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kIOSSaveToDriveSignedOut)},
{"autofill-enable-bottom-sheet-scan-card-and-fill",
flag_descriptions::kAutofillEnableBottomSheetScanCardAndFillName,
flag_descriptions::kAutofillEnableBottomSheetScanCardAndFillDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
autofill::features::kAutofillEnableBottomSheetScanCardAndFill)},
{"gemini-response-view-dynamic-resizing",
flag_descriptions::kGeminiResponseViewDynamicResizingName,
flag_descriptions::kGeminiResponseViewDynamicResizingDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kGeminiResponseViewDynamicResizing)},
{"fs-no-broadcast-experiment",
flag_descriptions::kSmoothScrollingUseDelegateName,
flag_descriptions::kSmoothScrollingUseDelegateDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(web::features::kSmoothScrollingUseDelegate)},
{"model-based-page-classification",
flag_descriptions::kModelBasedPageClassificationName,
flag_descriptions::kModelBasedPageClassificationDescription,
flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kModelBasedPageClassification,
kModelBasedPageClassificationVariations,
"ModelBasedPageClassification")},
{"page-action-menu-icon", flag_descriptions::kPageActionMenuIconName,
flag_descriptions::kPageActionMenuIconDescription, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kPageActionMenuIcon,
kPageActionMenuIconVariations,
"PageActionMenuIcon")},
{"ios-choose-from-drive-signed-out",
flag_descriptions::kIOSChooseFromDriveSignedOutName,
flag_descriptions::kIOSChooseFromDriveSignedOutDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kIOSChooseFromDriveSignedOut)},
{"ios-save-to-photos-signed-out",
flag_descriptions::kIOSSaveToPhotosSignedOutName,
flag_descriptions::kIOSSaveToPhotosSignedOutDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kIOSSaveToPhotosSignedOut)},
{"aim-cobrowse", flag_descriptions::kAimCobrowseName,
flag_descriptions::kAimCobrowseDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kAimCobrowse)},
{"aim-cobrowse-debug-entrypoint",
flag_descriptions::kAIMCobrowseDebugEntrypointName,
flag_descriptions::kAIMCobrowseDebugEntrypointDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kAIMCobrowseDebugEntrypoint)},
{"ios-date-to-calendar-signed-out",
flag_descriptions::kIOSDateToCalendarSignedOutName,
flag_descriptions::kIOSDateToCalendarSignedOutDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kIOSDateToCalendarSignedOut)},
{"gemini-backend-migration", flag_descriptions::kGeminiBackendMigrationName,
flag_descriptions::kGeminiBackendMigrationDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiBackendMigration)},
{"gemini-actor", flag_descriptions::kGeminiActorName,
flag_descriptions::kGeminiActorDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiActor)},
{"gemini-rich-apc-extraction",
flag_descriptions::kGeminiRichAPCExtractionName,
flag_descriptions::kGeminiRichAPCExtractionDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiRichAPCExtraction)},
{"in-flow-trusted-vault-key-retrieval-ios",
flag_descriptions::kInFlowTrustedVaultKeyRetrievalIosName,
flag_descriptions::kInFlowTrustedVaultKeyRetrievalIosDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
password_manager::features::kInFlowTrustedVaultKeyRetrievalIos)},
{"sync-themes-ios", flag_descriptions::kSyncThemesIosName,
flag_descriptions::kSyncThemesIosDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(syncer::kSyncThemesIos)},
{"disable-u18-feedback-ios", flag_descriptions::kDisableU18FeedbackIosName,
flag_descriptions::kDisableU18FeedbackIosDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kDisableU18FeedbackIos)},
{"fullscreen-refactoring", flag_descriptions::kFullscreenRefactoringName,
flag_descriptions::kFullscreenRefactoringDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kFullscreenRefactoring)},
{"autofill-ai-create-entity-data-manager",
flag_descriptions::kAutofillAiCreateEntityDataManagerName,
flag_descriptions::kAutofillAiCreateEntityDataManagerDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(
autofill::features::kAutofillAiCreateEntityDataManager)},
{"autofill-ai-reauth-required",
flag_descriptions::kAutofillAiReauthRequiredName,
flag_descriptions::kAutofillAiReauthRequiredDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(autofill::features::kAutofillAiReauthRequired)},
{"autofill-ai-with-data-schema",
flag_descriptions::kAutofillAiWithDataSchemaName,
flag_descriptions::kAutofillAiWithDataSchemaDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(autofill::features::kAutofillAiWithDataSchema)},
{"gemini-chat-persistence", flag_descriptions::kGeminiChatPersistenceName,
flag_descriptions::kGeminiChatPersistenceDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiChatPersistence)},
{"ios-tab-reminders", flag_descriptions::kIOSTabRemindersName,
flag_descriptions::kIOSTabRemindersDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(send_tab_to_self::kIOSTabReminders)},
{"gemini-maps-rich-ui", flag_descriptions::kGeminiMapsRichUIName,
flag_descriptions::kGeminiMapsRichUIDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiMapsRichUI)},
{"gemini-unary-migration", flag_descriptions::kGeminiUnaryMigrationName,
flag_descriptions::kGeminiUnaryMigrationDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiUnaryMigration)},
{"gemini-binary-migration", flag_descriptions::kGeminiBinaryMigrationName,
flag_descriptions::kGeminiBinaryMigrationDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kGeminiBinaryMigration)},
{"ios-cobalt", flag_descriptions::kIOSCobaltName,
flag_descriptions::kIOSCobaltDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(web::features::kIOSCobalt)},
{"enable-client-certificate-provisioning-on-ios",
flag_descriptions::kEnableClientCertificateProvisioningOnIOSName,
flag_descriptions::kEnableClientCertificateProvisioningOnIOSDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(client_certificates::features::
kEnableClientCertificateProvisioningOnIOS)},
{"ask-about-this-page", flag_descriptions::kAskAboutThisPageName,
flag_descriptions::kAskAboutThisPageDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kAskAboutThisPage)},
{"mobile-promo-on-desktop-with-reminder-wave-1",
flag_descriptions::kMobilePromoOnDesktopWave1Name,
flag_descriptions::kMobilePromoOnDesktopWave1Description, flags_ui::kOsIos,
FEATURE_WITH_PARAMS_VALUE_TYPE(kMobilePromoOnDesktopWithReminderWave1,
kMobilePromoOnDesktopWave1Variations,
"MobilePromoOnDesktopWithReminderWave1")},
{"enable-screenshot-protection-ios",
flag_descriptions::kEnableScreenshotProtectionIOSName,
flag_descriptions::kEnableScreenshotProtectionIOSDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kEnableScreenshotProtectionIOS)},
{"aim-url-navigation-fetch-enabled",
flag_descriptions::kAimUrlNavigationFetchEnabledName,
flag_descriptions::kAimUrlNavigationFetchEnabledDescription,
flags_ui::kOsIos,
FEATURE_VALUE_TYPE(omnibox::kAimUrlNavigationFetchEnabled)},
{"reader-mode-ignore-badge-threshold",
flag_descriptions::kReaderModeIgnoreBadgeThresholdName,
flag_descriptions::kReaderModeIgnoreBadgeThresholdDescription,
flags_ui::kOsIos, FEATURE_VALUE_TYPE(kReaderModeIgnoreBadgeThreshold)},
});
bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
return false;
}
flags_ui::FlagsState& GetGlobalFlagsState() {
static base::NoDestructor<flags_ui::FlagsState> flags_state(kFeatureEntries,
nullptr);
return *flags_state;
}
// Creates the experimental test policies map, used by AsyncPolicyLoader and
// PolicyLoaderIOS to locally enable policies.
NSMutableDictionary* CreateExperimentalTestingPolicies() {
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
// Shared variables for all enterprise experimental flags.
NSMutableDictionary* testing_policies = [[NSMutableDictionary alloc] init];
NSMutableArray* allowed_experimental_policies = [[NSMutableArray alloc] init];
// Set some sample policy values for testing if EnableSamplePolicies is set to
// true.
if ([defaults boolForKey:@"EnableSamplePolicies"]) {
[testing_policies addEntriesFromDictionary:@{
base::SysUTF8ToNSString(policy::key::kAutofillAddressEnabled) : @NO,
base::SysUTF8ToNSString(policy::key::kAutofillCreditCardEnabled) : @NO,
// 2 = Disable all variations
base::SysUTF8ToNSString(policy::key::kChromeVariations) : @2,
// 2 = Do not allow any site to show popups
base::SysUTF8ToNSString(policy::key::kDefaultPopupsSetting) : @2,
// Set default search engine.
base::SysUTF8ToNSString(policy::key::kDefaultSearchProviderEnabled) :
@YES,
base::SysUTF8ToNSString(policy::key::kDefaultSearchProviderSearchURL) :
@"http://www.google.com/search?q={searchTerms}",
base::SysUTF8ToNSString(policy::key::kDefaultSearchProviderName) :
@"TestEngine",
base::SysUTF8ToNSString(policy::key::kEditBookmarksEnabled) : @NO,
base::SysUTF8ToNSString(policy::key::kNTPContentSuggestionsEnabled) : @NO,
base::SysUTF8ToNSString(policy::key::kTranslateEnabled) : @NO,
// 2 = Enhanced safe browsing protection
base::SysUTF8ToNSString(policy::key::kSafeBrowsingProtectionLevel) : @2,
base::SysUTF8ToNSString(policy::key::kSearchSuggestEnabled) : @YES,
base::SysUTF8ToNSString(policy::key::kAppStoreRatingEnabled) : @NO,
}];
}
if ([defaults boolForKey:@"EnableSyncDisabledPolicy"]) {
NSString* sync_policy_key =
base::SysUTF8ToNSString(policy::key::kSyncDisabled);
[testing_policies addEntriesFromDictionary:@{sync_policy_key : @YES}];
}
// SyncTypesListDisabled policy.
NSString* Sync_types_list_disabled_key =
base::SysUTF8ToNSString(policy::key::kSyncTypesListDisabled);
NSMutableArray* Sync_types_list_disabled_values =
[[NSMutableArray alloc] init];
if ([defaults boolForKey:@"SyncTypesListBookmarks"]) {
[Sync_types_list_disabled_values addObject:@"bookmarks"];
}
if ([defaults boolForKey:@"SyncTypesListReadingList"]) {
[Sync_types_list_disabled_values addObject:@"readingList"];
}
if ([defaults boolForKey:@"SyncTypesListPreferences"]) {
[Sync_types_list_disabled_values addObject:@"preferences"];
}
if ([defaults boolForKey:@"SyncTypesListPasswords"]) {
[Sync_types_list_disabled_values addObject:@"passwords"];
}
if ([defaults boolForKey:@"SyncTypesListAutofill"]) {
[Sync_types_list_disabled_values addObject:@"autofill"];
}
if ([defaults boolForKey:@"SyncTypesListTypedUrls"]) {
[Sync_types_list_disabled_values addObject:@"typedUrls"];
}
if ([defaults boolForKey:@"SyncTypesListTabs"]) {
[Sync_types_list_disabled_values addObject:@"tabs"];
}
if ([Sync_types_list_disabled_values count]) {
[testing_policies addEntriesFromDictionary:@{
Sync_types_list_disabled_key : Sync_types_list_disabled_values
}];
}
// If an incognito mode availability is set, set the value.
NSString* incognito_policy_key =
base::SysUTF8ToNSString(policy::key::kIncognitoModeAvailability);
NSInteger incognito_mode_availability =
[defaults integerForKey:incognito_policy_key];
if (incognito_mode_availability) {
[testing_policies addEntriesFromDictionary:@{
incognito_policy_key : @(incognito_mode_availability),
}];
}
NSString* restriction_pattern =
[defaults stringForKey:@"RestrictAccountsToPatterns"];
if ([restriction_pattern length] > 0) {
NSString* restrict_key =
base::SysUTF8ToNSString(policy::key::kRestrictAccountsToPatterns);
[testing_policies addEntriesFromDictionary:@{
restrict_key : @[ restriction_pattern ]
}];
}
// If the sign-in policy is set (not "None"), add the policy key to the list
// of enabled experimental policies, and set the value.
NSString* const kSigninPolicyKey = @"BrowserSignin";
NSInteger signin_policy_mode = [defaults integerForKey:kSigninPolicyKey];
if (signin_policy_mode) {
// Remove the mode offset that was used to represent the unset policy.
--signin_policy_mode;
DCHECK(signin_policy_mode >= 0);
[testing_policies addEntriesFromDictionary:@{
kSigninPolicyKey : @(signin_policy_mode),
}];
}
// If the New Tab Page URL is set (not empty) add the value to the list of
// test policies.
NSString* ntp_location = [defaults stringForKey:@"NTPLocation"];
if ([ntp_location length] > 0) {
NSString* ntp_location_key =
base::SysUTF8ToNSString(policy::key::kNewTabPageLocation);
[testing_policies
addEntriesFromDictionary:@{ntp_location_key : ntp_location}];
[allowed_experimental_policies addObject:ntp_location_key];
}
if ([defaults boolForKey:@"DisallowChromeDataInBackups"]) {
NSString* allow_backups_key =
base::SysUTF8ToNSString(policy::key::kAllowChromeDataInBackups);
[testing_policies addEntriesFromDictionary:@{allow_backups_key : @NO}];
[allowed_experimental_policies addObject:allow_backups_key];
}
if ([defaults boolForKey:@"DisablePasswordManagerPolicy"]) {
NSString* password_manager_key =
base::SysUTF8ToNSString(policy::key::kPasswordManagerEnabled);
[testing_policies addEntriesFromDictionary:@{password_manager_key : @NO}];
[allowed_experimental_policies addObject:password_manager_key];
}
if ([defaults boolForKey:@"EnableUserPolicyMerge"]) {
NSString* user_policy_merge_key =
base::SysUTF8ToNSString(policy::key::kCloudUserPolicyMerge);
[testing_policies addEntriesFromDictionary:@{user_policy_merge_key : @YES}];
[allowed_experimental_policies addObject:user_policy_merge_key];
}
if ([defaults boolForKey:@"AddManagedBookmarks"]) {
NSString* managed_bookmarks_key =
base::SysUTF8ToNSString(policy::key::kManagedBookmarks);
NSString* managed_bookmarks_value =
@"["
// The following gets filtered out from
// the JSON string when parsed.
" {"
" \"toplevel_name\": \"Managed Bookmarks\""
" },"
" {"
" \"name\": \"Google\","
" \"url\": \"google.com\""
" },"
" {"
" \"name\": \"Empty Folder\","
" \"children\": []"
" },"
" {"
" \"name\": \"Big Folder\","
" \"children\": ["
" {"
" \"name\": \"Youtube\","
" \"url\": \"youtube.com\""
" },"
" {"
" \"name\": \"Chromium\","
" \"url\": \"chromium.org\""
" },"
" {"
" \"name\": \"More Stuff\","
" \"children\": ["
" {"
" \"name\": \"Bugs\","
" \"url\": \"crbug.com\""
" }"
" ]"
" }"
" ]"
" }"
"]";
[testing_policies addEntriesFromDictionary:@{
managed_bookmarks_key : managed_bookmarks_value
}];
[allowed_experimental_policies addObject:managed_bookmarks_key];
}
// If any experimental policy was allowed, set the EnableExperimentalPolicies
// policy.
if ([allowed_experimental_policies count] > 0) {
[testing_policies setValue:allowed_experimental_policies
forKey:base::SysUTF8ToNSString(
policy::key::kEnableExperimentalPolicies)];
}
NSString* metrics_reporting_key = @"MetricsReportingEnabled";
switch ([defaults integerForKey:metrics_reporting_key]) {
case 1:
// Metrics reporting forced.
[testing_policies setValue:@YES forKey:metrics_reporting_key];
break;
case 2:
// Metrics reporting disabled.
[testing_policies setValue:@NO forKey:metrics_reporting_key];
break;
default:
// Metrics reporting not managed.
break;
}
// Warning: Add new flags to TestingPoliciesHash() below.
return testing_policies;
}
} // namespace
// Add all switches from experimental flags to `command_line`.
void AppendSwitchesFromExperimentalSettings(base::CommandLine* command_line) {
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
// Set the UA flag if UseMobileSafariUA is enabled.
if ([defaults boolForKey:@"UseMobileSafariUA"]) {
// Safari uses "Vesion/", followed by the OS version excluding bugfix, where
// Chrome puts its product token.
int32_t major = 0;
int32_t minor = 0;
int32_t bugfix = 0;
base::SysInfo::OperatingSystemVersionNumbers(&major, &minor, &bugfix);
std::string product = base::StringPrintf("Version/%d.%d", major, minor);
command_line->AppendSwitchASCII(switches::kUserAgent,
web::BuildMobileUserAgent(product));
}
// Shared variables for all enterprise experimental flags.
NSMutableDictionary* testing_policies = CreateExperimentalTestingPolicies();
// If a CBCM enrollment token is provided, force Chrome Browser Cloud
// Management to enabled and add the token to the list of policies.
NSString* token_key =
base::SysUTF8ToNSString(policy::key::kCloudManagementEnrollmentToken);
NSString* token = [defaults stringForKey:token_key];
if ([token length] > 0) {
command_line->AppendSwitch(switches::kEnableChromeBrowserCloudManagement);
[testing_policies setValue:token forKey:token_key];
}
// If some policies were set, commit them to the app's registration defaults.
if ([testing_policies count] > 0) {
NSDictionary* registration_defaults =
@{kPolicyLoaderIOSConfigurationKey : testing_policies};
[defaults registerDefaults:registration_defaults];
}
// Freeform commandline flags. These are added last, so that any flags added
// earlier in this function take precedence.
if ([defaults boolForKey:@"EnableFreeformCommandLineFlags"]) {
base::CommandLine::StringVector flags;
// Append an empty "program" argument.
flags.push_back("");
// The number of flags corresponds to the number of text fields in
// Experimental.plist.
const int kNumFreeformFlags = 5;
for (int i = 1; i <= kNumFreeformFlags; ++i) {
NSString* key =
[NSString stringWithFormat:@"FreeformCommandLineFlag%d", i];
NSString* flag = [defaults stringForKey:key];
if ([flag length]) {
// iOS keyboard replaces -- with —, so undo that.
flag = [flag stringByReplacingOccurrencesOfString:@"—"
withString:@"--"
options:0
range:NSMakeRange(0, 1)];
// To make things easier, allow flags with no dashes by prepending them
// here. This also allows for flags that just have one dash if they
// exist.
if (![flag hasPrefix:@"-"]) {
flag = [@"--" stringByAppendingString:flag];
}
flags.push_back(base::SysNSStringToUTF8(flag));
}
}
base::CommandLine temp_command_line(flags);
command_line->AppendArguments(temp_command_line, false);
}
// Populate command line flag for 3rd party keyboard omnibox workaround.
NSString* enableThirdPartyKeyboardWorkaround =
[defaults stringForKey:@"EnableThirdPartyKeyboardWorkaround"];
if ([enableThirdPartyKeyboardWorkaround isEqualToString:@"Enabled"]) {
command_line->AppendSwitch(switches::kEnableThirdPartyKeyboardWorkaround);
} else if ([enableThirdPartyKeyboardWorkaround isEqualToString:@"Disabled"]) {
command_line->AppendSwitch(switches::kDisableThirdPartyKeyboardWorkaround);
}
ios::provider::AppendSwitchesFromExperimentalSettings(defaults, command_line);
}
void ConvertFlagsToSwitches(flags_ui::FlagsStorage* flags_storage,
base::CommandLine* command_line) {
GetGlobalFlagsState().ConvertFlagsToSwitches(
flags_storage, command_line, flags_ui::kAddSentinels,
switches::kEnableFeatures, switches::kDisableFeatures);
}
std::vector<std::string> RegisterAllFeatureVariationParameters(
flags_ui::FlagsStorage* flags_storage,
base::FeatureList* feature_list) {
return GetGlobalFlagsState().RegisterAllFeatureVariationParameters(
flags_storage, feature_list);
}
void GetFlagFeatureEntries(flags_ui::FlagsStorage* flags_storage,
flags_ui::FlagAccess access,
base::ListValue& supported_entries,
base::ListValue& unsupported_entries) {
GetGlobalFlagsState().GetFlagFeatureEntries(
flags_storage, access, supported_entries, unsupported_entries,
base::BindRepeating(&SkipConditionalFeatureEntry));
}
void SetFeatureEntryEnabled(flags_ui::FlagsStorage* flags_storage,
const std::string& internal_name,
bool enable) {
GetGlobalFlagsState().SetFeatureEntryEnabled(flags_storage, internal_name,
enable);
}
void ResetAllFlags(flags_ui::FlagsStorage* flags_storage) {
GetGlobalFlagsState().ResetAllFlags(flags_storage);
}
bool IsRestartNeededToCommitChanges() {
return GetGlobalFlagsState().IsRestartNeededToCommitChanges();
}
namespace testing {
base::span<const flags_ui::FeatureEntry> GetFeatureEntries() {
return kFeatureEntries;
}
} // namespace testing