Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_controller.h" | 5 #include "chrome/browser/ui/omnibox/omnibox_controller.h" |
| 6 | 6 |
| 7 #include "base/metrics/histogram.h" | 7 #include "base/metrics/histogram.h" |
| 8 #include "chrome/browser/autocomplete/autocomplete_classifier.h" | 8 #include "chrome/browser/autocomplete/autocomplete_classifier.h" |
| 9 #include "chrome/browser/autocomplete/autocomplete_match.h" | 9 #include "chrome/browser/autocomplete/autocomplete_match.h" |
| 10 #include "chrome/browser/autocomplete/search_provider.h" | 10 #include "chrome/browser/autocomplete/search_provider.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 60 string16 user_text, | 60 string16 user_text, |
| 61 size_t cursor_position, | 61 size_t cursor_position, |
| 62 const GURL& current_url, | 62 const GURL& current_url, |
| 63 bool prevent_inline_autocomplete, | 63 bool prevent_inline_autocomplete, |
| 64 bool prefer_keyword, | 64 bool prefer_keyword, |
| 65 bool allow_exact_keyword_match, | 65 bool allow_exact_keyword_match, |
| 66 int omnibox_start_margin) const { | 66 int omnibox_start_margin) const { |
| 67 ClearPopupKeywordMode(); | 67 ClearPopupKeywordMode(); |
| 68 popup_->SetHoveredLine(OmniboxPopupModel::kNoMatch); | 68 popup_->SetHoveredLine(OmniboxPopupModel::kNoMatch); |
| 69 | 69 |
| 70 #if defined(HTML_INSTANT_EXTENDED_POPUP) | |
| 71 InstantController* instant_controller = GetInstantController(); | |
| 72 if (instant_controller) | |
| 73 instant_controller->OnAutocompleteStart(); | |
| 74 #endif | |
| 75 if (chrome::IsInstantExtendedAPIEnabled()) { | 70 if (chrome::IsInstantExtendedAPIEnabled()) { |
| 76 autocomplete_controller_->search_provider()-> | 71 autocomplete_controller_->search_provider()-> |
| 77 SetOmniboxStartMargin(omnibox_start_margin); | 72 SetOmniboxStartMargin(omnibox_start_margin); |
| 78 } | 73 } |
| 79 | 74 |
| 80 // We don't explicitly clear OmniboxPopupModel::manually_selected_match, as | 75 // We don't explicitly clear OmniboxPopupModel::manually_selected_match, as |
| 81 // Start ends up invoking OmniboxPopupModel::OnResultChanged which clears it. | 76 // Start ends up invoking OmniboxPopupModel::OnResultChanged which clears it. |
| 82 autocomplete_controller_->Start(AutocompleteInput( | 77 autocomplete_controller_->Start(AutocompleteInput( |
| 83 user_text, cursor_position, string16(), current_url, | 78 user_text, cursor_position, string16(), current_url, |
| 84 prevent_inline_autocomplete, prefer_keyword, allow_exact_keyword_match, | 79 prevent_inline_autocomplete, prefer_keyword, allow_exact_keyword_match, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 117 } else { | 112 } else { |
| 118 InvalidateCurrentMatch(); | 113 InvalidateCurrentMatch(); |
| 119 popup_->OnResultChanged(); | 114 popup_->OnResultChanged(); |
| 120 omnibox_edit_model_->OnPopupDataChanged(string16(), NULL, string16(), | 115 omnibox_edit_model_->OnPopupDataChanged(string16(), NULL, string16(), |
| 121 false); | 116 false); |
| 122 } | 117 } |
| 123 } else { | 118 } else { |
| 124 popup_->OnResultChanged(); | 119 popup_->OnResultChanged(); |
| 125 } | 120 } |
| 126 | 121 |
| 127 // TODO(beaudoin): This may no longer be needed now that instant classic is | 122 if (!popup_->IsOpen() && was_open) { |
| 128 // gone. | |
| 129 if (popup_->IsOpen()) { | |
| 130 // The popup size may have changed, let instant know. | |
| 131 OnPopupBoundsChanged(popup_->view()->GetTargetBounds()); | |
| 132 | |
| 133 #if defined(HTML_INSTANT_EXTENDED_POPUP) | |
| 134 InstantController* instant_controller = GetInstantController(); | |
| 135 if (instant_controller && !omnibox_edit_model_->in_revert()) { | |
| 136 instant_controller->HandleAutocompleteResults( | |
| 137 *autocomplete_controller_->providers(), | |
| 138 autocomplete_controller_->result()); | |
| 139 } | |
| 140 #endif | |
| 141 } else if (was_open) { | |
| 142 // Accept the temporary text as the user text, because it makes little sense | 123 // Accept the temporary text as the user text, because it makes little sense |
| 143 // to have temporary text when the popup is closed. | 124 // to have temporary text when the popup is closed. |
| 144 omnibox_edit_model_->AcceptTemporaryTextAsUserText(); | 125 omnibox_edit_model_->AcceptTemporaryTextAsUserText(); |
| 145 // The popup has been closed, let instant know. | |
| 146 OnPopupBoundsChanged(gfx::Rect()); | |
| 147 } | 126 } |
| 148 } | 127 } |
| 149 | 128 |
| 150 bool OmniboxController::DoInstant(const AutocompleteMatch& match, | 129 bool OmniboxController::DoInstant(const AutocompleteMatch& match, |
| 151 string16 user_text, | 130 string16 user_text, |
| 152 string16 full_text, | 131 string16 full_text, |
| 153 size_t selection_start, | 132 size_t selection_start, |
| 154 size_t selection_end, | 133 size_t selection_end, |
| 155 bool user_input_in_progress, | 134 bool user_input_in_progress, |
| 156 bool in_escape_handler, | 135 bool in_escape_handler, |
| 157 bool just_deleted_text, | 136 bool just_deleted_text, |
| 158 bool keyword_is_selected) { | 137 bool keyword_is_selected) { |
| 159 #if defined(HTML_INSTANT_EXTENDED_POPUP) | |
| 160 InstantController* instant_controller = GetInstantController(); | |
| 161 if (!instant_controller) | |
| 162 return false; | |
| 163 | |
| 164 // Remove "?" if we're in forced query mode. | |
| 165 AutocompleteInput::RemoveForcedQueryStringIfNecessary( | |
| 166 autocomplete_controller_->input().type(), &user_text); | |
| 167 AutocompleteInput::RemoveForcedQueryStringIfNecessary( | |
| 168 autocomplete_controller_->input().type(), &full_text); | |
| 169 return instant_controller->Update( | |
| 170 match, user_text, full_text, selection_start, selection_end, | |
| 171 UseVerbatimInstant(just_deleted_text), user_input_in_progress, | |
| 172 popup_->IsOpen(), in_escape_handler, keyword_is_selected); | |
| 173 #else | |
| 174 return false; | 138 return false; |
|
Peter Kasting
2013/06/28 18:47:55
Should there be a TODO to nuke this function too?
Jered
2013/06/28 19:09:55
Just did it.
| |
| 175 #endif | |
| 176 } | 139 } |
| 177 | 140 |
| 178 void OmniboxController::SetInstantSuggestion( | 141 void OmniboxController::SetInstantSuggestion( |
| 179 const InstantSuggestion& suggestion) { | 142 const InstantSuggestion& suggestion) { |
| 180 // Should only get called for the HTML popup. | 143 // TODO(jered): Delete this. |
| 181 #if defined(HTML_INSTANT_EXTENDED_POPUP) | |
| 182 switch (suggestion.behavior) { | |
| 183 case INSTANT_COMPLETE_NOW: | |
| 184 // Set blue suggestion text. | |
| 185 // TODO(beaudoin): Create a valid current_match_ and call | |
| 186 // omnibox_edit_model_->OnCurrentMatchChanged. | |
| 187 return; | |
| 188 | |
| 189 case INSTANT_COMPLETE_NEVER: { | |
| 190 DCHECK_EQ(INSTANT_SUGGESTION_SEARCH, suggestion.type); | |
| 191 | |
| 192 // Set gray suggestion text. | |
| 193 // Remove "?" if we're in forced query mode. | |
| 194 gray_suggestion_ = suggestion.text; | |
| 195 | |
| 196 omnibox_edit_model_->OnGrayTextChanged(); | |
| 197 return; | |
| 198 } | |
| 199 | |
| 200 case INSTANT_COMPLETE_REPLACE: | |
| 201 // Replace the entire omnibox text by the suggestion the user just arrowed | |
| 202 // to. | |
| 203 CreateAndSetInstantMatch(suggestion.text, suggestion.text, | |
| 204 suggestion.type == INSTANT_SUGGESTION_SEARCH ? | |
| 205 AutocompleteMatchType::SEARCH_SUGGEST : | |
| 206 AutocompleteMatchType::URL_WHAT_YOU_TYPED); | |
| 207 | |
| 208 omnibox_edit_model_->OnCurrentMatchChanged(true); | |
| 209 return; | |
| 210 } | |
| 211 #endif | |
| 212 } | 144 } |
| 213 | 145 |
| 214 void OmniboxController::InvalidateCurrentMatch() { | 146 void OmniboxController::InvalidateCurrentMatch() { |
| 215 current_match_ = AutocompleteMatch(); | 147 current_match_ = AutocompleteMatch(); |
| 216 } | 148 } |
| 217 | 149 |
| 218 void OmniboxController::ClearPopupKeywordMode() const { | 150 void OmniboxController::ClearPopupKeywordMode() const { |
| 219 if (popup_->IsOpen() && | 151 if (popup_->IsOpen() && |
| 220 popup_->selected_line_state() == OmniboxPopupModel::KEYWORD) | 152 popup_->selected_line_state() == OmniboxPopupModel::KEYWORD) |
| 221 popup_->SetSelectedLineState(OmniboxPopupModel::NORMAL); | 153 popup_->SetSelectedLineState(OmniboxPopupModel::NORMAL); |
| 222 } | 154 } |
| 223 | 155 |
| 224 void OmniboxController::DoPreconnect(const AutocompleteMatch& match) { | 156 void OmniboxController::DoPreconnect(const AutocompleteMatch& match) { |
| 225 if (!match.destination_url.SchemeIs(extensions::kExtensionScheme)) { | 157 if (!match.destination_url.SchemeIs(extensions::kExtensionScheme)) { |
| 226 // Warm up DNS Prefetch cache, or preconnect to a search service. | 158 // Warm up DNS Prefetch cache, or preconnect to a search service. |
| 227 UMA_HISTOGRAM_ENUMERATION("Autocomplete.MatchType", match.type, | 159 UMA_HISTOGRAM_ENUMERATION("Autocomplete.MatchType", match.type, |
| 228 AutocompleteMatchType::NUM_TYPES); | 160 AutocompleteMatchType::NUM_TYPES); |
| 229 if (profile_->GetNetworkPredictor()) { | 161 if (profile_->GetNetworkPredictor()) { |
| 230 profile_->GetNetworkPredictor()->AnticipateOmniboxUrl( | 162 profile_->GetNetworkPredictor()->AnticipateOmniboxUrl( |
| 231 match.destination_url, | 163 match.destination_url, |
| 232 AutocompleteActionPredictor::IsPreconnectable(match)); | 164 AutocompleteActionPredictor::IsPreconnectable(match)); |
| 233 } | 165 } |
| 234 // We could prefetch the alternate nav URL, if any, but because there | 166 // We could prefetch the alternate nav URL, if any, but because there |
| 235 // can be many of these as a user types an initial series of characters, | 167 // can be many of these as a user types an initial series of characters, |
| 236 // the OS DNS cache could suffer eviction problems for minimal gain. | 168 // the OS DNS cache could suffer eviction problems for minimal gain. |
| 237 } | 169 } |
| 238 } | 170 } |
| 239 | 171 |
| 240 void OmniboxController::OnPopupBoundsChanged(const gfx::Rect& bounds) { | |
| 241 InstantController* instant_controller = GetInstantController(); | |
| 242 if (instant_controller) | |
| 243 instant_controller->SetPopupBounds(bounds); | |
| 244 } | |
| 245 | |
| 246 bool OmniboxController::UseVerbatimInstant(bool just_deleted_text) const { | 172 bool OmniboxController::UseVerbatimInstant(bool just_deleted_text) const { |
| 247 #if defined(OS_MACOSX) | 173 #if defined(OS_MACOSX) |
| 248 // TODO(suzhe): Fix Mac port to display Instant suggest in a separated NSView, | 174 // TODO(suzhe): Fix Mac port to display Instant suggest in a separated NSView, |
| 249 // so that we can display Instant suggest along with composition text. | 175 // so that we can display Instant suggest along with composition text. |
| 250 const AutocompleteInput& input = autocomplete_controller_->input(); | 176 const AutocompleteInput& input = autocomplete_controller_->input(); |
| 251 if (input.prevent_inline_autocomplete()) | 177 if (input.prevent_inline_autocomplete()) |
| 252 return true; | 178 return true; |
| 253 #endif | 179 #endif |
| 254 | 180 |
| 255 // The value of input.prevent_inline_autocomplete() is determined by the | 181 // The value of input.prevent_inline_autocomplete() is determined by the |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 272 string16 input_text, | 198 string16 input_text, |
| 273 AutocompleteMatchType::Type match_type) { | 199 AutocompleteMatchType::Type match_type) { |
| 274 string16 keyword = GetDefaultSearchProviderKeyword(profile_); | 200 string16 keyword = GetDefaultSearchProviderKeyword(profile_); |
| 275 if (keyword.empty()) | 201 if (keyword.empty()) |
| 276 return; // CreateSearchSuggestion needs a keyword. | 202 return; // CreateSearchSuggestion needs a keyword. |
| 277 | 203 |
| 278 current_match_ = SearchProvider::CreateSearchSuggestion( | 204 current_match_ = SearchProvider::CreateSearchSuggestion( |
| 279 profile_, NULL, AutocompleteInput(), query_string, input_text, 0, | 205 profile_, NULL, AutocompleteInput(), query_string, input_text, 0, |
| 280 match_type, 0, false, keyword, -1); | 206 match_type, 0, false, keyword, -1); |
| 281 } | 207 } |
| OLD | NEW |