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