blob: bda36cf8d85e14e2d77b43c3d1f2ca47bf6b00ce [file] [log] [blame]
[email protected]ef9d2742013-02-26 12:48:351// Copyright 2013 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/extensions/install_tracker.h"
6
[email protected]67e0a262013-03-15 13:14:497#include "base/bind.h"
[email protected]49a01e642013-07-12 00:29:458#include "chrome/browser/chrome_notification_types.h"
[email protected]90878c52014-04-04 18:21:029#include "chrome/browser/extensions/install_tracker_factory.h"
[email protected]67e0a262013-03-15 13:14:4910#include "content/public/browser/notification_service.h"
[email protected]489db0842014-01-22 18:20:0311#include "extensions/browser/extension_prefs.h"
[email protected]773272b2014-07-18 05:48:3512#include "extensions/browser/extension_registry.h"
deepak.m14ba69e62015-11-17 05:42:1213#include "extensions/browser/extension_system.h"
[email protected]234fc5ff2014-01-16 23:32:2814#include "extensions/browser/pref_names.h"
[email protected]67e0a262013-03-15 13:14:4915
[email protected]ef9d2742013-02-26 12:48:3516namespace extensions {
17
[email protected]6d6579a2014-07-30 14:24:1318InstallTracker::InstallTracker(content::BrowserContext* browser_context,
[email protected]773272b2014-07-18 05:48:3519 extensions::ExtensionPrefs* prefs)
20 : extension_registry_observer_(this) {
[email protected]8c179032014-03-20 22:49:1021 registrar_.Add(this,
[email protected]adf5a102014-07-31 12:44:0622 extensions::NOTIFICATION_EXTENSION_UPDATE_DISABLED,
[email protected]6d6579a2014-07-30 14:24:1323 content::Source<content::BrowserContext>(browser_context));
[email protected]6d6579a2014-07-30 14:24:1324 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context));
[email protected]67e0a262013-03-15 13:14:4925
[email protected]773272b2014-07-18 05:48:3526 // Prefs may be null in tests.
27 if (prefs) {
deepak.m14ba69e62015-11-17 05:42:1228 AppSorting* sorting = ExtensionSystem::Get(browser_context)->app_sorting();
[email protected]773272b2014-07-18 05:48:3529 registrar_.Add(this,
[email protected]adf5a102014-07-31 12:44:0630 chrome::NOTIFICATION_APP_LAUNCHER_REORDERED,
[email protected]773272b2014-07-18 05:48:3531 content::Source<AppSorting>(sorting));
32 pref_change_registrar_.Init(prefs->pref_service());
33 pref_change_registrar_.Add(
34 pref_names::kExtensions,
35 base::Bind(&InstallTracker::OnAppsReordered, base::Unretained(this)));
36 }
[email protected]ef9d2742013-02-26 12:48:3537}
38
39InstallTracker::~InstallTracker() {
40}
41
[email protected]90878c52014-04-04 18:21:0242// static
43InstallTracker* InstallTracker::Get(content::BrowserContext* context) {
[email protected]6d6579a2014-07-30 14:24:1344 return InstallTrackerFactory::GetForBrowserContext(context);
[email protected]90878c52014-04-04 18:21:0245}
46
[email protected]ef9d2742013-02-26 12:48:3547void InstallTracker::AddObserver(InstallObserver* observer) {
48 observers_.AddObserver(observer);
49}
50
51void InstallTracker::RemoveObserver(InstallObserver* observer) {
52 observers_.RemoveObserver(observer);
53}
54
[email protected]773272b2014-07-18 05:48:3555const ActiveInstallData* InstallTracker::GetActiveInstall(
56 const std::string& extension_id) const {
57 ActiveInstallsMap::const_iterator install_data =
58 active_installs_.find(extension_id);
59 if (install_data == active_installs_.end())
60 return NULL;
61 else
62 return &(install_data->second);
63}
64
65void InstallTracker::AddActiveInstall(const ActiveInstallData& install_data) {
66 DCHECK(!install_data.extension_id.empty());
67 DCHECK(active_installs_.find(install_data.extension_id) ==
68 active_installs_.end());
69 active_installs_.insert(
70 std::make_pair(install_data.extension_id, install_data));
71}
72
73void InstallTracker::RemoveActiveInstall(const std::string& extension_id) {
74 active_installs_.erase(extension_id);
75}
76
[email protected]ef9d2742013-02-26 12:48:3577void InstallTracker::OnBeginExtensionInstall(
[email protected]fa517d02013-11-18 09:33:0978 const InstallObserver::ExtensionInstallParams& params) {
[email protected]773272b2014-07-18 05:48:3579 ActiveInstallsMap::iterator install_data =
80 active_installs_.find(params.extension_id);
81 if (install_data == active_installs_.end()) {
82 ActiveInstallData install_data(params.extension_id);
[email protected]773272b2014-07-18 05:48:3583 active_installs_.insert(std::make_pair(params.extension_id, install_data));
84 }
85
ericwilligersb5f79de2016-10-19 04:15:1086 for (auto& observer : observers_)
87 observer.OnBeginExtensionInstall(params);
[email protected]ef9d2742013-02-26 12:48:3588}
89
[email protected]c80fe5f2014-03-26 04:36:3090void InstallTracker::OnBeginExtensionDownload(const std::string& extension_id) {
ericwilligersb5f79de2016-10-19 04:15:1091 for (auto& observer : observers_)
92 observer.OnBeginExtensionDownload(extension_id);
[email protected]c80fe5f2014-03-26 04:36:3093}
94
[email protected]ef9d2742013-02-26 12:48:3595void InstallTracker::OnDownloadProgress(const std::string& extension_id,
96 int percent_downloaded) {
[email protected]773272b2014-07-18 05:48:3597 ActiveInstallsMap::iterator install_data =
98 active_installs_.find(extension_id);
99 if (install_data != active_installs_.end()) {
100 install_data->second.percent_downloaded = percent_downloaded;
101 } else {
102 NOTREACHED();
103 }
104
ericwilligersb5f79de2016-10-19 04:15:10105 for (auto& observer : observers_)
106 observer.OnDownloadProgress(extension_id, percent_downloaded);
[email protected]ef9d2742013-02-26 12:48:35107}
108
[email protected]c80fe5f2014-03-26 04:36:30109void InstallTracker::OnBeginCrxInstall(const std::string& extension_id) {
ericwilligersb5f79de2016-10-19 04:15:10110 for (auto& observer : observers_)
111 observer.OnBeginCrxInstall(extension_id);
[email protected]c80fe5f2014-03-26 04:36:30112}
113
[email protected]73cd487c2014-04-16 05:22:50114void InstallTracker::OnFinishCrxInstall(const std::string& extension_id,
115 bool success) {
ericwilligersb5f79de2016-10-19 04:15:10116 for (auto& observer : observers_)
117 observer.OnFinishCrxInstall(extension_id, success);
[email protected]73cd487c2014-04-16 05:22:50118}
119
[email protected]ef9d2742013-02-26 12:48:35120void InstallTracker::OnInstallFailure(
121 const std::string& extension_id) {
[email protected]773272b2014-07-18 05:48:35122 RemoveActiveInstall(extension_id);
ericwilligersb5f79de2016-10-19 04:15:10123 for (auto& observer : observers_)
124 observer.OnInstallFailure(extension_id);
[email protected]ef9d2742013-02-26 12:48:35125}
126
[email protected]523352c922013-02-28 01:38:52127void InstallTracker::Shutdown() {
ericwilligersb5f79de2016-10-19 04:15:10128 for (auto& observer : observers_)
129 observer.OnShutdown();
[email protected]523352c922013-02-28 01:38:52130}
131
[email protected]67e0a262013-03-15 13:14:49132void InstallTracker::Observe(int type,
133 const content::NotificationSource& source,
134 const content::NotificationDetails& details) {
135 switch (type) {
[email protected]adf5a102014-07-31 12:44:06136 case extensions::NOTIFICATION_EXTENSION_UPDATE_DISABLED: {
[email protected]8c179032014-03-20 22:49:10137 const Extension* extension =
138 content::Details<const Extension>(details).ptr();
ericwilligersb5f79de2016-10-19 04:15:10139 for (auto& observer : observers_)
140 observer.OnDisabledExtensionUpdated(extension);
[email protected]8c179032014-03-20 22:49:10141 break;
142 }
[email protected]adf5a102014-07-31 12:44:06143 case chrome::NOTIFICATION_APP_LAUNCHER_REORDERED: {
ericwilligersb5f79de2016-10-19 04:15:10144 for (auto& observer : observers_)
145 observer.OnAppsReordered();
[email protected]67e0a262013-03-15 13:14:49146 break;
147 }
[email protected]67e0a262013-03-15 13:14:49148 default:
149 NOTREACHED();
150 }
151}
152
[email protected]773272b2014-07-18 05:48:35153void InstallTracker::OnExtensionInstalled(
154 content::BrowserContext* browser_context,
155 const Extension* extension,
156 bool is_update) {
157 RemoveActiveInstall(extension->id());
158}
159
[email protected]67e0a262013-03-15 13:14:49160void InstallTracker::OnAppsReordered() {
ericwilligersb5f79de2016-10-19 04:15:10161 for (auto& observer : observers_)
162 observer.OnAppsReordered();
[email protected]67e0a262013-03-15 13:14:49163}
164
[email protected]ef9d2742013-02-26 12:48:35165} // namespace extensions