extension_prefs.h revision ddb351dbec246cf1fab5ec20d2d5520909041de1
172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_PREFS_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_EXTENSIONS_EXTENSION_PREFS_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <set>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/linked_ptr.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/prefs/pref_service.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/extensions/extension.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass ExtensionPrefValueMap;
2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Class for managing global and per-extension preferences.
2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen//
2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// This class distinguishes the following kinds of preferences:
2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// - global preferences:
2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen//       internal state for the extension system in general, not associated
2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen//       with an individual extension, such as lastUpdateTime.
2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// - per-extension preferences:
2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen//       meta-preferences describing properties of the extension like
2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen//       installation time, whether the extension is enabled, etc.
3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// - extension controlled preferences:
3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen//       browser preferences that an extension controls. For example, an
3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen//       extension could use the proxy API to specify the browser's proxy
3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen//       preference. Extension-controlled preferences are stored in
3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen//       PrefValueStore::extension_prefs(), which this class populates and
3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen//       maintains as the underlying extensions change.
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionPrefs {
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Key name for a preference that keeps track of per-extension settings. This
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // is a dictionary object read from the Preferences file, keyed off of
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // extension ids.
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const char kExtensionsPref[];
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::vector<linked_ptr<ExtensionInfo> > ExtensionsInfo;
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Vector containing identifiers for preferences.
4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  typedef std::set<std::string> PrefKeySet;
4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Vector containing identifiers for extensions.
4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  typedef std::vector<std::string> ExtensionIdSet;
5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // This enum is used for the launch type the user wants to use for an
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // application.
53731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Do not remove items or re-order this enum as it is used in preferences
54731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // and histograms.
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  enum LaunchType {
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LAUNCH_PINNED,
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LAUNCH_REGULAR,
58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LAUNCH_FULLSCREEN,
5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    LAUNCH_WINDOW,
6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // Launch an app in the in the way a click on the NTP would,
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // if no user pref were set.  Update this constant to change
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    // the default for the NTP and chrome.management.launchApp().
6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    LAUNCH_DEFAULT = LAUNCH_REGULAR
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Does not assume ownership of |prefs| and |incognito_prefs|.
6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  explicit ExtensionPrefs(PrefService* prefs,
6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                          const FilePath& root_dir,
7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                          ExtensionPrefValueMap* extension_pref_value_map);
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  virtual ~ExtensionPrefs();
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a copy of the Extensions prefs.
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(erikkay) Remove this so that external consumers don't need to be
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // aware of the internal structure of the preferences.
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue* CopyCurrentExtensions();
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns true if the specified external extension was uninstalled by the
79ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // user.
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool IsExternalExtensionUninstalled(const std::string& id) const;
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get the order that toolstrip URLs appear in the shelf.
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::vector<GURL> URLList;
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLList GetShelfToolstripOrder();
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the order that toolstrip URLs appear in the shelf.
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetShelfToolstripOrder(const URLList& urls);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get the order that the browser actions appear in the toolbar.
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<std::string> GetToolbarOrder();
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set the order that the browser actions appear in the toolbar.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetToolbarOrder(const std::vector<std::string>& extension_ids);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when an extension is installed, so that prefs get created.
96513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void OnExtensionInstalled(const Extension* extension,
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            Extension::State initial_state,
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            bool initial_incognito_enabled);
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when an extension is uninstalled, so that prefs get cleaned up.
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnExtensionUninstalled(const std::string& extension_id,
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              const Extension::Location& location,
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              bool external_uninstall);
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the state (enabled/disabled) of the given extension.
10621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  Extension::State GetExtensionState(const std::string& extension_id) const;
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called to change the extension's state when it is enabled/disabled.
109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void SetExtensionState(const Extension* extension, Extension::State);
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns all installed extensions
11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void GetExtensions(ExtensionIdSet* out);
11321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
114201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Getter and setter for browser action visibility.
115201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool GetBrowserActionVisibility(const Extension* extension);
116201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void SetBrowserActionVisibility(const Extension* extension, bool visible);
117201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Did the extension ask to escalate its permission during an upgrade?
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool DidExtensionEscalatePermissions(const std::string& id);
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If |did_escalate| is true, the preferences for |extension| will be set to
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // require the install warning when the user tries to enable.
123513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void SetDidExtensionEscalatePermissions(const Extension* extension,
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          bool did_escalate);
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the version string for the currently installed extension, or
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the empty string if not found.
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string GetVersionString(const std::string& extension_id);
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Re-writes the extension manifest into the prefs.
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called to change the extension's manifest when it's re-localized.
132513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void UpdateManifest(const Extension* extension);
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns extension path based on extension ID, or empty FilePath on error.
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath GetExtensionPath(const std::string& extension_id);
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns base extensions install directory.
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath& install_directory() const { return install_directory_; }
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Updates the prefs based on the blacklist.
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateBlacklist(const std::set<std::string>& blacklist_set);
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Based on extension id, checks prefs to see if it is blacklisted.
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsExtensionBlacklisted(const std::string& id);
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Is the extension with |extension_id| allowed by policy (checking both
1473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // whitelist and blacklist).
1483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool IsExtensionAllowedByPolicy(const std::string& extension_id);
1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the last value set via SetLastPingDay. If there isn't such a
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // pref, the returned Time will return true for is_null().
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time LastPingDay(const std::string& extension_id) const;
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The time stored is based on the server's perspective of day start time, not
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the client's.
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetLastPingDay(const std::string& extension_id, const base::Time& time);
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Similar to the 2 above, but for the extensions blacklist.
159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::Time BlacklistLastPingDay() const;
160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SetBlacklistLastPingDay(const base::Time& time);
161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
162ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Similar to LastPingDay/SetLastPingDay, but for sending "days since active"
163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // ping.
164ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::Time LastActivePingDay(const std::string& extension_id);
165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetLastActivePingDay(const std::string& extension_id,
166ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                            const base::Time& time);
167ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
168ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // A bit we use for determining if we should send the "days since active"
169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // ping. A value of true means the item has been active (launched) since the
170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // last update check.
171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool GetActiveBit(const std::string& extension_id);
172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetActiveBit(const std::string& extension_id, bool active);
173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
174201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Gets the permissions (|api_permissions|, |host_extent| and |full_access|)
175201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // granted to the extension with |extension_id|. |full_access| will be true
176201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // if the extension has all effective permissions (like from an NPAPI plugin).
177201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Returns false if the granted permissions haven't been initialized yet.
178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // TODO(jstritar): Refactor the permissions into a class that encapsulates
179201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // all granted permissions, can be initialized from preferences or
180201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // a manifest file, and can be compared to each other.
181201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool GetGrantedPermissions(const std::string& extension_id,
182201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             bool* full_access,
183201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             std::set<std::string>* api_permissions,
184201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             ExtensionExtent* host_extent);
185201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
186201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Adds the specified |api_permissions|, |host_extent| and |full_access|
187201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // to the granted permissions for extension with |extension_id|.
188201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // |full_access| should be set to true if the extension effectively has all
189201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // permissions (such as by having an NPAPI plugin).
190201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void AddGrantedPermissions(const std::string& extension_id,
191201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             const bool full_access,
192201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             const std::set<std::string>& api_permissions,
193201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             const ExtensionExtent& host_extent);
194201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the user enabled this extension to be loaded in incognito
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // mode.
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsIncognitoEnabled(const std::string& extension_id);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetIsIncognitoEnabled(const std::string& extension_id, bool enabled);
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the user has chosen to allow this extension to inject
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // scripts into pages with file URLs.
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool AllowFileAccess(const std::string& extension_id);
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetAllowFileAccess(const std::string& extension_id, bool allow);
204ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool HasAllowFileAccessSetting(const std::string& extension_id) const;
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
206201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Get the launch type preference.  If no preference is set, return
207201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // |default_pref_value|.
208201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LaunchType GetLaunchType(const std::string& extension_id,
209201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                           LaunchType default_pref_value);
210201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SetLaunchType(const std::string& extension_id, LaunchType launch_type);
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
213201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Find the right launch container based on the launch type.
214201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // If |extension|'s prefs do not have a launch type set, then
215201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // use |default_pref_value|.
216201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  extension_misc::LaunchContainer GetLaunchContainer(
217201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      const Extension* extension,
218201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LaunchType default_pref_value);
219201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
220201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Saves ExtensionInfo for each installed extension with the path to the
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // version directory and the location. Blacklisted extensions won't be saved
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and neither will external extensions the user has explicitly uninstalled.
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Caller takes ownership of returned structure.
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionsInfo* GetInstalledExtensionsInfo();
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the ExtensionInfo from the prefs for the given extension. If the
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // extension is not present, NULL is returned.
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionInfo* GetInstalledExtensionInfo(const std::string& extension_id);
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We've downloaded an updated .crx file for the extension, but are waiting
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // for idle time to install it.
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetIdleInstallInfo(const std::string& extension_id,
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          const FilePath& crx_path,
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          const std::string& version,
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          const base::Time& fetch_time);
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes any idle install information we have for the given |extension_id|.
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if there was info to remove; false otherwise.
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool RemoveIdleInstallInfo(const std::string& extension_id);
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If we have idle install information for |extension_id|, this puts it into
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the out parameters and returns true. Otherwise returns false.
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool GetIdleInstallInfo(const std::string& extension_id,
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          FilePath* crx_path,
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          std::string* version,
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          base::Time* fetch_time);
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the extension id's that have idle install information.
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::set<std::string> GetIdleInstallInfoIds();
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // We allow the web store to set a string containing login information when a
2533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // purchase is made, so that when a user logs into sync with a different
2543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // account we can recognize the situation. The Get function returns true if
2553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // there was previously stored data (placing it in |result|), or false
2563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // otherwise. The Set will overwrite any previous login.
2573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool GetWebStoreLogin(std::string* result);
2583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SetWebStoreLogin(const std::string& login);
2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Get the application launch index for an extension with |extension_id|. This
261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // determines the order of which the applications appear on the New Tab Page.
262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // A value of 0 generally indicates top left. If the extension has no launch
263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // index a -1 value is returned.
264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int GetAppLaunchIndex(const std::string& extension_id);
265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Sets a specific launch index for an extension with |extension_id|.
267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void SetAppLaunchIndex(const std::string& extension_id, int index);
268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Gets the next available application launch index. This is 1 higher than the
270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // highest current application launch index found.
271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int GetNextAppLaunchIndex();
272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
27372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Sets the order the apps should be displayed in the app launcher.
27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void SetAppLauncherOrder(const std::vector<std::string>& extension_ids);
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
276dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Get the application page index for an extension with |extension_id|.  This
277dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // determines which page an app will appear on in page-based NTPs.  If
278dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // the app has no page specified, -1 is returned.
279dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  int GetPageIndex(const std::string& extension_id);
280dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
281dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Sets a specific page index for an extension with |extension_id|.
282dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SetPageIndex(const std::string& extension_id, int index);
283dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
284dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Returns true if the user repositioned the app on the app launcher via drag
285dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // and drop.
286dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool WasAppDraggedByUser(const std::string& extension_id);
287dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
288dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Sets a flag indicating that the user repositioned the app on the app
289dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // launcher by drag and dropping it.
290dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  void SetAppDraggedByUser(const std::string& extension_id);
291dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
2924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The extension's update URL data.  If not empty, the ExtensionUpdater
2934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // will append a ap= parameter to the URL when checking if a new version
2944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // of the extension is available.
2954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void SetUpdateUrlData(const std::string& extension_id,
2964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        const std::string& data);
2974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string GetUpdateUrlData(const std::string& extension_id);
2984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
29921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Sets a preference value that is controlled by the extension. In other
30021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // words, this is not a pref value *about* the extension but something
30121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // global the extension wants to override.
302dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Takes ownership of |value|.
30321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void SetExtensionControlledPref(const std::string& extension_id,
30421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                  const std::string& pref_key,
30572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                  bool incognito,
30621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen                                  Value* value);
30721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
30872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void RemoveExtensionControlledPref(const std::string& extension_id,
30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     const std::string& pref_key,
31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                     bool incognito);
31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
312dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Returns true if currently no extension with higher precedence controls the
313dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // preference.
314dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool CanExtensionControlPref(const std::string& extension_id,
315dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                               const std::string& pref_key,
316dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                               bool incognito);
317dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
318dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Returns true if extension |extension_id| currently controls the
319dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // preference.
320dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  bool DoesExtensionControlPref(const std::string& extension_id,
321dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                const std::string& pref_key,
322dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen                                bool incognito);
323dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
324ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns true if there is an extension which controls the preference value
325ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  //  for |pref_key| *and* it is specific to incognito mode.
326ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool HasIncognitoPrefValue(const std::string& pref_key);
327ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void RegisterUserPrefs(PrefService* prefs);
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The underlying PrefService.
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrefService* pref_service() const { return prefs_; }
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
33321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen protected:
33421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // For unit testing. Enables injecting an artificial clock that is used
33521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // to query the current time, when an extension is installed.
33621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  virtual base::Time GetCurrentTime() const;
33721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Converts absolute paths in the pref to paths relative to the
340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // install_directory_.
341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void MakePathsRelative();
342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Converts internal relative paths to be absolute. Used for export to
344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // consumers who expect full paths.
345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void MakePathsAbsolute(DictionaryValue* dict);
346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the pref |key| for extension |id| to |value|.
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateExtensionPref(const std::string& id,
3493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                           const std::string& key,
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           Value* value);
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Deletes the pref dictionary for extension |id|.
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DeleteExtensionPrefs(const std::string& id);
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reads a boolean pref from |ext| with key |pref_key|.
356201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Return false if the value is false or |pref_key| does not exist.
357ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool ReadBooleanFromPref(const DictionaryValue* ext,
358ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           const std::string& pref_key);
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reads a boolean pref |pref_key| from extension with id |extension_id|.
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ReadExtensionPrefBoolean(const std::string& extension_id,
3623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                const std::string& pref_key);
3633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Reads an integer pref from |ext| with key |pref_key|.
3653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Return false if the value does not exist.
366ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool ReadIntegerFromPref(const DictionaryValue* ext,
367ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                           const std::string& pref_key,
3683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                           int* out_value);
3693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Reads an integer pref |pref_key| from extension with id |extension_id|.
3713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool ReadExtensionPrefInteger(const std::string& extension_id,
3723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                const std::string& pref_key,
3733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                int* out_value);
374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
375201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Reads a list pref |pref_key| from extension with id | extension_id|.
376201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool ReadExtensionPrefList(const std::string& extension_id,
377201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             const std::string& pref_key,
378ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                             const ListValue** out_value);
379201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
380201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Reads a list pref |pref_key| as a string set from the extension with
381201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // id |extension_id|.
382201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool ReadExtensionPrefStringSet(const std::string& extension_id,
383201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  const std::string& pref_key,
384201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  std::set<std::string>* result);
385201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
386201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Adds the |added_values| to the value of |pref_key| for the extension
387201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // with id |extension_id| (the new value will be the union of the existing
388201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // value and |added_values|).
389201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void AddToExtensionPrefStringSet(const std::string& extension_id,
390201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                   const std::string& pref_key,
391201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                   const std::set<std::string>& added_values);
392201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
393ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Returns a dictionary for extension |id|'s prefs or NULL if it doesn't
394ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // exist.
395ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const DictionaryValue* GetExtensionPref(const std::string& id) const;
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Returns the dictionary of preferences controlled by the specified extension
39872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // or creates a new one. All entries in the dictionary contain non-expanded
39921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // paths.
400ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const DictionaryValue* GetExtensionControlledPrefs(
401ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      const std::string& id) const;
40221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
4033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Serializes the data and schedules a persistent save via the |PrefService|.
4043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Additionally fires a PREF_CHANGED notification with the top-level
4053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // |kExtensionsPref| path set.
4063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(andybons): Switch this to EXTENSION_PREF_CHANGED to be more granular.
407dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // TODO(andybons): Use a ScopedUserPrefUpdate to update observers on changes
408dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // to the mutable extension dictionary.
409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SavePrefs();
4103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Checks if kPrefBlacklist is set to true in the DictionaryValue.
412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return false if the value is false or kPrefBlacklist does not exist.
413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is used to decide if an extension is blacklisted.
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsBlacklistBitSet(DictionaryValue* ext);
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
41621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Helper method to acquire the installation time of an extension.
41772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Returns base::Time() if the installation time could not be parsed or
41872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // found.
41921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  base::Time GetInstallTime(const std::string& extension_id) const;
42021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
42121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Fix missing preference entries in the extensions that are were introduced
42221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // in a later Chrome version.
42321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void FixMissingPrefs(const ExtensionIdSet& extension_ids);
42421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
42521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // Installs the persistent extension preferences into |prefs_|'s extension
42621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  // pref store.
42721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen  void InitPrefStore();
42821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
42972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The pref service specific to this set of extension prefs. Owned by profile.
430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrefService* prefs_;
431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Base extensions install directory.
433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath install_directory_;
434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
43572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Weak pointer, owned by Profile.
43672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ExtensionPrefValueMap* extension_pref_value_map_;
43721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The URLs of all of the toolstrips.
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLList shelf_order_;
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionPrefs);
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_PREFS_H_
445