autocomplete_match.h revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
1513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// found in the LICENSE file.
4513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
5513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#ifndef CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_MATCH_H_
6513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#define CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_MATCH_H_
7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#pragma once
8513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
9513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <vector>
10513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include <string>
11513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
12513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/common/page_transition_types.h"
13513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "googleurl/src/gurl.h"
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
15513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass AutocompleteProvider;
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass PageTransition;
17513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass TemplateURL;
18513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
19513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// AutocompleteMatch ----------------------------------------------------------
20513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
21513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// A single result line with classified spans.  The autocomplete popup displays
22513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// the 'contents' and the 'description' (the description is optional) in the
23513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// autocomplete dropdown, and fills in 'fill_into_edit' into the textbox when
24513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// that line is selected.  fill_into_edit may be the same as 'description' for
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// things like URLs, but may be different for searches or other providers.  For
26513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// example, a search result may say "Search for asdf" as the description, but
27513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch// "asdf" should appear in the box.
28513209b27ff55e2841eac0e4120199c23acce758Ben Murdochstruct AutocompleteMatch {
29513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Autocomplete matches contain strings that are classified according to a
30513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // separate vector of styles.  This vector associates flags with particular
31513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // string segments, and must be in sorted order.  All text must be associated
32513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // with some kind of classification.  Even if a match has no distinct
33513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // segments, its vector should contain an entry at offset 0 with no flags.
34513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //
35513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Example: The user typed "goog"
36513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //   http://www.google.com/        Google
37513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //   ^          ^   ^              ^   ^
38513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //   0,         |   15,            |   4,
39513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //              11,match           0,match
40513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //
41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // This structure holds the classification information for each span.
42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  struct ACMatchClassification {
43513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // The values in here are not mutually exclusive -- use them like a
44513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // bitfield.  This also means we use "int" instead of this enum type when
45513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // passing the values around, so the compiler doesn't complain.
46513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    enum Style {
47513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      NONE  = 0,
48513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      URL   = 1 << 0,  // A URL
49513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      MATCH = 1 << 1,  // A match for the user's search term
50513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      DIM   = 1 << 2,  // "Helper text"
51513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    };
52513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
53513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    ACMatchClassification(size_t offset, int style)
54513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        : offset(offset),
55513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch          style(style) {
56513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    }
57513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    // Offset within the string that this classification starts
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    size_t offset;
60513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
61513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    int style;
62513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
63513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
64513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  typedef std::vector<ACMatchClassification> ACMatchClassifications;
65513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
66513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The type of this match.
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  enum Type {
68513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    URL_WHAT_YOU_TYPED = 0,  // The input as a URL.
69513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    HISTORY_URL,             // A past page whose URL contains the input.
70513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    HISTORY_TITLE,           // A past page whose title contains the input.
71513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    HISTORY_BODY,            // A past page whose body contains the input.
72513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    HISTORY_KEYWORD,         // A past page whose keyword contains the input.
73513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NAVSUGGEST,              // A suggested URL.
74513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    SEARCH_WHAT_YOU_TYPED,   // The input as a search query (with the default
75513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             // engine).
76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    SEARCH_HISTORY,          // A past search (with the default engine)
77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                             // containing the input.
78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    SEARCH_SUGGEST,          // A suggested search (with the default engine).
79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    SEARCH_OTHER_ENGINE,     // A search with a non-default engine.
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NUM_TYPES,
81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutocompleteMatch();
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutocompleteMatch(AutocompleteProvider* provider,
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    int relevance,
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    bool deletable,
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    Type type);
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ~AutocompleteMatch();
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Converts |type| to a string representation.  Used in logging.
91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static std::string TypeToString(Type type);
92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Converts |type| to a resource identifier for the appropriate icon for this
94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // type.
95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static int TypeToIcon(Type type);
96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Comparison function for determining when one match is better than another.
98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static bool MoreRelevant(const AutocompleteMatch& elem1,
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                           const AutocompleteMatch& elem2);
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Comparison functions for removing matches with duplicate destinations.
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static bool DestinationSortFunc(const AutocompleteMatch& elem1,
103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  const AutocompleteMatch& elem2);
104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static bool DestinationsEqual(const AutocompleteMatch& elem1,
105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                const AutocompleteMatch& elem2);
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Helper functions for classes creating matches:
108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Fills in the classifications for |text|, using |style| as the base style
109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // and marking the first instance of |find_text| as a match.  (This match
110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // will also not be dimmed, if |style| has DIM set.)
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static void ClassifyMatchInString(const string16& find_text,
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                    const string16& text,
113513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                    int style,
114513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                    ACMatchClassifications* classifications);
115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Similar to ClassifyMatchInString(), but for cases where the range to mark
117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // as matching is already known (avoids calling find()).  This can be helpful
118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // when find() would be misleading (e.g. you want to mark the second match in
119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // a string instead of the first).
120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static void ClassifyLocationInString(size_t match_location,
121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                       size_t match_length,
122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                       size_t overall_length,
123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                       int style,
124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                       ACMatchClassifications* classifications);
125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
12621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // The provider of this match, used to remember which provider the user had
127513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // selected when the input changes. This may be NULL, in which case there is
128513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // no provider (or memory of the user's selection).
129513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutocompleteProvider* provider;
130513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The relevance of this match. See table above for scores returned by
132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // various providers. This is used to rank matches among all responding
133513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // providers, so different providers must be carefully tuned to supply
134513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // matches with appropriate relevance.
135513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //
136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // TODO(pkasting): http://b/1111299 This should be calculated algorithmically,
137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // rather than being a fairly fixed value defined by the table above.
138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int relevance;
139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // True if the user should be able to delete this match.
141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool deletable;
142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // This string is loaded into the location bar when the item is selected
144513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // by pressing the arrow keys. This may be different than a URL, for example,
145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // for search suggestions, this would just be the search terms.
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 fill_into_edit;
147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
148513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The position within fill_into_edit from which we'll display the inline
14972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // autocomplete string.  This will be string16::npos if this match should
150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // not be inline autocompleted.
151513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  size_t inline_autocomplete_offset;
152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The URL to actually load when the autocomplete item is selected. This URL
154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // should be canonical so we can compare URLs with strcmp to avoid dupes.
155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // It may be empty if there is no possible navigation.
156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GURL destination_url;
157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The main text displayed in the address bar dropdown.
15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 contents;
160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ACMatchClassifications contents_class;
161513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Additional helper text for each entry, such as a title or description.
16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 description;
164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ACMatchClassifications description_class;
165513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The transition type to use when the user opens this match.  By default
167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // this is TYPED.  Providers whose matches do not look like URLs should set
168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // it to GENERATED.
169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  PageTransition::Type transition;
170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // True when this match is the "what you typed" match from the history
172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // system.
173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool is_history_what_you_typed_match;
174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Type of this match.
176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Type type;
177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // If this match corresponds to a keyword, this is the TemplateURL the
179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // keyword was obtained from.
180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const TemplateURL* template_url;
181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // True if the user has starred the destination URL.
183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool starred;
184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // True if this match is from a previous result.
18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool from_previous;
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
188513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#ifndef NDEBUG
189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Does a data integrity check on this match.
190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void Validate() const;
191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
192513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Checks one text/classifications pair for valid values.
193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void ValidateClassifications(
19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const string16& text,
195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      const ACMatchClassifications& classifications) const;
196513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
199513209b27ff55e2841eac0e4120199c23acce758Ben Murdochtypedef AutocompleteMatch::ACMatchClassification ACMatchClassification;
200513209b27ff55e2841eac0e4120199c23acce758Ben Murdochtypedef std::vector<ACMatchClassification> ACMatchClassifications;
201513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
202513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif  // CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_MATCH_H_
203