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

Side by Side Diff: components/omnibox/browser/omnibox_edit_model.cc

Issue 1855423003: Interpret '?' and Ctrl-K or Ctrl-E as putting omnibox in keyword search mode for Default Search Pro… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removed forced queries using '?'. Removed Ctrl-K preserving the user's keyword if they're already … Created 4 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 unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 "components/omnibox/browser/omnibox_edit_model.h" 5 #include "components/omnibox/browser/omnibox_edit_model.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 } // namespace 142 } // namespace
143 143
144 144
145 // OmniboxEditModel::State ---------------------------------------------------- 145 // OmniboxEditModel::State ----------------------------------------------------
146 146
147 OmniboxEditModel::State::State(bool user_input_in_progress, 147 OmniboxEditModel::State::State(bool user_input_in_progress,
148 const base::string16& user_text, 148 const base::string16& user_text,
149 const base::string16& gray_text, 149 const base::string16& gray_text,
150 const base::string16& keyword, 150 const base::string16& keyword,
151 bool is_keyword_hint, 151 bool is_keyword_hint,
152 EnteredKeywordModeMethod keyword_entered_method,
152 bool url_replacement_enabled, 153 bool url_replacement_enabled,
153 OmniboxFocusState focus_state, 154 OmniboxFocusState focus_state,
154 FocusSource focus_source, 155 FocusSource focus_source,
155 const AutocompleteInput& autocomplete_input) 156 const AutocompleteInput& autocomplete_input)
156 : user_input_in_progress(user_input_in_progress), 157 : user_input_in_progress(user_input_in_progress),
157 user_text(user_text), 158 user_text(user_text),
158 gray_text(gray_text), 159 gray_text(gray_text),
159 keyword(keyword), 160 keyword(keyword),
160 is_keyword_hint(is_keyword_hint), 161 is_keyword_hint(is_keyword_hint),
162 keyword_entered_method(keyword_entered_method),
161 url_replacement_enabled(url_replacement_enabled), 163 url_replacement_enabled(url_replacement_enabled),
162 focus_state(focus_state), 164 focus_state(focus_state),
163 focus_source(focus_source), 165 focus_source(focus_source),
164 autocomplete_input(autocomplete_input) { 166 autocomplete_input(autocomplete_input) {
165 } 167 }
166 168
167 OmniboxEditModel::State::State(const State& other) = default; 169 OmniboxEditModel::State::State(const State& other) = default;
168 170
169 OmniboxEditModel::State::~State() { 171 OmniboxEditModel::State::~State() {
170 } 172 }
171 173
172 174
173 // OmniboxEditModel ----------------------------------------------------------- 175 // OmniboxEditModel -----------------------------------------------------------
174 176
175 OmniboxEditModel::OmniboxEditModel(OmniboxView* view, 177 OmniboxEditModel::OmniboxEditModel(OmniboxView* view,
176 OmniboxEditController* controller, 178 OmniboxEditController* controller,
177 scoped_ptr<OmniboxClient> client) 179 scoped_ptr<OmniboxClient> client)
178 : client_(std::move(client)), 180 : client_(std::move(client)),
179 view_(view), 181 view_(view),
180 controller_(controller), 182 controller_(controller),
181 focus_state_(OMNIBOX_FOCUS_NONE), 183 focus_state_(OMNIBOX_FOCUS_NONE),
182 focus_source_(INVALID), 184 focus_source_(INVALID),
183 user_input_in_progress_(false), 185 user_input_in_progress_(false),
184 user_input_since_focus_(true), 186 user_input_since_focus_(true),
185 just_deleted_text_(false), 187 just_deleted_text_(false),
188 just_cleared_keyword_(false),
186 has_temporary_text_(false), 189 has_temporary_text_(false),
187 paste_state_(NONE), 190 paste_state_(NONE),
188 control_key_state_(UP), 191 control_key_state_(UP),
189 is_keyword_hint_(false), 192 is_keyword_hint_(false),
190 in_revert_(false), 193 in_revert_(false),
191 allow_exact_keyword_match_(false) { 194 allow_exact_keyword_match_(false) {
192 omnibox_controller_.reset(new OmniboxController(this, client_.get())); 195 omnibox_controller_.reset(new OmniboxController(this, client_.get()));
193 } 196 }
194 197
195 OmniboxEditModel::~OmniboxEditModel() { 198 OmniboxEditModel::~OmniboxEditModel() {
(...skipping 14 matching lines...) Expand all
210 view_->SelectAll(true); 213 view_->SelectAll(true);
211 } else { 214 } else {
212 InternalSetUserText(user_text); 215 InternalSetUserText(user_text);
213 } 216 }
214 } 217 }
215 218
216 UMA_HISTOGRAM_BOOLEAN("Omnibox.SaveStateForTabSwitch.UserInputInProgress", 219 UMA_HISTOGRAM_BOOLEAN("Omnibox.SaveStateForTabSwitch.UserInputInProgress",
217 user_input_in_progress_); 220 user_input_in_progress_);
218 return State( 221 return State(
219 user_input_in_progress_, user_text_, view_->GetGrayTextAutocompletion(), 222 user_input_in_progress_, user_text_, view_->GetGrayTextAutocompletion(),
220 keyword_, is_keyword_hint_, 223 keyword_, is_keyword_hint_, keyword_entered_method_,
221 controller_->GetToolbarModel()->url_replacement_enabled(), 224 controller_->GetToolbarModel()->url_replacement_enabled(),
222 focus_state_, focus_source_, input_); 225 focus_state_, focus_source_, input_);
223 } 226 }
224 227
225 void OmniboxEditModel::RestoreState(const State* state) { 228 void OmniboxEditModel::RestoreState(const State* state) {
226 // We need to update the permanent text correctly and revert the view 229 // We need to update the permanent text correctly and revert the view
227 // regardless of whether there is saved state. 230 // regardless of whether there is saved state.
228 bool url_replacement_enabled = !state || state->url_replacement_enabled; 231 bool url_replacement_enabled = !state || state->url_replacement_enabled;
229 controller_->GetToolbarModel()->set_url_replacement_enabled( 232 controller_->GetToolbarModel()->set_url_replacement_enabled(
230 url_replacement_enabled); 233 url_replacement_enabled);
231 permanent_text_ = controller_->GetToolbarModel()->GetText(); 234 permanent_text_ = controller_->GetToolbarModel()->GetText();
232 // Don't muck with the search term replacement state, as we've just set it 235 // Don't muck with the search term replacement state, as we've just set it
233 // correctly. 236 // correctly.
234 view_->RevertWithoutResettingSearchTermReplacement(); 237 view_->RevertWithoutResettingSearchTermReplacement();
235 // Restore the autocomplete controller's input, or clear it if this is a new 238 // Restore the autocomplete controller's input, or clear it if this is a new
236 // tab. 239 // tab.
237 input_ = state ? state->autocomplete_input : AutocompleteInput(); 240 input_ = state ? state->autocomplete_input : AutocompleteInput();
238 if (!state) 241 if (!state)
239 return; 242 return;
240 243
241 SetFocusState(state->focus_state, OMNIBOX_FOCUS_CHANGE_TAB_SWITCH); 244 SetFocusState(state->focus_state, OMNIBOX_FOCUS_CHANGE_TAB_SWITCH);
242 focus_source_ = state->focus_source; 245 focus_source_ = state->focus_source;
243 // Restore any user editing. 246 // Restore any user editing.
244 if (state->user_input_in_progress) { 247 if (state->user_input_in_progress) {
245 // NOTE: Be sure and set keyword-related state BEFORE invoking 248 // NOTE: Be sure and set keyword-related state BEFORE invoking
246 // DisplayTextFromUserText(), as its result depends upon this state. 249 // DisplayTextFromUserText(), as its result depends upon this state.
247 keyword_ = state->keyword; 250 keyword_ = state->keyword;
248 is_keyword_hint_ = state->is_keyword_hint; 251 is_keyword_hint_ = state->is_keyword_hint;
252 keyword_entered_method_ = state->keyword_entered_method;
249 view_->SetUserText(state->user_text, 253 view_->SetUserText(state->user_text,
250 DisplayTextFromUserText(state->user_text), false); 254 DisplayTextFromUserText(state->user_text), false);
251 view_->SetGrayTextAutocompletion(state->gray_text); 255 view_->SetGrayTextAutocompletion(state->gray_text);
252 } 256 }
253 } 257 }
254 258
255 AutocompleteMatch OmniboxEditModel::CurrentMatch( 259 AutocompleteMatch OmniboxEditModel::CurrentMatch(
256 GURL* alternate_nav_url) const { 260 GURL* alternate_nav_url) const {
257 // If we have a valid match use it. Otherwise get one for the current text. 261 // If we have a valid match use it. Otherwise get one for the current text.
258 AutocompleteMatch match = omnibox_controller_->current_match(); 262 AutocompleteMatch match = omnibox_controller_->current_match();
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 325
322 const base::string16 final_text = view_->GetText() + suggestion; 326 const base::string16 final_text = view_->GetText() + suggestion;
323 view_->OnBeforePossibleChange(); 327 view_->OnBeforePossibleChange();
324 view_->SetWindowTextAndCaretPos(final_text, final_text.length(), false, 328 view_->SetWindowTextAndCaretPos(final_text, final_text.length(), false,
325 false); 329 false);
326 view_->OnAfterPossibleChange(true); 330 view_->OnAfterPossibleChange(true);
327 return true; 331 return true;
328 } 332 }
329 333
330 void OmniboxEditModel::OnChanged() { 334 void OmniboxEditModel::OnChanged() {
335 // If the user input a "?", put them into keyword mode.
336 if (!just_cleared_keyword_ && !just_deleted_text_ &&
337 user_text_ == base::ASCIIToUTF16("?")) {
Peter Kasting 2016/04/13 02:52:16 It doesn't seem like this handles the case of inse
Tom (Use chromium acct) 2016/04/13 23:37:40 It does not. However, it would be a bit complex t
Peter Kasting 2016/04/15 00:58:55 I think so -- if you prefix some existing text wit
338 user_text_ = base::string16();
339 EnterKeywordModeForDefaultSearchProvider(
340 ENTERED_KEYWORD_MODE_VIA_QUESTION_MARK);
341 }
342
331 // Hide any suggestions we might be showing. 343 // Hide any suggestions we might be showing.
332 view_->SetGrayTextAutocompletion(base::string16()); 344 view_->SetGrayTextAutocompletion(base::string16());
333 345
334 // Don't call CurrentMatch() when there's no editing, as in this case we'll 346 // Don't call CurrentMatch() when there's no editing, as in this case we'll
335 // never actually use it. This avoids running the autocomplete providers (and 347 // never actually use it. This avoids running the autocomplete providers (and
336 // any systems they then spin up) during startup. 348 // any systems they then spin up) during startup.
337 const AutocompleteMatch& current_match = user_input_in_progress_ ? 349 const AutocompleteMatch& current_match = user_input_in_progress_ ?
338 CurrentMatch(NULL) : AutocompleteMatch(); 350 CurrentMatch(NULL) : AutocompleteMatch();
339 351
340 client_->OnTextChanged(current_match, user_input_in_progress_, user_text_, 352 client_->OnTextChanged(current_match, user_input_in_progress_, user_text_,
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
618 match.transition = ui::PAGE_TRANSITION_LINK; 630 match.transition = ui::PAGE_TRANSITION_LINK;
619 } 631 }
620 632
621 client_->OnInputAccepted(match); 633 client_->OnInputAccepted(match);
622 634
623 DCHECK(popup_model()); 635 DCHECK(popup_model());
624 view_->OpenMatch(match, disposition, alternate_nav_url, base::string16(), 636 view_->OpenMatch(match, disposition, alternate_nav_url, base::string16(),
625 popup_model()->selected_line()); 637 popup_model()->selected_line());
626 } 638 }
627 639
640 void OmniboxEditModel::EnterKeywordModeForDefaultSearchProvider(
641 EnteredKeywordModeMethod keyword_entered_method) {
642 autocomplete_controller()->Stop(false);
643
644 base::string16 query = DisplayTextFromUserText(user_text_);
645 keyword_ = client_->GetTemplateURLService()->
646 GetDefaultSearchProvider()->keyword();
647 is_keyword_hint_ = false;
648 keyword_entered_method_ = keyword_entered_method;
649 InternalSetUserText(keyword_ + base::ASCIIToUTF16(" ") + query);
650
651 view_->OnTemporaryTextMaybeChanged(user_text_, false, true);
652 StartAutocomplete(false, false, true);
653
654 UMA_HISTOGRAM_ENUMERATION(kEnteredKeywordModeHistogram,
655 keyword_entered_method,
656 ENTERED_KEYWORD_MODE_NUM_ITEMS);
657 }
658
628 void OmniboxEditModel::OpenMatch(AutocompleteMatch match, 659 void OmniboxEditModel::OpenMatch(AutocompleteMatch match,
629 WindowOpenDisposition disposition, 660 WindowOpenDisposition disposition,
630 const GURL& alternate_nav_url, 661 const GURL& alternate_nav_url,
631 const base::string16& pasted_text, 662 const base::string16& pasted_text,
632 size_t index) { 663 size_t index) {
633 const base::TimeTicks& now(base::TimeTicks::Now()); 664 const base::TimeTicks& now(base::TimeTicks::Now());
634 base::TimeDelta elapsed_time_since_user_first_modified_omnibox( 665 base::TimeDelta elapsed_time_since_user_first_modified_omnibox(
635 now - time_user_first_modified_omnibox_); 666 now - time_user_first_modified_omnibox_);
636 autocomplete_controller()->UpdateMatchDestinationURLWithQueryFormulationTime( 667 autocomplete_controller()->UpdateMatchDestinationURLWithQueryFormulationTime(
637 elapsed_time_since_user_first_modified_omnibox, &match); 668 elapsed_time_since_user_first_modified_omnibox, &match);
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
781 BookmarkModel* bookmark_model = client_->GetBookmarkModel(); 812 BookmarkModel* bookmark_model = client_->GetBookmarkModel();
782 if (bookmark_model && bookmark_model->IsBookmarked(match.destination_url)) 813 if (bookmark_model && bookmark_model->IsBookmarked(match.destination_url))
783 client_->OnBookmarkLaunched(); 814 client_->OnBookmarkLaunched();
784 } 815 }
785 816
786 bool OmniboxEditModel::AcceptKeyword(EnteredKeywordModeMethod entered_method) { 817 bool OmniboxEditModel::AcceptKeyword(EnteredKeywordModeMethod entered_method) {
787 DCHECK(is_keyword_hint_ && !keyword_.empty()); 818 DCHECK(is_keyword_hint_ && !keyword_.empty());
788 819
789 autocomplete_controller()->Stop(false); 820 autocomplete_controller()->Stop(false);
790 is_keyword_hint_ = false; 821 is_keyword_hint_ = false;
822 keyword_entered_method_ = entered_method;
791 823
792 if (popup_model() && popup_model()->IsOpen()) 824 if (popup_model() && popup_model()->IsOpen())
793 popup_model()->SetSelectedLineState(OmniboxPopupModel::KEYWORD); 825 popup_model()->SetSelectedLineState(OmniboxPopupModel::KEYWORD);
794 else 826 else
795 StartAutocomplete(false, true, true); 827 StartAutocomplete(false, true, true);
796 828
797 // When entering keyword mode via tab, the new text to show is whatever the 829 // When entering keyword mode via tab, the new text to show is whatever the
798 // newly-selected match in the dropdown is. When entering via space, however, 830 // newly-selected match in the dropdown is. When entering via space, however,
799 // we should make sure to use the actual |user_text_| as the basis for the new 831 // we should make sure to use the actual |user_text_| as the basis for the new
800 // text. This ensures that if the user types "<keyword><space>" and the 832 // text. This ensures that if the user types "<keyword><space>" and the
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
837 void OmniboxEditModel::AcceptTemporaryTextAsUserText() { 869 void OmniboxEditModel::AcceptTemporaryTextAsUserText() {
838 InternalSetUserText(UserTextFromDisplayText(view_->GetText())); 870 InternalSetUserText(UserTextFromDisplayText(view_->GetText()));
839 has_temporary_text_ = false; 871 has_temporary_text_ = false;
840 872
841 if (user_input_in_progress_ || !in_revert_) 873 if (user_input_in_progress_ || !in_revert_)
842 client_->OnInputStateChanged(); 874 client_->OnInputStateChanged();
843 } 875 }
844 876
845 void OmniboxEditModel::ClearKeyword() { 877 void OmniboxEditModel::ClearKeyword() {
846 autocomplete_controller()->Stop(false); 878 autocomplete_controller()->Stop(false);
879 just_cleared_keyword_ = true;
Peter Kasting 2016/04/13 02:52:16 Nit: Use base::AutoReset here to ensure you set th
Tom (Use chromium acct) 2016/04/13 23:37:41 Not broken. Added base::AutoReset for now. On a s
847 880
848 // While we're always in keyword mode upon reaching here, sometimes we've just 881 // While we're always in keyword mode upon reaching here, sometimes we've just
849 // toggled in via space or tab, and sometimes we're on a non-toggled line 882 // toggled in via space or tab, and sometimes we're on a non-toggled line
850 // (usually because the user has typed a search string). Keep track of the 883 // (usually because the user has typed a search string). Keep track of the
851 // difference, as we'll need it below. 884 // difference, as we'll need it below.
852 bool was_toggled_into_keyword_mode = 885 bool was_toggled_into_keyword_mode =
853 popup_model()->selected_line_state() == OmniboxPopupModel::KEYWORD; 886 popup_model()->selected_line_state() == OmniboxPopupModel::KEYWORD;
854 887
855 omnibox_controller_->ClearPopupKeywordMode(); 888 omnibox_controller_->ClearPopupKeywordMode();
856 889
890 // If we entered keyword mode in a special way like using a keyboard shortcut
891 // or typing a question mark in a blank omnibox, don't restore the keyword.
Peter Kasting 2016/04/13 02:52:16 Nit: "... Instead, restore the question mark iff t
Tom (Use chromium acct) 2016/04/13 23:37:41 Done.
892 if (keyword_entered_method_ == ENTERED_KEYWORD_MODE_VIA_KEYBOARD_SHORTCUT ||
893 keyword_entered_method_ == ENTERED_KEYWORD_MODE_VIA_QUESTION_MARK) {
894 view_->OnBeforePossibleChange();
Peter Kasting 2016/04/13 02:52:16 Nit: This function body is basically identical to
Tom (Use chromium acct) 2016/04/13 23:37:40 Done.
895 if (keyword_entered_method_ == ENTERED_KEYWORD_MODE_VIA_QUESTION_MARK)
Peter Kasting 2016/04/13 02:52:16 Nit: Needs {}
Tom (Use chromium acct) 2016/04/13 23:37:41 Done.
896 view_->SetWindowTextAndCaretPos(
897 base::ASCIIToUTF16("?") + view_->GetText(), 1, false, false);
898 else
899 view_->SetWindowTextAndCaretPos(view_->GetText(), 0, false, false);
900 keyword_.clear();
901 is_keyword_hint_ = false;
902 view_->OnAfterPossibleChange(false);
903 just_cleared_keyword_ = false;
904 return;
905 }
906
857 // There are several possible states we could have been in before the user hit 907 // There are several possible states we could have been in before the user hit
858 // backspace or shift-tab to enter this function: 908 // backspace or shift-tab to enter this function:
859 // (1) was_toggled_into_keyword_mode == false, has_temporary_text_ == false 909 // (1) was_toggled_into_keyword_mode == false, has_temporary_text_ == false
860 // The user typed a further key after being in keyword mode already, e.g. 910 // The user typed a further key after being in keyword mode already, e.g.
861 // "google.com f". 911 // "google.com f".
862 // (2) was_toggled_into_keyword_mode == false, has_temporary_text_ == true 912 // (2) was_toggled_into_keyword_mode == false, has_temporary_text_ == true
863 // The user tabbed away from a dropdown entry in keyword mode, then tabbed 913 // The user tabbed away from a dropdown entry in keyword mode, then tabbed
864 // back to it, e.g. "google.com f<tab><shift-tab>". 914 // back to it, e.g. "google.com f<tab><shift-tab>".
865 // (3) was_toggled_into_keyword_mode == true, has_temporary_text_ == false 915 // (3) was_toggled_into_keyword_mode == true, has_temporary_text_ == false
866 // The user had just typed space to enter keyword mode, e.g. 916 // The user had just typed space to enter keyword mode, e.g.
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
914 // the user wants it, it's more work to add because typing the space will 964 // the user wants it, it's more work to add because typing the space will
915 // enter keyword mode, which then the user would have to leave again. 965 // enter keyword mode, which then the user would have to leave again.
916 const base::string16 window_text = 966 const base::string16 window_text =
917 keyword_ + base::ASCIIToUTF16(" ") + view_->GetText(); 967 keyword_ + base::ASCIIToUTF16(" ") + view_->GetText();
918 view_->SetWindowTextAndCaretPos(window_text.c_str(), keyword_.length() + 1, 968 view_->SetWindowTextAndCaretPos(window_text.c_str(), keyword_.length() + 1,
919 false, false); 969 false, false);
920 keyword_.clear(); 970 keyword_.clear();
921 is_keyword_hint_ = false; 971 is_keyword_hint_ = false;
922 view_->OnAfterPossibleChange(false); 972 view_->OnAfterPossibleChange(false);
923 } 973 }
974 just_cleared_keyword_ = false;
924 } 975 }
925 976
926 void OmniboxEditModel::OnSetFocus(bool control_down) { 977 void OmniboxEditModel::OnSetFocus(bool control_down) {
927 last_omnibox_focus_ = base::TimeTicks::Now(); 978 last_omnibox_focus_ = base::TimeTicks::Now();
928 user_input_since_focus_ = false; 979 user_input_since_focus_ = false;
929 980
930 // If the omnibox lost focus while the caret was hidden and then regained 981 // If the omnibox lost focus while the caret was hidden and then regained
931 // focus, OnSetFocus() is called and should restore visibility. Note that 982 // focus, OnSetFocus() is called and should restore visibility. Note that
932 // focus can be regained without an accompanying call to 983 // focus can be regained without an accompanying call to
933 // OmniboxView::SetFocus(), e.g. by tabbing in. 984 // OmniboxView::SetFocus(), e.g. by tabbing in.
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1148 if (call_controller_onchanged) 1199 if (call_controller_onchanged)
1149 OnChanged(); 1200 OnChanged();
1150 } 1201 }
1151 1202
1152 bool OmniboxEditModel::OnAfterPossibleChange(const base::string16& old_text, 1203 bool OmniboxEditModel::OnAfterPossibleChange(const base::string16& old_text,
1153 const base::string16& new_text, 1204 const base::string16& new_text,
1154 size_t selection_start, 1205 size_t selection_start,
1155 size_t selection_end, 1206 size_t selection_end,
1156 bool selection_differs, 1207 bool selection_differs,
1157 bool text_differs, 1208 bool text_differs,
1209 bool keyword_differs,
1158 bool just_deleted_text, 1210 bool just_deleted_text,
1159 bool allow_keyword_ui_change) { 1211 bool allow_keyword_ui_change) {
1160 // Update the paste state as appropriate: if we're just finishing a paste 1212 // Update the paste state as appropriate: if we're just finishing a paste
1161 // that replaced all the text, preserve that information; otherwise, if we've 1213 // that replaced all the text, preserve that information; otherwise, if we've
1162 // made some other edit, clear paste tracking. 1214 // made some other edit, clear paste tracking.
1163 if (paste_state_ == PASTING) 1215 if (paste_state_ == PASTING)
1164 paste_state_ = PASTED; 1216 paste_state_ = PASTED;
1165 else if (text_differs) 1217 else if (text_differs)
1166 paste_state_ = NONE; 1218 paste_state_ = NONE;
1167 1219
(...skipping 19 matching lines...) Expand all
1187 const bool user_text_changed = 1239 const bool user_text_changed =
1188 text_differs || (selection_differs && !inline_autocomplete_text_.empty()); 1240 text_differs || (selection_differs && !inline_autocomplete_text_.empty());
1189 1241
1190 // If something has changed while the control key is down, prevent 1242 // If something has changed while the control key is down, prevent
1191 // "ctrl-enter" until the control key is released. 1243 // "ctrl-enter" until the control key is released.
1192 if ((text_differs || selection_differs) && 1244 if ((text_differs || selection_differs) &&
1193 (control_key_state_ == DOWN_WITHOUT_CHANGE)) 1245 (control_key_state_ == DOWN_WITHOUT_CHANGE))
1194 control_key_state_ = DOWN_WITH_CHANGE; 1246 control_key_state_ = DOWN_WITH_CHANGE;
1195 1247
1196 if (!user_text_changed) 1248 if (!user_text_changed)
1197 return false; 1249 return keyword_differs;
1198 1250
1199 // If the user text has not changed, we do not want to change the model's 1251 // If the user text has not changed, we do not want to change the model's
1200 // state associated with the text. Otherwise, we can get surprising behavior 1252 // state associated with the text. Otherwise, we can get surprising behavior
1201 // where the autocompleted text unexpectedly reappears, e.g. crbug.com/55983 1253 // where the autocompleted text unexpectedly reappears, e.g. crbug.com/55983
1202 InternalSetUserText(UserTextFromDisplayText(new_text)); 1254 InternalSetUserText(UserTextFromDisplayText(new_text));
1203 has_temporary_text_ = false; 1255 has_temporary_text_ = false;
1204 1256
1205 // Track when the user has deleted text so we won't allow inline 1257 // Track when the user has deleted text so we won't allow inline
1206 // autocomplete. 1258 // autocomplete.
1207 just_deleted_text_ = just_deleted_text; 1259 just_deleted_text_ = just_deleted_text;
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
1463 // Update state and notify view if the omnibox has focus and the caret 1515 // Update state and notify view if the omnibox has focus and the caret
1464 // visibility changed. 1516 // visibility changed.
1465 const bool was_caret_visible = is_caret_visible(); 1517 const bool was_caret_visible = is_caret_visible();
1466 focus_state_ = state; 1518 focus_state_ = state;
1467 if (focus_state_ != OMNIBOX_FOCUS_NONE && 1519 if (focus_state_ != OMNIBOX_FOCUS_NONE &&
1468 is_caret_visible() != was_caret_visible) 1520 is_caret_visible() != was_caret_visible)
1469 view_->ApplyCaretVisibility(); 1521 view_->ApplyCaretVisibility();
1470 1522
1471 client_->OnFocusChanged(focus_state_, reason); 1523 client_->OnFocusChanged(focus_state_, reason);
1472 } 1524 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698