Index: chrome/browser/component_updater/pnacl/pnacl_updater_observer.cc |
diff --git a/chrome/browser/component_updater/pnacl/pnacl_updater_observer.cc b/chrome/browser/component_updater/pnacl/pnacl_updater_observer.cc |
index 2a3a6fa891914eb5e626177235f414a1f71fce20..e036e989c4bfbea56f709640f7f229c0bf1a54c0 100644 |
--- a/chrome/browser/component_updater/pnacl/pnacl_updater_observer.cc |
+++ b/chrome/browser/component_updater/pnacl/pnacl_updater_observer.cc |
@@ -9,23 +9,48 @@ |
#include "chrome/common/chrome_notification_types.h" |
#include "content/public/browser/notification_service.h" |
-PnaclUpdaterObserver::PnaclUpdaterObserver( |
- PnaclComponentInstaller* installer) : pnacl_installer_(installer) { |
- registrar_.Add(this, |
- chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, |
- content::NotificationService::AllSources()); |
+PnaclUpdaterObserver::PnaclUpdaterObserver(PnaclComponentInstaller* installer) |
+ : pnacl_installer_(installer) {} |
+ |
+PnaclUpdaterObserver::~PnaclUpdaterObserver() {} |
+ |
+void PnaclUpdaterObserver::EnsureObserving() { |
+ if (registrar_.IsEmpty()) { |
+ registrar_.Add(this, |
+ chrome::NOTIFICATION_COMPONENT_UPDATE_READY, |
+ content::NotificationService::AllSources()); |
+ registrar_.Add(this, |
+ chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING, |
+ content::NotificationService::AllSources()); |
+ } |
} |
-PnaclUpdaterObserver::~PnaclUpdaterObserver() { } |
+void PnaclUpdaterObserver::StopObserving() { |
+ registrar_.RemoveAll(); |
+} |
void PnaclUpdaterObserver::Observe( |
int type, |
const content::NotificationSource& source, |
const content::NotificationDetails& details) { |
+ |
+ if (type == chrome::NOTIFICATION_COMPONENT_UPDATE_READY) { |
+ // If the component updater says there is an UPDATE_READY w/ source |
+ // being the PNaCl ID, then installation is handed off to the PNaCl |
+ // installer and we can stop observing. |
+ if (pnacl_installer_->cus()->IsUpdateNotificationForComponent( |
+ source, pnacl_installer_->GetCrxComponent())) { |
+ StopObserving(); |
+ } |
+ return; |
+ } |
+ |
if (type == chrome::NOTIFICATION_COMPONENT_UPDATER_SLEEPING) { |
- // If the component updater sleeps before a NotifyInstallSuccess, |
- // then requests for installs were likely skipped, or an error occurred. |
+ // If the component updater sleeps before an UPDATE_READY for this |
+ // component, then requests for installs were likely skipped, |
+ // an error occurred, or the component is already up to date. |
pnacl_installer_->NotifyInstallError(); |
+ StopObserving(); |
return; |
} |
} |