[tor-commits] [tor-browser/tor-browser-78.11.0esr-10.5-1] fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
sysrqb at torproject.org
sysrqb at torproject.org
Thu Jun 10 20:13:01 UTC 2021
commit a4e2202fedb82e19d931cfaebf0dec9092a5480d
Author: Richard Pospesel <richard at torproject.org>
Date: Tue Jun 8 18:08:00 2021 +0200
fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
---
browser/components/torconnect/TorConnectParent.jsm | 14 ++++++
.../torconnect/content/aboutTorConnect.css | 4 ++
.../torconnect/content/aboutTorConnect.js | 50 ++++++++++++++++++++--
.../torconnect/content/aboutTorConnect.xhtml | 5 +++
.../components/torpreferences/content/torPane.js | 45 ++++++++++++++++---
.../torpreferences/content/torPane.xhtml | 10 +++--
browser/modules/TorStrings.jsm | 3 ++
toolkit/modules/AsyncPrefs.jsm | 2 +
toolkit/modules/RemotePageAccessManager.jsm | 7 +++
9 files changed, 129 insertions(+), 11 deletions(-)
diff --git a/browser/components/torconnect/TorConnectParent.jsm b/browser/components/torconnect/TorConnectParent.jsm
index 03b258608b5c..f775507a744f 100644
--- a/browser/components/torconnect/TorConnectParent.jsm
+++ b/browser/components/torconnect/TorConnectParent.jsm
@@ -29,6 +29,10 @@ const gActiveTopics = [
kTorLogHasWarnOrErrTopic,
];
+const gTorLauncherPrefs = {
+ quickstart: "extensions.torlauncher.quickstart",
+}
+
class TorConnectParent extends JSWindowActorParent {
constructor(...args) {
super(...args);
@@ -47,6 +51,16 @@ class TorConnectParent extends JSWindowActorParent {
for (const topic of gActiveTopics) {
Services.obs.addObserver(this.gObserver, topic);
}
+
+ this.quickstartObserver = {
+ observe(aSubject, aTopic, aData) {
+ if (aTopic === "nsPref:changed" &&
+ aData == gTorLauncherPrefs.quickstart) {
+ self.sendAsyncMessage("TorQuickstartPrefChanged", Services.prefs.getBoolPref(gTorLauncherPrefs.quickstart));
+ }
+ },
+ }
+ Services.prefs.addObserver(gTorLauncherPrefs.quickstart, this.quickstartObserver);
}
willDestroy() {
diff --git a/browser/components/torconnect/content/aboutTorConnect.css b/browser/components/torconnect/content/aboutTorConnect.css
index eb4277f2ce5e..2081d4f6c4b8 100644
--- a/browser/components/torconnect/content/aboutTorConnect.css
+++ b/browser/components/torconnect/content/aboutTorConnect.css
@@ -35,6 +35,10 @@
width: 50%;
}
+#quickstartCheckbox, #quickstartCheckboxLabel {
+ vertical-align: middle;
+}
+
#copyLogButton {
position: relative;
}
diff --git a/browser/components/torconnect/content/aboutTorConnect.js b/browser/components/torconnect/content/aboutTorConnect.js
index ad398ccd86f9..5089bbc9363b 100644
--- a/browser/components/torconnect/content/aboutTorConnect.js
+++ b/browser/components/torconnect/content/aboutTorConnect.js
@@ -8,6 +8,12 @@ const kTorProcessDidNotStartTopic = "TorProcessDidNotStart";
const kTorBootstrapStatusTopic = "TorBootstrapStatus";
const kTorBootstrapErrorTopic = "TorBootstrapError";
const kTorLogHasWarnOrErrTopic = "TorLogHasWarnOrErr";
+const kTorQuickstartPrefChanged = "TorQuickstartPrefChanged";
+
+const TorLauncherPrefs = {
+ quickstart: "extensions.torlauncher.quickstart",
+ prompt_at_startup: "extensions.torlauncher.prompt_at_startup",
+}
class AboutTorConnect {
log(...args) {
@@ -34,6 +40,12 @@ class AboutTorConnect {
get elemProgressMeter() {
return this.getElem("progressBackground");
}
+ get elemQuickstartCheckbox() {
+ return this.getElem("quickstartCheckbox");
+ }
+ get elemQuickstartLabel() {
+ return this.getElem("quickstartCheckboxLabel");
+ }
get elemConnectButton() {
return this.getElem("connectButton");
}
@@ -82,7 +94,7 @@ class AboutTorConnect {
setInitialUI() {
this.setTitle(this.torStrings.torConnect.torConnect);
this.elemProgressDesc.textContent =
- this.torStrings.settings.torPreferencesDescription;
+ this.torStrings.settings.quickstartDescription;
this.showElem(this.elemConnectButton);
this.showElem(this.elemAdvancedButton);
this.hideElem(this.elemCopyLogButton);
@@ -223,12 +235,19 @@ class AboutTorConnect {
document.title = title;
}
- initButtons() {
+ async initElements() {
this.elemAdvancedButton.textContent = this.torStrings.torConnect.torConfigure;
this.elemAdvancedButton.addEventListener("click", () => {
RPMSendAsyncMessage("OpenTorAdvancedPreferences");
});
+ this.elemQuickstartLabel.textContent = this.torStrings.settings.quickstartCheckbox;
+ this.elemQuickstartCheckbox.addEventListener("change", () => {
+ const quickstart = this.elemQuickstartCheckbox.checked;
+ RPMSetBoolPref(TorLauncherPrefs.quickstart, quickstart);
+ });
+ this.elemQuickstartCheckbox.checked = await RPMGetBoolPref(TorLauncherPrefs.quickstart);
+
this.elemConnectButton.textContent =
this.torStrings.torConnect.torConnectButton;
this.elemConnectButton.addEventListener("click", () => {
@@ -277,6 +296,21 @@ class AboutTorConnect {
RPMAddMessageListener(kTorBootstrapStatusTopic, ({ data }) => {
this.updateBootstrapProgress(data);
});
+ RPMAddMessageListener(kTorQuickstartPrefChanged, ({ data }) => {
+ // update checkbox with latest quickstart pref value
+ this.elemQuickstartCheckbox.checked = data;
+ })
+ }
+
+ initKeyboardShortcuts() {
+ document.onkeydown = (evt) => {
+ // unfortunately it looks like we still haven't standardized keycodes to
+ // integers, so we must resort to a string compare here :(
+ // see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code for relevant documentation
+ if (evt.code === "Escape") {
+ this.stopTorBootstrap();
+ }
+ };
}
async init() {
@@ -285,13 +319,23 @@ class AboutTorConnect {
"dir",
await RPMSendQuery("GetDirection")
);
- this.initButtons();
+ this.initElements();
this.initObservers();
+ this.initKeyboardShortcuts();
this.state = AboutTorConnect.STATE_INITIAL;
// Request the most recent bootstrap status info so that a
// TorBootstrapStatus notification is generated as soon as possible.
RPMSendAsyncMessage("TorRetrieveBootstrapStatus");
+
+ // quickstart is the user set pref for starting tor automatically
+ // prompt_at_startup will be set to false after successful bootstrap, and true on error
+ // by tor-launcher, so we want to keep the connect screen up when prompt_at_startup is true
+ /// even if quickstart is enabled so user can potentially resolve errors on next launch
+ if (await RPMGetBoolPref(TorLauncherPrefs.quickstart) &&
+ !await RPMGetBoolPref(TorLauncherPrefs.prompt_at_startup)) {
+ this.connect();
+ }
}
}
diff --git a/browser/components/torconnect/content/aboutTorConnect.xhtml b/browser/components/torconnect/content/aboutTorConnect.xhtml
index e0f813f62d67..d12c896c8959 100644
--- a/browser/components/torconnect/content/aboutTorConnect.xhtml
+++ b/browser/components/torconnect/content/aboutTorConnect.xhtml
@@ -28,6 +28,11 @@
</div>
</div>
+ <div id="quickstartContainer">
+ <input id="quickstartCheckbox" type="checkbox" />
+ <label id="quickstartCheckboxLabel" for="quickstartCheckbox"/>
+ </div>
+
<div id="connectButtonContainer" class="button-container">
<button id="advancedButton" hidden="true"></button>
<button id="copyLogButton" hidden="true">
diff --git a/browser/components/torpreferences/content/torPane.js b/browser/components/torpreferences/content/torPane.js
index 66213ceb7789..63db876a7ccd 100644
--- a/browser/components/torpreferences/content/torPane.js
+++ b/browser/components/torpreferences/content/torPane.js
@@ -53,6 +53,10 @@ const { parsePort, parseBridgeStrings, parsePortList } = ChromeUtils.import(
"chrome://browser/content/torpreferences/parseFunctions.jsm"
);
+const TorLauncherPrefs = {
+ quickstart: "extensions.torlauncher.quickstart",
+}
+
/*
Tor Pane
@@ -71,8 +75,12 @@ const gTorPane = (function() {
},
torPreferences: {
header: "h1#torPreferences-header",
- description: "span#torPreferences-description",
- learnMore: "label#torPreferences-learnMore",
+ },
+ quickstart: {
+ header: "h2#torPreferences-quickstart-header",
+ description: "span#torPreferences-quickstart-description",
+ learnMore: "label#torPreferences-quickstart-learnMore",
+ enableQuickstartCheckbox: "checkbox#torPreferences-quickstart-toggle",
},
bridges: {
header: "h2#torPreferences-bridges-header",
@@ -122,6 +130,7 @@ const gTorPane = (function() {
_messageBox: null,
_messageBoxMessage: null,
_messageBoxButton: null,
+ _enableQuickstartCheckbox: null,
_useBridgeCheckbox: null,
_bridgeSelectionRadiogroup: null,
_builtinBridgeOption: null,
@@ -210,11 +219,15 @@ const gTorPane = (function() {
// Heading
prefpane.querySelector(selectors.torPreferences.header).innerText =
TorStrings.settings.torPreferencesHeading;
- prefpane.querySelector(selectors.torPreferences.description).textContent =
- TorStrings.settings.torPreferencesDescription;
+
+ // Quickstart
+ prefpane.querySelector(selectors.quickstart.header).innerText =
+ TorStrings.settings.quickstartHeading;
+ prefpane.querySelector(selectors.quickstart.description).textContent =
+ TorStrings.settings.quickstartDescription;
{
let learnMore = prefpane.querySelector(
- selectors.torPreferences.learnMore
+ selectors.quickstart.learnMore
);
learnMore.setAttribute("value", TorStrings.settings.learnMore);
learnMore.setAttribute(
@@ -222,6 +235,19 @@ const gTorPane = (function() {
TorStrings.settings.learnMoreTorBrowserURL
);
}
+ this._enableQuickstartCheckbox = prefpane.querySelector(
+ selectors.quickstart.enableQuickstartCheckbox
+ );
+ this._enableQuickstartCheckbox.setAttribute(
+ "label",
+ TorStrings.settings.quickstartCheckbox
+ );
+ this._enableQuickstartCheckbox.addEventListener("command", e => {
+ const checked = this._enableQuickstartCheckbox.checked;
+ Services.prefs.setBoolPref(TorLauncherPrefs.quickstart, checked);
+ });
+ this._enableQuickstartCheckbox.checked = Services.prefs.getBoolPref(TorLauncherPrefs.quickstart);
+ Services.prefs.addObserver(TorLauncherPrefs.quickstart, this);
// Bridge setup
prefpane.querySelector(selectors.bridges.header).innerText =
@@ -583,6 +609,15 @@ const gTorPane = (function() {
// Callbacks
//
+ // callback for when the quickstart pref changes
+ observe(subject, topic, data) {
+ if (topic != "nsPref:changed") return;
+ if (data === TorLauncherPrefs.quickstart) {
+ this._enableQuickstartCheckbox.checked =
+ Services.prefs.getBoolPref(TorLauncherPrefs.quickstart);
+ }
+ },
+
// callback when using bridges toggled
onToggleBridge(enabled) {
this._useBridgeCheckbox.checked = enabled;
diff --git a/browser/components/torpreferences/content/torPane.xhtml b/browser/components/torpreferences/content/torPane.xhtml
index 88f82c37a3c9..996325e08bf7 100644
--- a/browser/components/torpreferences/content/torPane.xhtml
+++ b/browser/components/torpreferences/content/torPane.xhtml
@@ -33,12 +33,16 @@
<html:h1 id="torPreferences-header"/>
</hbox>
-<groupbox data-category="paneTor"
+<!-- Quickstart -->
+<groupbox id="torPreferences-quickstart-group"
+ data-category="paneTor"
hidden="true">
+ <html:h2 id="torPreferences-quickstart-header"/>
<description flex="1">
- <html:span id="torPreferences-description" class="tail-with-learn-more"/>
- <label id="torPreferences-learnMore" class="learnMore text-link" is="text-link"/>
+ <html:span id="torPreferences-quickstart-description"/>
+ <label id="torPreferences-quickstart-learnMore" class="learnMore text-link" is="text-link"/>
</description>
+ <checkbox id="torPreferences-quickstart-toggle"/>
</groupbox>
<!-- Bridges -->
diff --git a/browser/modules/TorStrings.jsm b/browser/modules/TorStrings.jsm
index 407a220278c4..e7597bbfa74f 100644
--- a/browser/modules/TorStrings.jsm
+++ b/browser/modules/TorStrings.jsm
@@ -257,6 +257,9 @@ var TorStrings = {
"Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world."
),
learnMore: getString("torPreferences.learnMore", "Learn More"),
+ quickstartHeading: getString("torPreferences.quickstart", "Quickstart"),
+ quickstartDescription: getString("torPreferences.quickstartDescription", "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world. Quickstart allows Tor Browser to connect automatically."),
+ quickstartCheckbox : getString("torPreferences.quickstartCheckbox", "Always connect automatically"),
bridgesHeading: getString("torPreferences.bridges", "Bridges"),
bridgesDescription: getString(
"torPreferences.bridgesDescription",
diff --git a/toolkit/modules/AsyncPrefs.jsm b/toolkit/modules/AsyncPrefs.jsm
index aca86556cd5e..b81ff5e22b9b 100644
--- a/toolkit/modules/AsyncPrefs.jsm
+++ b/toolkit/modules/AsyncPrefs.jsm
@@ -18,6 +18,8 @@ const kAllowedPrefs = new Set([
"testing.allowed-prefs.some-char-pref",
"testing.allowed-prefs.some-int-pref",
+ "extensions.torlauncher.quickstart",
+
"narrate.rate",
"narrate.voice",
diff --git a/toolkit/modules/RemotePageAccessManager.jsm b/toolkit/modules/RemotePageAccessManager.jsm
index 8a6c0911a060..ee21aa7a750f 100644
--- a/toolkit/modules/RemotePageAccessManager.jsm
+++ b/toolkit/modules/RemotePageAccessManager.jsm
@@ -198,6 +198,13 @@ let RemotePageAccessManager = {
"TorIsNetworkDisabled",
"TorLogHasWarnOrErr",
],
+ RPMGetBoolPref: [
+ "extensions.torlauncher.quickstart",
+ "extensions.torlauncher.prompt_at_startup",
+ ],
+ RPMSetBoolPref: [
+ "extensions.torlauncher.quickstart",
+ ],
},
},
More information about the tor-commits
mailing list