Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1296)

Unified Diff: chrome/browser/extensions/install_tracker.cc

Issue 389613006: Prevent duplicate concurrent installs of the same extension (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/install_tracker.cc
diff --git a/chrome/browser/extensions/install_tracker.cc b/chrome/browser/extensions/install_tracker.cc
index 52d9115775010c339bf9f50c580724ac6457d5d7..b701dfa536ee900eaf36499dcbe439c1614a12f3 100644
--- a/chrome/browser/extensions/install_tracker.cc
+++ b/chrome/browser/extensions/install_tracker.cc
@@ -11,25 +11,40 @@
#include "chrome/common/pref_names.h"
#include "content/public/browser/notification_service.h"
#include "extensions/browser/extension_prefs.h"
+#include "extensions/browser/extension_registry.h"
#include "extensions/browser/pref_names.h"
namespace extensions {
+InstallTracker::InstallProgressData::InstallProgressData()
+ : percent_downloaded(0), is_ephemeral(false) {
+}
+
+InstallTracker::InstallProgressData::InstallProgressData(
+ const std::string& extension_id)
+ : extension_id(extension_id), percent_downloaded(0), is_ephemeral(false) {
+}
+
InstallTracker::InstallTracker(Profile* profile,
- extensions::ExtensionPrefs* prefs) {
+ extensions::ExtensionPrefs* prefs)
+ : extension_registry_observer_(this) {
registrar_.Add(this,
chrome::NOTIFICATION_EXTENSION_UPDATE_DISABLED,
content::Source<Profile>(profile));
- AppSorting* sorting = prefs->app_sorting();
- registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LAUNCHER_REORDERED,
- content::Source<AppSorting>(sorting));
registrar_.Add(this, chrome::NOTIFICATION_APP_INSTALLED_TO_APPLIST,
content::Source<Profile>(profile));
-
- pref_change_registrar_.Init(prefs->pref_service());
- pref_change_registrar_.Add(pref_names::kExtensions,
- base::Bind(&InstallTracker::OnAppsReordered,
- base::Unretained(this)));
+ extension_registry_observer_.Add(ExtensionRegistry::Get(profile));
+
+ // Prefs may be null in tests.
+ if (prefs) {
+ AppSorting* sorting = prefs->app_sorting();
+ registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LAUNCHER_REORDERED,
+ content::Source<AppSorting>(sorting));
+ pref_change_registrar_.Init(prefs->pref_service());
+ pref_change_registrar_.Add(pref_names::kExtensions,
+ base::Bind(&InstallTracker::OnAppsReordered,
+ base::Unretained(this)));
+ }
}
InstallTracker::~InstallTracker() {
@@ -49,8 +64,38 @@ void InstallTracker::RemoveObserver(InstallObserver* observer) {
observers_.RemoveObserver(observer);
}
+const InstallTracker::InstallProgressData* InstallTracker::GetActiveInstall(
+ const std::string& extension_id) const {
+ ActiveInstallsMap::const_iterator install_data =
+ active_installs_.find(extension_id);
+ if (install_data == active_installs_.end())
+ return NULL;
+ else
+ return &(install_data->second);
+}
+
+void InstallTracker::AddActiveInstall(const InstallProgressData& install_data) {
+ DCHECK(!install_data.extension_id.empty());
+ DCHECK(active_installs_.find(install_data.extension_id) ==
+ active_installs_.end());
+ active_installs_.insert(
+ std::make_pair(install_data.extension_id, install_data));
+}
+
+void InstallTracker::RemoveActiveInstall(const std::string& extension_id) {
+ active_installs_.erase(extension_id);
+}
+
void InstallTracker::OnBeginExtensionInstall(
const InstallObserver::ExtensionInstallParams& params) {
+ ActiveInstallsMap::iterator install_data =
+ active_installs_.find(params.extension_id);
+ if (install_data == active_installs_.end()) {
+ InstallProgressData install_data(params.extension_id);
+ install_data.is_ephemeral = params.is_ephemeral;
+ active_installs_.insert(std::make_pair(params.extension_id, install_data));
+ }
+
FOR_EACH_OBSERVER(InstallObserver, observers_,
OnBeginExtensionInstall(params));
}
@@ -62,6 +107,14 @@ void InstallTracker::OnBeginExtensionDownload(const std::string& extension_id) {
void InstallTracker::OnDownloadProgress(const std::string& extension_id,
int percent_downloaded) {
+ ActiveInstallsMap::iterator install_data =
+ active_installs_.find(extension_id);
+ if (install_data != active_installs_.end()) {
+ install_data->second.percent_downloaded = percent_downloaded;
+ } else {
+ NOTREACHED();
+ }
+
FOR_EACH_OBSERVER(InstallObserver, observers_,
OnDownloadProgress(extension_id, percent_downloaded));
}
@@ -79,6 +132,7 @@ void InstallTracker::OnFinishCrxInstall(const std::string& extension_id,
void InstallTracker::OnInstallFailure(
const std::string& extension_id) {
+ RemoveActiveInstall(extension_id);
FOR_EACH_OBSERVER(InstallObserver, observers_,
OnInstallFailure(extension_id));
}
@@ -114,6 +168,12 @@ void InstallTracker::Observe(int type,
}
}
+void InstallTracker::OnExtensionInstalled(
+ content::BrowserContext* browser_context,
+ const Extension* extension) {
+ RemoveActiveInstall(extension->id());
+}
+
void InstallTracker::OnAppsReordered() {
FOR_EACH_OBSERVER(InstallObserver, observers_, OnAppsReordered());
}

Powered by Google App Engine
This is Rietveld 408576698