blob: 2ce8bee42e6ef103b00b739fa4b36408d186e7c7 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_OMNIBOX_COMMON_OMNIBOX_FEATURE_CONFIGS_H_
#define COMPONENTS_OMNIBOX_COMMON_OMNIBOX_FEATURE_CONFIGS_H_
#include "base/feature_list.h"
#include "base/gtest_prod_util.h"
#include "base/time/time.h"
#include "base/values.h"
class EnterpriseSearchManager;
class EnterpriseSearchManagerProviderInjectionTest;
class EnterpriseSearchManagerRequireShortcutTest;
FORWARD_DECLARE_TEST(EnterpriseSearchManagerProviderInjectionTest, Verify);
namespace omnibox_feature_configs {
/*
Finch params aren't cached. Reading the params 100's of times per omnibox
input significantly impacts metrics. Configs cache the params to avoid
regressions. 3 steps:
(1) Declare/define the config:
// omnibox_feature_configs.h
struct MyFeature : Config<MyFeature> {
DECLARE_FEATURE(kMyFeature);
MyFeature();
bool enabled;
int my_param;
}
// omnibox_feature_configs.cc
// static
BASE_FEATURE(MyFeature::kMyFeature, "OmniboxMyFeature",
base::FEATURE_DISABLED_BY_DEFAULT);
MyFeature::MyFeature() {
enabled = base::FeatureList::IsEnabled(kMyFeature);
my_param = base::FeatureParam<int>(&kMyFeature, "my_param", 0).Get();
}
(2) Use the config:
int x = omnibox_feature_configs::MyFeature::Get().my_param;
(3) Override the config in tests:
omnibox_feature_configs::ScopedConfigForTesting<
omnibox_feature_configs::MyFeature> scoped_config;
scoped_config.Get().enabled = true;
scoped_config.Get().my_param = 1;
scoped_config.Reset();
scoped_config.Get().enabled = true;
scoped_config.Get().my_param = 2;
instead of:
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list_.InitAndEnableFeatureWithParameters(
omnibox_feature_configs::MyFeature::kMyFeature, {{"my_param", "1"}});
scoped_feature_list.Reset();
scoped_feature_list_.InitAndEnableFeatureWithParameters(
omnibox_feature_configs::MyFeature::kMyFeature, {{"my_param", "2"}});
*/
// A substitute for `BASE_DECLARE_FEATURE` for nesting in structs.
#define DECLARE_FEATURE(feature) static constinit const base::Feature feature
// Base class other configs should inherit from.
template <class T>
class Config {
public:
static const T& Get() {
static T* config;
if (config == nullptr)
config = new T();
return *config;
}
};
// Util for overriding configs in tests.
template <class T>
class ScopedConfigForTesting : Config<T> {
public:
ScopedConfigForTesting() : original_config_(Get()) { Reset(); }
~ScopedConfigForTesting() { Get() = original_config_; }
T& Get() { return const_cast<T&>(T::Get()); }
void Reset() { Get() = {}; }
private:
const T original_config_;
};
// Add new configs below, ordered alphabetically.
// If enabled, adds recent calc suggestions.
struct CalcProvider : Config<CalcProvider> {
DECLARE_FEATURE(kCalcProvider);
CalcProvider();
bool enabled;
// The base score of calc suggestions.
int score;
// Number of calc suggestions to show.
size_t max_matches;
// Number of inputs that aren't a clear calculator-y input to continue showing
// calc suggestions for.
size_t num_non_calc_inputs;
};
// AIM related omnibox features.
struct AiMode : Config<AiMode> {
DECLARE_FEATURE(kAllowAiModeMatches);
DECLARE_FEATURE(kAiModeEligibility);
AiMode();
// Chromium-side guard for AI matches from the search server. Enabling this
// won't guarantee AI mode matches are shown; that mostly depends on server
// side. But disabling this will hide the server echo matches.
bool allow_ai_mode_matches;
// Deduping doesn't consider extra query params like `udm=50`.
// `google.com/?q=query&udm=50` and `google.com/?q=query` would usually be
// deduped. This param makes `udm=50` in the match's suggest template a
// differentiating signal in deduping. Does not apply to `udm=50` in normal
// URLs. Does not apply to e.g. `udm=49` in the suggest template.
bool do_not_dedupe_aim_suggestions = true;
// Navigations that match a site search update the `keyword_search_terms`
// table in the history DB. E.g. youtube.com/id/x, google.com/?q=x, or
// google.com/?q=x&udm=50. Determining which site search was used and should
// be attributed does not consider query params. Navigating to either
// google.com/?q=x or google.com/?q=x&udm=50 will each attribute both the
// Google and AI mode site searches. When
// `do_not_show_historic_aim_suggestions` is enabled, 2 things change:
// 1. AI mode navigations don't increment any site search. This ensures the
// user won't see a traditional history search suggestion for an AI mode
// search they've done.
// 2. No navigation increments the AI mode site search. This ensures the user
// won't see AI mode history search suggestions for a traditional search
// they've done.
// These changes apply to both omnibox and other (e.g. bookmark, web)
// navigations.
bool do_not_show_historic_aim_suggestions = true;
// Whether to check for AI mode eligibility on the client side
// `AimEligibilityService` based on the user's locale.
bool check_ai_locale_client_side = true;
// If true, use the gws side eligibility values. Otherwise, ignore the gws
// side response and use client side eligibility values.
bool check_ai_eligibility_gws_side = false;
};
// If enabled, show the AIM entrypoint in the omnibox.
struct AiModeOmniboxEntryPoint : Config<AiModeOmniboxEntryPoint> {
AiModeOmniboxEntryPoint();
bool enabled;
// Never display AIM hint text.
bool hide_aim_hint_text;
// Whether to hide the AIM hint text on NTP open.
bool hide_aim_hint_text_on_ntp_open;
// Whether to hide the other (non-AIM) page actions on NTP.
bool hide_other_page_actions_on_ntp;
};
// A config struct for features related to contextual search in omnibox.
struct ContextualSearch : Config<ContextualSearch> {
ContextualSearch();
ContextualSearch(const ContextualSearch&);
ContextualSearch& operator=(const ContextualSearch&);
~ContextualSearch();
DECLARE_FEATURE(kContextualSuggestionsAblateOthersWhenPresent);
DECLARE_FEATURE(kOmniboxContextualSuggestions);
DECLARE_FEATURE(kStarterPackPage);
DECLARE_FEATURE(kContextualZeroSuggestLensFulfillment);
DECLARE_FEATURE(kContextualSearchProviderAsyncSuggestInputs);
DECLARE_FEATURE(kSendContextualUrlSuggestParam);
DECLARE_FEATURE(kOmniboxContextualSearchOnFocusSuggestions);
DECLARE_FEATURE(kContextualSearchBoxUsesContextualSearchProvider);
DECLARE_FEATURE(kOmniboxZeroSuggestSynchronousMatchesOnly);
DECLARE_FEATURE(kContextualSearchOpenLensActionUsesThumbnail);
DECLARE_FEATURE(kSendPageTitleSuggestParam);
DECLARE_FEATURE(kContextualSearchAlternativeActionLabel);
DECLARE_FEATURE(kUseApcPaywallSignal);
DECLARE_FEATURE(kShowSuggestionsOnNoApc);
DECLARE_FEATURE(kOpenLensActionUITweaks);
DECLARE_FEATURE(kSuggestionsFulfilledByLensSupported);
DECLARE_FEATURE(kLoadingSuggestionsAnimation);
// Whether to use contextual search features, for example the lens action.
bool IsContextualSearchEnabled() const;
// Whether to enable prefetching to support this feature's synchronous
// match production requirement.
bool IsEnabledWithPrefetch() const;
// Whether to make contextual suggestions exclusive; that is, remove
// other kinds of zero suggest matches when there are any contextual
// search matches.
bool contextual_suggestions_ablate_others_when_present;
// Whether to restrict the ablation logic, triggered via
// `contextual_suggestions_ablate_others_when_present`, such that we only
// remove (non-contextual) search suggestions, instead of removing all
// (non-contextual) zero suggest matches altogether.
bool contextual_suggestions_ablate_search_only;
// Whether to restrict the ablation logic, triggered via
// `contextual_suggestions_ablate_others_when_present`, such that we only
// remove URL suggestions, instead of removing all (non-contextual) zero
// suggest matches altogether.
bool contextual_suggestions_ablate_url_only;
// Whether the starter pack page scope is enabled.
bool starter_pack_page;
// Enables fullfillment of contextual zero-prefix suggestions by delegating
// the logic to Lens.
bool contextual_zero_suggest_lens_fulfillment;
// Controls async request handling in `ContextualSearchProvider`.
bool csp_async_suggest_inputs;
// This specifies the value for "ctxus" param on zero suggest requests,
// and is left empty when that parameter is not to be included.
std::string contextual_url_suggest_param;
// Maximum number of contextual search suggestions for zero prefix suggest.
size_t contextual_zps_limit;
// Whether to use ContextualSearchProvider instead of ZeroSuggestProvider for
// sourcing contextual search box matches.
bool csb_uses_csp;
// Whether to omit asynchronous matches in ZeroSuggestProvider specifically,
// a behavior that is relevant to one planned configuration of this feature.
bool zero_suggest_synchronous_matches_only;
// Whether the Lens entrypoint action uses a thumbnail of web contents view
// instead of its regular vector icon.
bool open_lens_action_uses_thumbnail;
// Whether to send the current page title (via "pageTitle" CGI param) on zero
// suggest requests.
// When set to false, the CGI param will not be sent at all (as opposed to
// sending an empty value).
bool send_page_title_suggest_param;
// Which alternative action label to use for lens entrypoint action.
int alternative_action_label;
// Whether the Lens entrypoint action should be shown in the Omnibox popup.
bool show_open_lens_action;
// Whether to use the APC paywall signal to determine whether to show
// contextual suggestions.
bool use_apc_paywall_signal;
// Whether to show contextual suggestions when the user focuses the omnibox
// but APC is not yet available.
bool show_suggestions_on_no_apc;
// Whether to show the Lens entrypoint action with the new UI tweaks.
bool open_lens_action_ui_tweaks;
// Whether the feature to allow contextual search suggestions to be fulfilled
// by Lens is supported. This allows contextual suggestions to open the Lens
// overlay in the selection state. This is in contrast to the default behavior
// where the suggestion is fulfilled by the contextual searchbox.
bool suggestions_fulfilled_by_lens_supported;
// Whether to enable the loading suggestions animation. This adds an
// animation when contextual suggestions load into the omnibox popup.
bool enable_loading_suggestions_animation;
// The duration of the position animation when loading suggestions.
int loading_suggestions_position_animation_duration;
// The delay after the position animation begins that the opacity animation
// should start after.
int loading_suggestions_opacity_animation_delay;
// The duration of the opacity animation when loading suggestions.
int loading_suggestions_opacity_animation_duration;
};
// If enabled, allows MIA zero-prefix suggestions in NTP omnibox and realbox.
struct MiaZPS : Config<MiaZPS> {
DECLARE_FEATURE(kOmniboxMiaZPS);
MiaZPS();
MiaZPS(const MiaZPS&);
MiaZPS(MiaZPS&&);
MiaZPS& operator=(const MiaZPS&);
MiaZPS& operator=(MiaZPS&&);
~MiaZPS();
bool enabled;
// Whether to use non-normalized text for local history zp suggestions.
bool local_history_non_normalized_contents;
bool suppress_psuggest_backfill_with_mia;
};
// A config struct for the omnibox toolbelt.
struct Toolbelt : Config<Toolbelt> {
DECLARE_FEATURE(kOmniboxToolbelt);
Toolbelt();
Toolbelt(const Toolbelt&);
Toolbelt& operator=(const Toolbelt&);
~Toolbelt();
// Whether the toolbelt is to be included in the omnibox.
bool enabled;
// Whether the toolbelt will be preserved after user types (after
// input clears the zero suggest).
bool keep_toolbelt_after_input;
// Whether the toolbelt is preserved after entering keyword mode.
bool keep_toolbelt_in_keyword_mode;
// Whether the lens entrypoint action should stay unconditionally on the
// toolbelt. When this is false, the regular triggering conditions apply
// so the action can sometimes be included or sometimes not.
bool always_include_lens_action;
// Some of the variants we want to experiment with want a subset of actions.
// For flexibility, may as well make all the actions finch params.
// Disabling `show_lens_action` takes precedence over
// `always_include_lens_action`.
bool show_lens_action_on_non_ntp;
bool show_lens_action_on_ntp;
bool show_ai_mode_action_on_non_ntp;
bool show_ai_mode_action_on_ntp;
bool show_history_action_on_non_ntp;
bool show_history_action_on_ntp;
bool show_bookmarks_action_on_non_ntp;
bool show_bookmarks_action_on_ntp;
bool show_tabs_action_on_non_ntp;
bool show_tabs_action_on_ntp;
// Whether to rebuild button row views for the toolbelt without checking
// the row's action count. This defaults to true and is just a kill switch
// in case of an unexpected performance regression (safer to merge).
bool rebuild_button_row_views;
// Whether to set the location bar `OmniboxView` icon to the selected
// toolbelt action's icon, when a toolbelt action is selected via keyboard.
bool use_action_icons_in_location_bar;
// Whether to select the toolbelt match before opening one of its actions.
// This has the effect of taking the toolbelt match's fill into edit, the
// verbatim user input text, instead of any text that might have been selected
// or inline autocompleted previously.
bool select_toolbelt_before_opening;
};
// If enabled, adjusts the indentation of the omnibox input and matches to fix
// the visual shift in omnibox input text when the omnibox popup opens.
struct AdjustOmniboxIndent : Config<AdjustOmniboxIndent> {
DECLARE_FEATURE(kAdjustOmniboxIndent);
AdjustOmniboxIndent();
// Whether to indent the omnibox input text and icon when the popup is closed.
bool indent_input_when_popup_closed;
// Amount by which the indentation of the omnibox input icon is offset.
int input_icon_indent_offset;
// Amount by which the indentation of the omnibox input text is offset.
int input_text_indent_offset;
// Amount by which the indentation of the omnibox match icon is offset.
int match_icon_indent_offset;
// Amount by which the indentation of the omnibox match text is offset.
int match_text_indent_offset;
};
// If enabled, allow document provider requests when all other conditions are
// met.
struct DocumentProvider : Config<DocumentProvider> {
DocumentProvider();
DocumentProvider(const DocumentProvider&);
DocumentProvider(DocumentProvider&&);
DocumentProvider& operator=(const DocumentProvider&);
DocumentProvider& operator=(DocumentProvider&&);
~DocumentProvider();
bool enabled;
// The minimum input length required before requesting document suggestions.
size_t min_query_length;
// Whether to scope backoff state to the profile instead of the current
// window.
bool scope_backoff_to_profile;
// How long to continue backing off from making new document suggestion
// requests after receiving a backoff signal, when the backoff state is scoped
// to the profile. If this is set to 0 (the default value) or a negative
// value, the backoff state never resets. If this is set to a positive value,
// the backoff state is reset after the specified amount of time. The value
// can be supplied using --enable-features or in an experiment config using
// the string representation expected by `base::TimeDeltaFromString()` (e.g.
// "10m" or "12h"). Has no effect when `scope_backoff_to_profile` is false.
base::TimeDelta backoff_duration;
};
// If enabled, pretends all matches are allowed to be default. This is very
// blunt, and needs refining before being launch ready. E.g. how does this
// affect transferred matches? This might cause crashes. This can result in
// misleading inline autocompletion; e.g. the bing.com favicon looks like the
// search loupe, so inlined bing results will like DSE search suggestions.
struct ForceAllowedToBeDefault : Config<ForceAllowedToBeDefault> {
DECLARE_FEATURE(kForceAllowedToBeDefault);
ForceAllowedToBeDefault();
ForceAllowedToBeDefault(const ForceAllowedToBeDefault&);
ForceAllowedToBeDefault(ForceAllowedToBeDefault&&);
ForceAllowedToBeDefault& operator=(const ForceAllowedToBeDefault&);
ForceAllowedToBeDefault& operator=(ForceAllowedToBeDefault&&);
~ForceAllowedToBeDefault();
bool enabled;
};
// If enabled, NTP Realbox second column will allow displaying contextual and
// trending suggestions.
struct RealboxContextualAndTrendingSuggestions
: Config<RealboxContextualAndTrendingSuggestions> {
DECLARE_FEATURE(kRealboxContextualAndTrendingSuggestions);
RealboxContextualAndTrendingSuggestions();
RealboxContextualAndTrendingSuggestions(
const RealboxContextualAndTrendingSuggestions&);
RealboxContextualAndTrendingSuggestions(
RealboxContextualAndTrendingSuggestions&&);
RealboxContextualAndTrendingSuggestions& operator=(
const RealboxContextualAndTrendingSuggestions&);
RealboxContextualAndTrendingSuggestions& operator=(
RealboxContextualAndTrendingSuggestions&&);
~RealboxContextualAndTrendingSuggestions();
bool enabled;
// The total number of matches a Section can contain across all Groups.
size_t total_limit;
// The total number of matches the `omnibox::GROUP_PREVIOUS_SEARCH_RELATED`
// Group can contain.
size_t contextual_suggestions_limit;
// The total number of matches the `omnibox::GROUP_TRENDS` Group can contain.
size_t trending_suggestions_limit;
};
// If enabled, injects a mock search engine using the same format as policy
// `EnterpriseSearchAggregatorSettings` to be applied. Ignored if feature
// policy is set.
struct SearchAggregatorProvider : Config<SearchAggregatorProvider> {
DECLARE_FEATURE(kSearchAggregatorProvider);
SearchAggregatorProvider();
SearchAggregatorProvider(const SearchAggregatorProvider&);
SearchAggregatorProvider& operator=(const SearchAggregatorProvider&);
~SearchAggregatorProvider();
bool enabled;
// Minimum length input must be to run the
// `EnterpriseSearchAggregatorProvider`.
int min_query_length;
// If true, the response will be parsed in a utility process.
bool parse_response_in_utility_process;
// If true, the newer Discovery Engine OAuth scope will be used in suggestions
// requests.
bool use_discovery_engine_oauth_scope;
// If true, doc provider won't run outside the drive scope. If false, doc
// provider will run unscoped. Either way, doc provider won't run when in the
// enterprise scope.
bool disable_drive;
// If true, the `EnterpriseSearchAggregatorSuggestionsService` will make
// parallel requests for each type of suggestion.
bool multiple_requests;
// The specified value controls how `EnterpriseSearchAggregatorProvider` will
// score suggestions. The following values are supported:
// "mixed": Use server-provided scores in scoped mode and client-calculated
// scores in unscoped mode. This is the default behavior and is also used
// if the supplied value is not one of the other options.
// "server": Use server-provided scores in both scoped and unscoped mode.
// "client": Use client-calculated scores in both scoped and unscoped mode.
std::string relevance_scoring_mode;
// If true, show unscoped `EnterpriseSearchAggregatorProvider` suggestions in
// the NTP realbox.
bool realbox_unscoped_suggestions;
// See comments in enterprise_search_aggregator_provider.cc
size_t scoring_max_matches_created_per_type;
size_t scoring_max_scoped_matches_shown_per_type;
size_t scoring_max_unscoped_matches_shown_per_type;
size_t scoring_min_char_for_strong_text_match;
size_t scoring_min_words_for_full_text_match_boost;
int scoring_full_text_match_score;
int scoring_score_per_strong_text_match;
int scoring_score_per_weak_text_match;
int scoring_max_text_score;
int scoring_people_score_boost;
int scoring_people_email_match_score_boost;
bool scoring_prefer_contents_over_queries;
size_t scoring_scoped_max_low_quality_matches;
size_t scoring_unscoped_max_low_quality_matches;
int scoring_low_quality_threshold;
private:
// Utility methods and members for setting up a mock search engine via Finch.
// Restricted to `EnterpriseSearchManager` and its tests.
friend class ::EnterpriseSearchManager;
friend class ::EnterpriseSearchManagerProviderInjectionTest;
friend class ::EnterpriseSearchManagerRequireShortcutTest;
FRIEND_TEST_ALL_PREFIXES(::EnterpriseSearchManagerProviderInjectionTest,
Verify);
bool AreMockEnginesValid() const;
std::vector<base::Value> CreateMockSearchEngines() const;
base::Value::Dict CreateMockSearchAggregator(bool featured_by_policy) const;
// The search engine name, shown in the Omnibox.
std::string name;
// The shortcut the user enters to trigger the search.
std::string shortcut;
// The URL on which to perform a search.
std::string search_url;
// The URL that provides search suggestions.
std::string suggest_url;
// The URL to an imanage that will be used on search suggestions.
std::string icon_url;
// If enabled, Chrome will blend search suggestions with other Omnibox
// suggestions without requiring keyword mode.
bool require_shortcut;
};
// If enabled, uses RichAnswerTemplate instead of SuggestionAnswer to display
// answers.
struct SuggestionAnswerMigration : Config<SuggestionAnswerMigration> {
DECLARE_FEATURE(kOmniboxSuggestionAnswerMigration);
SuggestionAnswerMigration();
SuggestionAnswerMigration(const SuggestionAnswerMigration&);
SuggestionAnswerMigration(SuggestionAnswerMigration&&);
SuggestionAnswerMigration& operator=(const SuggestionAnswerMigration&);
SuggestionAnswerMigration& operator=(SuggestionAnswerMigration&&);
~SuggestionAnswerMigration();
bool enabled;
};
struct OmniboxZpsSuggestionLimit : Config<OmniboxZpsSuggestionLimit> {
DECLARE_FEATURE(kOmniboxZpsSuggestionLimit);
OmniboxZpsSuggestionLimit();
OmniboxZpsSuggestionLimit(const OmniboxZpsSuggestionLimit&);
OmniboxZpsSuggestionLimit(OmniboxZpsSuggestionLimit&&);
OmniboxZpsSuggestionLimit& operator=(const OmniboxZpsSuggestionLimit&);
OmniboxZpsSuggestionLimit& operator=(OmniboxZpsSuggestionLimit&&);
~OmniboxZpsSuggestionLimit();
bool enabled;
// Max number of zps suggestions to show.
size_t max_suggestions;
// Max number of search zps suggestions to show.
size_t max_search_suggestions;
// Max number of url zps suggestions to show.
size_t max_url_suggestions;
};
// Enables url suggestions when omnibox is focused on Web/SRP.
struct OmniboxUrlSuggestionsOnFocus : Config<OmniboxUrlSuggestionsOnFocus> {
DECLARE_FEATURE(kOmniboxUrlSuggestionsOnFocus);
OmniboxUrlSuggestionsOnFocus();
OmniboxUrlSuggestionsOnFocus(const OmniboxUrlSuggestionsOnFocus&);
OmniboxUrlSuggestionsOnFocus& operator=(const OmniboxUrlSuggestionsOnFocus&);
~OmniboxUrlSuggestionsOnFocus();
bool enabled;
bool show_recently_closed_tabs;
// Number of days to consider for most visited sites (0-indexed).
size_t most_visited_recency_window;
// Recency factor heuristic used to calculate most visited sites. Must be
// one of `kMvtScoringParamRecencyFactor` feature param values listed in
// //components/history/core/browser/features.h.
std::string most_visited_recency_factor;
// Whether MostVisitedProvider should directly query HistoryService for its
// most visited sites list. False if the provider should query TopSites.
bool directly_query_history_service;
// Whether to prefetch the most visited sites.
bool prefetch_most_visited_sites;
// The debouncing delay (in milliseconds) to use when throttling
// HistoryService requests.
int prefetch_most_visited_sites_delay_ms;
// Max number of URLs that will be requested from history.
size_t max_requested_urls_from_history;
bool MostVisitedPrefetchingEnabled() const;
};
// Enables the HaTS for On-Focus ZPS so that it may show up for a user.
struct HappinessTrackingSurveyForOmniboxOnFocusZps
: Config<HappinessTrackingSurveyForOmniboxOnFocusZps> {
DECLARE_FEATURE(kHappinessTrackingSurveyForOmniboxOnFocusZps);
HappinessTrackingSurveyForOmniboxOnFocusZps();
HappinessTrackingSurveyForOmniboxOnFocusZps(
const HappinessTrackingSurveyForOmniboxOnFocusZps&);
HappinessTrackingSurveyForOmniboxOnFocusZps(
HappinessTrackingSurveyForOmniboxOnFocusZps&&);
HappinessTrackingSurveyForOmniboxOnFocusZps& operator=(
const HappinessTrackingSurveyForOmniboxOnFocusZps&);
HappinessTrackingSurveyForOmniboxOnFocusZps& operator=(
HappinessTrackingSurveyForOmniboxOnFocusZps&&);
~HappinessTrackingSurveyForOmniboxOnFocusZps();
bool enabled;
// Number of times the omnibox must be focused on SRP/Web before the survey
// may be shown
size_t focus_threshold;
// Number of ms before the survey may be shown.
size_t survey_delay;
// Trigger ID of Intent and Satisfaction survey.
std::string happiness_trigger_id;
// Trigger ID of Usefulness and Distraction survey.
std::string utility_trigger_id;
};
struct ComposeboxSuggestionLimit : Config<ComposeboxSuggestionLimit> {
DECLARE_FEATURE(kComposeboxSuggestionLimit);
ComposeboxSuggestionLimit();
ComposeboxSuggestionLimit(const ComposeboxSuggestionLimit&);
ComposeboxSuggestionLimit(ComposeboxSuggestionLimit&&);
ComposeboxSuggestionLimit& operator=(const ComposeboxSuggestionLimit&);
ComposeboxSuggestionLimit& operator=(ComposeboxSuggestionLimit&&);
~ComposeboxSuggestionLimit();
bool enabled;
// Max number of zps suggestions to show.
size_t max_suggestions;
// Max number of aim zps suggestions to show.
size_t max_aim_suggestions;
// Max number of contextual zps suggestions to show.
size_t max_contextual_suggestions;
};
// Do not add new configs here at the bottom by default. They should be ordered
// alphabetically.
#undef DECLARE_FEATURE
} // namespace omnibox_feature_configs
#endif // COMPONENTS_OMNIBOX_COMMON_OMNIBOX_FEATURE_CONFIGS_H_