summaryrefslogtreecommitdiffstats
path: root/devtools/server/actors/settings.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/server/actors/settings.js')
-rw-r--r--devtools/server/actors/settings.js146
1 files changed, 146 insertions, 0 deletions
diff --git a/devtools/server/actors/settings.js b/devtools/server/actors/settings.js
new file mode 100644
index 000000000..179c82aa5
--- /dev/null
+++ b/devtools/server/actors/settings.js
@@ -0,0 +1,146 @@
+/* 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/. */
+
+"use strict";
+
+const {Cc, Ci} = require("chrome");
+const protocol = require("devtools/shared/protocol");
+const {DebuggerServer} = require("devtools/server/main");
+const promise = require("promise");
+const Services = require("Services");
+const { settingsSpec } = require("devtools/shared/specs/settings");
+const { FileUtils} = require("resource://gre/modules/FileUtils.jsm");
+const { NetUtil} = require("resource://gre/modules/NetUtil.jsm");
+
+var defaultSettings = {};
+var settingsFile;
+
+exports.register = function (handle) {
+ handle.addGlobalActor(SettingsActor, "settingsActor");
+};
+
+exports.unregister = function (handle) {
+};
+
+function getDefaultSettings() {
+ let chan = NetUtil.newChannel({
+ uri: NetUtil.newURI(settingsFile),
+ loadUsingSystemPrincipal: true});
+ let stream = chan.open2();
+ // Obtain a converter to read from a UTF-8 encoded input stream.
+ let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"]
+ .createInstance(Ci.nsIScriptableUnicodeConverter);
+ converter.charset = "UTF-8";
+ let rawstr = converter.ConvertToUnicode(NetUtil.readInputStreamToString(
+ stream,
+ stream.available()) || "");
+
+ try {
+ defaultSettings = JSON.parse(rawstr);
+ } catch (e) { }
+ stream.close();
+}
+
+function loadSettingsFile() {
+ // Loading resource://app/defaults/settings.json doesn't work because
+ // settings.json is not in the omnijar.
+ // So we look for the app dir instead and go from here...
+ if (settingsFile) {
+ return;
+ }
+ settingsFile = FileUtils.getFile("DefRt", ["settings.json"], false);
+ if (!settingsFile || (settingsFile && !settingsFile.exists())) {
+ // On b2g desktop builds the settings.json file is moved in the
+ // profile directory by the build system.
+ settingsFile = FileUtils.getFile("ProfD", ["settings.json"], false);
+ if (!settingsFile || (settingsFile && !settingsFile.exists())) {
+ console.log("settings.json file does not exist");
+ }
+ }
+
+ if (settingsFile.exists()) {
+ getDefaultSettings();
+ }
+}
+
+var SettingsActor = exports.SettingsActor = protocol.ActorClassWithSpec(settingsSpec, {
+ _getSettingsService: function () {
+ let win = Services.wm.getMostRecentWindow(DebuggerServer.chromeWindowType);
+ return win.navigator.mozSettings;
+ },
+
+ getSetting: function (name) {
+ let deferred = promise.defer();
+ let lock = this._getSettingsService().createLock();
+ let req = lock.get(name);
+ req.onsuccess = function () {
+ deferred.resolve(req.result[name]);
+ };
+ req.onerror = function () {
+ deferred.reject(req.error);
+ };
+ return deferred.promise;
+ },
+
+ setSetting: function (name, value) {
+ let deferred = promise.defer();
+ let data = {};
+ data[name] = value;
+ let lock = this._getSettingsService().createLock();
+ let req = lock.set(data);
+ req.onsuccess = function () {
+ deferred.resolve(true);
+ };
+ req.onerror = function () {
+ deferred.reject(req.error);
+ };
+ return deferred.promise;
+ },
+
+ _hasUserSetting: function (name, value) {
+ if (typeof value === "object") {
+ return JSON.stringify(defaultSettings[name]) !== JSON.stringify(value);
+ }
+ return (defaultSettings[name] !== value);
+ },
+
+ getAllSettings: function () {
+ loadSettingsFile();
+ let settings = {};
+ let self = this;
+
+ let deferred = promise.defer();
+ let lock = this._getSettingsService().createLock();
+ let req = lock.get("*");
+
+ req.onsuccess = function () {
+ for (var name in req.result) {
+ settings[name] = {
+ value: req.result[name],
+ hasUserValue: self._hasUserSetting(name, req.result[name])
+ };
+ }
+ deferred.resolve(settings);
+ };
+ req.onfailure = function () {
+ deferred.reject(req.error);
+ };
+
+ return deferred.promise;
+ },
+
+ clearUserSetting: function (name) {
+ loadSettingsFile();
+ try {
+ this.setSetting(name, defaultSettings[name]);
+ } catch (e) {
+ console.log(e);
+ }
+ }
+});
+
+// For tests
+exports._setDefaultSettings = function (settings) {
+ defaultSettings = settings || {};
+};