OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "chrome/browser/ui/intents/web_intent_picker_model.h" | |
6 | |
7 #include <algorithm> | |
8 | |
9 #include "base/logging.h" | |
10 #include "base/stl_util.h" | |
11 #include "chrome/browser/download/download_item_model.h" | |
12 #include "chrome/browser/ui/intents/web_intent_picker_model_observer.h" | |
13 #include "content/public/browser/download_item.h" | |
14 #include "grit/generated_resources.h" | |
15 #include "grit/ui_resources.h" | |
16 #include "ui/base/l10n/l10n_util.h" | |
17 #include "ui/base/resource/resource_bundle.h" | |
18 #include "ui/gfx/image/image.h" | |
19 | |
20 namespace { | |
21 | |
22 const size_t kMaxSuggestionCount = 5; // Maximum number of visible suggestions. | |
23 | |
24 } // namespace | |
25 | |
26 WebIntentPickerModel::WebIntentPickerModel() | |
27 : observer_(NULL), | |
28 waiting_for_suggestions_(true), | |
29 pending_extension_install_download_progress_(0), | |
30 pending_extension_install_delegate_(NULL), | |
31 show_use_another_service_(true) { | |
32 } | |
33 | |
34 WebIntentPickerModel::~WebIntentPickerModel() { | |
35 DestroyAll(); | |
36 } | |
37 | |
38 void WebIntentPickerModel::AddInstalledService( | |
39 const string16& title, | |
40 const GURL& url, | |
41 webkit_glue::WebIntentServiceData::Disposition disposition) { | |
42 // TODO(groby): Revisit to remove O(n^2) complexity. | |
43 for (size_t i = 0; i < installed_services_.size(); ++i) { | |
44 InstalledService* service = installed_services_[i]; | |
45 if (service->title == title && service->url == url && | |
46 service->disposition == disposition) | |
47 return; | |
48 } | |
49 installed_services_.push_back(new InstalledService(title, url, disposition)); | |
50 if (observer_) | |
51 observer_->OnModelChanged(this); | |
52 } | |
53 | |
54 void WebIntentPickerModel::RemoveInstalledServiceAt(size_t index) { | |
55 DCHECK_LT(index, installed_services_.size()); | |
56 InstalledService* service = installed_services_[index]; | |
57 installed_services_.erase(installed_services_.begin() + index); | |
58 delete service; | |
59 if (observer_) | |
60 observer_->OnModelChanged(this); | |
61 } | |
62 | |
63 void WebIntentPickerModel::Clear() { | |
64 DestroyAll(); | |
65 action_.clear(); | |
66 type_.clear(); | |
67 inline_disposition_url_ = GURL::EmptyGURL(); | |
68 waiting_for_suggestions_ = true; | |
69 ClearPendingExtensionInstall(); | |
70 if (observer_) | |
71 observer_->OnModelChanged(this); | |
72 } | |
73 | |
74 const WebIntentPickerModel::InstalledService& | |
75 WebIntentPickerModel::GetInstalledServiceAt(size_t index) const { | |
76 DCHECK_LT(index, installed_services_.size()); | |
77 return *installed_services_[index]; | |
78 } | |
79 | |
80 const WebIntentPickerModel::InstalledService* | |
81 WebIntentPickerModel::GetInstalledServiceWithURL(const GURL& url) const { | |
82 for (size_t i = 0; i < installed_services_.size(); ++i) { | |
83 InstalledService* service = installed_services_[i]; | |
84 if (service->url == url) | |
85 return service; | |
86 } | |
87 return NULL; | |
88 } | |
89 | |
90 size_t WebIntentPickerModel::GetInstalledServiceCount() const { | |
91 return installed_services_.size(); | |
92 } | |
93 | |
94 void WebIntentPickerModel::UpdateFaviconForServiceWithURL( | |
95 const GURL& url, const gfx::Image& image) { | |
96 for (size_t i = 0; i < installed_services_.size(); ++i) { | |
97 InstalledService* service = installed_services_[i]; | |
98 if (service->url == url) { | |
99 service->favicon = image; | |
100 if (observer_) | |
101 observer_->OnFaviconChanged(this, i); | |
102 return; | |
103 } | |
104 } | |
105 NOTREACHED(); // Calling this with an invalid URL is not allowed. | |
106 } | |
107 | |
108 void WebIntentPickerModel::AddSuggestedExtensions( | |
109 const std::vector<SuggestedExtension>& suggestions) { | |
110 suggested_extensions_.insert(suggested_extensions_.end(), | |
111 suggestions.begin(), | |
112 suggestions.end()); | |
113 if (observer_) | |
114 observer_->OnModelChanged(this); | |
115 } | |
116 | |
117 void WebIntentPickerModel::RemoveSuggestedExtension(const std::string& id) { | |
118 std::vector<SuggestedExtension>::iterator it; | |
119 for (it = suggested_extensions_.begin(); | |
120 it < suggested_extensions_.end(); | |
121 ++it) { | |
122 SuggestedExtension extension = *it; | |
123 if (extension.id == id) { | |
124 suggested_extensions_.erase(it); | |
125 break; | |
126 } | |
127 } | |
128 } | |
129 | |
130 const WebIntentPickerModel::SuggestedExtension& | |
131 WebIntentPickerModel::GetSuggestedExtensionAt(size_t index) const { | |
132 DCHECK_LT(index, suggested_extensions_.size()); | |
133 return suggested_extensions_[index]; | |
134 } | |
135 | |
136 const WebIntentPickerModel::SuggestedExtension* | |
137 WebIntentPickerModel::GetSuggestedExtensionWithId( | |
138 const std::string& id) const { | |
139 for (size_t i = 0; i < suggested_extensions_.size(); ++i) { | |
140 const SuggestedExtension* extension = &suggested_extensions_[i]; | |
141 if (extension->id == id) | |
142 return extension; | |
143 } | |
144 return NULL; | |
145 } | |
146 | |
147 size_t WebIntentPickerModel::GetSuggestedExtensionCount() const { | |
148 return std::min(suggested_extensions_.size(), kMaxSuggestionCount); | |
149 } | |
150 | |
151 string16 WebIntentPickerModel::GetSuggestionsLinkText() const { | |
152 if (suggested_extensions_.size() <= kMaxSuggestionCount) | |
153 return string16(); | |
154 | |
155 return l10n_util::GetStringUTF16(GetInstalledServiceCount() == 0 ? | |
156 IDS_INTENT_PICKER_GET_MORE_SERVICES_NONE_INSTALLED : | |
157 IDS_INTENT_PICKER_GET_MORE_SERVICES); | |
158 } | |
159 | |
160 void WebIntentPickerModel::SetSuggestedExtensionIconWithId( | |
161 const std::string& id, | |
162 const gfx::Image& image) { | |
163 for (size_t i = 0; i < suggested_extensions_.size(); ++i) { | |
164 SuggestedExtension& extension = suggested_extensions_[i]; | |
165 if (extension.id == id) { | |
166 extension.icon = image; | |
167 | |
168 if (observer_) | |
169 observer_->OnExtensionIconChanged(this, extension.id); | |
170 break; | |
171 } | |
172 } | |
173 } | |
174 | |
175 void WebIntentPickerModel::SetInlineDisposition(const GURL& url) { | |
176 inline_disposition_url_ = url; | |
177 if (!observer_) | |
178 return; | |
179 | |
180 if (url.is_empty()) { | |
181 observer_->OnModelChanged(this); | |
182 } else { | |
183 const InstalledService* service = GetInstalledServiceWithURL(url); | |
184 DCHECK(service); | |
185 observer_->OnInlineDisposition(service->title, url); | |
186 } | |
187 } | |
188 | |
189 bool WebIntentPickerModel::IsInlineDisposition() const { | |
190 return !inline_disposition_url_.is_empty(); | |
191 } | |
192 | |
193 bool WebIntentPickerModel::IsWaitingForSuggestions() const { | |
194 return waiting_for_suggestions_; | |
195 } | |
196 | |
197 void WebIntentPickerModel::SetWaitingForSuggestions(bool waiting) { | |
198 waiting_for_suggestions_ = waiting; | |
199 if (observer_) | |
200 observer_->OnModelChanged(this); | |
201 } | |
202 | |
203 void WebIntentPickerModel::SetPendingExtensionInstallId(const std::string& id) { | |
204 pending_extension_install_id_ = id; | |
205 if (observer_) | |
206 observer_->OnModelChanged(this); | |
207 } | |
208 | |
209 void WebIntentPickerModel::UpdateExtensionDownloadState( | |
210 content::DownloadItem* item) { | |
211 pending_extension_install_download_progress_ = item->PercentComplete(); | |
212 DownloadItemModel download_model(item); | |
213 pending_extension_install_status_string_ = download_model.GetStatusText(); | |
214 if (observer_) | |
215 observer_->OnModelChanged(this); | |
216 } | |
217 | |
218 void WebIntentPickerModel::SetPendingExtensionInstallDownloadProgress( | |
219 int progress) { | |
220 pending_extension_install_download_progress_ = progress; | |
221 if (observer_) | |
222 observer_->OnModelChanged(this); | |
223 } | |
224 | |
225 void WebIntentPickerModel::SetPendingExtensionInstallStatusString( | |
226 const string16& status) { | |
227 pending_extension_install_status_string_ = status; | |
228 if (observer_) | |
229 observer_->OnModelChanged(this); | |
230 } | |
231 | |
232 void WebIntentPickerModel::SetPendingExtensionInstallDelegate( | |
233 ExtensionInstallPrompt::Delegate* delegate) { | |
234 pending_extension_install_delegate_ = delegate; | |
235 if (observer_) | |
236 observer_->OnModelChanged(this); | |
237 } | |
238 | |
239 void WebIntentPickerModel::SetPendingExtensionInstallPrompt( | |
240 const ExtensionInstallPrompt::Prompt& prompt) { | |
241 pending_extension_install_prompt_.reset( | |
242 new ExtensionInstallPrompt::Prompt(prompt)); | |
243 if (observer_) | |
244 observer_->OnModelChanged(this); | |
245 } | |
246 | |
247 void WebIntentPickerModel::ClearPendingExtensionInstall() { | |
248 pending_extension_install_id_.clear(); | |
249 pending_extension_install_download_progress_ = 0; | |
250 pending_extension_install_status_string_.clear(); | |
251 pending_extension_install_delegate_ = NULL; | |
252 pending_extension_install_prompt_.reset(); | |
253 if (observer_) | |
254 observer_->OnModelChanged(this); | |
255 } | |
256 | |
257 void WebIntentPickerModel::DestroyAll() { | |
258 STLDeleteElements(&installed_services_); | |
259 } | |
260 | |
261 WebIntentPickerModel::InstalledService::InstalledService( | |
262 const string16& title, | |
263 const GURL& url, | |
264 webkit_glue::WebIntentServiceData::Disposition disposition) | |
265 : title(title), | |
266 url(url), | |
267 favicon(ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( | |
268 IDR_DEFAULT_FAVICON)), | |
269 disposition(disposition) { | |
270 } | |
271 | |
272 WebIntentPickerModel::InstalledService::~InstalledService() { | |
273 } | |
274 | |
275 WebIntentPickerModel::SuggestedExtension::SuggestedExtension( | |
276 const string16& title, | |
277 const std::string& id, | |
278 double average_rating) | |
279 : title(title), | |
280 id(id), | |
281 average_rating(average_rating), | |
282 icon(ui::ResourceBundle::GetSharedInstance().GetNativeImageNamed( | |
283 IDR_DEFAULT_FAVICON)) { | |
284 } | |
285 | |
286 WebIntentPickerModel::SuggestedExtension::~SuggestedExtension() { | |
287 } | |
OLD | NEW |