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

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

Issue 300843013: Install and launch kiosk app from cached crx file at start up. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remove the useless offline_enabled_app_profile testing data. Created 6 years, 5 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
index 8c99fb8333774572a2ce66128fcb64dda14b7081..e65e41147af5c816947b72f7c47d699fb8150e31 100644
--- a/chrome/browser/chromeos/app_mode/startup_app_launcher.cc
+++ b/chrome/browser/chromeos/app_mode/startup_app_launcher.cc
@@ -17,8 +17,9 @@
#include "chrome/browser/chromeos/login/session/user_session_manager.h"
#include "chrome/browser/chromeos/login/users/user_manager.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/extensions/install_tracker.h"
+#include "chrome/browser/extensions/install_tracker_factory.h"
#include "chrome/browser/extensions/updater/extension_updater.h"
-#include "chrome/browser/extensions/webstore_startup_installer.h"
#include "chrome/browser/lifetime/application_lifetime.h"
#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
#include "chrome/browser/signin/signin_manager_factory.h"
@@ -46,7 +47,6 @@
using content::BrowserThread;
using extensions::Extension;
-using extensions::WebstoreStartupInstaller;
namespace chromeos {
@@ -59,7 +59,7 @@ const char kOAuthClientSecret[] = "client_secret";
const base::FilePath::CharType kOAuthFileName[] =
FILE_PATH_LITERAL("kiosk_auth");
-const int kMaxInstallAttempt = 5;
+const int kMaxLaunchAttempt = 5;
} // namespace
@@ -72,13 +72,17 @@ StartupAppLauncher::StartupAppLauncher(Profile* profile,
diagnostic_mode_(diagnostic_mode),
delegate_(delegate),
network_ready_handled_(false),
- install_attempt_(0),
- ready_to_launch_(false) {
+ launch_attempt_(0),
+ ready_to_launch_(false),
+ wait_for_crx_update_(false) {
DCHECK(profile_);
DCHECK(Extension::IdIsValid(app_id_));
+ KioskAppManager::Get()->AddObserver(this);
}
StartupAppLauncher::~StartupAppLauncher() {
+ KioskAppManager::Get()->RemoveObserver(this);
+
// StartupAppLauncher can be deleted at anytime during the launch process
// through a user bailout shortcut.
ProfileOAuth2TokenServiceFactory::GetForProfile(profile_)
@@ -90,10 +94,13 @@ void StartupAppLauncher::Initialize() {
}
void StartupAppLauncher::ContinueWithNetworkReady() {
- // Starts install if it is not started.
if (!network_ready_handled_) {
network_ready_handled_ = true;
- MaybeInstall();
+ // The network might not be ready when KioskAppManager tries to update
+ // external cache initially. Update the external cache now that the network
+ // is ready for sure.
+ wait_for_crx_update_ = true;
+ KioskAppManager::Get()->UpdateExternalCache();
}
}
@@ -152,8 +159,11 @@ void StartupAppLauncher::OnOAuthFileLoaded(KioskOAuthParams* auth_params) {
void StartupAppLauncher::RestartLauncher() {
// If the installer is still running in the background, we don't need to
// restart the launch process. We will just wait until it completes and
- // lunches the kiosk app.
- if (installer_ != NULL) {
+ // launches the kiosk app.
+ if (extensions::ExtensionSystem::Get(profile_)
+ ->extension_service()
+ ->pending_extension_manager()
+ ->IsIdPending(app_id_)) {
LOG(WARNING) << "Installer still running";
return;
}
@@ -166,20 +176,23 @@ void StartupAppLauncher::MaybeInitializeNetwork() {
const Extension* extension = extensions::ExtensionSystem::Get(profile_)->
extension_service()->GetInstalledExtension(app_id_);
- const bool requires_network = !extension ||
- !extensions::OfflineEnabledInfo::IsOfflineEnabled(extension);
+ bool crx_cached = KioskAppManager::Get()->HasCachedCrx(app_id_);
+ const bool requires_network =
+ (!extension && !crx_cached) ||
+ (extension &&
+ !extensions::OfflineEnabledInfo::IsOfflineEnabled(extension));
if (requires_network) {
delegate_->InitializeNetwork();
return;
}
- // Offline enabled app attempts update if network is ready. Otherwise,
- // go directly to launch.
+ // Update the offline enabled crx cache if the network is ready;
+ // or just install the app.
if (delegate_->IsNetworkReady())
ContinueWithNetworkReady();
else
- OnReadyToLaunch();
+ BeginInstall();
}
void StartupAppLauncher::InitializeTokenService() {
@@ -228,6 +241,77 @@ void StartupAppLauncher::OnRefreshTokensLoaded() {
MaybeInitializeNetwork();
}
+void StartupAppLauncher::MaybeLaunchApp() {
+ // Check if the app is offline enabled.
+ const Extension* extension = extensions::ExtensionSystem::Get(profile_)
+ ->extension_service()
+ ->GetInstalledExtension(app_id_);
+ DCHECK(extension);
+ const bool offline_enabled =
+ extensions::OfflineEnabledInfo::IsOfflineEnabled(extension);
+ if (offline_enabled || delegate_->IsNetworkReady()) {
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&StartupAppLauncher::OnReadyToLaunch, AsWeakPtr()));
+ } else {
+ ++launch_attempt_;
+ if (launch_attempt_ < kMaxLaunchAttempt) {
+ BrowserThread::PostTask(
+ BrowserThread::UI,
+ FROM_HERE,
+ base::Bind(&StartupAppLauncher::MaybeInitializeNetwork, AsWeakPtr()));
+ return;
+ }
+ OnLaunchFailure(KioskAppLaunchError::UNABLE_TO_LAUNCH);
+ }
+}
+
+void StartupAppLauncher::OnFinishCrxInstall(const std::string& extension_id,
+ bool success) {
+ if (extension_id != app_id_)
+ return;
+
+ extensions::InstallTracker* tracker =
+ extensions::InstallTrackerFactory::GetForProfile(profile_);
+ tracker->RemoveObserver(this);
+ if (delegate_->IsShowingNetworkConfigScreen()) {
+ LOG(WARNING) << "Showing network config screen";
+ return;
+ }
+
+ if (success) {
+ MaybeLaunchApp();
+ return;
+ }
+
+ LOG(ERROR) << "Failed to install the kiosk application app_id: "
+ << extension_id;
+ OnLaunchFailure(KioskAppLaunchError::UNABLE_TO_INSTALL);
+}
+
+void StartupAppLauncher::OnKioskExtensionLoadedInCache(
+ const std::string& app_id) {
+ OnKioskAppDataLoadStatusChanged(app_id);
+}
+
+void StartupAppLauncher::OnKioskExtensionDownloadFailed(
+ const std::string& app_id) {
+ OnKioskAppDataLoadStatusChanged(app_id);
+}
+
+void StartupAppLauncher::OnKioskAppDataLoadStatusChanged(
+ const std::string& app_id) {
+ if (app_id != app_id_ || !wait_for_crx_update_)
+ return;
+
+ wait_for_crx_update_ = false;
+ if (KioskAppManager::Get()->HasCachedCrx(app_id_))
+ BeginInstall();
+ else
+ OnLaunchFailure(KioskAppLaunchError::UNABLE_TO_DOWNLOAD);
+}
+
void StartupAppLauncher::LaunchApp() {
if (!ready_to_launch_) {
NOTREACHED();
@@ -273,71 +357,34 @@ void StartupAppLauncher::OnLaunchFailure(KioskAppLaunchError::Error error) {
delegate_->OnLaunchFailed(error);
}
-void StartupAppLauncher::MaybeInstall() {
- delegate_->OnInstallingApp();
-
- ExtensionService* extension_service =
- extensions::ExtensionSystem::Get(profile_)->extension_service();
- if (!extension_service->GetInstalledExtension(app_id_)) {
- BeginInstall();
- return;
- }
-
- extensions::ExtensionUpdater::CheckParams check_params;
- check_params.ids.push_back(app_id_);
- check_params.install_immediately = true;
- check_params.callback =
- base::Bind(&StartupAppLauncher::OnUpdateCheckFinished, AsWeakPtr());
- extension_service->updater()->CheckNow(check_params);
-}
-
void StartupAppLauncher::OnUpdateCheckFinished() {
OnReadyToLaunch();
UpdateAppData();
}
void StartupAppLauncher::BeginInstall() {
- 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 (delegate_->IsShowingNetworkConfigScreen()) {
- LOG(WARNING) << "Showing network config screen";
- return;
- }
-
- if (success) {
- // Finish initialization after the callback returns.
- // So that the app finishes its installation.
- BrowserThread::PostTask(
- BrowserThread::UI,
- FROM_HERE,
- base::Bind(&StartupAppLauncher::OnReadyToLaunch,
- AsWeakPtr()));
+ KioskAppManager::Get()->InstallFromCache(app_id_);
+ if (extensions::ExtensionSystem::Get(profile_)
+ ->extension_service()
+ ->pending_extension_manager()
+ ->IsIdPending(app_id_)) {
+ delegate_->OnInstallingApp();
+ // Observe the crx installation events.
+ extensions::InstallTracker* tracker =
+ extensions::InstallTrackerFactory::GetForProfile(profile_);
+ tracker->AddObserver(this);
return;
}
- LOG(ERROR) << "App install failed: " << error
- << ", for attempt " << install_attempt_;
-
- ++install_attempt_;
- if (install_attempt_ < kMaxInstallAttempt) {
- BrowserThread::PostTask(
- BrowserThread::UI,
- FROM_HERE,
- base::Bind(&StartupAppLauncher::MaybeInitializeNetwork,
- AsWeakPtr()));
- return;
+ if (extensions::ExtensionSystem::Get(profile_)
+ ->extension_service()
+ ->GetInstalledExtension(app_id_)) {
+ // Launch the app.
+ OnReadyToLaunch();
+ } else {
+ // The extension is skipped for installation due to some error.
+ OnLaunchFailure(KioskAppLaunchError::UNABLE_TO_INSTALL);
}
-
- OnLaunchFailure(KioskAppLaunchError::UNABLE_TO_INSTALL);
}
void StartupAppLauncher::OnReadyToLaunch() {
« no previous file with comments | « chrome/browser/chromeos/app_mode/startup_app_launcher.h ('k') | chrome/browser/chromeos/extensions/external_cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698