diff --git a/src/LiveDevelopment/LiveDevServerManager.js b/src/LiveDevelopment/LiveDevServerManager.js index f59e6d12e63..43f2d3db4b2 100644 --- a/src/LiveDevelopment/LiveDevServerManager.js +++ b/src/LiveDevelopment/LiveDevServerManager.js @@ -79,7 +79,8 @@ define(function (require, exports, module) { } /** - * The method by which a server registers itself. + * The method by which a server registers itself. It returns an + * object handler that can be used to remove that server from the list. * * @param {BaseServer|{create: function():BaseServer}} provider * The provider to be registered, described below. @@ -88,6 +89,7 @@ define(function (require, exports, module) { * particular url. Providers that register with a higher priority will * have the opportunity to provide a given url before those with a * lower priority. The higher the number, the higher the priority. + * @return {{object}} */ function registerServer(provider, priority) { if (!provider.create) { @@ -102,6 +104,22 @@ define(function (require, exports, module) { _serverProviders.push(providerObj); _serverProviders.sort(_providerSort); + + return providerObj; + } + + /** + * Remove a server from the list of the registered providers. + * + * @param {{object}} provider The provider to be removed. + */ + function removeServer(provider) { + var i; + for (i = 0; i < _serverProviders.length; i++) { + if (provider === _serverProviders[i]) { + _serverProviders.splice(i, 1); + } + } } // Backwards compatibility @@ -111,4 +129,5 @@ define(function (require, exports, module) { // Define public API exports.getServer = getServer; exports.registerServer = registerServer; + exports.removeServer = removeServer; }); diff --git a/src/LiveDevelopment/LiveDevelopment.js b/src/LiveDevelopment/LiveDevelopment.js index e5f3af47b24..4c40eb7f122 100644 --- a/src/LiveDevelopment/LiveDevelopment.js +++ b/src/LiveDevelopment/LiveDevelopment.js @@ -190,6 +190,12 @@ define(function LiveDevelopment(require, exports, module) { * @type {BaseServer} */ var _server; + + /** + * @private + * Handles of registered servers + */ + var _regServers = []; function _isPromisePending(promise) { return promise && promise.state() === "pending"; @@ -865,6 +871,11 @@ define(function LiveDevelopment(require, exports, module) { var closeDeferred = (brackets.platform === "mac") ? NativeApp.closeLiveBrowser() : $.Deferred().resolve(); closeDeferred.done(function () { _setStatus(STATUS_INACTIVE, reason || "explicit_close"); + // clean-up registered servers + _regServers.forEach(function (server) { + LiveDevServerManager.removeServer(server); + }); + _regServers = []; _closeDeferred.resolve(); }).fail(function (err) { if (err) { @@ -1288,6 +1299,22 @@ define(function LiveDevelopment(require, exports, module) { return deferred.promise(); } + function getCurrentProjectServerConfig() { + return { + baseUrl: ProjectManager.getBaseUrl(), + pathResolver: ProjectManager.makeProjectRelativeIfPossible, + root: ProjectManager.getProjectRoot().fullPath + }; + } + + function _createUserServer() { + return new UserServer(getCurrentProjectServerConfig()); + } + + function _createFileServer() { + return new FileServer(getCurrentProjectServerConfig()); + } + /** * Open the Connection and go live * @@ -1314,6 +1341,10 @@ define(function LiveDevelopment(require, exports, module) { } } + // Register user defined server provider and keep handlers for further clean-up + _regServers.push(LiveDevServerManager.registerServer({ create: _createUserServer }, 99)); + _regServers.push(LiveDevServerManager.registerServer({ create: _createFileServer }, 0)); + // TODO: need to run _onFileChanged() after load if doc != currentDocument here? Maybe not, since activeEditorChange // doesn't trigger it, while inline editors can still cause edits in doc other than currentDoc... _getInitialDocFromCurrent().done(function (doc) { @@ -1441,22 +1472,6 @@ define(function LiveDevelopment(require, exports, module) { } } - function getCurrentProjectServerConfig() { - return { - baseUrl: ProjectManager.getBaseUrl(), - pathResolver: ProjectManager.makeProjectRelativeIfPossible, - root: ProjectManager.getProjectRoot().fullPath - }; - } - - function _createUserServer() { - return new UserServer(getCurrentProjectServerConfig()); - } - - function _createFileServer() { - return new FileServer(getCurrentProjectServerConfig()); - } - /** Initialize the LiveDevelopment Session */ function init(theConfig) { exports.config = theConfig; @@ -1475,10 +1490,6 @@ define(function LiveDevelopment(require, exports, module) { .on("dirtyFlagChange", _onDirtyFlagChange); ProjectManager .on("beforeProjectClose beforeAppClose", close); - - // Register user defined server provider - LiveDevServerManager.registerServer({ create: _createUserServer }, 99); - LiveDevServerManager.registerServer({ create: _createFileServer }, 0); // Initialize exports.status _setStatus(STATUS_INACTIVE);