extension_prefs.h revision 201ade2fbba22bfb27ae029f4d23fca6ded109a0
1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 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
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/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
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Class for managing global and per-extension preferences.
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This class is instantiated by ExtensionsService, so it should be accessed
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// from there.
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionPrefs {
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Key name for a preference that keeps track of per-extension settings. This
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // is a dictionary object read from the Preferences file, keyed off of
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // extension ids.
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static const char kExtensionsPref[];
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::vector<linked_ptr<ExtensionInfo> > ExtensionsInfo;
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // This enum is used for the launch type the user wants to use for an
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // application.
33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Do not remove items or re-order this enum as it is used in preferences
34731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // and histograms.
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  enum LaunchType {
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LAUNCH_PINNED,
373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    LAUNCH_REGULAR,
38201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LAUNCH_FULLSCREEN,
39201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch    LAUNCH_WINDOW
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  };
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit ExtensionPrefs(PrefService* prefs, const FilePath& root_dir_);
43731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  ~ExtensionPrefs();
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a copy of the Extensions prefs.
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(erikkay) Remove this so that external consumers don't need to be
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // aware of the internal structure of the preferences.
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue* CopyCurrentExtensions();
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Populate |killed_ids| with extension ids that have been killed.
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void GetKilledExtensionIds(std::set<std::string>* killed_ids);
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get the order that toolstrip URLs appear in the shelf.
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::vector<GURL> URLList;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLList GetShelfToolstripOrder();
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the order that toolstrip URLs appear in the shelf.
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetShelfToolstripOrder(const URLList& urls);
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Get the order that the browser actions appear in the toolbar.
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<std::string> GetToolbarOrder();
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set the order that the browser actions appear in the toolbar.
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetToolbarOrder(const std::vector<std::string>& extension_ids);
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when an extension is installed, so that prefs get created.
67513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void OnExtensionInstalled(const Extension* extension,
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            Extension::State initial_state,
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                            bool initial_incognito_enabled);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when an extension is uninstalled, so that prefs get cleaned up.
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void OnExtensionUninstalled(const std::string& extension_id,
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              const Extension::Location& location,
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              bool external_uninstall);
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the state (enabled/disabled) of the given extension.
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Extension::State GetExtensionState(const std::string& extension_id);
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called to change the extension's state when it is enabled/disabled.
80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void SetExtensionState(const Extension* extension, Extension::State);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
82201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Getter and setter for browser action visibility.
83201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool GetBrowserActionVisibility(const Extension* extension);
84201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void SetBrowserActionVisibility(const Extension* extension, bool visible);
85201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Did the extension ask to escalate its permission during an upgrade?
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool DidExtensionEscalatePermissions(const std::string& id);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If |did_escalate| is true, the preferences for |extension| will be set to
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // require the install warning when the user tries to enable.
91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void SetDidExtensionEscalatePermissions(const Extension* extension,
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                          bool did_escalate);
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the version string for the currently installed extension, or
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the empty string if not found.
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string GetVersionString(const std::string& extension_id);
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Re-writes the extension manifest into the prefs.
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called to change the extension's manifest when it's re-localized.
100513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void UpdateManifest(const Extension* extension);
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns extension path based on extension ID, or empty FilePath on error.
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath GetExtensionPath(const std::string& extension_id);
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns base extensions install directory.
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const FilePath& install_directory() const { return install_directory_; }
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Updates the prefs based on the blacklist.
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateBlacklist(const std::set<std::string>& blacklist_set);
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Based on extension id, checks prefs to see if it is blacklisted.
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsExtensionBlacklisted(const std::string& id);
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Is the extension with |extension_id| allowed by policy (checking both
1153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // whitelist and blacklist).
1163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool IsExtensionAllowedByPolicy(const std::string& extension_id);
1173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the last value set via SetLastPingDay. If there isn't such a
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // pref, the returned Time will return true for is_null().
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time LastPingDay(const std::string& extension_id) const;
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The time stored is based on the server's perspective of day start time, not
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the client's.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetLastPingDay(const std::string& extension_id, const base::Time& time);
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
126201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Gets the permissions (|api_permissions|, |host_extent| and |full_access|)
127201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // granted to the extension with |extension_id|. |full_access| will be true
128201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // if the extension has all effective permissions (like from an NPAPI plugin).
129201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Returns false if the granted permissions haven't been initialized yet.
130201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // TODO(jstritar): Refractor the permissions into a class that encapsulates
131201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // all granted permissions, can be initialized from preferences or
132201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // a manifest file, and can be compared to each other.
133201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool GetGrantedPermissions(const std::string& extension_id,
134201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             bool* full_access,
135201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             std::set<std::string>* api_permissions,
136201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             ExtensionExtent* host_extent);
137201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
138201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Adds the specified |api_permissions|, |host_extent| and |full_access|
139201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // to the granted permissions for extension with |extension_id|.
140201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // |full_access| should be set to true if the extension effectively has all
141201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // permissions (such as by having an NPAPI plugin).
142201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void AddGrantedPermissions(const std::string& extension_id,
143201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             const bool full_access,
144201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             const std::set<std::string>& api_permissions,
145201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             const ExtensionExtent& host_extent);
146201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Similar to the 2 above, but for the extensions blacklist.
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time BlacklistLastPingDay() const;
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetBlacklistLastPingDay(const base::Time& time);
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the user enabled this extension to be loaded in incognito
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // mode.
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsIncognitoEnabled(const std::string& extension_id);
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetIsIncognitoEnabled(const std::string& extension_id, bool enabled);
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the user has chosen to allow this extension to inject
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // scripts into pages with file URLs.
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool AllowFileAccess(const std::string& extension_id);
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetAllowFileAccess(const std::string& extension_id, bool allow);
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
161201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Get the launch type preference.  If no preference is set, return
162201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // |default_pref_value|.
163201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  LaunchType GetLaunchType(const std::string& extension_id,
164201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                           LaunchType default_pref_value);
165201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
1663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SetLaunchType(const std::string& extension_id, LaunchType launch_type);
1673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
168201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Find the right launch container based on the launch type.
169201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // If |extension|'s prefs do not have a launch type set, then
170201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // use |default_pref_value|.
171201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  extension_misc::LaunchContainer GetLaunchContainer(
172201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      const Extension* extension,
173201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch      LaunchType default_pref_value);
174201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
175201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Saves ExtensionInfo for each installed extension with the path to the
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // version directory and the location. Blacklisted extensions won't be saved
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // and neither will external extensions the user has explicitly uninstalled.
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Caller takes ownership of returned structure.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionsInfo* GetInstalledExtensionsInfo();
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the ExtensionInfo from the prefs for the given extension. If the
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // extension is not present, NULL is returned.
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionInfo* GetInstalledExtensionInfo(const std::string& extension_id);
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We've downloaded an updated .crx file for the extension, but are waiting
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // for idle time to install it.
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetIdleInstallInfo(const std::string& extension_id,
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          const FilePath& crx_path,
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          const std::string& version,
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          const base::Time& fetch_time);
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Removes any idle install information we have for the given |extension_id|.
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if there was info to remove; false otherwise.
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool RemoveIdleInstallInfo(const std::string& extension_id);
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If we have idle install information for |extension_id|, this puts it into
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the out parameters and returns true. Otherwise returns false.
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool GetIdleInstallInfo(const std::string& extension_id,
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          FilePath* crx_path,
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          std::string* version,
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          base::Time* fetch_time);
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the extension id's that have idle install information.
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::set<std::string> GetIdleInstallInfoIds();
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // We allow the web store to set a string containing login information when a
2083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // purchase is made, so that when a user logs into sync with a different
2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // account we can recognize the situation. The Get function returns true if
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // there was previously stored data (placing it in |result|), or false
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // otherwise. The Set will overwrite any previous login.
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool GetWebStoreLogin(std::string* result);
2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SetWebStoreLogin(const std::string& login);
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
215731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Get the application launch index for an extension with |extension_id|. This
216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // determines the order of which the applications appear on the New Tab Page.
217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // A value of 0 generally indicates top left. If the extension has no launch
218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // index a -1 value is returned.
219731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int GetAppLaunchIndex(const std::string& extension_id);
220731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
221731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Sets a specific launch index for an extension with |extension_id|.
222731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void SetAppLaunchIndex(const std::string& extension_id, int index);
223731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
224731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Gets the next available application launch index. This is 1 higher than the
225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // highest current application launch index found.
226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  int GetNextAppLaunchIndex();
227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
2284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // The extension's update URL data.  If not empty, the ExtensionUpdater
2294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // will append a ap= parameter to the URL when checking if a new version
2304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  // of the extension is available.
2314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  void SetUpdateUrlData(const std::string& extension_id,
2324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch                        const std::string& data);
2334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch  std::string GetUpdateUrlData(const std::string& extension_id);
2344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void RegisterUserPrefs(PrefService* prefs);
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The underlying PrefService.
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrefService* pref_service() const { return prefs_; }
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Converts absolute paths in the pref to paths relative to the
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // install_directory_.
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void MakePathsRelative();
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Converts internal relative paths to be absolute. Used for export to
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // consumers who expect full paths.
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void MakePathsAbsolute(DictionaryValue* dict);
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Sets the pref |key| for extension |id| to |value|.
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UpdateExtensionPref(const std::string& id,
2513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                           const std::string& key,
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           Value* value);
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Deletes the pref dictionary for extension |id|.
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DeleteExtensionPrefs(const std::string& id);
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reads a boolean pref from |ext| with key |pref_key|.
258201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Return false if the value is false or |pref_key| does not exist.
2593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool ReadBooleanFromPref(DictionaryValue* ext, const std::string& pref_key);
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Reads a boolean pref |pref_key| from extension with id |extension_id|.
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ReadExtensionPrefBoolean(const std::string& extension_id,
2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                const std::string& pref_key);
2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Reads an integer pref from |ext| with key |pref_key|.
2663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Return false if the value does not exist.
2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool ReadIntegerFromPref(DictionaryValue* ext, const std::string& pref_key,
2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                           int* out_value);
2693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Reads an integer pref |pref_key| from extension with id |extension_id|.
2713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool ReadExtensionPrefInteger(const std::string& extension_id,
2723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                const std::string& pref_key,
2733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                                int* out_value);
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
275201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Reads a list pref |pref_key| from extension with id | extension_id|.
276201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool ReadExtensionPrefList(const std::string& extension_id,
277201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             const std::string& pref_key,
278201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                             ListValue** out_value);
279201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
280201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Reads a list pref |pref_key| as a string set from the extension with
281201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // id |extension_id|.
282201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool ReadExtensionPrefStringSet(const std::string& extension_id,
283201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  const std::string& pref_key,
284201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                  std::set<std::string>* result);
285201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
286201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Adds the |added_values| to the value of |pref_key| for the extension
287201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // with id |extension_id| (the new value will be the union of the existing
288201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // value and |added_values|).
289201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void AddToExtensionPrefStringSet(const std::string& extension_id,
290201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                   const std::string& pref_key,
291201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                                   const std::set<std::string>& added_values);
292201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ensures and returns a mutable dictionary for extension |id|'s prefs.
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue* GetOrCreateExtensionPref(const std::string& id);
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Same as above, but returns NULL if it doesn't exist.
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DictionaryValue* GetExtensionPref(const std::string& id) const;
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Serializes the data and schedules a persistent save via the |PrefService|.
3003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Additionally fires a PREF_CHANGED notification with the top-level
3013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // |kExtensionsPref| path set.
3023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(andybons): Switch this to EXTENSION_PREF_CHANGED to be more granular.
3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // TODO(andybons): Use a ScopedPrefUpdate to update observers on changes to
3043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // the mutable extension dictionary.
3053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void SavePrefsAndNotify();
3063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Checks if kPrefBlacklist is set to true in the DictionaryValue.
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Return false if the value is false or kPrefBlacklist does not exist.
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This is used to decide if an extension is blacklisted.
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsBlacklistBitSet(DictionaryValue* ext);
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Helper methods for the public last ping day functions.
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time LastPingDayImpl(const DictionaryValue* dictionary) const;
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetLastPingDayImpl(const base::Time& time, DictionaryValue* dictionary);
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The pref service specific to this set of extension prefs.
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  PrefService* prefs_;
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Base extensions install directory.
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath install_directory_;
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The URLs of all of the toolstrips.
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLList shelf_order_;
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(ExtensionPrefs);
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_PREFS_H_
329