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
-
cfd39fb0
by Henry Wilkes at 2025-01-21T15:25:29+00:00
-
62e7a81f
by Henry Wilkes at 2025-01-21T15:25:30+00:00
-
b5cd602f
by Henry Wilkes at 2025-01-21T15:25:31+00:00
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:
... | ... | @@ -2550,12 +2550,10 @@ const gConnectionPane = (function () { |
2550 | 2550 | "torPreferences-quickstart-toggle"
|
2551 | 2551 | );
|
2552 | 2552 | this._enableQuickstartCheckbox.addEventListener("command", () => {
|
2553 | - TorSettings.changeSettings({
|
|
2554 | - quickstart: { enabled: this._enableQuickstartCheckbox.checked },
|
|
2555 | - });
|
|
2553 | + TorConnect.quickstart = this._enableQuickstartCheckbox.checked;
|
|
2556 | 2554 | });
|
2557 | - this._enableQuickstartCheckbox.checked = TorSettings.quickstart.enabled;
|
|
2558 | - Services.obs.addObserver(this, TorSettingsTopics.SettingsChanged);
|
|
2555 | + this._enableQuickstartCheckbox.checked = TorConnect.quickstart;
|
|
2556 | + Services.obs.addObserver(this, TorConnectTopics.QuickstartChange);
|
|
2559 | 2557 | |
2560 | 2558 | // Location
|
2561 | 2559 | {
|
... | ... | @@ -2667,7 +2665,7 @@ const gConnectionPane = (function () { |
2667 | 2665 | gBridgeSettings.init();
|
2668 | 2666 | gNetworkStatus.init();
|
2669 | 2667 | |
2670 | - TorSettings.initializedPromise.then(() => this._populateXUL());
|
|
2668 | + this._populateXUL();
|
|
2671 | 2669 | |
2672 | 2670 | const onUnload = () => {
|
2673 | 2671 | window.removeEventListener("unload", onUnload);
|
... | ... | @@ -2681,7 +2679,7 @@ const gConnectionPane = (function () { |
2681 | 2679 | gNetworkStatus.uninit();
|
2682 | 2680 | |
2683 | 2681 | // unregister our observer topics
|
2684 | - Services.obs.removeObserver(this, TorSettingsTopics.SettingsChanged);
|
|
2682 | + Services.obs.removeObserver(this, TorConnectTopics.QuickstartChange);
|
|
2685 | 2683 | Services.obs.removeObserver(this, TorConnectTopics.StageChange);
|
2686 | 2684 | },
|
2687 | 2685 | |
... | ... | @@ -2696,12 +2694,8 @@ const gConnectionPane = (function () { |
2696 | 2694 | |
2697 | 2695 | observe(subject, topic) {
|
2698 | 2696 | switch (topic) {
|
2699 | - // triggered when a TorSettings param has changed
|
|
2700 | - case TorSettingsTopics.SettingsChanged: {
|
|
2701 | - if (subject.wrappedJSObject.changes.includes("quickstart.enabled")) {
|
|
2702 | - this._enableQuickstartCheckbox.checked =
|
|
2703 | - TorSettings.quickstart.enabled;
|
|
2704 | - }
|
|
2697 | + case TorConnectTopics.QuickstartChange: {
|
|
2698 | + this._enableQuickstartCheckbox.checked = TorConnect.quickstart;
|
|
2705 | 2699 | break;
|
2706 | 2700 | }
|
2707 | 2701 | // triggered when tor connect state changes and we may
|
... | ... | @@ -2713,7 +2707,10 @@ const gConnectionPane = (function () { |
2713 | 2707 | }
|
2714 | 2708 | },
|
2715 | 2709 | |
2716 | - onAdvancedSettings() {
|
|
2710 | + async onAdvancedSettings() {
|
|
2711 | + // Ensure TorSettings is complete before loading the dialog, which reads
|
|
2712 | + // from TorSettings.
|
|
2713 | + await TorSettings.initializedPromise;
|
|
2717 | 2714 | gSubDialog.open(
|
2718 | 2715 | "chrome://browser/content/torpreferences/connectionSettingsDialog.xhtml",
|
2719 | 2716 | { features: "resizable=yes" }
|
... | ... | @@ -5,10 +5,6 @@ import { |
5 | 5 | TorConnect,
|
6 | 6 | TorConnectTopics,
|
7 | 7 | } from "resource://gre/modules/TorConnect.sys.mjs";
|
8 | -import {
|
|
9 | - TorSettings,
|
|
10 | - TorSettingsTopics,
|
|
11 | -} from "resource://gre/modules/TorSettings.sys.mjs";
|
|
12 | 8 | |
13 | 9 | const lazy = {};
|
14 | 10 | |
... | ... | @@ -47,15 +43,10 @@ export class TorConnectParent extends JSWindowActorParent { |
47 | 43 | case TorConnectTopics.BootstrapProgress:
|
48 | 44 | self.sendAsyncMessage("torconnect:bootstrap-progress", obj);
|
49 | 45 | break;
|
50 | - case TorSettingsTopics.SettingsChanged:
|
|
51 | - if (!obj.changes.includes("quickstart.enabled")) {
|
|
52 | - break;
|
|
53 | - }
|
|
54 | - // eslint-disable-next-lined no-fallthrough
|
|
55 | - case TorSettingsTopics.Ready:
|
|
46 | + case TorConnectTopics.QuickstartChange:
|
|
56 | 47 | self.sendAsyncMessage(
|
57 | - "torconnect:quickstart-changed",
|
|
58 | - TorSettings.quickstart.enabled
|
|
48 | + "torconnect:quickstart-change",
|
|
49 | + TorConnect.quickstart
|
|
59 | 50 | );
|
60 | 51 | break;
|
61 | 52 | }
|
... | ... | @@ -70,10 +61,9 @@ export class TorConnectParent extends JSWindowActorParent { |
70 | 61 | this.torConnectObserver,
|
71 | 62 | TorConnectTopics.BootstrapProgress
|
72 | 63 | );
|
73 | - Services.obs.addObserver(this.torConnectObserver, TorSettingsTopics.Ready);
|
|
74 | 64 | Services.obs.addObserver(
|
75 | 65 | this.torConnectObserver,
|
76 | - TorSettingsTopics.SettingsChanged
|
|
66 | + TorConnectTopics.QuickstartChange
|
|
77 | 67 | );
|
78 | 68 | }
|
79 | 69 | |
... | ... | @@ -88,11 +78,7 @@ export class TorConnectParent extends JSWindowActorParent { |
88 | 78 | );
|
89 | 79 | Services.obs.removeObserver(
|
90 | 80 | this.torConnectObserver,
|
91 | - TorSettingsTopics.Ready
|
|
92 | - );
|
|
93 | - Services.obs.removeObserver(
|
|
94 | - this.torConnectObserver,
|
|
95 | - TorSettingsTopics.SettingsChanged
|
|
81 | + TorConnectTopics.QuickstartChange
|
|
96 | 82 | );
|
97 | 83 | }
|
98 | 84 | |
... | ... | @@ -104,7 +90,7 @@ export class TorConnectParent extends JSWindowActorParent { |
104 | 90 | // If there are multiple home pages, just load the first one.
|
105 | 91 | return Promise.resolve(TorConnect.fixupURIs(lazy.HomePage.get())[0]);
|
106 | 92 | case "torconnect:set-quickstart":
|
107 | - TorSettings.changeSettings({ quickstart: { enabled: message.data } });
|
|
93 | + TorConnect.quickstart = message.data;
|
|
108 | 94 | break;
|
109 | 95 | case "torconnect:open-tor-preferences":
|
110 | 96 | this.browsingContext.top.embedderElement.ownerGlobal.openPreferences(
|
... | ... | @@ -133,31 +119,16 @@ export class TorConnectParent extends JSWindowActorParent { |
133 | 119 | case "torconnect:cancel-bootstrapping":
|
134 | 120 | TorConnect.cancelBootstrapping();
|
135 | 121 | break;
|
136 | - case "torconnect:get-init-args": {
|
|
122 | + case "torconnect:get-init-args":
|
|
137 | 123 | // Called on AboutTorConnect.init(), pass down all state data it needs
|
138 | 124 | // to init.
|
139 | - |
|
140 | - let quickstartEnabled = false;
|
|
141 | - |
|
142 | - // Workaround for a race condition, but we should fix it asap.
|
|
143 | - // about:torconnect is loaded before TorSettings is actually initialized.
|
|
144 | - // The getter might throw and the page not loaded correctly as a result.
|
|
145 | - // Silence any warning for now, but we should really fix it.
|
|
146 | - // See also tor-browser#41921.
|
|
147 | - try {
|
|
148 | - quickstartEnabled = TorSettings.quickstart.enabled;
|
|
149 | - } catch (e) {
|
|
150 | - // Do not throw.
|
|
151 | - }
|
|
152 | - |
|
153 | 125 | return {
|
154 | 126 | TorStrings,
|
155 | 127 | Direction: Services.locale.isAppLocaleRTL ? "rtl" : "ltr",
|
156 | 128 | CountryNames: TorConnect.countryNames,
|
157 | 129 | stage: TorConnect.stage,
|
158 | - quickstartEnabled,
|
|
130 | + quickstartEnabled: TorConnect.quickstart,
|
|
159 | 131 | };
|
160 | - }
|
|
161 | 132 | case "torconnect:get-country-codes":
|
162 | 133 | return TorConnect.getCountryCodes();
|
163 | 134 | }
|
... | ... | @@ -79,6 +79,23 @@ class TorAndroidIntegrationImpl { |
79 | 79 | }
|
80 | 80 | }
|
81 | 81 | |
82 | + /**
|
|
83 | + * Combine the current TorSettings settings with the TorConnect settings.
|
|
84 | + *
|
|
85 | + * @returns {object} The TorSettings in an object, which also has a
|
|
86 | + * `quickstart.enabled` property.
|
|
87 | + */
|
|
88 | + // This is added for backward compatibility with TorSettings.getSettings prior
|
|
89 | + // to tor-browser#41921, when it used to control the quickstart setting.
|
|
90 | + // TODO: Have android separate out the request for TorConnect.quickstart. In
|
|
91 | + // principle, this would allow android tor connect UI to be loaded before
|
|
92 | + // TorSettings has initialized (the SettingsReady signal), similar to desktop.
|
|
93 | + // See tor-browser#43408.
|
|
94 | + #getAllSettings() {
|
|
95 | + const settings = lazy.TorSettings.getSettings();
|
|
96 | + settings.quickstart = { enabled: lazy.TorConnect.quickstart };
|
|
97 | + }
|
|
98 | + |
|
82 | 99 | observe(subj, topic) {
|
83 | 100 | switch (topic) {
|
84 | 101 | // TODO: Replace with StageChange.
|
... | ... | @@ -120,7 +137,7 @@ class TorAndroidIntegrationImpl { |
120 | 137 | case lazy.TorSettingsTopics.Ready:
|
121 | 138 | lazy.EventDispatcher.instance.sendRequest({
|
122 | 139 | type: EmittedEvents.settingsReady,
|
123 | - settings: lazy.TorSettings.getSettings(),
|
|
140 | + settings: this.#getAllSettings(),
|
|
124 | 141 | });
|
125 | 142 | break;
|
126 | 143 | case lazy.TorSettingsTopics.SettingsChanged:
|
... | ... | @@ -129,7 +146,20 @@ class TorAndroidIntegrationImpl { |
129 | 146 | lazy.EventDispatcher.instance.sendRequest({
|
130 | 147 | type: EmittedEvents.settingsChanged,
|
131 | 148 | changes: subj.wrappedJSObject.changes ?? [],
|
132 | - settings: lazy.TorSettings.getSettings(),
|
|
149 | + settings: this.#getAllSettings(),
|
|
150 | + });
|
|
151 | + break;
|
|
152 | + case lazy.TorConnectTopics.QuickstartChange:
|
|
153 | + // We also include the TorSettings, and a `changes` Array similar to
|
|
154 | + // SettingsChanged signal. This is for backward compatibility with
|
|
155 | + // TorSettings.getSettings prior to tor-browser#41921, when it used to
|
|
156 | + // control the quickstart setting.
|
|
157 | + // TODO: Have android separate out the request for TorConnect.quickstart.
|
|
158 | + // See tor-browser#43408.
|
|
159 | + lazy.EventDispatcher.instance.sendRequest({
|
|
160 | + type: EmittedEvents.settingsChanged,
|
|
161 | + changes: ["quickstart.enabled"],
|
|
162 | + settings: this.#getAllSettings(),
|
|
133 | 163 | });
|
134 | 164 | break;
|
135 | 165 | }
|
... | ... | @@ -140,9 +170,19 @@ class TorAndroidIntegrationImpl { |
140 | 170 | try {
|
141 | 171 | switch (event) {
|
142 | 172 | case ListenedEvents.settingsGet:
|
143 | - callback?.onSuccess(lazy.TorSettings.getSettings());
|
|
173 | + callback?.onSuccess(this.#getAllSettings());
|
|
144 | 174 | return;
|
145 | 175 | case ListenedEvents.settingsSet:
|
176 | + // TODO: Set quickstart via a separate event. See tor-browser#43408.
|
|
177 | + // NOTE: Currently this may trigger GeckoView:Tor:SettingsChanged
|
|
178 | + // twice: once for quickstart.enabled, and again for the other
|
|
179 | + // settings.
|
|
180 | + if (
|
|
181 | + "quickstart" in data.settings &&
|
|
182 | + "enabled" in data.settings.quickstart
|
|
183 | + ) {
|
|
184 | + lazy.TorConnect.quickstart = data.settings.quickstart.enabled;
|
|
185 | + }
|
|
146 | 186 | // TODO: Handle setting throw? This can throw if data.settings is
|
147 | 187 | // incorrectly formatted, but more like it can throw when the settings
|
148 | 188 | // fail to be passed onto the TorProvider. tor-browser#43405.
|
... | ... | @@ -22,6 +22,7 @@ const TorConnectPrefs = Object.freeze({ |
22 | 22 | log_level: "torbrowser.bootstrap.log_level",
|
23 | 23 | /* prompt_at_startup now controls whether the quickstart can trigger. */
|
24 | 24 | prompt_at_startup: "extensions.torlauncher.prompt_at_startup",
|
25 | + quickstart: "torbrowser.settings.quickstart.enabled",
|
|
25 | 26 | });
|
26 | 27 | |
27 | 28 | export const TorConnectState = Object.freeze({
|
... | ... | @@ -80,6 +81,7 @@ export const TorConnectTopics = Object.freeze({ |
80 | 81 | StageChange: "torconnect:stage-change",
|
81 | 82 | // TODO: Remove torconnect:state-change when pages have switched to stage.
|
82 | 83 | StateChange: "torconnect:state-change",
|
84 | + QuickstartChange: "torconnect:quickstart-change",
|
|
83 | 85 | BootstrapProgress: "torconnect:bootstrap-progress",
|
84 | 86 | BootstrapComplete: "torconnect:bootstrap-complete",
|
85 | 87 | // TODO: Remove torconnect:error when pages have switched to stage.
|
... | ... | @@ -1066,8 +1068,12 @@ export const TorConnect = { |
1066 | 1068 | // shouldQuickStart would be `false`.
|
1067 | 1069 | // NOTE: At this point, _requestedStage should still be `null`.
|
1068 | 1070 | this._setStage(TorConnectStage.Start);
|
1069 | - if (this.shouldQuickStart) {
|
|
1070 | - // Quickstart
|
|
1071 | + if (
|
|
1072 | + // Quickstart setting is enabled.
|
|
1073 | + this.quickstart &&
|
|
1074 | + // And the previous bootstrap attempt must have succeeded.
|
|
1075 | + !Services.prefs.getBoolPref(TorConnectPrefs.prompt_at_startup, true)
|
|
1076 | + ) {
|
|
1071 | 1077 | this.beginBootstrapping();
|
1072 | 1078 | }
|
1073 | 1079 | },
|
... | ... | @@ -1120,6 +1126,25 @@ export const TorConnect = { |
1120 | 1126 | return lazy.TorLauncherUtil.shouldStartAndOwnTor;
|
1121 | 1127 | },
|
1122 | 1128 | |
1129 | + /**
|
|
1130 | + * Whether bootstrapping can begin immediately once Tor Browser has been
|
|
1131 | + * opened.
|
|
1132 | + *
|
|
1133 | + * @type {boolean}
|
|
1134 | + */
|
|
1135 | + get quickstart() {
|
|
1136 | + return Services.prefs.getBoolPref(TorConnectPrefs.quickstart, false);
|
|
1137 | + },
|
|
1138 | + |
|
1139 | + set quickstart(enabled) {
|
|
1140 | + enabled = Boolean(enabled);
|
|
1141 | + if (enabled === this.quickstart) {
|
|
1142 | + return;
|
|
1143 | + }
|
|
1144 | + Services.prefs.setBoolPref(TorConnectPrefs.quickstart, enabled);
|
|
1145 | + Services.obs.notifyObservers(null, TorConnectTopics.QuickstartChange);
|
|
1146 | + },
|
|
1147 | + |
|
1123 | 1148 | get shouldShowTorConnect() {
|
1124 | 1149 | // TorBrowser must control the daemon
|
1125 | 1150 | return (
|
... | ... | @@ -1163,15 +1188,6 @@ export const TorConnect = { |
1163 | 1188 | );
|
1164 | 1189 | },
|
1165 | 1190 | |
1166 | - get shouldQuickStart() {
|
|
1167 | - // quickstart must be enabled
|
|
1168 | - return (
|
|
1169 | - lazy.TorSettings.quickstart.enabled &&
|
|
1170 | - // and the previous bootstrap attempt must have succeeded
|
|
1171 | - !Services.prefs.getBoolPref(TorConnectPrefs.prompt_at_startup, true)
|
|
1172 | - );
|
|
1173 | - },
|
|
1174 | - |
|
1175 | 1191 | // TODO: Remove when all pages have switched to "stage".
|
1176 | 1192 | get state() {
|
1177 | 1193 | // There is no "Error" stage, but about:torconnect relies on receiving the
|
... | ... | @@ -27,10 +27,8 @@ export const TorSettingsTopics = Object.freeze({ |
27 | 27 | |
28 | 28 | /* Prefs used to store settings in TorBrowser prefs */
|
29 | 29 | const TorSettingsPrefs = Object.freeze({
|
30 | - quickstart: {
|
|
31 | - /* bool: does tor connect automatically on launch */
|
|
32 | - enabled: "torbrowser.settings.quickstart.enabled",
|
|
33 | - },
|
|
30 | + // NOTE: torbrowser.settings.quickstart.enabled used to be managed by
|
|
31 | + // TorSettings but was moved to TorConnect.quickstart in tor-browser#41921.
|
|
34 | 32 | bridges: {
|
35 | 33 | /* bool: does tor use bridges */
|
36 | 34 | enabled: "torbrowser.settings.bridges.enabled",
|
... | ... | @@ -173,9 +171,6 @@ class TorSettingsImpl { |
173 | 171 | * @type {object}
|
174 | 172 | */
|
175 | 173 | #settings = {
|
176 | - quickstart: {
|
|
177 | - enabled: false,
|
|
178 | - },
|
|
179 | 174 | bridges: {
|
180 | 175 | /**
|
181 | 176 | * Whether the bridges are enabled or not.
|
... | ... | @@ -579,11 +574,6 @@ class TorSettingsImpl { |
579 | 574 | #loadFromPrefs() {
|
580 | 575 | lazy.logger.debug("loadFromPrefs()");
|
581 | 576 | |
582 | - /* Quickstart */
|
|
583 | - this.#settings.quickstart.enabled = Services.prefs.getBoolPref(
|
|
584 | - TorSettingsPrefs.quickstart.enabled,
|
|
585 | - false
|
|
586 | - );
|
|
587 | 577 | /* Bridges */
|
588 | 578 | const bridges = {};
|
589 | 579 | bridges.enabled = Services.prefs.getBoolPref(
|
... | ... | @@ -691,11 +681,6 @@ class TorSettingsImpl { |
691 | 681 | |
692 | 682 | this.#checkIfInitialized();
|
693 | 683 | |
694 | - /* Quickstart */
|
|
695 | - Services.prefs.setBoolPref(
|
|
696 | - TorSettingsPrefs.quickstart.enabled,
|
|
697 | - this.#settings.quickstart.enabled
|
|
698 | - );
|
|
699 | 684 | /* Bridges */
|
700 | 685 | Services.prefs.setBoolPref(
|
701 | 686 | TorSettingsPrefs.bridges.enabled,
|
... | ... | @@ -928,7 +913,6 @@ class TorSettingsImpl { |
928 | 913 | *
|
929 | 914 | * It is possible to set all settings, or only some sections:
|
930 | 915 | *
|
931 | - * + quickstart.enabled can be set individually.
|
|
932 | 916 | * + bridges.enabled can be set individually.
|
933 | 917 | * + bridges.source can be set with a corresponding bridge specification for
|
934 | 918 | * the source (bridge_strings, lox_id, builtin_type).
|
... | ... | @@ -968,14 +952,6 @@ class TorSettingsImpl { |
968 | 952 | changes.push(`${group}.${prop}`);
|
969 | 953 | };
|
970 | 954 | |
971 | - if ("quickstart" in newValues && "enabled" in newValues.quickstart) {
|
|
972 | - changeSetting(
|
|
973 | - "quickstart",
|
|
974 | - "enabled",
|
|
975 | - Boolean(newValues.quickstart.enabled)
|
|
976 | - );
|
|
977 | - }
|
|
978 | - |
|
979 | 955 | if ("bridges" in newValues) {
|
980 | 956 | if ("source" in newValues.bridges) {
|
981 | 957 | this.#fixupBridgeSettings(newValues.bridges);
|
... | ... | @@ -1048,11 +1024,7 @@ class TorSettingsImpl { |
1048 | 1024 | // saved the preferences we send the new settings to TorProvider.
|
1049 | 1025 | // Some properties are unread by TorProvider. So if only these values change
|
1050 | 1026 | // there is no need to re-apply the settings.
|
1051 | - const unreadProps = [
|
|
1052 | - "quickstart.enabled",
|
|
1053 | - "bridges.builtin_type",
|
|
1054 | - "bridges.lox_id",
|
|
1055 | - ];
|
|
1027 | + const unreadProps = ["bridges.builtin_type", "bridges.lox_id"];
|
|
1056 | 1028 | const shouldApply = changes.some(prop => !unreadProps.includes(prop));
|
1057 | 1029 | if (shouldApply) {
|
1058 | 1030 | await this.#applySettings(true);
|