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

Unified Diff: chrome/browser/chromeos/app_mode/startup_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/startup_app_launcher.cc
diff --git a/chrome/browser/chromeos/app_mode/startup_app_launcher.cc b/chrome/browser/chromeos/app_mode/startup_app_launcher.cc
deleted file mode 100644
index 8308bf05ba7566771231d1b25fc3d5df79840646..0000000000000000000000000000000000000000
--- a/chrome/browser/chromeos/app_mode/startup_app_launcher.cc
+++ /dev/null
@@ -1,339 +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/startup_app_launcher.h"
-
-#include "ash/shell.h"
-#include "base/command_line.h"
-#include "base/files/file_path.h"
-#include "base/json/json_file_value_serializer.h"
-#include "base/path_service.h"
-#include "base/time/time.h"
-#include "base/values.h"
-#include "chrome/browser/chrome_notification_types.h"
-#include "chrome/browser/chromeos/app_mode/app_session_lifetime.h"
-#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
-#include "chrome/browser/chromeos/login/user_manager.h"
-#include "chrome/browser/chromeos/ui/app_launch_view.h"
-#include "chrome/browser/extensions/extension_service.h"
-#include "chrome/browser/extensions/extension_system.h"
-#include "chrome/browser/extensions/webstore_startup_installer.h"
-#include "chrome/browser/lifetime/application_lifetime.h"
-#include "chrome/browser/signin/profile_oauth2_token_service.h"
-#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
-#include "chrome/browser/signin/token_service.h"
-#include "chrome/browser/signin/token_service_factory.h"
-#include "chrome/browser/ui/extensions/application_launch.h"
-#include "chrome/common/chrome_paths.h"
-#include "chrome/common/chrome_switches.h"
-#include "chrome/common/extensions/extension.h"
-#include "chrome/common/extensions/manifest_handlers/kiosk_enabled_info.h"
-#include "content/public/browser/browser_thread.h"
-#include "content/public/browser/notification_service.h"
-#include "google_apis/gaia/gaia_auth_consumer.h"
-#include "google_apis/gaia/gaia_constants.h"
-
-using content::BrowserThread;
-using extensions::Extension;
-using extensions::WebstoreStartupInstaller;
-
-namespace chromeos {
-
-namespace {
-
-const char kOAuthRefreshToken[] = "refresh_token";
-const char kOAuthClientId[] = "client_id";
-const char kOAuthClientSecret[] = "client_secret";
-
-const base::FilePath::CharType kOAuthFileName[] =
- FILE_PATH_LITERAL("kiosk_auth");
-
-// Application install splash screen minimum show time in milliseconds.
-const int kAppInstallSplashScreenMinTimeMS = 3000;
-
-bool IsAppInstalled(Profile* profile, const std::string& app_id) {
- return extensions::ExtensionSystem::Get(profile)->extension_service()->
- GetInstalledExtension(app_id);
-}
-
-} // namespace
-
-StartupAppLauncher::StartupAppLauncher(Profile* profile,
- const std::string& app_id)
- : profile_(profile),
- app_id_(app_id),
- launch_splash_start_time_(0) {
- DCHECK(profile_);
- DCHECK(Extension::IdIsValid(app_id_));
- DCHECK(ash::Shell::HasInstance());
- ash::Shell::GetInstance()->AddPreTargetHandler(this);
-}
-
-StartupAppLauncher::~StartupAppLauncher() {
- DCHECK(ash::Shell::HasInstance());
- ash::Shell::GetInstance()->RemovePreTargetHandler(this);
-}
-
-void StartupAppLauncher::Start() {
- launch_splash_start_time_ = base::TimeTicks::Now().ToInternalValue();
- DVLOG(1) << "Starting... connection = "
- << net::NetworkChangeNotifier::GetConnectionType();
- chromeos::ShowAppLaunchSplashScreen(app_id_);
- StartLoadingOAuthFile();
-}
-
-void StartupAppLauncher::StartLoadingOAuthFile() {
- KioskOAuthParams* auth_params = new KioskOAuthParams();
- BrowserThread::PostBlockingPoolTaskAndReply(
- FROM_HERE,
- base::Bind(&StartupAppLauncher::LoadOAuthFileOnBlockingPool,
- auth_params),
- base::Bind(&StartupAppLauncher::OnOAuthFileLoaded,
- AsWeakPtr(),
- base::Owned(auth_params)));
-}
-
-// static.
-void StartupAppLauncher::LoadOAuthFileOnBlockingPool(
- KioskOAuthParams* auth_params) {
- int error_code = JSONFileValueSerializer::JSON_NO_ERROR;
- std::string error_msg;
- base::FilePath user_data_dir;
- CHECK(PathService::Get(chrome::DIR_USER_DATA, &user_data_dir));
- base::FilePath auth_file = user_data_dir.Append(kOAuthFileName);
- scoped_ptr<JSONFileValueSerializer> serializer(
- new JSONFileValueSerializer(user_data_dir.Append(kOAuthFileName)));
- scoped_ptr<base::Value> value(
- serializer->Deserialize(&error_code, &error_msg));
- base::DictionaryValue* dict = NULL;
- if (error_code != JSONFileValueSerializer::JSON_NO_ERROR ||
- !value.get() || !value->GetAsDictionary(&dict)) {
- LOG(WARNING) << "Can't find auth file at " << auth_file.value();
- return;
- }
-
- dict->GetString(kOAuthRefreshToken, &auth_params->refresh_token);
- dict->GetString(kOAuthClientId, &auth_params->client_id);
- dict->GetString(kOAuthClientSecret, &auth_params->client_secret);
-}
-
-void StartupAppLauncher::OnOAuthFileLoaded(KioskOAuthParams* auth_params) {
- auth_params_ = *auth_params;
- // Override chrome client_id and secret that will be used for identity
- // API token minting.
- if (!auth_params_.client_id.empty() && !auth_params_.client_secret.empty()) {
- UserManager::Get()->SetAppModeChromeClientOAuthInfo(
- auth_params_.client_id,
- auth_params_.client_secret);
- }
-
- // If we are restarting chrome (i.e. on crash), we need to initialize
- // TokenService as well.
- InitializeTokenService();
-}
-
-void StartupAppLauncher::InitializeNetwork() {
- chromeos::UpdateAppLaunchSplashScreenState(
- chromeos::APP_LAUNCH_STATE_PREPARING_NETWORK);
- // Set a maximum allowed wait time for network.
- const int kMaxNetworkWaitSeconds = 5 * 60;
- network_wait_timer_.Start(
- FROM_HERE,
- base::TimeDelta::FromSeconds(kMaxNetworkWaitSeconds),
- this, &StartupAppLauncher::OnNetworkWaitTimedout);
-
- net::NetworkChangeNotifier::AddNetworkChangeObserver(this);
- OnNetworkChanged(net::NetworkChangeNotifier::GetConnectionType());
-}
-
-void StartupAppLauncher::InitializeTokenService() {
- chromeos::UpdateAppLaunchSplashScreenState(
- chromeos::APP_LAUNCH_STATE_LOADING_TOKEN_SERVICE);
- ProfileOAuth2TokenService* profile_token_service =
- ProfileOAuth2TokenServiceFactory::GetForProfile(profile_);
- if (profile_token_service->RefreshTokenIsAvailable()) {
- InitializeNetwork();
- return;
- }
-
- // At the end of this method, the execution will be put on hold until
- // ProfileOAuth2TokenService triggers either OnRefreshTokenAvailable or
- // OnRefreshTokensLoaded. Given that we want to handle exactly one event,
- // whichever comes first, both handlers call RemoveObserver on PO2TS. Handling
- // any of the two events is the only way to resume the execution and enable
- // Cleanup method to be called, self-invoking a destructor. In destructor
- // StartupAppLauncher is no longer an observer of PO2TS and there is no need
- // to call RemoveObserver again.
- profile_token_service->AddObserver(this);
-
- TokenService* token_service = TokenServiceFactory::GetForProfile(profile_);
- token_service->Initialize(GaiaConstants::kChromeSource, profile_);
-
- // Pass oauth2 refresh token from the auth file.
- // TODO(zelidrag): We should probably remove this option after M27.
- // TODO(fgorski): This can go when we have persistence implemented on PO2TS.
- // Unless the code is no longer needed.
- if (!auth_params_.refresh_token.empty()) {
- token_service->UpdateCredentialsWithOAuth2(
- GaiaAuthConsumer::ClientOAuthResult(
- auth_params_.refresh_token,
- std::string(), // access_token
- 0)); // new_expires_in_secs
- } else {
- // Load whatever tokens we have stored there last time around.
- token_service->LoadTokensFromDB();
- }
-}
-
-void StartupAppLauncher::OnRefreshTokenAvailable(
- const std::string& account_id) {
- ProfileOAuth2TokenServiceFactory::GetForProfile(profile_)
- ->RemoveObserver(this);
- InitializeNetwork();
-}
-
-void StartupAppLauncher::OnRefreshTokensLoaded() {
- ProfileOAuth2TokenServiceFactory::GetForProfile(profile_)
- ->RemoveObserver(this);
- InitializeNetwork();
-}
-
-void StartupAppLauncher::Cleanup() {
- chromeos::CloseAppLaunchSplashScreen();
-
- delete this;
-}
-
-void StartupAppLauncher::OnLaunchSuccess() {
- const int64 time_taken_ms = (base::TimeTicks::Now() -
- base::TimeTicks::FromInternalValue(launch_splash_start_time_)).
- InMilliseconds();
-
- // Enforce that we show app install splash screen for some minimum amount
- // of time.
- if (time_taken_ms < kAppInstallSplashScreenMinTimeMS) {
- BrowserThread::PostDelayedTask(
- BrowserThread::UI,
- FROM_HERE,
- base::Bind(&StartupAppLauncher::OnLaunchSuccess, AsWeakPtr()),
- base::TimeDelta::FromMilliseconds(
- kAppInstallSplashScreenMinTimeMS - time_taken_ms));
- return;
- }
-
- Cleanup();
-}
-
-void StartupAppLauncher::OnLaunchFailure(KioskAppLaunchError::Error error) {
- DCHECK_NE(KioskAppLaunchError::NONE, error);
-
- // Saves the error and ends the session to go back to login screen.
- KioskAppLaunchError::Save(error);
- chrome::AttemptUserExit();
-
- Cleanup();
-}
-
-void StartupAppLauncher::Launch() {
- const Extension* extension = extensions::ExtensionSystem::Get(profile_)->
- extension_service()->GetInstalledExtension(app_id_);
- CHECK(extension);
-
- if (!extensions::KioskEnabledInfo::IsKioskEnabled(extension)) {
- OnLaunchFailure(KioskAppLaunchError::NOT_KIOSK_ENABLED);
- return;
- }
-
- // Always open the app in a window.
- chrome::OpenApplication(chrome::AppLaunchParams(profile_,
- extension,
- extension_misc::LAUNCH_WINDOW,
- NEW_WINDOW));
- InitAppSession(profile_, app_id_);
-
- content::NotificationService::current()->Notify(
- chrome::NOTIFICATION_KIOSK_APP_LAUNCHED,
- content::NotificationService::AllSources(),
- content::NotificationService::NoDetails());
-
- OnLaunchSuccess();
-}
-
-void StartupAppLauncher::BeginInstall() {
- DVLOG(1) << "BeginInstall... connection = "
- << net::NetworkChangeNotifier::GetConnectionType();
-
- chromeos::UpdateAppLaunchSplashScreenState(
- chromeos::APP_LAUNCH_STATE_INSTALLING_APPLICATION);
-
- if (IsAppInstalled(profile_, app_id_)) {
- Launch();
- return;
- }
-
- installer_ = new WebstoreStartupInstaller(
- app_id_,
- profile_,
- false,
- base::Bind(&StartupAppLauncher::InstallCallback, AsWeakPtr()));
- installer_->BeginInstall();
-}
-
-void StartupAppLauncher::InstallCallback(bool success,
- const std::string& error) {
- installer_ = NULL;
- if (success) {
- // Schedules Launch() to be called after the callback returns.
- // So that the app finishes its installation.
- BrowserThread::PostTask(
- BrowserThread::UI,
- FROM_HERE,
- base::Bind(&StartupAppLauncher::Launch, AsWeakPtr()));
- return;
- }
-
- LOG(ERROR) << "Failed to install app with error: " << error;
- OnLaunchFailure(KioskAppLaunchError::UNABLE_TO_INSTALL);
-}
-
-void StartupAppLauncher::OnNetworkWaitTimedout() {
- LOG(WARNING) << "OnNetworkWaitTimedout... connection = "
- << net::NetworkChangeNotifier::GetConnectionType();
- // Timeout in waiting for online. Try the install anyway.
- net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
- BeginInstall();
-}
-
-void StartupAppLauncher::OnNetworkChanged(
- net::NetworkChangeNotifier::ConnectionType type) {
- DVLOG(1) << "OnNetworkChanged... connection = "
- << net::NetworkChangeNotifier::GetConnectionType();
- if (!net::NetworkChangeNotifier::IsOffline()) {
- DVLOG(1) << "Network up and running!";
- net::NetworkChangeNotifier::RemoveNetworkChangeObserver(this);
- network_wait_timer_.Stop();
-
- BeginInstall();
- } else {
- DVLOG(1) << "Network not running yet!";
- }
-}
-
-void StartupAppLauncher::OnKeyEvent(ui::KeyEvent* event) {
- if (event->type() != ui::ET_KEY_PRESSED)
- return;
-
- if (KioskAppManager::Get()->GetDisableBailoutShortcut())
- return;
-
- if (event->key_code() != ui::VKEY_S ||
- !(event->flags() & ui::EF_CONTROL_DOWN) ||
- !(event->flags() & ui::EF_ALT_DOWN)) {
- return;
- }
-
- OnLaunchFailure(KioskAppLaunchError::USER_CANCEL);
-}
-
-} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698