| // Copyright 2019 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "components/omnibox/common/omnibox_features.h" |
| |
| #include "base/feature_list.h" |
| #include "build/build_config.h" |
| #include "ui/base/ui_base_features.h" |
| |
| #if BUILDFLAG(IS_ANDROID) |
| #include "base/android/feature_map.h" |
| #include "base/no_destructor.h" |
| #include "components/omnibox/common/jni_headers/OmniboxFeatureMap_jni.h" |
| #endif |
| |
| namespace omnibox { |
| namespace { |
| constexpr bool IS_ANDROID = !!BUILDFLAG(IS_ANDROID); |
| constexpr bool IS_IOS = !!BUILDFLAG(IS_IOS); |
| |
| constexpr base::FeatureState DISABLED = base::FEATURE_DISABLED_BY_DEFAULT; |
| constexpr base::FeatureState ENABLED = base::FEATURE_ENABLED_BY_DEFAULT; |
| |
| constexpr base::FeatureState enable_if(bool condition) { |
| return condition ? ENABLED : DISABLED; |
| } |
| } // namespace |
| |
| // Feature to enable showing thumbnail in front of the Omnibox clipboard image |
| // search suggestion. |
| BASE_FEATURE(kImageSearchSuggestionThumbnail, |
| "ImageSearchSuggestionThumbnail", |
| enable_if(IS_ANDROID)); |
| |
| // Feature used to allow users to remove suggestions from clipboard. |
| BASE_FEATURE(kOmniboxRemoveSuggestionsFromClipboard, |
| "OmniboxRemoveSuggestionsFromClipboard", |
| enable_if(IS_ANDROID)); |
| |
| // When enabled, uses the grouping framework with prefixed suggestions (i.e. |
| // autocomplete_grouper_sections.h) to limit and group (but not sort) matches. |
| BASE_FEATURE(kGroupingFrameworkForNonZPS, |
| "OmniboxGroupingFrameworkForNonZPS", |
| enable_if(IS_ANDROID)); |
| |
| // Feature used to cap max zero suggestions shown according to the param |
| // OmniboxMaxZeroSuggestMatches. If omitted, |
| // OmniboxUIExperimentMaxAutocompleteMatches will be used instead. If present, |
| // OmniboxMaxZeroSuggestMatches will override |
| // OmniboxUIExperimentMaxAutocompleteMatches when |from_omnibox_focus| is true. |
| BASE_FEATURE(kMaxZeroSuggestMatches, "OmniboxMaxZeroSuggestMatches", DISABLED); |
| |
| // Feature used to cap max suggestions shown according to the params |
| // UIMaxAutocompleteMatches and UIMaxAutocompleteMatchesByProvider. |
| BASE_FEATURE(kUIExperimentMaxAutocompleteMatches, |
| "OmniboxUIExperimentMaxAutocompleteMatches", |
| DISABLED); |
| |
| // Feature used to cap the number of URL-type matches shown within the |
| // Omnibox. If enabled, the number of URL-type matches is limited (unless |
| // there are no more non-URL matches available.) If enabled, there is a |
| // companion parameter - OmniboxMaxURLMatches - which specifies the maximum |
| // desired number of URL-type matches. |
| BASE_FEATURE(kOmniboxMaxURLMatches, "OmniboxMaxURLMatches", ENABLED); |
| |
| // Feature used to cap max suggestions to a dynamic limit based on how many URLs |
| // would be shown. E.g., show up to 10 suggestions if doing so would display no |
| // URLs; else show up to 8 suggestions if doing so would include 1 or more URLs. |
| BASE_FEATURE(kDynamicMaxAutocomplete, |
| "OmniboxDynamicMaxAutocomplete", |
| enable_if(!IS_IOS)); |
| |
| // If enabled, takes the search intent query params into account for triggering |
| // switch to tab actions on matches. |
| BASE_FEATURE(kDisambiguateTabMatchingForEntitySuggestions, |
| "DisambiguateTabMatchingForEntitySuggestions", |
| ENABLED); |
| |
| // Enables omnibox focus as a trigger for zero-prefix suggestions on web and |
| // SRP, subject to the same requirements and conditions as on-clobber |
| // suggestions. |
| BASE_FEATURE(kFocusTriggersWebAndSRPZeroSuggest, |
| "OmniboxFocusTriggersWebAndSRPZeroSuggest", |
| ENABLED); |
| |
| // If enabled, suggestion group headers in the Omnibox popup will be hidden |
| // (e.g. in order to minimize visual clutter in the zero-prefix state). |
| BASE_FEATURE(kHideSuggestionGroupHeaders, |
| "OmniboxHideSuggestionGroupHeaders", |
| ENABLED); |
| |
| // Enables local history zero-prefix suggestions in every context in which the |
| // remote zero-prefix suggestions are enabled. |
| BASE_FEATURE(kLocalHistoryZeroSuggestBeyondNTP, |
| "LocalHistoryZeroSuggestBeyondNTP", |
| DISABLED); |
| |
| // If enabled, zero prefix suggestions will be stored using an in-memory caching |
| // service, instead of using the existing prefs-based cache. |
| BASE_FEATURE(kZeroSuggestInMemoryCaching, |
| "ZeroSuggestInMemoryCaching", |
| DISABLED); |
| |
| // Enables the use of a request debouncer to throttle the number of ZPS prefetch |
| // requests initiated over a given period of time (to help minimize the |
| // performance impact of ZPS prefetching on the remote Suggest service). |
| BASE_FEATURE(kZeroSuggestPrefetchDebouncing, |
| "ZeroSuggestPrefetchDebouncing", |
| DISABLED); |
| |
| // Enables prefetching of the zero prefix suggestions for eligible users on NTP. |
| BASE_FEATURE(kZeroSuggestPrefetching, "ZeroSuggestPrefetching", ENABLED); |
| |
| // Enables prefetching of the zero prefix suggestions for eligible users on SRP. |
| BASE_FEATURE(kZeroSuggestPrefetchingOnSRP, |
| "ZeroSuggestPrefetchingOnSRP", |
| enable_if(!IS_ANDROID)); |
| |
| // Enables prefetching of the zero prefix suggestions for eligible users on the |
| // Web (i.e. non-NTP and non-SRP URLs). |
| BASE_FEATURE(kZeroSuggestPrefetchingOnWeb, |
| "ZeroSuggestPrefetchingOnWeb", |
| DISABLED); |
| |
| // Features to provide head and tail non personalized search suggestion from |
| // compact on device models. More specifically, feature name with suffix |
| // Incognito / NonIncognito will only controls behaviors under incognito / |
| // non-incognito mode respectively. |
| BASE_FEATURE(kOnDeviceHeadProviderIncognito, |
| "OmniboxOnDeviceHeadProviderIncognito", |
| ENABLED); |
| BASE_FEATURE(kOnDeviceHeadProviderNonIncognito, |
| "OmniboxOnDeviceHeadProviderNonIncognito", |
| ENABLED); |
| BASE_FEATURE(kOnDeviceTailModel, "OmniboxOnDeviceTailModel", DISABLED); |
| BASE_FEATURE(kOnDeviceTailEnableEnglishModel, |
| "OmniboxOnDeviceTailEnableEnglishModel", |
| ENABLED); |
| |
| // Feature used to fetch document suggestions. |
| BASE_FEATURE(kDocumentProvider, |
| "OmniboxDocumentProvider", |
| enable_if(!IS_ANDROID && !IS_IOS)); |
| |
| // If enabled, the authentication requirement for Drive suggestions is based on |
| // whether the primary account is available, i.e., the user is signed into |
| // Chrome, rarther than checking if any signed in account is available in the |
| // cookie jar. |
| BASE_FEATURE(kDocumentProviderPrimaryAccountRequirement, |
| "OmniboxDocumentProviderPrimaryAccountRequirement", |
| ENABLED); |
| |
| // If enabled, the primary account must be subject to enterprise policies in |
| // order to receive Drive suggestions. |
| BASE_FEATURE(kDocumentProviderEnterpriseEligibility, |
| "OmniboxDocumentProviderEnterpriseEligibility", |
| ENABLED); |
| |
| // If enabled, the enterprise eligibility requirement for Drive suggestions |
| // is considered met even when the account capability is unknown. Has no effect |
| // if kDocumentProviderEnterpriseEligibility is disabled. |
| BASE_FEATURE(kDocumentProviderEnterpriseEligibilityWhenUnknown, |
| "OmniboxDocumentProviderEnterpriseEligibilityWhenUnknown", |
| DISABLED); |
| |
| // If enabled, the requirement to be in an active Sync state is removed and |
| // Drive suggestions are available to all clients who meet the other |
| // requirements. |
| BASE_FEATURE(kDocumentProviderNoSyncRequirement, |
| "OmniboxDocumentProviderNoSyncRequirement", |
| ENABLED); |
| |
| // If enabled, the omnibox popup is not presented until the mouse button is |
| // released. |
| BASE_FEATURE(kShowPopupOnMouseReleased, |
| "OmniboxShowPopupOnMouseReleased", |
| ENABLED); |
| |
| // If enabled, makes Most Visited Tiles a Horizontal render group. |
| // Horizontal render group decomposes aggregate suggestions (such as old Most |
| // Visited Tiles), expecting individual AutocompleteMatch entry for every |
| // element in the carousel. |
| BASE_FEATURE(kMostVisitedTilesHorizontalRenderGroup, |
| "OmniboxMostVisitedTilesHorizontalRenderGroup", |
| enable_if(IS_ANDROID)); |
| |
| // If enabled, expands autocompletion to possibly (depending on params) include |
| // suggestion titles and non-prefixes as opposed to be restricted to URL |
| // prefixes. Will also adjust the location bar UI and omnibox text selection to |
| // accommodate the autocompletions. |
| BASE_FEATURE(kRichAutocompletion, "OmniboxRichAutocompletion", ENABLED); |
| |
| // If enabled, shows the omnibox suggestions popup in WebUI. |
| BASE_FEATURE(kWebUIOmniboxPopup, "WebUIOmniboxPopup", DISABLED); |
| |
| // When enabled, use Assistant for omnibox voice query recognition instead of |
| // Android's built-in voice recognition service. Only works on Android. |
| BASE_FEATURE(kOmniboxAssistantVoiceSearch, |
| "OmniboxAssistantVoiceSearch", |
| DISABLED); |
| |
| // When enabled, the multimodal input button is shown in the Omnibox. |
| BASE_FEATURE(kOmniboxMultimodalInput, "OmniboxMultimodalInput", DISABLED); |
| |
| // Whether the AI Mode entrypoint is shown in the Omnibox as a RHS button. |
| BASE_FEATURE(kAiModeOmniboxEntryPoint, "AiModeOmniboxEntryPoint", DISABLED); |
| |
| // Feature used to default typed navigations to use HTTPS instead of HTTP. |
| // This only applies to navigations that don't have a scheme such as |
| // "example.com". Presently, typing "example.com" in a clean browsing profile |
| // loads http://example.com. When this feature is enabled, it should load |
| // https://example.com instead, with fallback to http://example.com if |
| // necessary. |
| // TODO(crbug.com/375004882): On non-iOS platforms, this feature is now |
| // superseded by HTTPS-Upgrades and will be removed in the near future. |
| BASE_FEATURE(kDefaultTypedNavigationsToHttps, |
| "OmniboxDefaultTypedNavigationsToHttps", |
| enable_if(IS_IOS)); |
| |
| // Override the delay to create a spare renderer when the omnibox is focused |
| // on Android. |
| BASE_FEATURE(kOverrideAndroidOmniboxSpareRendererDelay, |
| "OverrideAndroidOmniboxSpareRendererDelay", |
| DISABLED); |
| |
| // Parameter name used to look up the delay before falling back to the HTTP URL |
| // while trying an HTTPS URL. The parameter is treated as a TimeDelta, so the |
| // unit must be included in the value as well (e.g. 3s for 3 seconds). |
| // - If the HTTPS load finishes successfully during this time, the timer is |
| // cleared and no more work is done. |
| // - Otherwise, a new navigation to the the fallback HTTP URL is started. |
| const char kDefaultTypedNavigationsToHttpsTimeoutParam[] = "timeout"; |
| |
| // If enabled, logs Omnibox URL scoring signals to OmniboxEventProto for |
| // training the ML scoring models. |
| BASE_FEATURE(kLogUrlScoringSignals, "LogUrlScoringSignals", DISABLED); |
| |
| // If true, enables history scoring signal annotator for populating history |
| // scoring signals associated with Search suggestions. These signals will be |
| // empty for Search suggestions otherwise. |
| BASE_FEATURE(kEnableHistoryScoringSignalsAnnotatorForSearches, |
| "EnableHistoryScoringSignalsAnnotatorForSearches", |
| DISABLED); |
| |
| // If enabled, (floating-point) ML model scores are mapped to (integral) |
| // relevance scores by means of a piecewise function. This allows for the |
| // integration of URL model scores with search traditional scores. |
| BASE_FEATURE(kMlUrlPiecewiseMappedSearchBlending, |
| "MlUrlPiecewiseMappedSearchBlending", |
| DISABLED); |
| |
| // If enabled, the ML scoring service will make use of an in-memory ML score |
| // cache in order to speed up the overall scoring process. |
| BASE_FEATURE(kMlUrlScoreCaching, "MlUrlScoreCaching", enable_if(!IS_ANDROID)); |
| |
| // If enabled, runs the ML scoring model to assign new relevance scores to the |
| // URL suggestions and reranks them. |
| BASE_FEATURE(kMlUrlScoring, "MlUrlScoring", enable_if(!IS_ANDROID)); |
| |
| // If enabled, specifies how URL model scores integrate with search traditional |
| // scores. |
| BASE_FEATURE(kMlUrlSearchBlending, "MlUrlSearchBlending", DISABLED); |
| |
| // If enabled, creates Omnibox autocomplete URL scoring model. Prerequisite for |
| // `kMlUrlScoring` & `kMlUrlSearchBlending`. |
| BASE_FEATURE(kUrlScoringModel, "UrlScoringModel", enable_if(!IS_ANDROID)); |
| |
| BASE_FEATURE(kAnimateSuggestionsListAppearance, |
| "AnimateSuggestionsListAppearance", |
| ENABLED); |
| |
| BASE_FEATURE(kOmniboxAnswerActions, "OmniboxAnswerActions", DISABLED); |
| |
| // If enabled, treats categorical suggestions just like the entity suggestions |
| // by reusing the `ACMatchType::SEARCH_SUGGEST_ENTITY` and reports the original |
| // `omnibox::TYPE_CATEGORICAL_QUERY` to the server. |
| BASE_FEATURE(kCategoricalSuggestions, "CategoricalSuggestions", ENABLED); |
| |
| // If enabled, sends a signal when a user touches down on a search suggestion to |
| // |SearchPrefetchService|. |SearchPrefetchService| will then prefetch |
| // suggestion iff the SearchNavigationPrefetch feature and "touch_down" param |
| // are enabled. |
| BASE_FEATURE(kOmniboxTouchDownTriggerForPrefetch, |
| "OmniboxTouchDownTriggerForPrefetch", |
| enable_if(IS_ANDROID)); |
| |
| // Enables keyword-based site search functionality on Android devices. |
| BASE_FEATURE(kOmniboxSiteSearch, "OmniboxSiteSearch", DISABLED); |
| |
| // Enables additional site search providers for the Site search Starter Pack. |
| BASE_FEATURE(kStarterPackExpansion, |
| "StarterPackExpansion", |
| enable_if(!IS_ANDROID && !IS_IOS)); |
| |
| // Enables an informational IPH message at the bottom of the Omnibox directing |
| // users to certain starter pack engines. |
| BASE_FEATURE(kStarterPackIPH, "StarterPackIPH", DISABLED); |
| |
| // If enabled, |SearchProvider| will not function in Zero Suggest. |
| BASE_FEATURE(kAblateSearchProviderWarmup, |
| "AblateSearchProviderWarmup", |
| DISABLED); |
| |
| // If enabled, hl= is reported in search requests (applicable to iOS only). |
| BASE_FEATURE(kReportApplicationLanguageInSearchRequest, |
| "ReportApplicationLanguageInSearchRequest", |
| ENABLED); |
| |
| // Enable asynchronous Omnibox/Suggest view inflation. |
| BASE_FEATURE(kOmniboxAsyncViewInflation, "OmniboxAsyncViewInflation", DISABLED); |
| |
| // Use FusedLocationProvider on Android to fetch device location. |
| BASE_FEATURE(kUseFusedLocationProvider, "UseFusedLocationProvider", ENABLED); |
| |
| // Enables storing successful query/match in the shortcut database On Android. |
| BASE_FEATURE(kOmniboxShortcutsAndroid, "OmniboxShortcutsAndroid", ENABLED); |
| |
| // Updates various NTP/Omnibox assets and descriptions for visual alignment on |
| // iOS. |
| BASE_FEATURE(kOmniboxMobileParityUpdate, "OmniboxMobileParityUpdate", ENABLED); |
| |
| // Updates various NTP/Omnibox assets and descriptions for visual alignment on |
| // Android and iOS, V2. |
| BASE_FEATURE(kOmniboxMobileParityUpdateV2, |
| "OmniboxMobileParityUpdateV2", |
| DISABLED); |
| |
| #if BUILDFLAG(IS_IOS) |
| // Updates the search engine logo on NTP. iOS only. |
| BASE_FEATURE(kOmniboxMobileParityUpdateV3, |
| "OmniboxMobileParityUpdateV3", |
| DISABLED); |
| #endif // BUILDFLAG(IS_IOS) |
| |
| // The features below allow tuning number of suggestions offered to users in |
| // specific contexts. These features are default enabled and are used to control |
| // related fieldtrial parameters. |
| BASE_FEATURE(kNumNtpZpsRecentSearches, |
| "OmniboxNumNtpZpsRecentSearches", |
| ENABLED); |
| BASE_FEATURE(kNumNtpZpsTrendingSearches, |
| "OmniboxNumNtpZpsTrendingSearches", |
| ENABLED); |
| BASE_FEATURE(kNumWebZpsRecentSearches, |
| "OmniboxNumWebZpsRecentSearches", |
| ENABLED); |
| BASE_FEATURE(kNumWebZpsRelatedSearches, |
| "OmniboxNumWebZpsRelatedSearches", |
| ENABLED); |
| BASE_FEATURE(kNumWebZpsMostVisitedUrls, |
| "OmniboxNumWebZpsMostVisitedUrls", |
| ENABLED); |
| BASE_FEATURE(kNumSrpZpsRecentSearches, |
| "OmniboxNumSrpZpsRecentSearches", |
| ENABLED); |
| BASE_FEATURE(kNumSrpZpsRelatedSearches, |
| "OmniboxNumSrpZpsRelatedSearches", |
| ENABLED); |
| |
| // If enabled, search aggregators defined by the |
| // EnterpriseSearchAggregatorSettings policy are saved into prefs and available |
| // in the TemplateURLService, so that they can be accessed from the Omnibox and |
| // the Settings page. |
| BASE_FEATURE(kEnableSearchAggregatorPolicy, |
| "EnableSearchAggregatorPolicy", |
| ENABLED); |
| |
| // If enabled, site search engines, defined by the `SiteSearchSettings` policy, |
| // can be marked as user-overridable by administrators using an |
| // `allow_user_override` field. This setting is stored in preferences and |
| // determines if the engine can be overridden on the Settings page. |
| BASE_FEATURE(kEnableSiteSearchAllowUserOverridePolicy, |
| "EnableSiteSearchAllowUserOverridePolicy", |
| ENABLED); |
| |
| // Enables preconnecting to omnibox suggestions that are not only Search types. |
| BASE_FEATURE(kPreconnectNonSearchOmniboxSuggestions, |
| "PreconnectNonSearchOmniboxSuggestions", |
| DISABLED); |
| |
| // Enables restricting omnibox focus restoration to only situations that involve |
| // "invisible focus". |
| BASE_FEATURE(kOmniboxRestoreInvisibleFocusOnly, |
| "OmniboxRestoreInvisibleFocusOnly", |
| DISABLED); |
| |
| // Enabls adding an aim shortcut in the typed state. |
| BASE_FEATURE(kOmniboxAimShortcutTypedState, |
| "OmniboxAimShortcutTypedState", |
| DISABLED); |
| |
| // When enabled, unblocks omnibox height on small form factor devices, allowing |
| // users to type in multiline / longer text. |
| BASE_FEATURE(kMultilineEditField, "OmniboxMultilineEditField", DISABLED); |
| |
| // Hides the AIM entrypoint in the Omnibox when user input is in progress. |
| BASE_FEATURE(kHideAimEntrypointOnUserInput, |
| "OmniboxHideAimEntrypointOnUserInput", |
| DISABLED); |
| |
| #if BUILDFLAG(IS_ANDROID) |
| // Accelerates time from cold start to focused Omnibox on low-end devices, |
| // prioritizing Omnibox focus and background initialization. |
| BASE_FEATURE(kJumpStartOmnibox, "JumpStartOmnibox", DISABLED); |
| |
| // Prevents intermediate AutocompleteResult updates from being sent to Java on |
| // low-end devices. This aims at eliminating time spent on constructing, |
| // measuring, and laying out views that are about to be discarded, and reducing |
| // the volume of JNI jumps. |
| BASE_FEATURE(kSuppressIntermediateACUpdatesOnLowEndDevices, |
| "SuppressIntermediateACUpdatesOnLowEndDevices", |
| DISABLED); |
| |
| // (Android only) Show tab groups via the search feature in the hub. |
| BASE_FEATURE(kAndroidHubSearchTabGroups, "AndroidHubSearchTabGroups", DISABLED); |
| |
| // When enabled, delay focusTab to prioritize navigation |
| // (https://crbug.com/374852568). |
| BASE_FEATURE(kPostDelayedTaskFocusTab, "PostDelayedTaskFocusTab", ENABLED); |
| |
| // Controls various Omnibox Diagnostics features. |
| BASE_FEATURE(kDiagnostics, "OmniboxDiagnostics", DISABLED); |
| |
| namespace android { |
| static jlong JNI_OmniboxFeatureMap_GetNativeMap(JNIEnv* env) { |
| static const base::Feature* const kFeaturesExposedToJava[] = { |
| &kDiagnostics, |
| &kOmniboxAnswerActions, |
| &kAnimateSuggestionsListAppearance, |
| &kOmniboxTouchDownTriggerForPrefetch, |
| &kOmniboxAsyncViewInflation, |
| &kRichAutocompletion, |
| &kUseFusedLocationProvider, |
| &kJumpStartOmnibox, |
| &kAndroidHubSearchTabGroups, |
| &kPostDelayedTaskFocusTab, |
| &kOmniboxMobileParityUpdateV2, |
| &kOmniboxSiteSearch, |
| &kOmniboxAimShortcutTypedState, |
| &kOmniboxMultimodalInput, |
| &kMultilineEditField}; |
| static base::NoDestructor<base::android::FeatureMap> kFeatureMap( |
| kFeaturesExposedToJava); |
| return reinterpret_cast<jlong>(kFeatureMap.get()); |
| } |
| } // namespace android |
| #endif // BUILDFLAG(IS_ANDROID) |
| // Note: no new flags beyond this point. |
| } // namespace omnibox |