Index: chrome/browser/autocomplete/autocomplete_edit.cc |
=================================================================== |
--- chrome/browser/autocomplete/autocomplete_edit.cc (revision 79782) |
+++ chrome/browser/autocomplete/autocomplete_edit.cc (working copy) |
@@ -77,6 +77,7 @@ |
paste_state_(NONE), |
control_key_state_(UP), |
is_keyword_hint_(false), |
+ result_frozen_(false), |
paste_and_go_transition_(PageTransition::TYPED), |
profile_(profile), |
update_instant_(true), |
@@ -542,13 +543,15 @@ |
update_instant_ = true; |
} |
-bool AutocompleteEditModel::AcceptKeyword() { |
+bool AutocompleteEditModel::AcceptKeyword(bool update_result) { |
DCHECK(is_keyword_hint_ && !keyword_.empty()); |
view_->OnBeforePossibleChange(); |
+ result_frozen_ = !update_result; |
view_->SetWindowTextAndCaretPos(string16(), 0); |
is_keyword_hint_ = false; |
view_->OnAfterPossibleChange(); |
+ result_frozen_ = false; |
just_deleted_text_ = false; // OnAfterPossibleChange() erroneously sets this |
// since the edit contents have disappeared. It |
// doesn't really matter, but we clear it to be |
@@ -631,7 +634,7 @@ |
InternalSetUserText(UserTextFromDisplayText(view_->GetText())); |
has_temporary_text_ = false; |
if (KeywordIsSelected()) |
- AcceptKeyword(); |
+ AcceptKeyword(true); |
} |
if ((old_state != DOWN_WITH_CHANGE) && popup_->IsOpen()) { |
// Autocomplete history provider results may change, so refresh the |
@@ -674,6 +677,7 @@ |
GURL* destination_for_temporary_text_change, |
const string16& keyword, |
bool is_keyword_hint) { |
+ |
Peter Kasting
2011/04/01 00:09:09
Nit: Don't add a blank line
|
// Update keyword/hint-related local state. |
bool keyword_state_changed = (keyword_ != keyword) || |
((is_keyword_hint_ != is_keyword_hint) && !keyword.empty()); |
@@ -681,6 +685,21 @@ |
keyword_ = keyword; |
is_keyword_hint_ = is_keyword_hint; |
+ // If the current result has a duplicate keyword with a |
+ // more relevant result, don't show a hint. |
+ if (is_keyword_hint && popup_->selected_line() >= 1) { |
+ const AutocompleteResult& result = this->result(); |
+ const AutocompleteResult::const_iterator match(result.begin() + |
+ popup_->selected_line()); |
+ const AutocompleteResult::const_iterator found = |
Peter Kasting
2011/04/01 00:09:09
Nit: It's probably simpler overall to eliminate th
|
+ std::search(result.begin(), match, match, match + 1, |
+ AutocompleteMatch::KeywordsEqual); |
+ if (found != match) { |
+ is_keyword_hint_ = false; |
+ keyword_.clear(); |
+ } |
+ } |
+ |
// |is_keyword_hint_| should always be false if |keyword_| is empty. |
DCHECK(!keyword_.empty() || !is_keyword_hint_); |
} |
@@ -775,7 +794,8 @@ |
just_deleted_text_ = just_deleted_text; |
} |
- view_->UpdatePopup(); |
+ if (!result_frozen_) |
+ view_->UpdatePopup(); |
// Change to keyword mode if the user has typed a keyword name and is now |
// pressing space after the name. Accepting the keyword will update our |
@@ -952,7 +972,7 @@ |
(old_user_text.length() + 1 >= new_user_text.length()) && |
!new_user_text.compare(0, new_user_text.length() - 1, old_user_text, |
0, new_user_text.length() - 1) && |
- AcceptKeyword(); |
+ AcceptKeyword(true); |
} |
// static |