commit 7b7b4e6e9ead292626b00e6ec61f602acc5834ed
parent 825cea47fb12a39f106b3dc35bfdc94a0aa25ce8
Author: Simon Kornblith <simon@simonster.com>
Date: Wed, 4 Jun 2014 17:02:28 +0200
Merge pull request #495 from aurimasv/Fx-connector
Fix race condition when starting in Connector mode
Diffstat:
2 files changed, 54 insertions(+), 7 deletions(-)
diff --git a/chrome/content/zotero/browser.js b/chrome/content/zotero/browser.js
@@ -102,15 +102,45 @@ var Zotero_Browser = new function() {
* Initialize some variables and prepare event listeners for when chrome is done loading
*/
function init() {
- if (!Zotero || !Zotero.initialized || !window.hasOwnProperty("gBrowser")) {
+ if (!window.hasOwnProperty("gBrowser")) {
return;
}
- window.addEventListener("load",
- function(e) { Zotero_Browser.chromeLoad(e) }, false);
+ var zoteroInitDone;
+ if (!Zotero || !Zotero.initialized) {
+ // Zotero either failed to load or is reloading in Connector mode
+ // In case of the latter, listen for the 'zotero-loaded' event (once) and retry
+ var zoteroInitDone_deferred = Q.defer();
+ var obs = Components.classes["@mozilla.org/observer-service;1"]
+ .getService(Components.interfaces.nsIObserverService);
+ var observer = {
+ "observe":function() {
+ obs.removeObserver(observer, 'zotero-loaded')
+ zoteroInitDone_deferred.resolve();
+ }
+ };
+ obs.addObserver(observer, 'zotero-loaded', false);
+
+ zoteroInitDone = zoteroInitDone_deferred.promise;
+ } else {
+ zoteroInitDone = Q();
+ }
- ZoteroPane_Local.addReloadListener(reload);
- reload();
+ var chromeLoaded = Q.defer();
+ window.addEventListener("load", function(e) { chromeLoaded.resolve() }, false);
+
+ // Wait for Zotero to init and chrome to load before proceeding
+ Q.all([
+ zoteroInitDone.then(function() {
+ ZoteroPane_Local.addReloadListener(reload);
+ reload();
+ }),
+ chromeLoaded.promise
+ ])
+ .then(function() {
+ Zotero_Browser.chromeLoad()
+ })
+ .done();
}
/**
diff --git a/chrome/content/zotero/xpcom/server.js b/chrome/content/zotero/xpcom/server.js
@@ -24,7 +24,7 @@
*/
Zotero.Server = new function() {
- var _onlineObserverRegistered;
+ var _onlineObserverRegistered, serv;
this.responseCodes = {
200:"OK",
201:"Created",
@@ -47,8 +47,13 @@ Zotero.Server = new function() {
return;
}
+ if(serv) {
+ Zotero.debug("Already listening on port " + serv.port);
+ return;
+ }
+
// start listening on socket
- var serv = Components.classes["@mozilla.org/network/server-socket;1"]
+ serv = Components.classes["@mozilla.org/network/server-socket;1"]
.createInstance(Components.interfaces.nsIServerSocket);
try {
// bind to a random port on loopback only
@@ -56,14 +61,26 @@ Zotero.Server = new function() {
serv.asyncListen(Zotero.Server.SocketListener);
Zotero.debug("HTTP server listening on "+(bindAllAddr ? "*": " 127.0.0.1")+":"+serv.port);
+
+ Zotero.addShutdownListener(this.close.bind(this));
} catch(e) {
Zotero.debug("Not initializing HTTP server");
+ serv = undefined;
}
_registerOnlineObserver()
}
/**
+ * releases bound port
+ */
+ this.close = function() {
+ if(!serv) return;
+ serv.close();
+ serv = undefined;
+ };
+
+ /**
* Parses a query string into a key => value object
* @param {String} queryString Query string
*/