Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(327)

Unified Diff: chrome/browser/chromeos/login/session/user_session_manager.cc

Issue 656283002: [session_manager] Move user session initialization code out of ExistingUserController (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update FakeLoginUtils to launch browser Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/login/session/user_session_manager.cc
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc
index de2ea43d9dff7611163003e0b5b2434c2474cf40..c840b773250ddf11c120ce5dd55cae82ca9fb457 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -15,6 +15,7 @@
#include "base/prefs/pref_registry_simple.h"
#include "base/prefs/pref_service.h"
#include "base/strings/string16.h"
+#include "base/strings/stringprintf.h"
#include "base/sys_info.h"
#include "base/task_runner_util.h"
#include "base/threading/worker_pool.h"
@@ -23,8 +24,10 @@
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part_chromeos.h"
#include "chrome/browser/chrome_notification_types.h"
+#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
#include "chrome/browser/chromeos/base/locale_util.h"
#include "chrome/browser/chromeos/boot_times_loader.h"
+#include "chrome/browser/chromeos/first_run/first_run.h"
#include "chrome/browser/chromeos/input_method/input_method_util.h"
#include "chrome/browser/chromeos/login/chrome_restart_request.h"
#include "chrome/browser/chromeos/login/demo_mode/demo_app_launcher.h"
@@ -35,8 +38,12 @@
#include "chrome/browser/chromeos/login/signin/oauth2_login_manager.h"
#include "chrome/browser/chromeos/login/signin/oauth2_login_manager_factory.h"
#include "chrome/browser/chromeos/login/startup_utils.h"
+#include "chrome/browser/chromeos/login/ui/login_display_host.h"
+#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
+#include "chrome/browser/chromeos/login/user_flow.h"
#include "chrome/browser/chromeos/login/users/chrome_user_manager.h"
#include "chrome/browser/chromeos/login/users/supervised_user_manager.h"
+#include "chrome/browser/chromeos/login/wizard_controller.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
@@ -45,6 +52,7 @@
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/net/crl_set_fetcher.h"
#include "chrome/browser/net/nss_context.h"
+#include "chrome/browser/prefs/session_startup_pref.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
#include "chrome/browser/rlz/rlz.h"
@@ -79,6 +87,11 @@ namespace chromeos {
namespace {
+// ChromeVox tutorial URL (used in place of "getting started" url when
+// accessibility is enabled).
+const char kChromeVoxTutorialURLPattern[] =
+ "http://www.chromevox.com/tutorial/index.html?lang=%s";
+
void InitLocaleAndInputMethodsForNewUser(
UserSessionManager* session_manager,
Profile* profile,
@@ -278,12 +291,14 @@ void UserSessionManager::CompleteGuestSessionLogin(const GURL& start_url) {
void UserSessionManager::StartSession(
const UserContext& user_context,
+ StartSessionType start_session_type,
scoped_refptr<Authenticator> authenticator,
bool has_auth_cookies,
bool has_active_session,
UserSessionManagerDelegate* delegate) {
authenticator_ = authenticator;
delegate_ = delegate;
+ start_session_type_ = start_session_type;
VLOG(1) << "Starting session for " << user_context.GetUserID();
@@ -615,9 +630,8 @@ void UserSessionManager::OnConnectionTypeChanged(
}
}
-void UserSessionManager::OnProfilePrepared(Profile* profile) {
- LoginUtils::Get()->DoBrowserLaunch(profile, NULL); // host_, not needed here
-
+void UserSessionManager::OnProfilePrepared(Profile* profile,
+ bool browser_launched) {
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
@@ -743,8 +757,10 @@ void UserSessionManager::InitProfilePreferences(
void UserSessionManager::UserProfileInitialized(Profile* profile,
bool is_incognito_profile,
const std::string& user_id) {
+ // Demo user signed in.
if (is_incognito_profile) {
profile->OnLogin();
+
// Send the notification before creating the browser so additional objects
// that need the profile (e.g. the launcher) can be created first.
content::NotificationService::current()->Notify(
@@ -753,7 +769,7 @@ void UserSessionManager::UserProfileInitialized(Profile* profile,
content::Details<Profile>(profile));
if (delegate_)
- delegate_->OnProfilePrepared(profile);
+ delegate_->OnProfilePrepared(profile, false);
return;
}
@@ -852,6 +868,10 @@ void UserSessionManager::FinalizePrepareProfile(Profile* profile) {
UpdateEasyUnlockKeys(user_context_);
user_context_.ClearSecrets();
+ // Now that profile is ready, proceed to either alternative login flows or
+ // launch browser.
+ bool browser_launched = InitializeUserSession(profile);
+
// TODO(nkostylev): This pointer should probably never be NULL, but it looks
// like LoginUtilsImpl::OnProfileCreated() may be getting called before
// UserSessionManager::PrepareProfile() has set |delegate_| when Chrome is
@@ -859,7 +879,103 @@ void UserSessionManager::FinalizePrepareProfile(Profile* profile) {
// this 'if' statement with a CHECK(delegate_) once the underlying issue is
// resolved.
if (delegate_)
- delegate_->OnProfilePrepared(profile);
+ delegate_->OnProfilePrepared(profile, browser_launched);
+}
+
+void UserSessionManager::ActivateWizard(const std::string& screen_name) {
+ LoginDisplayHost* host = LoginDisplayHostImpl::default_host();
+ DCHECK(host);
+ if (host) {
+ scoped_ptr<base::DictionaryValue> params;
+ host->StartWizard(screen_name, params.Pass());
+ }
+}
+
+void UserSessionManager::InitializeStartUrls() const {
+ std::vector<std::string> start_urls;
+
+ const base::ListValue *urls;
+ user_manager::UserManager* user_manager = user_manager::UserManager::Get();
+ bool can_show_getstarted_guide =
+ user_manager->GetActiveUser()->GetType() ==
+ user_manager::USER_TYPE_REGULAR &&
+ !user_manager->IsCurrentUserNonCryptohomeDataEphemeral();
+ if (user_manager->IsLoggedInAsDemoUser()) {
+ if (CrosSettings::Get()->GetList(kStartUpUrls, &urls)) {
+ // The retail mode user will get start URLs from a special policy if it is
+ // set.
+ for (base::ListValue::const_iterator it = urls->begin();
+ it != urls->end(); ++it) {
+ std::string url;
+ if ((*it)->GetAsString(&url))
+ start_urls.push_back(url);
+ }
+ }
+ can_show_getstarted_guide = false;
+ // Skip the default first-run behavior for public accounts.
+ } else if (!user_manager->IsLoggedInAsPublicAccount()) {
+ if (AccessibilityManager::Get()->IsSpokenFeedbackEnabled()) {
+ const char* url = kChromeVoxTutorialURLPattern;
+ PrefService* prefs = g_browser_process->local_state();
+ const std::string current_locale =
+ base::StringToLowerASCII(prefs->GetString(prefs::kApplicationLocale));
+ std::string vox_url = base::StringPrintf(url, current_locale.c_str());
+ start_urls.push_back(vox_url);
+ can_show_getstarted_guide = false;
+ }
+ }
+
+ // Only show getting started guide for a new user.
+ const bool should_show_getstarted_guide = user_manager->IsCurrentUserNew();
+
+ if (can_show_getstarted_guide && should_show_getstarted_guide) {
+ // Don't open default Chrome window if we're going to launch the first-run
+ // app. Because we dont' want the first-run app to be hidden in the
+ // background.
+ CommandLine::ForCurrentProcess()->AppendSwitch(::switches::kSilentLaunch);
+ first_run::MaybeLaunchDialogAfterSessionStart();
+ } else {
+ for (size_t i = 0; i < start_urls.size(); ++i) {
+ CommandLine::ForCurrentProcess()->AppendArg(start_urls[i]);
+ }
+ }
+}
+
+bool UserSessionManager::InitializeUserSession(Profile* profile) {
+ user_manager::UserManager* user_manager = user_manager::UserManager::Get();
+
+ // Kiosk apps has their on session initialization pipeline.
Denis Kuznetsov (DE-MUC) 2014/10/20 13:38:59 on->own?
Nikita (slow) 2014/10/20 13:52:11 Done.
+ if (user_manager->IsLoggedInAsKioskApp())
+ return false;
+
+ if (start_session_type_ == PRIMARY_USER_SESSION) {
+ UserFlow* user_flow = ChromeUserManager::Get()->GetCurrentUserFlow();
+ WizardController* oobe_controller = WizardController::default_controller();
+ base::CommandLine* cmdline = CommandLine::ForCurrentProcess();
+ bool skip_post_login_screens =
+ user_flow->ShouldSkipPostLoginScreens() ||
+ (oobe_controller && oobe_controller->skip_post_login_screens()) ||
+ cmdline->HasSwitch(chromeos::switches::kOobeSkipPostLogin);
+
+ if (user_manager->IsCurrentUserNew() && !skip_post_login_screens) {
+ // Don't specify start URLs if the administrator has configured the start
+ // URLs via policy.
+ if (!SessionStartupPref::TypeIsManaged(profile->GetPrefs()))
+ InitializeStartUrls();
+
+ // Mark the device as registered., i.e. the second part of OOBE as
+ // completed.
+ if (!StartupUtils::IsDeviceRegistered())
+ StartupUtils::MarkDeviceRegistered(base::Closure());
+
+ ActivateWizard(WizardController::kTermsOfServiceScreenName);
+ return false;
+ }
+ }
+
+ LoginUtils::Get()->DoBrowserLaunch(profile,
+ LoginDisplayHostImpl::default_host());
+ return true;
}
void UserSessionManager::InitSessionRestoreStrategy() {
@@ -943,7 +1059,7 @@ void UserSessionManager::InitRlzImpl(Profile* profile, bool disabled) {
}
// Init the RLZ library.
int ping_delay = profile->GetPrefs()->GetInteger(
- first_run::GetPingDelayPrefName().c_str());
+ ::first_run::GetPingDelayPrefName().c_str());
// Negative ping delay means to send ping immediately after a first search is
// recorded.
RLZTracker::InitRlzFromProfileDelayed(
@@ -1042,10 +1158,13 @@ void UserSessionManager::RestorePendingUserSessions() {
user_context.SetIsUsingOAuth(false);
// Will call OnProfilePrepared() once profile has been loaded.
+ // Only handling secondary users here since primary user profile
+ // (and session) has been loaded on Chrome startup.
StartSession(user_context,
+ SECONDARY_USER_SESSION_AFTER_CRASH,
NULL, // authenticator
false, // has_auth_cookies
- true, // has_active_session
+ true, // has_active_session, this is restart after crash
this);
} else {
RestorePendingUserSessions();

Powered by Google App Engine
This is Rietveld 408576698