[tbb-commits] [tor-launcher/master] Remove all observers when dialogs are closed.
brade at torproject.org
brade at torproject.org
Thu Aug 7 18:17:44 UTC 2014
commit 9c0ef4f67d5ec18e17e8a3e789a198819c90c7ce
Author: Kathy Brade <brade at pearlcrescent.com>
Date: Thu Aug 7 14:14:57 2014 -0400
Remove all observers when dialogs are closed.
---
src/chrome/content/network-settings-wizard.xul | 3 +-
src/chrome/content/network-settings.js | 64 +++++++++++++++++++-----
src/chrome/content/network-settings.xul | 3 +-
3 files changed, 56 insertions(+), 14 deletions(-)
diff --git a/src/chrome/content/network-settings-wizard.xul b/src/chrome/content/network-settings-wizard.xul
index da81ced..6a3b8fc 100644
--- a/src/chrome/content/network-settings-wizard.xul
+++ b/src/chrome/content/network-settings-wizard.xul
@@ -21,7 +21,8 @@
buttonlabelextra2="&torsettings.copyLog;"
onwizardfinish="return applySettings();"
onwizardcancel="return onCancel();"
- onload="initDialog();">
+ onload="initDialog();"
+ onunload="deinitDialog();">
<script type="application/x-javascript"
src="chrome://torlauncher/content/network-settings.js"/>
diff --git a/src/chrome/content/network-settings.js b/src/chrome/content/network-settings.js
index bdfb5c1..fdd565e 100644
--- a/src/chrome/content/network-settings.js
+++ b/src/chrome/content/network-settings.js
@@ -62,6 +62,7 @@ var gObsService = null;
var gIsInitialBootstrap = false;
var gIsBootstrapComplete = false;
var gRestoreAfterHelpPanelID = null;
+var gActiveTopics = []; // Topics for which an observer is currently installed.
function initDialog()
@@ -156,10 +157,10 @@ function initDialog()
initDefaultBridgeTypeMenu();
- gObsService.addObserver(gObserver, kTorBootstrapErrorTopic, false);
- gObsService.addObserver(gObserver, kTorLogHasWarnOrErrTopic, false);
- gObsService.addObserver(gObserver, kTorProcessExitedTopic, false);
- gObsService.addObserver(gObserver, kTorOpenProgressTopic, false);
+ addObserver(kTorBootstrapErrorTopic);
+ addObserver(kTorLogHasWarnOrErrTopic);
+ addObserver(kTorProcessExitedTopic);
+ addObserver(kTorOpenProgressTopic);
var status = gTorProcessService.TorProcessStatus;
if (TorLauncherUtil.shouldStartAndOwnTor &&
@@ -169,8 +170,8 @@ function initDialog()
showErrorMessage(true, null);
else
showStartingTorPanel();
- gObsService.addObserver(gObserver, kTorProcessReadyTopic, false);
- gObsService.addObserver(gObserver, kTorProcessDidNotStartTopic, false);
+ addObserver(kTorProcessReadyTopic);
+ addObserver(kTorProcessDidNotStartTopic);
}
else
{
@@ -199,6 +200,12 @@ function initDialog()
}
+function deinitDialog()
+{
+ removeAllObservers();
+}
+
+
// For now, we assume that the wizard buttons are the widest portion.
// TODO: return a value for the settings dialog (non-wizard case).
function maxWidthOfContent()
@@ -329,7 +336,8 @@ var gObserver = {
if (kTorProcessReadyTopic == aTopic)
{
- gObsService.removeObserver(gObserver, kTorProcessReadyTopic);
+ removeObserver(kTorProcessReadyTopic);
+ removeObserver(kTorProcessDidNotStartTopic);
var haveWizard = (getWizard() != null);
showPanel();
if (haveWizard)
@@ -341,12 +349,13 @@ var gObserver = {
}
else if (kTorProcessDidNotStartTopic == aTopic)
{
- gObsService.removeObserver(gObserver, kTorProcessDidNotStartTopic);
+ removeObserver(kTorProcessReadyTopic);
+ removeObserver(kTorProcessDidNotStartTopic);
showErrorMessage(false, aData);
}
else if (kTorProcessExitedTopic == aTopic)
{
- gObsService.removeObserver(gObserver, kTorProcessExitedTopic);
+ removeObserver(kTorProcessExitedTopic);
showErrorMessage(true, null);
}
else if (kTorOpenProgressTopic == aTopic)
@@ -357,6 +366,37 @@ var gObserver = {
};
+// addObserver() will not add two observers for the same topic.
+function addObserver(aTopic)
+{
+ if (gActiveTopics.indexOf(aTopic) < 0)
+ {
+ gObsService.addObserver(gObserver, aTopic, false);
+ gActiveTopics.push(aTopic);
+ }
+}
+
+
+function removeObserver(aTopic)
+{
+ let idx = gActiveTopics.indexOf(aTopic);
+ if (idx >= 0)
+ {
+ gObsService.removeObserver(gObserver, aTopic);
+ gActiveTopics.splice(idx, 1);
+ }
+}
+
+
+function removeAllObservers()
+{
+ for (let i = gActiveTopics.length - 1; i >= 0; --i)
+ gObsService.removeObserver(gObserver, gActiveTopics[i]);
+
+ gActiveTopics = [];
+}
+
+
function readTorSettings()
{
TorLauncherLogger.log(2, "readTorSettings " +
@@ -641,9 +681,9 @@ function onProxyTypeChange()
function onRestartTor()
{
// Re-add these observers in case they have been removed.
- gObsService.addObserver(gObserver, kTorProcessReadyTopic, false);
- gObsService.addObserver(gObserver, kTorProcessDidNotStartTopic, false);
- gObsService.addObserver(gObserver, kTorProcessExitedTopic, false);
+ addObserver(kTorProcessReadyTopic);
+ addObserver(kTorProcessDidNotStartTopic);
+ addObserver(kTorProcessExitedTopic);
gTorProcessService._startTor();
gTorProcessService._controlTor();
diff --git a/src/chrome/content/network-settings.xul b/src/chrome/content/network-settings.xul
index 1fcd4a7..937db71 100644
--- a/src/chrome/content/network-settings.xul
+++ b/src/chrome/content/network-settings.xul
@@ -24,7 +24,8 @@
ondialogcancel="return onCancel();"
ondialogextra2="onCopyLog();"
ondialoghelp="onOpenHelp();"
- onload="initDialog();">
+ onload="initDialog();"
+ onunload="deinitDialog();">
<script type="application/x-javascript"
src="chrome://torlauncher/content/network-settings.js"/>
More information about the tbb-commits
mailing list