morgan pushed to branch tor-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Tor Browser
Commits:
-
d8e17646
by Henry Wilkes at 2025-02-27T12:38:32+00:00
-
481be29c
by Henry Wilkes at 2025-02-27T12:38:32+00:00
3 changed files:
- toolkit/components/torconnect/TorConnectParent.sys.mjs
- toolkit/components/torconnect/content/torConnectUrlbarButton.js
- toolkit/modules/TorConnect.sys.mjs
Changes:
| ... | ... | @@ -152,23 +152,23 @@ export class TorConnectParent extends JSWindowActorParent { |
| 152 | 152 | * auto-bootstrapping.
|
| 153 | 153 | */
|
| 154 | 154 | static open(options) {
|
| 155 | + if (!TorConnect.shouldShowTorConnect) {
|
|
| 156 | + // Already bootstrapped, so don't reopen about:torconnect.
|
|
| 157 | + return;
|
|
| 158 | + }
|
|
| 159 | + |
|
| 155 | 160 | const win = lazy.BrowserWindowTracker.getTopWindow();
|
| 156 | 161 | win.switchToTabHavingURI("about:torconnect", true, {
|
| 157 | 162 | ignoreQueryString: true,
|
| 158 | 163 | });
|
| 159 | 164 | |
| 160 | - if (!options?.beginBootstrapping || !TorConnect.canBeginBootstrap) {
|
|
| 161 | - return;
|
|
| 162 | - }
|
|
| 163 | - |
|
| 164 | - if (options.beginBootstrapping === "hard") {
|
|
| 165 | - if (TorConnect.canBeginAutoBootstrap && !options.regionCode) {
|
|
| 166 | - // Treat as an addition startAgain request to first move back to the
|
|
| 167 | - // "Start" stage before bootstrapping.
|
|
| 168 | - TorConnect.startAgain();
|
|
| 169 | - }
|
|
| 170 | - } else if (TorConnect.potentiallyBlocked) {
|
|
| 171 | - // Do not trigger the bootstrap if we have ever had an error.
|
|
| 165 | + if (
|
|
| 166 | + !options?.beginBootstrapping ||
|
|
| 167 | + (options.beginBootstrapping !== "hard" &&
|
|
| 168 | + TorConnect.potentiallyBlocked) ||
|
|
| 169 | + (options.regionCode && !TorConnect.canBeginAutoBootstrap) ||
|
|
| 170 | + (!options.regionCode && !TorConnect.canBeginNormalBootstrap)
|
|
| 171 | + ) {
|
|
| 172 | 172 | return;
|
| 173 | 173 | }
|
| 174 | 174 |
| ... | ... | @@ -33,13 +33,21 @@ var gTorConnectUrlbarButton = { |
| 33 | 33 | if (this._isActive) {
|
| 34 | 34 | return;
|
| 35 | 35 | }
|
| 36 | + |
|
| 37 | + this.button = document.getElementById("tor-connect-urlbar-button");
|
|
| 38 | + |
|
| 39 | + if (!TorConnect.enabled) {
|
|
| 40 | + // Don't initialise, just hide.
|
|
| 41 | + this._updateButtonVisibility();
|
|
| 42 | + return;
|
|
| 43 | + }
|
|
| 44 | + |
|
| 36 | 45 | this._isActive = true;
|
| 37 | 46 | |
| 38 | 47 | const { TorStrings } = ChromeUtils.importESModule(
|
| 39 | 48 | "resource://gre/modules/TorStrings.sys.mjs"
|
| 40 | 49 | );
|
| 41 | 50 | |
| 42 | - this.button = document.getElementById("tor-connect-urlbar-button");
|
|
| 43 | 51 | document.getElementById("tor-connect-urlbar-button-label").value =
|
| 44 | 52 | TorStrings.torConnect.torConnectButton;
|
| 45 | 53 | this.button.addEventListener("click", event => {
|
| ... | ... | @@ -61,7 +69,7 @@ var gTorConnectUrlbarButton = { |
| 61 | 69 | if (topic !== this._observeTopic) {
|
| 62 | 70 | return;
|
| 63 | 71 | }
|
| 64 | - this._torConnectStageChanged();
|
|
| 72 | + this._updateButtonVisibility();
|
|
| 65 | 73 | },
|
| 66 | 74 | };
|
| 67 | 75 | Services.obs.addObserver(this._stateListener, this._observeTopic);
|
| ... | ... | @@ -84,7 +92,7 @@ var gTorConnectUrlbarButton = { |
| 84 | 92 | // switching selected browser.
|
| 85 | 93 | gBrowser.addProgressListener(this._locationListener);
|
| 86 | 94 | |
| 87 | - this._torConnectStageChanged();
|
|
| 95 | + this._updateButtonVisibility();
|
|
| 88 | 96 | },
|
| 89 | 97 | |
| 90 | 98 | /**
|
| ... | ... | @@ -108,20 +116,6 @@ var gTorConnectUrlbarButton = { |
| 108 | 116 | TorConnectParent.open({ beginBootstrapping: "soft" });
|
| 109 | 117 | },
|
| 110 | 118 | |
| 111 | - /**
|
|
| 112 | - * Callback for when the TorConnect stage changes.
|
|
| 113 | - */
|
|
| 114 | - _torConnectStageChanged() {
|
|
| 115 | - if (TorConnect.stageName === TorConnectStage.Disabled) {
|
|
| 116 | - // NOTE: We do not uninit early when we reach the
|
|
| 117 | - // TorConnectStage.Bootstrapped stage because we can still leave the
|
|
| 118 | - // Bootstrapped stage if the tor process exists early and needs a restart.
|
|
| 119 | - this.uninit();
|
|
| 120 | - return;
|
|
| 121 | - }
|
|
| 122 | - this._updateButtonVisibility();
|
|
| 123 | - },
|
|
| 124 | - |
|
| 125 | 119 | /**
|
| 126 | 120 | * Callback when the TorConnect state, current browser location, or activation
|
| 127 | 121 | * state changes.
|
| ... | ... | @@ -130,25 +124,25 @@ var gTorConnectUrlbarButton = { |
| 130 | 124 | if (!this.button) {
|
| 131 | 125 | return;
|
| 132 | 126 | }
|
| 133 | - // NOTE: We do not manage focus when hiding the button. We only expect to
|
|
| 134 | - // move from "not hidden" to "hidden" when:
|
|
| 135 | - // + switching tabs to "about:torconnect", or
|
|
| 136 | - // + starting bootstrapping.
|
|
| 137 | - //
|
|
| 138 | - // When switching tabs, the normal tab switching logic will eventually move
|
|
| 139 | - // focus to the new tab or url bar, so whilst the focus may be lost
|
|
| 140 | - // temporarily when we hide the button, it will be re-established quickly on
|
|
| 141 | - // tab switch.
|
|
| 142 | - //
|
|
| 143 | - // And we don't expect bootstrapping to start whilst outside of the
|
|
| 144 | - // "about:torconnect", and the automatic bootstrapping should only trigger
|
|
| 145 | - // at the initial start.
|
|
| 146 | - this.button.hidden =
|
|
| 127 | + const hadFocus = this.button.contains(document.activeElement);
|
|
| 128 | + const hide =
|
|
| 147 | 129 | !this._isActive ||
|
| 148 | 130 | this._inAboutTorConnectTab ||
|
| 149 | - !TorConnect.enabled ||
|
|
| 150 | - !TorConnect.canBeginBootstrap;
|
|
| 151 | - const plainButton = TorConnect.potentiallyBlocked;
|
|
| 131 | + TorConnect.stageName === TorConnectStage.Bootstrapped;
|
|
| 132 | + this.button.hidden = hide;
|
|
| 133 | + if (hide && hadFocus) {
|
|
| 134 | + // Lost focus. E.g. if the "Connect" button is focused in another window
|
|
| 135 | + // or tab outside of about:torconnect.
|
|
| 136 | + // Move focus back to the URL bar.
|
|
| 137 | + gURLBar.focus();
|
|
| 138 | + }
|
|
| 139 | + // We style the button as a tor purple button if clicking the button will
|
|
| 140 | + // also start a bootstrap. I.e. whether we meet the conditions in
|
|
| 141 | + // TorConnectParent.open.
|
|
| 142 | + const plainButton =
|
|
| 143 | + !this._isActive ||
|
|
| 144 | + !TorConnect.canBeginNormalBootstrap ||
|
|
| 145 | + TorConnect.potentiallyBlocked;
|
|
| 152 | 146 | this.button.classList.toggle("tor-urlbar-button-plain", plainButton);
|
| 153 | 147 | this.button.classList.toggle("tor-button", !plainButton);
|
| 154 | 148 | },
|
| ... | ... | @@ -1048,20 +1048,17 @@ export const TorConnect = { |
| 1048 | 1048 | },
|
| 1049 | 1049 | |
| 1050 | 1050 | /**
|
| 1051 | - * Whether we are in a stage that can lead into the Bootstrapping stage. I.e.
|
|
| 1052 | - * whether we can make a "normal" or "auto" bootstrapping request.
|
|
| 1051 | + * Whether we are in a stage that can lead into a "normal" bootstrapping
|
|
| 1052 | + * request.
|
|
| 1053 | 1053 | *
|
| 1054 | 1054 | * The value may change with TorConnectTopics.StageChanged.
|
| 1055 | 1055 | *
|
| 1056 | 1056 | * @param {boolean}
|
| 1057 | 1057 | */
|
| 1058 | - get canBeginBootstrap() {
|
|
| 1058 | + get canBeginNormalBootstrap() {
|
|
| 1059 | 1059 | return (
|
| 1060 | 1060 | this._stageName === TorConnectStage.Start ||
|
| 1061 | - this._stageName === TorConnectStage.Offline ||
|
|
| 1062 | - this._stageName === TorConnectStage.ChooseRegion ||
|
|
| 1063 | - this._stageName === TorConnectStage.RegionNotFound ||
|
|
| 1064 | - this._stageName === TorConnectStage.ConfirmRegion
|
|
| 1061 | + this._stageName === TorConnectStage.Offline
|
|
| 1065 | 1062 | );
|
| 1066 | 1063 | },
|
| 1067 | 1064 | |
| ... | ... | @@ -1267,14 +1264,9 @@ export const TorConnect = { |
| 1267 | 1264 | return true;
|
| 1268 | 1265 | }
|
| 1269 | 1266 | |
| 1270 | - if (!this.canBeginBootstrap) {
|
|
| 1271 | - lazy.logger.warn(`Cannot begin bootstrap in stage ${currentStage}`);
|
|
| 1272 | - return false;
|
|
| 1273 | - }
|
|
| 1274 | - if (this.canBeginAutoBootstrap) {
|
|
| 1275 | - // Only expect "auto" bootstraps to be triggered when in an error stage.
|
|
| 1267 | + if (!this.canBeginNormalBootstrap) {
|
|
| 1276 | 1268 | lazy.logger.warn(
|
| 1277 | - `Expected a regionCode to bootstrap in stage ${currentStage}`
|
|
| 1269 | + `Cannot begin normal bootstrap in stage ${currentStage}`
|
|
| 1278 | 1270 | );
|
| 1279 | 1271 | return false;
|
| 1280 | 1272 | }
|