1 // Copyright (c) 2012 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 #ifndef CHROME_BROWSER_AUTOCOMPLETE_SHORTCUTS_PROVIDER_H_ 6 #define CHROME_BROWSER_AUTOCOMPLETE_SHORTCUTS_PROVIDER_H_ 7 8 #include <map> 9 #include <set> 10 #include <string> 11 12 #include "base/gtest_prod_util.h" 13 #include "chrome/browser/autocomplete/autocomplete_provider.h" 14 #include "chrome/browser/autocomplete/shortcuts_backend.h" 15 16 class Profile; 17 class ShortcutsProviderTest; 18 19 // Provider of recently autocompleted links. Provides autocomplete suggestions 20 // from previously selected suggestions. The more often a user selects a 21 // suggestion for a given search term the higher will be that suggestion's 22 // ranking for future uses of that search term. 23 class ShortcutsProvider 24 : public AutocompleteProvider, 25 public ShortcutsBackend::ShortcutsBackendObserver { 26 public: 27 ShortcutsProvider(AutocompleteProviderListener* listener, Profile* profile); 28 29 // Performs the autocompletion synchronously. Since no asynch completion is 30 // performed |minimal_changes| is ignored. 31 virtual void Start(const AutocompleteInput& input, 32 bool minimal_changes) OVERRIDE; 33 34 virtual void DeleteMatch(const AutocompleteMatch& match) OVERRIDE; 35 36 private: 37 friend class ClassifyTest; 38 friend class ShortcutsProviderTest; 39 FRIEND_TEST_ALL_PREFIXES(ShortcutsProviderTest, CalculateScore); 40 41 typedef std::multimap<base::char16, base::string16> WordMap; 42 43 virtual ~ShortcutsProvider(); 44 45 // ShortcutsBackendObserver: 46 virtual void OnShortcutsLoaded() OVERRIDE; 47 48 // Performs the autocomplete matching and scoring. 49 void GetMatches(const AutocompleteInput& input); 50 51 // Returns an AutocompleteMatch corresponding to |shortcut|. Assigns it 52 // |relevance| score in the process, and highlights the description and 53 // contents against |input|, which should be the lower-cased version 54 // of the user's input. |input|, |fixed_up_input_text|, and 55 // |input_as_gurl| are used to decide what can be inlined. 56 AutocompleteMatch ShortcutToACMatch( 57 const history::ShortcutsDatabase::Shortcut& shortcut, 58 int relevance, 59 const AutocompleteInput& input, 60 const base::string16& fixed_up_input_text, 61 const GURL& input_as_gurl); 62 63 // Returns a map mapping characters to groups of words from |text| that start 64 // with those characters, ordered lexicographically descending so that longer 65 // words appear before their prefixes (if any) within a particular 66 // equal_range(). 67 static WordMap CreateWordMapForString(const base::string16& text); 68 69 // Given |text| and a corresponding base set of classifications 70 // |original_class|, adds ACMatchClassification::MATCH markers for all 71 // instances of the words from |find_words| within |text| and returns the 72 // resulting classifications. (|find_text| is provided as the original string 73 // used to create |find_words|. This is supplied because it's common for this 74 // to be a prefix of |text|, so we can quickly check for that and mark that 75 // entire substring as a match before proceeding with the more generic 76 // algorithm.) 77 // 78 // For example, given the |text| 79 // "Sports and News at sports.somesite.com - visit us!" and |original_class| 80 // {{0, NONE}, {18, URL}, {37, NONE}} (marking "sports.somesite.com" as a 81 // URL), calling with |find_text| set to "sp ew" would return 82 // {{0, MATCH}, {2, NONE}, {12, MATCH}, {14, NONE}, {18, URL|MATCH}, 83 // {20, URL}, {37, NONE}}. 84 // 85 // |find_words| should be as constructed by CreateWordMapForString(find_text). 86 // 87 // |find_text| (and thus |find_words|) are expected to be lowercase. |text| 88 // will be lowercased in this function. 89 static ACMatchClassifications ClassifyAllMatchesInString( 90 const base::string16& find_text, 91 const WordMap& find_words, 92 const base::string16& text, 93 const ACMatchClassifications& original_class); 94 95 // Returns iterator to first item in |shortcuts_map_| matching |keyword|. 96 // Returns shortcuts_map_.end() if there are no matches. 97 ShortcutsBackend::ShortcutMap::const_iterator FindFirstMatch( 98 const base::string16& keyword, 99 ShortcutsBackend* backend); 100 101 int CalculateScore(const base::string16& terms, 102 const history::ShortcutsDatabase::Shortcut& shortcut, 103 int max_relevance); 104 105 // The default max relevance unless overridden by a field trial. 106 static const int kShortcutsProviderDefaultMaxRelevance; 107 108 std::string languages_; 109 bool initialized_; 110 }; 111 112 #endif // CHROME_BROWSER_AUTOCOMPLETE_SHORTCUTS_PROVIDER_H_ 113