Skip to content
This repository has been archived by the owner on Sep 6, 2021. It is now read-only.

Commit

Permalink
fix #3761 #3792
Browse files Browse the repository at this point in the history
  • Loading branch information
jasonsanjose committed May 20, 2013
1 parent 786bb99 commit a0814cf
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 37 deletions.
66 changes: 43 additions & 23 deletions src/LiveDevelopment/Agents/RemoteAgent.js
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down Expand Up @@ -105,26 +90,61 @@ 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();
}

/** Clean up */
function unload() {
$(Inspector.Page).off(".RemoteAgent");
$(Inspector.DOM).off(".RemoteAgent");
if (_intervalId) {
window.clearInterval(_intervalId);
}
_stopKeepAliveInterval();
}

// Export public functions
Expand Down
51 changes: 37 additions & 14 deletions src/LiveDevelopment/Inspector/Inspector.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions src/LiveDevelopment/LiveDevelopment.js
Original file line number Diff line number Diff line change
Expand Up @@ -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");
}
Expand Down

0 comments on commit a0814cf

Please sign in to comment.