extension_prefs.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
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"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "extensions/common/url_pattern_set.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/string_ordinal.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionPrefValueMap;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionSorting;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefService;
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PrefRegistrySyncable;
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionPrefsUninstallExtension;
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class URLPatternSet;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace app_file_handler_util {
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)struct SavedFileEntry;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Class for managing global and per-extension preferences.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class distinguishes the following kinds of preferences:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - global preferences:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       internal state for the extension system in general, not associated
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       with an individual extension, such as lastUpdateTime.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - per-extension preferences:
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       meta-preferences describing properties of the extension like
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       installation time, whether the extension is enabled, etc.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// - extension controlled preferences:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       browser preferences that an extension controls. For example, an
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       extension could use the proxy API to specify the browser's proxy
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       preference. Extension-controlled preferences are stored in
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       PrefValueStore::extension_prefs(), which this class populates and
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       maintains as the underlying extensions change.
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionPrefs : public ContentSettingsStore::Observer,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       public ExtensionScopedPrefs {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Key name for a preference that keeps track of per-extension settings. This
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is a dictionary object read from the Preferences file, keyed off of
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension ids.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const char kExtensionsPref[];
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<linked_ptr<ExtensionInfo> > ExtensionsInfo;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Vector containing identifiers for preferences.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::set<std::string> PrefKeySet;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This enum is used for the launch type the user wants to use for an
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // application.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do not remove items or re-order this enum as it is used in preferences
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and histograms.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum LaunchType {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAUNCH_PINNED,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAUNCH_REGULAR,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAUNCH_FULLSCREEN,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAUNCH_WINDOW,
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Launch an app in the in the way a click on the NTP would,
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // if no user pref were set.  Update this constant to change
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the default for the NTP and chrome.management.launchApp().
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LAUNCH_DEFAULT = LAUNCH_REGULAR
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates base::Time classes. The default implementation is just to return
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the current time, but tests can inject alternative implementations.
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class TimeProvider {
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   public:
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TimeProvider();
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual ~TimeProvider();
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // By default, returns the current time (base::Time::Now()).
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual base::Time GetCurrentTime() const;
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)   private:
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(TimeProvider);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A wrapper around a ScopedUserPrefUpdate, which allows us to access the
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // entry of a particular key for an extension. Use this if you need a mutable
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // record of a dictionary or list in the current settings. Otherwise, prefer
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ReadPrefAsT() and UpdateExtensionPref() methods.
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  template <typename T, base::Value::Type type_enum_value>
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  class ScopedUpdate {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   public:
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ScopedUpdate(ExtensionPrefs* prefs,
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 const std::string& extension_id,
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 const std::string& key);
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual ~ScopedUpdate();
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Returns a mutable value for the key (ownership remains with the prefs),
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // if one exists. Otherwise, returns NULL.
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual T* Get();
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Creates and returns a mutable value for the key (the prefs own the new
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // value), if one does not already exist. Otherwise, returns the current
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // value.
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual T* Create();
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   private:
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(ScopedUpdate);
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DictionaryPrefUpdate update_;
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string extension_id_;
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const std::string key_;
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef ScopedUpdate<base::DictionaryValue, base::Value::TYPE_DICTIONARY>
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ScopedDictionaryUpdate;
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef ScopedUpdate<base::ListValue, base::Value::TYPE_LIST>
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ScopedListUpdate;
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates and initializes an ExtensionPrefs object.
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Does not take ownership of |prefs| and |extension_pref_value_map|.
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<ExtensionPrefs> Create(
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefService* prefs,
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& root_dir,
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionPrefValueMap* extension_pref_value_map,
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool extensions_disabled);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A version of Create which allows injection of a custom base::Time provider.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Use this as needed for testing.
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static scoped_ptr<ExtensionPrefs> Create(
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PrefService* prefs,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& root_dir,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ExtensionPrefValueMap* extension_pref_value_map,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool extensions_disabled,
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      scoped_ptr<TimeProvider> time_provider);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionPrefs();
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (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 a copy of the Extensions prefs.
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(erikkay) Remove this so that external consumers don't need to be
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // aware of the internal structure of the preferences.
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::DictionaryValue* CopyCurrentExtensions();
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the specified external extension was uninstalled by the
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExternalExtensionUninstalled(const std::string& id) const;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether |extension_id| is disabled. If there's no state pref for
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the extension, this will return false. Generally you should use
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ExtensionService::IsExtensionEnabled instead.
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionDisabled(const std::string& id) const;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get/Set the order that the browser actions appear in the toolbar.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionIdList GetToolbarOrder();
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetToolbarOrder(const ExtensionIdList& extension_ids);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when an extension is installed, so that prefs get created.
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |page_ordinal| is an invalid ordinal, then a page will be found
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for the App.
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExtensionInstalled(const Extension* extension,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            Extension::State initial_state,
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            const syncer::StringOrdinal& page_ordinal);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when an extension is uninstalled, so that prefs get cleaned up.
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnExtensionUninstalled(const std::string& extension_id,
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              const Manifest::Location& location,
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool external_uninstall);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called to change the extension's state when it is enabled/disabled.
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionState(const std::string& extension_id, Extension::State);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Populates |out| with the ids of all installed extensions.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void GetExtensions(ExtensionIdList* out);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ExtensionScopedPrefs methods:
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void UpdateExtensionPref(const std::string& id,
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   const std::string& key,
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   base::Value* value) OVERRIDE;
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void DeleteExtensionPrefs(const std::string& id) OVERRIDE;
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsBoolean(const std::string& extension_id,
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const std::string& pref_key,
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 bool* out_value) const OVERRIDE;
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsInteger(const std::string& extension_id,
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 const std::string& pref_key,
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 int* out_value) const OVERRIDE;
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsString(const std::string& extension_id,
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                const std::string& pref_key,
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                std::string* out_value) const OVERRIDE;
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsList(const std::string& extension_id,
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const std::string& pref_key,
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                              const base::ListValue** out_value) const OVERRIDE;
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool ReadPrefAsDictionary(
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& extension_id,
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& pref_key,
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::DictionaryValue** out_value) const OVERRIDE;
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Getter and setter for browser action visibility.
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetBrowserActionVisibility(const Extension* extension);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetBrowserActionVisibility(const Extension* extension,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     bool visible);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (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)  // Returns true if registered events are from this version of Chrome. Else,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // clear them, and return false.
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CheckRegisteredEventsUpToDate();
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the list of events that the given extension has registered for.
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> GetRegisteredEvents(const std::string& extension_id);
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetRegisteredEvents(const std::string& extension_id,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const std::set<std::string>& events);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a filter to an event.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddFilterToEvent(const std::string& event_name,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& extension_id,
361c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        const base::DictionaryValue* filter);
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes a filter from an event.
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveFilterFromEvent(const std::string& event_name,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const std::string& extension_id,
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             const base::DictionaryValue* filter);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the dictionary of event filters that the given extension has
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // registered.
370c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  const base::DictionaryValue* GetFilteredEvents(
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id) const;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Records whether or not this extension is currently running.
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionRunning(const std::string& extension_id, bool is_running);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether or not this extension is marked as running. This is used to
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // restart apps across browser restarts.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsExtensionRunning(const std::string& extension_id);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void AddSavedFileEntry(const std::string& extension_id,
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const std::string& id,
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const base::FilePath& file_path,
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         bool writable);
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void ClearSavedFileEntries(const std::string& extension_id);
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GetSavedFileEntries(
3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& extension_id,
3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::vector<app_file_handler_util::SavedFileEntry>* out);
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the user enabled this extension to be loaded in incognito
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // mode.
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsIncognitoEnabled(const std::string& extension_id);
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetIsIncognitoEnabled(const std::string& extension_id, bool enabled);
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the user has chosen to allow this extension to inject
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // scripts into pages with file URLs.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool AllowFileAccess(const std::string& extension_id);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAllowFileAccess(const std::string& extension_id, bool allow);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasAllowFileAccessSetting(const std::string& extension_id) const;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the launch type preference.  If no preference is set, return
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |default_pref_value|.
4022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  LaunchType GetLaunchType(const Extension* extension,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           LaunchType default_pref_value);
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetLaunchType(const std::string& extension_id, LaunchType launch_type);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the right launch container based on the launch type.
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If |extension|'s prefs do not have a launch type set, then
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // use |default_pref_value|.
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extension_misc::LaunchContainer GetLaunchContainer(
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Extension* extension,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      LaunchType default_pref_value);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Saves ExtensionInfo for each installed extension with the path to the
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // version directory and the location. Blacklisted extensions won't be saved
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and neither will external extensions the user has explicitly uninstalled.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Caller takes ownership of returned structure.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionsInfo> GetInstalledExtensionsInfo() const;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the ExtensionInfo from the prefs for the given extension. If the
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extension is not present, NULL is returned.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionInfo> GetInstalledExtensionInfo(
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id) const;
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We've downloaded an updated .crx file for the extension, but are waiting
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for idle time to install it.
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetDelayedInstallInfo(const Extension* extension,
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             Extension::State initial_state,
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const syncer::StringOrdinal& page_ordinal);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Removes any delayed install information we have for the given
4322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |extension_id|. Returns true if there was info to remove; false otherwise.
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool RemoveDelayedInstallInfo(const std::string& extension_id);
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update the prefs to finish the update for an extension.
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool FinishDelayedInstallInfo(const std::string& extension_id);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the ExtensionInfo from the prefs for delayed install information
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // for |extension_id|, if we have any. Otherwise returns NULL.
4402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ExtensionInfo> GetDelayedInstallInfo(
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& extension_id) const;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns information about all the extensions that have delayed install
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // information.
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<ExtensionsInfo> GetAllDelayedInstallInfo() const;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We allow the web store to set a string containing login information when a
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // purchase is made, so that when a user logs into sync with a different
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // account we can recognize the situation. The Get function returns true if
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // there was previously stored data (placing it in |result|), or false
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // otherwise. The Set will overwrite any previous login.
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool GetWebStoreLogin(std::string* result);
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetWebStoreLogin(const std::string& login);
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the user repositioned the app on the app launcher via drag
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and drop.
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WasAppDraggedByUser(const std::string& extension_id);
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets a flag indicating that the user repositioned the app on the app
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // launcher by drag and dropping it.
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetAppDraggedByUser(const std::string& extension_id);
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The extension's update URL data.  If not empty, the ExtensionUpdater
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will append a ap= parameter to the URL when checking if a new version
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of the extension is available.
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetUpdateUrlData(const std::string& extension_id,
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& data);
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string GetUpdateUrlData(const std::string& extension_id);
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sets a preference value that is controlled by the extension. In other
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // words, this is not a pref value *about* the extension but something
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // global the extension wants to override.
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Takes ownership of |value|.
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionControlledPref(const std::string& extension_id,
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const std::string& pref_key,
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  ExtensionPrefsScope scope,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  base::Value* value);
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RemoveExtensionControlledPref(const std::string& extension_id,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& pref_key,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ExtensionPrefsScope scope);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if currently no extension with higher precedence controls the
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preference.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CanExtensionControlPref(const std::string& extension_id,
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               const std::string& pref_key,
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool incognito);
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if extension |extension_id| currently controls the
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // preference. If |from_incognito| is not NULL, looks at incognito preferences
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // first, and |from_incognito| is set to true if the effective pref value is
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // coming from the incognito preferences, false if it is coming from the
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // normal ones.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoesExtensionControlPref(const std::string& extension_id,
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const std::string& pref_key,
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                bool* from_incognito);
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if there is an extension which controls the preference value
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //  for |pref_key| *and* it is specific to incognito mode.
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasIncognitoPrefValue(const std::string& pref_key);
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears incognito session-only content settings for all extensions.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearIncognitoSessionOnlyContentSettings();
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the creation flags mask for the extension.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetCreationFlags(const std::string& extension_id) const;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the extension was installed from the Chrome Web Store.
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFromWebStore(const std::string& extension_id) const;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the extension was installed from an App generated from a
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bookmark.
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFromBookmark(const std::string& extension_id) const;
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the extension was installed as a default app.
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool WasInstalledByDefault(const std::string& extension_id) const;
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper method to acquire the installation time of an extension.
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns base::Time() if the installation time could not be parsed or
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // found.
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time GetInstallTime(const std::string& extension_id) const;
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static void RegisterUserPrefs(user_prefs::PrefRegistrySyncable* registry);
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsStore* content_settings_store() {
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return content_settings_store_.get();
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The underlying PrefService.
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* pref_service() const { return prefs_; }
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The underlying ExtensionSorting.
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionSorting* extension_sorting() const {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return extension_sorting_.get();
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Describes the URLs that are able to install extensions. See
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prefs::kExtensionAllowedInstallSites for more information.
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  URLPatternSet GetAllowedInstallSites();
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Schedules garbage collection of an extension's on-disk data on the next
5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // start of this ExtensionService. Applies only to extensions with isolated
5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // storage.
5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetNeedsStorageGarbageCollection(bool value);
5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool NeedsStorageGarbageCollection();
5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used by ShellWindowGeometryCache to persist its cache. These methods
5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // should not be called directly.
5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const base::DictionaryValue* GetGeometryCache(
5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        const std::string& extension_id) const;
5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetGeometryCache(const std::string& extension_id,
5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                        scoped_ptr<base::DictionaryValue> cache);
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The path of the directory containing the last file chosen by the user in
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // response to a chrome.fileSystem.chooseEntry() call for this extension.
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool GetLastChooseEntryDirectory(const std::string& extension_id,
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   base::FilePath* result) const;
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetLastChooseEntryDirectory(const std::string& extension_id,
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   const base::FilePath& value);
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ExtensionPrefsBlacklistedExtensions;  // Unit test.
5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class ExtensionPrefsUninstallExtension;     // Unit test.
5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // See the Create methods.
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionPrefs(PrefService* prefs,
5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 const base::FilePath& root_dir,
5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 ExtensionPrefValueMap* extension_pref_value_map,
5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 scoped_ptr<TimeProvider> time_provider);
5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If |extensions_disabled| is true, extension controlled preferences and
5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // content settings do not become effective.
5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Init(bool extensions_disabled);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // extensions::ContentSettingsStore::Observer methods:
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnContentSettingChanged(const std::string& extension_id,
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool incognito) OVERRIDE;
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts absolute paths in the pref to paths relative to the
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // install_directory_.
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MakePathsRelative();
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts internal relative paths to be absolute. Used for export to
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // consumers who expect full paths.
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MakePathsAbsolute(base::DictionaryValue* dict);
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
587c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Helper function used by GetInstalledExtensionInfo() and
588c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // GetDelayedInstallInfo() to construct an ExtensionInfo from the provided
589c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // |extension| dictionary.
590c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<ExtensionInfo> GetInstalledInfoHelper(
591c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const std::string& extension_id,
592c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const base::DictionaryValue* extension) const;
593c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Interprets the list pref, |pref_key| in |extension_id|'s preferences, as a
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URLPatternSet. The |valid_schemes| specify how to parse the URLPatterns.
596c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool ReadPrefAsURLPatternSet(const std::string& extension_id,
597c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               const std::string& pref_key,
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               URLPatternSet* result,
599c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               int valid_schemes);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts |new_value| to a list of strings and sets the |pref_key| pref
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // belonging to |extension_id|.
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionPrefURLPatternSet(const std::string& extension_id,
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& pref_key,
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const URLPatternSet& new_value);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Read the boolean preference entry and return true if the preference exists
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // and the preference's value is true; false otherwise.
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool ReadPrefAsBooleanAndReturn(const std::string& extension_id,
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  const std::string& key) const;
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Interprets |pref_key| in |extension_id|'s preferences as an
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // PermissionSet, and passes ownership of the set to the caller.
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  PermissionSet* ReadPrefAsPermissionSet(const std::string& extension_id,
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                         const std::string& pref_key);
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Converts the |new_value| to its value and sets the |pref_key| pref
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // belonging to |extension_id|.
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionPrefPermissionSet(const std::string& extension_id,
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const std::string& pref_key,
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const PermissionSet* new_value);
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns an immutable dictionary for extension |id|'s prefs, or NULL if it
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // doesn't exist.
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::DictionaryValue* GetExtensionPref(const std::string& id) const;
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Loads the preferences controlled by the specified extension from their
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // dictionary and sets them in the |pref_value_map_|.
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void LoadExtensionControlledPrefs(const std::string& id,
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    ExtensionPrefsScope scope);
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fix missing preference entries in the extensions that are were introduced
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // in a later Chrome version.
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FixMissingPrefs(const ExtensionIdList& extension_ids);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installs the persistent extension preferences into |prefs_|'s extension
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // pref store. Does nothing if |extensions_disabled| is true.
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void InitPrefStore(bool extensions_disabled);
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Migrates the permissions data in the pref store.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MigratePermissions(const ExtensionIdList& extension_ids);
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Migrates the disable reasons from a single enum to a bit mask.
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void MigrateDisableReasons(const ExtensionIdList& extension_ids);
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears the registered events for event pages.
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ClearRegisteredEvents();
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Checks whether there is a state pref for the extension and if so, whether
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // it matches |check_state|.
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool DoesExtensionHaveState(const std::string& id,
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              Extension::State check_state) const;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Helper function to Get/Set array of strings from/to prefs.
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionIdList GetExtensionPrefAsVector(const char* pref);
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetExtensionPrefFromVector(const char* pref,
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const ExtensionIdList& extension_ids);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper function to populate |extension_dict| with the values needed
6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // by a newly installed extension. Work is broken up between this
6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // function and FinishExtensionInfoPrefs() to accomodate delayed
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // installations.
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void PopulateExtensionInfoPrefs(const Extension* extension,
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  const base::Time install_time,
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  Extension::State initial_state,
666c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  base::DictionaryValue* extension_dict);
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Helper function to complete initialization of the values in
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |extension_dict| for an extension install. Also see
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PopulateExtensionInfoPrefs().
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void FinishExtensionInfoPrefs(
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& extension_id,
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::Time install_time,
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool needs_sort_ordinal,
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const syncer::StringOrdinal& suggested_page_ordinal,
676c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::DictionaryValue* extension_dict);
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The pref service specific to this set of extension prefs. Owned by profile.
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs_;
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Base extensions install directory.
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath install_directory_;
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Weak pointer, owned by Profile.
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionPrefValueMap* extension_pref_value_map_;
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Contains all the logic for handling the order for various extension
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // properties.
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<ExtensionSorting> extension_sorting_;
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ContentSettingsStore> content_settings_store_;
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<TimeProvider> time_provider_;
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ExtensionPrefs);
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_PREFS_H_
701