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