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

Unified Diff: chrome/browser/ui/omnibox/omnibox_edit_model.cc

Issue 1054803004: Allow entering keyword mode with space when there's inline autocompletion. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove pieces covered by other reviews Created 5 years, 8 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/omnibox/omnibox_edit_model.cc
diff --git a/chrome/browser/ui/omnibox/omnibox_edit_model.cc b/chrome/browser/ui/omnibox/omnibox_edit_model.cc
index 07bf79223be4616fa43130cd3150f59ebe2b5a3b..6bc5f55516575055c84c2d338df019116994df3d 100644
--- a/chrome/browser/ui/omnibox/omnibox_edit_model.cc
+++ b/chrome/browser/ui/omnibox/omnibox_edit_model.cc
@@ -902,16 +902,38 @@ bool OmniboxEditModel::AcceptKeyword(EnteredKeywordModeMethod entered_method) {
else
StartAutocomplete(false, true, true);
- // Ensure the current selection is saved before showing keyword mode
- // so that moving to another line and then reverting the text will restore
- // the current state properly.
- bool save_original_selection = !has_temporary_text_;
- has_temporary_text_ = true;
- const AutocompleteMatch& match = CurrentMatch(NULL);
- original_url_ = match.destination_url;
- view_->OnTemporaryTextMaybeChanged(
- DisplayTextFromUserText(match.fill_into_edit),
- save_original_selection, true);
+ // When entering keyword mode via tab, the new text to show is whatever the
+ // newly-selected match in the dropdown is. When entering via space, however,
+ // we should make sure to use the actual |user_text_| as the basis for the new
+ // text. This ensures that if the user types "<keyword><space>" and the
+ // default match would have inline autocompleted a further string (e.g.
+ // because there's a past multi-word search beginning with this keyword), the
+ // inline autocompletion doesn't get filled in as the keyword search query
+ // text.
+ //
+ // We also treat tabbing into keyword mode like tabbing through the popup in
+ // that we set |has_temporary_text_|, whereas pressing space is treated like
+ // a new keystroke that changes the current match instead of overlaying it
+ // with a temporary one. This is important because rerunning autocomplete
+ // after the user pressed space, which will have happened just before reaching
+ // here, may have generated a new match, which the user won't actually see and
+ // which we don't want to switch back to when existing keyword mode; see
+ // comments in ClearKeyword().
+ if (entered_method == ENTERED_KEYWORD_MODE_VIA_TAB) {
+ // Ensure the current selection is saved before showing keyword mode
+ // so that moving to another line and then reverting the text will restore
+ // the current state properly.
+ bool save_original_selection = !has_temporary_text_;
+ has_temporary_text_ = true;
+ const AutocompleteMatch& match = CurrentMatch(NULL);
+ original_url_ = match.destination_url;
+ view_->OnTemporaryTextMaybeChanged(
+ DisplayTextFromUserText(match.fill_into_edit),
+ save_original_selection, true);
+ } else {
+ view_->OnTemporaryTextMaybeChanged(DisplayTextFromUserText(user_text_),
+ false, true);
+ }
view_->UpdatePlaceholderText();
@@ -936,10 +958,25 @@ void OmniboxEditModel::ClearKeyword() {
const base::string16 window_text(keyword_ + view_->GetText());
- // Only reset the result if the edit text has changed since the
- // keyword was accepted, or if the popup is closed.
- if (!just_deleted_text_ && view_->GetText().empty() && popup_model() &&
- popup_model()->IsOpen()) {
+ // If we've tabbed into keyword mode and haven't done anything else,
+ // |has_temporary_text_| will be true, and we should just revert into keyword
+ // hint mode; otherwise we do a more complete state update/revert via
+ // OnBefore/AfterPossibleChange().
+ //
+ // If we were to do the "complete state revert" all the time, then in cases
+ // where our associated keyword match is in the middle of the popup instead of
+ // on the first line, tabbing into it and then hitting shift-tab would reset
+ // the entire popup contents, and we'd wind up with the first line selected.
+ //
+ // If we were instead to "just switch back to keyword hint mode" all the time,
+ // we could wind up with strange state in some cases. For example, if a user
+ // has a keyword named "x", an inline-autocompletable history site "xyz.com",
+ // and a lower-ranked inline-autocompletable search "x y", then typing "x"
+ // will inline autocomplete to "xyz.com", hitting space will toggle into
+ // keyword mode, but then hitting backspace might wind up with the default
+ // match as the "x y" search, due to the particulars of how we re-run
+ // autocomplete for "x " before toggling into keyword mode to begin with.
+ if (has_temporary_text_) {
is_keyword_hint_ = true;
view_->SetWindowTextAndCaretPos(window_text.c_str(), keyword_.length(),
false, true);
@@ -1412,7 +1449,6 @@ bool OmniboxEditModel::MaybeAcceptKeywordBySpace(
const base::string16& new_text) {
size_t keyword_length = new_text.length() - 1;
return (paste_state_ == NONE) && is_keyword_hint_ &&
- inline_autocomplete_text_.empty() &&
(keyword_.length() == keyword_length) &&
IsSpaceCharForAcceptingKeyword(new_text[keyword_length]) &&
!new_text.compare(0, keyword_length, keyword_, 0, keyword_length) &&
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698