app_pack_updater.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_CHROMEOS_POLICY_APP_PACK_UPDATER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_CHROMEOS_POLICY_APP_PACK_UPDATER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
13ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "base/callback.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/files/file_path.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/updater/extension_downloader_delegate.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass CrxInstaller;
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass ExtensionDownloader;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExternalLoader;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class URLRequestContextGetter;
3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace tracked_objects {
3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class Location;
3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace policy {
3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class AppPackExternalLoader;
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class EnterpriseInstallAttributes;
4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The AppPackUpdater manages a set of extensions that are configured via a
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// device policy to be locally cached and installed into the Demo user account
4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// at login time.
4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class AppPackUpdater : public content::NotificationObserver,
4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       public extensions::ExtensionDownloaderDelegate {
4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public:
4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Callback to listen for updates to the screensaver extension's path.
5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  typedef base::Callback<void(const base::FilePath&)> ScreenSaverUpdateCallback;
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The |request_context| is used for the update checks.
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  AppPackUpdater(net::URLRequestContextGetter* request_context,
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                 EnterpriseInstallAttributes* install_attributes);
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual ~AppPackUpdater();
5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Creates an extensions::ExternalLoader that will load the crx files
5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // downloaded by the AppPackUpdater. This can be called at most once, and the
5958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // caller owns the returned value.
6058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  extensions::ExternalLoader* CreateExternalLoader();
6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // |callback| will be invoked whenever the screen saver extension's path
6358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // changes. It will be invoked "soon" after this call if a valid path already
6458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // exists. Subsequent calls will override the previous |callback|. A null
6558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // |callback| can be used to remove a previous callback.
6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void SetScreenSaverUpdateCallback(const ScreenSaverUpdateCallback& callback);
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // If a user of one of the AppPack's extensions detects that the extension
6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // is damaged then this method can be used to remove it from the cache and
7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // retry to download it after a restart.
7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void OnDamagedFileDetected(const base::FilePath& path);
7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private:
7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  struct CacheEntry {
7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::string path;
7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::string cached_version;
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  };
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maps an extension ID to its update URL.
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::map<std::string, std::string> PolicyEntryMap;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maps an extension ID to a CacheEntry.
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  typedef std::map<std::string, CacheEntry> CacheEntryMap;
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void Init();
8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // content::NotificationObserver:
8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void Observe(int type,
8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       const content::NotificationSource& source,
9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                       const content::NotificationDetails& details) OVERRIDE;
9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Loads the current policy and schedules a cache update.
93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void LoadPolicy();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts a cache update check immediately.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CheckCacheNow();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Performs a cache update check on the blocking pool. |app_pack_updater| is
9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // used to reply in the UI thread. |valid_ids| contains the list of IDs that
10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // are currently configured by policy; anything else is invalid, and should
10158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // be removed from the cache. |valid_ids| is owned by the posted task.
10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static void BlockingCheckCache(base::WeakPtr<AppPackUpdater> app_pack_updater,
10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                 const std::set<std::string>* valid_ids);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper for BlockingCheckCache().
10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static void BlockingCheckCacheInternal(
10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const std::set<std::string>* valid_ids,
10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      CacheEntryMap* entries);
10958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Invoked when the cache has been updated. |cache_entries| contains all the
11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // currently valid crx files in the cache, and is owned by the posted task.
11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void OnCacheUpdated(CacheEntryMap* cache_entries);
11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Notifies the |extension_loader_| that the cache has been updated, providing
11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // it with an updated list of app-pack extensions.
11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void UpdateExtensionLoader();
11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Schedules downloads of all the extensions that are currently configured
11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // by the policy but missing in the cache.
12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void DownloadMissingExtensions();
12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Implementation of ExtensionDownloaderDelegate:
12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void OnExtensionDownloadFailed(
12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const std::string& id,
12658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      Error error,
12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const PingResult& ping_result,
12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const std::set<int>& request_ids) OVERRIDE;
12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnExtensionDownloadFinished(
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& id,
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const base::FilePath& path,
13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const GURL& download_url,
13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const std::string& version,
135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const PingResult& ping_result,
136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const std::set<int>& request_ids) OVERRIDE;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnBlacklistDownloadFinished(
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& data,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& package_hash,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& version,
14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const PingResult& ping_result,
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const std::set<int>& request_ids) OVERRIDE;
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual bool IsExtensionPending(const std::string& id) OVERRIDE;
14658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual bool GetExtensionExistingVersion(const std::string& id,
14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                           std::string* version) OVERRIDE;
14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Invoked to install the downloaded crx file at |path| in the AppPack cache.
15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  static void BlockingInstallCacheEntry(
15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      base::WeakPtr<AppPackUpdater> app_pack_updater,
15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      const std::string& id,
154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const base::FilePath& path,
155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const std::string& version);
156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Invoked on the UI thread when a new AppPack entry has been installed in
158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // the AppPack cache.
159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void OnCacheEntryInstalled(const std::string& id,
160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                             const std::string& path,
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                             const std::string& version);
162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Handles failure to install CRX files. The file is deleted if it came from
164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // the cache.
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  void OnCrxInstallFailed(extensions::CrxInstaller* installer);
16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Helper to post blocking IO tasks to the blocking pool.
16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void PostBlockingTask(const tracked_objects::Location& from_here,
16958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                        const base::Closure& task);
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets |screen_saver_path_| and invokes |screen_saver_update_callback_| if
17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // appropriate.
17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  void SetScreenSaverPath(const base::FilePath& path);
17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::WeakPtrFactory<AppPackUpdater> weak_ptr_factory_;
176868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Observes failures to install CRX files.
17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  content::NotificationRegistrar notification_registrar_;
17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Unique sequence token so that tasks posted by the AppPackUpdater are
18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // executed sequentially in the blocking pool.
18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::SequencedWorkerPool::SequenceToken worker_pool_token_;
18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the updater has initialized. This is only done if the device is in
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // kiosk mode and the app pack policy is present.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool initialized_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is the list of extensions currently configured by the policy.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PolicyEntryMap app_pack_extensions_;
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This contains extensions that are both currently configured by the policy
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and that have a valid crx in the cache.
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  CacheEntryMap cached_extensions_;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extension ID and path of the CRX file of the screen saver extension,
19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // if it is configured by the policy. Otherwise these fields are empty.
19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string screen_saver_id_;
19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  base::FilePath screen_saver_path_;
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Callback to invoke whenever the screen saver's extension path changes.
20158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Can be null.
20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  ScreenSaverUpdateCallback screen_saver_update_callback_;
20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // The extension loader wires the AppPackUpdater to the extensions system, and
205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // makes it install the currently cached extensions.
206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool created_extension_loader_;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtr<AppPackExternalLoader> extension_loader_;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used to download the extensions configured via policy, and to check for
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // updates.
21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  scoped_ptr<extensions::ExtensionDownloader> downloader_;
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Request context used by the |downloader_|.
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  net::URLRequestContextGetter* request_context_;
21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For checking the device mode.
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EnterpriseInstallAttributes* install_attributes_;
21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AppPackUpdater);
22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)};
22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace policy
22358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
22458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#endif  // CHROME_BROWSER_CHROMEOS_POLICY_APP_PACK_UPDATER_H_
22558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)