Merge pull request #495 from aurimasv/Fx-connector

Fix race condition when starting in Connector mode
This commit is contained in:
Simon Kornblith 2014-06-04 17:02:28 +02:00
commit 7b7b4e6e9e
2 changed files with 54 additions and 7 deletions

View File

@ -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();
}
/**

View File

@ -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,13 +61,25 @@ 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