aboutsummaryrefslogtreecommitdiff
path: root/tools/addon-sdk-1.7/packages/addon-kit/lib/simple-prefs.js
diff options
context:
space:
mode:
Diffstat (limited to 'tools/addon-sdk-1.7/packages/addon-kit/lib/simple-prefs.js')
-rw-r--r--tools/addon-sdk-1.7/packages/addon-kit/lib/simple-prefs.js68
1 files changed, 68 insertions, 0 deletions
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/lib/simple-prefs.js b/tools/addon-sdk-1.7/packages/addon-kit/lib/simple-prefs.js
new file mode 100644
index 0000000..5f73cc5
--- /dev/null
+++ b/tools/addon-sdk-1.7/packages/addon-kit/lib/simple-prefs.js
@@ -0,0 +1,68 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+const { Cc, Ci } = require("chrome");
+const { emit, off } = require("api-utils/event/core");
+const { EventTarget } = require("api-utils/event/target");
+const { when: unload } = require("api-utils/unload");
+const { jetpackID } = require("@packaging");
+const prefService = require("api-utils/preferences-service");
+const observers = require("api-utils/observer-service");
+
+const ADDON_BRANCH = "extensions." + jetpackID + ".";
+const BUTTON_PRESSED = jetpackID + "-cmdPressed";
+
+// XXX Currently, only Firefox implements the inline preferences.
+if (!require("xul-app").is("Firefox"))
+ throw Error("This API is only supported in Firefox");
+
+const branch = Cc["@mozilla.org/preferences-service;1"].
+ getService(Ci.nsIPrefService).
+ getBranch(ADDON_BRANCH).
+ QueryInterface(Ci.nsIPrefBranch2);
+
+// Listen to changes in the preferences
+function preferenceChange(subject, topic, name) {
+ if (topic === 'nsPref:changed')
+ emit(target, name, name);
+}
+branch.addObserver('', preferenceChange, false);
+
+// Listen to clicks on buttons
+function buttonClick(subject, data) {
+ emit(target, data);
+}
+observers.add(BUTTON_PRESSED, buttonClick);
+
+// Make sure we cleanup listeners on unload.
+unload(function() {
+ off(exports);
+ branch.removeObserver('', preferenceChange, false);
+ observers.remove(BUTTON_PRESSED, buttonClick);
+});
+
+const prefs = Proxy.create({
+ get: function(receiver, pref) {
+ return prefService.get(ADDON_BRANCH + pref);
+ },
+ set: function(receiver, pref, val) {
+ prefService.set(ADDON_BRANCH + pref, val);
+ },
+ delete: function(pref) {
+ prefService.reset(ADDON_BRANCH + pref);
+ return true;
+ },
+ has: function(pref) {
+ return prefService.has(ADDON_BRANCH + pref);
+ }
+});
+
+// Event target we will expose as module exports in order to be able to
+// emit events on it.
+const target = EventTarget.extend({ prefs: prefs }).new();
+module.exports = target;
+
+// This is workaround making sure that exports is wrapped before it's
+// frozen, which needs to happen in order to workaround Bug 673468.
+off(target, 'workaround-bug-673468');