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