OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/bind.h" | 10 #include "base/bind.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 const GURL& url = match.url_info.url(); | 94 const GURL& url = match.url_info.url(); |
95 if (!url.is_valid() || !url.IsStandard() || url.SchemeIsFile()) | 95 if (!url.is_valid() || !url.IsStandard() || url.SchemeIsFile()) |
96 return GURL(); | 96 return GURL(); |
97 | 97 |
98 // Transform to a host-only match. Bail if the host no longer matches the | 98 // Transform to a host-only match. Bail if the host no longer matches the |
99 // user input (e.g. because the user typed more than just a host). | 99 // user input (e.g. because the user typed more than just a host). |
100 GURL host = url.GetWithEmptyPath(); | 100 GURL host = url.GetWithEmptyPath(); |
101 if ((host.spec().length() < (match.input_location + input.length()))) | 101 if ((host.spec().length() < (match.input_location + input.length()))) |
102 return GURL(); // User typing is longer than this host suggestion. | 102 return GURL(); // User typing is longer than this host suggestion. |
103 | 103 |
104 const base::string16 spec = UTF8ToUTF16(host.spec()); | 104 const base::string16 spec = base::UTF8ToUTF16(host.spec()); |
105 if (spec.compare(match.input_location, input.length(), input)) | 105 if (spec.compare(match.input_location, input.length(), input)) |
106 return GURL(); // User typing is no longer a prefix. | 106 return GURL(); // User typing is no longer a prefix. |
107 | 107 |
108 return host; | 108 return host; |
109 } | 109 } |
110 | 110 |
111 // Acts like the > operator for URLInfo classes. | 111 // Acts like the > operator for URLInfo classes. |
112 bool CompareHistoryMatch(const history::HistoryMatch& a, | 112 bool CompareHistoryMatch(const history::HistoryMatch& a, |
113 const history::HistoryMatch& b) { | 113 const history::HistoryMatch& b) { |
114 // A promoted match is better than non-promoted. | 114 // A promoted match is better than non-promoted. |
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 display_string); | 423 display_string); |
424 match.allowed_to_be_default_match = true; | 424 match.allowed_to_be_default_match = true; |
425 // NOTE: Don't set match.inline_autocompletion to something non-empty here; | 425 // NOTE: Don't set match.inline_autocompletion to something non-empty here; |
426 // it's surprising and annoying. | 426 // it's surprising and annoying. |
427 | 427 |
428 // Try to highlight "innermost" match location. If we fix up "w" into | 428 // Try to highlight "innermost" match location. If we fix up "w" into |
429 // "www.w.com", we want to highlight the fifth character, not the first. | 429 // "www.w.com", we want to highlight the fifth character, not the first. |
430 // This relies on match.destination_url being the non-prefix-trimmed version | 430 // This relies on match.destination_url being the non-prefix-trimmed version |
431 // of match.contents. | 431 // of match.contents. |
432 match.contents = display_string; | 432 match.contents = display_string; |
433 const URLPrefix* best_prefix = | 433 const URLPrefix* best_prefix = URLPrefix::BestURLPrefix( |
434 URLPrefix::BestURLPrefix(UTF8ToUTF16(destination_url.spec()), text); | 434 base::UTF8ToUTF16(destination_url.spec()), text); |
435 // It's possible for match.destination_url to not contain the user's input | 435 // It's possible for match.destination_url to not contain the user's input |
436 // at all (so |best_prefix| is NULL), for example if the input is | 436 // at all (so |best_prefix| is NULL), for example if the input is |
437 // "view-source:x" and |destination_url| has an inserted "http://" in the | 437 // "view-source:x" and |destination_url| has an inserted "http://" in the |
438 // middle. | 438 // middle. |
439 if (best_prefix == NULL) { | 439 if (best_prefix == NULL) { |
440 AutocompleteMatch::ClassifyMatchInString(text, match.contents, | 440 AutocompleteMatch::ClassifyMatchInString(text, match.contents, |
441 ACMatchClassification::URL, | 441 ACMatchClassification::URL, |
442 &match.contents_class); | 442 &match.contents_class); |
443 } else { | 443 } else { |
444 AutocompleteMatch::ClassifyLocationInString( | 444 AutocompleteMatch::ClassifyLocationInString( |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 if (params->cancel_flag.IsSet()) | 514 if (params->cancel_flag.IsSet()) |
515 return; // Canceled in the middle of a query, give up. | 515 return; // Canceled in the middle of a query, give up. |
516 // We only need kMaxMatches results in the end, but before we | 516 // We only need kMaxMatches results in the end, but before we |
517 // get there we need to promote lower-quality matches that are | 517 // get there we need to promote lower-quality matches that are |
518 // prefixes of higher-quality matches, and remove lower-quality | 518 // prefixes of higher-quality matches, and remove lower-quality |
519 // redirects. So we ask for more results than we need, of every | 519 // redirects. So we ask for more results than we need, of every |
520 // prefix type, in hopes this will give us far more than enough | 520 // prefix type, in hopes this will give us far more than enough |
521 // to work with. CullRedirects() will then reduce the list to | 521 // to work with. CullRedirects() will then reduce the list to |
522 // the best kMaxMatches results. | 522 // the best kMaxMatches results. |
523 db->AutocompleteForPrefix( | 523 db->AutocompleteForPrefix( |
524 UTF16ToUTF8(i->prefix + params->input.text()), | 524 base::UTF16ToUTF8(i->prefix + params->input.text()), |
525 kMaxMatches * 2, | 525 kMaxMatches * 2, |
526 (backend == NULL), | 526 (backend == NULL), |
527 &url_matches); | 527 &url_matches); |
528 for (history::URLRows::const_iterator j(url_matches.begin()); | 528 for (history::URLRows::const_iterator j(url_matches.begin()); |
529 j != url_matches.end(); ++j) { | 529 j != url_matches.end(); ++j) { |
530 const URLPrefix* best_prefix = | 530 const URLPrefix* best_prefix = |
531 URLPrefix::BestURLPrefix(UTF8ToUTF16(j->url().spec()), | 531 URLPrefix::BestURLPrefix(base::UTF8ToUTF16(j->url().spec()), |
532 base::string16()); | 532 base::string16()); |
533 DCHECK(best_prefix != NULL); | 533 DCHECK(best_prefix != NULL); |
534 history_matches.push_back(history::HistoryMatch(*j, i->prefix.length(), | 534 history_matches.push_back(history::HistoryMatch(*j, i->prefix.length(), |
535 i->num_components == 0, | 535 i->num_components == 0, |
536 i->num_components >= best_prefix->num_components)); | 536 i->num_components >= best_prefix->num_components)); |
537 } | 537 } |
538 } | 538 } |
539 } | 539 } |
540 | 540 |
541 // Create sorted list of suggestions. | 541 // Create sorted list of suggestions. |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
836 history::URLDatabase* db, | 836 history::URLDatabase* db, |
837 const AutocompleteInput& input) const { | 837 const AutocompleteInput& input) const { |
838 // Normally passing the first two conditions below ought to guarantee the | 838 // Normally passing the first two conditions below ought to guarantee the |
839 // third condition, but because FixupUserInput() can run and modify the | 839 // third condition, but because FixupUserInput() can run and modify the |
840 // input's text and parts between Parse() and here, it seems better to be | 840 // input's text and parts between Parse() and here, it seems better to be |
841 // paranoid and check. | 841 // paranoid and check. |
842 if ((input.type() != AutocompleteInput::UNKNOWN) || | 842 if ((input.type() != AutocompleteInput::UNKNOWN) || |
843 !LowerCaseEqualsASCII(input.scheme(), content::kHttpScheme) || | 843 !LowerCaseEqualsASCII(input.scheme(), content::kHttpScheme) || |
844 !input.parts().host.is_nonempty()) | 844 !input.parts().host.is_nonempty()) |
845 return false; | 845 return false; |
846 const std::string host(UTF16ToUTF8( | 846 const std::string host(base::UTF16ToUTF8( |
847 input.text().substr(input.parts().host.begin, input.parts().host.len))); | 847 input.text().substr(input.parts().host.begin, input.parts().host.len))); |
848 const size_t registry_length = | 848 const size_t registry_length = |
849 net::registry_controlled_domains::GetRegistryLength( | 849 net::registry_controlled_domains::GetRegistryLength( |
850 host, | 850 host, |
851 net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES, | 851 net::registry_controlled_domains::EXCLUDE_UNKNOWN_REGISTRIES, |
852 net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); | 852 net::registry_controlled_domains::EXCLUDE_PRIVATE_REGISTRIES); |
853 return registry_length == 0 && db->IsTypedHost(host); | 853 return registry_length == 0 && db->IsTypedHost(host); |
854 } | 854 } |
855 | 855 |
856 bool HistoryURLProvider::PromoteMatchForInlineAutocomplete( | 856 bool HistoryURLProvider::PromoteMatchForInlineAutocomplete( |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1104 history::MatchTermInString(input_text, clean_description, 0))); | 1104 history::MatchTermInString(input_text, clean_description, 0))); |
1105 history::WordStarts description_word_starts; | 1105 history::WordStarts description_word_starts; |
1106 history::String16VectorFromString16( | 1106 history::String16VectorFromString16( |
1107 clean_description, false, &description_word_starts); | 1107 clean_description, false, &description_word_starts); |
1108 description_matches = | 1108 description_matches = |
1109 history::ScoredHistoryMatch::FilterTermMatchesByWordStarts( | 1109 history::ScoredHistoryMatch::FilterTermMatchesByWordStarts( |
1110 description_matches, description_word_starts, 0, std::string::npos); | 1110 description_matches, description_word_starts, 0, std::string::npos); |
1111 return SpansFromTermMatch( | 1111 return SpansFromTermMatch( |
1112 description_matches, clean_description.length(), false); | 1112 description_matches, clean_description.length(), false); |
1113 } | 1113 } |
OLD | NEW |