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

Unified Diff: chrome/browser/chromeos/app_mode/kiosk_app_launcher.cc

Issue 22914008: Refactor kiosk app launch to be part of login screen UI flow. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 4 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/app_mode/kiosk_app_launcher.cc
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_launcher.cc b/chrome/browser/chromeos/app_mode/kiosk_app_launcher.cc
deleted file mode 100644
index a2cac72e964aebb74bc19c585a2be69b23f94105..0000000000000000000000000000000000000000
--- a/chrome/browser/chromeos/app_mode/kiosk_app_launcher.cc
+++ /dev/null
@@ -1,273 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/chromeos/app_mode/kiosk_app_launcher.h"
-
-#include "base/chromeos/chromeos_version.h"
-#include "base/logging.h"
-#include "base/memory/weak_ptr.h"
-#include "base/message_loop/message_loop.h"
-#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
-#include "chrome/browser/chromeos/app_mode/startup_app_launcher.h"
-#include "chrome/browser/chromeos/login/login_display_host_impl.h"
-#include "chrome/browser/chromeos/login/login_utils.h"
-#include "chrome/browser/chromeos/login/user_manager.h"
-#include "chrome/browser/chromeos/settings/cros_settings.h"
-#include "chrome/browser/chromeos/ui/app_launch_view.h"
-#include "chrome/browser/lifetime/application_lifetime.h"
-#include "chromeos/cryptohome/async_method_caller.h"
-#include "chromeos/cryptohome/cryptohome_library.h"
-#include "chromeos/dbus/cryptohome_client.h"
-#include "chromeos/dbus/dbus_thread_manager.h"
-#include "content/public/browser/browser_thread.h"
-
-using content::BrowserThread;
-
-namespace chromeos {
-
-namespace {
-
-void IgnoreResult(bool mount_success, cryptohome::MountError mount_error) {}
-
-} // namespace
-
-// static
-KioskAppLauncher* KioskAppLauncher::running_instance_ = NULL;
-
-////////////////////////////////////////////////////////////////////////////////
-// KioskAppLauncher::CryptohomedChecker ensures cryptohome daemon is up
-// and running by issuing an IsMounted call. If the call does not go through
-// and chromeos::DBUS_METHOD_CALL_SUCCESS is not returned, it will retry after
-// some time out and at the maximum five times before it gives up. Upon
-// success, it resumes the launch by calling KioskAppLauncher::StartMount.
-
-class KioskAppLauncher::CryptohomedChecker
- : public base::SupportsWeakPtr<CryptohomedChecker> {
- public:
- explicit CryptohomedChecker(KioskAppLauncher* launcher)
- : launcher_(launcher),
- retry_count_(0) {
- }
- ~CryptohomedChecker() {}
-
- void StartCheck() {
- chromeos::DBusThreadManager::Get()->GetCryptohomeClient()->IsMounted(
- base::Bind(&CryptohomedChecker::OnCryptohomeIsMounted,
- AsWeakPtr()));
- }
-
- private:
- void OnCryptohomeIsMounted(chromeos::DBusMethodCallStatus call_status,
- bool is_mounted) {
- if (call_status != chromeos::DBUS_METHOD_CALL_SUCCESS) {
- const int kMaxRetryTimes = 5;
- ++retry_count_;
- if (retry_count_ > kMaxRetryTimes) {
- LOG(ERROR) << "Could not talk to cryptohomed for launching kiosk app.";
- ReportCheckResult(KioskAppLaunchError::CRYPTOHOMED_NOT_RUNNING);
- return;
- }
-
- const int retry_delay_in_milliseconds = 500 * (1 << retry_count_);
- base::MessageLoop::current()->PostDelayedTask(
- FROM_HERE,
- base::Bind(&CryptohomedChecker::StartCheck, AsWeakPtr()),
- base::TimeDelta::FromMilliseconds(retry_delay_in_milliseconds));
- return;
- }
-
- if (is_mounted)
- LOG(ERROR) << "Cryptohome is mounted before launching kiosk app.";
-
- // Proceed only when cryptohome is not mounded or running on dev box.
- if (!is_mounted || !base::chromeos::IsRunningOnChromeOS())
- ReportCheckResult(KioskAppLaunchError::NONE);
- else
- ReportCheckResult(KioskAppLaunchError::ALREADY_MOUNTED);
- }
-
- void ReportCheckResult(KioskAppLaunchError::Error error) {
- if (error == KioskAppLaunchError::NONE)
- launcher_->StartMount();
- else
- launcher_->ReportLaunchResult(error);
- }
-
- KioskAppLauncher* launcher_;
- int retry_count_;
-
- DISALLOW_COPY_AND_ASSIGN(CryptohomedChecker);
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// KioskAppLauncher::ProfileLoader creates or loads the app profile.
-
-class KioskAppLauncher::ProfileLoader : public LoginUtils::Delegate {
- public:
- ProfileLoader(KioskAppManager* kiosk_app_manager,
- KioskAppLauncher* kiosk_app_launcher)
- : kiosk_app_launcher_(kiosk_app_launcher),
- user_id_(kiosk_app_launcher->user_id_) {
- CHECK(!user_id_.empty());
- }
-
- virtual ~ProfileLoader() {
- LoginUtils::Get()->DelegateDeleted(this);
- }
-
- void Start() {
- cryptohome::AsyncMethodCaller::GetInstance()->AsyncGetSanitizedUsername(
- user_id_,
- base::Bind(&ProfileLoader::OnUsernameHashRetrieved,
- base::Unretained(this)));
- }
-
- private:
- void OnUsernameHashRetrieved(bool success,
- const std::string& username_hash) {
- if (!success) {
- LOG(ERROR) << "Unable to retrieve username hash for user '" << user_id_
- << "'.";
- kiosk_app_launcher_->ReportLaunchResult(
- KioskAppLaunchError::UNABLE_TO_RETRIEVE_HASH);
- return;
- }
- LoginUtils::Get()->PrepareProfile(
- UserContext(user_id_,
- std::string(), // password
- std::string(), // auth_code
- username_hash),
- std::string(), // display email
- false, // using_oauth
- false, // has_cookies
- false, // has_active_session
- this);
- }
-
- // LoginUtils::Delegate overrides:
- virtual void OnProfilePrepared(Profile* profile) OVERRIDE {
- kiosk_app_launcher_->OnProfilePrepared(profile);
- }
-
- KioskAppLauncher* kiosk_app_launcher_;
- std::string user_id_;
-
- DISALLOW_COPY_AND_ASSIGN(ProfileLoader);
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// KioskAppLauncher
-
-KioskAppLauncher::KioskAppLauncher(KioskAppManager* kiosk_app_manager,
- const std::string& app_id)
- : kiosk_app_manager_(kiosk_app_manager),
- app_id_(app_id),
- remove_attempted_(false) {
- KioskAppManager::App app;
- CHECK(kiosk_app_manager_->GetApp(app_id_, &app));
- user_id_ = app.user_id;
-}
-
-KioskAppLauncher::~KioskAppLauncher() {}
-
-void KioskAppLauncher::Start() {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- if (running_instance_) {
- LOG(WARNING) << "Unable to launch " << app_id_ << "with a pending launch.";
- ReportLaunchResult(KioskAppLaunchError::HAS_PENDING_LAUNCH);
- return;
- }
-
- running_instance_ = this; // Reset in ReportLaunchResult.
-
- // Show app launch splash. The spash is removed either after a successful
- // launch or chrome exit because of launch failure.
- chromeos::ShowAppLaunchSplashScreen(app_id_);
-
- // Check cryptohomed. If all goes good, flow goes to StartMount. Otherwise
- // it goes to ReportLaunchResult with failure.
- crytohomed_checker.reset(new CryptohomedChecker(this));
- crytohomed_checker->StartCheck();
-}
-
-void KioskAppLauncher::ReportLaunchResult(KioskAppLaunchError::Error error) {
- DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
-
- running_instance_ = NULL;
-
- if (error != KioskAppLaunchError::NONE) {
- // Saves the error and ends the session to go back to login screen.
- KioskAppLaunchError::Save(error);
- chrome::AttemptUserExit();
- }
-
- delete this;
-}
-
-void KioskAppLauncher::StartMount() {
- // Nuke old home that uses |app_id_| as cryptohome user id.
- // TODO(xiyuan): Remove this after all clients migrated to new home.
- cryptohome::AsyncMethodCaller::GetInstance()->AsyncRemove(
- app_id_,
- base::Bind(&IgnoreResult));
-
- cryptohome::AsyncMethodCaller::GetInstance()->AsyncMountPublic(
- user_id_,
- cryptohome::CREATE_IF_MISSING,
- base::Bind(&KioskAppLauncher::MountCallback,
- base::Unretained(this)));
-}
-
-void KioskAppLauncher::MountCallback(bool mount_success,
- cryptohome::MountError mount_error) {
- if (mount_success) {
- profile_loader_.reset(new ProfileLoader(kiosk_app_manager_, this));
- profile_loader_->Start();
- return;
- }
-
- if (!remove_attempted_) {
- LOG(ERROR) << "Attempt to remove app cryptohome because of mount failure"
- << ", mount error=" << mount_error;
-
- remove_attempted_ = true;
- AttemptRemove();
- return;
- }
-
- LOG(ERROR) << "Failed to mount app cryptohome, error=" << mount_error;
- ReportLaunchResult(KioskAppLaunchError::UNABLE_TO_MOUNT);
-}
-
-void KioskAppLauncher::AttemptRemove() {
- cryptohome::AsyncMethodCaller::GetInstance()->AsyncRemove(
- user_id_,
- base::Bind(&KioskAppLauncher::RemoveCallback,
- base::Unretained(this)));
-}
-
-void KioskAppLauncher::RemoveCallback(bool success,
- cryptohome::MountError return_code) {
- if (success) {
- StartMount();
- return;
- }
-
- LOG(ERROR) << "Failed to remove app cryptohome, erro=" << return_code;
- ReportLaunchResult(KioskAppLaunchError::UNABLE_TO_REMOVE);
-}
-
-void KioskAppLauncher::OnProfilePrepared(Profile* profile) {
- // StartupAppLauncher deletes itself when done.
- (new chromeos::StartupAppLauncher(profile, app_id_))->Start();
-
- if (LoginDisplayHostImpl::default_host())
- LoginDisplayHostImpl::default_host()->Finalize();
- UserManager::Get()->SessionStarted();
-
- ReportLaunchResult(KioskAppLaunchError::NONE);
-}
-
-} // namespace chromeos
« no previous file with comments | « chrome/browser/chromeos/app_mode/kiosk_app_launcher.h ('k') | chrome/browser/chromeos/app_mode/kiosk_profile_loader.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698