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/chrome_session_manager.h"
6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/command_line.h"
8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/logging.h"
9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/memory/scoped_ptr.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/sys_info.h"
11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h"
12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/session/kiosk_auto_launcher_session_manager_delegate.h"
14116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/session/login_oobe_session_manager_delegate.h"
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/session/restore_after_crash_session_manager_delegate.h"
16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/session/stub_login_session_manager_delegate.h"
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/profiles/profile.h"
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/chromeos_switches.h"
19116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chromeos/login/user_names.h"
20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace chromeos {
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ShouldAutoLaunchKioskApp(const base::CommandLine& command_line) {
26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  KioskAppManager* app_manager = KioskAppManager::Get();
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return command_line.HasSwitch(switches::kLoginManager) &&
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         !command_line.HasSwitch(switches::kForceLoginManagerInTests) &&
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         app_manager->IsAutoLaunchEnabled() &&
30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch         KioskAppLaunchError::Get() == KioskAppLaunchError::NONE;
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static
36116680a4aac90f2aa7413d9095a592090648e557Ben Murdochscoped_ptr<session_manager::SessionManager>
37116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChromeSessionManager::CreateSessionManager(
38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const base::CommandLine& parsed_command_line,
39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    Profile* profile,
40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    bool is_running_test) {
41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Tests should be able to tune login manager before showing it. Thus only
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // show login UI (login and out-of-box) in normal (non-testing) mode with
43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // --login-manager switch and if test passed --force-login-manager-in-tests.
44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  bool force_login_screen_in_test =
45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      parsed_command_line.HasSwitch(switches::kForceLoginManagerInTests);
46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string login_user_id =
48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      parsed_command_line.GetSwitchValueASCII(switches::kLoginUser);
49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (ShouldAutoLaunchKioskApp(parsed_command_line)) {
51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    VLOG(1) << "Starting Chrome with KioskAutoLauncherSessionManagerDelegate";
52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return scoped_ptr<session_manager::SessionManager>(new ChromeSessionManager(
53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new KioskAutoLauncherSessionManagerDelegate()));
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if (parsed_command_line.HasSwitch(switches::kLoginManager) &&
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch             (!is_running_test || force_login_screen_in_test)) {
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    VLOG(1) << "Starting Chrome with LoginOobeSessionManagerDelegate";
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return scoped_ptr<session_manager::SessionManager>(
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new ChromeSessionManager(new LoginOobeSessionManagerDelegate()));
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else if (!base::SysInfo::IsRunningOnChromeOS() &&
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch             login_user_id == login::kStubUser) {
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    VLOG(1) << "Starting Chrome with StubLoginSessionManagerDelegate";
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return scoped_ptr<session_manager::SessionManager>(new ChromeSessionManager(
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new StubLoginSessionManagerDelegate(profile, login_user_id)));
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  } else {
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    VLOG(1) << "Starting Chrome with  RestoreAfterCrashSessionManagerDelegate";
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Restarting Chrome inside existing user session. Possible cases:
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // 1. Chrome is restarted after crash.
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // 2. Chrome is started in browser_tests skipping the login flow.
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // 3. Chrome is started on dev machine i.e. not on Chrome OS device w/o
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    //    login flow. In that case --login-user=[chromeos::login::kStubUser] is
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    //    added. See PreEarlyInitialization().
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return scoped_ptr<session_manager::SessionManager>(new ChromeSessionManager(
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        new RestoreAfterCrashSessionManagerDelegate(profile, login_user_id)));
74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
77116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChromeSessionManager::ChromeSessionManager(
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    session_manager::SessionManagerDelegate* delegate) {
79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  Initialize(delegate);
80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
82116680a4aac90f2aa7413d9095a592090648e557Ben MurdochChromeSessionManager::~ChromeSessionManager() {
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace chromeos
86