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 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
232 omnibox_controller_->InvalidateCurrentMatch(); | 232 omnibox_controller_->InvalidateCurrentMatch(); |
233 paste_state_ = NONE; | 233 paste_state_ = NONE; |
234 has_temporary_text_ = false; | 234 has_temporary_text_ = false; |
235 is_temporary_text_set_by_instant_ = false; | 235 is_temporary_text_set_by_instant_ = false; |
236 selected_instant_autocomplete_match_index_ = OmniboxPopupModel::kNoMatch; | 236 selected_instant_autocomplete_match_index_ = OmniboxPopupModel::kNoMatch; |
237 is_instant_temporary_text_a_search_query_ = false; | 237 is_instant_temporary_text_a_search_query_ = false; |
238 } | 238 } |
239 | 239 |
240 void OmniboxEditModel::SetInstantSuggestion( | 240 void OmniboxEditModel::SetInstantSuggestion( |
241 const InstantSuggestion& suggestion) { | 241 const InstantSuggestion& suggestion) { |
242 // Should only get called for the HTML popup. | |
243 #if defined(HTML_INSTANT_EXTENDED_POPUP) | |
244 omnibox_controller_->SetInstantSuggestion(suggestion); | |
245 #endif | |
246 } | 242 } |
247 | 243 |
248 bool OmniboxEditModel::CommitSuggestedText() { | 244 bool OmniboxEditModel::CommitSuggestedText() { |
249 const string16 suggestion = view_->GetInstantSuggestion(); | 245 const string16 suggestion = view_->GetInstantSuggestion(); |
250 if (suggestion.empty()) | 246 if (suggestion.empty()) |
251 return false; | 247 return false; |
252 | 248 |
253 // Assume that the gray text we are committing is a search suggestion. | 249 // Assume that the gray text we are committing is a search suggestion. |
254 const string16 final_text = view_->GetText() + suggestion; | 250 const string16 final_text = view_->GetText() + suggestion; |
255 view_->OnBeforePossibleChange(); | 251 view_->OnBeforePossibleChange(); |
(...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
704 | 700 |
705 // Track whether the destination URL sends us to a search results page | 701 // Track whether the destination URL sends us to a search results page |
706 // using the default search provider. | 702 // using the default search provider. |
707 TemplateURL* default_provider = | 703 TemplateURL* default_provider = |
708 TemplateURLServiceFactory::GetForProfile(profile_)-> | 704 TemplateURLServiceFactory::GetForProfile(profile_)-> |
709 GetDefaultSearchProvider(); | 705 GetDefaultSearchProvider(); |
710 if (default_provider && default_provider->IsSearchURL(destination_url)) | 706 if (default_provider && default_provider->IsSearchURL(destination_url)) |
711 content::RecordAction(UserMetricsAction( | 707 content::RecordAction(UserMetricsAction( |
712 "OmniboxDestinationURLMatchesDefaultSearchProvider")); | 708 "OmniboxDestinationURLMatchesDefaultSearchProvider")); |
713 | 709 |
714 #if defined(HTML_INSTANT_EXTENDED_POPUP) | |
715 // If running with instant, notify the instant controller that a navigation | |
716 // is about to take place if we are navigating to a URL. This can be | |
717 // determined by inspecting the transition type. To ensure that this is only | |
718 // done on Enter key press, check that the disposition is CURRENT_TAB. This | |
719 // is the same heuristic used by BrowserInstantController::OpenInstant | |
720 if (match.transition == content::PAGE_TRANSITION_TYPED && | |
721 disposition == CURRENT_TAB) { | |
722 InstantController* instant = GetInstantController(); | |
723 if (instant) | |
724 instant->OmniboxNavigateToURL(); | |
725 } | |
726 #endif | |
727 | |
728 // This calls RevertAll again. | 710 // This calls RevertAll again. |
729 base::AutoReset<bool> tmp(&in_revert_, true); | 711 base::AutoReset<bool> tmp(&in_revert_, true); |
730 controller_->OnAutocompleteAccept(destination_url, disposition, | 712 controller_->OnAutocompleteAccept(destination_url, disposition, |
731 match.transition, alternate_nav_url); | 713 match.transition, alternate_nav_url); |
732 } | 714 } |
733 | 715 |
734 if (match.starred) | 716 if (match.starred) |
735 bookmark_utils::RecordBookmarkLaunch(bookmark_utils::LAUNCH_OMNIBOX); | 717 bookmark_utils::RecordBookmarkLaunch(bookmark_utils::LAUNCH_OMNIBOX); |
736 } | 718 } |
737 | 719 |
(...skipping 26 matching lines...) Expand all Loading... | |
764 | 746 |
765 return true; | 747 return true; |
766 } | 748 } |
767 | 749 |
768 void OmniboxEditModel::AcceptTemporaryTextAsUserText() { | 750 void OmniboxEditModel::AcceptTemporaryTextAsUserText() { |
769 InternalSetUserText(UserTextFromDisplayText(view_->GetText())); | 751 InternalSetUserText(UserTextFromDisplayText(view_->GetText())); |
770 has_temporary_text_ = false; | 752 has_temporary_text_ = false; |
771 is_temporary_text_set_by_instant_ = false; | 753 is_temporary_text_set_by_instant_ = false; |
772 selected_instant_autocomplete_match_index_ = OmniboxPopupModel::kNoMatch; | 754 selected_instant_autocomplete_match_index_ = OmniboxPopupModel::kNoMatch; |
773 is_instant_temporary_text_a_search_query_ = false; | 755 is_instant_temporary_text_a_search_query_ = false; |
774 OnPopupBoundsChanged(gfx::Rect()); | |
775 delegate_->NotifySearchTabHelper(user_input_in_progress_, !in_revert_, | 756 delegate_->NotifySearchTabHelper(user_input_in_progress_, !in_revert_, |
776 popup_model()->IsOpen(), user_text_.empty()); | 757 popup_model()->IsOpen(), user_text_.empty()); |
777 } | 758 } |
778 | 759 |
779 void OmniboxEditModel::ClearKeyword(const string16& visible_text) { | 760 void OmniboxEditModel::ClearKeyword(const string16& visible_text) { |
780 autocomplete_controller()->Stop(false); | 761 autocomplete_controller()->Stop(false); |
781 omnibox_controller_->ClearPopupKeywordMode(); | 762 omnibox_controller_->ClearPopupKeywordMode(); |
782 | 763 |
783 const string16 window_text(keyword_ + visible_text); | 764 const string16 window_text(keyword_ + visible_text); |
784 | 765 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
907 // TODO(pkasting): We should, in fact, force this particular query to open | 888 // TODO(pkasting): We should, in fact, force this particular query to open |
908 // the popup immediately. | 889 // the popup immediately. |
909 if (!user_input_in_progress_) | 890 if (!user_input_in_progress_) |
910 InternalSetUserText(permanent_text_); | 891 InternalSetUserText(permanent_text_); |
911 view_->UpdatePopup(); | 892 view_->UpdatePopup(); |
912 } else { | 893 } else { |
913 // TODO(pkasting): The popup is working on a query but is not open. We | 894 // TODO(pkasting): The popup is working on a query but is not open. We |
914 // should force it to open immediately. | 895 // should force it to open immediately. |
915 } | 896 } |
916 } else { | 897 } else { |
917 #if defined(HTML_INSTANT_EXTENDED_POPUP) | 898 // The popup is open, so the user should be able to interact with it |
918 InstantController* instant = GetInstantController(); | 899 // normally. |
919 if (instant && instant->OnUpOrDownKeyPressed(count)) { | 900 popup_model()->Move(count); |
920 // If Instant handles the key press, it's showing a list of suggestions | |
921 // that it's stepping through. In that case, our popup model is | |
922 // irrelevant, so don't process the key press ourselves. However, do stop | |
923 // the autocomplete system from changing the results. | |
924 autocomplete_controller()->Stop(false); | |
925 } else | |
926 #endif | |
927 { | |
928 // The popup is open, so the user should be able to interact with it | |
929 // normally. | |
930 popup_model()->Move(count); | |
931 } | |
932 } | 901 } |
933 } | 902 } |
934 | 903 |
935 void OmniboxEditModel::OnPopupDataChanged( | 904 void OmniboxEditModel::OnPopupDataChanged( |
936 const string16& text, | 905 const string16& text, |
937 GURL* destination_for_temporary_text_change, | 906 GURL* destination_for_temporary_text_change, |
938 const string16& keyword, | 907 const string16& keyword, |
939 bool is_keyword_hint) { | 908 bool is_keyword_hint) { |
940 // The popup changed its data, the match in the controller is no longer valid. | 909 // The popup changed its data, the match in the controller is no longer valid. |
941 omnibox_controller_->InvalidateCurrentMatch(); | 910 omnibox_controller_->InvalidateCurrentMatch(); |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1201 // explicitly set up a match that will reload here. | 1170 // explicitly set up a match that will reload here. |
1202 | 1171 |
1203 // It's important that we fetch the current visible URL to reload instead of | 1172 // It's important that we fetch the current visible URL to reload instead of |
1204 // just getting a "search what you typed" URL from | 1173 // just getting a "search what you typed" URL from |
1205 // SearchProvider::CreateSearchSuggestion(), since the user may be in a | 1174 // SearchProvider::CreateSearchSuggestion(), since the user may be in a |
1206 // non-default search mode such as image search. | 1175 // non-default search mode such as image search. |
1207 match->type = AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED; | 1176 match->type = AutocompleteMatchType::SEARCH_WHAT_YOU_TYPED; |
1208 match->destination_url = | 1177 match->destination_url = |
1209 delegate_->GetNavigationController().GetVisibleEntry()->GetURL(); | 1178 delegate_->GetNavigationController().GetVisibleEntry()->GetURL(); |
1210 match->transition = content::PAGE_TRANSITION_RELOAD; | 1179 match->transition = content::PAGE_TRANSITION_RELOAD; |
1211 #if defined(HTML_INSTANT_EXTENDED_POPUP) | 1180 #if defined(HTML_INSTANT_EXTENDED_POPUP) |
Peter Kasting
2013/06/28 18:47:55
Should this be nuked?
Jered
2013/06/28 19:09:55
Done.
| |
1212 } else if (is_temporary_text_set_by_instant_) { | 1181 } else if (is_temporary_text_set_by_instant_) { |
1213 // If there's temporary text and it has been set by Instant, we won't find | 1182 // If there's temporary text and it has been set by Instant, we won't find |
1214 // it in the popup model, so create the match based on the type Instant told | 1183 // it in the popup model, so create the match based on the type Instant told |
1215 // us (SWYT for queries and UWYT for URLs). We do this instead of | 1184 // us (SWYT for queries and UWYT for URLs). We do this instead of |
1216 // classifying the text ourselves because the text may look like a URL, but | 1185 // classifying the text ourselves because the text may look like a URL, but |
1217 // Instant may expect it to be a search (e.g.: a query for "amazon.com"). | 1186 // Instant may expect it to be a search (e.g.: a query for "amazon.com"). |
1218 if (selected_instant_autocomplete_match_index_ != | 1187 if (selected_instant_autocomplete_match_index_ != |
1219 OmniboxPopupModel::kNoMatch) { | 1188 OmniboxPopupModel::kNoMatch) { |
1220 // Great, we know the exact match struct. Just use that. | 1189 // Great, we know the exact match struct. Just use that. |
1221 const AutocompleteResult& result = this->result(); | 1190 const AutocompleteResult& result = this->result(); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1281 AutocompleteClassifierFactory::GetForProfile(profile_)->Classify( | 1250 AutocompleteClassifierFactory::GetForProfile(profile_)->Classify( |
1282 UserTextFromDisplayText(view_->GetText()), KeywordIsSelected(), true, | 1251 UserTextFromDisplayText(view_->GetText()), KeywordIsSelected(), true, |
1283 match, alternate_nav_url); | 1252 match, alternate_nav_url); |
1284 } | 1253 } |
1285 } | 1254 } |
1286 | 1255 |
1287 void OmniboxEditModel::RevertTemporaryText(bool revert_popup) { | 1256 void OmniboxEditModel::RevertTemporaryText(bool revert_popup) { |
1288 // The user typed something, then selected a different item. Restore the | 1257 // The user typed something, then selected a different item. Restore the |
1289 // text they typed and change back to the default item. | 1258 // text they typed and change back to the default item. |
1290 // NOTE: This purposefully does not reset paste_state_. | 1259 // NOTE: This purposefully does not reset paste_state_. |
1291 #if defined(HTML_INSTANT_EXTENDED_POPUP) | |
1292 bool notify_instant = is_temporary_text_set_by_instant_; | |
1293 #endif | |
1294 just_deleted_text_ = false; | 1260 just_deleted_text_ = false; |
1295 has_temporary_text_ = false; | 1261 has_temporary_text_ = false; |
1296 is_temporary_text_set_by_instant_ = false; | 1262 is_temporary_text_set_by_instant_ = false; |
1297 selected_instant_autocomplete_match_index_ = OmniboxPopupModel::kNoMatch; | 1263 selected_instant_autocomplete_match_index_ = OmniboxPopupModel::kNoMatch; |
1298 is_instant_temporary_text_a_search_query_ = false; | 1264 is_instant_temporary_text_a_search_query_ = false; |
1299 | 1265 |
1300 #if defined(HTML_INSTANT_EXTENDED_POPUP) | |
1301 InstantController* instant = GetInstantController(); | |
1302 if (instant && notify_instant) { | |
1303 // Normally, popup_model()->ResetToDefaultMatch() will cause the view text | |
1304 // to be updated. In Instant Extended mode however, the popup_model() is | |
1305 // not used, so it won't do anything. So, update the view ourselves. Even | |
1306 // if Instant is not in extended mode (i.e., it's enabled in non-extended | |
1307 // mode, or disabled altogether), this is okay to do, since the call to | |
1308 // popup_model()->ResetToDefaultMatch() will just override whatever we do | |
1309 // here. | |
1310 // | |
1311 // The two "false" arguments make sure that our shenanigans don't cause any | |
1312 // previously saved selection to be erased nor OnChanged() to be called. | |
1313 view_->OnTemporaryTextMaybeChanged(user_text_ + inline_autocomplete_text_, | |
1314 false, false); | |
1315 AutocompleteResult::const_iterator match(result().default_match()); | |
1316 instant->OnCancel(match != result().end() ? *match : AutocompleteMatch(), | |
1317 user_text_, | |
1318 user_text_ + inline_autocomplete_text_); | |
1319 } | |
1320 #endif | |
1321 if (revert_popup) | 1266 if (revert_popup) |
1322 popup_model()->ResetToDefaultMatch(); | 1267 popup_model()->ResetToDefaultMatch(); |
1323 view_->OnRevertTemporaryText(); | 1268 view_->OnRevertTemporaryText(); |
1324 } | 1269 } |
1325 | 1270 |
1326 bool OmniboxEditModel::MaybeAcceptKeywordBySpace(const string16& new_text) { | 1271 bool OmniboxEditModel::MaybeAcceptKeywordBySpace(const string16& new_text) { |
1327 size_t keyword_length = new_text.length() - 1; | 1272 size_t keyword_length = new_text.length() - 1; |
1328 return (paste_state_ == NONE) && is_keyword_hint_ && !keyword_.empty() && | 1273 return (paste_state_ == NONE) && is_keyword_hint_ && !keyword_.empty() && |
1329 inline_autocomplete_text_.empty() && | 1274 inline_autocomplete_text_.empty() && |
1330 (keyword_.length() == keyword_length) && | 1275 (keyword_.length() == keyword_length) && |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1408 instant->OmniboxFocusChanged(state, reason, NULL); | 1353 instant->OmniboxFocusChanged(state, reason, NULL); |
1409 | 1354 |
1410 // Update state and notify view if the omnibox has focus and the caret | 1355 // Update state and notify view if the omnibox has focus and the caret |
1411 // visibility changed. | 1356 // visibility changed. |
1412 const bool was_caret_visible = is_caret_visible(); | 1357 const bool was_caret_visible = is_caret_visible(); |
1413 focus_state_ = state; | 1358 focus_state_ = state; |
1414 if (focus_state_ != OMNIBOX_FOCUS_NONE && | 1359 if (focus_state_ != OMNIBOX_FOCUS_NONE && |
1415 is_caret_visible() != was_caret_visible) | 1360 is_caret_visible() != was_caret_visible) |
1416 view_->ApplyCaretVisibility(); | 1361 view_->ApplyCaretVisibility(); |
1417 } | 1362 } |
OLD | NEW |