12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/install_tracker.h"
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h"
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_prefs.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_names.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/notification_service.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions {
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InstallTracker::InstallTracker(Profile* profile,
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               extensions::ExtensionPrefs* prefs) {
17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppSorting* sorting = prefs->app_sorting();
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_INSTALLED,
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      content::Source<Profile>(profile));
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::Source<Profile>(profile));
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::Source<Profile>(profile));
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED,
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      content::Source<Profile>(profile));
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LAUNCHER_REORDERED,
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      content::Source<AppSorting>(sorting));
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_APP_INSTALLED_TO_APPLIST,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      content::Source<Profile>(profile));
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_change_registrar_.Init(prefs->pref_service());
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  pref_change_registrar_.Add(prefs::kExtensionsPref,
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             base::Bind(&InstallTracker::OnAppsReordered,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        base::Unretained(this)));
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InstallTracker::~InstallTracker() {
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstallTracker::AddObserver(InstallObserver* observer) {
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observers_.AddObserver(observer);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstallTracker::RemoveObserver(InstallObserver* observer) {
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  observers_.RemoveObserver(observer);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstallTracker::OnBeginExtensionInstall(
50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    const InstallObserver::ExtensionInstallParams& params) {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(InstallObserver, observers_,
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                    OnBeginExtensionInstall(params));
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstallTracker::OnDownloadProgress(const std::string& extension_id,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        int percent_downloaded) {
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(InstallObserver, observers_,
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    OnDownloadProgress(extension_id, percent_downloaded));
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstallTracker::OnInstallFailure(
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const std::string& extension_id) {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(InstallObserver, observers_,
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    OnInstallFailure(extension_id));
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstallTracker::Shutdown() {
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(InstallObserver, observers_, OnShutdown());
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstallTracker::Observe(int type,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const content::NotificationSource& source,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const content::NotificationDetails& details) {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case chrome::NOTIFICATION_EXTENSION_INSTALLED: {
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const Extension* extension =
779ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch          content::Details<const InstalledExtensionInfo>(details).ptr()->
789ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch              extension;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FOR_EACH_OBSERVER(InstallObserver, observers_,
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnExtensionInstalled(extension));
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case chrome::NOTIFICATION_EXTENSION_LOADED: {
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const Extension* extension =
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          content::Details<const Extension>(details).ptr();
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FOR_EACH_OBSERVER(InstallObserver, observers_,
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnExtensionLoaded(extension));
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      break;
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_EXTENSION_UNLOADED: {
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const content::Details<extensions::UnloadedExtensionInfo>& unload_info(
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          details);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const Extension* extension = unload_info->extension;
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FOR_EACH_OBSERVER(InstallObserver, observers_,
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnExtensionUnloaded(extension));
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      break;
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    }
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    case chrome::NOTIFICATION_EXTENSION_UNINSTALLED: {
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      const Extension* extension =
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          content::Details<const Extension>(details).ptr();
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      FOR_EACH_OBSERVER(InstallObserver, observers_,
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                        OnExtensionUninstalled(extension));
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_EXTENSION_LAUNCHER_REORDERED: {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FOR_EACH_OBSERVER(InstallObserver, observers_, OnAppsReordered());
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_APP_INSTALLED_TO_APPLIST: {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& extension_id(
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          *content::Details<const std::string>(details).ptr());
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      FOR_EACH_OBSERVER(InstallObserver, observers_,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        OnAppInstalledToAppList(extension_id));
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    default:
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      NOTREACHED();
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InstallTracker::OnAppsReordered() {
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FOR_EACH_OBSERVER(InstallObserver, observers_, OnAppsReordered());
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace extensions
127