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