1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <map>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/logging.h"
14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h"
1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/string16.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/timer.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/url_parse.h"
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The AutocompleteController is the center of the autocomplete system.  A
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// class creates an instance of the controller, which in turn creates a set of
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AutocompleteProviders to serve it.  The owning class can ask the controller
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// to Start() a query; the controller in turn passes this call down to the
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// providers, each of which keeps track of its own matches and whether it has
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// finished processing the query.  When a provider gets more matches or finishes
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// processing, it notifies the controller, which merges the combined matches
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// together and makes the result available to interested observers.
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The owner may also cancel the current query by calling Stop(), which the
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// controller will in turn communicate to all the providers.  No callbacks will
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// happen after a request has been stopped.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// IMPORTANT: There is NO THREAD SAFETY built into this portion of the
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// autocomplete system.  All calls to and from the AutocompleteController should
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// happen on the same thread.  AutocompleteProviders are responsible for doing
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// their own thread management when they need to return matches asynchronously.
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The AutocompleteProviders each return different kinds of matches, such as
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// history or search matches.  These matches are given "relevance" scores.
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Higher scores are better matches than lower scores.  The relevance scores and
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// classes providing the respective matches are as follows:
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// UNKNOWN input type:
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// --------------------------------------------------------------------|-----
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keyword (non-substituting or in keyword UI mode, exact match)       | 1500
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Extension App (exact match)                                         | 1425
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryURL (exact or inline autocomplete match)                     | 1400
484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Search Primary Provider (past query in history within 2 days)       | 1399**
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (what you typed)                            | 1300
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryURL (what you typed)                                         | 1200
51ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Extension App (inexact match)                                       | 1175*~
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keyword (substituting, exact match)                                 | 1100
534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Search Primary Provider (past query in history older than 2 days)   | 1050--
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in title of starred page)                | 1000++
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryURL (inexact match)                                          |  900++
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (navigational suggestion)                   |  800++
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in title of nonstarred page)             |  700++
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (suggestion)                                |  600++
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Built-in                                                            |  575++
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in body of starred page)                 |  550++
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in body of nonstarred page)              |  500++
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keyword (inexact match)                                             |  450
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (what you typed)                          |  250
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (past query in history)                   |  200--
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (navigational suggestion)                 |  150++
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (suggestion)                              |  100++
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// REQUESTED_URL input type:
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// --------------------------------------------------------------------|-----
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keyword (non-substituting or in keyword UI mode, exact match)       | 1500
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Extension App (exact match)                                         | 1425
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryURL (exact or inline autocomplete match)                     | 1400
734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Search Primary Provider (past query in history within 2 days)       | 1399**
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryURL (what you typed)                                         | 1200
75ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Extension App (inexact match)                                       | 1175*~
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (what you typed)                            | 1150
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keyword (substituting, exact match)                                 | 1100
784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Search Primary Provider (past query in history older than 2 days)   | 1050--
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in title of starred page)                | 1000++
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryURL (inexact match)                                          |  900++
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (navigational suggestion)                   |  800++
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in title of nonstarred page)             |  700++
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (suggestion)                                |  600++
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Built-in                                                            |  575++
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in body of starred page)                 |  550++
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in body of nonstarred page)              |  500++
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keyword (inexact match)                                             |  450
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (what you typed)                          |  250
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (past query in history)                   |  200--
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (navigational suggestion)                 |  150++
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (suggestion)                              |  100++
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// URL input type:
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// --------------------------------------------------------------------|-----
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keyword (non-substituting or in keyword UI mode, exact match)       | 1500
96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Extension App (exact match)                                         | 1425
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryURL (exact or inline autocomplete match)                     | 1400
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryURL (what you typed)                                         | 1200
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Extension App (inexact match)                                       | 1175*~
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keyword (substituting, exact match)                                 | 1100
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryURL (inexact match)                                          |  900++
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (what you typed)                            |  850
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (navigational suggestion)                   |  800++
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (past query in history)                     |  750--
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keyword (inexact match)                                             |  700
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Built-in                                                            |  575++
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (suggestion)                                |  300++
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (what you typed)                          |  250
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (past query in history)                   |  200--
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (navigational suggestion)                 |  150++
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (suggestion)                              |  100++
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// QUERY input type:
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// --------------------------------------------------------------------|-----
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keyword (non-substituting or in keyword UI mode, exact match)       | 1500
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keyword (substituting, exact match)                                 | 1450
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Extension App (exact match)                                         | 1425
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryURL (exact or inline autocomplete match)                     | 1400
1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Search Primary Provider (past query in history within 2 days)       | 1399**
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (what you typed)                            | 1300
121ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Extension App (inexact match)                                       | 1175*~
1224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Search Primary Provider (past query in history older than 2 days)   | 1050--
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in title of starred page)                | 1000++
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryURL (inexact match)                                          |  900++
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (navigational suggestion)                   |  800++
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in title of nonstarred page)             |  700++
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (suggestion)                                |  600++
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in body of starred page)                 |  550++
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in body of nonstarred page)              |  500++
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Keyword (inexact match)                                             |  450
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (what you typed)                          |  250
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (past query in history)                   |  200--
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (navigational suggestion)                 |  150++
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Secondary Provider (suggestion)                              |  100++
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// FORCED_QUERY input type:
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// --------------------------------------------------------------------|-----
138ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Extension App (exact match on title only, not url)                  | 1425
1394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Search Primary Provider (past query in history within 2 days)       | 1399**
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (what you typed)                            | 1300
141ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Extension App (inexact match on title only, not url)                | 1175*~
1424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Search Primary Provider (past query in history older than 2 days)   | 1050--
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in title of starred page)                | 1000++
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (navigational suggestion)                   |  800++
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in title of nonstarred page)             |  700++
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Search Primary Provider (suggestion)                                |  600++
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in body of starred page)                 |  550++
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// HistoryContents (any match in body of nonstarred page)              |  500++
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (A search keyword is a keyword with a replacement string; a bookmark keyword
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// is a keyword with no replacement string, that is, a shortcut for a URL.)
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// There are two possible providers for search suggestions. If the user has
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// typed a keyword, then the primary provider is the keyword provider and the
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// secondary provider is the default provider. If the user has not typed a
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// keyword, then the primary provider corresponds to the default provider.
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The value column gives the ranking returned from the various providers.
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ++: a series of matches with relevance from n up to (n + max_matches).
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// --: relevance score falls off over time (discounted 50 points @ 15 minutes,
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     450 points @ two weeks)
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// **: relevance score falls off over two days (discounted 99 points after two
1634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch//     days).
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// *~: Partial matches get a score on a sliding scale from about 575-1125 based
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//     on how many times the URL for the Extension App has been typed and how
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen//     many of the letters match.
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass AutocompleteController;
169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass AutocompleteControllerDelegate;
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutocompleteInput;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct AutocompleteMatch;
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutocompleteProvider;
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutocompleteResult;
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass HistoryContentsProvider;
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
176201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochclass SearchProvider;
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TemplateURL;
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef std::vector<AutocompleteMatch> ACMatches;
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef std::vector<AutocompleteProvider*> ACProviders;
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AutocompleteInput ----------------------------------------------------------
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The user input for an autocomplete query.  Allows copying.
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutocompleteInput {
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Note that the type below may be misleading.  For example, "http:/" alone
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // cannot be opened as a URL, so it is marked as a QUERY; yet the user
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // probably intends to type more and have it eventually become a URL, so we
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // need to make sure we still run it through inline autocomplete.
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum Type {
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    INVALID,        // Empty input
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    UNKNOWN,        // Valid input whose type cannot be determined
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    REQUESTED_URL,  // Input autodetected as UNKNOWN, which the user wants to
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    // treat as an URL by specifying a desired_tld
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    URL,            // Input autodetected as a URL
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    QUERY,          // Input autodetected as a query
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    FORCED_QUERY,   // Input forced to be a query by an initial '?'
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
201ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Enumeration of the possible match query types. Callers who only need some
202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // of the matches for a particular input can get answers more quickly by
203ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // specifying that upfront.
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  enum MatchesRequested {
205ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Only the best match in the whole result set matters.  Providers should at
206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // most return synchronously-available matches, and if possible do even less
207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // work, so that it's safe to ask for these repeatedly in the course of one
208ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // higher-level "synchronous" query.
209ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    BEST_MATCH,
210ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
211ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // Only synchronous matches should be returned.
212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    SYNCHRONOUS_MATCHES,
213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
214ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    // All matches should be fetched.
215ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    ALL_MATCHES,
216ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  };
217ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteInput();
21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  AutocompleteInput(const string16& text,
22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    const string16& desired_tld,
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    bool prevent_inline_autocomplete,
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    bool prefer_keyword,
2234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                    bool allow_exact_keyword_match,
224ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                    MatchesRequested matches_requested);
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~AutocompleteInput();
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // If type is |FORCED_QUERY| and |text| starts with '?', it is removed.
22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static void RemoveForcedQueryStringIfNecessary(Type type, string16* text);
229201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Converts |type| to a string representation.  Used in logging.
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static std::string TypeToString(Type type);
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Parses |text| and returns the type of input this will be interpreted as.
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The components of the input are stored in the output parameter |parts|, if
23521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // it is non-NULL. The scheme is stored in |scheme| if it is non-NULL. The
23621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // canonicalized URL is stored in |canonicalized_url|; however, this URL is
23721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // not guaranteed to be valid, especially if the parsed type is, e.g., QUERY.
23872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static Type Parse(const string16& text,
23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    const string16& desired_tld,
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                    url_parse::Parsed* parts,
24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                    string16* scheme,
24221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                    GURL* canonicalized_url);
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Parses |text| and fill |scheme| and |host| by the positions of them.
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The results are almost as same as the result of Parse(), but if the scheme
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is view-source, this function returns the positions of scheme and host
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in the URL qualified by "view-source:" prefix.
24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static void ParseForEmphasizeComponents(const string16& text,
24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                          const string16& desired_tld,
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          url_parse::Component* scheme,
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          url_parse::Component* host);
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Code that wants to format URLs with a format flag including
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // net::kFormatUrlOmitTrailingSlashOnBareHostname risk changing the meaning if
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the result is then parsed as AutocompleteInput.  Such code can call this
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // function with the URL and its formatted string, and it will return a
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // formatted string with the same meaning as the original URL (i.e. it will
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // re-append a slash if necessary).
25972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static string16 FormattedStringWithEquivalentMeaning(
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const GURL& url,
26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const string16& formatted_url);
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // User-provided text to be completed.
26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const string16& text() const { return text_; }
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Use of this setter is risky, since no other internal state is updated
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // besides |text_|.  Only callers who know that they're not changing the
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // type/scheme/etc. should use this.
26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void set_text(const string16& text) { text_ = text; }
27072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The text supplied to the constructor. This differs from |text| if the text
27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // supplied to the constructor had leading or trailing white space.
27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const string16& original_text() const { return original_text_; }
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // User's desired TLD, if one is not already present in the text to
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // autocomplete.  When this is non-empty, it also implies that "www." should
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // be prepended to the domain where possible.  This should not have a leading
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // '.' (use "com" instead of ".com").
27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const string16& desired_tld() const { return desired_tld_; }
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The type of input supplied.
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Type type() const { return type_; }
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns parsed URL components.
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const url_parse::Parsed& parts() const { return parts_; }
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The scheme parsed from the provided text; only meaningful when type_ is
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URL.
28972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  const string16& scheme() const { return scheme_; }
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The input as an URL to navigate to, if possible.
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const GURL& canonicalized_url() const { return canonicalized_url_; }
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns whether inline autocompletion should be prevented.
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool prevent_inline_autocomplete() const {
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return prevent_inline_autocomplete_;
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
299201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Returns the value of |prevent_inline_autocomplete| supplied to the
300201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // constructor. This differs from the value returned by
301201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // |prevent_inline_autocomplete()| if the input contained trailing whitespace.
302201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool initial_prevent_inline_autocomplete() const {
303201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    return initial_prevent_inline_autocomplete_;
304201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  }
305201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns whether, given an input string consisting solely of a substituting
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // keyword, we should score it like a non-substituting keyword.
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool prefer_keyword() const { return prefer_keyword_; }
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // Returns whether this input is allowed to be treated as an exact
3114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // keyword match.  If not, the default result is guaranteed not to be a
3124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // keyword search, even if the input is "<keyword> <search string>".
3134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool allow_exact_keyword_match() const { return allow_exact_keyword_match_; }
3144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
315ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // See description of enum for details.
316ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MatchesRequested matches_requested() const { return matches_requested_; }
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // operator==() by another name.
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool Equals(const AutocompleteInput& other) const;
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Resets all internal variables to the null-constructed state.
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Clear();
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
32572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 text_;
32672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 original_text_;
32772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 desired_tld_;
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Type type_;
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  url_parse::Parsed parts_;
33072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 scheme_;
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL canonicalized_url_;
332201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool initial_prevent_inline_autocomplete_;
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool prevent_inline_autocomplete_;
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool prefer_keyword_;
3354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  bool allow_exact_keyword_match_;
336ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  MatchesRequested matches_requested_;
337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AutocompleteProvider -------------------------------------------------------
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A single result provider for the autocomplete system.  Given user input, the
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// provider decides what (if any) matches to return, their relevance, and their
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// classifications.
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutocompleteProvider
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public base::RefCountedThreadSafe<AutocompleteProvider> {
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class ACProviderListener {
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Called by a provider as a notification that something has changed.
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // |updated_matches| should be true iff the matches have changed in some
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // way (they may not have changed if, for example, the provider did an
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // asynchronous query to get more matches, came up with none, and is now
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // giving up).
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    //
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // NOTE: Providers MUST only call this method while processing asynchronous
356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // queries.  Do not call this for a synchronous query.
357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    //
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // NOTE: There's no parameter to tell the listener _which_ provider is
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // calling it.  Because the AutocompleteController (the typical listener)
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // doesn't cache the providers' individual matches locally, it has to get
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // them all again when this is called anyway, so such a parameter wouldn't
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // actually be useful.
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual void OnProviderUpdate(bool updated_matches) = 0;
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   protected:
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    virtual ~ACProviderListener();
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteProvider(ACProviderListener* listener,
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       Profile* profile,
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const char* name);
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked when the profile changes.
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NOTE: Do not access any previous Profile* at this point as it may have
375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // already been deleted.
376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetProfile(Profile* profile);
377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called to start an autocomplete query.  The provider is responsible for
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // tracking its matches for this query and whether it is done processing the
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // query.  When new matches are available or the provider finishes, it
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // calls the controller's OnProviderUpdate() method.  The controller can then
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // get the new matches using the provider's accessors.
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Exception: Matches available immediately after starting the query (that
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is, synchronously) do not cause any notifications to be sent.  The
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // controller is expected to check for these without prompting (since
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // otherwise, starting each provider running would result in a flurry of
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // notifications).
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Once Stop() has been called, no more notifications should be sent.
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |minimal_changes| is an optimization that lets the provider do less work
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // when the |input|'s text hasn't changed.  See the body of
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // AutocompletePopupModel::StartAutocomplete().
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Start(const AutocompleteInput& input,
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     bool minimal_changes) = 0;
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when a provider must not make any more callbacks for the current
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // query. This will be called regardless of whether the provider is already
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // done.
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Stop();
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the set of matches for the current query.
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const ACMatches& matches() const { return matches_; }
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns whether the provider is done processing the query.
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool done() const { return done_; }
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the name of this provider.
409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* name() const { return name_; }
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called to delete a match and the backing data that produced it.  This
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // match should not appear again in this or future queries.  This can only be
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // called for matches the provider marks as deletable.  This should only be
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // called when no query is running.
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NOTE: Remember to call OnProviderUpdate() if matches_ is updated.
416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DeleteMatch(const AutocompleteMatch& match);
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A suggested upper bound for how many matches a provider should return.
419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(pkasting): http://b/1111299 , http://b/933133 This should go away once
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // we have good relevance heuristics; the controller should handle all
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // culling.
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const size_t kMaxMatches;
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class base::RefCountedThreadSafe<AutocompleteProvider>;
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~AutocompleteProvider();
428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns whether |input| begins "http:" or "view-source:http:".
43072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static bool HasHTTPScheme(const string16& input);
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Updates the starred state of each of the matches in matches_ from the
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // profile's bookmark bar model.
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateStarredStateOfMatches();
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A convenience function to call net::FormatUrl() with the current set of
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // "Accept Languages" when check_accept_lang is true.  Otherwise, it's called
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // with an empty list.
43972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 StringForURLDisplay(const GURL& url,
44072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               bool check_accept_lang,
44172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                               bool trim_http) const;
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The profile associated with the AutocompleteProvider.  Reference is not
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // owned by us.
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Profile* profile_;
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ACProviderListener* listener_;
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ACMatches matches_;
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool done_;
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The name of this provider.  Used for logging.
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const char* name_;
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AutocompleteProvider);
456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochtypedef AutocompleteProvider::ACProviderListener ACProviderListener;
459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AutocompleteResult ---------------------------------------------------------
461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// All matches from all providers for a particular query.  This also tracks
463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// what the default match should be if the user doesn't manually select another
464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// match.
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutocompleteResult {
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef ACMatches::const_iterator const_iterator;
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef ACMatches::iterator iterator;
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The "Selection" struct is the information we need to select the same match
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in one result set that was selected in another.
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Selection {
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Selection()
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        : provider_affinity(NULL),
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          is_history_what_you_typed_match(false) {
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Clear the selection entirely.
479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void Clear();
480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // True when the selection is empty.
482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool empty() const {
483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return destination_url.is_empty() && !provider_affinity &&
484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          !is_history_what_you_typed_match;
485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The desired destination URL.
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GURL destination_url;
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The desired provider.  If we can't find a match with the specified
491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // |destination_url|, we'll use the best match from this provider.
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const AutocompleteProvider* provider_affinity;
493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // True when this is the HistoryURLProvider's "what you typed" match.  This
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // can't be tracked using |destination_url| because its URL changes on every
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // keystroke, so if this is set, we'll preserve the selection by simply
497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // choosing the new "what you typed" entry and ignoring |destination_url|.
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool is_history_what_you_typed_match;
499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteResult();
502731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~AutocompleteResult();
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // operator=() by another name.
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CopyFrom(const AutocompleteResult& rhs);
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
507dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Copies matches from |old_matches| to provide a consistant result set. See
508dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // comments in code for specifics.
509dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void CopyOldMatches(const AutocompleteInput& input,
510dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                      const AutocompleteResult& old_matches);
51172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds a single match. The match is inserted at the appropriate position
513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // based on relevancy and display order. This is ONLY for use after
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // SortAndCull() has been invoked, and preserves default_match_.
515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddMatch(const AutocompleteMatch& match);
516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds a new set of matches to the result set.  Does not re-sort.
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AppendMatches(const ACMatches& matches);
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes duplicates, puts the list in sorted order and culls to leave only
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the best kMaxMatches matches.  Sets the default match to the best match
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and updates the alternate nav URL.
523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SortAndCull(const AutocompleteInput& input);
524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
52572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns true if at least one match was copied from the last result.
52672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool HasCopiedMatches() const;
52772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Vector-style accessors/operators.
529513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  size_t size() const;
530513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  bool empty() const;
531513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const_iterator begin() const;
532513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  iterator begin();
533513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const_iterator end() const;
534513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  iterator end();
535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the match at the given index.
537513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const AutocompleteMatch& match_at(size_t index) const;
538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get the default match for the query (not necessarily the first).  Returns
540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // end() if there is no default match.
541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const_iterator default_match() const { return default_match_; }
542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL alternate_nav_url() const { return alternate_nav_url_; }
544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Clears the matches for this result set.
546731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void Reset();
547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void Swap(AutocompleteResult* other);
54972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef NDEBUG
551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Does a data integrity check on this result.
552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Validate() const;
553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Max number of matches we'll show from the various providers.
556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const size_t kMaxMatches;
557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
559dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  typedef std::map<AutocompleteProvider*, ACMatches> ProviderToMatches;
56072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
56172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Populates |provider_to_matches| from |matches_|.
562dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void BuildProviderToMatches(ProviderToMatches* provider_to_matches) const;
56372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
56472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns true if |matches| contains a match with the same destination as
56572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // |match|.
56672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static bool HasMatchByDestination(const AutocompleteMatch& match,
567dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                    const ACMatches& matches);
56872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
56972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Copies matches into this result. |old_matches| gives the matches from the
570dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // last result, and |new_matches| the results from this result.
571dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void MergeMatchesByProvider(const ACMatches& old_matches,
572dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                              const ACMatches& new_matches);
57372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ACMatches matches_;
575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const_iterator default_match_;
577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The "alternate navigation URL", if any, for this result set.  This is a URL
579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to try offering as a navigational option in case the user navigated to the
580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URL of the default match but intended something else.  For example, if the
581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // user's local intranet contains site "foo", and the user types "foo", we
582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // default to searching for "foo" when the user may have meant to navigate
583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // there.  In cases like this, the default match will point to the "search for
584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 'foo'" result, and this will contain "http://foo/".
585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL alternate_nav_url_;
586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AutocompleteResult);
588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AutocompleteController -----------------------------------------------------
591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The coordinator for autocomplete queries, responsible for combining the
593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// matches from a series of providers into one AutocompleteResult.
594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass AutocompleteController : public ACProviderListener {
595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to indicate an index that is not selected in a call to Update().
597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kNoItemSelected;
598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Normally, you will call the first constructor.  Unit tests can use the
600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // second to set the providers to some known testing providers.  The default
601c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // providers will be overridden and the controller will take ownership of the
602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // providers, Release()ing them on destruction.
603dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutocompleteController(Profile* profile,
604dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                         AutocompleteControllerDelegate* delegate);
605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifdef UNIT_TEST
606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit AutocompleteController(const ACProviders& providers)
607dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      : delegate_(NULL),
608dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        providers_(providers),
609201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch        search_provider_(NULL),
61072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        done_(true),
61172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen        in_start_(false) {
612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
614c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ~AutocompleteController();
615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invoked when the profile changes. This forwards the call down to all
617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the AutocompleteProviders.
618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetProfile(Profile* profile);
619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Starts an autocomplete query, which continues until all providers are
621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // done or the query is Stop()ed.  It is safe to Start() a new query without
622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Stop()ing the previous one.
623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // See AutocompleteInput::desired_tld() for meaning of |desired_tld|.
625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |prevent_inline_autocomplete| is true if the generated result set should
627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not require inline autocomplete for the default match.  This is difficult
628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // to explain in the abstract; the practical use case is that after the user
629c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // deletes text in the edit, the HistoryURLProvider should make sure not to
630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // promote a match requiring inline autocomplete too highly.
631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |prefer_keyword| should be true when the keyword UI is onscreen; this will
633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // bias the autocomplete result set toward the keyword provider when the input
634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // string is a bare keyword.
635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
6364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // |allow_exact_keyword_match| should be false when triggering keyword mode on
6374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // the input string would be surprising or wrong, e.g. when highlighting text
63872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // in a page and telling the browser to search for it or navigate to it. This
63972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // parameter only applies to substituting keywords.
6404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
641ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // If |matches_requested| is BEST_MATCH or SYNCHRONOUS_MATCHES the controller
642ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // asks the providers to only return matches which are synchronously
643ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // available, which should mean that all providers will be done immediately.
644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
645dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // The controller calls AutocompleteControllerDelegate::OnResultChanged() from
64672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // inside this call at least once. If matches are available later on that
647dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // result in changing the result set the delegate is notified again. When the
648dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // controller is done the notification AUTOCOMPLETE_CONTROLLER_RESULT_READY is
649dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // sent.
65072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void Start(const string16& text,
65172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen             const string16& desired_tld,
652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch             bool prevent_inline_autocomplete,
653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch             bool prefer_keyword,
6544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch             bool allow_exact_keyword_match,
655ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen             AutocompleteInput::MatchesRequested matches_requested);
656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Cancels the current query, ensuring there will be no future notifications
658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // fired.  If new matches have come in since the most recent notification was
659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // fired, they will be discarded.
660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If |clear_result| is true, the controller will also erase the result set.
662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Stop(bool clear_result);
663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Asks the relevant provider to delete |match|, and ensures observers are
665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // notified of resulting changes immediately.  This should only be called when
666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // no query is running.
667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DeleteMatch(const AutocompleteMatch& match);
668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Removes any entries that were copied from the last result. This is used by
67072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // the popup to ensure it's not showing an out-of-date query.
67172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void ExpireCopiedEntries();
6723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
673201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  SearchProvider* search_provider() const { return search_provider_; }
674201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Getters
676c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const AutocompleteInput& input() const { return input_; }
677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const AutocompleteResult& result() const { return result_; }
67872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool done() const { return done_; }
679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // From AutocompleteProvider::Listener
681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnProviderUpdate(bool updated_matches);
682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
68472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Updates |result_| to reflect the current provider state.  Resets timers and
68572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // fires notifications as necessary.  |is_synchronous_pass| is true only when
68672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Start() is calling this to get the synchronous result.
68772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void UpdateResult(bool is_synchronous_pass);
68872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
689dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Calls AutocompleteControllerDelegate::OnResultChanged() and if done sends
690dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // AUTOCOMPLETE_CONTROLLER_RESULT_READY.
69172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void NotifyChanged(bool notify_default_match);
692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Updates |done_| to be accurate with respect to current providers' statuses.
694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CheckIfDone();
695c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Starts the expire timer.
69772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void StartExpireTimer();
69872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
699dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  AutocompleteControllerDelegate* delegate_;
700dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A list of all providers.
702c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ACProviders providers_;
703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
704201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  SearchProvider* search_provider_;
705201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Input passed to Start.
707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteInput input_;
708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Data from the autocomplete query.
710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteResult result_;
711c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Timer used to remove any matches copied from the last result. When run
71372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // invokes |ExpireCopiedEntries|.
71472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  base::OneShotTimer<AutocompleteController> expire_timer_;
715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // True if a query is not currently running.
717c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool done_;
718c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Are we in Start()? This is used to avoid updating |result_| and sending
72072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // notifications until Start() has been invoked on all providers.
72172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool in_start_;
722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
723c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(AutocompleteController);
724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
725c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// AutocompleteLog ------------------------------------------------------------
727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The data to log (via the metrics service) when the user selects an item
729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// from the omnibox popup.
730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstruct AutocompleteLog {
731ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  AutocompleteLog(const string16& text,
732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  AutocompleteInput::Type input_type,
733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  size_t selected_index,
734c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  size_t inline_autocompleted_length,
735c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                  const AutocompleteResult& result)
736c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : text(text),
737c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        input_type(input_type),
738c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        selected_index(selected_index),
739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        inline_autocompleted_length(inline_autocompleted_length),
740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        result(result) {
741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
742c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The user's input text in the omnibox.
74372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 text;
744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The detected type of the user's input.
745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteInput::Type input_type;
746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Selected index (if selected) or -1 (AutocompletePopupModel::kNoMatch).
747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size_t selected_index;
748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Inline autocompleted length (if displayed).
749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  size_t inline_autocompleted_length;
750c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Result set.
751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const AutocompleteResult& result;
752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_AUTOCOMPLETE_AUTOCOMPLETE_H_
755