Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(46)

Side by Side Diff: chrome/browser/autocomplete/history_url_provider.cc

Issue 7822009: Fix crash in CanFindIntranetURL() due to FixupUserInput() changing the AutocompleteInput's text_ ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 516 matching lines...) Expand 10 before | Expand all | Expand 10 after
527 } 527 }
528 scoped_ptr<HistoryURLProviderParams> params( 528 scoped_ptr<HistoryURLProviderParams> params(
529 new HistoryURLProviderParams(input, trim_http, languages)); 529 new HistoryURLProviderParams(input, trim_http, languages));
530 530
531 params->prevent_inline_autocomplete = 531 params->prevent_inline_autocomplete =
532 PreventInlineAutocomplete(input); 532 PreventInlineAutocomplete(input);
533 533
534 if (fixup_input_and_run_pass_1) { 534 if (fixup_input_and_run_pass_1) {
535 // Do some fixup on the user input before matching against it, so we provide 535 // Do some fixup on the user input before matching against it, so we provide
536 // good results for local file paths, input with spaces, etc. 536 // good results for local file paths, input with spaces, etc.
537 // NOTE: This purposefully doesn't take input.desired_tld() into account; if 537 if (!FixupUserInput(&params->input))
538 // it did, then holding "ctrl" would change all the results from the
539 // HistoryURLProvider provider, not just the What You Typed Result.
540 const string16 fixed_text(FixupUserInput(input));
541 if (fixed_text.empty()) {
542 // Conceivably fixup could result in an empty string (although I don't
543 // have cases where this happens offhand). We can't do anything with
544 // empty input, so just bail; otherwise we'd crash later.
545 return; 538 return;
546 }
547 params->input.set_text(fixed_text);
548 539
549 // Pass 1: Get the in-memory URL database, and use it to find and promote 540 // Pass 1: Get the in-memory URL database, and use it to find and promote
550 // the inline autocomplete match, if any. 541 // the inline autocomplete match, if any.
551 history::URLDatabase* url_db = history_service->InMemoryDatabase(); 542 history::URLDatabase* url_db = history_service->InMemoryDatabase();
552 // url_db can be NULL if it hasn't finished initializing (or failed to 543 // url_db can be NULL if it hasn't finished initializing (or failed to
553 // initialize). In this case all we can do is fall back on the second 544 // initialize). In this case all we can do is fall back on the second
554 // pass. 545 // pass.
555 // 546 //
556 // TODO(pkasting): We should just block here until this loads. Any time 547 // TODO(pkasting): We should just block here until this loads. Any time
557 // someone unloads the history backend, we'll get inconsistent inline 548 // someone unloads the history backend, we'll get inconsistent inline
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 match->relevance = CalculateRelevance(input.type(), type, 0); 709 match->relevance = CalculateRelevance(input.type(), type, 0);
719 710
720 // Put it on the front of the HistoryMatches for redirect culling. 711 // Put it on the front of the HistoryMatches for redirect culling.
721 EnsureMatchPresent(info, string16::npos, false, matches, true); 712 EnsureMatchPresent(info, string16::npos, false, matches, true);
722 return true; 713 return true;
723 } 714 }
724 715
725 bool HistoryURLProvider::CanFindIntranetURL( 716 bool HistoryURLProvider::CanFindIntranetURL(
726 history::URLDatabase* db, 717 history::URLDatabase* db,
727 const AutocompleteInput& input) const { 718 const AutocompleteInput& input) const {
719 // Normally passing the first two conditions below ought to guarantee the
720 // third condition, but because FixupUserInput() can run and modify the
721 // input's text and parts between Parse() and here, it seems better to be
722 // paranoid and check.
728 if ((input.type() != AutocompleteInput::UNKNOWN) || 723 if ((input.type() != AutocompleteInput::UNKNOWN) ||
729 !LowerCaseEqualsASCII(input.scheme(), chrome::kHttpScheme)) 724 !LowerCaseEqualsASCII(input.scheme(), chrome::kHttpScheme) ||
725 !input.parts().host.is_nonempty())
730 return false; 726 return false;
731 DCHECK(input.parts().host.is_nonempty());
732 const string16 host(input.text().substr(input.parts().host.begin, 727 const string16 host(input.text().substr(input.parts().host.begin,
733 input.parts().host.len)); 728 input.parts().host.len));
734 if (net::RegistryControlledDomainService::GetRegistryLength( 729 if (net::RegistryControlledDomainService::GetRegistryLength(
735 UTF16ToUTF8(host), false) != 0) 730 UTF16ToUTF8(host), false) != 0)
736 return false; 731 return false;
737 std::vector<history::URLRow> dummy; 732 std::vector<history::URLRow> dummy;
738 for (history::Prefixes::const_iterator i(prefixes_.begin()); 733 for (history::Prefixes::const_iterator i(prefixes_.begin());
739 i != prefixes_.end(); ++i) { 734 i != prefixes_.end(); ++i) {
740 if ((i->num_components == 1) && 735 if ((i->num_components == 1) &&
741 (db->AutocompleteForPrefix(i->prefix + host + ASCIIToUTF16("/"), 1, 736 (db->AutocompleteForPrefix(i->prefix + host + ASCIIToUTF16("/"), 1,
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
924 &match.contents_class); 919 &match.contents_class);
925 } 920 }
926 match.description = info.title(); 921 match.description = info.title();
927 AutocompleteMatch::ClassifyMatchInString(params->input.text(), 922 AutocompleteMatch::ClassifyMatchInString(params->input.text(),
928 info.title(), 923 info.title(),
929 ACMatchClassification::NONE, 924 ACMatchClassification::NONE,
930 &match.description_class); 925 &match.description_class);
931 926
932 return match; 927 return match;
933 } 928 }
OLDNEW
« no previous file with comments | « chrome/browser/autocomplete/history_quick_provider.cc ('k') | chrome/browser/autocomplete/history_url_provider_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698