| // Copyright 2012 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_BROWSER_SHORTCUTS_PROVIDER_H_ | 
 | #define COMPONENTS_OMNIBOX_BROWSER_SHORTCUTS_PROVIDER_H_ | 
 |  | 
 | #include <map> | 
 | #include <string> | 
 |  | 
 | #include "base/gtest_prod_util.h" | 
 | #include "base/memory/raw_ptr.h" | 
 | #include "components/omnibox/browser/autocomplete_provider.h" | 
 | #include "components/omnibox/browser/shortcuts_backend.h" | 
 |  | 
 | class AutocompleteProviderClient; | 
 | class ShortcutsProviderTest; | 
 |  | 
 | // Provider of recently autocompleted links. Provides autocomplete suggestions | 
 | // from previously selected suggestions. The more often a user selects a | 
 | // suggestion for a given search term the higher will be that suggestion's | 
 | // ranking for future uses of that search term. | 
 | class ShortcutsProvider : public AutocompleteProvider, | 
 |                           public ShortcutsBackend::ShortcutsBackendObserver { | 
 |  public: | 
 |   // ShortcutMatch holds sufficient information about a single match from the | 
 |   // shortcut database to allow for destination deduping and relevance sorting. | 
 |   // After those stages the top matches are converted to the more heavyweight | 
 |   // AutocompleteMatch struct.  Avoiding constructing the larger struct for | 
 |   // every such match can save significant time when there are many shortcut | 
 |   // matches to process. | 
 |   // TODO(manukh): We should probably merge `ShortcutMatch` into | 
 |   //   `ShortcutsDatabase::Shortcut`. There's a 4-deep hierarchy of structs: | 
 |   //   - `AutocompleteMatch` are created from `ShortcutMatch`es | 
 |   //   - `ShortcutMatch`es own `ShortcutsDatabase::Shortcut`s | 
 |   //   - `ShortcutsDatabase::Shortcut`s own | 
 |   //     `ShortcutsDatabase::Shortcut::MatchCore`s | 
 |   struct ShortcutMatch { | 
 |     ShortcutMatch(int relevance, | 
 |                   int aggregate_number_of_hits, | 
 |                   base::Time most_recent_access_time, | 
 |                   size_t shortest_text_length, | 
 |                   const GURL& stripped_destination_url, | 
 |                   const ShortcutsDatabase::Shortcut* shortcut); | 
 |  | 
 |     ShortcutMatch(const ShortcutMatch& other); | 
 |     ShortcutMatch& operator=(const ShortcutMatch& other); | 
 |  | 
 |     int relevance; | 
 |     // The sum of `number_of_hits` of all deduped shortcuts. | 
 |     int aggregate_number_of_hits; | 
 |     base::Time most_recent_access_time; | 
 |     size_t shortest_text_length; | 
 |     GURL stripped_destination_url; | 
 |     raw_ptr<const ShortcutsDatabase::Shortcut> shortcut; | 
 |     std::u16string contents; | 
 |     AutocompleteMatch::Type type; | 
 |   }; | 
 |  | 
 |   explicit ShortcutsProvider(AutocompleteProviderClient* client); | 
 |  | 
 |   // Performs the autocompletion synchronously. Since no asynch completion is | 
 |   // performed |minimal_changes| is ignored. | 
 |   void Start(const AutocompleteInput& input, bool minimal_changes) override; | 
 |  | 
 |   void DeleteMatch(const AutocompleteMatch& match) override; | 
 |  | 
 |  private: | 
 |   friend class ClassifyTest; | 
 |   friend class ShortcutsProviderExtensionTest; | 
 |   friend class ShortcutsProviderTest; | 
 |  | 
 |   ~ShortcutsProvider() override; | 
 |  | 
 |   // ShortcutsBackendObserver: | 
 |   void OnShortcutsLoaded() override; | 
 |  | 
 |   // Performs the autocomplete matching and scoring. Populates matches results | 
 |   // with scoring signals for ML models if enabled. Only populates signals for | 
 |   // ULR matches for now. | 
 |   void DoAutocomplete(const AutocompleteInput& input, | 
 |                       bool populate_scoring_signals); | 
 |  | 
 |   // Creates a shortcut match by aggregating the scoring factors from a vector | 
 |   // of `shortcuts`. Specifically: | 
 |   // - Considers the shortest shortcut when computing fraction typed. | 
 |   // - Considers the most recent shortcut when considering last visit. | 
 |   // - Considers the sum of `number_of_hits`. | 
 |   // - Considers the shortest contents when picking a shortcut. | 
 |   // Returns the shortcut match with the aggregated score. | 
 |   ShortcutMatch CreateScoredShortcutMatch( | 
 |       size_t input_length, | 
 |       const GURL& stripped_destination_url, | 
 |       const std::vector<const ShortcutsDatabase::Shortcut*>& shortcuts, | 
 |       int max_relevance); | 
 |  | 
 |   // Returns an AutocompleteMatch corresponding to `shortcut_match`. Highlights | 
 |   // the description and contents against `input`, which should be the | 
 |   // normalized version of the user's input. `input` and `fixed_up_input_text` | 
 |   // are used to decide what can be inlined. | 
 |   AutocompleteMatch ShortcutMatchToACMatch( | 
 |       const ShortcutMatch& shortcut_match, | 
 |       int relevance, | 
 |       const AutocompleteInput& input, | 
 |       const std::u16string& fixed_up_input_text, | 
 |       const std::u16string& lower_input); | 
 |  | 
 |   // Returns iterator to first item in |shortcuts_map_| matching |keyword|. | 
 |   // Returns shortcuts_map_.end() if there are no matches. | 
 |   ShortcutsBackend::ShortcutMap::const_iterator FindFirstMatch( | 
 |       const std::u16string& keyword, | 
 |       ShortcutsBackend* backend); | 
 |  | 
 |   // The default max relevance unless overridden by a field trial. | 
 |   static const int kShortcutsProviderDefaultMaxRelevance; | 
 |  | 
 |   raw_ptr<AutocompleteProviderClient> client_ = nullptr; | 
 |   scoped_refptr<ShortcutsBackend> backend_; | 
 |   bool initialized_{}; | 
 | }; | 
 |  | 
 | #endif  // COMPONENTS_OMNIBOX_BROWSER_SHORTCUTS_PROVIDER_H_ |