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