external_install_ui.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/external_install_ui.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/app/chrome_command_ids.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_install_prompt.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_install_ui.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_uninstall_dialog.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/global_error/global_error_service_factory.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_notification_types.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kMenuCommandId = IDC_EXTERNAL_EXTENSION_ALERT;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ExternalInstallDialogDelegate --------------------------------------------
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(mpcomplete): Get rid of the refcounting on this class, or document
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// why it's necessary. Will do after refactoring to merge back with
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ExtensionDisabledDialogDelegate.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExternalInstallDialogDelegate
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ExtensionInstallPrompt::Delegate,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      public base::RefCountedThreadSafe<ExternalInstallDialogDelegate> {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExternalInstallDialogDelegate(Browser* browser,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                ExtensionService* service,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const Extension* extension);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class base::RefCountedThreadSafe<ExternalInstallDialogDelegate>;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExternalInstallDialogDelegate();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionInstallPrompt::Delegate:
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InstallUIProceed() OVERRIDE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void InstallUIAbort(bool user_initiated) OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The UI for showing the install dialog when enabling.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionInstallPrompt> install_ui_;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionService* service_;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExternalInstallDialogDelegate::ExternalInstallDialogDelegate(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionService* service,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : service_(service), extension_(extension) {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddRef();  // Balanced in Proceed or Abort.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_.reset(
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ExtensionInstallUI::CreateInstallPromptWithBrowser(browser));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  install_ui_->ConfirmExternalInstall(this, extension_);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExternalInstallDialogDelegate::~ExternalInstallDialogDelegate() {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalInstallDialogDelegate::InstallUIProceed() {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service_->GrantPermissionsAndEnableExtension(
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_, install_ui_->record_oauth2_grant());
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Release();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalInstallDialogDelegate::InstallUIAbort(bool user_initiated) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service_->UninstallExtension(extension_->id(), false, NULL);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Release();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void ShowExternalInstallDialog(ExtensionService* service,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      Browser* browser,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      const Extension* extension) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This object manages its own lifetime.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  new ExternalInstallDialogDelegate(browser, service, extension);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ExternalInstallGlobalError -----------------------------------------------
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExternalInstallGlobalError : public GlobalError,
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   public content::NotificationObserver {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExternalInstallGlobalError(ExtensionService* service,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const Extension* extension);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExternalInstallGlobalError();
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension() const { return extension_; }
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // GlobalError implementation.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasBadge() OVERRIDE;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int GetBadgeResourceID() OVERRIDE;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasMenuItem() OVERRIDE;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int MenuItemCommandID() OVERRIDE;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 MenuItemLabel() OVERRIDE;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual int MenuItemIconResourceID() OVERRIDE;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ExecuteMenuItem(Browser* browser) OVERRIDE;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HasBubbleView() OVERRIDE;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetBubbleViewTitle() OVERRIDE;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetBubbleViewMessage() OVERRIDE;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetBubbleViewAcceptButtonLabel() OVERRIDE;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual string16 GetBubbleViewCancelButtonLabel() OVERRIDE;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnBubbleViewDidClose(Browser* browser) OVERRIDE;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BubbleViewAcceptButtonPressed(Browser* browser) OVERRIDE;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void BubbleViewCancelButtonPressed(Browser* browser) OVERRIDE;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::NotificationObserver implementation.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Observe(int type,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationSource& source,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionService* service_;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension_;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::NotificationRegistrar registrar_;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExternalInstallGlobalError::ExternalInstallGlobalError(
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionService* service,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const Extension* extension)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : service_(service),
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      extension_(extension) {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::Source<Profile>(service->profile()));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::Source<Profile>(service->profile()));
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExternalInstallGlobalError::~ExternalInstallGlobalError() {
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExternalInstallGlobalError::HasBadge() {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ExternalInstallGlobalError::GetBadgeResourceID() {
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IDR_UPDATE_BADGE_EXTENSION;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExternalInstallGlobalError::HasMenuItem() {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ExternalInstallGlobalError::MenuItemCommandID() {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kMenuCommandId;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ExternalInstallGlobalError::MenuItemIconResourceID() {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IDR_UPDATE_MENU_EXTENSION;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExternalInstallGlobalError::MenuItemLabel() {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int id = -1;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extension_->is_app())
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    id = IDS_EXTENSION_EXTERNAL_INSTALL_ALERT_APP;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (extension_->is_theme())
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    id = IDS_EXTENSION_EXTERNAL_INSTALL_ALERT_THEME;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    id = IDS_EXTENSION_EXTERNAL_INSTALL_ALERT_EXTENSION;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringFUTF16(id, UTF8ToUTF16(extension_->name()));
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalInstallGlobalError::ExecuteMenuItem(Browser* browser) {
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShowExternalInstallDialog(service_, browser, extension_);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExternalInstallGlobalError::HasBubbleView() {
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExternalInstallGlobalError::GetBubbleViewTitle() {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return string16();
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExternalInstallGlobalError::GetBubbleViewMessage() {
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return string16();
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExternalInstallGlobalError::GetBubbleViewAcceptButtonLabel() {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return string16();
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)string16 ExternalInstallGlobalError::GetBubbleViewCancelButtonLabel() {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return string16();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalInstallGlobalError::OnBubbleViewDidClose(Browser* browser) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalInstallGlobalError::BubbleViewAcceptButtonPressed(
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser) {
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalInstallGlobalError::BubbleViewCancelButtonPressed(
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Browser* browser) {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExternalInstallGlobalError::Observe(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationSource& source,
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::NotificationDetails& details) {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Extension* extension = NULL;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The error is invalidated if the extension has been reloaded or unloaded.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type == chrome::NOTIFICATION_EXTENSION_LOADED) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = content::Details<const Extension>(details).ptr();
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK_EQ(chrome::NOTIFICATION_EXTENSION_UNLOADED, type);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extensions::UnloadedExtensionInfo* info =
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        content::Details<extensions::UnloadedExtensionInfo>(details).ptr();
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    extension = info->extension;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (extension == extension_) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GlobalErrorService* error_service =
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        GlobalErrorServiceFactory::GetForProfile(service_->profile());
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_service->RemoveGlobalError(this);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    service_->AcknowledgeExternalExtension(extension_->id());
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete this;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Public interface ---------------------------------------------------------
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AddExternalInstallError(ExtensionService* service,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const Extension* extension) {
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalErrorService* error_service =
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GlobalErrorServiceFactory::GetForProfile(service->profile());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalError* error = error_service->GetGlobalErrorByMenuItemCommandID(
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kMenuCommandId);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  error_service->AddGlobalError(
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new ExternalInstallGlobalError(service, extension));
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RemoveExternalInstallError(ExtensionService* service) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalErrorService* error_service =
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GlobalErrorServiceFactory::GetForProfile(service->profile());
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalError* error = error_service->GetGlobalErrorByMenuItemCommandID(
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kMenuCommandId);
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (error) {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    error_service->RemoveGlobalError(error);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete error;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasExternalInstallError(ExtensionService* service) {
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalErrorService* error_service =
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GlobalErrorServiceFactory::GetForProfile(service->profile());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalError* error = error_service->GetGlobalErrorByMenuItemCommandID(
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kMenuCommandId);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !!error;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
284