Pier Angelo Vendrame pushed to branch tor-browser-128.6.0esr-14.5-1 at The Tor Project / Applications / Tor Browser
Commits: 21b2be4c by Henry Wilkes at 2025-01-21T15:25:28+00:00 fixup! TB 40597: Implement TorSettings module
TB 41921: Move quickstart setting from TorSettings to TorConnect.
- - - - - cfd39fb0 by Henry Wilkes at 2025-01-21T15:25:29+00:00 fixup! TB 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
TB 41921: Move quickstart setting from TorSettings to TorConnect.
- - - - - 62e7a81f by Henry Wilkes at 2025-01-21T15:25:30+00:00 fixup! TB 27476: Implement about:torconnect captive portal within Tor Browser
TB 41921: Move quickstart setting from TorSettings to TorConnect.
This also means we no longer need to listen for TorSettingsTopics.Ready for the initial value.
Also fix typo in signal name: "quickstart-changed" to "quickstart-change".
- - - - - b5cd602f by Henry Wilkes at 2025-01-21T15:25:31+00:00 fixup! TB 42247: Android helpers for the TorProvider
TB 41921: Move quickstart setting from TorSettings to TorConnect.
- - - - -
5 changed files:
- browser/components/torpreferences/content/connectionPane.js - toolkit/components/torconnect/TorConnectParent.sys.mjs - toolkit/modules/TorAndroidIntegration.sys.mjs - toolkit/modules/TorConnect.sys.mjs - toolkit/modules/TorSettings.sys.mjs
Changes:
===================================== browser/components/torpreferences/content/connectionPane.js ===================================== @@ -2550,12 +2550,10 @@ const gConnectionPane = (function () { "torPreferences-quickstart-toggle" ); this._enableQuickstartCheckbox.addEventListener("command", () => { - TorSettings.changeSettings({ - quickstart: { enabled: this._enableQuickstartCheckbox.checked }, - }); + TorConnect.quickstart = this._enableQuickstartCheckbox.checked; }); - this._enableQuickstartCheckbox.checked = TorSettings.quickstart.enabled; - Services.obs.addObserver(this, TorSettingsTopics.SettingsChanged); + this._enableQuickstartCheckbox.checked = TorConnect.quickstart; + Services.obs.addObserver(this, TorConnectTopics.QuickstartChange);
// Location { @@ -2667,7 +2665,7 @@ const gConnectionPane = (function () { gBridgeSettings.init(); gNetworkStatus.init();
- TorSettings.initializedPromise.then(() => this._populateXUL()); + this._populateXUL();
const onUnload = () => { window.removeEventListener("unload", onUnload); @@ -2681,7 +2679,7 @@ const gConnectionPane = (function () { gNetworkStatus.uninit();
// unregister our observer topics - Services.obs.removeObserver(this, TorSettingsTopics.SettingsChanged); + Services.obs.removeObserver(this, TorConnectTopics.QuickstartChange); Services.obs.removeObserver(this, TorConnectTopics.StageChange); },
@@ -2696,12 +2694,8 @@ const gConnectionPane = (function () {
observe(subject, topic) { switch (topic) { - // triggered when a TorSettings param has changed - case TorSettingsTopics.SettingsChanged: { - if (subject.wrappedJSObject.changes.includes("quickstart.enabled")) { - this._enableQuickstartCheckbox.checked = - TorSettings.quickstart.enabled; - } + case TorConnectTopics.QuickstartChange: { + this._enableQuickstartCheckbox.checked = TorConnect.quickstart; break; } // triggered when tor connect state changes and we may @@ -2713,7 +2707,10 @@ const gConnectionPane = (function () { } },
- onAdvancedSettings() { + async onAdvancedSettings() { + // Ensure TorSettings is complete before loading the dialog, which reads + // from TorSettings. + await TorSettings.initializedPromise; gSubDialog.open( "chrome://browser/content/torpreferences/connectionSettingsDialog.xhtml", { features: "resizable=yes" }
===================================== toolkit/components/torconnect/TorConnectParent.sys.mjs ===================================== @@ -5,10 +5,6 @@ import { TorConnect, TorConnectTopics, } from "resource://gre/modules/TorConnect.sys.mjs"; -import { - TorSettings, - TorSettingsTopics, -} from "resource://gre/modules/TorSettings.sys.mjs";
const lazy = {};
@@ -47,15 +43,10 @@ export class TorConnectParent extends JSWindowActorParent { case TorConnectTopics.BootstrapProgress: self.sendAsyncMessage("torconnect:bootstrap-progress", obj); break; - case TorSettingsTopics.SettingsChanged: - if (!obj.changes.includes("quickstart.enabled")) { - break; - } - // eslint-disable-next-lined no-fallthrough - case TorSettingsTopics.Ready: + case TorConnectTopics.QuickstartChange: self.sendAsyncMessage( - "torconnect:quickstart-changed", - TorSettings.quickstart.enabled + "torconnect:quickstart-change", + TorConnect.quickstart ); break; } @@ -70,10 +61,9 @@ export class TorConnectParent extends JSWindowActorParent { this.torConnectObserver, TorConnectTopics.BootstrapProgress ); - Services.obs.addObserver(this.torConnectObserver, TorSettingsTopics.Ready); Services.obs.addObserver( this.torConnectObserver, - TorSettingsTopics.SettingsChanged + TorConnectTopics.QuickstartChange ); }
@@ -88,11 +78,7 @@ export class TorConnectParent extends JSWindowActorParent { ); Services.obs.removeObserver( this.torConnectObserver, - TorSettingsTopics.Ready - ); - Services.obs.removeObserver( - this.torConnectObserver, - TorSettingsTopics.SettingsChanged + TorConnectTopics.QuickstartChange ); }
@@ -104,7 +90,7 @@ export class TorConnectParent extends JSWindowActorParent { // If there are multiple home pages, just load the first one. return Promise.resolve(TorConnect.fixupURIs(lazy.HomePage.get())[0]); case "torconnect:set-quickstart": - TorSettings.changeSettings({ quickstart: { enabled: message.data } }); + TorConnect.quickstart = message.data; break; case "torconnect:open-tor-preferences": this.browsingContext.top.embedderElement.ownerGlobal.openPreferences( @@ -133,31 +119,16 @@ export class TorConnectParent extends JSWindowActorParent { case "torconnect:cancel-bootstrapping": TorConnect.cancelBootstrapping(); break; - case "torconnect:get-init-args": { + case "torconnect:get-init-args": // Called on AboutTorConnect.init(), pass down all state data it needs // to init. - - let quickstartEnabled = false; - - // Workaround for a race condition, but we should fix it asap. - // about:torconnect is loaded before TorSettings is actually initialized. - // The getter might throw and the page not loaded correctly as a result. - // Silence any warning for now, but we should really fix it. - // See also tor-browser#41921. - try { - quickstartEnabled = TorSettings.quickstart.enabled; - } catch (e) { - // Do not throw. - } - return { TorStrings, Direction: Services.locale.isAppLocaleRTL ? "rtl" : "ltr", CountryNames: TorConnect.countryNames, stage: TorConnect.stage, - quickstartEnabled, + quickstartEnabled: TorConnect.quickstart, }; - } case "torconnect:get-country-codes": return TorConnect.getCountryCodes(); }
===================================== toolkit/modules/TorAndroidIntegration.sys.mjs ===================================== @@ -79,6 +79,23 @@ class TorAndroidIntegrationImpl { } }
+ /** + * Combine the current TorSettings settings with the TorConnect settings. + * + * @returns {object} The TorSettings in an object, which also has a + * `quickstart.enabled` property. + */ + // This is added for backward compatibility with TorSettings.getSettings prior + // to tor-browser#41921, when it used to control the quickstart setting. + // TODO: Have android separate out the request for TorConnect.quickstart. In + // principle, this would allow android tor connect UI to be loaded before + // TorSettings has initialized (the SettingsReady signal), similar to desktop. + // See tor-browser#43408. + #getAllSettings() { + const settings = lazy.TorSettings.getSettings(); + settings.quickstart = { enabled: lazy.TorConnect.quickstart }; + } + observe(subj, topic) { switch (topic) { // TODO: Replace with StageChange. @@ -120,7 +137,7 @@ class TorAndroidIntegrationImpl { case lazy.TorSettingsTopics.Ready: lazy.EventDispatcher.instance.sendRequest({ type: EmittedEvents.settingsReady, - settings: lazy.TorSettings.getSettings(), + settings: this.#getAllSettings(), }); break; case lazy.TorSettingsTopics.SettingsChanged: @@ -129,7 +146,20 @@ class TorAndroidIntegrationImpl { lazy.EventDispatcher.instance.sendRequest({ type: EmittedEvents.settingsChanged, changes: subj.wrappedJSObject.changes ?? [], - settings: lazy.TorSettings.getSettings(), + settings: this.#getAllSettings(), + }); + break; + case lazy.TorConnectTopics.QuickstartChange: + // We also include the TorSettings, and a `changes` Array similar to + // SettingsChanged signal. This is for backward compatibility with + // TorSettings.getSettings prior to tor-browser#41921, when it used to + // control the quickstart setting. + // TODO: Have android separate out the request for TorConnect.quickstart. + // See tor-browser#43408. + lazy.EventDispatcher.instance.sendRequest({ + type: EmittedEvents.settingsChanged, + changes: ["quickstart.enabled"], + settings: this.#getAllSettings(), }); break; } @@ -140,9 +170,19 @@ class TorAndroidIntegrationImpl { try { switch (event) { case ListenedEvents.settingsGet: - callback?.onSuccess(lazy.TorSettings.getSettings()); + callback?.onSuccess(this.#getAllSettings()); return; case ListenedEvents.settingsSet: + // TODO: Set quickstart via a separate event. See tor-browser#43408. + // NOTE: Currently this may trigger GeckoView:Tor:SettingsChanged + // twice: once for quickstart.enabled, and again for the other + // settings. + if ( + "quickstart" in data.settings && + "enabled" in data.settings.quickstart + ) { + lazy.TorConnect.quickstart = data.settings.quickstart.enabled; + } // TODO: Handle setting throw? This can throw if data.settings is // incorrectly formatted, but more like it can throw when the settings // fail to be passed onto the TorProvider. tor-browser#43405.
===================================== toolkit/modules/TorConnect.sys.mjs ===================================== @@ -22,6 +22,7 @@ const TorConnectPrefs = Object.freeze({ log_level: "torbrowser.bootstrap.log_level", /* prompt_at_startup now controls whether the quickstart can trigger. */ prompt_at_startup: "extensions.torlauncher.prompt_at_startup", + quickstart: "torbrowser.settings.quickstart.enabled", });
export const TorConnectState = Object.freeze({ @@ -80,6 +81,7 @@ export const TorConnectTopics = Object.freeze({ StageChange: "torconnect:stage-change", // TODO: Remove torconnect:state-change when pages have switched to stage. StateChange: "torconnect:state-change", + QuickstartChange: "torconnect:quickstart-change", BootstrapProgress: "torconnect:bootstrap-progress", BootstrapComplete: "torconnect:bootstrap-complete", // TODO: Remove torconnect:error when pages have switched to stage. @@ -1066,8 +1068,12 @@ export const TorConnect = { // shouldQuickStart would be `false`. // NOTE: At this point, _requestedStage should still be `null`. this._setStage(TorConnectStage.Start); - if (this.shouldQuickStart) { - // Quickstart + if ( + // Quickstart setting is enabled. + this.quickstart && + // And the previous bootstrap attempt must have succeeded. + !Services.prefs.getBoolPref(TorConnectPrefs.prompt_at_startup, true) + ) { this.beginBootstrapping(); } }, @@ -1120,6 +1126,25 @@ export const TorConnect = { return lazy.TorLauncherUtil.shouldStartAndOwnTor; },
+ /** + * Whether bootstrapping can begin immediately once Tor Browser has been + * opened. + * + * @type {boolean} + */ + get quickstart() { + return Services.prefs.getBoolPref(TorConnectPrefs.quickstart, false); + }, + + set quickstart(enabled) { + enabled = Boolean(enabled); + if (enabled === this.quickstart) { + return; + } + Services.prefs.setBoolPref(TorConnectPrefs.quickstart, enabled); + Services.obs.notifyObservers(null, TorConnectTopics.QuickstartChange); + }, + get shouldShowTorConnect() { // TorBrowser must control the daemon return ( @@ -1163,15 +1188,6 @@ export const TorConnect = { ); },
- get shouldQuickStart() { - // quickstart must be enabled - return ( - lazy.TorSettings.quickstart.enabled && - // and the previous bootstrap attempt must have succeeded - !Services.prefs.getBoolPref(TorConnectPrefs.prompt_at_startup, true) - ); - }, - // TODO: Remove when all pages have switched to "stage". get state() { // There is no "Error" stage, but about:torconnect relies on receiving the
===================================== toolkit/modules/TorSettings.sys.mjs ===================================== @@ -27,10 +27,8 @@ export const TorSettingsTopics = Object.freeze({
/* Prefs used to store settings in TorBrowser prefs */ const TorSettingsPrefs = Object.freeze({ - quickstart: { - /* bool: does tor connect automatically on launch */ - enabled: "torbrowser.settings.quickstart.enabled", - }, + // NOTE: torbrowser.settings.quickstart.enabled used to be managed by + // TorSettings but was moved to TorConnect.quickstart in tor-browser#41921. bridges: { /* bool: does tor use bridges */ enabled: "torbrowser.settings.bridges.enabled", @@ -173,9 +171,6 @@ class TorSettingsImpl { * @type {object} */ #settings = { - quickstart: { - enabled: false, - }, bridges: { /** * Whether the bridges are enabled or not. @@ -579,11 +574,6 @@ class TorSettingsImpl { #loadFromPrefs() { lazy.logger.debug("loadFromPrefs()");
- /* Quickstart */ - this.#settings.quickstart.enabled = Services.prefs.getBoolPref( - TorSettingsPrefs.quickstart.enabled, - false - ); /* Bridges */ const bridges = {}; bridges.enabled = Services.prefs.getBoolPref( @@ -691,11 +681,6 @@ class TorSettingsImpl {
this.#checkIfInitialized();
- /* Quickstart */ - Services.prefs.setBoolPref( - TorSettingsPrefs.quickstart.enabled, - this.#settings.quickstart.enabled - ); /* Bridges */ Services.prefs.setBoolPref( TorSettingsPrefs.bridges.enabled, @@ -928,7 +913,6 @@ class TorSettingsImpl { * * It is possible to set all settings, or only some sections: * - * + quickstart.enabled can be set individually. * + bridges.enabled can be set individually. * + bridges.source can be set with a corresponding bridge specification for * the source (bridge_strings, lox_id, builtin_type). @@ -968,14 +952,6 @@ class TorSettingsImpl { changes.push(`${group}.${prop}`); };
- if ("quickstart" in newValues && "enabled" in newValues.quickstart) { - changeSetting( - "quickstart", - "enabled", - Boolean(newValues.quickstart.enabled) - ); - } - if ("bridges" in newValues) { if ("source" in newValues.bridges) { this.#fixupBridgeSettings(newValues.bridges); @@ -1048,11 +1024,7 @@ class TorSettingsImpl { // saved the preferences we send the new settings to TorProvider. // Some properties are unread by TorProvider. So if only these values change // there is no need to re-apply the settings. - const unreadProps = [ - "quickstart.enabled", - "bridges.builtin_type", - "bridges.lox_id", - ]; + const unreadProps = ["bridges.builtin_type", "bridges.lox_id"]; const shouldApply = changes.some(prop => !unreadProps.includes(prop)); if (shouldApply) { await this.#applySettings(true);
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/7a98943...
tor-commits@lists.torproject.org