OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/autocomplete/autocomplete_popup_model.h" | 5 #include "chrome/browser/autocomplete/autocomplete_popup_model.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "unicode/ubidi.h" | 9 #include "unicode/ubidi.h" |
10 | 10 |
11 #include "base/string_util.h" | 11 #include "base/string_util.h" |
12 #include "base/utf_string_conversions.h" | 12 #include "base/utf_string_conversions.h" |
13 #include "chrome/browser/autocomplete/autocomplete_edit.h" | 13 #include "chrome/browser/autocomplete/autocomplete_edit.h" |
14 #include "chrome/browser/autocomplete/autocomplete_match.h" | 14 #include "chrome/browser/autocomplete/autocomplete_match.h" |
15 #include "chrome/browser/autocomplete/autocomplete_popup_view.h" | 15 #include "chrome/browser/autocomplete/autocomplete_popup_view.h" |
16 #include "chrome/browser/extensions/extension_service.h" | 16 #include "chrome/browser/extensions/extension_service.h" |
17 #include "chrome/browser/profiles/profile.h" | 17 #include "chrome/browser/profiles/profile.h" |
18 #include "chrome/browser/search_engines/template_url.h" | 18 #include "chrome/browser/search_engines/template_url.h" |
19 #include "chrome/browser/search_engines/template_url_service.h" | 19 #include "chrome/browser/search_engines/template_url_service.h" |
20 #include "chrome/browser/search_engines/template_url_service_factory.h" | 20 #include "chrome/browser/search_engines/template_url_service_factory.h" |
21 #include "ui/gfx/rect.h" | 21 #include "ui/gfx/rect.h" |
22 | 22 |
23 /////////////////////////////////////////////////////////////////////////////// | 23 /////////////////////////////////////////////////////////////////////////////// |
24 // AutocompletePopupModel | 24 // AutocompletePopupModel |
25 | 25 |
26 AutocompletePopupModel::AutocompletePopupModel( | 26 AutocompletePopupModel::AutocompletePopupModel( |
27 AutocompletePopupView* popup_view, | 27 AutocompletePopupView* popup_view, |
28 AutocompleteEditModel* edit_model, | 28 AutocompleteEditModel* edit_model) |
29 Profile* profile) | |
30 : view_(popup_view), | 29 : view_(popup_view), |
31 edit_model_(edit_model), | 30 edit_model_(edit_model), |
32 profile_(profile), | |
33 hovered_line_(kNoMatch), | 31 hovered_line_(kNoMatch), |
34 selected_line_(kNoMatch) { | 32 selected_line_(kNoMatch) { |
35 edit_model->set_popup_model(this); | 33 edit_model->set_popup_model(this); |
36 } | 34 } |
37 | 35 |
38 AutocompletePopupModel::~AutocompletePopupModel() { | 36 AutocompletePopupModel::~AutocompletePopupModel() { |
39 } | 37 } |
40 | 38 |
41 bool AutocompletePopupModel::IsOpen() const { | 39 bool AutocompletePopupModel::IsOpen() const { |
42 return view_->IsOpen(); | 40 return view_->IsOpen(); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 view_->OnDragCanceled(); | 127 view_->OnDragCanceled(); |
130 } | 128 } |
131 | 129 |
132 bool AutocompletePopupModel::GetKeywordForMatch(const AutocompleteMatch& match, | 130 bool AutocompletePopupModel::GetKeywordForMatch(const AutocompleteMatch& match, |
133 string16* keyword) const { | 131 string16* keyword) const { |
134 // Assume we have no keyword until we find otherwise. | 132 // Assume we have no keyword until we find otherwise. |
135 keyword->clear(); | 133 keyword->clear(); |
136 | 134 |
137 if (match.template_url) { | 135 if (match.template_url) { |
138 TemplateURLService* url_service = | 136 TemplateURLService* url_service = |
139 TemplateURLServiceFactory::GetForProfile(profile_); | 137 TemplateURLServiceFactory::GetForProfile(edit_model_->profile()); |
140 if (!url_service) | 138 if (!url_service) |
141 return false; | 139 return false; |
142 | 140 |
143 // Only show the keyword for the default provider if the user typed in | 141 // Only show the keyword for the default provider if the user typed in |
144 // the keyword and it isn't SEARCH_WHAT_YOU_TYPED. | 142 // the keyword and it isn't SEARCH_WHAT_YOU_TYPED. |
145 const TemplateURL* default_url = url_service->GetDefaultSearchProvider(); | 143 const TemplateURL* default_url = url_service->GetDefaultSearchProvider(); |
146 if (default_url && (default_url->id() == match.template_url->id())) { | 144 if (default_url && (default_url->id() == match.template_url->id())) { |
147 if (StartsWith(autocomplete_controller()->input().text(), | 145 if (StartsWith(autocomplete_controller()->input().text(), |
148 default_url->keyword(), false) && | 146 default_url->keyword(), false) && |
149 (match.type != AutocompleteMatch::SEARCH_WHAT_YOU_TYPED)) { | 147 (match.type != AutocompleteMatch::SEARCH_WHAT_YOU_TYPED)) { |
(...skipping 14 matching lines...) Expand all Loading... |
164 bool AutocompletePopupModel::GetKeywordForText(const string16& text, | 162 bool AutocompletePopupModel::GetKeywordForText(const string16& text, |
165 string16* keyword) const { | 163 string16* keyword) const { |
166 // Creates keyword_hint first in case |keyword| is a pointer to |text|. | 164 // Creates keyword_hint first in case |keyword| is a pointer to |text|. |
167 const string16 keyword_hint(TemplateURLService::CleanUserInputKeyword(text)); | 165 const string16 keyword_hint(TemplateURLService::CleanUserInputKeyword(text)); |
168 | 166 |
169 // Assume we have no keyword until we find otherwise. | 167 // Assume we have no keyword until we find otherwise. |
170 keyword->clear(); | 168 keyword->clear(); |
171 | 169 |
172 if (keyword_hint.empty()) | 170 if (keyword_hint.empty()) |
173 return false; | 171 return false; |
| 172 Profile* profile = edit_model_->profile(); |
174 TemplateURLService* url_service = | 173 TemplateURLService* url_service = |
175 TemplateURLServiceFactory::GetForProfile(profile_); | 174 TemplateURLServiceFactory::GetForProfile(profile); |
176 if (!url_service) | 175 if (!url_service) |
177 return false; | 176 return false; |
178 url_service->Load(); | 177 url_service->Load(); |
179 | 178 |
180 // Don't provide a hint if this keyword doesn't support replacement. | 179 // Don't provide a hint if this keyword doesn't support replacement. |
181 const TemplateURL* const template_url = | 180 const TemplateURL* const template_url = |
182 url_service->GetTemplateURLForKeyword(keyword_hint); | 181 url_service->GetTemplateURLForKeyword(keyword_hint); |
183 if (!TemplateURL::SupportsReplacement(template_url)) | 182 if (!TemplateURL::SupportsReplacement(template_url)) |
184 return false; | 183 return false; |
185 | 184 |
186 // Don't provide a hint for inactive/disabled extension keywords. | 185 // Don't provide a hint for inactive/disabled extension keywords. |
187 if (template_url->IsExtensionKeyword()) { | 186 if (template_url->IsExtensionKeyword()) { |
188 const Extension* extension = profile_->GetExtensionService()-> | 187 const Extension* extension = profile->GetExtensionService()-> |
189 GetExtensionById(template_url->GetExtensionId(), false); | 188 GetExtensionById(template_url->GetExtensionId(), false); |
190 if (!extension || | 189 if (!extension || (profile->IsOffTheRecord() && |
191 (profile_->IsOffTheRecord() && | 190 !profile->GetExtensionService()->IsIncognitoEnabled(extension->id()))) |
192 !profile_->GetExtensionService()-> | |
193 IsIncognitoEnabled(extension->id()))) | |
194 return false; | 191 return false; |
195 } | 192 } |
196 | 193 |
197 keyword->assign(keyword_hint); | 194 keyword->assign(keyword_hint); |
198 return true; | 195 return true; |
199 } | 196 } |
200 | 197 |
201 void AutocompletePopupModel::Move(int count) { | 198 void AutocompletePopupModel::Move(int count) { |
202 const AutocompleteResult& result = this->result(); | 199 const AutocompleteResult& result = this->result(); |
203 if (result.empty()) | 200 if (result.empty()) |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 SetSelectedLine(selected_line, false, true); | 240 SetSelectedLine(selected_line, false, true); |
244 } | 241 } |
245 } | 242 } |
246 } | 243 } |
247 | 244 |
248 const SkBitmap* AutocompletePopupModel::GetIconIfExtensionMatch( | 245 const SkBitmap* AutocompletePopupModel::GetIconIfExtensionMatch( |
249 const AutocompleteMatch& match) const { | 246 const AutocompleteMatch& match) const { |
250 if (!match.template_url || !match.template_url->IsExtensionKeyword()) | 247 if (!match.template_url || !match.template_url->IsExtensionKeyword()) |
251 return NULL; | 248 return NULL; |
252 | 249 |
253 return &profile_->GetExtensionService()->GetOmniboxPopupIcon( | 250 return &edit_model_->profile()->GetExtensionService()->GetOmniboxPopupIcon( |
254 match.template_url->GetExtensionId()); | 251 match.template_url->GetExtensionId()); |
255 } | 252 } |
256 | 253 |
257 void AutocompletePopupModel::OnResultChanged() { | 254 void AutocompletePopupModel::OnResultChanged() { |
258 const AutocompleteResult& result = this->result(); | 255 const AutocompleteResult& result = this->result(); |
259 selected_line_ = result.default_match() == result.end() ? | 256 selected_line_ = result.default_match() == result.end() ? |
260 kNoMatch : static_cast<size_t>(result.default_match() - result.begin()); | 257 kNoMatch : static_cast<size_t>(result.default_match() - result.begin()); |
261 // There had better not be a nonempty result set with no default match. | 258 // There had better not be a nonempty result set with no default match. |
262 CHECK((selected_line_ != kNoMatch) || result.empty()); | 259 CHECK((selected_line_ != kNoMatch) || result.empty()); |
263 manually_selected_match_.Clear(); | 260 manually_selected_match_.Clear(); |
264 // If we're going to trim the window size to no longer include the hovered | 261 // If we're going to trim the window size to no longer include the hovered |
265 // line, turn hover off. Practically, this shouldn't happen, but it | 262 // line, turn hover off. Practically, this shouldn't happen, but it |
266 // doesn't hurt to be defensive. | 263 // doesn't hurt to be defensive. |
267 if ((hovered_line_ != kNoMatch) && (result.size() <= hovered_line_)) | 264 if ((hovered_line_ != kNoMatch) && (result.size() <= hovered_line_)) |
268 SetHoveredLine(kNoMatch); | 265 SetHoveredLine(kNoMatch); |
269 | 266 |
270 view_->UpdatePopupAppearance(); | 267 view_->UpdatePopupAppearance(); |
271 } | 268 } |
OLD | NEW |