Fx60: Read in default preferences for extensions
Default prefs are no longer read automatically, so we need to do it manually. Preferences may not be read before extensions load, so they should wait for Zotero.Schema.schemaUpdatePromise or Zotero.uiReadyPromise before initializing.
This commit is contained in:
parent
7bcec02326
commit
82ce5d9742
2 changed files with 121 additions and 7 deletions
|
@ -24,7 +24,6 @@
|
||||||
*/
|
*/
|
||||||
Zotero.Prefs = new function(){
|
Zotero.Prefs = new function(){
|
||||||
// Privileged methods
|
// Privileged methods
|
||||||
this.init = init;
|
|
||||||
this.get = get;
|
this.get = get;
|
||||||
this.set = set;
|
this.set = set;
|
||||||
|
|
||||||
|
@ -35,9 +34,11 @@ Zotero.Prefs = new function(){
|
||||||
// Public properties
|
// Public properties
|
||||||
this.prefBranch;
|
this.prefBranch;
|
||||||
|
|
||||||
function init(){
|
this.init = async function init() {
|
||||||
this.prefBranch = Services.prefs.getBranch(ZOTERO_CONFIG.PREF_BRANCH);
|
this.prefBranch = Services.prefs.getBranch(ZOTERO_CONFIG.PREF_BRANCH);
|
||||||
|
|
||||||
|
await loadExtensionDefaults();
|
||||||
|
|
||||||
// Register observer to handle pref changes
|
// Register observer to handle pref changes
|
||||||
this.register();
|
this.register();
|
||||||
|
|
||||||
|
@ -94,18 +95,28 @@ Zotero.Prefs = new function(){
|
||||||
var branch = this.prefBranch;
|
var branch = this.prefBranch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let value;
|
||||||
switch (branch.getPrefType(pref)){
|
switch (branch.getPrefType(pref)){
|
||||||
case branch.PREF_BOOL:
|
case branch.PREF_BOOL:
|
||||||
return branch.getBoolPref(pref);
|
value = branch.getBoolPref(pref);
|
||||||
|
break;
|
||||||
|
|
||||||
case branch.PREF_STRING:
|
case branch.PREF_STRING:
|
||||||
// Pre-Fx59
|
// Pre-Fx59
|
||||||
if (!branch.getStringPref) {
|
if (!branch.getStringPref) {
|
||||||
return '' + branch.getComplexValue(pref, Components.interfaces.nsISupportsString);
|
value = '' + branch.getComplexValue(pref, Components.interfaces.nsISupportsString);
|
||||||
}
|
}
|
||||||
return branch.getStringPref(pref);
|
else {
|
||||||
|
value = branch.getStringPref(pref);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case branch.PREF_INT:
|
case branch.PREF_INT:
|
||||||
return branch.getIntPref(pref);
|
value = branch.getIntPref(pref);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return value;
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
// If debug system isn't yet initialized, log proper error
|
// If debug system isn't yet initialized, log proper error
|
||||||
|
@ -333,4 +344,107 @@ Zotero.Prefs = new function(){
|
||||||
}
|
}
|
||||||
obs.splice(i, 1);
|
obs.splice(i, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Firefox 60 no longer loads default preferences for extensions, so do it manually
|
||||||
|
*/
|
||||||
|
async function loadExtensionDefaults() {
|
||||||
|
var defaultBranch = Services.prefs.getDefaultBranch("");
|
||||||
|
|
||||||
|
return new Zotero.Promise(function (resolve) {
|
||||||
|
Cu.import("resource://gre/modules/AddonManager.jsm");
|
||||||
|
|
||||||
|
// Lines are in format `pref("[key]", [val]);`, so define a function to be called that
|
||||||
|
// sets the defaults
|
||||||
|
function pref(key, value) {
|
||||||
|
switch (typeof value) {
|
||||||
|
case "boolean":
|
||||||
|
defaultBranch.setBoolPref(key, value);
|
||||||
|
break;
|
||||||
|
case "number":
|
||||||
|
defaultBranch.setIntPref(key, value);
|
||||||
|
break;
|
||||||
|
case "string":
|
||||||
|
defaultBranch.setStringPref(key, value);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function readDefaults(contents) {
|
||||||
|
let re = /^\s*pref\s*\(\s*['"]([a-zA-Z0-9_\-.]+)['"]\s*,\s*([^\s\)]+)\s*\)\s*;\s*$/;
|
||||||
|
let lines = contents.split(/\n/g).filter(line => re.test(line));
|
||||||
|
for (let line of lines) {
|
||||||
|
try {
|
||||||
|
eval(line);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
Zotero.logError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
AddonManager.getAllAddons(async function(addons) {
|
||||||
|
var reusableStreamInstance = Cc['@mozilla.org/scriptableinputstream;1']
|
||||||
|
.createInstance(Ci.nsIScriptableInputStream);
|
||||||
|
|
||||||
|
for (let addon of addons) {
|
||||||
|
if (!addon.isActive) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
let path = OS.Path.fromFileURI(addon.getResourceURI().spec);
|
||||||
|
|
||||||
|
// Directory
|
||||||
|
if ((await OS.File.stat(path)).isDir) {
|
||||||
|
let dir = OS.Path.join(path, 'defaults', 'preferences');
|
||||||
|
if (await OS.File.exists(dir)) {
|
||||||
|
await Zotero.File.iterateDirectory(dir, async function (entry) {
|
||||||
|
if (!entry.name.endsWith('.js')) return;
|
||||||
|
readDefaults(Zotero.File.getContents(entry.path));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// XPI
|
||||||
|
else {
|
||||||
|
let file = Zotero.File.pathToFile(path);
|
||||||
|
let zipReader = Components.classes["@mozilla.org/libjar/zip-reader;1"].
|
||||||
|
createInstance(Components.interfaces.nsIZipReader);
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
zipReader.open(file);
|
||||||
|
zipReader.test(null);
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
Zotero.logError(path + " is not a valid ZIP file");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let entries = zipReader.findEntries('defaults/preferences/*.js');
|
||||||
|
while (entries.hasMore()) {
|
||||||
|
let entryName = entries.getNext();
|
||||||
|
let entry = zipReader.getEntry(entryName);
|
||||||
|
|
||||||
|
if (!entry.isDirectory) {
|
||||||
|
let inputStream = zipReader.getInputStream(entryName);
|
||||||
|
reusableStreamInstance.init(inputStream);
|
||||||
|
readDefaults(reusableStreamInstance.read(entry.realSize));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
zipReader.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
Zotero.logError(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -241,7 +241,7 @@ Services.scriptloader.loadSubScript("resource://zotero/polyfill.js");
|
||||||
|
|
||||||
Zotero.Intl.init();
|
Zotero.Intl.init();
|
||||||
|
|
||||||
Zotero.Prefs.init();
|
yield Zotero.Prefs.init();
|
||||||
Zotero.Debug.init(options && options.forceDebugLog);
|
Zotero.Debug.init(options && options.forceDebugLog);
|
||||||
|
|
||||||
// Make sure that Zotero Standalone is not running as root
|
// Make sure that Zotero Standalone is not running as root
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue