Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / signin / signin_names_io_thread.cc
1 // Copyright (c) 2012 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/signin/signin_names_io_thread.h"
6
7 #include "base/logging.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/browser/browser_process.h"
10 #include "chrome/browser/chrome_notification_types.h"
11 #include "chrome/browser/profiles/profile_info_cache.h"
12 #include "chrome/browser/profiles/profile_manager.h"
13 #include "components/signin/core/browser/signin_manager.h"
14 #include "content/public/browser/browser_thread.h"
15
16 SigninNamesOnIOThread::SigninNamesOnIOThread() : resources_released_(false) {
17   CheckOnUIThread();
18
19   SigninManagerFactory::GetInstance()->AddObserver(this);
20
21   // Get list of profiles and record the email addresses of any connected
22   // accounts.
23   if (g_browser_process) {
24     ProfileManager* manager = g_browser_process->profile_manager();
25     if (manager) {
26       const ProfileInfoCache& cache = manager->GetProfileInfoCache();
27       for (size_t i = 0; i < cache.GetNumberOfProfiles(); ++i) {
28         base::string16 email = cache.GetUserNameOfProfileAtIndex(i);
29         if (!email.empty())
30           emails_.insert(email);
31       }
32     }
33   }
34 }
35
36 SigninNamesOnIOThread::~SigninNamesOnIOThread() {
37   CheckOnIOThread();
38   DCHECK(resources_released_) << "Must call ReleaseResourcesOnUIThread() first";
39   DCHECK(!observed_managers_.size())
40       << "Shouldn't be observing any SigninManagers";
41 }
42
43 const SigninNamesOnIOThread::EmailSet&
44     SigninNamesOnIOThread::GetEmails() const {
45   CheckOnIOThread();
46   return emails_;
47 }
48
49 void SigninNamesOnIOThread::ReleaseResourcesOnUIThread() {
50   CheckOnUIThread();
51   DCHECK(!resources_released_);
52   SigninManagerFactory::GetInstance()->RemoveObserver(this);
53
54   for (std::set<SigninManagerBase*>::iterator i = observed_managers_.begin();
55        i != observed_managers_.end();
56        ++i) {
57     (*i)->RemoveObserver(this);
58   }
59   observed_managers_.clear();
60
61   resources_released_ = true;
62 }
63
64 void SigninNamesOnIOThread::SigninManagerCreated(SigninManagerBase* manager) {
65   manager->AddObserver(this);
66   observed_managers_.insert(manager);
67 }
68
69 void SigninNamesOnIOThread::SigninManagerShutdown(SigninManagerBase* manager) {
70   manager->RemoveObserver(this);
71   observed_managers_.erase(manager);
72 }
73
74 void SigninNamesOnIOThread::GoogleSigninSucceeded(const std::string& account_id,
75                                                   const std::string& username,
76                                                   const std::string& password) {
77   PostTaskToIOThread(true, base::UTF8ToUTF16(username));
78 }
79
80 void SigninNamesOnIOThread::GoogleSignedOut(const std::string& account_id,
81                                             const std::string& username) {
82   PostTaskToIOThread(false, base::UTF8ToUTF16(username));
83 }
84
85 void SigninNamesOnIOThread::CheckOnIOThread() const {
86   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
87 }
88
89 void SigninNamesOnIOThread::CheckOnUIThread() const {
90   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
91 }
92
93 void SigninNamesOnIOThread::PostTaskToIOThread(bool add,
94                                                const base::string16& email) {
95   if (content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)) {
96     UpdateOnIOThread(add, email);
97   } else {
98     bool may_run = content::BrowserThread::PostTask(
99         content::BrowserThread::IO,
100         FROM_HERE,
101         base::Bind(&SigninNamesOnIOThread::UpdateOnIOThread,
102                    base::Unretained(this),
103                    add,
104                    email));
105     DCHECK(may_run);
106   }
107 }
108
109 void SigninNamesOnIOThread::UpdateOnIOThread(bool add,
110                                              const base::string16& email) {
111   CheckOnIOThread();
112   if (add) {
113     emails_.insert(email);
114   } else {
115     emails_.erase(email);
116   }
117 }