1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file.
4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/session/restore_after_crash_session_manager_delegate.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/command_line.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/session/user_session_manager.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/profiles/profile.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/common/chrome_switches.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/audio/cras_audio_handler.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/chromeos_switches.h"
146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/notification_service.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace chromeos {
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
19116680a4aac90f2aa7413d9095a592090648e557Ben MurdochRestoreAfterCrashSessionManagerDelegate::
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    RestoreAfterCrashSessionManagerDelegate(Profile* profile,
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                            const std::string& login_user_id)
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : profile_(profile), login_user_id_(login_user_id) {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
25116680a4aac90f2aa7413d9095a592090648e557Ben MurdochRestoreAfterCrashSessionManagerDelegate::
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ~RestoreAfterCrashSessionManagerDelegate() {
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid RestoreAfterCrashSessionManagerDelegate::Start() {
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  session_manager_->SetSessionState(session_manager::SESSION_STATE_ACTIVE);
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(nkostylev): Identify tests that do not set this kLoginUser flag but
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // still rely on "stub user" session. Keeping existing behavior to avoid
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // breaking tests.
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (command_line->HasSwitch(chromeos::switches::kLoginUser)) {
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // This is done in SessionManager::OnProfileCreated during normal login.
396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    UserSessionManager* user_session_mgr = UserSessionManager::GetInstance();
406e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    user_session_mgr->InitRlz(profile());
416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    user_session_mgr->InitializeCerts(profile());
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Send the PROFILE_PREPARED notification and call SessionStarted()
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // so that the Launcher and other Profile dependent classes are created.
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    content::NotificationService::current()->Notify(
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        chrome::NOTIFICATION_LOGIN_USER_PROFILE_PREPARED,
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::NotificationService::AllSources(),
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        content::Details<Profile>(profile()));
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // This call will set session state to SESSION_STATE_ACTIVE (same one).
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    user_manager::UserManager::Get()->SessionStarted();
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Now is the good time to retrieve other logged in users for this session.
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // First user has been already marked as logged in and active in
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // PreProfileInit(). Restore sessions for other users in the background.
566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    user_session_mgr->RestoreActiveSessions();
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool is_running_test = command_line->HasSwitch(::switches::kTestName) ||
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                         command_line->HasSwitch(::switches::kTestType);
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!is_running_test) {
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Enable CrasAudioHandler logging when chrome restarts after crashing.
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (chromeos::CrasAudioHandler::IsInitialized())
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      chromeos::CrasAudioHandler::Get()->LogErrors();
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // We did not log in (we crashed or are debugging), so we need to
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // restore Sync.
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    UserSessionManager::GetInstance()->RestoreAuthenticationSession(profile());
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace chromeos
74