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

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

Issue 269573010: Download and cache kiosk app extension when it is added via kiosk mamangement ui. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 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_manager.cc
diff --git a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
index 9fab7ceeac9d6791832617b7529863b71ed90f4f..5e65d0fe0f3ed6f4d656e25c19660db7afc01b3b 100644
--- a/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
+++ b/chrome/browser/chromeos/app_mode/kiosk_app_manager.cc
@@ -8,6 +8,7 @@
#include <set>
#include "base/bind.h"
+#include "base/files/file_path.h"
#include "base/logging.h"
#include "base/path_service.h"
#include "base/prefs/pref_registry_simple.h"
@@ -23,7 +24,10 @@
#include "chrome/browser/chromeos/policy/device_local_account.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
#include "chrome/browser/chromeos/settings/owner_key_util.h"
+#include "chrome/browser/extensions/external_provider_impl.h"
#include "chrome/common/chrome_paths.h"
+#include "chrome/common/extensions/extension_constants.h"
+#include "chromeos/chromeos_paths.h"
#include "chromeos/cryptohome/async_method_caller.h"
#include "chromeos/settings/cros_settings_names.h"
#include "content/public/browser/browser_thread.h"
@@ -54,6 +58,13 @@ void CheckOwnerFilePresence(bool *present) {
*present = util->IsPublicKeyPresent();
}
+scoped_refptr<base::SequencedTaskRunner> GetBackgroundTaskRunner() {
+ base::SequencedWorkerPool* pool = content::BrowserThread::GetBlockingPool();
+ CHECK(pool);
+ return pool->GetSequencedTaskRunnerWithShutdownBehavior(
+ pool->GetSequenceToken(), base::SequencedWorkerPool::SKIP_ON_SHUTDOWN);
+}
+
} // namespace
// static
@@ -86,7 +97,7 @@ KioskAppManager::App::App(const KioskAppData& data)
user_id(data.user_id()),
name(data.name()),
icon(data.icon()),
- is_loading(data.IsLoading()) {
+ is_loading(data.IsLoading() || data.IsCrxCacheLoading()) {
xiyuan 2014/05/02 03:22:12 Pass IsExtensionPending from manager and combine i
jennyz 2014/05/02 17:46:55 Done.
}
KioskAppManager::App::App() : is_loading(false) {}
@@ -352,6 +363,15 @@ void KioskAppManager::RemoveObserver(KioskAppManagerObserver* observer) {
}
KioskAppManager::KioskAppManager() : ownership_established_(false) {
+ PathService::Get(chromeos::DIR_KIOSK_EXTENSIONS_CACHE, &cache_dir_);
xiyuan 2014/05/02 03:22:12 nit: CHECK(...)
jennyz 2014/05/02 17:46:55 Done.
+ external_cache_.reset(
+ new ExternalCache(cache_dir_,
+ g_browser_process->system_request_context(),
+ GetBackgroundTaskRunner(),
+ this,
+ true /* always_check_updates */,
+ false /* wait_for_cache_initialization */));
+
UpdateAppData();
local_accounts_subscription_ =
CrosSettings::Get()->AddSettingsObserver(
@@ -420,20 +440,37 @@ void KioskAppManager::UpdateAppData() {
} else {
KioskAppData* new_app =
new KioskAppData(this, it->kiosk_app_id, it->user_id);
+ // SetCrxCacheStatus to loading only for newly added apps, so the UI will
+ // only updates the loading status of these apps.
+ new_app->SetCrxCacheStatus(KioskAppData::STATUS_LOADING);
xiyuan 2014/05/02 03:22:12 ExternalCache::IsExtensionPending is a good signal
jennyz 2014/05/02 17:46:55 Done.
apps_.push_back(new_app); // Takes ownership of |new_app|.
new_app->Load();
}
}
// Clears cache and deletes the remaining old data.
+ std::vector<std::string> apps_to_remove;
for (std::map<std::string, KioskAppData*>::iterator it = old_apps.begin();
it != old_apps.end(); ++it) {
it->second->ClearCache();
cryptohome::AsyncMethodCaller::GetInstance()->AsyncRemove(
it->second->user_id(),
base::Bind(&OnRemoveAppCryptohomeComplete, it->first));
+ apps_to_remove.push_back(it->second->app_id());
}
STLDeleteValues(&old_apps);
+ external_cache_->RemoveExtensions(apps_to_remove);
+
+ // Request external_cache_ to download new apps and update the existing
+ // apps.
+ scoped_ptr<base::DictionaryValue> prefs(new base::DictionaryValue);
+ for (size_t i = 0; i < apps_.size(); ++i) {
+ base::DictionaryValue* entry = new base::DictionaryValue;
+ entry->SetString(extensions::ExternalProviderImpl::kExternalUpdateUrl,
+ extension_urls::GetWebstoreUpdateUrl().spec());
xiyuan 2014/05/02 03:22:12 Not needed since it is the default download URL.
jennyz 2014/05/02 17:46:55 Done.
+ prefs->Set(apps_[i]->app_id(), entry);
+ }
+ external_cache_->UpdateExtensionsList(prefs.Pass());
FOR_EACH_OBSERVER(KioskAppManagerObserver, observers_,
OnKioskAppsSettingsChanged());
@@ -457,6 +494,26 @@ void KioskAppManager::OnKioskAppDataLoadFailure(const std::string& app_id) {
OnKioskAppDataLoadFailure(app_id));
}
+void KioskAppManager::OnExtensionListsUpdated(
+ const base::DictionaryValue* prefs) {
+}
+
+void KioskAppManager::OnExtensionLoadedInCache(const std::string& id) {
+ KioskAppData* app_data = GetAppDataMutable(id);
+ if (!app_data)
+ return;
+ app_data->SetCrxCacheStatus(KioskAppData::STATUS_LOADED);
xiyuan 2014/05/02 03:22:12 Probably can just call OnKioskAppDataChanged(id) h
jennyz 2014/05/02 17:46:55 Done.
+}
+
+void KioskAppManager::OnExtensionDownloadFailed(
+ const std::string& id,
+ extensions::ExtensionDownloaderDelegate::Error error) {
+ KioskAppData* app_data = GetAppDataMutable(id);
+ if (!app_data)
+ return;
+ app_data->SetCrxCacheStatus(KioskAppData::STATUS_ERROR);
xiyuan 2014/05/02 03:22:12 Similarly, call OnKioskAppDataLoadFailure().
jennyz 2014/05/02 17:46:55 Done.
+}
+
KioskAppManager::AutoLoginState KioskAppManager::GetAutoLoginState() const {
PrefService* prefs = g_browser_process->local_state();
const base::DictionaryValue* dict =

Powered by Google App Engine
This is Rietveld 408576698