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 19namespace 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. 26class 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 ExternalCache* GetExternalCacheForTesting(); 62 63 private: 64 // If the cache was started, it must be stopped before |this| is destroyed. 65 virtual ~DeviceLocalAccountExternalPolicyLoader(); 66 67 // Pass the current list of force-installed extensions from the |store_| to 68 // the |external_cache_|. 69 void UpdateExtensionListFromStore(); 70 71 policy::CloudPolicyStore* store_; 72 const base::FilePath cache_dir_; 73 scoped_ptr<ExternalCache> external_cache_; 74 75 DISALLOW_COPY_AND_ASSIGN(DeviceLocalAccountExternalPolicyLoader); 76}; 77 78} // namespace chromeos 79 80#endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_DEVICE_LOCAL_ACCOUNT_EXTERNAL_POLICY_LOADER_H_ 81