[tbb-commits] [torbutton/master] Bug #15510: Detach event watchers when finished
gk at torproject.org
gk at torproject.org
Tue Mar 31 11:28:15 UTC 2015
commit f0e1d504dbf57f0c0041ae14f32a5a092a8a1afe
Author: Arthur Edelstein <arthuredelstein at gmail.com>
Date: Mon Mar 30 14:50:27 2015 -0700
Bug #15510: Detach event watchers when finished
---
src/chrome/content/tor-circuit-display.js | 15 +++++++++++----
src/modules/tor-control-port.js | 10 +++++-----
2 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/src/chrome/content/tor-circuit-display.js b/src/chrome/content/tor-circuit-display.js
index 917f1f0..4197944 100644
--- a/src/chrome/content/tor-circuit-display.js
+++ b/src/chrome/content/tor-circuit-display.js
@@ -129,7 +129,7 @@ let getCircuitStatusByID = function* (aController, circuitID) {
// corresponding circuit. Whenever the first stream on a new circuit is seen,
// looks up u+p and records the node data in the credentialsToNodeDataMap.
let collectIsolationData = function (aController) {
- aController.watchEvent(
+ return aController.watchEvent(
"STREAM",
streamEvent => streamEvent.StreamStatus === "SENTCONNECT",
streamEvent => Task.spawn(function* () {
@@ -313,10 +313,13 @@ let syncDisplayWithSelectedTab = (function() {
// A reference to this function (called createTorCircuitDisplay) is exported as a global.
let setupDisplay = function (host, port, password, enablePrefName) {
let myController = null,
+ stopCollectingIsolationData = null,
stop = function() {
if (myController) {
syncDisplayWithSelectedTab(false);
- myController.close();
+ if (stopCollectingIsolationData) {
+ stopCollectingIsolationData();
+ }
myController = null;
}
},
@@ -326,16 +329,20 @@ let setupDisplay = function (host, port, password, enablePrefName) {
// An error has occurred.
logger.eclog(5, err);
logger.eclog(5, "Disabling tor display circuit because of an error.");
+ myController.close();
stop();
});
syncDisplayWithSelectedTab(true);
- collectIsolationData(myController);
+ stopCollectingIsolationData = collectIsolationData(myController);
}
};
try {
let unbindPref = bindPrefAndInit(enablePrefName, on => { if (on) start(); else stop(); });
// When this chrome window is unloaded, we need to unbind the pref.
- window.addEventListener("unload", unbindPref);
+ window.addEventListener("unload", function () {
+ unbindPref();
+ stop();
+ });
} catch (e) {
logger.eclog(5, "Error: " + e.message + "\n" + e.stack);
}
diff --git a/src/modules/tor-control-port.js b/src/modules/tor-control-port.js
index 710643e..e4c7d16 100644
--- a/src/modules/tor-control-port.js
+++ b/src/modules/tor-control-port.js
@@ -606,9 +606,10 @@ event.messageToData = function (type, message) {
// __event.watchEvent(controlSocket, type, filter, onData)__.
// Watches for a particular type of event. If filter(data) returns true, the event's
-// data is pass to the onData callback.
+// data is pass to the onData callback. Returns a zero arg function that
+// stops watching the event.
event.watchEvent = function (controlSocket, type, filter, onData) {
- controlSocket.addNotificationCallback(new RegExp("^650." + type, "i"),
+ return controlSocket.addNotificationCallback(new RegExp("^650." + type, "i"),
function (message) {
let data = event.messageToData(type, message);
if (filter === null || filter(data)) {
@@ -635,9 +636,8 @@ tor.controller = function (host, port, password, onError) {
return { getInfo : key => info.getInfo(socket, key),
getInfoMultiple : keys => info.getInfoMultiple(socket, keys),
getConf : key => info.getConf(socket, key),
- watchEvent : function (type, filter, onData) {
- event.watchEvent(socket, type, filter, onData);
- },
+ watchEvent : (type, filter, onData) =>
+ event.watchEvent(socket, type, filter, onData),
isOpen : () => isOpen,
close : () => { isOpen = false; socket.close(); }
};
More information about the tbb-commits
mailing list