1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_CHROMEOS_EXTENSIONS_DEVICE_LOCAL_ACCOUNT_EXTERNAL_POLICY_LOADER_H_ 6 #define CHROME_BROWSER_CHROMEOS_EXTENSIONS_DEVICE_LOCAL_ACCOUNT_EXTERNAL_POLICY_LOADER_H_ 7 8 #include "base/basictypes.h" 9 #include "base/callback_forward.h" 10 #include "base/compiler_specific.h" 11 #include "base/files/file_path.h" 12 #include "base/memory/ref_counted.h" 13 #include "base/memory/scoped_ptr.h" 14 #include "base/sequenced_task_runner.h" 15 #include "chrome/browser/chromeos/extensions/external_cache.h" 16 #include "chrome/browser/extensions/external_loader.h" 17 #include "components/policy/core/common/cloud/cloud_policy_store.h" 18 19 namespace chromeos { 20 21 // A specialization of the ExternalLoader that serves external extensions from 22 // the enterprise policy force-install list. This class is used for device-local 23 // accounts in place of the ExternalPolicyLoader. The difference is that while 24 // the ExternalPolicyLoader requires extensions to be downloaded on-the-fly, 25 // this class caches them, allowing for offline installation. 26 class DeviceLocalAccountExternalPolicyLoader 27 : public extensions::ExternalLoader, 28 public policy::CloudPolicyStore::Observer, 29 public ExternalCache::Delegate { 30 public: 31 // The list of force-installed extensions will be read from |store| and the 32 // extensions will be cached in the |cache_dir_|. 33 DeviceLocalAccountExternalPolicyLoader(policy::CloudPolicyStore* store, 34 const base::FilePath& cache_dir); 35 36 // While running, the cache requires exclusive write access to the 37 // |cache_dir_|. 38 bool IsCacheRunning() const; 39 40 // Start the cache. This method must only be invoked when there are no pending 41 // write operations to |cache_dir_| on any thread and none will be initiated 42 // while the cache is running. 43 void StartCache( 44 const scoped_refptr<base::SequencedTaskRunner>& cache_task_runner); 45 46 // Stop the cache. The |callback| will be invoked when the cache has shut down 47 // completely and write access to the |cache_dir_| is permitted again. 48 void StopCache(const base::Closure& callback); 49 50 // extensions::ExternalLoader: 51 virtual void StartLoading() OVERRIDE; 52 53 // policy::CloudPolicyStore::Observer: 54 virtual void OnStoreLoaded(policy::CloudPolicyStore* store) OVERRIDE; 55 virtual void OnStoreError(policy::CloudPolicyStore* store) OVERRIDE; 56 57 // ExternalCache::Delegate: 58 virtual void OnExtensionListsUpdated( 59 const base::DictionaryValue* prefs) OVERRIDE; 60 61 private: 62 // If the cache was started, it must be stopped before |this| is destroyed. 63 virtual ~DeviceLocalAccountExternalPolicyLoader(); 64 65 // Pass the current list of force-installed extensions from the |store_| to 66 // the |external_cache_|. 67 void UpdateExtensionListFromStore(); 68 69 policy::CloudPolicyStore* store_; 70 const base::FilePath cache_dir_; 71 scoped_ptr<ExternalCache> external_cache_; 72 73 DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountExternalPolicyLoader); 74 }; 75 76 } // namespace chromeos 77 78 #endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_DEVICE_LOCAL_ACCOUNT_EXTERNAL_POLICY_LOADER_H_ 79