Chromium Code Reviews| Index: chrome/browser/chromeos/login/user_manager_impl.cc |
| diff --git a/chrome/browser/chromeos/login/user_manager_impl.cc b/chrome/browser/chromeos/login/user_manager_impl.cc |
| index b82a92c992a559db6f825227f2bebac0fa01caf8..3e31392d76ba026b5be282dc4a5aafee56f1f5c7 100644 |
| --- a/chrome/browser/chromeos/login/user_manager_impl.cc |
| +++ b/chrome/browser/chromeos/login/user_manager_impl.cc |
| @@ -28,6 +28,7 @@ |
| #include "chrome/browser/chromeos/cros/cros_library.h" |
| #include "chrome/browser/chromeos/login/default_pinned_apps_field_trial.h" |
| #include "chrome/browser/chromeos/login/login_display.h" |
| +#include "chrome/browser/chromeos/login/login_utils.h" |
| #include "chrome/browser/chromeos/login/remove_user_delegate.h" |
| #include "chrome/browser/chromeos/login/user_image_manager_impl.h" |
| #include "chrome/browser/chromeos/login/wizard_controller.h" |
| @@ -846,6 +847,23 @@ void UserManagerImpl::NotifyLocalStateChanged() { |
| LocalStateChanged(this)); |
| } |
| +void UserManagerImpl::OnProfilePrepared(Profile* profile) { |
| + LoginUtils::Get()->DoBrowserLaunch(profile, |
| + NULL); // host_, not needed here |
| + |
| + if (!CommandLine::ForCurrentProcess()->HasSwitch(::switches::kTestName)) { |
| + // Did not log in (we crashed or are debugging), need to restore Sync. |
| + // TODO(nkostylev): Make sure that OAuth state is restored correctly for all |
| + // users once it is fully multi-profile aware. http://crbug.com/238987 |
| + // For now if we have other user pending sessions they'll override OAuth |
| + // session restore for previous users. |
| + LoginUtils::Get()->RestoreAuthenticationSession(profile); |
| + } |
| + |
| + // Restore other user sessions if any. |
| + RestorePendingUserSessions(); |
| +} |
| + |
| void UserManagerImpl::EnsureUsersLoaded() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| if (!g_browser_process || !g_browser_process->local_state()) |
| @@ -1545,13 +1563,65 @@ void UserManagerImpl::SetLRUUser(User* user) { |
| void UserManagerImpl::OnRestoreActiveSessions( |
| const SessionManagerClient::ActiveSessionsMap& sessions, |
| bool success) { |
| - // TODO(nkostylev): Restore all user sessions (in the background). |
| - // This requires first refactoring this flow out of LoginUtils. |
| - // 1. UserManager::UserLoggedIn() |
| - // 2. InitSessionRestoreStrategy() (OAuth) |
| - // 2. ProfileManager::CreateDefaultProfileAsync() |
| - // 3. InitProfilePreferences |
| - // 4. chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED |
| + if (!success) { |
| + LOG(ERROR) << "Could not get list of active user sessions after crash."; |
|
Dmitry Polukhin
2013/05/27 13:51:04
Should we continue working or force sign out is mo
Nikita (slow)
2013/05/27 14:22:06
Done.
|
| + return; |
| + } |
| + |
| + // One profile has been already loaded on browser start. |
| + DCHECK(GetLoggedInUsers().size() == 1); |
| + DCHECK(GetActiveUser()); |
| + std::string active_user_id = GetActiveUser()->email(); |
| + |
| + SessionManagerClient::ActiveSessionsMap::const_iterator it; |
| + for (it = sessions.begin(); it != sessions.end(); ++it) { |
| + if (active_user_id == it->first) |
| + continue; |
| + pending_user_sessions_[it->first] = it->second; |
| + } |
| + RestorePendingUserSessions(); |
| +} |
| + |
| +void UserManagerImpl::RestorePendingUserSessions() { |
| + if (pending_user_sessions_.empty()) |
| + return; |
| + |
| + // Get next user to restore sessions and delete it from list. |
| + SessionManagerClient::ActiveSessionsMap::const_iterator it = |
| + pending_user_sessions_.begin(); |
| + std::string user_id = it->first; |
| + std::string user_id_hash = it->second; |
| + DCHECK(!user_id.empty()); |
| + DCHECK(!user_id_hash.empty()); |
| + pending_user_sessions_.erase(user_id); |
| + |
| + // Check that this user is not logged in yet |
| + // i.e. session was not restored twice. |
| + UserList logged_in_users = GetLoggedInUsers(); |
| + bool user_already_logged_in = false; |
| + for (UserList::const_iterator it = logged_in_users.begin(); |
| + it != logged_in_users.end(); ++it) { |
| + const User* user = (*it); |
| + if (user->email() == user_id) { |
| + user_already_logged_in = true; |
| + break; |
| + } |
| + } |
| + DCHECK(user_already_logged_in); |
| + |
| + if (!user_already_logged_in) { |
| + // Will call OnProfilePrepared() once profile has been loaded. |
| + LoginUtils::Get()->PrepareProfile(UserContext(user_id, |
| + std::string(), // password |
| + std::string(), // auth_code |
| + user_id_hash), |
| + std::string(), // display_email |
| + false, // using_oauth |
| + false, // has_cookies |
| + this); |
| + } else { |
| + RestorePendingUserSessions(); |
| + } |
| } |
| } // namespace chromeos |