| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 71 if (a.url_info.visit_count() != b.url_info.visit_count()) | 71 if (a.url_info.visit_count() != b.url_info.visit_count()) |
| 72 return a.url_info.visit_count() > b.url_info.visit_count(); | 72 return a.url_info.visit_count() > b.url_info.visit_count(); |
| 73 | 73 |
| 74 // URLs that have been visited more recently are better. | 74 // URLs that have been visited more recently are better. |
| 75 return a.url_info.last_visit() > b.url_info.last_visit(); | 75 return a.url_info.last_visit() > b.url_info.last_visit(); |
| 76 } | 76 } |
| 77 | 77 |
| 78 // Given the user's |input| and a |match| created from it, reduce the | 78 // Given the user's |input| and a |match| created from it, reduce the |
| 79 // match's URL to just a host. If this host still matches the user input, | 79 // match's URL to just a host. If this host still matches the user input, |
| 80 // return it. Returns the empty string on failure. | 80 // return it. Returns the empty string on failure. |
| 81 GURL ConvertToHostOnly(const HistoryMatch& match, const string16& input) { | 81 GURL ConvertToHostOnly(const HistoryMatch& match, const std::wstring& input) { |
| 82 // See if we should try to do host-only suggestions for this URL. Nonstandard | 82 // See if we should try to do host-only suggestions for this URL. Nonstandard |
| 83 // schemes means there's no authority section, so suggesting the host name | 83 // schemes means there's no authority section, so suggesting the host name |
| 84 // is useless. File URLs are standard, but host suggestion is not useful for | 84 // is useless. File URLs are standard, but host suggestion is not useful for |
| 85 // them either. | 85 // them either. |
| 86 const GURL& url = match.url_info.url(); | 86 const GURL& url = match.url_info.url(); |
| 87 if (!url.is_valid() || !url.IsStandard() || url.SchemeIsFile()) | 87 if (!url.is_valid() || !url.IsStandard() || url.SchemeIsFile()) |
| 88 return GURL(); | 88 return GURL(); |
| 89 | 89 |
| 90 // Transform to a host-only match. Bail if the host no longer matches the | 90 // Transform to a host-only match. Bail if the host no longer matches the |
| 91 // user input (e.g. because the user typed more than just a host). | 91 // user input (e.g. because the user typed more than just a host). |
| 92 GURL host = url.GetWithEmptyPath(); | 92 GURL host = url.GetWithEmptyPath(); |
| 93 if ((host.spec().length() < (match.input_location + input.length()))) | 93 if ((host.spec().length() < (match.input_location + input.length()))) |
| 94 return GURL(); // User typing is longer than this host suggestion. | 94 return GURL(); // User typing is longer than this host suggestion. |
| 95 | 95 |
| 96 const string16 spec = UTF8ToUTF16(host.spec()); | 96 const std::wstring spec = UTF8ToWide(host.spec()); |
| 97 if (spec.compare(match.input_location, input.length(), input)) | 97 if (spec.compare(match.input_location, input.length(), input)) |
| 98 return GURL(); // User typing is no longer a prefix. | 98 return GURL(); // User typing is no longer a prefix. |
| 99 | 99 |
| 100 return host; | 100 return host; |
| 101 } | 101 } |
| 102 | 102 |
| 103 } // namespace history | 103 } // namespace history |
| 104 | 104 |
| 105 HistoryURLProviderParams::HistoryURLProviderParams( | 105 HistoryURLProviderParams::HistoryURLProviderParams( |
| 106 const AutocompleteInput& input, | 106 const AutocompleteInput& input, |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 181 // * Their input can be opened as a URL, and | 181 // * Their input can be opened as a URL, and |
| 182 // * They hit ctrl-enter, or we parsed the input as a URL, or it starts with | 182 // * They hit ctrl-enter, or we parsed the input as a URL, or it starts with |
| 183 // an explicit "http:" or "https:". | 183 // an explicit "http:" or "https:". |
| 184 // Otherwise, this is just low-quality noise. In the cases where we've parsed | 184 // Otherwise, this is just low-quality noise. In the cases where we've parsed |
| 185 // as UNKNOWN, we'll still show an accidental search infobar if need be. | 185 // as UNKNOWN, we'll still show an accidental search infobar if need be. |
| 186 bool have_what_you_typed_match = | 186 bool have_what_you_typed_match = |
| 187 params->input.canonicalized_url().is_valid() && | 187 params->input.canonicalized_url().is_valid() && |
| 188 (params->input.type() != AutocompleteInput::QUERY) && | 188 (params->input.type() != AutocompleteInput::QUERY) && |
| 189 ((params->input.type() != AutocompleteInput::UNKNOWN) || | 189 ((params->input.type() != AutocompleteInput::UNKNOWN) || |
| 190 !params->trim_http || | 190 !params->trim_http || |
| 191 url_util::FindAndCompareScheme(UTF16ToUTF8(params->input.text()), | 191 url_util::FindAndCompareScheme(WideToUTF8(params->input.text()), |
| 192 chrome::kHttpsScheme, NULL)); | 192 chrome::kHttpsScheme, NULL)); |
| 193 AutocompleteMatch what_you_typed_match(SuggestExactInput(params->input, | 193 AutocompleteMatch what_you_typed_match(SuggestExactInput(params->input, |
| 194 params->trim_http)); | 194 params->trim_http)); |
| 195 | 195 |
| 196 // Get the matching URLs from the DB | 196 // Get the matching URLs from the DB |
| 197 typedef std::vector<history::URLRow> URLRowVector; | 197 typedef std::vector<history::URLRow> URLRowVector; |
| 198 URLRowVector url_matches; | 198 URLRowVector url_matches; |
| 199 HistoryMatches history_matches; | 199 HistoryMatches history_matches; |
| 200 | 200 |
| 201 for (Prefixes::const_iterator i(prefixes_.begin()); i != prefixes_.end(); | 201 for (Prefixes::const_iterator i(prefixes_.begin()); i != prefixes_.end(); |
| 202 ++i) { | 202 ++i) { |
| 203 if (params->cancel) | 203 if (params->cancel) |
| 204 return; // Canceled in the middle of a query, give up. | 204 return; // Canceled in the middle of a query, give up. |
| 205 // We only need kMaxMatches results in the end, but before we get there we | 205 // We only need kMaxMatches results in the end, but before we get there we |
| 206 // need to promote lower-quality matches that are prefixes of | 206 // need to promote lower-quality matches that are prefixes of |
| 207 // higher-quality matches, and remove lower-quality redirects. So we ask | 207 // higher-quality matches, and remove lower-quality redirects. So we ask |
| 208 // for more results than we need, of every prefix type, in hopes this will | 208 // for more results than we need, of every prefix type, in hopes this will |
| 209 // give us far more than enough to work with. CullRedirects() will then | 209 // give us far more than enough to work with. CullRedirects() will then |
| 210 // reduce the list to the best kMaxMatches results. | 210 // reduce the list to the best kMaxMatches results. |
| 211 db->AutocompleteForPrefix(i->prefix + params->input.text(), | 211 db->AutocompleteForPrefix(WideToUTF16(i->prefix + params->input.text()), |
| 212 kMaxMatches * 2, (backend == NULL), &url_matches); | 212 kMaxMatches * 2, (backend == NULL), &url_matches); |
| 213 for (URLRowVector::const_iterator j(url_matches.begin()); | 213 for (URLRowVector::const_iterator j(url_matches.begin()); |
| 214 j != url_matches.end(); ++j) { | 214 j != url_matches.end(); ++j) { |
| 215 const Prefix* best_prefix = BestPrefix(j->url(), string16()); | 215 const Prefix* best_prefix = BestPrefix(j->url(), std::wstring()); |
| 216 DCHECK(best_prefix != NULL); | 216 DCHECK(best_prefix != NULL); |
| 217 history_matches.push_back(HistoryMatch(*j, i->prefix.length(), | 217 history_matches.push_back(HistoryMatch(*j, i->prefix.length(), |
| 218 !i->num_components, | 218 !i->num_components, |
| 219 i->num_components >= best_prefix->num_components)); | 219 i->num_components >= best_prefix->num_components)); |
| 220 } | 220 } |
| 221 } | 221 } |
| 222 | 222 |
| 223 // Create sorted list of suggestions. | 223 // Create sorted list of suggestions. |
| 224 CullPoorMatches(&history_matches); | 224 CullPoorMatches(&history_matches); |
| 225 SortMatches(&history_matches); | 225 SortMatches(&history_matches); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 const GURL& url = input.canonicalized_url(); | 306 const GURL& url = input.canonicalized_url(); |
| 307 if (url.is_valid()) { | 307 if (url.is_valid()) { |
| 308 match.destination_url = url; | 308 match.destination_url = url; |
| 309 | 309 |
| 310 // Trim off "http://" if the user didn't type it. | 310 // Trim off "http://" if the user didn't type it. |
| 311 // NOTE: We use TrimHttpPrefix() here rather than StringForURLDisplay() to | 311 // NOTE: We use TrimHttpPrefix() here rather than StringForURLDisplay() to |
| 312 // strip the scheme as we need to know the offset so we can adjust the | 312 // strip the scheme as we need to know the offset so we can adjust the |
| 313 // |match_location| below. StringForURLDisplay() and TrimHttpPrefix() have | 313 // |match_location| below. StringForURLDisplay() and TrimHttpPrefix() have |
| 314 // slightly different behavior as well (the latter will strip even without | 314 // slightly different behavior as well (the latter will strip even without |
| 315 // two slashes after the scheme). | 315 // two slashes after the scheme). |
| 316 string16 display_string(StringForURLDisplay(url, false, false)); | 316 std::wstring display_string(StringForURLDisplay(url, false, false)); |
| 317 const size_t offset = trim_http ? TrimHttpPrefix(&display_string) : 0; | 317 const size_t offset = trim_http ? TrimHttpPrefix(&display_string) : 0; |
| 318 match.fill_into_edit = | 318 match.fill_into_edit = |
| 319 AutocompleteInput::FormattedStringWithEquivalentMeaning(url, | 319 AutocompleteInput::FormattedStringWithEquivalentMeaning(url, |
| 320 display_string); | 320 display_string); |
| 321 // NOTE: Don't set match.input_location (to allow inline autocompletion) | 321 // NOTE: Don't set match.input_location (to allow inline autocompletion) |
| 322 // here, it's surprising and annoying. | 322 // here, it's surprising and annoying. |
| 323 | 323 |
| 324 // Try to highlight "innermost" match location. If we fix up "w" into | 324 // Try to highlight "innermost" match location. If we fix up "w" into |
| 325 // "www.w.com", we want to highlight the fifth character, not the first. | 325 // "www.w.com", we want to highlight the fifth character, not the first. |
| 326 // This relies on match.destination_url being the non-prefix-trimmed version | 326 // This relies on match.destination_url being the non-prefix-trimmed version |
| 327 // of match.contents. | 327 // of match.contents. |
| 328 match.contents = display_string; | 328 match.contents = display_string; |
| 329 const Prefix* best_prefix = BestPrefix(match.destination_url, input.text()); | 329 const Prefix* best_prefix = BestPrefix(match.destination_url, input.text()); |
| 330 // Because of the vagaries of GURL, it's possible for match.destination_url | 330 // Because of the vagaries of GURL, it's possible for match.destination_url |
| 331 // to not contain the user's input at all. In this case don't mark anything | 331 // to not contain the user's input at all. In this case don't mark anything |
| 332 // as a match. | 332 // as a match. |
| 333 const size_t match_location = (best_prefix == NULL) ? | 333 const size_t match_location = (best_prefix == NULL) ? |
| 334 string16::npos : best_prefix->prefix.length() - offset; | 334 std::wstring::npos : best_prefix->prefix.length() - offset; |
| 335 AutocompleteMatch::ClassifyLocationInString(match_location, | 335 AutocompleteMatch::ClassifyLocationInString(match_location, |
| 336 input.text().length(), | 336 input.text().length(), |
| 337 match.contents.length(), | 337 match.contents.length(), |
| 338 ACMatchClassification::URL, | 338 ACMatchClassification::URL, |
| 339 &match.contents_class); | 339 &match.contents_class); |
| 340 | 340 |
| 341 match.is_history_what_you_typed_match = true; | 341 match.is_history_what_you_typed_match = true; |
| 342 } | 342 } |
| 343 | 343 |
| 344 return match; | 344 return match; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 364 // * If the what-you-typed match is not in the history DB, | 364 // * If the what-you-typed match is not in the history DB, |
| 365 // * and the user has specified a TLD, | 365 // * and the user has specified a TLD, |
| 366 // * and the input _without_ the TLD _is_ in the history DB, | 366 // * and the input _without_ the TLD _is_ in the history DB, |
| 367 // * ...then just before pressing "ctrl" the best match we supplied was the | 367 // * ...then just before pressing "ctrl" the best match we supplied was the |
| 368 // what-you-typed match, so stick with it by promoting this. | 368 // what-you-typed match, so stick with it by promoting this. |
| 369 history::URLRow info; | 369 history::URLRow info; |
| 370 MatchType type = INLINE_AUTOCOMPLETE; | 370 MatchType type = INLINE_AUTOCOMPLETE; |
| 371 if (!db->GetRowForURL(match->destination_url, &info)) { | 371 if (!db->GetRowForURL(match->destination_url, &info)) { |
| 372 if (input.desired_tld().empty()) | 372 if (input.desired_tld().empty()) |
| 373 return false; | 373 return false; |
| 374 GURL destination_url(URLFixerUpper::FixupURL(UTF16ToUTF8(input.text()), | 374 GURL destination_url(URLFixerUpper::FixupURL(WideToUTF8(input.text()), |
| 375 std::string())); | 375 std::string())); |
| 376 if (!db->GetRowForURL(destination_url, NULL)) | 376 if (!db->GetRowForURL(destination_url, NULL)) |
| 377 return false; | 377 return false; |
| 378 | 378 |
| 379 // If we got here, then we hit the tricky corner case. Make sure that | 379 // If we got here, then we hit the tricky corner case. Make sure that |
| 380 // |info| corresponds to the right URL. | 380 // |info| corresponds to the right URL. |
| 381 info = history::URLRow(match->destination_url); | 381 info = history::URLRow(match->destination_url); |
| 382 } else { | 382 } else { |
| 383 // We have data for this match, use it. | 383 // We have data for this match, use it. |
| 384 match->deletable = true; | 384 match->deletable = true; |
| 385 match->description = info.title(); | 385 match->description = UTF16ToWide(info.title()); |
| 386 AutocompleteMatch::ClassifyMatchInString(input.text(), | 386 AutocompleteMatch::ClassifyMatchInString(input.text(), |
| 387 info.title(), | 387 UTF16ToWide(info.title()), |
| 388 ACMatchClassification::NONE, &match->description_class); | 388 ACMatchClassification::NONE, &match->description_class); |
| 389 if (!info.typed_count()) { | 389 if (!info.typed_count()) { |
| 390 // If we reach here, we must be in the second pass, and we must not have | 390 // If we reach here, we must be in the second pass, and we must not have |
| 391 // promoted this match as an exact match during the first pass. That | 391 // promoted this match as an exact match during the first pass. That |
| 392 // means it will have been outscored by the "search what you typed match". | 392 // means it will have been outscored by the "search what you typed match". |
| 393 // We need to maintain that ordering in order to not make the destination | 393 // We need to maintain that ordering in order to not make the destination |
| 394 // for the user's typing change depending on when they hit enter. So | 394 // for the user's typing change depending on when they hit enter. So |
| 395 // lower the score here enough to let the search provider continue to | 395 // lower the score here enough to let the search provider continue to |
| 396 // outscore this match. | 396 // outscore this match. |
| 397 type = WHAT_YOU_TYPED; | 397 type = WHAT_YOU_TYPED; |
| 398 } | 398 } |
| 399 } | 399 } |
| 400 | 400 |
| 401 // Promote as an exact match. | 401 // Promote as an exact match. |
| 402 match->relevance = CalculateRelevance(input.type(), type, 0); | 402 match->relevance = CalculateRelevance(input.type(), type, 0); |
| 403 | 403 |
| 404 // Put it on the front of the HistoryMatches for redirect culling. | 404 // Put it on the front of the HistoryMatches for redirect culling. |
| 405 EnsureMatchPresent(info, string16::npos, false, matches, true); | 405 EnsureMatchPresent(info, std::wstring::npos, false, matches, true); |
| 406 return true; | 406 return true; |
| 407 } | 407 } |
| 408 | 408 |
| 409 bool HistoryURLProvider::PromoteMatchForInlineAutocomplete( | 409 bool HistoryURLProvider::PromoteMatchForInlineAutocomplete( |
| 410 HistoryURLProviderParams* params, | 410 HistoryURLProviderParams* params, |
| 411 const HistoryMatch& match) { | 411 const HistoryMatch& match) { |
| 412 // Promote the first match if it's been typed at least n times, where n == 1 | 412 // Promote the first match if it's been typed at least n times, where n == 1 |
| 413 // for "simple" (host-only) URLs and n == 2 for others. We set a higher bar | 413 // for "simple" (host-only) URLs and n == 2 for others. We set a higher bar |
| 414 // for these long URLs because it's less likely that users will want to visit | 414 // for these long URLs because it's less likely that users will want to visit |
| 415 // them again. Even though we don't increment the typed_count for pasted-in | 415 // them again. Even though we don't increment the typed_count for pasted-in |
| 416 // URLs, if the user manually edits the URL or types some long thing in by | 416 // URLs, if the user manually edits the URL or types some long thing in by |
| 417 // hand, we wouldn't want to immediately start autocompleting it. | 417 // hand, we wouldn't want to immediately start autocompleting it. |
| 418 if (!match.url_info.typed_count() || | 418 if (!match.url_info.typed_count() || |
| 419 ((match.url_info.typed_count() == 1) && | 419 ((match.url_info.typed_count() == 1) && |
| 420 !history::IsHostOnly(match.url_info.url()))) | 420 !history::IsHostOnly(match.url_info.url()))) |
| 421 return false; | 421 return false; |
| 422 | 422 |
| 423 params->matches.push_back(HistoryMatchToACMatch(params, match, | 423 params->matches.push_back(HistoryMatchToACMatch(params, match, |
| 424 INLINE_AUTOCOMPLETE, 0)); | 424 INLINE_AUTOCOMPLETE, 0)); |
| 425 return true; | 425 return true; |
| 426 } | 426 } |
| 427 | 427 |
| 428 // static | 428 // static |
| 429 history::Prefixes HistoryURLProvider::GetPrefixes() { | 429 history::Prefixes HistoryURLProvider::GetPrefixes() { |
| 430 // We'll complete text following these prefixes. | 430 // We'll complete text following these prefixes. |
| 431 // NOTE: There's no requirement that these be in any particular order. | 431 // NOTE: There's no requirement that these be in any particular order. |
| 432 Prefixes prefixes; | 432 Prefixes prefixes; |
| 433 prefixes.push_back(Prefix(ASCIIToUTF16("https://www."), 2)); | 433 prefixes.push_back(Prefix(L"https://www.", 2)); |
| 434 prefixes.push_back(Prefix(ASCIIToUTF16("http://www."), 2)); | 434 prefixes.push_back(Prefix(L"http://www.", 2)); |
| 435 prefixes.push_back(Prefix(ASCIIToUTF16("ftp://ftp."), 2)); | 435 prefixes.push_back(Prefix(L"ftp://ftp.", 2)); |
| 436 prefixes.push_back(Prefix(ASCIIToUTF16("ftp://www."), 2)); | 436 prefixes.push_back(Prefix(L"ftp://www.", 2)); |
| 437 prefixes.push_back(Prefix(ASCIIToUTF16("https://"), 1)); | 437 prefixes.push_back(Prefix(L"https://", 1)); |
| 438 prefixes.push_back(Prefix(ASCIIToUTF16("http://"), 1)); | 438 prefixes.push_back(Prefix(L"http://", 1)); |
| 439 prefixes.push_back(Prefix(ASCIIToUTF16("ftp://"), 1)); | 439 prefixes.push_back(Prefix(L"ftp://", 1)); |
| 440 // Empty string catches within-scheme matches as well. | 440 prefixes.push_back(Prefix(L"", 0)); // Catches within-scheme matches as well |
| 441 prefixes.push_back(Prefix(string16(), 0)); | |
| 442 return prefixes; | 441 return prefixes; |
| 443 } | 442 } |
| 444 | 443 |
| 445 // static | 444 // static |
| 446 int HistoryURLProvider::CalculateRelevance(AutocompleteInput::Type input_type, | 445 int HistoryURLProvider::CalculateRelevance(AutocompleteInput::Type input_type, |
| 447 MatchType match_type, | 446 MatchType match_type, |
| 448 size_t match_number) { | 447 size_t match_number) { |
| 449 switch (match_type) { | 448 switch (match_type) { |
| 450 case INLINE_AUTOCOMPLETE: | 449 case INLINE_AUTOCOMPLETE: |
| 451 return 1400; | 450 return 1400; |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 } | 522 } |
| 524 | 523 |
| 525 // Promote or add the desired URL to the list of matches. | 524 // Promote or add the desired URL to the list of matches. |
| 526 EnsureMatchPresent(info, match.input_location, match.match_in_scheme, | 525 EnsureMatchPresent(info, match.input_location, match.match_in_scheme, |
| 527 matches, promote); | 526 matches, promote); |
| 528 } | 527 } |
| 529 | 528 |
| 530 // static | 529 // static |
| 531 void HistoryURLProvider::EnsureMatchPresent( | 530 void HistoryURLProvider::EnsureMatchPresent( |
| 532 const history::URLRow& info, | 531 const history::URLRow& info, |
| 533 string16::size_type input_location, | 532 std::wstring::size_type input_location, |
| 534 bool match_in_scheme, | 533 bool match_in_scheme, |
| 535 HistoryMatches* matches, | 534 HistoryMatches* matches, |
| 536 bool promote) { | 535 bool promote) { |
| 537 // |matches| may already have an entry for this. | 536 // |matches| may already have an entry for this. |
| 538 for (HistoryMatches::iterator i(matches->begin()); i != matches->end(); | 537 for (HistoryMatches::iterator i(matches->begin()); i != matches->end(); |
| 539 ++i) { | 538 ++i) { |
| 540 if (i->url_info.url() == info.url()) { | 539 if (i->url_info.url() == info.url()) { |
| 541 // Rotate it to the front if the caller wishes. | 540 // Rotate it to the front if the caller wishes. |
| 542 if (promote) | 541 if (promote) |
| 543 std::rotate(matches->begin(), i, i + 1); | 542 std::rotate(matches->begin(), i, i + 1); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 } | 587 } |
| 589 scoped_ptr<HistoryURLProviderParams> params( | 588 scoped_ptr<HistoryURLProviderParams> params( |
| 590 new HistoryURLProviderParams(input, trim_http, languages)); | 589 new HistoryURLProviderParams(input, trim_http, languages)); |
| 591 | 590 |
| 592 if (fixup_input_and_run_pass_1) { | 591 if (fixup_input_and_run_pass_1) { |
| 593 // Do some fixup on the user input before matching against it, so we provide | 592 // Do some fixup on the user input before matching against it, so we provide |
| 594 // good results for local file paths, input with spaces, etc. | 593 // good results for local file paths, input with spaces, etc. |
| 595 // NOTE: This purposefully doesn't take input.desired_tld() into account; if | 594 // NOTE: This purposefully doesn't take input.desired_tld() into account; if |
| 596 // it did, then holding "ctrl" would change all the results from the | 595 // it did, then holding "ctrl" would change all the results from the |
| 597 // HistoryURLProvider provider, not just the What You Typed Result. | 596 // HistoryURLProvider provider, not just the What You Typed Result. |
| 598 const string16 fixed_text(FixupUserInput(input)); | 597 const std::wstring fixed_text(FixupUserInput(input)); |
| 599 if (fixed_text.empty()) { | 598 if (fixed_text.empty()) { |
| 600 // Conceivably fixup could result in an empty string (although I don't | 599 // Conceivably fixup could result in an empty string (although I don't |
| 601 // have cases where this happens offhand). We can't do anything with | 600 // have cases where this happens offhand). We can't do anything with |
| 602 // empty input, so just bail; otherwise we'd crash later. | 601 // empty input, so just bail; otherwise we'd crash later. |
| 603 return; | 602 return; |
| 604 } | 603 } |
| 605 params->input.set_text(fixed_text); | 604 params->input.set_text(fixed_text); |
| 606 | 605 |
| 607 // Pass 1: Get the in-memory URL database, and use it to find and promote | 606 // Pass 1: Get the in-memory URL database, and use it to find and promote |
| 608 // the inline autocomplete match, if any. | 607 // the inline autocomplete match, if any. |
| (...skipping 20 matching lines...) Expand all Loading... |
| 629 if (!input.synchronous_only()) { | 628 if (!input.synchronous_only()) { |
| 630 done_ = false; | 629 done_ = false; |
| 631 params_ = params.release(); // This object will be destroyed in | 630 params_ = params.release(); // This object will be destroyed in |
| 632 // QueryComplete() once we're done with it. | 631 // QueryComplete() once we're done with it. |
| 633 history_service->ScheduleAutocomplete(this, params_); | 632 history_service->ScheduleAutocomplete(this, params_); |
| 634 } | 633 } |
| 635 } | 634 } |
| 636 | 635 |
| 637 const history::Prefix* HistoryURLProvider::BestPrefix( | 636 const history::Prefix* HistoryURLProvider::BestPrefix( |
| 638 const GURL& url, | 637 const GURL& url, |
| 639 const string16& prefix_suffix) const { | 638 const std::wstring& prefix_suffix) const { |
| 640 const Prefix* best_prefix = NULL; | 639 const Prefix* best_prefix = NULL; |
| 641 const string16 text(UTF8ToUTF16(url.spec())); | 640 const std::wstring text(UTF8ToWide(url.spec())); |
| 642 for (Prefixes::const_iterator i(prefixes_.begin()); i != prefixes_.end(); | 641 for (Prefixes::const_iterator i(prefixes_.begin()); i != prefixes_.end(); |
| 643 ++i) { | 642 ++i) { |
| 644 if ((best_prefix == NULL) || | 643 if ((best_prefix == NULL) || |
| 645 (i->num_components > best_prefix->num_components)) { | 644 (i->num_components > best_prefix->num_components)) { |
| 646 string16 prefix_with_suffix(i->prefix + prefix_suffix); | 645 std::wstring prefix_with_suffix(i->prefix + prefix_suffix); |
| 647 if ((text.length() >= prefix_with_suffix.length()) && | 646 if ((text.length() >= prefix_with_suffix.length()) && |
| 648 !text.compare(0, prefix_with_suffix.length(), prefix_with_suffix)) | 647 !text.compare(0, prefix_with_suffix.length(), prefix_with_suffix)) |
| 649 best_prefix = &(*i); | 648 best_prefix = &(*i); |
| 650 } | 649 } |
| 651 } | 650 } |
| 652 return best_prefix; | 651 return best_prefix; |
| 653 } | 652 } |
| 654 | 653 |
| 655 void HistoryURLProvider::SortMatches(HistoryMatches* matches) const { | 654 void HistoryURLProvider::SortMatches(HistoryMatches* matches) const { |
| 656 // Sort by quality, best first. | 655 // Sort by quality, best first. |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 772 DCHECK(match.destination_url.is_valid()); | 771 DCHECK(match.destination_url.is_valid()); |
| 773 size_t inline_autocomplete_offset = | 772 size_t inline_autocomplete_offset = |
| 774 history_match.input_location + params->input.text().length(); | 773 history_match.input_location + params->input.text().length(); |
| 775 std::string languages = (match_type == WHAT_YOU_TYPED) ? | 774 std::string languages = (match_type == WHAT_YOU_TYPED) ? |
| 776 std::string() : params->languages; | 775 std::string() : params->languages; |
| 777 const net::FormatUrlTypes format_types = net::kFormatUrlOmitAll & | 776 const net::FormatUrlTypes format_types = net::kFormatUrlOmitAll & |
| 778 ~((params->trim_http && !history_match.match_in_scheme) ? | 777 ~((params->trim_http && !history_match.match_in_scheme) ? |
| 779 0 : net::kFormatUrlOmitHTTP); | 778 0 : net::kFormatUrlOmitHTTP); |
| 780 match.fill_into_edit = | 779 match.fill_into_edit = |
| 781 AutocompleteInput::FormattedStringWithEquivalentMeaning(info.url(), | 780 AutocompleteInput::FormattedStringWithEquivalentMeaning(info.url(), |
| 782 net::FormatUrl(info.url(), languages, format_types, | 781 UTF16ToWideHack(net::FormatUrl(info.url(), languages, format_types, |
| 783 UnescapeRule::SPACES, NULL, NULL, | 782 UnescapeRule::SPACES, NULL, NULL, |
| 784 &inline_autocomplete_offset)); | 783 &inline_autocomplete_offset))); |
| 785 if (!params->input.prevent_inline_autocomplete()) | 784 if (!params->input.prevent_inline_autocomplete()) |
| 786 match.inline_autocomplete_offset = inline_autocomplete_offset; | 785 match.inline_autocomplete_offset = inline_autocomplete_offset; |
| 787 DCHECK((match.inline_autocomplete_offset == string16::npos) || | 786 DCHECK((match.inline_autocomplete_offset == std::wstring::npos) || |
| 788 (match.inline_autocomplete_offset <= match.fill_into_edit.length())); | 787 (match.inline_autocomplete_offset <= match.fill_into_edit.length())); |
| 789 | 788 |
| 790 size_t match_start = history_match.input_location; | 789 size_t match_start = history_match.input_location; |
| 791 match.contents = net::FormatUrl(info.url(), languages, | 790 match.contents = UTF16ToWideHack(net::FormatUrl(info.url(), languages, |
| 792 format_types, UnescapeRule::SPACES, NULL, NULL, &match_start); | 791 format_types, UnescapeRule::SPACES, NULL, NULL, &match_start)); |
| 793 if ((match_start != string16::npos) && | 792 if ((match_start != std::wstring::npos) && |
| 794 (inline_autocomplete_offset != string16::npos) && | 793 (inline_autocomplete_offset != std::wstring::npos) && |
| 795 (inline_autocomplete_offset != match_start)) { | 794 (inline_autocomplete_offset != match_start)) { |
| 796 DCHECK(inline_autocomplete_offset > match_start); | 795 DCHECK(inline_autocomplete_offset > match_start); |
| 797 AutocompleteMatch::ClassifyLocationInString(match_start, | 796 AutocompleteMatch::ClassifyLocationInString(match_start, |
| 798 inline_autocomplete_offset - match_start, match.contents.length(), | 797 inline_autocomplete_offset - match_start, match.contents.length(), |
| 799 ACMatchClassification::URL, &match.contents_class); | 798 ACMatchClassification::URL, &match.contents_class); |
| 800 } else { | 799 } else { |
| 801 AutocompleteMatch::ClassifyLocationInString(string16::npos, 0, | 800 AutocompleteMatch::ClassifyLocationInString(std::wstring::npos, 0, |
| 802 match.contents.length(), ACMatchClassification::URL, | 801 match.contents.length(), ACMatchClassification::URL, |
| 803 &match.contents_class); | 802 &match.contents_class); |
| 804 } | 803 } |
| 805 match.description = info.title(); | 804 match.description = UTF16ToWide(info.title()); |
| 806 AutocompleteMatch::ClassifyMatchInString(params->input.text(), | 805 AutocompleteMatch::ClassifyMatchInString(params->input.text(), |
| 807 info.title(), | 806 UTF16ToWide(info.title()), |
| 808 ACMatchClassification::NONE, | 807 ACMatchClassification::NONE, |
| 809 &match.description_class); | 808 &match.description_class); |
| 810 | 809 |
| 811 return match; | 810 return match; |
| 812 } | 811 } |
| OLD | NEW |