| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #include "chrome/browser/chromeos/login/session/user_session_manager.h" | 5 #include "chrome/browser/chromeos/login/session/user_session_manager.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/base_paths.h" | 9 #include "base/base_paths.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 #include "components/user_manager/user_manager.h" | 67 #include "components/user_manager/user_manager.h" |
| 68 #include "components/user_manager/user_type.h" | 68 #include "components/user_manager/user_type.h" |
| 69 #include "content/public/browser/browser_thread.h" | 69 #include "content/public/browser/browser_thread.h" |
| 70 #include "content/public/browser/notification_service.h" | 70 #include "content/public/browser/notification_service.h" |
| 71 | 71 |
| 72 namespace chromeos { | 72 namespace chromeos { |
| 73 | 73 |
| 74 namespace { | 74 namespace { |
| 75 | 75 |
| 76 void InitLocaleAndInputMethodsForNewUser( | 76 void InitLocaleAndInputMethodsForNewUser( |
| 77 PrefService* prefs, | 77 UserSessionManager* session_manager, |
| 78 Profile* profile, |
| 78 const std::string& public_session_locale, | 79 const std::string& public_session_locale, |
| 79 const std::string& public_session_input_method) { | 80 const std::string& public_session_input_method) { |
| 81 PrefService* prefs = profile->GetPrefs(); |
| 80 std::string locale; | 82 std::string locale; |
| 81 if (!public_session_locale.empty()) { | 83 if (!public_session_locale.empty()) { |
| 82 // If this is a public session and the user chose a |public_session_locale|, | 84 // If this is a public session and the user chose a |public_session_locale|, |
| 83 // write it to |prefs| so that the UI switches to it. | 85 // write it to |prefs| so that the UI switches to it. |
| 84 locale = public_session_locale; | 86 locale = public_session_locale; |
| 85 prefs->SetString(prefs::kApplicationLocale, locale); | 87 prefs->SetString(prefs::kApplicationLocale, locale); |
| 86 | 88 |
| 87 // Suppress the locale change dialog. | 89 // Suppress the locale change dialog. |
| 88 prefs->SetString(prefs::kApplicationLocaleAccepted, locale); | 90 prefs->SetString(prefs::kApplicationLocaleAccepted, locale); |
| 89 } else { | 91 } else { |
| 90 // Otherwise, assume that the session will use the current UI locale. | 92 // Otherwise, assume that the session will use the current UI locale. |
| 91 locale = g_browser_process->GetApplicationLocale(); | 93 locale = g_browser_process->GetApplicationLocale(); |
| 92 } | 94 } |
| 93 | 95 |
| 94 // First, we'll set kLanguagePreloadEngines. | 96 // First, we'll set kLanguagePreloadEngines. |
| 95 input_method::InputMethodManager* manager = | 97 input_method::InputMethodManager* manager = |
| 96 input_method::InputMethodManager::Get(); | 98 input_method::InputMethodManager::Get(); |
| 97 std::vector<std::string> input_method_ids; | 99 std::vector<std::string> input_method_ids; |
| 98 | 100 |
| 99 if (!public_session_input_method.empty()) { | 101 if (!public_session_input_method.empty()) { |
| 100 // If this is a public session and the user chose a | 102 // If this is a public session and the user chose a |
| 101 // |public_session_input_method|, set kLanguagePreloadEngines to this input | 103 // |public_session_input_method|, set kLanguagePreloadEngines to this input |
| 102 // method only. | 104 // method only. |
| 103 input_method_ids.push_back(public_session_input_method); | 105 input_method_ids.push_back(public_session_input_method); |
| 104 } else { | 106 } else { |
| 105 // Otherwise, set kLanguagePreloadEngines to a list of input methods derived | 107 // Otherwise, set kLanguagePreloadEngines to a list of input methods derived |
| 106 // from the |locale| and the currently active input method. | 108 // from the |locale| and the currently active input method. |
| 107 manager->GetInputMethodUtil()->GetFirstLoginInputMethodIds( | 109 manager->GetInputMethodUtil()->GetFirstLoginInputMethodIds( |
| 108 locale, manager->GetCurrentInputMethod(), &input_method_ids); | 110 locale, |
| 111 session_manager->GetDefaultIMEState(profile)->GetCurrentInputMethod(), |
| 112 &input_method_ids); |
| 109 } | 113 } |
| 110 | 114 |
| 111 // Save the input methods in the user's preferences. | 115 // Save the input methods in the user's preferences. |
| 112 StringPrefMember language_preload_engines; | 116 StringPrefMember language_preload_engines; |
| 113 language_preload_engines.Init(prefs::kLanguagePreloadEngines, prefs); | 117 language_preload_engines.Init(prefs::kLanguagePreloadEngines, prefs); |
| 114 language_preload_engines.SetValue(JoinString(input_method_ids, ',')); | 118 language_preload_engines.SetValue(JoinString(input_method_ids, ',')); |
| 115 BootTimesLoader::Get()->AddLoginTimeMarker("IMEStarted", false); | 119 BootTimesLoader::Get()->AddLoginTimeMarker("IMEStarted", false); |
| 116 | 120 |
| 117 // Second, we'll set kLanguagePreferredLanguages. | 121 // Second, we'll set kLanguagePreferredLanguages. |
| 118 std::vector<std::string> language_codes; | 122 std::vector<std::string> language_codes; |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 } | 216 } |
| 213 | 217 |
| 214 UserSessionManager::UserSessionManager() | 218 UserSessionManager::UserSessionManager() |
| 215 : delegate_(NULL), | 219 : delegate_(NULL), |
| 216 has_auth_cookies_(false), | 220 has_auth_cookies_(false), |
| 217 user_sessions_restored_(false), | 221 user_sessions_restored_(false), |
| 218 exit_after_session_restore_(false), | 222 exit_after_session_restore_(false), |
| 219 session_restore_strategy_( | 223 session_restore_strategy_( |
| 220 OAuth2LoginManager::RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN) { | 224 OAuth2LoginManager::RESTORE_FROM_SAVED_OAUTH2_REFRESH_TOKEN) { |
| 221 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); | 225 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); |
| 226 user_manager::UserManager::Get()->AddSessionStateObserver(this); |
| 222 } | 227 } |
| 223 | 228 |
| 224 UserSessionManager::~UserSessionManager() { | 229 UserSessionManager::~UserSessionManager() { |
| 230 // UserManager is destroyed before singletons, so we need to check if it |
| 231 // still exists. |
| 232 // TODO(nkostylev): fix order of destruction of UserManager |
| 233 // / UserSessionManager objects. |
| 234 if (user_manager::UserManager::IsInitialized()) |
| 235 user_manager::UserManager::Get()->RemoveSessionStateObserver(this); |
| 225 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); | 236 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); |
| 226 } | 237 } |
| 227 | 238 |
| 228 void UserSessionManager::StartSession( | 239 void UserSessionManager::StartSession( |
| 229 const UserContext& user_context, | 240 const UserContext& user_context, |
| 230 scoped_refptr<Authenticator> authenticator, | 241 scoped_refptr<Authenticator> authenticator, |
| 231 bool has_auth_cookies, | 242 bool has_auth_cookies, |
| 232 bool has_active_session, | 243 bool has_active_session, |
| 233 UserSessionManagerDelegate* delegate) { | 244 UserSessionManagerDelegate* delegate) { |
| 234 authenticator_ = authenticator; | 245 authenticator_ = authenticator; |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 317 base::Bind(&base::PathExists, GetRlzDisabledFlagPath()), | 328 base::Bind(&base::PathExists, GetRlzDisabledFlagPath()), |
| 318 base::Bind(&UserSessionManager::InitRlzImpl, AsWeakPtr(), profile)); | 329 base::Bind(&UserSessionManager::InitRlzImpl, AsWeakPtr(), profile)); |
| 319 #endif | 330 #endif |
| 320 } | 331 } |
| 321 | 332 |
| 322 OAuth2LoginManager::SessionRestoreStrategy | 333 OAuth2LoginManager::SessionRestoreStrategy |
| 323 UserSessionManager::GetSigninSessionRestoreStrategy() { | 334 UserSessionManager::GetSigninSessionRestoreStrategy() { |
| 324 return session_restore_strategy_; | 335 return session_restore_strategy_; |
| 325 } | 336 } |
| 326 | 337 |
| 327 // static | |
| 328 void UserSessionManager::SetFirstLoginPrefs( | 338 void UserSessionManager::SetFirstLoginPrefs( |
| 329 PrefService* prefs, | 339 Profile* profile, |
| 330 const std::string& public_session_locale, | 340 const std::string& public_session_locale, |
| 331 const std::string& public_session_input_method) { | 341 const std::string& public_session_input_method) { |
| 332 VLOG(1) << "Setting first login prefs"; | 342 VLOG(1) << "Setting first login prefs"; |
| 333 InitLocaleAndInputMethodsForNewUser(prefs, | 343 InitLocaleAndInputMethodsForNewUser( |
| 334 public_session_locale, | 344 this, profile, public_session_locale, public_session_input_method); |
| 335 public_session_input_method); | |
| 336 } | 345 } |
| 337 | 346 |
| 338 bool UserSessionManager::GetAppModeChromeClientOAuthInfo( | 347 bool UserSessionManager::GetAppModeChromeClientOAuthInfo( |
| 339 std::string* chrome_client_id, std::string* chrome_client_secret) { | 348 std::string* chrome_client_id, std::string* chrome_client_secret) { |
| 340 if (!chrome::IsRunningInForcedAppMode() || | 349 if (!chrome::IsRunningInForcedAppMode() || |
| 341 chrome_client_id_.empty() || | 350 chrome_client_id_.empty() || |
| 342 chrome_client_secret_.empty()) { | 351 chrome_client_secret_.empty()) { |
| 343 return false; | 352 return false; |
| 344 } | 353 } |
| 345 | 354 |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 431 user_manager::UserManager::Get()->IsLoggedInAsGuest(); | 440 user_manager::UserManager::Get()->IsLoggedInAsGuest(); |
| 432 locale_util::SwitchLanguage(pref_locale, | 441 locale_util::SwitchLanguage(pref_locale, |
| 433 enable_layouts, | 442 enable_layouts, |
| 434 false /* login_layouts_only */, | 443 false /* login_layouts_only */, |
| 435 callback.Pass()); | 444 callback.Pass()); |
| 436 | 445 |
| 437 return true; | 446 return true; |
| 438 } | 447 } |
| 439 | 448 |
| 440 void UserSessionManager::AddSessionStateObserver( | 449 void UserSessionManager::AddSessionStateObserver( |
| 441 UserSessionStateObserver* observer) { | 450 chromeos::UserSessionStateObserver* observer) { |
| 442 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 451 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 443 session_state_observer_list_.AddObserver(observer); | 452 session_state_observer_list_.AddObserver(observer); |
| 444 } | 453 } |
| 445 | 454 |
| 446 void UserSessionManager::RemoveSessionStateObserver( | 455 void UserSessionManager::RemoveSessionStateObserver( |
| 447 UserSessionStateObserver* observer) { | 456 chromeos::UserSessionStateObserver* observer) { |
| 448 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 457 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 449 session_state_observer_list_.RemoveObserver(observer); | 458 session_state_observer_list_.RemoveObserver(observer); |
| 450 } | 459 } |
| 451 | 460 |
| 452 void UserSessionManager::OnSessionRestoreStateChanged( | 461 void UserSessionManager::OnSessionRestoreStateChanged( |
| 453 Profile* user_profile, | 462 Profile* user_profile, |
| 454 OAuth2LoginManager::SessionRestoreState state) { | 463 OAuth2LoginManager::SessionRestoreState state) { |
| 455 user_manager::User::OAuthTokenStatus user_status = | 464 user_manager::User::OAuthTokenStatus user_status = |
| 456 user_manager::User::OAUTH_TOKEN_STATUS_UNKNOWN; | 465 user_manager::User::OAUTH_TOKEN_STATUS_UNKNOWN; |
| 457 OAuth2LoginManager* login_manager = | 466 OAuth2LoginManager* login_manager = |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 636 case Profile::MAX_CREATE_STATUS: | 645 case Profile::MAX_CREATE_STATUS: |
| 637 NOTREACHED(); | 646 NOTREACHED(); |
| 638 break; | 647 break; |
| 639 } | 648 } |
| 640 } | 649 } |
| 641 | 650 |
| 642 void UserSessionManager::InitProfilePreferences( | 651 void UserSessionManager::InitProfilePreferences( |
| 643 Profile* profile, | 652 Profile* profile, |
| 644 const UserContext& user_context) { | 653 const UserContext& user_context) { |
| 645 if (user_manager::UserManager::Get()->IsCurrentUserNew()) { | 654 if (user_manager::UserManager::Get()->IsCurrentUserNew()) { |
| 646 SetFirstLoginPrefs(profile->GetPrefs(), | 655 SetFirstLoginPrefs(profile, |
| 647 user_context.GetPublicSessionLocale(), | 656 user_context.GetPublicSessionLocale(), |
| 648 user_context.GetPublicSessionInputMethod()); | 657 user_context.GetPublicSessionInputMethod()); |
| 649 } | 658 } |
| 650 | 659 |
| 651 if (user_manager::UserManager::Get()->IsLoggedInAsSupervisedUser()) { | 660 if (user_manager::UserManager::Get()->IsLoggedInAsSupervisedUser()) { |
| 652 user_manager::User* active_user = | 661 user_manager::User* active_user = |
| 653 user_manager::UserManager::Get()->GetActiveUser(); | 662 user_manager::UserManager::Get()->GetActiveUser(); |
| 654 std::string supervised_user_sync_id = | 663 std::string supervised_user_sync_id = |
| 655 ChromeUserManager::Get()->GetSupervisedUserManager()->GetUserSyncId( | 664 ChromeUserManager::Get()->GetSupervisedUserManager()->GetUserSyncId( |
| 656 active_user->email()); | 665 active_user->email()); |
| (...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 970 true, // has_active_session | 979 true, // has_active_session |
| 971 this); | 980 this); |
| 972 } else { | 981 } else { |
| 973 RestorePendingUserSessions(); | 982 RestorePendingUserSessions(); |
| 974 } | 983 } |
| 975 } | 984 } |
| 976 | 985 |
| 977 void UserSessionManager::NotifyPendingUserSessionsRestoreFinished() { | 986 void UserSessionManager::NotifyPendingUserSessionsRestoreFinished() { |
| 978 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); | 987 DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); |
| 979 user_sessions_restored_ = true; | 988 user_sessions_restored_ = true; |
| 980 FOR_EACH_OBSERVER(UserSessionStateObserver, | 989 FOR_EACH_OBSERVER(chromeos::UserSessionStateObserver, |
| 981 session_state_observer_list_, | 990 session_state_observer_list_, |
| 982 PendingUserSessionsRestoreFinished()); | 991 PendingUserSessionsRestoreFinished()); |
| 983 } | 992 } |
| 984 | 993 |
| 994 void UserSessionManager::ActiveUserChanged( |
| 995 const user_manager::User* active_user) { |
| 996 input_method::InputMethodManager* manager = |
| 997 input_method::InputMethodManager::Get(); |
| 998 manager->SetState( |
| 999 GetDefaultIMEState(ProfileHelper::Get()->GetProfileByUser(active_user))); |
| 1000 } |
| 1001 |
| 1002 scoped_refptr<input_method::InputMethodManager::State> |
| 1003 UserSessionManager::GetDefaultIMEState(Profile* profile) { |
| 1004 scoped_refptr<input_method::InputMethodManager::State> state = |
| 1005 default_ime_states_[profile]; |
| 1006 if (!state) { |
| 1007 // Profile can be NULL in tests. |
| 1008 state = input_method::InputMethodManager::Get()->CreateNewState(profile); |
| 1009 default_ime_states_[profile] = state; |
| 1010 } |
| 1011 return state; |
| 1012 } |
| 1013 |
| 985 } // namespace chromeos | 1014 } // namespace chromeos |
| OLD | NEW |