Merge pull request #495 from aurimasv/Fx-connector
Fix race condition when starting in Connector mode
This commit is contained in:
commit
7b7b4e6e9e
2 changed files with 54 additions and 7 deletions
|
@ -102,15 +102,45 @@ var Zotero_Browser = new function() {
|
||||||
* Initialize some variables and prepare event listeners for when chrome is done loading
|
* Initialize some variables and prepare event listeners for when chrome is done loading
|
||||||
*/
|
*/
|
||||||
function init() {
|
function init() {
|
||||||
if (!Zotero || !Zotero.initialized || !window.hasOwnProperty("gBrowser")) {
|
if (!window.hasOwnProperty("gBrowser")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
window.addEventListener("load",
|
var zoteroInitDone;
|
||||||
function(e) { Zotero_Browser.chromeLoad(e) }, false);
|
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);
|
var chromeLoaded = Q.defer();
|
||||||
reload();
|
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();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Zotero.Server = new function() {
|
Zotero.Server = new function() {
|
||||||
var _onlineObserverRegistered;
|
var _onlineObserverRegistered, serv;
|
||||||
this.responseCodes = {
|
this.responseCodes = {
|
||||||
200:"OK",
|
200:"OK",
|
||||||
201:"Created",
|
201:"Created",
|
||||||
|
@ -47,8 +47,13 @@ Zotero.Server = new function() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(serv) {
|
||||||
|
Zotero.debug("Already listening on port " + serv.port);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// start listening on socket
|
// 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);
|
.createInstance(Components.interfaces.nsIServerSocket);
|
||||||
try {
|
try {
|
||||||
// bind to a random port on loopback only
|
// bind to a random port on loopback only
|
||||||
|
@ -56,13 +61,25 @@ Zotero.Server = new function() {
|
||||||
serv.asyncListen(Zotero.Server.SocketListener);
|
serv.asyncListen(Zotero.Server.SocketListener);
|
||||||
|
|
||||||
Zotero.debug("HTTP server listening on "+(bindAllAddr ? "*": " 127.0.0.1")+":"+serv.port);
|
Zotero.debug("HTTP server listening on "+(bindAllAddr ? "*": " 127.0.0.1")+":"+serv.port);
|
||||||
|
|
||||||
|
Zotero.addShutdownListener(this.close.bind(this));
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
Zotero.debug("Not initializing HTTP server");
|
Zotero.debug("Not initializing HTTP server");
|
||||||
|
serv = undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
_registerOnlineObserver()
|
_registerOnlineObserver()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* releases bound port
|
||||||
|
*/
|
||||||
|
this.close = function() {
|
||||||
|
if(!serv) return;
|
||||||
|
serv.close();
|
||||||
|
serv = undefined;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses a query string into a key => value object
|
* Parses a query string into a key => value object
|
||||||
* @param {String} queryString Query string
|
* @param {String} queryString Query string
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue