1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/flags/android/chrome_feature_list.h"
6 
7 #include <stddef.h>
8 
9 #include <string>
10 
11 #include "base/android/jni_string.h"
12 #include "base/feature_list.h"
13 #include "base/metrics/field_trial_params.h"
14 #include "base/stl_util.h"
15 #include "chrome/browser/flags/jni_headers/ChromeFeatureList_jni.h"
16 #include "chrome/browser/notifications/chime/android/features.h"
17 #include "chrome/browser/performance_hints/performance_hints_features.h"
18 #include "chrome/browser/share/features.h"
19 #include "chrome/browser/sharing/shared_clipboard/feature_flags.h"
20 #include "chrome/browser/video_tutorials/switches.h"
21 #include "chrome/common/chrome_features.h"
22 #include "components/autofill/core/common/autofill_features.h"
23 #include "components/autofill/core/common/autofill_payments_features.h"
24 #include "components/autofill_assistant/browser/features.h"
25 #include "components/browser_sync/browser_sync_switches.h"
26 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_features.h"
27 #include "components/download/public/common/download_features.h"
28 #include "components/embedder_support/android/util/cdn_utils.h"
29 #include "components/feature_engagement/public/feature_list.h"
30 #include "components/feed/feed_feature_list.h"
31 #include "components/history/core/browser/features.h"
32 #include "components/invalidation/impl/invalidation_switches.h"
33 #include "components/language/core/common/language_experiments.h"
34 #include "components/messages/android/messages_feature.h"
35 #include "components/ntp_tiles/features.h"
36 #include "components/offline_pages/core/offline_page_feature.h"
37 #include "components/omnibox/common/omnibox_features.h"
38 #include "components/paint_preview/features/features.h"
39 #include "components/password_manager/core/common/password_manager_features.h"
40 #include "components/permissions/features.h"
41 #include "components/previews/core/previews_features.h"
42 #include "components/query_tiles/switches.h"
43 #include "components/reading_list/features/reading_list_switches.h"
44 #include "components/safe_browsing/core/features.h"
45 #include "components/security_state/core/features.h"
46 #include "components/signin/public/base/account_consistency_method.h"
47 #include "components/subresource_filter/core/browser/subresource_filter_features.h"
48 #include "components/sync/driver/sync_driver_switches.h"
49 #include "content/public/common/content_features.h"
50 #include "device/fido/features.h"
51 #include "media/base/media_switches.h"
52 #include "net/base/features.h"
53 #include "services/device/public/cpp/device_features.h"
54 #include "ui/base/ui_base_features.h"
55 
56 using base::android::ConvertJavaStringToUTF8;
57 using base::android::ConvertUTF8ToJavaString;
58 using base::android::JavaParamRef;
59 using base::android::ScopedJavaLocalRef;
60 
61 namespace chrome {
62 namespace android {
63 
64 namespace {
65 
66 // Array of features exposed through the Java ChromeFeatureList API. Entries in
67 // this array may either refer to features defined in the header of this file or
68 // in other locations in the code base (e.g. chrome/, components/, etc).
69 const base::Feature* kFeaturesExposedToJava[] = {
70     &autofill::features::kAutofillCreditCardAuthentication,
71     &autofill::features::kAutofillDownstreamCvcPromptUseGooglePayLogo,
72     &autofill::features::kAutofillEnablePasswordInfoBarAccountIndicationFooter,
73     &autofill::features::kAutofillEnableSaveCardInfoBarAccountIndicationFooter,
74     &autofill::features::kAutofillKeyboardAccessory,
75     &autofill::features::kAutofillManualFallbackAndroid,
76     &autofill::features::kAutofillRefreshStyleAndroid,
77     &autofill::features::kAutofillEnableCardNicknameManagement,
78     &autofill::features::kAutofillEnableGoogleIssuedCard,
79     &autofill_assistant::features::kAutofillAssistant,
80     &autofill_assistant::features::kAutofillAssistantChromeEntry,
81     &autofill_assistant::features::kAutofillAssistantDirectActions,
82     &autofill_assistant::features::kAutofillAssistantDisableOnboardingFlow,
83     &autofill_assistant::features::kAutofillAssistantFeedbackChip,
84     &autofill_assistant::features::kAutofillAssistantLoadDFMForTriggerScripts,
85     &autofill_assistant::features::kAutofillAssistantProactiveHelp,
86     &autofill_assistant::features::
87         kAutofillAssistantDisableProactiveHelpTiedToMSBB,
88     &device::kWebAuthPhoneSupport,
89     &download::features::kDownloadAutoResumptionNative,
90     &download::features::kDownloadLater,
91     &download::features::kSmartSuggestionForLargeDownloads,
92     &download::features::kUseDownloadOfflineContentProvider,
93     &embedder_support::kShowTrustedPublisherURL,
94     &features::kClearOldBrowsingData,
95     &features::kDownloadsLocationChange,
96     &features::kEarlyLibraryLoad,
97     &features::kGenericSensorExtraClasses,
98     &features::kInstallableAmbientBadgeInfoBar,
99     &features::kMetricsSettingsAndroid,
100     &features::kNetworkServiceInProcess,
101     &features::kOverscrollHistoryNavigation,
102     &features::kPredictivePrefetchingAllowedOnAllConnectionTypes,
103     &features::kPrivacyReorderedAndroid,
104     &features::kPrioritizeBootstrapTasks,
105     &features::kQuietNotificationPrompts,
106     &features::kSafetyCheckAndroid,
107     &features::kWebAuth,
108     &features::kWebNfc,
109     &feature_engagement::kIPHHomepagePromoCardFeature,
110     &feature_engagement::kIPHNewTabPageHomeButtonFeature,
111     &feature_engagement::kIPHTabSwitcherButtonFeature,
112     &feed::kInterestFeedContentSuggestions,
113     &feed::kInterestFeedNoticeCardAutoDismiss,
114     &feed::kInterestFeedSpinnerAlwaysAnimate,
115     &feed::kInterestFeedV1ClicksAndViewsConditionalUpload,
116     &feed::kInterestFeedV2,
117     &feed::kReportFeedUserActions,
118     &history::kHideFromApi3Transitions,
119     &kAdjustWebApkInstallationSpace,
120     &kAllowNewIncognitoTabIntents,
121     &kAllowRemoteContextForNotifications,
122     &kAndroidDefaultBrowserPromo,
123     &kAndroidManagedByMenuItem,
124     &kAndroidMultipleDisplay,
125     &kAndroidNightModeTabReparenting,
126     &kAndroidPartnerCustomizationPhenotype,
127     &kAndroidPayIntegrationV2,
128     &kAndroidSearchEngineChoiceNotification,
129     &kAssistantIntentPageUrl,
130     &kBentoOffline,
131     &kCastDeviceFilter,
132     &kCloseTabSuggestions,
133     &kCriticalPersistedTabData,
134     &kCCTBackgroundTab,
135     &kCCTClientDataHeader,
136     &kCCTExternalLinkHandling,
137     &kCCTIncognito,
138     &kCCTPostMessageAPI,
139     &kCCTRedirectPreconnect,
140     &kCCTReportParallelRequestStatus,
141     &kCCTResourcePrefetch,
142     &kDarkenWebsitesCheckboxInThemesSetting,
143     &kDontAutoHideBrowserControls,
144     &kChromeShareHighlightsAndroid,
145     &kChromeShareLongScreenshot,
146     &kChromeShareQRCode,
147     &kChromeShareScreenshot,
148     &kChromeSharingHub,
149     &kChromeSharingHubV15,
150     &kChromeStartupDelegate,
151     &kCommandLineOnNonRooted,
152     &kConditionalTabStripAndroid,
153     &kContentSuggestionsScrollToLoad,
154     &kContextMenuEnableLensShoppingAllowlist,
155     &kContextMenuGoogleLensChip,
156     &kContextMenuSearchWithGoogleLens,
157     &kContextMenuShopWithGoogleLens,
158     &kContextMenuSearchAndShopWithGoogleLens,
159     &kContextualSearchDebug,
160     &kContextualSearchDefinitions,
161     &kContextualSearchLegacyHttpPolicy,
162     &kContextualSearchLiteralSearchTap,
163     &kContextualSearchLongpressResolve,
164     &kContextualSearchMlTapSuppression,
165     &kContextualSearchSecondTap,
166     &kContextualSearchTapDisableOverride,
167     &kContextualSearchTranslations,
168     &kDirectActions,
169     &kDownloadFileProvider,
170     &kDownloadNotificationBadge,
171     &kDownloadProgressInfoBar,
172     &kDownloadRename,
173     &kDuetTabStripIntegrationAndroid,
174     &kEnhancedProtectionPromoCard,
175     &kEphemeralTabUsingBottomSheet,
176     &kExploreSites,
177     &kFocusOmniboxInIncognitoTabIntents,
178     &kHandleMediaIntents,
179     &kHomepagePromoCard,
180     &kHomepagePromoSyntheticPromoSeenEnabled,
181     &kHomepagePromoSyntheticPromoSeenTracking,
182     &kHomepageSettingsUIConversion,
183     &kHorizontalTabSwitcherAndroid,
184     &kImmersiveUiMode,
185     &kIncognitoScreenshot,
186     &kInlineUpdateFlow,
187     &kInstantStart,
188     &kKitKatSupported,
189     &kNewPhotoPicker,
190     &kNotificationSuspender,
191     &kOfflineIndicatorV2,
192     &kOmniboxSpareRenderer,
193     &kPayWithGoogleV1,
194     &kPhotoPickerVideoSupport,
195     &kPhotoPickerZoom,
196     &kProbabilisticCryptidRenderer,
197     &kReachedCodeProfiler,
198     &kReaderModeInCCT,
199     &kReengagementNotification,
200     &kRelatedSearches,
201     &kSearchEnginePromoExistingDevice,
202     &kSearchEnginePromoNewDevice,
203     &kServiceManagerForBackgroundPrefetch,
204     &kServiceManagerForDownload,
205     &kShareButtonInTopToolbar,
206     &kShareByDefaultInCCT,
207     &kSharedClipboardUI,
208     &kSharingQrCodeAndroid,
209     &kShoppingAssist,
210     &kSpannableInlineAutocomplete,
211     &kSpecialLocaleWrapper,
212     &kSpecialUserDecision,
213     &kSwapPixelFormatToFixConvertFromTranslucent,
214     &kTabEngagementReportingAndroid,
215     &kTabGroupsAndroid,
216     &kTabGroupsContinuationAndroid,
217     &kTabGroupsUiImprovementsAndroid,
218     &kTabGridLayoutAndroid,
219     &kTabReparenting,
220     &kTabSwitcherOnReturn,
221     &kTabToGTSAnimation,
222     &kTabbedAppOverflowMenuIcons,
223     &kTabbedAppOverflowMenuRegroup,
224     &kTabbedAppOverflowMenuThreeButtonActionbar,
225     &kTestDefaultDisabled,
226     &kTestDefaultEnabled,
227     &kToolbarIphAndroid,
228     &kToolbarIphAndroidCohort1,
229     &kToolbarIphAndroidCohort2,
230     &kToolbarIphAndroidCohort3,
231     &kToolbarIphAndroidCohort4,
232     &kToolbarIphAndroidCohort5,
233     &kToolbarIphAndroidCohort6,
234     &kToolbarIphAndroidCohort7,
235     &kToolbarIphAndroidCohort8,
236     &kTrustedWebActivityLocationDelegation,
237     &kTrustedWebActivityNewDisclosure,
238     &kTrustedWebActivityPostMessage,
239     &kTrustedWebActivityQualityEnforcement,
240     &kTrustedWebActivityQualityEnforcementForced,
241     &kTrustedWebActivityQualityEnforcementWarning,
242     &kStartSurfaceAndroid,
243     &kUmaBackgroundSessions,
244     &kUpdateNotificationSchedulingIntegration,
245     &kUpdateNotificationScheduleServiceImmediateShowOption,
246     &kVoiceSearchAudioCapturePolicy,
247     &kVoiceButtonInTopToolbar,
248     &kVrBrowsingFeedback,
249     &kWebApkAdaptiveIcon,
250     &kPrefetchNotificationSchedulingIntegration,
251     &features::kDnsOverHttps,
252     &net::features::kSameSiteByDefaultCookies,
253     &net::features::kCookiesWithoutSameSiteMustBeSecure,
254     &notifications::features::kUseChimeAndroidSdk,
255     &paint_preview::kPaintPreviewDemo,
256     &paint_preview::kPaintPreviewShowOnStartup,
257     &language::kDetailedLanguageSettings,
258     &language::kExplicitLanguageAsk,
259     &language::kTranslateAssistContent,
260     &language::kTranslateIntent,
261     &messages::kMessagesForAndroidInfrastructure,
262     &offline_pages::kOfflineIndicatorFeature,
263     &offline_pages::kOfflineIndicatorAlwaysHttpProbeFeature,
264     &offline_pages::kOfflinePagesCTFeature,    // See crbug.com/620421.
265     &offline_pages::kOfflinePagesCTV2Feature,  // See crbug.com/734753.
266     &offline_pages::kOfflinePagesDescriptiveFailStatusFeature,
267     &offline_pages::kOfflinePagesDescriptivePendingStatusFeature,
268     &offline_pages::kOfflinePagesLivePageSharingFeature,
269     &offline_pages::kPrefetchingOfflinePagesFeature,
270     &omnibox::kAdaptiveSuggestionsCount,
271     &omnibox::kCompactSuggestions,
272     &omnibox::kHideVisitsFromCct,
273     &omnibox::kMostVisitedTiles,
274     &omnibox::kOmniboxAssistantVoiceSearch,
275     &omnibox::kOmniboxSearchEngineLogo,
276     &omnibox::kOmniboxSearchReadyIncognito,
277     &password_manager::features::kEditPasswordsInSettings,
278     &password_manager::features::kPasswordScriptsFetching,
279     &password_manager::features::kPasswordCheck,
280     &password_manager::features::kRecoverFromNeverSaveAndroid,
281     &performance_hints::features::kContextMenuPerformanceInfo,
282     &performance_hints::features::kPageInfoPerformanceHints,
283     &query_tiles::features::kQueryTilesGeoFilter,
284     &query_tiles::features::kQueryTiles,
285     &query_tiles::features::kQueryTilesInNTP,
286     &query_tiles::features::kQueryTilesInOmnibox,
287     &query_tiles::features::kQueryTilesEnableQueryEditing,
288     &query_tiles::features::kQueryTilesLocalOrdering,
289     &reading_list::switches::kReadLater,
290     &safe_browsing::kEnhancedProtection,
291     &safe_browsing::kSafeBrowsingSectionUIAndroid,
292     &security_state::features::kMarkHttpAsFeature,
293     &signin::kMobileIdentityConsistency,
294     &switches::kDecoupleSyncFromAndroidMasterSync,
295     &switches::kSyncUseSessionsUnregisterDelay,
296     &subresource_filter::kSafeBrowsingSubresourceFilter,
297     &video_tutorials::features::kVideoTutorials,
298 };
299 
FindFeatureExposedToJava(const std::string & feature_name)300 const base::Feature* FindFeatureExposedToJava(const std::string& feature_name) {
301   for (const auto* feature : kFeaturesExposedToJava) {
302     if (feature->name == feature_name)
303       return feature;
304   }
305   NOTREACHED() << "Queried feature cannot be found in ChromeFeatureList: "
306                << feature_name;
307   return nullptr;
308 }
309 
310 }  // namespace
311 
312 // Alphabetical:
313 const base::Feature kAdjustWebApkInstallationSpace = {
314     "AdjustWebApkInstallationSpace", base::FEATURE_DISABLED_BY_DEFAULT};
315 
316 const base::Feature kAndroidDefaultBrowserPromo{
317     "AndroidDefaultBrowserPromo", base::FEATURE_DISABLED_BY_DEFAULT};
318 
319 const base::Feature kAndroidManagedByMenuItem{"AndroidManagedByMenuItem",
320                                               base::FEATURE_ENABLED_BY_DEFAULT};
321 
322 const base::Feature kAndroidMultipleDisplay{"AndroidMultipleDisplay",
323                                             base::FEATURE_ENABLED_BY_DEFAULT};
324 
325 const base::Feature kAndroidNightModeTabReparenting{
326     "AndroidNightModeTabReparenting", base::FEATURE_ENABLED_BY_DEFAULT};
327 
328 const base::Feature kAllowNewIncognitoTabIntents{
329     "AllowNewIncognitoTabIntents", base::FEATURE_ENABLED_BY_DEFAULT};
330 
331 const base::Feature kFocusOmniboxInIncognitoTabIntents{
332     "FocusOmniboxInIncognitoTabIntents", base::FEATURE_ENABLED_BY_DEFAULT};
333 
334 const base::Feature kAllowRemoteContextForNotifications{
335     "AllowRemoteContextForNotifications", base::FEATURE_ENABLED_BY_DEFAULT};
336 
337 const base::Feature kAndroidPartnerCustomizationPhenotype{
338     "AndroidPartnerCustomizationPhenotype", base::FEATURE_ENABLED_BY_DEFAULT};
339 
340 // TODO(rouslan): Remove this. (Currently used in
341 // GooglePayPaymentAppFactory.java)
342 const base::Feature kAndroidPayIntegrationV2{"AndroidPayIntegrationV2",
343                                              base::FEATURE_ENABLED_BY_DEFAULT};
344 
345 const base::Feature kAndroidSearchEngineChoiceNotification{
346     "AndroidSearchEngineChoiceNotification", base::FEATURE_ENABLED_BY_DEFAULT};
347 
348 const base::Feature kAssistantIntentPageUrl{"AssistantIntentPageUrl",
349                                             base::FEATURE_DISABLED_BY_DEFAULT};
350 
351 const base::Feature kBackgroundTaskComponentUpdate{
352     "BackgroundTaskComponentUpdate", base::FEATURE_DISABLED_BY_DEFAULT};
353 
354 const base::Feature kBentoOffline{"BentoOffline",
355                                   base::FEATURE_DISABLED_BY_DEFAULT};
356 
357 const base::Feature kConditionalTabStripAndroid{
358     "ConditionalTabStripAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
359 
360 // Used in downstream code.
361 const base::Feature kCastDeviceFilter{"CastDeviceFilter",
362                                       base::FEATURE_DISABLED_BY_DEFAULT};
363 
364 const base::Feature kCloseTabSuggestions{"CloseTabSuggestions",
365                                          base::FEATURE_DISABLED_BY_DEFAULT};
366 
367 const base::Feature kCriticalPersistedTabData{
368     "CriticalPersistedTabData", base::FEATURE_DISABLED_BY_DEFAULT};
369 
370 const base::Feature kCCTBackgroundTab{"CCTBackgroundTab",
371                                       base::FEATURE_ENABLED_BY_DEFAULT};
372 
373 const base::Feature kCCTClientDataHeader{"CCTClientDataHeader",
374                                          base::FEATURE_DISABLED_BY_DEFAULT};
375 
376 const base::Feature kCCTExternalLinkHandling{"CCTExternalLinkHandling",
377                                              base::FEATURE_ENABLED_BY_DEFAULT};
378 
379 const base::Feature kCCTIncognito{"CCTIncognito",
380                                   base::FEATURE_DISABLED_BY_DEFAULT};
381 
382 const base::Feature kCCTPostMessageAPI{"CCTPostMessageAPI",
383                                        base::FEATURE_ENABLED_BY_DEFAULT};
384 
385 const base::Feature kCCTRedirectPreconnect{"CCTRedirectPreconnect",
386                                            base::FEATURE_ENABLED_BY_DEFAULT};
387 
388 const base::Feature kCCTReportParallelRequestStatus{
389     "CCTReportParallelRequestStatus", base::FEATURE_DISABLED_BY_DEFAULT};
390 
391 const base::Feature kCCTResourcePrefetch{"CCTResourcePrefetch",
392                                          base::FEATURE_ENABLED_BY_DEFAULT};
393 
394 const base::Feature kDontAutoHideBrowserControls{
395     "DontAutoHideBrowserControls", base::FEATURE_DISABLED_BY_DEFAULT};
396 
397 const base::Feature kChromeShareHighlightsAndroid{
398     "ChromeShareHighlightsAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
399 
400 const base::Feature kChromeShareLongScreenshot{
401     "ChromeShareLongScreenshot", base::FEATURE_DISABLED_BY_DEFAULT};
402 
403 const base::Feature kChromeShareQRCode{"ChromeShareQRCode",
404                                        base::FEATURE_DISABLED_BY_DEFAULT};
405 
406 const base::Feature kChromeShareScreenshot{"ChromeShareScreenshot",
407                                            base::FEATURE_DISABLED_BY_DEFAULT};
408 
409 const base::Feature kChromeSharingHub{"ChromeSharingHub",
410                                       base::FEATURE_ENABLED_BY_DEFAULT};
411 
412 const base::Feature kChromeSharingHubV15{"ChromeSharingHubV15",
413                                          base::FEATURE_DISABLED_BY_DEFAULT};
414 
415 const base::Feature kChromeStartupDelegate{"ChromeStartupDelegate",
416                                            base::FEATURE_DISABLED_BY_DEFAULT};
417 
418 const base::Feature kCommandLineOnNonRooted{"CommandLineOnNonRooted",
419                                             base::FEATURE_DISABLED_BY_DEFAULT};
420 
421 const base::Feature kContentSuggestionsScrollToLoad{
422     "ContentSuggestionsScrollToLoad", base::FEATURE_DISABLED_BY_DEFAULT};
423 
424 const base::Feature kContextMenuEnableLensShoppingAllowlist{
425     "ContextMenuEnableLensShoppingAllowlist",
426     base::FEATURE_DISABLED_BY_DEFAULT};
427 
428 const base::Feature kContextMenuGoogleLensChip{
429     "ContextMenuGoogleLensChip", base::FEATURE_DISABLED_BY_DEFAULT};
430 
431 const base::Feature kContextMenuSearchWithGoogleLens{
432     "ContextMenuSearchWithGoogleLens", base::FEATURE_ENABLED_BY_DEFAULT};
433 
434 const base::Feature kContextMenuShopWithGoogleLens{
435     "ContextMenuShopWithGoogleLens", base::FEATURE_DISABLED_BY_DEFAULT};
436 
437 const base::Feature kContextMenuSearchAndShopWithGoogleLens{
438     "ContextMenuSearchAndShopWithGoogleLens",
439     base::FEATURE_DISABLED_BY_DEFAULT};
440 
441 const base::Feature kContextualSearchDebug{"ContextualSearchDebug",
442                                            base::FEATURE_DISABLED_BY_DEFAULT};
443 
444 const base::Feature kContextualSearchDefinitions{
445     "ContextualSearchDefinitions", base::FEATURE_ENABLED_BY_DEFAULT};
446 
447 const base::Feature kContextualSearchLegacyHttpPolicy{
448     "ContextualSearchLegacyHttpPolicy", base::FEATURE_DISABLED_BY_DEFAULT};
449 
450 const base::Feature kContextualSearchLiteralSearchTap{
451     "ContextualSearchLiteralSearchTap", base::FEATURE_DISABLED_BY_DEFAULT};
452 
453 const base::Feature kContextualSearchLongpressResolve{
454     "ContextualSearchLongpressResolve", base::FEATURE_DISABLED_BY_DEFAULT};
455 
456 const base::Feature kContextualSearchMlTapSuppression{
457     "ContextualSearchMlTapSuppression", base::FEATURE_DISABLED_BY_DEFAULT};
458 
459 const base::Feature kContextualSearchSecondTap{
460     "ContextualSearchSecondTap", base::FEATURE_DISABLED_BY_DEFAULT};
461 
462 const base::Feature kContextualSearchTapDisableOverride{
463     "ContextualSearchTapDisableOverride", base::FEATURE_DISABLED_BY_DEFAULT};
464 
465 const base::Feature kContextualSearchTranslations{
466     "ContextualSearchTranslations", base::FEATURE_DISABLED_BY_DEFAULT};
467 
468 const base::Feature kDarkenWebsitesCheckboxInThemesSetting{
469     "DarkenWebsitesCheckboxInThemesSetting", base::FEATURE_DISABLED_BY_DEFAULT};
470 
471 const base::Feature kDirectActions{"DirectActions",
472                                    base::FEATURE_ENABLED_BY_DEFAULT};
473 
474 const base::Feature kDownloadAutoResumptionThrottling{
475     "DownloadAutoResumptionThrottling", base::FEATURE_ENABLED_BY_DEFAULT};
476 
477 const base::Feature kDownloadProgressInfoBar{"DownloadProgressInfoBar",
478                                              base::FEATURE_ENABLED_BY_DEFAULT};
479 
480 const base::Feature kDownloadFileProvider{"DownloadFileProvider",
481                                           base::FEATURE_ENABLED_BY_DEFAULT};
482 
483 const base::Feature kDownloadNotificationBadge{
484     "DownloadNotificationBadge", base::FEATURE_ENABLED_BY_DEFAULT};
485 
486 const base::Feature kDownloadRename{"DownloadRename",
487                                     base::FEATURE_ENABLED_BY_DEFAULT};
488 
489 const base::Feature kDuetTabStripIntegrationAndroid{
490     "DuetTabStripIntegrationAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
491 
492 const base::Feature kEnhancedProtectionPromoCard{
493     "EnhancedProtectionPromoCard", base::FEATURE_DISABLED_BY_DEFAULT};
494 
495 const base::Feature kEphemeralTabUsingBottomSheet{
496     "EphemeralTabUsingBottomSheet", base::FEATURE_DISABLED_BY_DEFAULT};
497 
498 const base::Feature kExploreSites{"ExploreSites",
499                                   base::FEATURE_DISABLED_BY_DEFAULT};
500 
501 const base::Feature kHandleMediaIntents{"HandleMediaIntents",
502                                         base::FEATURE_ENABLED_BY_DEFAULT};
503 
504 const base::Feature kHomepagePromoCard{"HomepagePromoCard",
505                                        base::FEATURE_DISABLED_BY_DEFAULT};
506 
507 // Homepage Promo experiment group for synthetic field trial.
508 const base::Feature kHomepagePromoSyntheticPromoSeenEnabled{
509     "HomepagePromoSyntheticPromoSeenEnabled",
510     base::FEATURE_DISABLED_BY_DEFAULT};
511 const base::Feature kHomepagePromoSyntheticPromoSeenTracking{
512     "HomepagePromoSyntheticPromoSeenTracking",
513     base::FEATURE_DISABLED_BY_DEFAULT};
514 
515 const base::Feature kHomepageSettingsUIConversion{
516     "HomepageSettingsUIConversion", base::FEATURE_ENABLED_BY_DEFAULT};
517 
518 const base::Feature kHorizontalTabSwitcherAndroid{
519     "HorizontalTabSwitcherAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
520 
521 const base::Feature kImmersiveUiMode{"ImmersiveUiMode",
522                                      base::FEATURE_DISABLED_BY_DEFAULT};
523 
524 const base::Feature kIncognitoScreenshot{"IncognitoScreenshot",
525                                          base::FEATURE_DISABLED_BY_DEFAULT};
526 
527 const base::Feature kInlineUpdateFlow{"InlineUpdateFlow",
528                                       base::FEATURE_DISABLED_BY_DEFAULT};
529 
530 const base::Feature kInstantStart{"InstantStart",
531                                   base::FEATURE_DISABLED_BY_DEFAULT};
532 
533 const base::Feature kKitKatSupported{"KitKatSupported",
534                                      base::FEATURE_DISABLED_BY_DEFAULT};
535 
536 const base::Feature kSearchEnginePromoExistingDevice{
537     "SearchEnginePromo.ExistingDevice", base::FEATURE_ENABLED_BY_DEFAULT};
538 
539 const base::Feature kSearchEnginePromoNewDevice{
540     "SearchEnginePromo.NewDevice", base::FEATURE_ENABLED_BY_DEFAULT};
541 
542 const base::Feature kNewPhotoPicker{"NewPhotoPicker",
543                                     base::FEATURE_ENABLED_BY_DEFAULT};
544 
545 // TODO(knollr): This is a temporary kill switch, it can be removed once we feel
546 // okay about leaving it on.
547 const base::Feature kNotificationSuspender{"NotificationSuspender",
548                                            base::FEATURE_ENABLED_BY_DEFAULT};
549 
550 const base::Feature kOfflineIndicatorV2{"OfflineIndicatorV2",
551                                         base::FEATURE_DISABLED_BY_DEFAULT};
552 
553 const base::Feature kOmniboxSpareRenderer{"OmniboxSpareRenderer",
554                                           base::FEATURE_DISABLED_BY_DEFAULT};
555 
556 // TODO(rouslan): Remove this. (Currently used in
557 // GooglePayPaymentAppFactory.java)
558 const base::Feature kPayWithGoogleV1{"PayWithGoogleV1",
559                                      base::FEATURE_ENABLED_BY_DEFAULT};
560 
561 const base::Feature kPhotoPickerVideoSupport{"PhotoPickerVideoSupport",
562                                              base::FEATURE_DISABLED_BY_DEFAULT};
563 
564 const base::Feature kPhotoPickerZoom{"PhotoPickerZoom",
565                                      base::FEATURE_ENABLED_BY_DEFAULT};
566 
567 const base::Feature kProbabilisticCryptidRenderer{
568     "ProbabilisticCryptidRenderer", base::FEATURE_DISABLED_BY_DEFAULT};
569 
570 const base::Feature kReachedCodeProfiler{"ReachedCodeProfiler",
571                                          base::FEATURE_DISABLED_BY_DEFAULT};
572 
573 const base::Feature kReaderModeInCCT{"ReaderModeInCCT",
574                                      base::FEATURE_ENABLED_BY_DEFAULT};
575 
576 const base::Feature kReengagementNotification{
577     "ReengagementNotification", base::FEATURE_DISABLED_BY_DEFAULT};
578 
579 const base::Feature kRelatedSearches{"RelatedSearches",
580                                      base::FEATURE_DISABLED_BY_DEFAULT};
581 
582 const base::Feature kServiceManagerForBackgroundPrefetch{
583     "ServiceManagerForBackgroundPrefetch", base::FEATURE_ENABLED_BY_DEFAULT};
584 
585 const base::Feature kServiceManagerForDownload{
586     "ServiceManagerForDownload", base::FEATURE_ENABLED_BY_DEFAULT};
587 
588 const base::Feature kShareButtonInTopToolbar{"ShareButtonInTopToolbar",
589                                              base::FEATURE_DISABLED_BY_DEFAULT};
590 
591 const base::Feature kShareByDefaultInCCT{"ShareByDefaultInCCT",
592                                          base::FEATURE_DISABLED_BY_DEFAULT};
593 
594 const base::Feature kShoppingAssist{"ShoppingAssist",
595                                     base::FEATURE_DISABLED_BY_DEFAULT};
596 
597 const base::Feature kSpannableInlineAutocomplete{
598     "SpannableInlineAutocomplete", base::FEATURE_ENABLED_BY_DEFAULT};
599 
600 const base::Feature kSpecialLocaleWrapper{"SpecialLocaleWrapper",
601                                           base::FEATURE_ENABLED_BY_DEFAULT};
602 
603 const base::Feature kSpecialUserDecision{"SpecialUserDecision",
604                                          base::FEATURE_DISABLED_BY_DEFAULT};
605 
606 const base::Feature kSwapPixelFormatToFixConvertFromTranslucent{
607     "SwapPixelFormatToFixConvertFromTranslucent",
608     base::FEATURE_ENABLED_BY_DEFAULT};
609 
610 const base::Feature kTabEngagementReportingAndroid{
611     "TabEngagementReportingAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
612 
613 const base::Feature kTabGroupsAndroid{"TabGroupsAndroid",
614                                       base::FEATURE_DISABLED_BY_DEFAULT};
615 
616 const base::Feature kTabGroupsContinuationAndroid{
617     "TabGroupsContinuationAndroid", base::FEATURE_DISABLED_BY_DEFAULT};
618 
619 const base::Feature kTabGroupsUiImprovementsAndroid{
620     "TabGroupsUiImprovementsAndroid", base::FEATURE_ENABLED_BY_DEFAULT};
621 
622 const base::Feature kTabGridLayoutAndroid{"TabGridLayoutAndroid",
623                                           base::FEATURE_DISABLED_BY_DEFAULT};
624 
625 const base::Feature kTabReparenting{"TabReparenting",
626                                     base::FEATURE_ENABLED_BY_DEFAULT};
627 
628 const base::Feature kTabSwitcherOnReturn{"TabSwitcherOnReturn",
629                                          base::FEATURE_DISABLED_BY_DEFAULT};
630 
631 const base::Feature kTabToGTSAnimation{"TabToGTSAnimation",
632                                        base::FEATURE_ENABLED_BY_DEFAULT};
633 
634 const base::Feature kTabbedAppOverflowMenuIcons{
635     "TabbedAppOverflowMenuIcons", base::FEATURE_DISABLED_BY_DEFAULT};
636 
637 const base::Feature kTabbedAppOverflowMenuRegroup{
638     "TabbedAppOverflowMenuRegroup", base::FEATURE_DISABLED_BY_DEFAULT};
639 
640 const base::Feature kTabbedAppOverflowMenuThreeButtonActionbar{
641     "TabbedAppOverflowMenuThreeButtonActionbar",
642     base::FEATURE_DISABLED_BY_DEFAULT};
643 
644 const base::Feature kTestDefaultDisabled{"TestDefaultDisabled",
645                                          base::FEATURE_DISABLED_BY_DEFAULT};
646 
647 const base::Feature kTestDefaultEnabled{"TestDefaultEnabled",
648                                         base::FEATURE_ENABLED_BY_DEFAULT};
649 
650 const base::Feature kToolbarIphAndroid{"ToolbarIphAndroid",
651                                        base::FEATURE_DISABLED_BY_DEFAULT};
652 const base::Feature kToolbarIphAndroidCohort1{
653     "ToolbarIphAndroidCohort1", base::FEATURE_DISABLED_BY_DEFAULT};
654 const base::Feature kToolbarIphAndroidCohort2{
655     "ToolbarIphAndroidCohort2", base::FEATURE_DISABLED_BY_DEFAULT};
656 const base::Feature kToolbarIphAndroidCohort3{
657     "ToolbarIphAndroidCohort3", base::FEATURE_DISABLED_BY_DEFAULT};
658 const base::Feature kToolbarIphAndroidCohort4{
659     "ToolbarIphAndroidCohort4", base::FEATURE_DISABLED_BY_DEFAULT};
660 const base::Feature kToolbarIphAndroidCohort5{
661     "ToolbarIphAndroidCohort5", base::FEATURE_DISABLED_BY_DEFAULT};
662 const base::Feature kToolbarIphAndroidCohort6{
663     "ToolbarIphAndroidCohort6", base::FEATURE_DISABLED_BY_DEFAULT};
664 const base::Feature kToolbarIphAndroidCohort7{
665     "ToolbarIphAndroidCohort7", base::FEATURE_DISABLED_BY_DEFAULT};
666 const base::Feature kToolbarIphAndroidCohort8{
667     "ToolbarIphAndroidCohort8", base::FEATURE_DISABLED_BY_DEFAULT};
668 
669 const base::Feature kTrustedWebActivityLocationDelegation{
670     "TrustedWebActivityLocationDelegation", base::FEATURE_ENABLED_BY_DEFAULT};
671 
672 const base::Feature kTrustedWebActivityNewDisclosure{
673     "TrustedWebActivityNewDisclosure", base::FEATURE_ENABLED_BY_DEFAULT};
674 
675 const base::Feature kTrustedWebActivityPostMessage{
676     "TrustedWebActivityPostMessage", base::FEATURE_DISABLED_BY_DEFAULT};
677 
678 const base::Feature kTrustedWebActivityQualityEnforcement{
679     "TrustedWebActivityQualityEnforcement", base::FEATURE_DISABLED_BY_DEFAULT};
680 
681 const base::Feature kTrustedWebActivityQualityEnforcementForced{
682     "TrustedWebActivityQualityEnforcementForced",
683     base::FEATURE_DISABLED_BY_DEFAULT};
684 
685 const base::Feature kTrustedWebActivityQualityEnforcementWarning{
686     "TrustedWebActivityQualityEnforcementWarning",
687     base::FEATURE_ENABLED_BY_DEFAULT};
688 
689 const base::Feature kStartSurfaceAndroid{"StartSurfaceAndroid",
690                                          base::FEATURE_DISABLED_BY_DEFAULT};
691 
692 // If enabled, keep logging and reporting UMA while chrome is backgrounded.
693 const base::Feature kUmaBackgroundSessions{"UMABackgroundSessions",
694                                            base::FEATURE_DISABLED_BY_DEFAULT};
695 
696 const base::Feature kUpdateNotificationSchedulingIntegration{
697     "UpdateNotificationSchedulingIntegration",
698     base::FEATURE_DISABLED_BY_DEFAULT};
699 
700 const base::Feature kPrefetchNotificationSchedulingIntegration{
701     "PrefetchNotificationSchedulingIntegration",
702     base::FEATURE_DISABLED_BY_DEFAULT};
703 
704 const base::Feature kUpdateNotificationScheduleServiceImmediateShowOption{
705     "UpdateNotificationScheduleServiceImmediateShowOption",
706     base::FEATURE_DISABLED_BY_DEFAULT};
707 
708 const base::Feature kUserMediaScreenCapturing{
709     "UserMediaScreenCapturing", base::FEATURE_DISABLED_BY_DEFAULT};
710 
711 const base::Feature kVoiceSearchAudioCapturePolicy{
712     "VoiceSearchAudioCapturePolicy", base::FEATURE_DISABLED_BY_DEFAULT};
713 
714 const base::Feature kVoiceButtonInTopToolbar{"VoiceButtonInTopToolbar",
715                                              base::FEATURE_DISABLED_BY_DEFAULT};
716 
717 const base::Feature kVrBrowsingFeedback{"VrBrowsingFeedback",
718                                         base::FEATURE_ENABLED_BY_DEFAULT};
719 
720 const base::Feature kWebApkAdaptiveIcon{"WebApkAdaptiveIcon",
721                                         base::FEATURE_ENABLED_BY_DEFAULT};
722 
JNI_ChromeFeatureList_IsEnabled(JNIEnv * env,const JavaParamRef<jstring> & jfeature_name)723 static jboolean JNI_ChromeFeatureList_IsEnabled(
724     JNIEnv* env,
725     const JavaParamRef<jstring>& jfeature_name) {
726   const base::Feature* feature =
727       FindFeatureExposedToJava(ConvertJavaStringToUTF8(env, jfeature_name));
728   return base::FeatureList::IsEnabled(*feature);
729 }
730 
731 static ScopedJavaLocalRef<jstring>
JNI_ChromeFeatureList_GetFieldTrialParamByFeature(JNIEnv * env,const JavaParamRef<jstring> & jfeature_name,const JavaParamRef<jstring> & jparam_name)732 JNI_ChromeFeatureList_GetFieldTrialParamByFeature(
733     JNIEnv* env,
734     const JavaParamRef<jstring>& jfeature_name,
735     const JavaParamRef<jstring>& jparam_name) {
736   const base::Feature* feature =
737       FindFeatureExposedToJava(ConvertJavaStringToUTF8(env, jfeature_name));
738   const std::string& param_name = ConvertJavaStringToUTF8(env, jparam_name);
739   const std::string& param_value =
740       base::GetFieldTrialParamValueByFeature(*feature, param_name);
741   return ConvertUTF8ToJavaString(env, param_value);
742 }
743 
JNI_ChromeFeatureList_GetFieldTrialParamByFeatureAsInt(JNIEnv * env,const JavaParamRef<jstring> & jfeature_name,const JavaParamRef<jstring> & jparam_name,const jint jdefault_value)744 static jint JNI_ChromeFeatureList_GetFieldTrialParamByFeatureAsInt(
745     JNIEnv* env,
746     const JavaParamRef<jstring>& jfeature_name,
747     const JavaParamRef<jstring>& jparam_name,
748     const jint jdefault_value) {
749   const base::Feature* feature =
750       FindFeatureExposedToJava(ConvertJavaStringToUTF8(env, jfeature_name));
751   const std::string& param_name = ConvertJavaStringToUTF8(env, jparam_name);
752   return base::GetFieldTrialParamByFeatureAsInt(*feature, param_name,
753                                                 jdefault_value);
754 }
755 
JNI_ChromeFeatureList_GetFieldTrialParamByFeatureAsDouble(JNIEnv * env,const JavaParamRef<jstring> & jfeature_name,const JavaParamRef<jstring> & jparam_name,const jdouble jdefault_value)756 static jdouble JNI_ChromeFeatureList_GetFieldTrialParamByFeatureAsDouble(
757     JNIEnv* env,
758     const JavaParamRef<jstring>& jfeature_name,
759     const JavaParamRef<jstring>& jparam_name,
760     const jdouble jdefault_value) {
761   const base::Feature* feature =
762       FindFeatureExposedToJava(ConvertJavaStringToUTF8(env, jfeature_name));
763   const std::string& param_name = ConvertJavaStringToUTF8(env, jparam_name);
764   return base::GetFieldTrialParamByFeatureAsDouble(*feature, param_name,
765                                                    jdefault_value);
766 }
767 
JNI_ChromeFeatureList_GetFieldTrialParamByFeatureAsBoolean(JNIEnv * env,const JavaParamRef<jstring> & jfeature_name,const JavaParamRef<jstring> & jparam_name,const jboolean jdefault_value)768 static jboolean JNI_ChromeFeatureList_GetFieldTrialParamByFeatureAsBoolean(
769     JNIEnv* env,
770     const JavaParamRef<jstring>& jfeature_name,
771     const JavaParamRef<jstring>& jparam_name,
772     const jboolean jdefault_value) {
773   const base::Feature* feature =
774       FindFeatureExposedToJava(ConvertJavaStringToUTF8(env, jfeature_name));
775   const std::string& param_name = ConvertJavaStringToUTF8(env, jparam_name);
776   return base::GetFieldTrialParamByFeatureAsBool(*feature, param_name,
777                                                  jdefault_value);
778 }
779 
780 }  // namespace android
781 }  // namespace chrome
782