| 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 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 119 } | 119 } |
| 120 | 120 |
| 121 // Used by both autocomplete passes, and therefore called on multiple different | 121 // Used by both autocomplete passes, and therefore called on multiple different |
| 122 // threads (though not simultaneously). | 122 // threads (though not simultaneously). |
| 123 void HistoryURLProvider::DoAutocomplete(history::HistoryBackend* backend, | 123 void HistoryURLProvider::DoAutocomplete(history::HistoryBackend* backend, |
| 124 history::URLDatabase* db, | 124 history::URLDatabase* db, |
| 125 HistoryURLProviderParams* params) { | 125 HistoryURLProviderParams* params) { |
| 126 // Create a What You Typed match, which we'll need below. | 126 // Create a What You Typed match, which we'll need below. |
| 127 bool have_what_you_typed_match = | 127 bool have_what_you_typed_match = |
| 128 params->input.canonicalized_url().is_valid() && | 128 params->input.canonicalized_url().is_valid() && |
| 129 (params->input.type() != AutocompleteInput::UNKNOWN); | 129 (params->input.type() != AutocompleteInput::UNKNOWN) && |
| 130 (params->input.type() != AutocompleteInput::QUERY); |
| 130 AutocompleteMatch what_you_typed_match(SuggestExactInput(params->input, | 131 AutocompleteMatch what_you_typed_match(SuggestExactInput(params->input, |
| 131 params->trim_http)); | 132 params->trim_http)); |
| 132 | 133 |
| 133 // Get the matching URLs from the DB | 134 // Get the matching URLs from the DB |
| 134 typedef std::vector<history::URLRow> URLRowVector; | 135 typedef std::vector<history::URLRow> URLRowVector; |
| 135 URLRowVector url_matches; | 136 URLRowVector url_matches; |
| 136 HistoryMatches history_matches; | 137 HistoryMatches history_matches; |
| 137 for (Prefixes::const_iterator i(prefixes_.begin()); i != prefixes_.end(); | 138 for (Prefixes::const_iterator i(prefixes_.begin()); i != prefixes_.end(); |
| 138 ++i) { | 139 ++i) { |
| 139 if (params->cancel) | 140 if (params->cancel) |
| (...skipping 25 matching lines...) Expand all Loading... |
| 165 // Try to promote a match as an exact/inline autocomplete match. This also | 166 // Try to promote a match as an exact/inline autocomplete match. This also |
| 166 // moves it to the front of |history_matches|, so skip over it when | 167 // moves it to the front of |history_matches|, so skip over it when |
| 167 // converting the rest of the matches. | 168 // converting the rest of the matches. |
| 168 size_t first_match = 1; | 169 size_t first_match = 1; |
| 169 size_t exact_suggestion = 0; | 170 size_t exact_suggestion = 0; |
| 170 // Checking |is_history_what_you_typed_match| tells us whether | 171 // Checking |is_history_what_you_typed_match| tells us whether |
| 171 // SuggestExactInput() succeeded in constructing a valid match. | 172 // SuggestExactInput() succeeded in constructing a valid match. |
| 172 if (what_you_typed_match.is_history_what_you_typed_match && | 173 if (what_you_typed_match.is_history_what_you_typed_match && |
| 173 FixupExactSuggestion(db, params->input, &what_you_typed_match, | 174 FixupExactSuggestion(db, params->input, &what_you_typed_match, |
| 174 &history_matches)) { | 175 &history_matches)) { |
| 175 // Got an exact match for the user's input. Treat is as the best match | 176 // Got an exact match for the user's input. Treat it as the best match |
| 176 // regardless of the input type. | 177 // regardless of the input type. |
| 177 exact_suggestion = 1; | 178 exact_suggestion = 1; |
| 178 params->matches.push_back(what_you_typed_match); | 179 params->matches.push_back(what_you_typed_match); |
| 179 } else if (params->input.prevent_inline_autocomplete() || | 180 } else if (params->input.prevent_inline_autocomplete() || |
| 180 history_matches.empty() || | 181 history_matches.empty() || |
| 181 !PromoteMatchForInlineAutocomplete(params, history_matches.front())) { | 182 !PromoteMatchForInlineAutocomplete(params, history_matches.front())) { |
| 182 // Failed to promote any URLs for inline autocompletion. Use the What You | 183 // Failed to promote any URLs for inline autocompletion. Use the What You |
| 183 // Typed match, if we have it and the input wasn't UNKNOWN. | 184 // Typed match, if we have it and the input looked like a URL. |
| 184 first_match = 0; | 185 first_match = 0; |
| 185 if (have_what_you_typed_match) | 186 if (have_what_you_typed_match) |
| 186 params->matches.push_back(what_you_typed_match); | 187 params->matches.push_back(what_you_typed_match); |
| 187 } | 188 } |
| 188 | 189 |
| 189 // This is the end of the synchronous pass. | 190 // This is the end of the synchronous pass. |
| 190 if (!backend) | 191 if (!backend) |
| 191 return; | 192 return; |
| 192 | 193 |
| 193 // Remove redirects and trim list to size. We want to provide up to | 194 // Remove redirects and trim list to size. We want to provide up to |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 | 458 |
| 458 // static | 459 // static |
| 459 int HistoryURLProvider::CalculateRelevance(AutocompleteInput::Type input_type, | 460 int HistoryURLProvider::CalculateRelevance(AutocompleteInput::Type input_type, |
| 460 MatchType match_type, | 461 MatchType match_type, |
| 461 size_t match_number) { | 462 size_t match_number) { |
| 462 switch (match_type) { | 463 switch (match_type) { |
| 463 case INLINE_AUTOCOMPLETE: | 464 case INLINE_AUTOCOMPLETE: |
| 464 return 1400; | 465 return 1400; |
| 465 | 466 |
| 466 case WHAT_YOU_TYPED: | 467 case WHAT_YOU_TYPED: |
| 467 return (input_type == AutocompleteInput::REQUESTED_URL) ? 1300 : 1200; | 468 return 1200; |
| 468 | 469 |
| 469 default: | 470 default: |
| 470 return 900 + static_cast<int>(match_number); | 471 return 900 + static_cast<int>(match_number); |
| 471 } | 472 } |
| 472 } | 473 } |
| 473 | 474 |
| 474 // static | 475 // static |
| 475 GURL HistoryURLProvider::ConvertToHostOnly(const HistoryMatch& match, | 476 GURL HistoryURLProvider::ConvertToHostOnly(const HistoryMatch& match, |
| 476 const std::wstring& input) { | 477 const std::wstring& input) { |
| 477 // See if we should try to do host-only suggestions for this URL. Nonstandard | 478 // See if we should try to do host-only suggestions for this URL. Nonstandard |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 585 matches->push_front(match); | 586 matches->push_front(match); |
| 586 else | 587 else |
| 587 matches->push_back(match); | 588 matches->push_back(match); |
| 588 } | 589 } |
| 589 | 590 |
| 590 void HistoryURLProvider::RunAutocompletePasses( | 591 void HistoryURLProvider::RunAutocompletePasses( |
| 591 const AutocompleteInput& input, | 592 const AutocompleteInput& input, |
| 592 bool fixup_input_and_run_pass_1) { | 593 bool fixup_input_and_run_pass_1) { |
| 593 matches_.clear(); | 594 matches_.clear(); |
| 594 | 595 |
| 595 if ((input.type() != AutocompleteInput::UNKNOWN) && | 596 if ((input.type() == AutocompleteInput::INVALID) || |
| 596 (input.type() != AutocompleteInput::REQUESTED_URL) && | 597 (input.type() == AutocompleteInput::FORCED_QUERY)) |
| 597 (input.type() != AutocompleteInput::URL)) | |
| 598 return; | 598 return; |
| 599 | 599 |
| 600 // Create a match for exactly what the user typed. This will only be used as | 600 // Create a match for exactly what the user typed. This will only be used as |
| 601 // a fallback in case we can't get the history service or URL DB; otherwise, | 601 // a fallback in case we can't get the history service or URL DB; otherwise, |
| 602 // we'll run this again in DoAutocomplete() and use that result instead. | 602 // we'll run this again in DoAutocomplete() and use that result instead. |
| 603 const bool trim_http = !url_util::FindAndCompareScheme( | 603 const bool trim_http = !url_util::FindAndCompareScheme( |
| 604 WideToUTF8(input.text()), chrome::kHttpScheme, NULL); | 604 WideToUTF8(input.text()), chrome::kHttpScheme, NULL); |
| 605 if (input.canonicalized_url().is_valid()) | 605 // Don't do this for queries -- while we can sometimes mark up a match for |
| 606 // this, it's not what the user wants, and just adds noise. |
| 607 if ((input.type() != AutocompleteInput::QUERY) && |
| 608 input.canonicalized_url().is_valid()) |
| 606 matches_.push_back(SuggestExactInput(input, trim_http)); | 609 matches_.push_back(SuggestExactInput(input, trim_http)); |
| 607 | 610 |
| 608 // We'll need the history service to run both passes, so try to obtain it. | 611 // We'll need the history service to run both passes, so try to obtain it. |
| 609 HistoryService* const history_service = profile_ ? | 612 HistoryService* const history_service = profile_ ? |
| 610 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS) : history_service_; | 613 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS) : history_service_; |
| 611 if (!history_service) | 614 if (!history_service) |
| 612 return; | 615 return; |
| 613 | 616 |
| 614 // Create the data structure for the autocomplete passes. We'll save this off | 617 // Create the data structure for the autocomplete passes. We'll save this off |
| 615 // onto the |params_| member for later deletion below if we need to run pass | 618 // onto the |params_| member for later deletion below if we need to run pass |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 826 history_match.input_location - offset, params->input.text().length(), | 829 history_match.input_location - offset, params->input.text().length(), |
| 827 match.contents.length(), ACMatchClassification::URL, | 830 match.contents.length(), ACMatchClassification::URL, |
| 828 &match.contents_class); | 831 &match.contents_class); |
| 829 match.description = info.title(); | 832 match.description = info.title(); |
| 830 AutocompleteMatch::ClassifyMatchInString(params->input.text(), info.title(), | 833 AutocompleteMatch::ClassifyMatchInString(params->input.text(), info.title(), |
| 831 ACMatchClassification::NONE, | 834 ACMatchClassification::NONE, |
| 832 &match.description_class); | 835 &match.description_class); |
| 833 | 836 |
| 834 return match; | 837 return match; |
| 835 } | 838 } |
| OLD | NEW |