1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 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
12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/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.
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    EXTENSION_APP,           // An Extension App with a title/url that contains
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             // the input.
82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    NUM_TYPES,
83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  };
84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutocompleteMatch();
86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutocompleteMatch(AutocompleteProvider* provider,
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    int relevance,
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    bool deletable,
89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                    Type type);
90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ~AutocompleteMatch();
91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Converts |type| to a string representation.  Used in logging.
93513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static std::string TypeToString(Type type);
94513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
95513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Converts |type| to a resource identifier for the appropriate icon for this
96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // type.
97513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static int TypeToIcon(Type type);
98513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
99513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Comparison function for determining when one match is better than another.
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static bool MoreRelevant(const AutocompleteMatch& elem1,
101513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                           const AutocompleteMatch& elem2);
102513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
103513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Comparison functions for removing matches with duplicate destinations.
104513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static bool DestinationSortFunc(const AutocompleteMatch& elem1,
105513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                  const AutocompleteMatch& elem2);
106513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static bool DestinationsEqual(const AutocompleteMatch& elem1,
107513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                const AutocompleteMatch& elem2);
108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Helper functions for classes creating matches:
110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Fills in the classifications for |text|, using |style| as the base style
111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // and marking the first instance of |find_text| as a match.  (This match
112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // will also not be dimmed, if |style| has DIM set.)
11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static void ClassifyMatchInString(const string16& find_text,
11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                    const string16& text,
115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                    int style,
116513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                    ACMatchClassifications* classifications);
117513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
118513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Similar to ClassifyMatchInString(), but for cases where the range to mark
119513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // as matching is already known (avoids calling find()).  This can be helpful
120513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // when find() would be misleading (e.g. you want to mark the second match in
121513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // a string instead of the first).
122513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  static void ClassifyLocationInString(size_t match_location,
123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                       size_t match_length,
124513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                       size_t overall_length,
125513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                       int style,
126513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch                                       ACMatchClassifications* classifications);
127513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
12821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // The provider of this match, used to remember which provider the user had
129513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // selected when the input changes. This may be NULL, in which case there is
130513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // no provider (or memory of the user's selection).
131513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  AutocompleteProvider* provider;
132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
133ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // The relevance of this match. See table in autocomplete.h for scores
134ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // returned by various providers. This is used to rank matches among all
135ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // responding providers, so different providers must be carefully tuned to
136ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // supply matches with appropriate relevance.
137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  //
138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // TODO(pkasting): http://b/1111299 This should be calculated algorithmically,
139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // rather than being a fairly fixed value defined by the table above.
140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  int relevance;
141513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
142513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // True if the user should be able to delete this match.
143513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool deletable;
144513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
145513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // This string is loaded into the location bar when the item is selected
146513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // by pressing the arrow keys. This may be different than a URL, for example,
147513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // for search suggestions, this would just be the search terms.
14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 fill_into_edit;
149513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
150513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The position within fill_into_edit from which we'll display the inline
15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // autocomplete string.  This will be string16::npos if this match should
152513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // not be inline autocompleted.
153513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  size_t inline_autocomplete_offset;
154513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
155513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The URL to actually load when the autocomplete item is selected. This URL
156513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // should be canonical so we can compare URLs with strcmp to avoid dupes.
157513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // It may be empty if there is no possible navigation.
158513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  GURL destination_url;
159513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
160513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The main text displayed in the address bar dropdown.
16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 contents;
162513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ACMatchClassifications contents_class;
163513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
164513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Additional helper text for each entry, such as a title or description.
16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 description;
166513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  ACMatchClassifications description_class;
167513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
168513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // The transition type to use when the user opens this match.  By default
169513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // this is TYPED.  Providers whose matches do not look like URLs should set
170513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // it to GENERATED.
171513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  PageTransition::Type transition;
172513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
173513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // True when this match is the "what you typed" match from the history
174513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // system.
175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool is_history_what_you_typed_match;
176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Type of this match.
178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  Type type;
179513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
180513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // If this match corresponds to a keyword, this is the TemplateURL the
181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // keyword was obtained from.
182513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const TemplateURL* template_url;
183513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
184513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // True if the user has starred the destination URL.
185513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool starred;
186513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // True if this match is from a previous result.
18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool from_previous;
18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#ifndef NDEBUG
191513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Does a data integrity check on this match.
192513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void Validate() const;
193513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
194513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Checks one text/classifications pair for valid values.
195513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void ValidateClassifications(
19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const string16& text,
197513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      const ACMatchClassifications& classifications) const;
198513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif
199513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch};
200513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
201513209b27ff55e2841eac0e4120199c23acce758Ben Murdochtypedef AutocompleteMatch::ACMatchClassification ACMatchClassification;
202513209b27ff55e2841eac0e4120199c23acce758Ben Murdochtypedef std::vector<ACMatchClassification> ACMatchClassifications;
203513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
204513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#endif  // CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_MATCH_H_
205