Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(541)

Side by Side Diff: chrome/browser/extensions/extension_disabled_ui.cc

Issue 264763002: Support remote installation of extensions and apps. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: address comments Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 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/extensions/extension_disabled_ui.h" 5 #include "chrome/browser/extensions/extension_disabled_ui.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/lazy_instance.h" 10 #include "base/lazy_instance.h"
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 } 135 }
136 136
137 // ExtensionDisabledGlobalError ----------------------------------------------- 137 // ExtensionDisabledGlobalError -----------------------------------------------
138 138
139 class ExtensionDisabledGlobalError : public GlobalErrorWithStandardBubble, 139 class ExtensionDisabledGlobalError : public GlobalErrorWithStandardBubble,
140 public content::NotificationObserver, 140 public content::NotificationObserver,
141 public ExtensionUninstallDialog::Delegate { 141 public ExtensionUninstallDialog::Delegate {
142 public: 142 public:
143 ExtensionDisabledGlobalError(ExtensionService* service, 143 ExtensionDisabledGlobalError(ExtensionService* service,
144 const Extension* extension, 144 const Extension* extension,
145 bool is_remote_install,
145 const gfx::Image& icon); 146 const gfx::Image& icon);
146 virtual ~ExtensionDisabledGlobalError(); 147 virtual ~ExtensionDisabledGlobalError();
147 148
148 // GlobalError implementation. 149 // GlobalError implementation.
149 virtual Severity GetSeverity() OVERRIDE; 150 virtual Severity GetSeverity() OVERRIDE;
150 virtual bool HasMenuItem() OVERRIDE; 151 virtual bool HasMenuItem() OVERRIDE;
151 virtual int MenuItemCommandID() OVERRIDE; 152 virtual int MenuItemCommandID() OVERRIDE;
152 virtual base::string16 MenuItemLabel() OVERRIDE; 153 virtual base::string16 MenuItemLabel() OVERRIDE;
153 virtual void ExecuteMenuItem(Browser* browser) OVERRIDE; 154 virtual void ExecuteMenuItem(Browser* browser) OVERRIDE;
154 virtual gfx::Image GetBubbleViewIcon() OVERRIDE; 155 virtual gfx::Image GetBubbleViewIcon() OVERRIDE;
(...skipping 10 matching lines...) Expand all
165 virtual void ExtensionUninstallCanceled() OVERRIDE; 166 virtual void ExtensionUninstallCanceled() OVERRIDE;
166 167
167 // content::NotificationObserver implementation. 168 // content::NotificationObserver implementation.
168 virtual void Observe(int type, 169 virtual void Observe(int type,
169 const content::NotificationSource& source, 170 const content::NotificationSource& source,
170 const content::NotificationDetails& details) OVERRIDE; 171 const content::NotificationDetails& details) OVERRIDE;
171 172
172 private: 173 private:
173 ExtensionService* service_; 174 ExtensionService* service_;
174 const Extension* extension_; 175 const Extension* extension_;
176 bool is_remote_install_;
175 gfx::Image icon_; 177 gfx::Image icon_;
176 178
177 // How the user responded to the error; used for metrics. 179 // How the user responded to the error; used for metrics.
178 enum UserResponse { 180 enum UserResponse {
179 IGNORED, 181 IGNORED,
180 REENABLE, 182 REENABLE,
181 UNINSTALL, 183 UNINSTALL,
182 EXTENSION_DISABLED_UI_BUCKET_BOUNDARY 184 EXTENSION_DISABLED_UI_BUCKET_BOUNDARY
183 }; 185 };
184 UserResponse user_response_; 186 UserResponse user_response_;
185 187
186 scoped_ptr<ExtensionUninstallDialog> uninstall_dialog_; 188 scoped_ptr<ExtensionUninstallDialog> uninstall_dialog_;
187 189
188 // Menu command ID assigned for this extension's error. 190 // Menu command ID assigned for this extension's error.
189 int menu_command_id_; 191 int menu_command_id_;
190 192
191 content::NotificationRegistrar registrar_; 193 content::NotificationRegistrar registrar_;
192 }; 194 };
193 195
194 // TODO(yoz): create error at startup for disabled extensions. 196 // TODO(yoz): create error at startup for disabled extensions.
195 ExtensionDisabledGlobalError::ExtensionDisabledGlobalError( 197 ExtensionDisabledGlobalError::ExtensionDisabledGlobalError(
196 ExtensionService* service, 198 ExtensionService* service,
197 const Extension* extension, 199 const Extension* extension,
200 bool is_remote_install,
198 const gfx::Image& icon) 201 const gfx::Image& icon)
199 : service_(service), 202 : service_(service),
200 extension_(extension), 203 extension_(extension),
204 is_remote_install_(is_remote_install),
201 icon_(icon), 205 icon_(icon),
202 user_response_(IGNORED), 206 user_response_(IGNORED),
203 menu_command_id_(GetMenuCommandID()) { 207 menu_command_id_(GetMenuCommandID()) {
204 if (icon_.IsEmpty()) { 208 if (icon_.IsEmpty()) {
205 icon_ = gfx::Image( 209 icon_ = gfx::Image(
206 gfx::ImageSkiaOperations::CreateResizedImage( 210 gfx::ImageSkiaOperations::CreateResizedImage(
207 extension_->is_app() ? 211 extension_->is_app() ?
208 extensions::util::GetDefaultAppIcon() : 212 extensions::util::GetDefaultAppIcon() :
209 extensions::util::GetDefaultExtensionIcon(), 213 extensions::util::GetDefaultExtensionIcon(),
210 skia::ImageOperations::RESIZE_BEST, 214 skia::ImageOperations::RESIZE_BEST,
211 gfx::Size(kIconSize, kIconSize))); 215 gfx::Size(kIconSize, kIconSize)));
212 } 216 }
213 registrar_.Add(this, 217 registrar_.Add(this,
214 chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED, 218 chrome::NOTIFICATION_EXTENSION_LOADED_DEPRECATED,
215 content::Source<Profile>(service->profile())); 219 content::Source<Profile>(service->profile()));
216 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_REMOVED, 220 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_REMOVED,
217 content::Source<Profile>(service->profile())); 221 content::Source<Profile>(service->profile()));
218 } 222 }
219 223
220 ExtensionDisabledGlobalError::~ExtensionDisabledGlobalError() { 224 ExtensionDisabledGlobalError::~ExtensionDisabledGlobalError() {
221 ReleaseMenuCommandID(menu_command_id_); 225 ReleaseMenuCommandID(menu_command_id_);
222 UMA_HISTOGRAM_ENUMERATION("Extensions.DisabledUIUserResponse", 226 if (is_remote_install_) {
223 user_response_, 227 UMA_HISTOGRAM_ENUMERATION("Extensions.DisabledUIUserResponseRemoteInstall",
224 EXTENSION_DISABLED_UI_BUCKET_BOUNDARY); 228 user_response_,
229 EXTENSION_DISABLED_UI_BUCKET_BOUNDARY);
230 } else {
231 UMA_HISTOGRAM_ENUMERATION("Extensions.DisabledUIUserResponse",
232 user_response_,
233 EXTENSION_DISABLED_UI_BUCKET_BOUNDARY);
234 }
225 } 235 }
226 236
227 GlobalError::Severity ExtensionDisabledGlobalError::GetSeverity() { 237 GlobalError::Severity ExtensionDisabledGlobalError::GetSeverity() {
228 return SEVERITY_LOW; 238 return SEVERITY_LOW;
229 } 239 }
230 240
231 bool ExtensionDisabledGlobalError::HasMenuItem() { 241 bool ExtensionDisabledGlobalError::HasMenuItem() {
232 return true; 242 return true;
233 } 243 }
234 244
235 int ExtensionDisabledGlobalError::MenuItemCommandID() { 245 int ExtensionDisabledGlobalError::MenuItemCommandID() {
236 return menu_command_id_; 246 return menu_command_id_;
237 } 247 }
238 248
239 base::string16 ExtensionDisabledGlobalError::MenuItemLabel() { 249 base::string16 ExtensionDisabledGlobalError::MenuItemLabel() {
240 return l10n_util::GetStringFUTF16(IDS_EXTENSION_DISABLED_ERROR_TITLE, 250 if (is_remote_install_) {
241 base::UTF8ToUTF16(extension_->name())); 251 return l10n_util::GetStringFUTF16(
252 IDS_EXTENSION_DISABLED_REMOTE_INSTALL_ERROR_TITLE,
253 base::UTF8ToUTF16(extension_->name()));
254 } else {
255 return l10n_util::GetStringFUTF16(IDS_EXTENSION_DISABLED_ERROR_TITLE,
256 base::UTF8ToUTF16(extension_->name()));
257 }
242 } 258 }
243 259
244 void ExtensionDisabledGlobalError::ExecuteMenuItem(Browser* browser) { 260 void ExtensionDisabledGlobalError::ExecuteMenuItem(Browser* browser) {
245 ShowBubbleView(browser); 261 ShowBubbleView(browser);
246 } 262 }
247 263
248 gfx::Image ExtensionDisabledGlobalError::GetBubbleViewIcon() { 264 gfx::Image ExtensionDisabledGlobalError::GetBubbleViewIcon() {
249 return icon_; 265 return icon_;
250 } 266 }
251 267
252 base::string16 ExtensionDisabledGlobalError::GetBubbleViewTitle() { 268 base::string16 ExtensionDisabledGlobalError::GetBubbleViewTitle() {
253 return l10n_util::GetStringFUTF16(IDS_EXTENSION_DISABLED_ERROR_TITLE, 269 if (is_remote_install_) {
254 base::UTF8ToUTF16(extension_->name())); 270 return l10n_util::GetStringFUTF16(
271 IDS_EXTENSION_DISABLED_REMOTE_INSTALL_ERROR_TITLE,
272 base::UTF8ToUTF16(extension_->name()));
273 } else {
274 return l10n_util::GetStringFUTF16(IDS_EXTENSION_DISABLED_ERROR_TITLE,
275 base::UTF8ToUTF16(extension_->name()));
276 }
255 } 277 }
256 278
257 std::vector<base::string16> 279 std::vector<base::string16>
258 ExtensionDisabledGlobalError::GetBubbleViewMessages() { 280 ExtensionDisabledGlobalError::GetBubbleViewMessages() {
259 std::vector<base::string16> messages; 281 std::vector<base::string16> messages;
260 messages.push_back(l10n_util::GetStringFUTF16(
261 extension_->is_app() ?
262 IDS_APP_DISABLED_ERROR_LABEL : IDS_EXTENSION_DISABLED_ERROR_LABEL,
263 base::UTF8ToUTF16(extension_->name())));
264 messages.push_back(l10n_util::GetStringUTF16(
265 IDS_EXTENSION_PROMPT_WILL_NOW_HAVE_ACCESS_TO));
266 std::vector<base::string16> permission_warnings = 282 std::vector<base::string16> permission_warnings =
267 extensions::PermissionMessageProvider::Get()->GetWarningMessages( 283 extensions::PermissionMessageProvider::Get()->GetWarningMessages(
268 extension_->GetActivePermissions(), extension_->GetType()); 284 extension_->GetActivePermissions(), extension_->GetType());
285 if (is_remote_install_) {
286 messages.push_back(l10n_util::GetStringFUTF16(
287 extension_->is_app()
288 ? IDS_APP_DISABLED_REMOTE_INSTALL_ERROR_LABEL
289 : IDS_EXTENSION_DISABLED_REMOTE_INSTALL_ERROR_LABEL,
290 base::UTF8ToUTF16(extension_->name())));
291 if (!permission_warnings.empty())
292 messages.push_back(
293 l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_WILL_HAVE_ACCESS_TO));
294 } else {
295 messages.push_back(l10n_util::GetStringFUTF16(
296 extension_->is_app() ? IDS_APP_DISABLED_ERROR_LABEL
297 : IDS_EXTENSION_DISABLED_ERROR_LABEL,
298 base::UTF8ToUTF16(extension_->name())));
299 messages.push_back(l10n_util::GetStringUTF16(
300 IDS_EXTENSION_PROMPT_WILL_NOW_HAVE_ACCESS_TO));
301 }
269 for (size_t i = 0; i < permission_warnings.size(); ++i) { 302 for (size_t i = 0; i < permission_warnings.size(); ++i) {
270 messages.push_back(l10n_util::GetStringFUTF16( 303 messages.push_back(l10n_util::GetStringFUTF16(
271 IDS_EXTENSION_PERMISSION_LINE, permission_warnings[i])); 304 IDS_EXTENSION_PERMISSION_LINE, permission_warnings[i]));
272 } 305 }
273 return messages; 306 return messages;
274 } 307 }
275 308
276 base::string16 ExtensionDisabledGlobalError::GetBubbleViewAcceptButtonLabel() { 309 base::string16 ExtensionDisabledGlobalError::GetBubbleViewAcceptButtonLabel() {
277 return l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_RE_ENABLE_BUTTON); 310 if (is_remote_install_) {
311 return l10n_util::GetStringUTF16(
312 IDS_EXTENSION_PROMPT_REMOTE_INSTALL_BUTTON);
313 } else {
314 return l10n_util::GetStringUTF16(IDS_EXTENSION_PROMPT_RE_ENABLE_BUTTON);
meacer 2014/05/15 00:01:10 nit: might want to use return is_remote_install_
315 }
278 } 316 }
279 317
280 base::string16 ExtensionDisabledGlobalError::GetBubbleViewCancelButtonLabel() { 318 base::string16 ExtensionDisabledGlobalError::GetBubbleViewCancelButtonLabel() {
281 return l10n_util::GetStringUTF16(IDS_EXTENSIONS_UNINSTALL); 319 return l10n_util::GetStringUTF16(IDS_EXTENSIONS_UNINSTALL);
282 } 320 }
283 321
284 void ExtensionDisabledGlobalError::OnBubbleViewDidClose(Browser* browser) { 322 void ExtensionDisabledGlobalError::OnBubbleViewDidClose(Browser* browser) {
285 } 323 }
286 324
287 void ExtensionDisabledGlobalError::BubbleViewAcceptButtonPressed( 325 void ExtensionDisabledGlobalError::BubbleViewAcceptButtonPressed(
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 user_response_ = UNINSTALL; 370 user_response_ = UNINSTALL;
333 delete this; 371 delete this;
334 } 372 }
335 373
336 // Globals -------------------------------------------------------------------- 374 // Globals --------------------------------------------------------------------
337 375
338 namespace extensions { 376 namespace extensions {
339 377
340 void AddExtensionDisabledErrorWithIcon(base::WeakPtr<ExtensionService> service, 378 void AddExtensionDisabledErrorWithIcon(base::WeakPtr<ExtensionService> service,
341 const std::string& extension_id, 379 const std::string& extension_id,
380 bool is_remote_install,
342 const gfx::Image& icon) { 381 const gfx::Image& icon) {
343 if (!service.get()) 382 if (!service.get())
344 return; 383 return;
345 const Extension* extension = service->GetInstalledExtension(extension_id); 384 const Extension* extension = service->GetInstalledExtension(extension_id);
346 if (extension) { 385 if (extension) {
347 GlobalErrorServiceFactory::GetForProfile(service->profile()) 386 GlobalErrorServiceFactory::GetForProfile(service->profile())
348 ->AddGlobalError( 387 ->AddGlobalError(new ExtensionDisabledGlobalError(
349 new ExtensionDisabledGlobalError(service.get(), extension, icon)); 388 service.get(), extension, is_remote_install, icon));
350 } 389 }
351 } 390 }
352 391
353 void AddExtensionDisabledError(ExtensionService* service, 392 void AddExtensionDisabledError(ExtensionService* service,
354 const Extension* extension) { 393 const Extension* extension,
394 bool is_remote_install) {
355 // Do not display notifications for ephemeral apps that have been disabled. 395 // Do not display notifications for ephemeral apps that have been disabled.
356 // Instead, a prompt will be shown the next time the app is launched. 396 // Instead, a prompt will be shown the next time the app is launched.
357 if (extension->is_ephemeral()) 397 if (extension->is_ephemeral())
358 return; 398 return;
359 399
360 extensions::ExtensionResource image = extensions::IconsInfo::GetIconResource( 400 extensions::ExtensionResource image = extensions::IconsInfo::GetIconResource(
361 extension, kIconSize, ExtensionIconSet::MATCH_BIGGER); 401 extension, kIconSize, ExtensionIconSet::MATCH_BIGGER);
362 gfx::Size size(kIconSize, kIconSize); 402 gfx::Size size(kIconSize, kIconSize);
363 ImageLoader::Get(service->profile())->LoadImageAsync( 403 ImageLoader::Get(service->profile())
364 extension, image, size, 404 ->LoadImageAsync(extension,
365 base::Bind(&AddExtensionDisabledErrorWithIcon, 405 image,
366 service->AsWeakPtr(), extension->id())); 406 size,
407 base::Bind(&AddExtensionDisabledErrorWithIcon,
408 service->AsWeakPtr(),
409 extension->id(),
410 is_remote_install));
367 } 411 }
368 412
369 void ShowExtensionDisabledDialog(ExtensionService* service, 413 void ShowExtensionDisabledDialog(ExtensionService* service,
370 content::WebContents* web_contents, 414 content::WebContents* web_contents,
371 const Extension* extension) { 415 const Extension* extension) {
372 scoped_ptr<ExtensionInstallPrompt> install_ui( 416 scoped_ptr<ExtensionInstallPrompt> install_ui(
373 new ExtensionInstallPrompt(web_contents)); 417 new ExtensionInstallPrompt(web_contents));
374 // This object manages its own lifetime. 418 // This object manages its own lifetime.
375 new ExtensionDisabledDialogDelegate(service, install_ui.Pass(), extension); 419 new ExtensionDisabledDialogDelegate(service, install_ui.Pass(), extension);
376 } 420 }
377 421
378 } // namespace extensions 422 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698