147 lines
4.3 KiB
JavaScript
147 lines
4.3 KiB
JavaScript
/* 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 || {};
|
|
};
|