From a0814cf7405a45be02992a4bcbf7e587c9293c85 Mon Sep 17 00:00:00 2001 From: Jason San Jose Date: Mon, 20 May 2013 15:16:16 -0700 Subject: [PATCH] fix #3761 #3792 --- src/LiveDevelopment/Agents/RemoteAgent.js | 66 ++++++++++++++-------- src/LiveDevelopment/Inspector/Inspector.js | 51 ++++++++++++----- src/LiveDevelopment/LiveDevelopment.js | 5 ++ 3 files changed, 85 insertions(+), 37 deletions(-) diff --git a/src/LiveDevelopment/Agents/RemoteAgent.js b/src/LiveDevelopment/Agents/RemoteAgent.js index 0d307425683..0f373c343bd 100644 --- a/src/LiveDevelopment/Agents/RemoteAgent.js +++ b/src/LiveDevelopment/Agents/RemoteAgent.js @@ -45,21 +45,6 @@ define(function RemoteAgent(require, exports, module) { var _objectId; // the object id of the remote object var _intervalId; // interval used to send keepAlive events - // WebInspector Event: Page.loadEventFired - function _onLoadEventFired(event, res) { - // res = {timestamp} - var command = "window._LD=" + RemoteFunctions + "(" + LiveDevelopment.config.experimental + ")"; - - Inspector.Runtime.evaluate(command, function onEvaluate(response) { - if (response.error || response.wasThrown) { - _load.reject(null, response.error); - } else { - _objectId = response.result.objectId; - _load.resolve(); - } - }); - } - // WebInspector Event: DOM.attributeModified function _onAttributeModified(event, res) { // res = {nodeId, name, value} @@ -105,16 +90,53 @@ define(function RemoteAgent(require, exports, module) { }); } + function _stopKeepAliveInterval() { + if (_intervalId) { + window.clearInterval(_intervalId); + _intervalId = null; + } + } + + function _startKeepAliveInterval() { + _stopKeepAliveInterval(); + + _intervalId = window.setInterval(function () { + call("keepAlive"); + }, 1000); + } + + /** + * @private + * Cancel the keepAlive interval if the page reloads + */ + function _onFrameStartedLoading(event, res) { + _stopKeepAliveInterval(); + } + + // WebInspector Event: Page.loadEventFired + function _onLoadEventFired(event, res) { + // res = {timestamp} + var command = "window._LD=" + RemoteFunctions + "(" + LiveDevelopment.config.experimental + ")"; + + Inspector.Runtime.evaluate(command, function onEvaluate(response) { + if (response.error || response.wasThrown) { + _load.reject(null, response.error); + } else { + _objectId = response.result.objectId; + _load.resolve(); + + _startKeepAliveInterval(); + } + }); + } + /** Initialize the agent */ function load() { _load = new $.Deferred(); $(Inspector.Page).on("loadEventFired.RemoteAgent", _onLoadEventFired); + $(Inspector.Page).on("frameStartedLoading.RemoteAgent", _onFrameStartedLoading); $(Inspector.DOM).on("attributeModified.RemoteAgent", _onAttributeModified); - _load.done(function () { - _intervalId = window.setInterval(function () { - call("keepAlive"); - }, 1000); - }); + return _load.promise(); } @@ -122,9 +144,7 @@ define(function RemoteAgent(require, exports, module) { function unload() { $(Inspector.Page).off(".RemoteAgent"); $(Inspector.DOM).off(".RemoteAgent"); - if (_intervalId) { - window.clearInterval(_intervalId); - } + _stopKeepAliveInterval(); } // Export public functions diff --git a/src/LiveDevelopment/Inspector/Inspector.js b/src/LiveDevelopment/Inspector/Inspector.js index 07ec0ee5a77..0e1ecee363a 100644 --- a/src/LiveDevelopment/Inspector/Inspector.js +++ b/src/LiveDevelopment/Inspector/Inspector.js @@ -246,31 +246,54 @@ define(function Inspector(require, exports, module) { $exports.off(name, handler); } - /** Disconnect from the remote debugger WebSocket */ + /** + * Disconnect from the remote debugger WebSocket + * @return {jQuery.Promise} Promise that is resolved immediately if not + * currently connected or asynchronously when the socket is closed. + */ function disconnect() { - if (_socket) { - if (_socket.readyState === 1) { - _socket.close(); - } else { + var deferred = new $.Deferred(), + promise = deferred.promise(); + + if (_socket && (_socket.readyState === WebSocket.OPEN)) { + _socket.onclose = function () { + // trigger disconnect event + _onDisconnect(); + + deferred.resolve(); + }; + + promise = Async.withTimeout(promise, 5000); + + _socket.close(); + } else { + if (_socket) { delete _socket.onmessage; delete _socket.onopen; delete _socket.onclose; delete _socket.onerror; + + _socket = undefined; } - _socket = undefined; + + deferred.resolve(); } - } - /** Connect to the remote debugger WebSocket at the given URL + return promise; + } + /** + * Connect to the remote debugger WebSocket at the given URL. + * Clients must listen for the `connect` event. * @param {string} WebSocket URL */ function connect(socketURL) { - disconnect(); - _socket = new WebSocket(socketURL); - _socket.onmessage = _onMessage; - _socket.onopen = _onConnect; - _socket.onclose = _onDisconnect; - _socket.onerror = _onError; + disconnect().done(function () { + _socket = new WebSocket(socketURL); + _socket.onmessage = _onMessage; + _socket.onopen = _onConnect; + _socket.onclose = _onDisconnect; + _socket.onerror = _onError; + }); } /** Connect to the remote debugger of the page that is at the given URL diff --git a/src/LiveDevelopment/LiveDevelopment.js b/src/LiveDevelopment/LiveDevelopment.js index 48c9cc7ec92..f8aebec38f9 100644 --- a/src/LiveDevelopment/LiveDevelopment.js +++ b/src/LiveDevelopment/LiveDevelopment.js @@ -307,6 +307,11 @@ define(function LiveDevelopment(require, exports, module) { } if (_serverProvider) { + // Stop listening for requests + if (_serverProvider.setRequestFilterPaths) { + _serverProvider.setRequestFilterPaths([]); + } + // Remove any "request" listeners that were added previously $(_serverProvider).off(".livedev"); }