commit a4e2202fedb82e19d931cfaebf0dec9092a5480d Author: Richard Pospesel richard@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", + ], }, },