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 ¬ifications::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