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