15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 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_EXTENSIONS_EXTENSION_PREFS_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_EXTENSION_PREFS_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/linked_ptr.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_scoped_prefs.h"
1890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_keyed_service.h"
19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/browser/app_sorting.h"
20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/constants.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern_set.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/string_ordinal.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionPrefValueMap;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService;
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)namespace content {
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)class BrowserContext;
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefRegistrySyncable;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class AppSorting;
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ContentSettingsStore;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionPrefsUninstallExtension;
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLPatternSet;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Class for managing global and per-extension preferences.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class distinguishes the following kinds of preferences:
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - global preferences:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       internal state for the extension system in general, not associated
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       with an individual extension, such as lastUpdateTime.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - per-extension preferences:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       meta-preferences describing properties of the extension like
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       installation time, whether the extension is enabled, etc.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - extension controlled preferences:
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       browser preferences that an extension controls. For example, an
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       extension could use the proxy API to specify the browser's proxy
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       preference. Extension-controlled preferences are stored in
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       PrefValueStore::extension_prefs(), which this class populates and
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       maintains as the underlying extensions change.
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ExtensionPrefs : public ExtensionScopedPrefs,
5990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       public BrowserContextKeyedService {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<linked_ptr<ExtensionInfo> > ExtensionsInfo;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Vector containing identifiers for preferences.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::set<std::string> PrefKeySet;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // This enum is used to store the reason an extension's install has been
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // delayed.  Do not remove items or re-order this enum as it is used in
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // preferences.
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  enum DelayReason {
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DELAY_REASON_NONE = 0,
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DELAY_REASON_GC = 1,
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DELAY_REASON_WAIT_FOR_IDLE = 2,
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    DELAY_REASON_WAIT_FOR_IMPORTS = 3,
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  };
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates base::Time classes. The default implementation is just to return
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the current time, but tests can inject alternative implementations.
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class TimeProvider {
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TimeProvider();
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~TimeProvider();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // By default, returns the current time (base::Time::Now()).
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual base::Time GetCurrentTime() const;
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(TimeProvider);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A wrapper around a ScopedUserPrefUpdate, which allows us to access the
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // entry of a particular key for an extension. Use this if you need a mutable
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // record of a dictionary or list in the current settings. Otherwise, prefer
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ReadPrefAsT() and UpdateExtensionPref() methods.
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  template <typename T, base::Value::Type type_enum_value>
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class ScopedUpdate {
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ScopedUpdate(ExtensionPrefs* prefs,
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 const std::string& extension_id,
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 const std::string& key);
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual ~ScopedUpdate();
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Returns a mutable value for the key (ownership remains with the prefs),
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // if one exists. Otherwise, returns NULL.
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual T* Get();
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Creates and returns a mutable value for the key (the prefs own the new
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // value), if one does not already exist. Otherwise, returns the current
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // value.
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual T* Create();
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   private:
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ScopedUpdate);
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DictionaryPrefUpdate update_;
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string extension_id_;
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string key_;
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef ScopedUpdate<base::DictionaryValue, base::Value::TYPE_DICTIONARY>
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ScopedDictionaryUpdate;
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef ScopedUpdate<base::ListValue, base::Value::TYPE_LIST>
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ScopedListUpdate;
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates and initializes an ExtensionPrefs object.
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Does not take ownership of |prefs| and |extension_pref_value_map|.
12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If |extensions_disabled| is true, extension controlled preferences and
12890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // content settings do not become effective.
12990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static ExtensionPrefs* Create(
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefService* prefs,
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& root_dir,
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionPrefValueMap* extension_pref_value_map,
133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<AppSorting> app_sorting,
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool extensions_disabled);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A version of Create which allows injection of a custom base::Time provider.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Use this as needed for testing.
13890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static ExtensionPrefs* Create(
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefService* prefs,
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& root_dir,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionPrefValueMap* extension_pref_value_map,
142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      scoped_ptr<AppSorting> app_sorting,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool extensions_disabled,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<TimeProvider> time_provider);
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionPrefs();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Convenience function to get the ExtensionPrefs for a BrowserContext.
149a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static ExtensionPrefs* Get(content::BrowserContext* context);
15090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns all installed extensions from extension preferences provided by
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |pref_service|. This is exposed for ProtectedPrefsWatcher because it needs
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // access to the extension ID list before the ExtensionService is initialized.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ExtensionIdList GetExtensionsFrom(const PrefService* pref_service);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the specified external extension was uninstalled by the
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExternalExtensionUninstalled(const std::string& id) const;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether |extension_id| is disabled. If there's no state pref for
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the extension, this will return false. Generally you should use
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionService::IsExtensionEnabled instead.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionDisabled(const std::string& id) const;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get/Set the order that the browser actions appear in the toolbar.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionIdList GetToolbarOrder();
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetToolbarOrder(const ExtensionIdList& extension_ids);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
169a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Gets the set of known disabled extension IDs into |id_set_out|. Returns
170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // false iff the set of known disabled extension IDs hasn't been set yet.
171a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool GetKnownDisabled(ExtensionIdSet* id_set_out);
172a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Sets the set of known disabled extension IDs.
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void SetKnownDisabled(const ExtensionIdSet& extension_ids);
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when an extension is installed, so that prefs get created.
177f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // |blacklisted_for_malware| should be set if the extension was included in a
178f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // blacklist due to being malware. If |page_ordinal| is an invalid ordinal,
179f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // then a page will be found for the App.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExtensionInstalled(const Extension* extension,
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            Extension::State initial_state,
182f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                            bool blacklisted_for_malware,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const syncer::StringOrdinal& page_ordinal);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when an extension is uninstalled, so that prefs get cleaned up.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExtensionUninstalled(const std::string& extension_id,
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const Manifest::Location& location,
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool external_uninstall);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to change the extension's state when it is enabled/disabled.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionState(const std::string& extension_id, Extension::State);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Populates |out| with the ids of all installed extensions.
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetExtensions(ExtensionIdList* out);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ExtensionScopedPrefs methods:
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void UpdateExtensionPref(const std::string& id,
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   const std::string& key,
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   base::Value* value) OVERRIDE;
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DeleteExtensionPrefs(const std::string& id) OVERRIDE;
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsBoolean(const std::string& extension_id,
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const std::string& pref_key,
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 bool* out_value) const OVERRIDE;
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsInteger(const std::string& extension_id,
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const std::string& pref_key,
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 int* out_value) const OVERRIDE;
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsString(const std::string& extension_id,
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const std::string& pref_key,
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                std::string* out_value) const OVERRIDE;
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsList(const std::string& extension_id,
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const std::string& pref_key,
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const base::ListValue** out_value) const OVERRIDE;
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsDictionary(
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& extension_id,
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& pref_key,
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::DictionaryValue** out_value) const OVERRIDE;
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual bool HasPrefForExtension(const std::string& extension_id) const
2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      OVERRIDE;
2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Did the extension ask to escalate its permission during an upgrade?
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DidExtensionEscalatePermissions(const std::string& id);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |did_escalate| is true, the preferences for |extension| will be set to
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // require the install warning when the user tries to enable.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDidExtensionEscalatePermissions(
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Extension* extension,
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool did_escalate);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getter and setters for disabled reason.
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  int GetDisableReasons(const std::string& extension_id) const;
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddDisableReason(const std::string& extension_id,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        Extension::DisableReason disable_reason);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveDisableReason(const std::string& extension_id,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           Extension::DisableReason disable_reason);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearDisableReasons(const std::string& extension_id);
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets the set of extensions that have been blacklisted in prefs.
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<std::string> GetBlacklistedExtensions();
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets whether the extension with |id| is blacklisted.
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetExtensionBlacklisted(const std::string& extension_id,
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               bool is_blacklisted);
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the version string for the currently installed extension, or
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the empty string if not found.
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetVersionString(const std::string& extension_id);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Re-writes the extension manifest into the prefs.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to change the extension's manifest when it's re-localized.
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateManifest(const Extension* extension);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns extension path based on extension ID, or empty FilePath on error.
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath GetExtensionPath(const std::string& extension_id);
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns base extensions install directory.
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& install_directory() const { return install_directory_; }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns whether the extension with |id| has its blacklist bit set.
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WARNING: this only checks the extension's entry in prefs, so by definition
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // can only check extensions that prefs knows about. There may be other
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // sources of blacklist information, such as safebrowsing. You probably want
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to use Blacklist::GetBlacklistedIDs rather than this method.
2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsExtensionBlacklisted(const std::string& id) const;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increment the count of how many times we prompted the user to acknowledge
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the given extension, and return the new count.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int IncrementAcknowledgePromptCount(const std::string& extension_id);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the user has acknowledged an external extension.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExternalExtensionAcknowledged(const std::string& extension_id);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AcknowledgeExternalExtension(const std::string& extension_id);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the user has acknowledged a blacklisted extension.
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsBlacklistedExtensionAcknowledged(const std::string& extension_id);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AcknowledgeBlacklistedExtension(const std::string& extension_id);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Whether the external extension was installed during the first run
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // of this profile.
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool IsExternalInstallFirstRun(const std::string& extension_id);
288c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetExternalInstallFirstRun(const std::string& extension_id);
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Whether the user has been notified about extension with |extension_id|
291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // being wiped out.
292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool HasWipeoutBeenAcknowledged(const std::string& extension_id);
293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SetWipeoutAcknowledged(const std::string& extension_id, bool value);
294f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the extension notification code has already run for the
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first time for this profile. Currently we use this flag to mean that any
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extensions that would trigger notifications should get silently
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // acknowledged. This is a fuse. Calling it the first time returns false.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Subsequent calls return true. It's not possible through an API to ever
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reset it. Don't call it unless you mean it!
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SetAlertSystemFirstRun();
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks if extensions are blacklisted by default, by policy.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ManagementPolicy::Provider methods also take this into account, and
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be used instead when the extension ID is known.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ExtensionsBlacklistedByDefault() const;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the last value set via SetLastPingDay. If there isn't such a
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pref, the returned Time will return true for is_null().
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time LastPingDay(const std::string& extension_id) const;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The time stored is based on the server's perspective of day start time, not
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the client's.
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLastPingDay(const std::string& extension_id, const base::Time& time);
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Similar to the 2 above, but for the extensions blacklist.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time BlacklistLastPingDay() const;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBlacklistLastPingDay(const base::Time& time);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Similar to LastPingDay/SetLastPingDay, but for sending "days since active"
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ping.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time LastActivePingDay(const std::string& extension_id);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLastActivePingDay(const std::string& extension_id,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const base::Time& time);
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A bit we use for determining if we should send the "days since active"
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ping. A value of true means the item has been active (launched) since the
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // last update check.
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetActiveBit(const std::string& extension_id);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetActiveBit(const std::string& extension_id, bool active);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the granted permission set for the extension with |extension_id|,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and NULL if no preferences were found for |extension_id|.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This passes ownership of the returned set to the caller.
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PermissionSet* GetGrantedPermissions(const std::string& extension_id);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds |permissions| to the granted permissions set for the extension with
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |extension_id|. The new granted permissions set will be the union of
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |permissions| and the already granted permissions.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddGrantedPermissions(const std::string& extension_id,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const PermissionSet* permissions);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // As above, but subtracts the given |permissions| from the granted set.
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveGrantedPermissions(const std::string& extension_id,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const PermissionSet* permissions);
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the active permission set for the specified extension. This may
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // differ from the permissions in the manifest due to the optional
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // permissions API. This passes ownership of the set to the caller.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PermissionSet* GetActivePermissions(const std::string& extension_id);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the active |permissions| for the extension with |extension_id|.
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetActivePermissions(const std::string& extension_id,
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const PermissionSet* permissions);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Records whether or not this extension is currently running.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionRunning(const std::string& extension_id, bool is_running);
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether or not this extension is marked as running. This is used to
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // restart apps across browser restarts.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionRunning(const std::string& extension_id);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Set/Get whether or not the app is active. Used to force a launch of apps
3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // that don't handle onRestarted() on a restart. We can only safely do that if
3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // the app was active when it was last running.
3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void SetIsActive(const std::string& extension_id, bool is_active);
3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool IsActive(const std::string& extension_id);
36890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the user enabled this extension to be loaded in incognito
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mode.
371a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  //
3728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // IMPORTANT: you probably want to use extension_utils::IsIncognitoEnabled
373a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // instead of this method.
3748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool IsIncognitoEnabled(const std::string& extension_id) const;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetIsIncognitoEnabled(const std::string& extension_id, bool enabled);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the user has chosen to allow this extension to inject
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // scripts into pages with file URLs.
3798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  //
3808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // IMPORTANT: you probably want to use extension_utils::AllowFileAccess
3818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // instead of this method.
3828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool AllowFileAccess(const std::string& extension_id) const;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAllowFileAccess(const std::string& extension_id, bool allow);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasAllowFileAccessSetting(const std::string& extension_id) const;
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Saves ExtensionInfo for each installed extension with the path to the
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // version directory and the location. Blacklisted extensions won't be saved
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and neither will external extensions the user has explicitly uninstalled.
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Caller takes ownership of returned structure.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionsInfo> GetInstalledExtensionsInfo() const;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Same as above, but only includes external extensions the user has
3933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // explicitly uninstalled.
3943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  scoped_ptr<ExtensionsInfo> GetUninstalledExtensionsInfo() const;
3953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the ExtensionInfo from the prefs for the given extension. If the
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension is not present, NULL is returned.
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionInfo> GetInstalledExtensionInfo(
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id) const;
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We've downloaded an updated .crx file for the extension, but are waiting
402eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // to install it.
4032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetDelayedInstallInfo(const Extension* extension,
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Extension::State initial_state,
405f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                             bool blacklisted_for_malware,
406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                             DelayReason delay_reason,
4072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const syncer::StringOrdinal& page_ordinal);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Removes any delayed install information we have for the given
4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |extension_id|. Returns true if there was info to remove; false otherwise.
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool RemoveDelayedInstallInfo(const std::string& extension_id);
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the prefs to finish the update for an extension.
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool FinishDelayedInstallInfo(const std::string& extension_id);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the ExtensionInfo from the prefs for delayed install information
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for |extension_id|, if we have any. Otherwise returns NULL.
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ExtensionInfo> GetDelayedInstallInfo(
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id) const;
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
421eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DelayReason GetDelayedInstallReason(const std::string& extension_id) const;
422eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns information about all the extensions that have delayed install
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // information.
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ExtensionsInfo> GetAllDelayedInstallInfo() const;
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the user repositioned the app on the app launcher via drag
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and drop.
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WasAppDraggedByUser(const std::string& extension_id);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets a flag indicating that the user repositioned the app on the app
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launcher by drag and dropping it.
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAppDraggedByUser(const std::string& extension_id);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if there is an extension which controls the preference value
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  for |pref_key| *and* it is specific to incognito mode.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasIncognitoPrefValue(const std::string& pref_key);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the creation flags mask for the extension.
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetCreationFlags(const std::string& extension_id) const;
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns the creation flags mask for a delayed install extension.
443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int GetDelayedInstallCreationFlags(const std::string& extension_id) const;
444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the extension was installed from the Chrome Web Store.
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFromWebStore(const std::string& extension_id) const;
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the extension was installed from an App generated from a
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bookmark.
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFromBookmark(const std::string& extension_id) const;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the extension was installed as a default app.
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WasInstalledByDefault(const std::string& extension_id) const;
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method to acquire the installation time of an extension.
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns base::Time() if the installation time could not be parsed or
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // found.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time GetInstallTime(const std::string& extension_id) const;
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Gets/sets the last launch time of an extension.
4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  base::Time GetLastLaunchTime(const std::string& extension_id) const;
4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void SetLastLaunchTime(const std::string& extension_id,
4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                         const base::Time& time);
4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool extensions_disabled() { return extensions_disabled_; }
4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsStore* content_settings_store() {
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return content_settings_store_.get();
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The underlying PrefService.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* pref_service() const { return prefs_; }
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
476f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // The underlying AppSorting.
477f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  AppSorting* app_sorting() const { return app_sorting_.get(); }
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Describes the URLs that are able to install extensions. See
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prefs::kExtensionAllowedInstallSites for more information.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet GetAllowedInstallSites();
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Schedules garbage collection of an extension's on-disk data on the next
4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // start of this ExtensionService. Applies only to extensions with isolated
4852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // storage.
4862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetNeedsStorageGarbageCollection(bool value);
4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool NeedsStorageGarbageCollection();
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used by ShellWindowGeometryCache to persist its cache. These methods
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should not be called directly.
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::DictionaryValue* GetGeometryCache(
4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::string& extension_id) const;
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetGeometryCache(const std::string& extension_id,
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        scoped_ptr<base::DictionaryValue> cache);
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
496f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Used for verification of installed extension ids. For the Set method, pass
497f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // null to remove the preference.
498f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  const base::DictionaryValue* GetInstallSignature();
499f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  void SetInstallSignature(const DictionaryValue* signature);
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ExtensionPrefsBlacklistedExtensions;  // Unit test.
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ExtensionPrefsUninstallExtension;     // Unit test.
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // See the Create methods.
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionPrefs(PrefService* prefs,
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const base::FilePath& root_dir,
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 ExtensionPrefValueMap* extension_pref_value_map,
509f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 scoped_ptr<AppSorting> app_sorting,
51090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 scoped_ptr<TimeProvider> time_provider,
51190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 bool extensions_disabled);
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts absolute paths in the pref to paths relative to the
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // install_directory_.
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MakePathsRelative();
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts internal relative paths to be absolute. Used for export to
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // consumers who expect full paths.
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MakePathsAbsolute(base::DictionaryValue* dict);
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Helper function used by GetInstalledExtensionInfo() and
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GetDelayedInstallInfo() to construct an ExtensionInfo from the provided
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |extension| dictionary.
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<ExtensionInfo> GetInstalledInfoHelper(
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& extension_id,
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::DictionaryValue* extension) const;
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Interprets the list pref, |pref_key| in |extension_id|'s preferences, as a
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLPatternSet. The |valid_schemes| specify how to parse the URLPatterns.
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool ReadPrefAsURLPatternSet(const std::string& extension_id,
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const std::string& pref_key,
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               URLPatternSet* result,
533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               int valid_schemes);
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts |new_value| to a list of strings and sets the |pref_key| pref
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // belonging to |extension_id|.
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionPrefURLPatternSet(const std::string& extension_id,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& pref_key,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const URLPatternSet& new_value);
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Read the boolean preference entry and return true if the preference exists
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // and the preference's value is true; false otherwise.
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool ReadPrefAsBooleanAndReturn(const std::string& extension_id,
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  const std::string& key) const;
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Interprets |pref_key| in |extension_id|'s preferences as an
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PermissionSet, and passes ownership of the set to the caller.
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PermissionSet* ReadPrefAsPermissionSet(const std::string& extension_id,
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         const std::string& pref_key);
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts the |new_value| to its value and sets the |pref_key| pref
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // belonging to |extension_id|.
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionPrefPermissionSet(const std::string& extension_id,
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& pref_key,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const PermissionSet* new_value);
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns an immutable dictionary for extension |id|'s prefs, or NULL if it
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // doesn't exist.
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::DictionaryValue* GetExtensionPref(const std::string& id) const;
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fix missing preference entries in the extensions that are were introduced
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in a later Chrome version.
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FixMissingPrefs(const ExtensionIdList& extension_ids);
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installs the persistent extension preferences into |prefs_|'s extension
56690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // pref store. Does nothing if extensions_disabled_ is true.
56790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void InitPrefStore();
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Migrates the permissions data in the pref store.
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MigratePermissions(const ExtensionIdList& extension_ids);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Migrates the disable reasons from a single enum to a bit mask.
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MigrateDisableReasons(const ExtensionIdList& extension_ids);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether there is a state pref for the extension and if so, whether
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it matches |check_state|.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoesExtensionHaveState(const std::string& id,
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Extension::State check_state) const;
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Reads the list of strings for |pref| from user prefs into
581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // |id_container_out|. Returns false if the pref wasn't found in the user
582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // pref store.
5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  template <class ExtensionIdContainer>
584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool GetUserExtensionPrefIntoContainer(
585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const char* pref,
586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      ExtensionIdContainer* id_container_out);
5874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Writes the list of strings contained in |strings| to |pref| in prefs.
5894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  template <class ExtensionIdContainer>
5904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void SetExtensionPrefFromContainer(const char* pref,
5914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                     const ExtensionIdContainer& strings);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper function to populate |extension_dict| with the values needed
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // by a newly installed extension. Work is broken up between this
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // function and FinishExtensionInfoPrefs() to accomodate delayed
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // installations.
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PopulateExtensionInfoPrefs(const Extension* extension,
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const base::Time install_time,
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  Extension::State initial_state,
600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                  bool blacklisted_for_malware,
601c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  base::DictionaryValue* extension_dict);
6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper function to complete initialization of the values in
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |extension_dict| for an extension install. Also see
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PopulateExtensionInfoPrefs().
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FinishExtensionInfoPrefs(
6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& extension_id,
6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Time install_time,
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool needs_sort_ordinal,
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const syncer::StringOrdinal& suggested_page_ordinal,
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::DictionaryValue* extension_dict);
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The pref service specific to this set of extension prefs. Owned by profile.
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs_;
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Base extensions install directory.
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath install_directory_;
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak pointer, owned by Profile.
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionPrefValueMap* extension_pref_value_map_;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains all the logic for handling the order for various extension
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // properties.
624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<AppSorting> app_sorting_;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ContentSettingsStore> content_settings_store_;
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TimeProvider> time_provider_;
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
63090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool extensions_disabled_;
63190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionPrefs);
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_PREFS_H_
638