#include "components/omnibox/browser/autocomplete_controller.h"
#include <inttypes.h>
#include <limits.h>
#include <algorithm>
#include <cstddef>
#include <map>
#include <memory>
#include <numeric>
#include <optional>
#include <queue>
#include <set>
#include <string>
#include <tuple>
#include <unordered_set>
#include <utility>
#include "base/check_op.h"
#include "base/containers/contains.h"
#include "base/feature_list.h"
#include "base/format_macros.h"
#include "base/functional/bind.h"
#include "base/metrics/field_trial_params.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/notreached.h"
#include "base/observer_list.h"
#include "base/ranges/algorithm.h"
#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task/single_thread_task_runner.h"
#include "base/time/time.h"
#include "base/timer/elapsed_timer.h"
#include "base/trace_event/memory_dump_manager.h"
#include "build/build_config.h"
#include "components/omnibox/browser/actions/omnibox_action_in_suggest.h"
#include "components/omnibox/browser/actions/omnibox_answer_action.h"
#include "components/omnibox/browser/actions/omnibox_pedal_provider.h"
#include "components/omnibox/browser/autocomplete_input.h"
#include "components/omnibox/browser/autocomplete_match_type.h"
#include "components/omnibox/browser/autocomplete_provider.h"
#include "components/omnibox/browser/autocomplete_provider_client.h"
#include "components/omnibox/browser/autocomplete_scoring_signals_annotator.h"
#include "components/omnibox/browser/bookmark_provider.h"
#include "components/omnibox/browser/bookmark_scoring_signals_annotator.h"
#include "components/omnibox/browser/builtin_provider.h"
#include "components/omnibox/browser/calculator_provider.h"
#include "components/omnibox/browser/clipboard_provider.h"
#include "components/omnibox/browser/document_provider.h"
#include "components/omnibox/browser/history_fuzzy_provider.h"
#include "components/omnibox/browser/history_quick_provider.h"
#include "components/omnibox/browser/history_scoring_signals_annotator.h"
#include "components/omnibox/browser/history_url_provider.h"
#include "components/omnibox/browser/keyword_provider.h"
#include "components/omnibox/browser/local_history_zero_suggest_provider.h"
#include "components/omnibox/browser/most_visited_sites_provider.h"
#include "components/omnibox/browser/omnibox_feature_configs.h"
#include "components/omnibox/browser/omnibox_field_trial.h"
#include "components/omnibox/browser/on_device_head_provider.h"
#include "components/omnibox/browser/open_tab_provider.h"
#include "components/omnibox/browser/page_classification_functions.h"
#include "components/omnibox/browser/search_provider.h"
#include "components/omnibox/browser/search_scoring_signals_annotator.h"
#include "components/omnibox/browser/shortcuts_provider.h"
#include "components/omnibox/browser/url_scoring_signals_annotator.h"
#include "components/omnibox/browser/voice_suggest_provider.h"
#include "components/omnibox/browser/zero_suggest_provider.h"
#include "components/omnibox/browser/zero_suggest_verbatim_match_provider.h"
#include "components/omnibox/common/omnibox_features.h"
#include "components/open_from_clipboard/clipboard_recent_content.h"
#include "components/optimization_guide/machine_learning_tflite_buildflags.h"
#include "components/search_engines/search_engine_type.h"
#include "components/search_engines/template_url.h"
#include "components/search_engines/template_url_service.h"
#include "components/search_engines/template_url_starter_pack_data.h"
#include "components/strings/grit/components_strings.h"
#include "components/url_formatter/elide_url.h"
#include "net/http/http_util.h"
#include "third_party/metrics_proto/omnibox_focus_type.pb.h"
#include "third_party/metrics_proto/omnibox_scoring_signals.pb.h"
#include "third_party/omnibox_proto/chrome_searchbox_stats.pb.h"
#include "third_party/omnibox_proto/types.pb.h"
#include "ui/base/device_form_factor.h"
#include "ui/base/l10n/l10n_util.h"
#include "url/url_canon.h"
#include "url/url_util.h"
#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
#include "components/omnibox/browser/featured_search_provider.h"
#endif
#if !BUILDFLAG(IS_IOS)
#include "components/history_clusters/core/config.h"
#include "components/history_embeddings/history_embeddings_features.h"
#include "components/omnibox/browser/actions/history_clusters_action.h"
#include "components/omnibox/browser/history_cluster_provider.h"
#include "components/omnibox/browser/history_embeddings_provider.h"
#include "components/open_from_clipboard/clipboard_recent_content_generic.h"
#endif
#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
#include "components/omnibox/browser/autocomplete_scoring_model_service.h"
#endif
constexpr bool kIsDesktop = …;
namespace …
AutocompleteController::OldResult::OldResult(UpdateType update_type,
AutocompleteInput input,
AutocompleteResult* result) { … }
AutocompleteController::OldResult::~OldResult() = default;
std::string AutocompleteController::UpdateTypeToDebugString(
UpdateType update_type) { … }
void AutocompleteController::ExtendMatchSubtypes(
const AutocompleteMatch& match,
base::flat_set<omnibox::SuggestSubtype>* subtypes) { … }
int AutocompleteController::ApplyPiecewiseScoringTransform(
double ml_score,
std::vector<std::pair<double, int>> break_points) { … }
AutocompleteController::AutocompleteController(
std::unique_ptr<AutocompleteProviderClient> provider_client,
int provider_types,
bool is_cros_launcher,
bool disable_ml)
: … { … }
AutocompleteController::~AutocompleteController() { … }
void AutocompleteController::AddObserver(Observer* observer) { … }
void AutocompleteController::RemoveObserver(Observer* observer) { … }
void AutocompleteController::Start(const AutocompleteInput& input) { … }
void AutocompleteController::StartPrefetch(const AutocompleteInput& input) { … }
void AutocompleteController::Stop(bool clear_result,
bool due_to_user_inactivity) { … }
void AutocompleteController::DeleteMatch(const AutocompleteMatch& match) { … }
void AutocompleteController::DeleteMatchElement(const AutocompleteMatch& match,
size_t element_index) { … }
void AutocompleteController::OnProviderUpdate(
bool updated_matches,
const AutocompleteProvider* provider) { … }
void AutocompleteController::AddProviderAndTriggeringLogs(
OmniboxLog* logs) const { … }
void AutocompleteController::ResetSession() { … }
void AutocompleteController::
UpdateMatchDestinationURLWithAdditionalSearchboxStats(
base::TimeDelta query_formulation_time,
AutocompleteMatch* match) const { … }
void AutocompleteController::UpdateSearchTermsArgsWithAdditionalSearchboxStats(
base::TimeDelta query_formulation_time,
TemplateURLRef::SearchTermsArgs& search_terms_args) const { … }
void AutocompleteController::SetMatchDestinationURL(
AutocompleteMatch* match) const { … }
void AutocompleteController::GroupSuggestionsBySearchVsURL(size_t begin,
size_t end) { … }
bool AutocompleteController::ShouldRunProvider(
AutocompleteProvider* provider) const { … }
GURL AutocompleteController::ComputeURLFromSearchTermsArgs(
const TemplateURL* template_url,
const TemplateURLRef::SearchTermsArgs& search_terms_args) const { … }
void AutocompleteController::InitializeAsyncProviders(int provider_types) { … }
void AutocompleteController::InitializeSyncProviders(int provider_types) { … }
void AutocompleteController::UpdateResult(UpdateType update_type) { … }
void AutocompleteController::AggregateNewMatches() { … }
void AutocompleteController::MlRerank(OldResult& old_result) { … }
void AutocompleteController::PostProcessMatches() { … }
bool AutocompleteController::CheckWhetherDefaultMatchChanged(
std::optional<AutocompleteMatch> last_default_match,
std::u16string last_default_associated_keyword) { … }
void AutocompleteController::AttachActions() { … }
void AutocompleteController::UpdateAssociatedKeywords(
AutocompleteResult* result) { … }
void AutocompleteController::UpdateKeywordDescriptions(
AutocompleteResult* result) { … }
void AutocompleteController::UpdateSearchboxStats(AutocompleteResult* result) { … }
void AutocompleteController::UpdateTailSuggestPrefix(
AutocompleteResult* result) { … }
void AutocompleteController::NotifyChanged() { … }
void AutocompleteController::RequestNotifyChanged(bool notify_default_match,
bool delayed) { … }
void AutocompleteController::CancelNotifyChangedRequest() { … }
AutocompleteController::ProviderDoneState
AutocompleteController::GetProviderDoneState() { … }
void AutocompleteController::StartExpireTimer() { … }
void AutocompleteController::StartStopTimer() { … }
bool AutocompleteController::OnMemoryDump(
const base::trace_event::MemoryDumpArgs& args,
base::trace_event::ProcessMemoryDump* process_memory_dump) { … }
void AutocompleteController::SetStartStopTimerDurationForTesting(
base::TimeDelta duration) { … }
size_t AutocompleteController::InjectAdHocMatch(AutocompleteMatch match) { … }
void AutocompleteController::SetSteadyStateOmniboxPosition(
metrics::OmniboxEventProto::OmniboxPosition position) { … }
const omnibox::metrics::ChromeSearchboxStats::ExperimentStatsV2
AutocompleteController::GetOmniboxPositionExperimentStatsV2() const { … }
#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
void AutocompleteController::RunBatchUrlScoringModel(OldResult& old_result) { … }
void AutocompleteController::RunBatchUrlScoringModelMappedSearchBlending(
OldResult& old_result) { … }
void AutocompleteController::
RunBatchUrlScoringModelPiecewiseMappedSearchBlending(
OldResult& old_result) { … }
#endif
void AutocompleteController::MaybeRemoveCompanyEntityImages(
AutocompleteResult* result) { … }
void AutocompleteController::MaybeCleanSuggestionsForKeywordMode(
const AutocompleteInput& input,
AutocompleteResult* result) { … }