From 4a861ef5ea87d94c8186a772e0c3bf185fc3a5bc Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Mon, 12 Aug 2013 03:06:54 -0400 Subject: [PATCH] Use promise to get addon version, and remove ZOTERO_CONFIG.VERSION (This patch is small without whitespace changes.) --- chrome/content/zotero/xpcom/zotero.js | 455 +++++++++++++------------- 1 file changed, 231 insertions(+), 224 deletions(-) diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index 5c1600b4c..9b0043808 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -38,8 +38,7 @@ const ZOTERO_CONFIG = { PREF_BRANCH: 'extensions.zotero.', BOOKMARKLET_ORIGIN : 'https://www.zotero.org', HTTP_BOOKMARKLET_ORIGIN : 'http://www.zotero.org', - BOOKMARKLET_URL: 'https://www.zotero.org/bookmarklet/', - VERSION: "4.1a1.SOURCE" + BOOKMARKLET_URL: 'https://www.zotero.org/bookmarklet/' }; // Commonly used imports accessible anywhere @@ -251,245 +250,253 @@ Components.utils.import("resource://gre/modules/Services.jsm"); this.isFx = true; this.isStandalone = Services.appinfo.ID == ZOTERO_CONFIG['GUID']; - if(this.isStandalone) { - this.version = Services.appinfo.version; - } else { - // Use until we collect version from extension manager - this.version = ZOTERO_CONFIG['VERSION']; + return Q.fcall(function () { + if(Zotero.isStandalone) { + return Services.appinfo.version; + } else { + var deferred = Q.defer(); + Components.utils.import("resource://gre/modules/AddonManager.jsm"); + AddonManager.getAddonByID( + ZOTERO_CONFIG.GUID, + function (addon) { + deferred.resolve(addon.version); + } + ); + return deferred.promise; + } + }) + .then(function (version) { + Zotero.version = version; - Components.utils.import("resource://gre/modules/AddonManager.jsm"); - AddonManager.getAddonByID(ZOTERO_CONFIG['GUID'], - function(addon) { Zotero.version = addon.version; }); - } - - // OS platform - var win = Components.classes["@mozilla.org/appshell/appShellService;1"] - .getService(Components.interfaces.nsIAppShellService) - .hiddenDOMWindow; - this.platform = win.navigator.platform; - this.isMac = (this.platform.substr(0, 3) == "Mac"); - this.isWin = (this.platform.substr(0, 3) == "Win"); - this.isLinux = (this.platform.substr(0, 5) == "Linux"); - this.oscpu = win.navigator.oscpu; - - // Browser - Zotero.browser = "g"; - - // Locale - var uaPrefs = Services.prefs.getBranch("general.useragent."); - try { - this.locale = uaPrefs.getComplexValue("locale", Components.interfaces.nsIPrefLocalizedString); - } catch (e) {} - - if(this.locale) { - this.locale = this.locale.toString(); - } else { - this.locale = uaPrefs.getCharPref("locale"); - } - - if (this.locale.length == 2) { - this.locale = this.locale + '-' + this.locale.toUpperCase(); - } - - // Load in the localization stringbundle for use by getString(name) - var appLocale = Services.locale.getApplicationLocale(); - - _localizedStringBundle = Services.strings.createBundle( - "chrome://zotero/locale/zotero.properties", appLocale); - - // Also load the brand as appName - var brandBundle = Services.strings.createBundle( - "chrome://branding/locale/brand.properties", appLocale); - this.appName = brandBundle.GetStringFromName("brandShortName"); - - // Set the locale direction to Zotero.dir - // DEBUG: is there a better way to get the entity from JS? - var xmlhttp = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"] - .createInstance(); - xmlhttp.open('GET', 'chrome://global/locale/global.dtd', false); - xmlhttp.overrideMimeType('text/plain'); - xmlhttp.send(null); - var matches = xmlhttp.responseText.match(/(ltr|rtl)/); - if (matches && matches[0] == 'rtl') { - Zotero.dir = 'rtl'; - } - else { - Zotero.dir = 'ltr'; - } - - // Make sure that Zotero Standalone is not running as root - if(Zotero.isStandalone && !Zotero.isWin) _checkRoot(); - - try { - var dataDir = Zotero.getZoteroDirectory(); - } - catch (e) { - // Zotero dir not found - if (e.name == 'NS_ERROR_FILE_NOT_FOUND') { - Zotero.startupError = Zotero.getString('dataDir.notFound'); - _startupErrorHandler = function() { - var win = Services.wm.getMostRecentWindow('navigator:browser'); + // OS platform + var win = Components.classes["@mozilla.org/appshell/appShellService;1"] + .getService(Components.interfaces.nsIAppShellService) + .hiddenDOMWindow; + this.platform = win.navigator.platform; + this.isMac = (this.platform.substr(0, 3) == "Mac"); + this.isWin = (this.platform.substr(0, 3) == "Win"); + this.isLinux = (this.platform.substr(0, 5) == "Linux"); + this.oscpu = win.navigator.oscpu; + + // Browser + Zotero.browser = "g"; + + // Locale + var uaPrefs = Services.prefs.getBranch("general.useragent."); + try { + this.locale = uaPrefs.getComplexValue("locale", Components.interfaces.nsIPrefLocalizedString); + } catch (e) {} + + if(this.locale) { + this.locale = this.locale.toString(); + } else { + this.locale = uaPrefs.getCharPref("locale"); + } + + if (this.locale.length == 2) { + this.locale = this.locale + '-' + this.locale.toUpperCase(); + } + + // Load in the localization stringbundle for use by getString(name) + var appLocale = Services.locale.getApplicationLocale(); + + _localizedStringBundle = Services.strings.createBundle( + "chrome://zotero/locale/zotero.properties", appLocale); + + // Also load the brand as appName + var brandBundle = Services.strings.createBundle( + "chrome://branding/locale/brand.properties", appLocale); + this.appName = brandBundle.GetStringFromName("brandShortName"); + + // Set the locale direction to Zotero.dir + // DEBUG: is there a better way to get the entity from JS? + var xmlhttp = Components.classes["@mozilla.org/xmlextras/xmlhttprequest;1"] + .createInstance(); + xmlhttp.open('GET', 'chrome://global/locale/global.dtd', false); + xmlhttp.overrideMimeType('text/plain'); + xmlhttp.send(null); + var matches = xmlhttp.responseText.match(/(ltr|rtl)/); + if (matches && matches[0] == 'rtl') { + Zotero.dir = 'rtl'; + } + else { + Zotero.dir = 'ltr'; + } + + // Make sure that Zotero Standalone is not running as root + if(Zotero.isStandalone && !Zotero.isWin) _checkRoot(); + + try { + var dataDir = Zotero.getZoteroDirectory(); + } + catch (e) { + // Zotero dir not found + if (e.name == 'NS_ERROR_FILE_NOT_FOUND') { + Zotero.startupError = Zotero.getString('dataDir.notFound'); + _startupErrorHandler = function() { + var win = Services.wm.getMostRecentWindow('navigator:browser'); + + var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]. + createInstance(Components.interfaces.nsIPromptService); + var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_OK) + + (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_IS_STRING) + + (ps.BUTTON_POS_2) * (ps.BUTTON_TITLE_IS_STRING); + var index = ps.confirmEx(win, + Zotero.getString('general.error'), + Zotero.startupError + '\n\n' + + Zotero.getString('dataDir.previousDir') + ' ' + + Zotero.Prefs.get('lastDataDir'), + buttonFlags, null, + Zotero.getString('dataDir.useProfileDir', Zotero.appName), + Zotero.getString('general.locate'), + null, {}); + + // Revert to profile directory + if (index == 1) { + Zotero.chooseZoteroDirectory(false, true); + } + // Locate data directory + else if (index == 2) { + Zotero.chooseZoteroDirectory(); + } + } + return; + } else if(e.name == "ZOTERO_DIR_MAY_EXIST") { + var app = Zotero.isStandalone ? Zotero.getString('app.standalone') : Zotero.getString('app.firefox'); + var altApp = !Zotero.isStandalone ? Zotero.getString('app.standalone') : Zotero.getString('app.firefox'); + + var message = Zotero.getString("dataDir.standaloneMigration.description", [app, altApp]); + if(e.multipleProfiles) { + message += "\n\n"+Zotero.getString("dataDir.standaloneMigration.multipleProfiles", [app, altApp]); + } var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]. createInstance(Components.interfaces.nsIPromptService); - var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_OK) - + (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_IS_STRING) + var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_YES) + + (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_NO) + (ps.BUTTON_POS_2) * (ps.BUTTON_TITLE_IS_STRING); - var index = ps.confirmEx(win, - Zotero.getString('general.error'), - Zotero.startupError + '\n\n' + - Zotero.getString('dataDir.previousDir') + ' ' - + Zotero.Prefs.get('lastDataDir'), - buttonFlags, null, - Zotero.getString('dataDir.useProfileDir', Zotero.appName), - Zotero.getString('general.locate'), + var index = ps.confirmEx(null, Zotero.getString("dataDir.standaloneMigration.title"), message, + buttonFlags, null, null, + Zotero.getString('dataDir.standaloneMigration.selectCustom'), null, {}); - // Revert to profile directory - if (index == 1) { - Zotero.chooseZoteroDirectory(false, true); - } - // Locate data directory - else if (index == 2) { - Zotero.chooseZoteroDirectory(); - } - } - return; - } else if(e.name == "ZOTERO_DIR_MAY_EXIST") { - var app = Zotero.isStandalone ? Zotero.getString('app.standalone') : Zotero.getString('app.firefox'); - var altApp = !Zotero.isStandalone ? Zotero.getString('app.standalone') : Zotero.getString('app.firefox'); - - var message = Zotero.getString("dataDir.standaloneMigration.description", [app, altApp]); - if(e.multipleProfiles) { - message += "\n\n"+Zotero.getString("dataDir.standaloneMigration.multipleProfiles", [app, altApp]); - } - - var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]. - createInstance(Components.interfaces.nsIPromptService); - var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_YES) - + (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_NO) - + (ps.BUTTON_POS_2) * (ps.BUTTON_TITLE_IS_STRING); - var index = ps.confirmEx(null, Zotero.getString("dataDir.standaloneMigration.title"), message, - buttonFlags, null, null, - Zotero.getString('dataDir.standaloneMigration.selectCustom'), - null, {}); - - // Migrate data directory - if (index == 0) { - // copy prefs - var prefsFile = e.profile.clone(); - prefsFile.append("prefs.js"); - if(prefsFile.exists()) { - // build sandbox - var sandbox = new Components.utils.Sandbox("http://www.example.com/"); - Components.utils.evalInSandbox( - "var prefs = {};"+ - "function user_pref(key, val) {"+ - "prefs[key] = val;"+ - "}" - , sandbox); - - // remove comments - var prefsJs = Zotero.File.getContents(prefsFile); - prefsJs = prefsJs.replace(/^#[^\r\n]*$/mg, ""); - - // evaluate - Components.utils.evalInSandbox(prefsJs, sandbox); - var prefs = sandbox.prefs; - for(var key in prefs) { - if(key.substr(0, ZOTERO_CONFIG.PREF_BRANCH.length) === ZOTERO_CONFIG.PREF_BRANCH - && key !== "extensions.zotero.firstRun2") { - Zotero.Prefs.set(key.substr(ZOTERO_CONFIG.PREF_BRANCH.length), prefs[key]); + // Migrate data directory + if (index == 0) { + // copy prefs + var prefsFile = e.profile.clone(); + prefsFile.append("prefs.js"); + if(prefsFile.exists()) { + // build sandbox + var sandbox = new Components.utils.Sandbox("http://www.example.com/"); + Components.utils.evalInSandbox( + "var prefs = {};"+ + "function user_pref(key, val) {"+ + "prefs[key] = val;"+ + "}" + , sandbox); + + // remove comments + var prefsJs = Zotero.File.getContents(prefsFile); + prefsJs = prefsJs.replace(/^#[^\r\n]*$/mg, ""); + + // evaluate + Components.utils.evalInSandbox(prefsJs, sandbox); + var prefs = sandbox.prefs; + for(var key in prefs) { + if(key.substr(0, ZOTERO_CONFIG.PREF_BRANCH.length) === ZOTERO_CONFIG.PREF_BRANCH + && key !== "extensions.zotero.firstRun2") { + Zotero.Prefs.set(key.substr(ZOTERO_CONFIG.PREF_BRANCH.length), prefs[key]); + } } } + + // also set data dir if no custom data dir is now defined + if(!Zotero.Prefs.get("useDataDir")) { + var dir = e.dir.QueryInterface(Components.interfaces.nsILocalFile); + Zotero.Prefs.set('dataDir', dir.persistentDescriptor); + Zotero.Prefs.set('lastDataDir', dir.path); + Zotero.Prefs.set('useDataDir', true); + } } - - // also set data dir if no custom data dir is now defined - if(!Zotero.Prefs.get("useDataDir")) { - var dir = e.dir.QueryInterface(Components.interfaces.nsILocalFile); - Zotero.Prefs.set('dataDir', dir.persistentDescriptor); - Zotero.Prefs.set('lastDataDir', dir.path); - Zotero.Prefs.set('useDataDir', true); + // Create new data directory + else if (index == 1) { + Zotero.File.createDirectoryIfMissing(e.curDir); + } + // Locate new data directory + else if (index == 2) { + Zotero.chooseZoteroDirectory(true); } } - // Create new data directory - else if (index == 1) { - Zotero.File.createDirectoryIfMissing(e.curDir); - } - // Locate new data directory - else if (index == 2) { - Zotero.chooseZoteroDirectory(true); + // DEBUG: handle more startup errors + else { + throw (e); + return false; } } - // DEBUG: handle more startup errors - else { - throw (e); - return false; - } - } - - // Register shutdown handler to call Zotero.shutdown() - var _shutdownObserver = {observe:function() { Zotero.shutdown().done() }}; - Services.obs.addObserver(_shutdownObserver, "quit-application", false); - - try { - Zotero.IPC.init(); - } - catch (e) { - if (e.name == 'NS_ERROR_FILE_ACCESS_DENIED') { - var msg = Zotero.localeJoin([ - Zotero.getString('startupError.databaseCannotBeOpened'), - Zotero.getString('startupError.checkPermissions') - ]); - Zotero.startupError = msg; - Zotero.debug(e); - Components.utils.reportError(e); - return false; - } - throw (e); - } - - // Get startup errors - try { - var messages = {}; - Services.console.getMessageArray(messages, {}); - _startupErrors = [msg for each(msg in messages.value) if(_shouldKeepError(msg))]; - } catch(e) { - Zotero.logError(e); - } - // Register error observer - Services.console.registerListener(ConsoleListener); - - // Add shutdown listener to remove quit-application observer and console listener - this.addShutdownListener(function() { - Services.obs.removeObserver(_shutdownObserver, "quit-application", false); - Services.console.unregisterListener(ConsoleListener); - }); - - // Load additional info for connector or not - if(Zotero.isConnector) { - Zotero.debug("Loading in connector mode"); - Zotero.Connector_Types.init(); - if(!Zotero.isFirstLoadThisSession) { - // We want to get a checkInitComplete message before initializing if we switched to - // connector mode because Standalone was launched - Zotero.IPC.broadcast("checkInitComplete"); - } else { - Zotero.initComplete(); + // Register shutdown handler to call Zotero.shutdown() + var _shutdownObserver = {observe:function() { Zotero.shutdown().done() }}; + Services.obs.addObserver(_shutdownObserver, "quit-application", false); + + try { + Zotero.IPC.init(); } - } else { - Zotero.debug("Loading in full mode"); - return Q.fcall(_initFull) - .then(function (success) { - if(!success) return false; - - if(Zotero.isStandalone) Zotero.Standalone.init(); - Zotero.initComplete(); + catch (e) { + if (e.name == 'NS_ERROR_FILE_ACCESS_DENIED') { + var msg = Zotero.localeJoin([ + Zotero.getString('startupError.databaseCannotBeOpened'), + Zotero.getString('startupError.checkPermissions') + ]); + Zotero.startupError = msg; + Zotero.debug(e); + Components.utils.reportError(e); + return false; + } + throw (e); + } + + // Get startup errors + try { + var messages = {}; + Services.console.getMessageArray(messages, {}); + _startupErrors = [msg for each(msg in messages.value) if(_shouldKeepError(msg))]; + } catch(e) { + Zotero.logError(e); + } + // Register error observer + Services.console.registerListener(ConsoleListener); + + // Add shutdown listener to remove quit-application observer and console listener + this.addShutdownListener(function() { + Services.obs.removeObserver(_shutdownObserver, "quit-application", false); + Services.console.unregisterListener(ConsoleListener); }); - } - - return true; + + // Load additional info for connector or not + if(Zotero.isConnector) { + Zotero.debug("Loading in connector mode"); + Zotero.Connector_Types.init(); + + if(!Zotero.isFirstLoadThisSession) { + // We want to get a checkInitComplete message before initializing if we switched to + // connector mode because Standalone was launched + Zotero.IPC.broadcast("checkInitComplete"); + } else { + Zotero.initComplete(); + } + } else { + Zotero.debug("Loading in full mode"); + return Q.fcall(_initFull) + .then(function (success) { + if(!success) return false; + + if(Zotero.isStandalone) Zotero.Standalone.init(); + Zotero.initComplete(); + }); + } + + return true; + }.bind(this)); } /**