Bug 902910 - Offer a way for simulator addon to integrate itself with the connection footer. r=paul

This commit is contained in:
Alexandre Poirot 2013-08-29 03:01:00 +02:00
Родитель 76f15edcac
Коммит 7ef163c51b
2 изменённых файлов: 55 добавлений и 14 удалений

Просмотреть файл

@ -6,7 +6,7 @@
"use strict";
const {Cu} = require("chrome");
const {Cc, Ci, Cu} = require("chrome");
const {setTimeout, clearTimeout} = require('sdk/timers');
const EventEmitter = require("devtools/shared/event-emitter");
@ -25,6 +25,7 @@ Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
* Methods:
* Connection createConnection(host, port)
* void destroyConnection(connection)
* Number getFreeTCPPort()
*
* Properties:
* Array connections
@ -46,6 +47,7 @@ Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
* port Port
* logs Current logs. "newlog" event notifies new available logs
* store Reference to a local data store (see below)
* keepConnecting Should the connection keep trying connecting
* status Connection status:
* Connection.Status.CONNECTED
* Connection.Status.DISCONNECTED
@ -86,6 +88,14 @@ let ConnectionManager = {
get connections() {
return [c for (c of this._connections)];
},
getFreeTCPPort: function () {
let serv = Cc['@mozilla.org/network/server-socket;1']
.createInstance(Ci.nsIServerSocket);
serv.init(-1, true, -1);
let port = serv.port;
serv.close();
return port;
},
}
EventEmitter.decorate(ConnectionManager);
@ -101,6 +111,7 @@ function Connection(host, port) {
this._onDisconnected = this._onDisconnected.bind(this);
this._onConnected = this._onConnected.bind(this);
this._onTimeout = this._onTimeout.bind(this);
this.keepConnecting = false;
}
Connection.Status = {
@ -180,15 +191,7 @@ Connection.prototype = {
let delay = Services.prefs.getIntPref("devtools.debugger.remote-timeout");
this._timeoutID = setTimeout(this._onTimeout, delay);
let transport;
if (!this._host) {
transport = DebuggerServer.connectPipe();
} else {
transport = debuggerSocketConnect(this._host, this._port);
}
this._client = new DebuggerClient(transport);
this._client.addOneTimeListener("closed", this._onDisconnected);
this._client.connect(this._onConnected);
this._clientConnect();
} else {
let msg = "Can't connect. Client is not fully disconnected";
this.log(msg);
@ -199,6 +202,7 @@ Connection.prototype = {
destroy: function() {
this.log("killing connection");
clearTimeout(this._timeoutID);
this.keepConnecting = false;
if (this._client) {
this._client.close();
this._client = null;
@ -206,6 +210,18 @@ Connection.prototype = {
this._setStatus(Connection.Status.DESTROYED);
},
_clientConnect: function () {
let transport;
if (!this._host) {
transport = DebuggerServer.connectPipe();
} else {
transport = debuggerSocketConnect(this._host, this._port);
}
this._client = new DebuggerClient(transport);
this._client.addOneTimeListener("closed", this._onDisconnected);
this._client.connect(this._onConnected);
},
get status() {
return this._status
},
@ -219,6 +235,13 @@ Connection.prototype = {
},
_onDisconnected: function() {
this._client = null;
if (this._status == Connection.Status.CONNECTING && this.keepConnecting) {
setTimeout(() => this._clientConnect(), 0);
return;
}
clearTimeout(this._timeoutID);
switch (this.status) {
case Connection.Status.CONNECTED:
@ -230,7 +253,6 @@ Connection.prototype = {
default:
this.log("disconnected");
}
this._client = null;
this._setStatus(Connection.Status.DISCONNECTED);
},
@ -242,7 +264,7 @@ Connection.prototype = {
_onTimeout: function() {
this.log("connection timeout");
this.emit(Connection.Events.TIMEOUT, str);
this.emit(Connection.Events.TIMEOUT);
this.disconnect();
},
}

Просмотреть файл

@ -20,6 +20,7 @@ window.onload = function() {
Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
Cu.import("resource://gre/modules/devtools/Loader.jsm");
Cu.import("resource://gre/modules/Services.jsm");
DebuggerServer.init(function () { return true; });
DebuggerServer.addBrowserActors();
@ -43,7 +44,7 @@ window.onload = function() {
var c = c2;
var eventsRef = "connecting connected disconnecting disconnected host-changed disconnected destroyed";
var eventsRef = "connecting connected disconnecting disconnected host-changed disconnected timeout destroyed";
var events = [];
var s = Connection.Status;
@ -70,7 +71,7 @@ window.onload = function() {
function testError() {
c.once(Connection.Events.DISCONNECTED, function(e) {
events.push(e);
ConnectionManager.destroyConnection(c);
testKeepConnecting();
});
c.once(Connection.Events.HOST_CHANGED, function(e) {
events.push(e);
@ -80,6 +81,24 @@ window.onload = function() {
c.host = "localhost";
}
function testKeepConnecting() {
// ensure that keepConnecting keep trying connecting
// until the connection attempts timeout
var originalTimeout = Services.prefs.getIntPref("devtools.debugger.remote-timeout");
Services.prefs.setIntPref("devtools.debugger.remote-timeout", 1000);
c.once("timeout", function (e) {
events.push(e);
Services.prefs.setIntPref("devtools.debugger.remote-timeout", originalTimeout);
ConnectionManager.destroyConnection(c);
});
c.keepConnecting = true;
var port = ConnectionManager.getFreeTCPPort();
ok(parseInt(port), "Free TCP port looks like a port number");
c.port = port;
c.host = "locahost";
c.connect();
}
function finish() {
is(events.join(" "), eventsRef, "Events received in the right order");
DebuggerServer.destroy();