OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef CHROME_BROWSER_SIGNIN_SIGNIN_TRACKER_H_ | 5 #ifndef CHROME_BROWSER_SIGNIN_SIGNIN_TRACKER_H_ |
6 #define CHROME_BROWSER_SIGNIN_SIGNIN_TRACKER_H_ | 6 #define CHROME_BROWSER_SIGNIN_SIGNIN_TRACKER_H_ |
7 | 7 |
8 #include "content/public/browser/notification_observer.h" | 8 #include "content/public/browser/notification_observer.h" |
9 #include "content/public/browser/notification_registrar.h" | 9 #include "content/public/browser/notification_registrar.h" |
10 #include "content/public/browser/notification_types.h" | 10 #include "content/public/browser/notification_types.h" |
11 #include "google_apis/gaia/google_service_auth_error.h" | 11 #include "google_apis/gaia/google_service_auth_error.h" |
| 12 #include "google_apis/gaia/oauth2_token_service.h" |
12 | 13 |
13 class Profile; | 14 class Profile; |
14 | 15 |
15 // The signin flow logic is spread across several classes with varying | 16 // The signin flow logic is spread across several classes with varying |
16 // responsibilities: | 17 // responsibilities: |
17 // | 18 // |
18 // SigninTracker (this class) - This class listens to notifications from various | 19 // SigninTracker (this class) - This class listens to notifications from various |
19 // services (SigninManager, tokenService, etc) and coalesces them into | 20 // services (SigninManager, OAuth2TokenService) and coalesces them into |
20 // notifications for the UI layer. This is the class that encapsulates the logic | 21 // notifications for the UI layer. This is the class that encapsulates the logic |
21 // that determines whether a user is fully logged in or not, and exposes | 22 // that determines whether a user is fully logged in or not, and exposes |
22 // callbacks so various pieces of the UI (OneClickSyncStarter, SyncSetupHandler) | 23 // callbacks so various pieces of the UI (OneClickSyncStarter) can track the |
23 // can track the current startup state. | 24 // current startup state. |
24 // | 25 // |
25 // SyncSetupHandler - This class is primarily responsible for interacting with | 26 // SyncSetupHandler - This class is primarily responsible for interacting with |
26 // the web UI for performing system login and sync configuration. Receives | 27 // the web UI for performing system login and sync configuration. Receives |
27 // callbacks from the UI when the user wishes to initiate a login, and | 28 // callbacks from the UI when the user wishes to initiate a login, and |
28 // translates system state (login errors, etc) into the appropriate calls into | 29 // translates system state (login errors, etc) into the appropriate calls into |
29 // the UI to reflect this status to the user. | 30 // the UI to reflect this status to the user. |
30 // | 31 // |
31 // LoginUIService - Our desktop UI flows rely on having only a single login flow | 32 // LoginUIService - Our desktop UI flows rely on having only a single login flow |
32 // visible to the user at once. This is achieved via LoginUIService | 33 // visible to the user at once. This is achieved via LoginUIService |
33 // (a BrowserContextKeyedService that keeps track of the currently visible | 34 // (a BrowserContextKeyedService that keeps track of the currently visible |
34 // login UI). | 35 // login UI). |
35 // | 36 // |
36 // SigninManager - Records the currently-logged-in user and handles all | 37 // SigninManager - Records the currently-logged-in user and handles all |
37 // interaction with the GAIA backend during the signin process. Unlike | 38 // interaction with the GAIA backend during the signin process. Unlike |
38 // SigninTracker, SigninManager only knows about the GAIA login state and is | 39 // SigninTracker, SigninManager only knows about the GAIA login state and is |
39 // not aware of the state of any signed in services. | 40 // not aware of the state of any signed in services. |
40 // | 41 // |
41 // TokenService - Uses credentials provided by SigninManager to generate tokens | 42 // TokenService - Uses credentials provided by SigninManager to generate tokens |
42 // for all signed-in services in Chrome. | 43 // for all signed-in services in Chrome. |
43 // | 44 // |
| 45 // OAuth2TokenService - Maintains and manages OAuth2 tokens for the accounts |
| 46 // connected to this profile. |
| 47 // |
44 // ProfileSyncService - Provides the external API for interacting with the | 48 // ProfileSyncService - Provides the external API for interacting with the |
45 // sync framework. Listens for notifications from the TokenService to know | 49 // sync framework. Listens for notifications from the TokenService to know |
46 // when to startup sync, and provides an Observer interface to notify the UI | 50 // when to startup sync, and provides an Observer interface to notify the UI |
47 // layer of changes in sync state so they can be reflected in the UI. | 51 // layer of changes in sync state so they can be reflected in the UI. |
48 class SigninTracker : public content::NotificationObserver { | 52 class SigninTracker : public content::NotificationObserver, |
| 53 public OAuth2TokenService::Observer { |
49 public: | 54 public: |
50 class Observer { | 55 class Observer { |
51 public: | 56 public: |
52 // The signin attempt failed, and the cause is passed in |error|. | 57 // The signin attempt failed, and the cause is passed in |error|. |
53 virtual void SigninFailed(const GoogleServiceAuthError& error) = 0; | 58 virtual void SigninFailed(const GoogleServiceAuthError& error) = 0; |
54 | 59 |
55 // The signin attempt succeeded. | 60 // The signin attempt succeeded. |
56 virtual void SigninSuccess() = 0; | 61 virtual void SigninSuccess() = 0; |
57 }; | 62 }; |
58 | 63 |
59 // The various states the login process can be in. | |
60 enum LoginState { | |
61 WAITING_FOR_GAIA_VALIDATION, | |
62 SERVICES_INITIALIZING, | |
63 SIGNIN_COMPLETE | |
64 }; | |
65 | |
66 // Creates a SigninTracker that tracks the signin status on the passed | 64 // Creates a SigninTracker that tracks the signin status on the passed |
67 // |profile|, and notifies the |observer| on status changes. |observer| must | 65 // |profile|, and notifies the |observer| on status changes. |observer| must |
68 // be non-null and must outlive the SigninTracker. | 66 // be non-null and must outlive the SigninTracker. |
69 SigninTracker(Profile* profile, Observer* observer); | 67 SigninTracker(Profile* profile, Observer* observer); |
70 virtual ~SigninTracker(); | 68 virtual ~SigninTracker(); |
71 | 69 |
72 // content::NotificationObserver implementation. | 70 // content::NotificationObserver implementation. |
73 virtual void Observe(int type, | 71 virtual void Observe(int type, |
74 const content::NotificationSource& source, | 72 const content::NotificationSource& source, |
75 const content::NotificationDetails& details) OVERRIDE; | 73 const content::NotificationDetails& details) OVERRIDE; |
76 | 74 |
77 // Returns true if the tokens are loaded for all signed-in services. | 75 // OAuth2TokenService::Observer implementation. |
78 static bool AreServiceTokensLoaded(Profile* profile); | 76 virtual void OnRefreshTokenAvailable(const std::string& account_id) OVERRIDE; |
79 | 77 virtual void OnRefreshTokenRevoked(const std::string& account_id) OVERRIDE; |
80 // Returns the sign in state for |profile|. If the profile is not signed in, | |
81 // or is authenticating with GAIA, WAITING_FOR_GAIA_VALIDATION is returned. | |
82 // If SigninManager in has completed but TokenService is not ready, | |
83 // SERVICES_INITIALIZING is returned. Otherwise SIGNIN_COMPLETE is returned. | |
84 static LoginState GetSigninState(Profile* profile, | |
85 GoogleServiceAuthError* error); | |
86 | 78 |
87 private: | 79 private: |
88 // Initializes this by adding notifications and observers. | 80 // Initializes this by adding notifications and observers. |
89 void Initialize(); | 81 void Initialize(); |
90 | 82 |
91 // Invoked when one of the services potentially changed its signin status so | |
92 // we can check to see whether we need to notify our observer. | |
93 void HandleServiceStateChange(); | |
94 | |
95 // The current state of the login process. | |
96 LoginState state_; | |
97 | |
98 // The profile whose signin status we are tracking. | 83 // The profile whose signin status we are tracking. |
99 Profile* profile_; | 84 Profile* profile_; |
100 | 85 |
101 // Weak pointer to the observer we call when the signin state changes. | 86 // Weak pointer to the observer we call when the signin state changes. |
102 Observer* observer_; | 87 Observer* observer_; |
103 | 88 |
104 // Set to true when SigninManager has validated our credentials. | |
105 bool credentials_valid_; | |
106 | |
107 // Used to listen to notifications from the SigninManager. | 89 // Used to listen to notifications from the SigninManager. |
108 content::NotificationRegistrar registrar_; | 90 content::NotificationRegistrar registrar_; |
109 | 91 |
110 DISALLOW_COPY_AND_ASSIGN(SigninTracker); | 92 DISALLOW_COPY_AND_ASSIGN(SigninTracker); |
111 }; | 93 }; |
112 | 94 |
113 #endif // CHROME_BROWSER_SIGNIN_SIGNIN_TRACKER_H_ | 95 #endif // CHROME_BROWSER_SIGNIN_SIGNIN_TRACKER_H_ |
OLD | NEW |