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

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

Issue 6965018: Install CRX updates one at a time. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 7 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/extension_updater.cc
diff --git a/chrome/browser/extensions/extension_updater.cc b/chrome/browser/extensions/extension_updater.cc
index 9360bad51559ec5161b9a0c5d6b60a4e08caf30d..89d6a09bd481a0d4e3f1d02db21a80f2f134c28c 100644
--- a/chrome/browser/extensions/extension_updater.cc
+++ b/chrome/browser/extensions/extension_updater.cc
@@ -22,7 +22,9 @@
#include "base/version.h"
#include "crypto/sha2.h"
#include "content/common/notification_service.h"
+#include "content/common/notification_source.h"
#include "chrome/browser/browser_process.h"
+#include "chrome/browser/extensions/crx_installer.h"
#include "chrome/browser/extensions/extension_error_reporter.h"
#include "chrome/browser/extensions/extension_service.h"
#include "chrome/browser/prefs/pref_service.h"
@@ -444,6 +446,20 @@ ExtensionUpdater::ExtensionFetch::ExtensionFetch(const std::string& i,
ExtensionUpdater::ExtensionFetch::~ExtensionFetch() {}
+ExtensionUpdater::FetchedCrxFile::FetchedCrxFile(const std::string& i,
+ const FilePath& p,
+ const GURL& u)
+ : id(i),
+ path(p),
+ download_url(u) {}
+
+ExtensionUpdater::FetchedCrxFile::FetchedCrxFile()
+ : id(""),
+ path(),
+ download_url() {}
+
+ExtensionUpdater::FetchedCrxFile::~FetchedCrxFile() {}
+
ExtensionUpdater::ExtensionUpdater(ExtensionServiceInterface* service,
ExtensionPrefs* extension_prefs,
PrefService* prefs,
@@ -454,7 +470,8 @@ ExtensionUpdater::ExtensionUpdater(ExtensionServiceInterface* service,
service_(service), frequency_seconds_(frequency_seconds),
method_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
will_check_soon_(false), extension_prefs_(extension_prefs),
- prefs_(prefs), profile_(profile), blacklist_checks_enabled_(true) {
+ prefs_(prefs), profile_(profile), blacklist_checks_enabled_(true),
+ crx_install_is_running_(false) {
Init();
}
@@ -839,10 +856,56 @@ void ExtensionUpdater::OnCRXFileWritten(const std::string& id,
const FilePath& path,
const GURL& download_url) {
DCHECK(alive_);
- // The ExtensionService is now responsible for cleaning up the temp file
- // at |path|.
- service_->UpdateExtension(id, path, download_url);
- in_progress_ids_.erase(id);
+
+ FetchedCrxFile fetched(id, path, download_url);
+ fetched_crx_files_.push(fetched);
+
+ MaybeUpdateCrxFile();
+}
+
+bool ExtensionUpdater::MaybeUpdateCrxFile() {
+ if (crx_install_is_running_) {
+ return false;
+ }
+
+ while (!fetched_crx_files_.empty() && !crx_install_is_running_) {
+ const FetchedCrxFile& crx_file = fetched_crx_files_.top();
+
+ // The ExtensionService is now responsible for cleaning up the temp file
+ // at |extension_file.path|.
+ Source<CrxInstaller> install_notification_source(NULL);
+ if (service_->UpdateExtension(crx_file.id,
+ crx_file.path,
+ crx_file.download_url,
+ &install_notification_source)) {
+ crx_install_is_running_ = true;
+
+ // Source parameter ensures that we only see the completion event for the
+ // the installer we started.
+ registrar_.Add(this,
+ NotificationType::CRX_INSTALLER_DONE,
+ install_notification_source);
+ }
+ in_progress_ids_.erase(crx_file.id);
+ fetched_crx_files_.pop();
+ }
+
+ // If an updater is running, it was started above.
+ return crx_install_is_running_;
+}
+
+void ExtensionUpdater::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ DCHECK(type == NotificationType::CRX_INSTALLER_DONE);
+
+ // No need to listen for CRX_INSTALLER_DONE anymore.
+ registrar_.Remove(this,
+ NotificationType::CRX_INSTALLER_DONE,
+ source);
+ crx_install_is_running_ = false;
+ // If any files are available to update, start one.
+ MaybeUpdateCrxFile();
}
void ExtensionUpdater::OnCRXFileWriteError(const std::string& id) {

Powered by Google App Engine
This is Rietveld 408576698