diff --git a/chrome/content/zotero/browser.js b/chrome/content/zotero/browser.js index a011ffb79..9fb08bbba 100644 --- 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 index 120ebb696..034832c14 100755 --- 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,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