Pier Angelo Vendrame pushed to branch tor-browser-128.6.0esr-14.5-1 at The Tor Project / Applications / Tor Browser

Commits:

5 changed files:

Changes:

  • browser/components/torpreferences/content/connectionPane.js
    ... ... @@ -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" }
    

  • toolkit/components/torconnect/TorConnectParent.sys.mjs
    ... ... @@ -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
         }
    

  • toolkit/modules/TorAndroidIntegration.sys.mjs
    ... ... @@ -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.
    

  • toolkit/modules/TorConnect.sys.mjs
    ... ... @@ -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
    

  • toolkit/modules/TorSettings.sys.mjs
    ... ... @@ -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);