extension_prefs.h revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
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"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/content_settings/content_settings_store.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_prefs_scope.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_scoped_prefs.h"
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/prefs/scoped_user_pref_update.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
2190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "components/browser_context_keyed_service/browser_context_keyed_service.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 ExtensionSorting;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService;
2890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class Profile;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefRegistrySyncable;
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionPrefsUninstallExtension;
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLPatternSet;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Class for managing global and per-extension preferences.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class distinguishes the following kinds of preferences:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - global preferences:
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       internal state for the extension system in general, not associated
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       with an individual extension, such as lastUpdateTime.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - per-extension preferences:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       meta-preferences describing properties of the extension like
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       installation time, whether the extension is enabled, etc.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - extension controlled preferences:
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       browser preferences that an extension controls. For example, an
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       extension could use the proxy API to specify the browser's proxy
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       preference. Extension-controlled preferences are stored in
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       PrefValueStore::extension_prefs(), which this class populates and
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       maintains as the underlying extensions change.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionPrefs : public ContentSettingsStore::Observer,
5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       public ExtensionScopedPrefs,
5590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       public BrowserContextKeyedService {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Key name for a preference that keeps track of per-extension settings. This
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is a dictionary object read from the Preferences file, keyed off of
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension ids.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kExtensionsPref[];
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Key for what version chrome was last time the extension prefs were loaded.
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static const char kExtensionsLastChromeVersion[];
6490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<linked_ptr<ExtensionInfo> > ExtensionsInfo;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Vector containing identifiers for preferences.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::set<std::string> PrefKeySet;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This enum is used for the launch type the user wants to use for an
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // application.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not remove items or re-order this enum as it is used in preferences
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and histograms.
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum LaunchType {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAUNCH_PINNED,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAUNCH_REGULAR,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAUNCH_FULLSCREEN,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAUNCH_WINDOW,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Launch an app in the in the way a click on the NTP would,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // if no user pref were set.  Update this constant to change
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the default for the NTP and chrome.management.launchApp().
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAUNCH_DEFAULT = LAUNCH_REGULAR
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates base::Time classes. The default implementation is just to return
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the current time, but tests can inject alternative implementations.
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class TimeProvider {
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TimeProvider();
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~TimeProvider();
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // By default, returns the current time (base::Time::Now()).
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual base::Time GetCurrentTime() const;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(TimeProvider);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A wrapper around a ScopedUserPrefUpdate, which allows us to access the
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // entry of a particular key for an extension. Use this if you need a mutable
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // record of a dictionary or list in the current settings. Otherwise, prefer
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ReadPrefAsT() and UpdateExtensionPref() methods.
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  template <typename T, base::Value::Type type_enum_value>
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class ScopedUpdate {
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ScopedUpdate(ExtensionPrefs* prefs,
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 const std::string& extension_id,
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 const std::string& key);
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual ~ScopedUpdate();
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Returns a mutable value for the key (ownership remains with the prefs),
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // if one exists. Otherwise, returns NULL.
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual T* Get();
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Creates and returns a mutable value for the key (the prefs own the new
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // value), if one does not already exist. Otherwise, returns the current
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // value.
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual T* Create();
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   private:
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ScopedUpdate);
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DictionaryPrefUpdate update_;
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string extension_id_;
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string key_;
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef ScopedUpdate<base::DictionaryValue, base::Value::TYPE_DICTIONARY>
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ScopedDictionaryUpdate;
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef ScopedUpdate<base::ListValue, base::Value::TYPE_LIST>
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ScopedListUpdate;
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates and initializes an ExtensionPrefs object.
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Does not take ownership of |prefs| and |extension_pref_value_map|.
13690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // If |extensions_disabled| is true, extension controlled preferences and
13790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // content settings do not become effective.
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,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool extensions_disabled);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A version of Create which allows injection of a custom base::Time provider.
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Use this as needed for testing.
14690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static ExtensionPrefs* Create(
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefService* prefs,
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& root_dir,
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionPrefValueMap* extension_pref_value_map,
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool extensions_disabled,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<TimeProvider> time_provider);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionPrefs();
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
15590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // BrowserContextKeyedService implementation.
15690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual void Shutdown() OVERRIDE;
15790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
15890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Convenience function to get the ExtensionPrefs for a Profile.
15990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  static ExtensionPrefs* Get(Profile* profile);
16090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns all installed extensions from extension preferences provided by
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |pref_service|. This is exposed for ProtectedPrefsWatcher because it needs
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // access to the extension ID list before the ExtensionService is initialized.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static ExtensionIdList GetExtensionsFrom(const PrefService* pref_service);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the specified external extension was uninstalled by the
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExternalExtensionUninstalled(const std::string& id) const;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether |extension_id| is disabled. If there's no state pref for
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the extension, this will return false. Generally you should use
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionService::IsExtensionEnabled instead.
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionDisabled(const std::string& id) const;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get/Set the order that the browser actions appear in the toolbar.
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionIdList GetToolbarOrder();
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetToolbarOrder(const ExtensionIdList& extension_ids);
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when an extension is installed, so that prefs get created.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |page_ordinal| is an invalid ordinal, then a page will be found
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for the App.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExtensionInstalled(const Extension* extension,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            Extension::State initial_state,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const syncer::StringOrdinal& page_ordinal);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when an extension is uninstalled, so that prefs get cleaned up.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExtensionUninstalled(const std::string& extension_id,
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const Manifest::Location& location,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool external_uninstall);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to change the extension's state when it is enabled/disabled.
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionState(const std::string& extension_id, Extension::State);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Populates |out| with the ids of all installed extensions.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetExtensions(ExtensionIdList* out);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ExtensionScopedPrefs methods:
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void UpdateExtensionPref(const std::string& id,
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   const std::string& key,
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   base::Value* value) OVERRIDE;
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DeleteExtensionPrefs(const std::string& id) OVERRIDE;
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsBoolean(const std::string& extension_id,
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const std::string& pref_key,
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 bool* out_value) const OVERRIDE;
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsInteger(const std::string& extension_id,
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const std::string& pref_key,
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 int* out_value) const OVERRIDE;
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsString(const std::string& extension_id,
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const std::string& pref_key,
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                std::string* out_value) const OVERRIDE;
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsList(const std::string& extension_id,
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const std::string& pref_key,
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const base::ListValue** out_value) const OVERRIDE;
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsDictionary(
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& extension_id,
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& pref_key,
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::DictionaryValue** out_value) const OVERRIDE;
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Did the extension ask to escalate its permission during an upgrade?
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DidExtensionEscalatePermissions(const std::string& id);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |did_escalate| is true, the preferences for |extension| will be set to
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // require the install warning when the user tries to enable.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetDidExtensionEscalatePermissions(
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Extension* extension,
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool did_escalate);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getter and setters for disabled reason.
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetDisableReasons(const std::string& extension_id);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddDisableReason(const std::string& extension_id,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        Extension::DisableReason disable_reason);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveDisableReason(const std::string& extension_id,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           Extension::DisableReason disable_reason);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearDisableReasons(const std::string& extension_id);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Gets the set of extensions that have been blacklisted in prefs.
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::set<std::string> GetBlacklistedExtensions();
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Sets whether the extension with |id| is blacklisted.
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetExtensionBlacklisted(const std::string& extension_id,
2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               bool is_blacklisted);
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the version string for the currently installed extension, or
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the empty string if not found.
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetVersionString(const std::string& extension_id);
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Re-writes the extension manifest into the prefs.
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to change the extension's manifest when it's re-localized.
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateManifest(const Extension* extension);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns extension path based on extension ID, or empty FilePath on error.
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath GetExtensionPath(const std::string& extension_id);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns base extensions install directory.
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::FilePath& install_directory() const { return install_directory_; }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns whether the extension with |id| has its blacklist bit set.
2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  //
2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // WARNING: this only checks the extension's entry in prefs, so by definition
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // can only check extensions that prefs knows about. There may be other
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // sources of blacklist information, such as safebrowsing. You probably want
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to use Blacklist::GetBlacklistedIDs rather than this method.
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsExtensionBlacklisted(const std::string& id) const;
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Increment the count of how many times we prompted the user to acknowledge
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the given extension, and return the new count.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int IncrementAcknowledgePromptCount(const std::string& extension_id);
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the user has acknowledged an external extension.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExternalExtensionAcknowledged(const std::string& extension_id);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AcknowledgeExternalExtension(const std::string& extension_id);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether the user has acknowledged a blacklisted extension.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsBlacklistedExtensionAcknowledged(const std::string& extension_id);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AcknowledgeBlacklistedExtension(const std::string& extension_id);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
283c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Whether the external extension was installed during the first run
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // of this profile.
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool IsExternalInstallFirstRun(const std::string& extension_id);
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetExternalInstallFirstRun(const std::string& extension_id);
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the extension notification code has already run for the
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first time for this profile. Currently we use this flag to mean that any
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extensions that would trigger notifications should get silently
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // acknowledged. This is a fuse. Calling it the first time returns false.
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Subsequent calls return true. It's not possible through an API to ever
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // reset it. Don't call it unless you mean it!
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool SetAlertSystemFirstRun();
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks if extensions are blacklisted by default, by policy.
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The ManagementPolicy::Provider methods also take this into account, and
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // should be used instead when the extension ID is known.
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ExtensionsBlacklistedByDefault() const;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the last value set via SetLastPingDay. If there isn't such a
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pref, the returned Time will return true for is_null().
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time LastPingDay(const std::string& extension_id) const;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The time stored is based on the server's perspective of day start time, not
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the client's.
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLastPingDay(const std::string& extension_id, const base::Time& time);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Similar to the 2 above, but for the extensions blacklist.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time BlacklistLastPingDay() const;
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBlacklistLastPingDay(const base::Time& time);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Similar to LastPingDay/SetLastPingDay, but for sending "days since active"
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ping.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time LastActivePingDay(const std::string& extension_id);
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLastActivePingDay(const std::string& extension_id,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const base::Time& time);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A bit we use for determining if we should send the "days since active"
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ping. A value of true means the item has been active (launched) since the
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // last update check.
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetActiveBit(const std::string& extension_id);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetActiveBit(const std::string& extension_id, bool active);
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the granted permission set for the extension with |extension_id|,
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and NULL if no preferences were found for |extension_id|.
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This passes ownership of the returned set to the caller.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PermissionSet* GetGrantedPermissions(const std::string& extension_id);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds |permissions| to the granted permissions set for the extension with
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |extension_id|. The new granted permissions set will be the union of
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |permissions| and the already granted permissions.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddGrantedPermissions(const std::string& extension_id,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const PermissionSet* permissions);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // As above, but subtracts the given |permissions| from the granted set.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveGrantedPermissions(const std::string& extension_id,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const PermissionSet* permissions);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the active permission set for the specified extension. This may
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // differ from the permissions in the manifest due to the optional
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // permissions API. This passes ownership of the set to the caller.
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PermissionSet* GetActivePermissions(const std::string& extension_id);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets the active |permissions| for the extension with |extension_id|.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetActivePermissions(const std::string& extension_id,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const PermissionSet* permissions);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Records whether or not this extension is currently running.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionRunning(const std::string& extension_id, bool is_running);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether or not this extension is marked as running. This is used to
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // restart apps across browser restarts.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionRunning(const std::string& extension_id);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Set/Get whether or not the extension has windows associated with it. Used
35790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // to force a launch of apps that don't handle onRestarted() on a restart. We
35890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // can only safely do that if the app had windows when it was last running.
35990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetHasWindows(const std::string& extension_id, bool has_windows);
36090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool HasWindows(const std::string& extension_id);
36190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the user enabled this extension to be loaded in incognito
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mode.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsIncognitoEnabled(const std::string& extension_id);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetIsIncognitoEnabled(const std::string& extension_id, bool enabled);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the user has chosen to allow this extension to inject
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // scripts into pages with file URLs.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AllowFileAccess(const std::string& extension_id);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAllowFileAccess(const std::string& extension_id, bool allow);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasAllowFileAccessSetting(const std::string& extension_id) const;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the launch type preference.  If no preference is set, return
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |default_pref_value|.
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LaunchType GetLaunchType(const Extension* extension,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           LaunchType default_pref_value);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLaunchType(const std::string& extension_id, LaunchType launch_type);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the right launch container based on the launch type.
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |extension|'s prefs do not have a launch type set, then
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // use |default_pref_value|.
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_misc::LaunchContainer GetLaunchContainer(
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Extension* extension,
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LaunchType default_pref_value);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Saves ExtensionInfo for each installed extension with the path to the
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // version directory and the location. Blacklisted extensions won't be saved
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and neither will external extensions the user has explicitly uninstalled.
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Caller takes ownership of returned structure.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionsInfo> GetInstalledExtensionsInfo() const;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the ExtensionInfo from the prefs for the given extension. If the
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension is not present, NULL is returned.
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionInfo> GetInstalledExtensionInfo(
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id) const;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We've downloaded an updated .crx file for the extension, but are waiting
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for idle time to install it.
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetDelayedInstallInfo(const Extension* extension,
4012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Extension::State initial_state,
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const syncer::StringOrdinal& page_ordinal);
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Removes any delayed install information we have for the given
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |extension_id|. Returns true if there was info to remove; false otherwise.
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool RemoveDelayedInstallInfo(const std::string& extension_id);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the prefs to finish the update for an extension.
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool FinishDelayedInstallInfo(const std::string& extension_id);
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the ExtensionInfo from the prefs for delayed install information
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for |extension_id|, if we have any. Otherwise returns NULL.
4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ExtensionInfo> GetDelayedInstallInfo(
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id) const;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns information about all the extensions that have delayed install
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // information.
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ExtensionsInfo> GetAllDelayedInstallInfo() const;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the user repositioned the app on the app launcher via drag
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and drop.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WasAppDraggedByUser(const std::string& extension_id);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets a flag indicating that the user repositioned the app on the app
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launcher by drag and dropping it.
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAppDraggedByUser(const std::string& extension_id);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
42890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // The extension's uninstall URL. If not empty, ExtensionService will
42990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // load the URL when the extension is uninstalled.
43090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void SetUninstallUrl(const std::string& extension_id,
43190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                       const std::string& url_string);
43290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  std::string GetUninstallUrl(const std::string& extension_id);
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets a preference value that is controlled by the extension. In other
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // words, this is not a pref value *about* the extension but something
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // global the extension wants to override.
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of |value|.
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionControlledPref(const std::string& extension_id,
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const std::string& pref_key,
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ExtensionPrefsScope scope,
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  base::Value* value);
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveExtensionControlledPref(const std::string& extension_id,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& pref_key,
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ExtensionPrefsScope scope);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if currently no extension with higher precedence controls the
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preference.
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CanExtensionControlPref(const std::string& extension_id,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const std::string& pref_key,
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool incognito);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if extension |extension_id| currently controls the
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preference. If |from_incognito| is not NULL, looks at incognito preferences
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first, and |from_incognito| is set to true if the effective pref value is
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // coming from the incognito preferences, false if it is coming from the
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // normal ones.
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoesExtensionControlPref(const std::string& extension_id,
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const std::string& pref_key,
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool* from_incognito);
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if there is an extension which controls the preference value
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  for |pref_key| *and* it is specific to incognito mode.
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasIncognitoPrefValue(const std::string& pref_key);
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears incognito session-only content settings for all extensions.
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearIncognitoSessionOnlyContentSettings();
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the creation flags mask for the extension.
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetCreationFlags(const std::string& extension_id) const;
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the extension was installed from the Chrome Web Store.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFromWebStore(const std::string& extension_id) const;
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the extension was installed from an App generated from a
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bookmark.
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFromBookmark(const std::string& extension_id) const;
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the extension was installed as a default app.
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WasInstalledByDefault(const std::string& extension_id) const;
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method to acquire the installation time of an extension.
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns base::Time() if the installation time could not be parsed or
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // found.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time GetInstallTime(const std::string& extension_id) const;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
487c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static void RegisterUserPrefs(user_prefs::PrefRegistrySyncable* registry);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsStore* content_settings_store() {
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return content_settings_store_.get();
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The underlying PrefService.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* pref_service() const { return prefs_; }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The underlying ExtensionSorting.
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSorting* extension_sorting() const {
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension_sorting_.get();
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Describes the URLs that are able to install extensions. See
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prefs::kExtensionAllowedInstallSites for more information.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet GetAllowedInstallSites();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Schedules garbage collection of an extension's on-disk data on the next
5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // start of this ExtensionService. Applies only to extensions with isolated
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // storage.
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetNeedsStorageGarbageCollection(bool value);
5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool NeedsStorageGarbageCollection();
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used by ShellWindowGeometryCache to persist its cache. These methods
5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should not be called directly.
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::DictionaryValue* GetGeometryCache(
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::string& extension_id) const;
5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetGeometryCache(const std::string& extension_id,
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        scoped_ptr<base::DictionaryValue> cache);
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The path of the directory containing the last file chosen by the user in
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // response to a chrome.fileSystem.chooseEntry() call for this extension.
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool GetLastChooseEntryDirectory(const std::string& extension_id,
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   base::FilePath* result) const;
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetLastChooseEntryDirectory(const std::string& extension_id,
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   const base::FilePath& value);
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ExtensionPrefsBlacklistedExtensions;  // Unit test.
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ExtensionPrefsUninstallExtension;     // Unit test.
5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // See the Create methods.
5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionPrefs(PrefService* prefs,
5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const base::FilePath& root_dir,
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 ExtensionPrefValueMap* extension_pref_value_map,
53390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 scoped_ptr<TimeProvider> time_provider,
53490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)                 bool extensions_disabled);
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extensions::ContentSettingsStore::Observer methods:
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnContentSettingChanged(const std::string& extension_id,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool incognito) OVERRIDE;
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts absolute paths in the pref to paths relative to the
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // install_directory_.
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MakePathsRelative();
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts internal relative paths to be absolute. Used for export to
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // consumers who expect full paths.
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MakePathsAbsolute(base::DictionaryValue* dict);
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Helper function used by GetInstalledExtensionInfo() and
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GetDelayedInstallInfo() to construct an ExtensionInfo from the provided
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |extension| dictionary.
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<ExtensionInfo> GetInstalledInfoHelper(
552c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& extension_id,
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::DictionaryValue* extension) const;
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Interprets the list pref, |pref_key| in |extension_id|'s preferences, as a
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLPatternSet. The |valid_schemes| specify how to parse the URLPatterns.
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool ReadPrefAsURLPatternSet(const std::string& extension_id,
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const std::string& pref_key,
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               URLPatternSet* result,
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               int valid_schemes);
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts |new_value| to a list of strings and sets the |pref_key| pref
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // belonging to |extension_id|.
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionPrefURLPatternSet(const std::string& extension_id,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& pref_key,
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const URLPatternSet& new_value);
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Read the boolean preference entry and return true if the preference exists
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // and the preference's value is true; false otherwise.
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool ReadPrefAsBooleanAndReturn(const std::string& extension_id,
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  const std::string& key) const;
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Interprets |pref_key| in |extension_id|'s preferences as an
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PermissionSet, and passes ownership of the set to the caller.
575c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PermissionSet* ReadPrefAsPermissionSet(const std::string& extension_id,
576c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         const std::string& pref_key);
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts the |new_value| to its value and sets the |pref_key| pref
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // belonging to |extension_id|.
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionPrefPermissionSet(const std::string& extension_id,
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& pref_key,
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const PermissionSet* new_value);
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
584c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns an immutable dictionary for extension |id|'s prefs, or NULL if it
585c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // doesn't exist.
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::DictionaryValue* GetExtensionPref(const std::string& id) const;
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loads the preferences controlled by the specified extension from their
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dictionary and sets them in the |pref_value_map_|.
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadExtensionControlledPrefs(const std::string& id,
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ExtensionPrefsScope scope);
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fix missing preference entries in the extensions that are were introduced
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in a later Chrome version.
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FixMissingPrefs(const ExtensionIdList& extension_ids);
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installs the persistent extension preferences into |prefs_|'s extension
59890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // pref store. Does nothing if extensions_disabled_ is true.
59990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void InitPrefStore();
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Migrates the permissions data in the pref store.
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MigratePermissions(const ExtensionIdList& extension_ids);
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Migrates the disable reasons from a single enum to a bit mask.
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MigrateDisableReasons(const ExtensionIdList& extension_ids);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether there is a state pref for the extension and if so, whether
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it matches |check_state|.
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoesExtensionHaveState(const std::string& id,
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Extension::State check_state) const;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function to Get/Set array of strings from/to prefs.
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionIdList GetExtensionPrefAsVector(const char* pref);
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionPrefFromVector(const char* pref,
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const ExtensionIdList& extension_ids);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper function to populate |extension_dict| with the values needed
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // by a newly installed extension. Work is broken up between this
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // function and FinishExtensionInfoPrefs() to accomodate delayed
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // installations.
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PopulateExtensionInfoPrefs(const Extension* extension,
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const base::Time install_time,
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  Extension::State initial_state,
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  base::DictionaryValue* extension_dict);
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper function to complete initialization of the values in
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |extension_dict| for an extension install. Also see
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PopulateExtensionInfoPrefs().
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FinishExtensionInfoPrefs(
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& extension_id,
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Time install_time,
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool needs_sort_ordinal,
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const syncer::StringOrdinal& suggested_page_ordinal,
634c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::DictionaryValue* extension_dict);
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The pref service specific to this set of extension prefs. Owned by profile.
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs_;
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Base extensions install directory.
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath install_directory_;
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak pointer, owned by Profile.
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionPrefValueMap* extension_pref_value_map_;
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains all the logic for handling the order for various extension
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // properties.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionSorting> extension_sorting_;
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ContentSettingsStore> content_settings_store_;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TimeProvider> time_provider_;
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
65390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool extensions_disabled_;
65490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionPrefs);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_PREFS_H_
661