shortcuts_provider.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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
16class Profile;
17class 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.
23class 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