blob: abcf8e936eb8a85045b65f02cd22c5884727850f [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"
deepak.m14ba69e62015-11-17 05:42:1212#include "extensions/browser/extension_system.h"
[email protected]234fc5ff2014-01-16 23:32:2813#include "extensions/browser/pref_names.h"
[email protected]67e0a262013-03-15 13:14:4914
[email protected]ef9d2742013-02-26 12:48:3515namespace extensions {
16
[email protected]6d6579a2014-07-30 14:24:1317InstallTracker::InstallTracker(content::BrowserContext* browser_context,
Evan Stade75872a62019-09-06 21:17:3818 extensions::ExtensionPrefs* prefs) {
[email protected]8c179032014-03-20 22:49:1019 registrar_.Add(this,
[email protected]adf5a102014-07-31 12:44:0620 extensions::NOTIFICATION_EXTENSION_UPDATE_DISABLED,
[email protected]6d6579a2014-07-30 14:24:1321 content::Source<content::BrowserContext>(browser_context));
[email protected]6d6579a2014-07-30 14:24:1322 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context));
[email protected]67e0a262013-03-15 13:14:4923
[email protected]773272b2014-07-18 05:48:3524 // Prefs may be null in tests.
25 if (prefs) {
deepak.m14ba69e62015-11-17 05:42:1226 AppSorting* sorting = ExtensionSystem::Get(browser_context)->app_sorting();
[email protected]773272b2014-07-18 05:48:3527 registrar_.Add(this,
[email protected]adf5a102014-07-31 12:44:0628 chrome::NOTIFICATION_APP_LAUNCHER_REORDERED,
[email protected]773272b2014-07-18 05:48:3529 content::Source<AppSorting>(sorting));
30 pref_change_registrar_.Init(prefs->pref_service());
31 pref_change_registrar_.Add(
32 pref_names::kExtensions,
33 base::Bind(&InstallTracker::OnAppsReordered, base::Unretained(this)));
34 }
[email protected]ef9d2742013-02-26 12:48:3535}
36
37InstallTracker::~InstallTracker() {
38}
39
[email protected]90878c52014-04-04 18:21:0240// static
41InstallTracker* InstallTracker::Get(content::BrowserContext* context) {
[email protected]6d6579a2014-07-30 14:24:1342 return InstallTrackerFactory::GetForBrowserContext(context);
[email protected]90878c52014-04-04 18:21:0243}
44
[email protected]ef9d2742013-02-26 12:48:3545void InstallTracker::AddObserver(InstallObserver* observer) {
46 observers_.AddObserver(observer);
47}
48
49void InstallTracker::RemoveObserver(InstallObserver* observer) {
50 observers_.RemoveObserver(observer);
51}
52
[email protected]773272b2014-07-18 05:48:3553const ActiveInstallData* InstallTracker::GetActiveInstall(
54 const std::string& extension_id) const {
jdoerrie13cd648c82018-10-02 21:21:0255 auto install_data = active_installs_.find(extension_id);
[email protected]773272b2014-07-18 05:48:3556 if (install_data == active_installs_.end())
57 return NULL;
58 else
59 return &(install_data->second);
60}
61
62void InstallTracker::AddActiveInstall(const ActiveInstallData& install_data) {
63 DCHECK(!install_data.extension_id.empty());
64 DCHECK(active_installs_.find(install_data.extension_id) ==
65 active_installs_.end());
66 active_installs_.insert(
67 std::make_pair(install_data.extension_id, install_data));
68}
69
70void InstallTracker::RemoveActiveInstall(const std::string& extension_id) {
71 active_installs_.erase(extension_id);
72}
73
[email protected]ef9d2742013-02-26 12:48:3574void InstallTracker::OnBeginExtensionInstall(
[email protected]fa517d02013-11-18 09:33:0975 const InstallObserver::ExtensionInstallParams& params) {
jdoerrie13cd648c82018-10-02 21:21:0276 auto install_data = active_installs_.find(params.extension_id);
[email protected]773272b2014-07-18 05:48:3577 if (install_data == active_installs_.end()) {
78 ActiveInstallData install_data(params.extension_id);
[email protected]773272b2014-07-18 05:48:3579 active_installs_.insert(std::make_pair(params.extension_id, install_data));
80 }
81
ericwilligersb5f79de2016-10-19 04:15:1082 for (auto& observer : observers_)
83 observer.OnBeginExtensionInstall(params);
[email protected]ef9d2742013-02-26 12:48:3584}
85
[email protected]c80fe5f2014-03-26 04:36:3086void InstallTracker::OnBeginExtensionDownload(const std::string& extension_id) {
ericwilligersb5f79de2016-10-19 04:15:1087 for (auto& observer : observers_)
88 observer.OnBeginExtensionDownload(extension_id);
[email protected]c80fe5f2014-03-26 04:36:3089}
90
[email protected]ef9d2742013-02-26 12:48:3591void InstallTracker::OnDownloadProgress(const std::string& extension_id,
92 int percent_downloaded) {
jdoerrie13cd648c82018-10-02 21:21:0293 auto install_data = active_installs_.find(extension_id);
[email protected]773272b2014-07-18 05:48:3594 if (install_data != active_installs_.end()) {
95 install_data->second.percent_downloaded = percent_downloaded;
96 } else {
97 NOTREACHED();
98 }
99
ericwilligersb5f79de2016-10-19 04:15:10100 for (auto& observer : observers_)
101 observer.OnDownloadProgress(extension_id, percent_downloaded);
[email protected]ef9d2742013-02-26 12:48:35102}
103
[email protected]c80fe5f2014-03-26 04:36:30104void InstallTracker::OnBeginCrxInstall(const std::string& extension_id) {
ericwilligersb5f79de2016-10-19 04:15:10105 for (auto& observer : observers_)
106 observer.OnBeginCrxInstall(extension_id);
[email protected]c80fe5f2014-03-26 04:36:30107}
108
[email protected]73cd487c2014-04-16 05:22:50109void InstallTracker::OnFinishCrxInstall(const std::string& extension_id,
110 bool success) {
ericwilligersb5f79de2016-10-19 04:15:10111 for (auto& observer : observers_)
112 observer.OnFinishCrxInstall(extension_id, success);
[email protected]73cd487c2014-04-16 05:22:50113}
114
[email protected]ef9d2742013-02-26 12:48:35115void InstallTracker::OnInstallFailure(
116 const std::string& extension_id) {
[email protected]773272b2014-07-18 05:48:35117 RemoveActiveInstall(extension_id);
ericwilligersb5f79de2016-10-19 04:15:10118 for (auto& observer : observers_)
119 observer.OnInstallFailure(extension_id);
[email protected]ef9d2742013-02-26 12:48:35120}
121
[email protected]523352c922013-02-28 01:38:52122void InstallTracker::Shutdown() {
ericwilligersb5f79de2016-10-19 04:15:10123 for (auto& observer : observers_)
124 observer.OnShutdown();
[email protected]523352c922013-02-28 01:38:52125}
126
[email protected]67e0a262013-03-15 13:14:49127void InstallTracker::Observe(int type,
128 const content::NotificationSource& source,
129 const content::NotificationDetails& details) {
130 switch (type) {
[email protected]adf5a102014-07-31 12:44:06131 case extensions::NOTIFICATION_EXTENSION_UPDATE_DISABLED: {
[email protected]8c179032014-03-20 22:49:10132 const Extension* extension =
133 content::Details<const Extension>(details).ptr();
ericwilligersb5f79de2016-10-19 04:15:10134 for (auto& observer : observers_)
135 observer.OnDisabledExtensionUpdated(extension);
[email protected]8c179032014-03-20 22:49:10136 break;
137 }
[email protected]adf5a102014-07-31 12:44:06138 case chrome::NOTIFICATION_APP_LAUNCHER_REORDERED: {
ericwilligersb5f79de2016-10-19 04:15:10139 for (auto& observer : observers_)
140 observer.OnAppsReordered();
[email protected]67e0a262013-03-15 13:14:49141 break;
142 }
[email protected]67e0a262013-03-15 13:14:49143 default:
144 NOTREACHED();
145 }
146}
147
[email protected]773272b2014-07-18 05:48:35148void InstallTracker::OnExtensionInstalled(
149 content::BrowserContext* browser_context,
150 const Extension* extension,
151 bool is_update) {
152 RemoveActiveInstall(extension->id());
153}
154
[email protected]67e0a262013-03-15 13:14:49155void InstallTracker::OnAppsReordered() {
ericwilligersb5f79de2016-10-19 04:15:10156 for (auto& observer : observers_)
157 observer.OnAppsReordered();
[email protected]67e0a262013-03-15 13:14:49158}
159
[email protected]ef9d2742013-02-26 12:48:35160} // namespace extensions