Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "chrome/browser/ui/omnibox/omnibox_edit_model.h" | 5 #include "chrome/browser/ui/omnibox/omnibox_edit_model.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/auto_reset.h" | 9 #include "base/auto_reset.h" |
| 10 #include "base/format_macros.h" | 10 #include "base/format_macros.h" |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 135 } // namespace | 135 } // namespace |
| 136 | 136 |
| 137 /////////////////////////////////////////////////////////////////////////////// | 137 /////////////////////////////////////////////////////////////////////////////// |
| 138 // OmniboxEditModel::State | 138 // OmniboxEditModel::State |
| 139 | 139 |
| 140 OmniboxEditModel::State::State(bool user_input_in_progress, | 140 OmniboxEditModel::State::State(bool user_input_in_progress, |
| 141 const string16& user_text, | 141 const string16& user_text, |
| 142 const string16& gray_text, | 142 const string16& gray_text, |
| 143 const string16& keyword, | 143 const string16& keyword, |
| 144 bool is_keyword_hint, | 144 bool is_keyword_hint, |
| 145 OmniboxFocusState focus_state) | 145 OmniboxFocusState focus_state, |
| 146 OmniboxFocusState focus_state_for_input) | |
| 146 : user_input_in_progress(user_input_in_progress), | 147 : user_input_in_progress(user_input_in_progress), |
| 147 user_text(user_text), | 148 user_text(user_text), |
| 148 gray_text(gray_text), | 149 gray_text(gray_text), |
| 149 keyword(keyword), | 150 keyword(keyword), |
| 150 is_keyword_hint(is_keyword_hint), | 151 is_keyword_hint(is_keyword_hint), |
| 151 focus_state(focus_state) { | 152 focus_state(focus_state), |
| 153 focus_state_for_input(focus_state_for_input) { | |
| 152 } | 154 } |
| 153 | 155 |
| 154 OmniboxEditModel::State::~State() { | 156 OmniboxEditModel::State::~State() { |
| 155 } | 157 } |
| 156 | 158 |
| 157 /////////////////////////////////////////////////////////////////////////////// | 159 /////////////////////////////////////////////////////////////////////////////// |
| 158 // OmniboxEditModel | 160 // OmniboxEditModel |
| 159 | 161 |
| 160 OmniboxEditModel::OmniboxEditModel(OmniboxView* view, | 162 OmniboxEditModel::OmniboxEditModel(OmniboxView* view, |
| 161 OmniboxEditController* controller, | 163 OmniboxEditController* controller, |
| 162 Profile* profile) | 164 Profile* profile) |
| 163 : view_(view), | 165 : view_(view), |
| 164 controller_(controller), | 166 controller_(controller), |
| 165 focus_state_(OMNIBOX_FOCUS_NONE), | 167 focus_state_(OMNIBOX_FOCUS_NONE), |
| 168 focus_state_for_input_(OMNIBOX_FOCUS_NONE), | |
| 166 user_input_in_progress_(false), | 169 user_input_in_progress_(false), |
| 167 just_deleted_text_(false), | 170 just_deleted_text_(false), |
| 168 has_temporary_text_(false), | 171 has_temporary_text_(false), |
| 169 paste_state_(NONE), | 172 paste_state_(NONE), |
| 170 control_key_state_(UP), | 173 control_key_state_(UP), |
| 171 is_keyword_hint_(false), | 174 is_keyword_hint_(false), |
| 172 profile_(profile), | 175 profile_(profile), |
| 173 in_revert_(false), | 176 in_revert_(false), |
| 174 allow_exact_keyword_match_(false) { | 177 allow_exact_keyword_match_(false) { |
| 175 omnibox_controller_.reset(new OmniboxController(this, profile)); | 178 omnibox_controller_.reset(new OmniboxController(this, profile)); |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 195 } else { | 198 } else { |
| 196 InternalSetUserText(user_text); | 199 InternalSetUserText(user_text); |
| 197 } | 200 } |
| 198 } | 201 } |
| 199 | 202 |
| 200 return State(user_input_in_progress_, | 203 return State(user_input_in_progress_, |
| 201 user_text_, | 204 user_text_, |
| 202 view_->GetGrayTextAutocompletion(), | 205 view_->GetGrayTextAutocompletion(), |
| 203 keyword_, | 206 keyword_, |
| 204 is_keyword_hint_, | 207 is_keyword_hint_, |
| 205 focus_state_); | 208 focus_state_, |
| 209 focus_state_for_input_); | |
| 206 } | 210 } |
| 207 | 211 |
| 208 void OmniboxEditModel::RestoreState(const State& state) { | 212 void OmniboxEditModel::RestoreState(const State& state) { |
| 209 SetFocusState(state.focus_state, OMNIBOX_FOCUS_CHANGE_TAB_SWITCH); | 213 SetFocusState(state.focus_state, OMNIBOX_FOCUS_CHANGE_TAB_SWITCH); |
| 214 focus_state_for_input_ = state.focus_state_for_input; | |
| 210 // Restore any user editing. | 215 // Restore any user editing. |
| 211 if (state.user_input_in_progress) { | 216 if (state.user_input_in_progress) { |
| 212 // NOTE: Be sure and set keyword-related state BEFORE invoking | 217 // NOTE: Be sure and set keyword-related state BEFORE invoking |
| 213 // DisplayTextFromUserText(), as its result depends upon this state. | 218 // DisplayTextFromUserText(), as its result depends upon this state. |
| 214 keyword_ = state.keyword; | 219 keyword_ = state.keyword; |
| 215 is_keyword_hint_ = state.is_keyword_hint; | 220 is_keyword_hint_ = state.is_keyword_hint; |
| 216 view_->SetUserText(state.user_text, | 221 view_->SetUserText(state.user_text, |
| 217 DisplayTextFromUserText(state.user_text), false); | 222 DisplayTextFromUserText(state.user_text), false); |
| 218 view_->SetGrayTextAutocompletion(state.gray_text); | 223 view_->SetGrayTextAutocompletion(state.gray_text); |
| 219 } | 224 } |
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 438 delegate_->NotifySearchTabHelper(user_input_in_progress_, !in_revert_); | 443 delegate_->NotifySearchTabHelper(user_input_in_progress_, !in_revert_); |
| 439 } | 444 } |
| 440 | 445 |
| 441 void OmniboxEditModel::Revert() { | 446 void OmniboxEditModel::Revert() { |
| 442 SetInputInProgress(false); | 447 SetInputInProgress(false); |
| 443 paste_state_ = NONE; | 448 paste_state_ = NONE; |
| 444 InternalSetUserText(string16()); | 449 InternalSetUserText(string16()); |
| 445 keyword_.clear(); | 450 keyword_.clear(); |
| 446 is_keyword_hint_ = false; | 451 is_keyword_hint_ = false; |
| 447 has_temporary_text_ = false; | 452 has_temporary_text_ = false; |
| 453 focus_state_for_input_ = OMNIBOX_FOCUS_NONE; | |
|
Peter Kasting
2013/07/26 22:58:09
Is this right? What if the user reverts everythin
samarth
2013/07/26 23:00:55
That works today because PageClassifcation is only
samarth
2013/07/26 23:19:01
Ok, Peter convinced me that not keeping this here
Peter Kasting
2013/07/26 23:22:34
Turns out you mean OpenMatch(), which is called, b
Mark P
2013/07/26 23:36:35
Okay. That sounds fine.
| |
| 448 view_->SetWindowTextAndCaretPos(permanent_text_, | 454 view_->SetWindowTextAndCaretPos(permanent_text_, |
| 449 has_focus() ? permanent_text_.length() : 0, | 455 has_focus() ? permanent_text_.length() : 0, |
| 450 false, true); | 456 false, true); |
| 451 AutocompleteActionPredictor* action_predictor = | 457 AutocompleteActionPredictor* action_predictor = |
| 452 AutocompleteActionPredictorFactory::GetForProfile(profile_); | 458 AutocompleteActionPredictorFactory::GetForProfile(profile_); |
| 453 if (action_predictor) | 459 if (action_predictor) |
| 454 action_predictor->ClearTransitionalMatches(); | 460 action_predictor->ClearTransitionalMatches(); |
| 455 } | 461 } |
| 456 | 462 |
| 457 void OmniboxEditModel::StartAutocomplete( | 463 void OmniboxEditModel::StartAutocomplete( |
| (...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 834 // TODO(jered): Rip this out along with StartZeroSuggest. | 840 // TODO(jered): Rip this out along with StartZeroSuggest. |
| 835 autocomplete_controller()->StopZeroSuggest(); | 841 autocomplete_controller()->StopZeroSuggest(); |
| 836 delegate_->NotifySearchTabHelper(user_input_in_progress_, !in_revert_); | 842 delegate_->NotifySearchTabHelper(user_input_in_progress_, !in_revert_); |
| 837 } | 843 } |
| 838 | 844 |
| 839 void OmniboxEditModel::OnKillFocus() { | 845 void OmniboxEditModel::OnKillFocus() { |
| 840 // TODO(samarth): determine if it is safe to move the call to | 846 // TODO(samarth): determine if it is safe to move the call to |
| 841 // OmniboxFocusChanged() from OnWillKillFocus() to here, which would let us | 847 // OmniboxFocusChanged() from OnWillKillFocus() to here, which would let us |
| 842 // just call SetFocusState() to handle the state change. | 848 // just call SetFocusState() to handle the state change. |
| 843 focus_state_ = OMNIBOX_FOCUS_NONE; | 849 focus_state_ = OMNIBOX_FOCUS_NONE; |
| 850 focus_state_for_input_ = OMNIBOX_FOCUS_NONE; | |
| 844 control_key_state_ = UP; | 851 control_key_state_ = UP; |
| 845 paste_state_ = NONE; | 852 paste_state_ = NONE; |
| 846 } | 853 } |
| 847 | 854 |
| 848 bool OmniboxEditModel::OnEscapeKeyPressed() { | 855 bool OmniboxEditModel::OnEscapeKeyPressed() { |
| 849 if (has_temporary_text_) { | 856 if (has_temporary_text_) { |
| 850 if (CurrentMatch(NULL).destination_url != original_url_) { | 857 if (CurrentMatch(NULL).destination_url != original_url_) { |
| 851 RevertTemporaryText(true); | 858 RevertTemporaryText(true); |
| 852 return true; | 859 return true; |
| 853 } | 860 } |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1007 bool just_deleted_text, | 1014 bool just_deleted_text, |
| 1008 bool allow_keyword_ui_change) { | 1015 bool allow_keyword_ui_change) { |
| 1009 // Update the paste state as appropriate: if we're just finishing a paste | 1016 // Update the paste state as appropriate: if we're just finishing a paste |
| 1010 // that replaced all the text, preserve that information; otherwise, if we've | 1017 // that replaced all the text, preserve that information; otherwise, if we've |
| 1011 // made some other edit, clear paste tracking. | 1018 // made some other edit, clear paste tracking. |
| 1012 if (paste_state_ == PASTING) | 1019 if (paste_state_ == PASTING) |
| 1013 paste_state_ = PASTED; | 1020 paste_state_ = PASTED; |
| 1014 else if (text_differs) | 1021 else if (text_differs) |
| 1015 paste_state_ = NONE; | 1022 paste_state_ = NONE; |
| 1016 | 1023 |
| 1017 // Restore caret visibility whenever the user changes text or selection in the | 1024 if (text_differs || selection_differs) { |
| 1018 // omnibox. | 1025 // Record current focus state for this input if we haven't already. |
| 1019 if (text_differs || selection_differs) | 1026 DCHECK_NE(OMNIBOX_FOCUS_NONE, focus_state_); |
| 1027 if (focus_state_for_input_ == OMNIBOX_FOCUS_NONE) | |
| 1028 focus_state_for_input_ = focus_state_; | |
| 1029 | |
| 1030 // Restore caret visibility whenever the user changes text or selection in | |
| 1031 // the omnibox. | |
| 1020 SetFocusState(OMNIBOX_FOCUS_VISIBLE, OMNIBOX_FOCUS_CHANGE_TYPING); | 1032 SetFocusState(OMNIBOX_FOCUS_VISIBLE, OMNIBOX_FOCUS_CHANGE_TYPING); |
| 1033 } | |
| 1021 | 1034 |
| 1022 // Modifying the selection counts as accepting the autocompleted text. | 1035 // Modifying the selection counts as accepting the autocompleted text. |
| 1023 const bool user_text_changed = | 1036 const bool user_text_changed = |
| 1024 text_differs || (selection_differs && !inline_autocomplete_text_.empty()); | 1037 text_differs || (selection_differs && !inline_autocomplete_text_.empty()); |
| 1025 | 1038 |
| 1026 // If something has changed while the control key is down, prevent | 1039 // If something has changed while the control key is down, prevent |
| 1027 // "ctrl-enter" until the control key is released. When we do this, we need | 1040 // "ctrl-enter" until the control key is released. When we do this, we need |
| 1028 // to update the popup if it's open, since the desired_tld will have changed. | 1041 // to update the popup if it's open, since the desired_tld will have changed. |
| 1029 if ((text_differs || selection_differs) && | 1042 if ((text_differs || selection_differs) && |
| 1030 (control_key_state_ == DOWN_WITHOUT_CHANGE)) { | 1043 (control_key_state_ == DOWN_WITHOUT_CHANGE)) { |
| (...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1251 return true; | 1264 return true; |
| 1252 default: | 1265 default: |
| 1253 return false; | 1266 return false; |
| 1254 } | 1267 } |
| 1255 } | 1268 } |
| 1256 | 1269 |
| 1257 metrics::OmniboxEventProto::PageClassification | 1270 metrics::OmniboxEventProto::PageClassification |
| 1258 OmniboxEditModel::ClassifyPage() const { | 1271 OmniboxEditModel::ClassifyPage() const { |
| 1259 if (!delegate_->CurrentPageExists()) | 1272 if (!delegate_->CurrentPageExists()) |
| 1260 return metrics::OmniboxEventProto::OTHER; | 1273 return metrics::OmniboxEventProto::OTHER; |
| 1261 if (delegate_->IsInstantNTP()) | 1274 if (delegate_->IsInstantNTP()) { |
| 1262 return metrics::OmniboxEventProto::INSTANT_NEW_TAB_PAGE; | 1275 DCHECK_NE(OMNIBOX_FOCUS_NONE, focus_state_for_input_); |
| 1276 if (focus_state_for_input_ == OMNIBOX_FOCUS_VISIBLE) { | |
| 1277 return metrics::OmniboxEventProto:: | |
| 1278 INSTANT_NEW_TAB_PAGE_WITH_OMNIBOX_AS_STARTING_FOCUS; | |
| 1279 } else if (focus_state_for_input_ == OMNIBOX_FOCUS_INVISIBLE) { | |
|
Peter Kasting
2013/07/26 23:22:34
Nit: No else after return; also, per Chromium styl
samarth
2013/07/29 18:55:35
Done.
| |
| 1280 return metrics::OmniboxEventProto:: | |
| 1281 INSTANT_NEW_TAB_PAGE_WITH_FAKEBOX_AS_STARTING_FOCUS; | |
| 1282 } | |
| 1283 NOTREACHED(); | |
| 1284 return metrics::OmniboxEventProto::OBSOLETE_INSTANT_NEW_TAB_PAGE; | |
| 1285 } | |
| 1263 const GURL& gurl = delegate_->GetURL(); | 1286 const GURL& gurl = delegate_->GetURL(); |
| 1264 if (!gurl.is_valid()) | 1287 if (!gurl.is_valid()) |
| 1265 return metrics::OmniboxEventProto::INVALID_SPEC; | 1288 return metrics::OmniboxEventProto::INVALID_SPEC; |
| 1266 const std::string& url = gurl.spec(); | 1289 const std::string& url = gurl.spec(); |
| 1267 if (url == chrome::kChromeUINewTabURL) | 1290 if (url == chrome::kChromeUINewTabURL) |
| 1268 return metrics::OmniboxEventProto::NEW_TAB_PAGE; | 1291 return metrics::OmniboxEventProto::NEW_TAB_PAGE; |
| 1269 if (url == content::kAboutBlankURL) | 1292 if (url == content::kAboutBlankURL) |
| 1270 return metrics::OmniboxEventProto::BLANK; | 1293 return metrics::OmniboxEventProto::BLANK; |
| 1271 if (url == profile()->GetPrefs()->GetString(prefs::kHomePage)) | 1294 if (url == profile()->GetPrefs()->GetString(prefs::kHomePage)) |
| 1272 return metrics::OmniboxEventProto::HOMEPAGE; | 1295 return metrics::OmniboxEventProto::HOMEPAGE; |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 1296 instant->OmniboxFocusChanged(state, reason, NULL); | 1319 instant->OmniboxFocusChanged(state, reason, NULL); |
| 1297 | 1320 |
| 1298 // Update state and notify view if the omnibox has focus and the caret | 1321 // Update state and notify view if the omnibox has focus and the caret |
| 1299 // visibility changed. | 1322 // visibility changed. |
| 1300 const bool was_caret_visible = is_caret_visible(); | 1323 const bool was_caret_visible = is_caret_visible(); |
| 1301 focus_state_ = state; | 1324 focus_state_ = state; |
| 1302 if (focus_state_ != OMNIBOX_FOCUS_NONE && | 1325 if (focus_state_ != OMNIBOX_FOCUS_NONE && |
| 1303 is_caret_visible() != was_caret_visible) | 1326 is_caret_visible() != was_caret_visible) |
| 1304 view_->ApplyCaretVisibility(); | 1327 view_->ApplyCaretVisibility(); |
| 1305 } | 1328 } |
| OLD | NEW |