Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / signin / signin_names_io_thread.cc
index 0a79509..84b7c62 100644 (file)
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/signin/signin_manager.h"
 #include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_service.h"
 
-SigninNamesOnIOThread::SigninNamesOnIOThread() {
+SigninNamesOnIOThread::SigninNamesOnIOThread() : resources_released_(false) {
   CheckOnUIThread();
 
-  // We want to register for all profiles, not just for the current profile.
-  registrar_.reset(new content::NotificationRegistrar);
-  registrar_->Add(this, chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL,
-                  content::NotificationService::AllSources());
-  registrar_->Add(this, chrome::NOTIFICATION_GOOGLE_SIGNED_OUT,
-                  content::NotificationService::AllSources());
+  SigninManagerFactory::GetInstance()->AddObserver(this);
 
   // Get list of profiles and record the email addresses of any connected
   // accounts.
@@ -41,7 +35,9 @@ SigninNamesOnIOThread::SigninNamesOnIOThread() {
 
 SigninNamesOnIOThread::~SigninNamesOnIOThread() {
   CheckOnIOThread();
-  DCHECK(!registrar_) << "Must call ReleaseResourcesOnUIThread() first";
+  DCHECK(resources_released_) << "Must call ReleaseResourcesOnUIThread() first";
+  DCHECK(!observed_managers_.size())
+      << "Shouldn't be observing any SigninManagers";
 }
 
 const SigninNamesOnIOThread::EmailSet&
@@ -52,31 +48,36 @@ const SigninNamesOnIOThread::EmailSet&
 
 void SigninNamesOnIOThread::ReleaseResourcesOnUIThread() {
   CheckOnUIThread();
-  registrar_.reset();
+  DCHECK(!resources_released_);
+  SigninManagerFactory::GetInstance()->RemoveObserver(this);
+
+  for (std::set<SigninManagerBase*>::iterator i = observed_managers_.begin();
+       i != observed_managers_.end();
+       ++i) {
+    (*i)->RemoveObserver(this);
+  }
+  observed_managers_.clear();
+
+  resources_released_ = true;
 }
 
-void SigninNamesOnIOThread::Observe(
-    int type,
-    const content::NotificationSource& source,
-    const content::NotificationDetails& details) {
-  CheckOnUIThread();
+void SigninNamesOnIOThread::SigninManagerCreated(SigninManagerBase* manager) {
+  manager->AddObserver(this);
+  observed_managers_.insert(manager);
+}
 
-  switch (type) {
-    case chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL: {
-      const GoogleServiceSigninSuccessDetails* signin_details =
-          content::Details<GoogleServiceSigninSuccessDetails>(details).ptr();
-      PostTaskToIOThread(type, base::UTF8ToUTF16(signin_details->username));
-      break;
-    }
-    case chrome::NOTIFICATION_GOOGLE_SIGNED_OUT: {
-      const GoogleServiceSignoutDetails* signout_details =
-          content::Details<GoogleServiceSignoutDetails>(details).ptr();
-      PostTaskToIOThread(type, base::UTF8ToUTF16(signout_details->username));
-      break;
-    }
-    default:
-      NOTREACHED() << "Unexpected type=" << type;
-  }
+void SigninNamesOnIOThread::SigninManagerShutdown(SigninManagerBase* manager) {
+  manager->RemoveObserver(this);
+  observed_managers_.erase(manager);
+}
+
+void SigninNamesOnIOThread::GoogleSigninSucceeded(const std::string& username,
+                                                  const std::string& password) {
+  PostTaskToIOThread(true, base::UTF8ToUTF16(username));
+}
+
+void SigninNamesOnIOThread::GoogleSignedOut(const std::string& username) {
+  PostTaskToIOThread(false, base::UTF8ToUTF16(username));
 }
 
 void SigninNamesOnIOThread::CheckOnIOThread() const {
@@ -87,26 +88,26 @@ void SigninNamesOnIOThread::CheckOnUIThread() const {
   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
 }
 
-void SigninNamesOnIOThread::PostTaskToIOThread(
-    int type,
-    const base::string16& email) {
+void SigninNamesOnIOThread::PostTaskToIOThread(bool add,
+                                               const base::string16& email) {
   if (content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)) {
-    UpdateOnIOThread(type, email);
+    UpdateOnIOThread(add, email);
   } else {
     bool may_run = content::BrowserThread::PostTask(
-            content::BrowserThread::IO,
-            FROM_HERE,
-            base::Bind(&SigninNamesOnIOThread::UpdateOnIOThread,
-                       base::Unretained(this), type, email));
+        content::BrowserThread::IO,
+        FROM_HERE,
+        base::Bind(&SigninNamesOnIOThread::UpdateOnIOThread,
+                   base::Unretained(this),
+                   add,
+                   email));
     DCHECK(may_run);
   }
 }
 
-void SigninNamesOnIOThread::UpdateOnIOThread(
-    int type,
-    const base::string16& email) {
+void SigninNamesOnIOThread::UpdateOnIOThread(bool add,
+                                             const base::string16& email) {
   CheckOnIOThread();
-  if (type == chrome::NOTIFICATION_GOOGLE_SIGNIN_SUCCESSFUL) {
+  if (add) {
     emails_.insert(email);
   } else {
     emails_.erase(email);