| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/autocomplete/history_url_provider.h" | 5 #include "chrome/browser/autocomplete/history_url_provider.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/histogram.h" | 10 #include "base/histogram.h" |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 params->message_loop->PostTask(FROM_HERE, NewRunnableMethod( | 120 params->message_loop->PostTask(FROM_HERE, NewRunnableMethod( |
| 121 this, &HistoryURLProvider::QueryComplete, params)); | 121 this, &HistoryURLProvider::QueryComplete, params)); |
| 122 } | 122 } |
| 123 | 123 |
| 124 // Used by both autocomplete passes, and therefore called on multiple different | 124 // Used by both autocomplete passes, and therefore called on multiple different |
| 125 // threads (though not simultaneously). | 125 // threads (though not simultaneously). |
| 126 void HistoryURLProvider::DoAutocomplete(history::HistoryBackend* backend, | 126 void HistoryURLProvider::DoAutocomplete(history::HistoryBackend* backend, |
| 127 history::URLDatabase* db, | 127 history::URLDatabase* db, |
| 128 HistoryURLProviderParams* params) { | 128 HistoryURLProviderParams* params) { |
| 129 // Create a What You Typed match, which we'll need below. | 129 // Create a What You Typed match, which we'll need below. |
| 130 // |
| 131 // We display this to the user when there's a reasonable chance they actually |
| 132 // care: |
| 133 // * Their input can be opened as a URL, and |
| 134 // * They hit ctrl-enter, or we parsed the input as a URL, or it starts with |
| 135 // an explicit "http:" or "https:". |
| 136 // Otherwise, this is just low-quality noise. In the cases where we've parsed |
| 137 // as UNKNOWN, we'll still show an accidental search infobar if need be. |
| 130 bool have_what_you_typed_match = | 138 bool have_what_you_typed_match = |
| 131 params->input.canonicalized_url().is_valid() && | 139 params->input.canonicalized_url().is_valid() && |
| 132 (params->input.type() != AutocompleteInput::UNKNOWN) && | 140 (params->input.type() != AutocompleteInput::QUERY) && |
| 133 (params->input.type() != AutocompleteInput::QUERY); | 141 ((params->input.type() != AutocompleteInput::UNKNOWN) || |
| 142 !params->trim_http || |
| 143 url_util::FindAndCompareScheme(WideToUTF8(params->input.text()), |
| 144 chrome::kHttpsScheme, NULL)); |
| 134 AutocompleteMatch what_you_typed_match(SuggestExactInput(params->input, | 145 AutocompleteMatch what_you_typed_match(SuggestExactInput(params->input, |
| 135 params->trim_http)); | 146 params->trim_http)); |
| 136 | 147 |
| 137 // Get the matching URLs from the DB | 148 // Get the matching URLs from the DB |
| 138 typedef std::vector<history::URLRow> URLRowVector; | 149 typedef std::vector<history::URLRow> URLRowVector; |
| 139 URLRowVector url_matches; | 150 URLRowVector url_matches; |
| 140 HistoryMatches history_matches; | 151 HistoryMatches history_matches; |
| 141 for (Prefixes::const_iterator i(prefixes_.begin()); i != prefixes_.end(); | 152 for (Prefixes::const_iterator i(prefixes_.begin()); i != prefixes_.end(); |
| 142 ++i) { | 153 ++i) { |
| 143 if (params->cancel) | 154 if (params->cancel) |
| 144 return; // canceled in the middle of a query, give up | 155 return; // Canceled in the middle of a query, give up. |
| 145 // We only need max_matches results in the end, but before we get there we | 156 // We only need max_matches results in the end, but before we get there we |
| 146 // need to promote lower-quality matches that are prefixes of | 157 // need to promote lower-quality matches that are prefixes of |
| 147 // higher-quality matches, and remove lower-quality redirects. So we ask | 158 // higher-quality matches, and remove lower-quality redirects. So we ask |
| 148 // for more results than we need, of every prefix type, in hopes this will | 159 // for more results than we need, of every prefix type, in hopes this will |
| 149 // give us far more than enough to work with. CullRedirects() will then | 160 // give us far more than enough to work with. CullRedirects() will then |
| 150 // reduce the list to the best max_matches results. | 161 // reduce the list to the best max_matches results. |
| 151 db->AutocompleteForPrefix(i->prefix + params->input.text(), | 162 db->AutocompleteForPrefix(i->prefix + params->input.text(), |
| 152 max_matches() * 2, &url_matches); | 163 max_matches() * 2, &url_matches); |
| 153 for (URLRowVector::const_iterator j(url_matches.begin()); | 164 for (URLRowVector::const_iterator j(url_matches.begin()); |
| 154 j != url_matches.end(); ++j) { | 165 j != url_matches.end(); ++j) { |
| (...skipping 22 matching lines...) Expand all Loading... |
| 177 FixupExactSuggestion(db, params->input, &what_you_typed_match, | 188 FixupExactSuggestion(db, params->input, &what_you_typed_match, |
| 178 &history_matches)) { | 189 &history_matches)) { |
| 179 // Got an exact match for the user's input. Treat it as the best match | 190 // Got an exact match for the user's input. Treat it as the best match |
| 180 // regardless of the input type. | 191 // regardless of the input type. |
| 181 exact_suggestion = 1; | 192 exact_suggestion = 1; |
| 182 params->matches.push_back(what_you_typed_match); | 193 params->matches.push_back(what_you_typed_match); |
| 183 } else if (params->input.prevent_inline_autocomplete() || | 194 } else if (params->input.prevent_inline_autocomplete() || |
| 184 history_matches.empty() || | 195 history_matches.empty() || |
| 185 !PromoteMatchForInlineAutocomplete(params, history_matches.front())) { | 196 !PromoteMatchForInlineAutocomplete(params, history_matches.front())) { |
| 186 // Failed to promote any URLs for inline autocompletion. Use the What You | 197 // Failed to promote any URLs for inline autocompletion. Use the What You |
| 187 // Typed match, if we have it and the input looked like a URL. | 198 // Typed match, if we have it. |
| 188 first_match = 0; | 199 first_match = 0; |
| 189 if (have_what_you_typed_match) | 200 if (have_what_you_typed_match) |
| 190 params->matches.push_back(what_you_typed_match); | 201 params->matches.push_back(what_you_typed_match); |
| 191 } | 202 } |
| 192 | 203 |
| 193 // This is the end of the synchronous pass. | 204 // This is the end of the synchronous pass. |
| 194 if (!backend) | 205 if (!backend) |
| 195 return; | 206 return; |
| 196 | 207 |
| 197 // Remove redirects and trim list to size. We want to provide up to | 208 // Remove redirects and trim list to size. We want to provide up to |
| (...skipping 639 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 837 history_match.input_location - offset, params->input.text().length(), | 848 history_match.input_location - offset, params->input.text().length(), |
| 838 match.contents.length(), ACMatchClassification::URL, | 849 match.contents.length(), ACMatchClassification::URL, |
| 839 &match.contents_class); | 850 &match.contents_class); |
| 840 match.description = info.title(); | 851 match.description = info.title(); |
| 841 AutocompleteMatch::ClassifyMatchInString(params->input.text(), info.title(), | 852 AutocompleteMatch::ClassifyMatchInString(params->input.text(), info.title(), |
| 842 ACMatchClassification::NONE, | 853 ACMatchClassification::NONE, |
| 843 &match.description_class); | 854 &match.description_class); |
| 844 | 855 |
| 845 return match; | 856 return match; |
| 846 } | 857 } |
| OLD | NEW |