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

Unified Diff: chrome/browser/chromeos/extensions/device_local_account_external_policy_loader.cc

Issue 27548004: Cache force-installed apps/extensions in device-local accounts (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased. Ready to reland after revert due to conflicting concurrent commit. Created 7 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/extensions/device_local_account_external_policy_loader.cc
diff --git a/chrome/browser/chromeos/extensions/device_local_account_external_policy_loader.cc b/chrome/browser/chromeos/extensions/device_local_account_external_policy_loader.cc
new file mode 100644
index 0000000000000000000000000000000000000000..0505894a6e0852d1e0b91ceb928c54408c3043d0
--- /dev/null
+++ b/chrome/browser/chromeos/extensions/device_local_account_external_policy_loader.cc
@@ -0,0 +1,106 @@
+// 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/extensions/device_local_account_external_policy_loader.h"
+
+#include "base/callback.h"
+#include "base/logging.h"
+#include "base/prefs/pref_value_map.h"
+#include "base/values.h"
+#include "chrome/browser/browser_process.h"
+#include "chrome/browser/extensions/policy_handlers.h"
+#include "chrome/browser/policy/policy_map.h"
+#include "chrome/common/pref_names.h"
+#include "net/url_request/url_request_context_getter.h"
+
+namespace chromeos {
+
+DeviceLocalAccountExternalPolicyLoader::
+ DeviceLocalAccountExternalPolicyLoader(policy::CloudPolicyStore* store,
+ const base::FilePath& cache_dir)
+ : store_(store),
+ cache_dir_(cache_dir) {
+}
+
+bool DeviceLocalAccountExternalPolicyLoader::IsCacheRunning() const {
+ return external_cache_;
+}
+
+void DeviceLocalAccountExternalPolicyLoader::StartCache(
+ const scoped_refptr<base::SequencedTaskRunner>& cache_task_runner) {
+ DCHECK(!external_cache_);
+ store_->AddObserver(this);
+ external_cache_.reset(new ExternalCache(
+ cache_dir_,
+ g_browser_process->system_request_context(),
+ cache_task_runner,
+ this,
+ true /* always_check_updates */,
+ false /* wait_for_cache_initialization */));
+
+ if (store_->is_initialized())
+ UpdateExtensionListFromStore();
+}
+
+void DeviceLocalAccountExternalPolicyLoader::StopCache(
+ const base::Closure& callback) {
+ if (external_cache_) {
+ external_cache_->Shutdown(callback);
+ external_cache_.reset();
+ store_->RemoveObserver(this);
+ }
+
+ base::DictionaryValue empty_prefs;
+ OnExtensionListsUpdated(&empty_prefs);
+}
+
+void DeviceLocalAccountExternalPolicyLoader::StartLoading() {
+ if (prefs_)
+ LoadFinished();
+}
+
+void DeviceLocalAccountExternalPolicyLoader::OnStoreLoaded(
+ policy::CloudPolicyStore* store) {
+ DCHECK(external_cache_);
+ DCHECK_EQ(store_, store);
+ UpdateExtensionListFromStore();
+}
+
+void DeviceLocalAccountExternalPolicyLoader::OnStoreError(
+ policy::CloudPolicyStore* store) {
+ DCHECK(external_cache_);
+ DCHECK_EQ(store_, store);
+}
+
+void DeviceLocalAccountExternalPolicyLoader::OnExtensionListsUpdated(
+ const base::DictionaryValue* prefs) {
+ DCHECK(external_cache_ || prefs->empty());
+ prefs_.reset(prefs->DeepCopy());
+ LoadFinished();
+}
+
+DeviceLocalAccountExternalPolicyLoader::
+ ~DeviceLocalAccountExternalPolicyLoader() {
+ DCHECK(!external_cache_);
+}
+
+void DeviceLocalAccountExternalPolicyLoader::UpdateExtensionListFromStore() {
+ scoped_ptr<base::DictionaryValue> prefs(new base::DictionaryValue);
+ const policy::PolicyMap& policy_map = store_->policy_map();
+ extensions::ExtensionInstallForcelistPolicyHandler policy_handler;
+ if (policy_handler.CheckPolicySettings(policy_map, NULL)) {
+ PrefValueMap pref_value_map;
+ policy_handler.ApplyPolicySettings(policy_map, &pref_value_map);
+ const base::Value* value = NULL;
+ const base::DictionaryValue* dict = NULL;
+ if (pref_value_map.GetValue(prefs::kExtensionInstallForceList, &value) &&
+ value->GetAsDictionary(&dict)) {
+ prefs.reset(dict->DeepCopy());
+ }
+ }
+
+ external_cache_->UpdateExtensionsList(prefs.Pass());
+}
+
+} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698