summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_pref_store.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/extension_pref_store.h')
-rw-r--r--chrome/browser/extensions/extension_pref_store.h90
1 files changed, 90 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_pref_store.h b/chrome/browser/extensions/extension_pref_store.h
new file mode 100644
index 0000000..fc10b5b
--- /dev/null
+++ b/chrome/browser/extensions/extension_pref_store.h
@@ -0,0 +1,90 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_PREF_STORE_H_
+#define CHROME_BROWSER_EXTENSIONS_EXTENSION_PREF_STORE_H_
+
+#include <list>
+#include <map>
+#include <string>
+#include <vector>
+
+#include "base/basictypes.h"
+#include "base/scoped_ptr.h"
+#include "chrome/common/pref_store.h"
+
+class DictionaryValue;
+class PrefService;
+class Value;
+
+// This PrefStore keeps track of preferences set by extensions: for example,
+// proxy settings. A stack of relevant extension IDs is stored in order of
+// their addition to this PrefStore. For each preference, the last-added
+// enabled extension that tries to set it overrules any others.
+class ExtensionPrefStore : public PrefStore {
+ public:
+ explicit ExtensionPrefStore(PrefService* pref_service);
+ virtual ~ExtensionPrefStore();
+
+ // The PrefService creates the ExtensionPrefStore, so we need to be able to
+ // defer setting the PrefService here until after construction.
+ void SetPrefService(PrefService* pref_service) {
+ pref_service_ = pref_service;
+ }
+
+ // Begins tracking the preference and value an extension wishes to set. This
+ // must be called each time an extension API tries to set a preference.
+ virtual void InstallExtensionPref(std::string extension_id,
+ const wchar_t* pref_path,
+ Value* pref_value);
+
+ // Removes an extension and all its preference settings from this PrefStore.
+ // This must be called when an extension is uninstalled or disabled.
+ virtual void UninstallExtension(std::string extension_id);
+
+ // PrefStore methods:
+ virtual DictionaryValue* prefs() { return prefs_.get(); }
+
+ virtual PrefReadError ReadPrefs() { return PREF_READ_ERROR_NONE; }
+
+ protected:
+ // Returns a vector of the extension IDs in the extension_stack_.
+ // This should only be accessed by subclasses for unit-testing.
+ void GetExtensionIDs(std::vector<std::string>* result);
+
+ private:
+ // The pref service referring to this pref store. Weak reference.
+ PrefService* pref_service_;
+
+ // Maps preference paths to their values.
+ typedef std::map<const wchar_t*, Value*> PrefValueMap;
+
+ // Applies the highest-priority extension's setting for the given preference
+ // path, or clears the setting in this PrefStore if no extensions wish to
+ // control it.
+ void UpdateOnePref(const wchar_t* path);
+
+ // Updates each preference in the |pref_values| list.
+ void UpdatePrefs(const PrefValueMap* pref_values);
+
+ // A cache of the highest-priority values for each preference that any
+ // extension is controlling, for quick read access. Owns the stored values.
+ scoped_ptr<DictionaryValue> prefs_;
+
+ // Associates an extension ID with the prefs it sets.
+ struct ExtensionPrefs {
+ std::string extension_id;
+ PrefValueMap* pref_values;
+ };
+
+ // A pseudo-stack of extensions and their preferences. Extensions are always
+ // added to the head, but may be removed from the middle. This stack owns
+ // the values in the extensions' PrefValueMaps.
+ typedef std::list<ExtensionPrefs*> ExtensionStack;
+ ExtensionStack extension_stack_;
+
+ DISALLOW_COPY_AND_ASSIGN(ExtensionPrefStore);
+};
+
+#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_PREF_STORE_H_