lists.torproject.org
Sign In Sign Up
Manage this list Sign In Sign Up

Keyboard Shortcuts

Thread View

  • j: Next unread message
  • k: Previous unread message
  • j a: Jump to all threads
  • j l: Jump to MailingList overview

tbb-commits

Thread Start a new thread
Threads by month
  • ----- 2026 -----
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2025 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2024 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2023 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2022 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2021 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2020 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2019 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2018 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2017 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2016 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2015 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
  • January
  • ----- 2014 -----
  • December
  • November
  • October
  • September
  • August
  • July
  • June
  • May
  • April
  • March
  • February
tbb-commits@lists.torproject.org

  • 1 participants
  • 20866 discussions
[Git][tpo/applications/tor-browser][tor-browser-153.0esr-16.0-1] 3 commits: fixup! TB 31286: Implementation of bridge, proxy, and firewall settings in...
by morgan (@morgan) 06 Aug '26

06 Aug '26
morgan pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 62bbac0a by Henry Wilkes at 2026-08-06T16:04:02+00:00 fixup! TB 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection TB 45059: Add "Advanced" connection settings to the config. - - - - - 8a72a606 by Henry Wilkes at 2026-08-06T16:04:02+00:00 fixup! Tor Browser strings TB 45059: Advanced connection setting strings. - - - - - e3be1a74 by Henry Wilkes at 2026-08-06T16:04:02+00:00 fixup! Tor Browser localization migration scripts. TB 45059: Add a string migration for the "Advanced" heading. - - - - - 4 changed files: - browser/components/preferences/preferences.js - browser/components/torpreferences/config/connection.mjs - toolkit/locales/en-US/toolkit/global/tor-browser.ftl - + tools/torbrowser/l10n/migrations/bug-45059-advanced-connection-settings.py Changes: ===================================== browser/components/preferences/preferences.js ===================================== @@ -271,7 +271,7 @@ const CONFIG_PANES = Object.freeze({ connection: { l10nId: "tor-connection-settings-pane", iconSrc: "chrome://browser/content/torconnect/tor-connect.svg", - groupIds: ["connectionStatus", "torBridges"], + groupIds: ["connectionStatus", "torBridges", "torAdvanced"], module: "chrome://browser/content/torpreferences/config/connection.mjs", visible: () => { return TorConnect.enabled; ===================================== browser/components/torpreferences/config/connection.mjs ===================================== @@ -192,6 +192,29 @@ SettingGroupManager.registerGroups({ }, ], }, + torAdvanced: { + inProgress: true, + l10nId: "tor-advanced-group", + headingLevel: 2, + items: [ + { + id: "torAdvancedGroup", + control: "moz-box-group", + items: [ + { + id: "torAdvancedConfigure", + l10nId: "tor-advanced-configure-button", + control: "moz-box-button", + }, + { + id: "torViewLog", + l10nId: "tor-view-log-button2", + control: "moz-box-button", + }, + ], + }, + ], + }, }); Preferences.addSetting({ @@ -561,3 +584,33 @@ Preferences.addSetting({ ); }, }); + +Preferences.addSetting({ + id: "torAdvancedGroup", +}); + +Preferences.addSetting({ + id: "torAdvancedConfigure", + deps: ["torSettingsReady"], + visible({ torSettingsReady }) { + // The dialog needs to be able to read TorSettings, so we keep this hidden + // until it is ready. + return torSettingsReady.value; + }, + onUserClick() { + window.gSubDialog.open( + "chrome://browser/content/torpreferences/connectionSettingsDialog.xhtml", + { features: "resizable=yes" } + ); + }, +}); + +Preferences.addSetting({ + id: "torViewLog", + onUserClick() { + window.gSubDialog.open( + "chrome://browser/content/torpreferences/torLogDialog.xhtml", + { features: "resizable=yes" } + ); + }, +}); ===================================== toolkit/locales/en-US/toolkit/global/tor-browser.ftl ===================================== @@ -507,6 +507,13 @@ request-bridge-dialog-captcha-failed = The solution is not correct. Please try a ## Tor advanced settings. +tor-advanced-group = + .label = Advanced +# "{ -brand-short-name }" will be replaced with the localized name of the browser, e.g. "Tor Browser". +tor-advanced-configure-button = + .label = Configure how { -brand-short-name } connects to the internet +tor-view-log-button2 = + .label = View the Tor log tor-advanced-settings-heading = Advanced tor-advanced-settings-description = Configure how { -brand-short-name } connects to the internet. # Button that opens the advanced connection settings dialog. ===================================== tools/torbrowser/l10n/migrations/bug-45059-advanced-connection-settings.py ===================================== @@ -0,0 +1,15 @@ +from fluent.migrate.helpers import transforms_from + + +def migrate(ctx): + ctx.add_transforms( + "tor-browser.ftl", + "tor-browser.ftl", + transforms_from( + """ +tor-advanced-group = + .label = { COPY_PATTERN(path, "tor-advanced-settings-heading") } +""", + path="tor-browser.ftl", + ), + ) View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/092695… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/092695… You're receiving this email because of your account on gitlab.torproject.org. Manage all notifications: https://gitlab.torproject.org/-/profile/notifications | Help: https://gitlab.torproject.org/help
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-153.0esr-16.0-1] 3 commits: fixup! TB 31286: Implementation of bridge, proxy, and firewall settings in...
by morgan (@morgan) 06 Aug '26

06 Aug '26
morgan pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 4983f698 by Henry Wilkes at 2026-08-06T15:48:25+00:00 fixup! TB 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection TB 43939: Add a connection assist banner. - - - - - b825b06d by Henry Wilkes at 2026-08-06T15:48:25+00:00 fixup! Tor Browser strings TB 43939: Add connection assist banner string. - - - - - 09269559 by Henry Wilkes at 2026-08-06T15:48:25+00:00 fixup! TB 40597: Implement TorSettings module TB 43939: Add a method to determine whether the user is in a "Connection Assist" stage. - - - - - 6 changed files: - browser/components/preferences/preferences.xhtml - browser/components/torpreferences/config/connection.mjs - browser/components/torpreferences/jar.mn - + browser/components/torpreferences/widgets/tor-connection-assist-banner.mjs - toolkit/locales/en-US/toolkit/global/tor-browser.ftl - toolkit/modules/TorConnect.sys.mjs Changes: ===================================== browser/components/preferences/preferences.xhtml ===================================== @@ -109,6 +109,7 @@ <script type="module" src="chrome://browser/content/preferences/widgets/update-state.mjs"></script> <script type="module" src="chrome://browser/content/ipprotection/bandwidth-usage.mjs"></script> <script type="module" src="chrome://browser/content/torpreferences/widgets/tor-bridges-display.mjs"></script> + <script type="module" src="chrome://browser/content/torpreferences/widgets/tor-connection-assist-banner.mjs"></script> <script type="module" src="chrome://browser/content/torpreferences/widgets/tor-connection-status.mjs"></script> <script src="chrome://browser/content/torpreferences/bridgemoji/BridgeEmoji.js"/> </head> ===================================== browser/components/torpreferences/config/connection.mjs ===================================== @@ -4,6 +4,8 @@ import { Preferences } from "chrome://global/content/preferences/Preferences.mjs const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { InternetStatus: "moz-src:///toolkit/modules/TorConnect.sys.mjs", + moveFocusToBridgeHeading: + "chrome://browser/content/torpreferences/config/helpers.mjs", openBridgeDialog: "chrome://browser/content/torpreferences/config/helpers.mjs", openUserProvideBridgeDialog: @@ -68,6 +70,18 @@ SettingGroupManager.registerGroups({ headingLevel: 2, controlAttrs: { "focusable-heading": true }, items: [ + { + id: "connectionAssistBanner", + // NOTE: Instead of using a custom widget for this one banner, we could + // use moz-message-bar and populate it's children. However, we want to + // intercept the "click" event for the "Connection Assist" link within + // the banner text. As of ESR 153, onUserClick would not allow us to + // intercept the event because the `<a>` would need to be wrapped in a + // `<setting-control>`. But Fluent would not allow wrapping the + // `<setting-control>` element as part of a wider string (unlike + // `<a data-l10n-name="link">`, which is allowed). tor-browser#43939. + control: "tor-connection-assist-banner", + }, { id: "bridgesEnabled", l10nId: "tor-bridges-use-bridges", @@ -253,6 +267,27 @@ Preferences.addSetting({ }, }); +Preferences.addSetting({ + id: "connectionAssistBanner", + deps: ["torStatus"], + _wasVisible: false, + visible({ torStatus }) { + const visible = torStatus.value === "potentially-blocked"; + if ( + !visible && + this._wasVisible && + document + .getElementById("connectionAssistBanner") + ?.contains(document.activeElement) + ) { + // About to loose focus, move focus to the bridge heading. + lazy.moveFocusToBridgeHeading(window, true); + } + this._wasVisible = visible; + return visible; + }, +}); + Preferences.addSetting({ id: "torSettingsReady", _ready: false, ===================================== browser/components/torpreferences/jar.mn ===================================== @@ -27,6 +27,7 @@ browser.jar: content/browser/torpreferences/config/connection.mjs (config/connection.mjs) content/browser/torpreferences/config/helpers.mjs (config/helpers.mjs) content/browser/torpreferences/widgets/tor-bridges-display.mjs (widgets/tor-bridges-display.mjs) + content/browser/torpreferences/widgets/tor-connection-assist-banner.mjs (widgets/tor-connection-assist-banner.mjs) content/browser/torpreferences/widgets/tor-connection-status.mjs (widgets/tor-connection-status.mjs) content/browser/torpreferences/widgets/tor-connection-status.css (widgets/tor-connection-status.css) content/browser/torpreferences/connectionPane.js (content/connectionPane.js) ===================================== browser/components/torpreferences/widgets/tor-connection-assist-banner.mjs ===================================== @@ -0,0 +1,56 @@ +import { MozLitElement } from "chrome://global/content/lit-utils.mjs"; +import { html } from "chrome://global/content/vendor/lit.all.mjs"; + +const lazy = {}; +ChromeUtils.defineESModuleGetters(lazy, { + TorConnect: "moz-src:///toolkit/modules/TorConnect.sys.mjs", + TorConnectParent: + "moz-src:///browser/components/torconnect/TorConnectParent.sys.mjs", +}); + +const TOR_CONNECT_HREF = "about:torconnect"; + +/** + * Widget for displaying a Connection Assist banner. + * + * @tagname tor-connection-status + */ +class TorConnectionAssistBanner extends MozLitElement { + render() { + return html` + <moz-message-bar + role="complementary" + type="warning" + @click=${this.#handleClick} + > + <span + slot="message" + data-l10n-id="tor-bridges-connection-assist-message" + > + <a + id="link" + data-l10n-name="link" + href=${TOR_CONNECT_HREF} + target="_blank" + ></a> + </span> + </moz-message-bar> + `; + } + + #handleClick(event) { + if (!this.shadowRoot.getElementById("link")?.contains(event.target)) { + return; + } + event.preventDefault(); + if (!lazy.TorConnect.inConnectionAssistStage) { + // Switch to the "ChooseRegion" stage to reflect "Connection Assist". + lazy.TorConnect.chooseRegion(); + } + lazy.TorConnectParent.open(); + } +} +customElements.define( + "tor-connection-assist-banner", + TorConnectionAssistBanner +); ===================================== toolkit/locales/en-US/toolkit/global/tor-browser.ftl ===================================== @@ -156,6 +156,11 @@ tor-bridges-group = .label = Bridges .description = Bridges help you securely access the Tor network in places where Tor is blocked. Depending on where you are, one bridge may work better than another. +# "{ -brand-product-name }" will be replaced with the localized name of the browser, e.g. "Tor Browser". +# "Connection Assist" is the name of a Tor Browser feature, and is therefore capitalised in English. For translations, it should similarly be treated as a feature/product name. It should also be wrapped by the tags '<a data-l10n-name="link">' and '</a>'. +tor-bridges-connection-assist-message = { -brand-short-name } could not connect to the Tor network. You may want to change your bridge settings below, or use <a data-l10n-name="link">Connection Assist</a> to find bridges for you. + + # Toggle button for enabling and disabling the use of bridges. tor-bridges-use-bridges = .label = Use bridges ===================================== toolkit/modules/TorConnect.sys.mjs ===================================== @@ -305,6 +305,8 @@ class BootstrapAttempt { /** * Each instance can be used to attempt one auto-bootstrapping sequence. + * + * AKA Connection Assist bootstrap. */ class AutoBootstrapAttempt { /** @@ -811,6 +813,12 @@ export const TorConnect = { */ _bootstrapAttempt: null, + /** + * Whether the current or last bootstrap attempt was a "normal" bootstrap (not + * Connection Assist). + */ + _wasNormalBootstrap: false, + /** * The bootstrap error that was last generated. * @@ -1048,7 +1056,7 @@ export const TorConnect = { // No change. return; } - if (this._stageName === "Bootstrapping") { + if (this._stageName === TorConnectStage.Bootstrapping) { this._bootstrappingStatus.hasWarning = true; this._notifyBootstrapProgress(); } @@ -1197,6 +1205,19 @@ export const TorConnect = { ); }, + /** + * Whether we are in a stage that is considered part of "Connection Assist". + * + * @type {boolean} + */ + get inConnectionAssistStage() { + return ( + this.canBeginAutoBootstrap || + (this._stageName === TorConnectStage.Bootstrapping && + !this._wasNormalBootstrap) + ); + }, + /** * Get a map of all region codes and their localized names. * @@ -1377,9 +1398,10 @@ export const TorConnect = { const beginStage = this._stageName; const bootstrapOptions = { regionCode }; - const bootstrapAttempt = regionCode - ? new AutoBootstrapAttempt() - : new BootstrapAttempt(); + const normalBootstrap = !regionCode; + const bootstrapAttempt = normalBootstrap + ? new BootstrapAttempt() + : new AutoBootstrapAttempt(); this._addSimulateOptions(bootstrapOptions, regionCode); @@ -1398,6 +1420,7 @@ export const TorConnect = { this._requestedStage = null; this._bootstrapTrigger = beginStage; this._isQuickstart = isQuickstart; + this._wasNormalBootstrap = normalBootstrap; this._setStage(TorConnectStage.Bootstrapping); this._bootstrapAttempt = bootstrapAttempt; View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/e97309… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/e97309… You're receiving this email because of your account on gitlab.torproject.org. Manage all notifications: https://gitlab.torproject.org/-/profile/notifications | Help: https://gitlab.torproject.org/help
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-153.0esr-16.0-1] 2 commits: fixup! TB 40933: Add tor-launcher functionality
by henry (@henry) 06 Aug '26

06 Aug '26
henry pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: f767af19 by Henry Wilkes at 2026-08-06T13:32:41+00:00 fixup! TB 40933: Add tor-launcher functionality TB 45161: Drop the restart prompt. - - - - - e97309cd by Henry Wilkes at 2026-08-06T13:32:41+00:00 fixup! Add TorStrings module for localization TB 45161: Drop TorLauncherUtils prompt strings. - - - - - 3 changed files: - toolkit/components/tor-launcher/TorLauncherUtil.sys.mjs - toolkit/components/tor-launcher/TorProviderBuilder.sys.mjs - toolkit/torbutton/chrome/locale/en-US/torlauncher.properties Changes: ===================================== toolkit/components/tor-launcher/TorLauncherUtil.sys.mjs ===================================== @@ -15,8 +15,6 @@ ChromeUtils.defineESModuleGetters(lazy, { "moz-src:///toolkit/components/tor-launcher/TorProviderBuilder.sys.mjs", }); -const kPropBundleURI = "chrome://torbutton/locale/torlauncher.properties"; -const kPropNamePrefix = "torlauncher."; const kIPCDirPrefName = "extensions.torlauncher.tmp_ipc_dir"; /** @@ -374,86 +372,6 @@ export const TorLauncherUtil = { return !re.test(path); }, - // Returns true if user confirms; false if not. - showConfirm(aParentWindow, aMsg, aDefaultButtonLabel, aCancelButtonLabel) { - if (!aParentWindow) { - aParentWindow = Services.wm.getMostRecentWindow("navigator:browser"); - } - - const ps = Services.prompt; - const title = this.getLocalizedString("error_title"); - const btnFlags = - ps.BUTTON_POS_0 * ps.BUTTON_TITLE_IS_STRING + - ps.BUTTON_POS_0_DEFAULT + - ps.BUTTON_POS_1 * ps.BUTTON_TITLE_IS_STRING; - - const notUsed = { value: false }; - const btnIndex = ps.confirmEx( - aParentWindow, - title, - aMsg, - btnFlags, - aDefaultButtonLabel, - aCancelButtonLabel, - null, - null, - notUsed - ); - return btnIndex === 0; - }, - - /** - * Ask the user whether they desire to restart tor. - * - * @param {boolean} initError If we could connect to the control port at - * least once and we are showing this prompt because the tor process exited - * suddenly, we will display a different message - * @returns {boolean} true if the user asked to restart tor - */ - showRestartPrompt(initError) { - let s; - if (initError) { - const key = "tor_exited_during_startup"; - s = this.getLocalizedString(key); - } else { - // tor exited suddenly, so configuration should be okay - s = - this.getLocalizedString("tor_exited") + - "\n\n" + - this.getLocalizedString("tor_exited2"); - } - const defaultBtnLabel = this.getLocalizedString("restart_tor"); - let cancelBtnLabel = "OK"; - try { - const kSysBundleURI = "chrome://global/locale/commonDialogs.properties"; - const sysBundle = Services.strings.createBundle(kSysBundleURI); - cancelBtnLabel = sysBundle.GetStringFromName(cancelBtnLabel); - } catch (e) { - console.warn("Could not localize the cancel button", e); - } - return this.showConfirm(null, s, defaultBtnLabel, cancelBtnLabel); - }, - - _stringBundle: null, - - // Localized Strings - // TODO: Switch to fluent also these ones. - - // "torlauncher." is prepended to aStringName. - getLocalizedString(aStringName) { - if (!aStringName) { - return aStringName; - } - if (!this._stringBundle) { - this._stringBundle = Services.strings.createBundle(kPropBundleURI); - } - try { - const key = kPropNamePrefix + aStringName; - return this._stringBundle.GetStringFromName(key); - } catch (e) {} - return aStringName; - }, - /** * Determine what kind of SOCKS port has been requested for this session or * the browser has been configured for. ===================================== toolkit/components/tor-launcher/TorProviderBuilder.sys.mjs ===================================== @@ -4,8 +4,6 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { - TorLauncherUtil: - "moz-src:///toolkit/components/tor-launcher/TorLauncherUtil.sys.mjs", TorProvider: "moz-src:///toolkit/components/tor-launcher/TorProvider.sys.mjs", TorProviderMock: "moz-src:///toolkit/components/tor-launcher/TorProviderMock.sys.mjs", @@ -279,8 +277,6 @@ export class TorProviderBuilder { TorProviderTopics.ProviderStateChanged, provider.state ); - - this.#promptProviderState(false); } /** @@ -400,85 +396,6 @@ export class TorProviderBuilder { this.#replaceProvider(); } - // TODO: Remove firstWindowLoaded, #uiReady, #prompting, #promptProviderState - // and use TorConnect instead. tor-browser#43570. - /** - * Check if the provider has been succesfully initialized when the first - * browser window is shown. - * This is a workaround we need because ideally we would like the tor process - * to start as soon as possible, to avoid delays in the about:torconnect page, - * but we should modify TorConnect and about:torconnect to handle this case - * there with a better UX. - */ - static firstWindowLoaded() { - this.#promptProviderState(true); - } - - /** - * Tell whether the browser UI is ready. - * We ignore any errors until it is because we cannot show them. - * - * @type {boolean} - */ - static #uiReady = false; - - /** - * Whether we are prompting the user for a restart of the provider. - * - * @type {boolean} - */ - static #prompting = false; - - /** - * Prompt the user to restart the provider, if this is necessary. - * - * @param {boolean} uiReady - Whether this is being called for the first time - * when the UI is ready. - */ - static async #promptProviderState(uiReady) { - if (uiReady) { - this.#uiReady = true; - } - if (this.#providerData.provider.state === TorProviderState.Running) { - // Nothing to wait for. - return; - } - if (!this.#uiReady) { - lazy.logger.warn( - "Seen exit, but not doing anything because the UI is not ready yet." - ); - return; - } - if (this.#prompting) { - // Already prompting, so don't duplicate. - return; - } - - this.#prompting = true; - let waitForInit = uiReady; - let retry = true; - try { - while (retry) { - if (waitForInit) { - try { - await this.#providerData.initPromise; - } catch {} - } - if ( - this.#providerData.provider.state === TorProviderState.Stopped && - lazy.TorLauncherUtil.showRestartPrompt(uiReady) - ) { - waitForInit = true; - this.replace(); - } else { - retry = false; - } - } - } finally { - this.#prompting = false; - } - } - /** * Return the provider chosen by the user. * This function checks the TOR_PROVIDER environment variable and if it is a ===================================== toolkit/torbutton/chrome/locale/en-US/torlauncher.properties ===================================== @@ -3,13 +3,6 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -torlauncher.error_title=Tor Launcher -torlauncher.tor_exited_during_startup=Tor exited during startup. This might be due to an error in your torrc file, a bug in Tor or another program on your system, or faulty hardware. Until you fix the underlying problem and restart Tor, Tor Browser will not start. -torlauncher.tor_exited=Tor unexpectedly exited. This might be due to a bug in Tor itself, another program on your system, or faulty hardware. Until you restart Tor, Tor Browser will not be able to reach any websites. If the problem persists, please send a copy of your Tor Log to the support team. -torlauncher.tor_exited2=Restarting Tor will not close your browser tabs. -torlauncher.restart_tor=Restart Tor - - # Translation note: %1$S is a bootstrap phase from torlauncher.bootstrapStatus, # %2$S is the error from torlauncher.bootstrapWarning torlauncher.tor_bootstrap_failed_details=%1$S failed (%2$S). View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/5b194f… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/5b194f… You're receiving this email because of your account on gitlab.torproject.org. Manage all notifications: https://gitlab.torproject.org/-/profile/notifications | Help: https://gitlab.torproject.org/help
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-153.0esr-16.0-1] 7 commits: fixup! TB 40597: Implement TorSettings module
by Dan Ballard (@dan) 06 Aug '26

06 Aug '26
Dan Ballard pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: fe45b5e3 by Henry Wilkes at 2026-08-05T12:12:42-06:00 fixup! TB 40597: Implement TorSettings module TB 43571: Allow android to enter ProviderStopped. - - - - - 80e2704f by Henry Wilkes at 2026-08-05T12:12:43-06:00 fixup! TB 42247: Android helpers for the TorProvider TB 43571: Drop `TorProviderBuilder.firstWindowLoaded`, which is covered by `TorConnect.init` now. - - - - - 48c8f5a9 by clairehurst at 2026-08-05T12:12:43-06:00 fixup! [android] Implement Android-native Connection Assist UI Bug 43570: Add tor exit prompt - - - - - ec776e7f by clairehurst at 2026-08-05T12:12:43-06:00 fixup! TB 42247: Android helpers for the TorProvider Bug 43570: Add tor exit prompt - - - - - 45aace81 by clairehurst at 2026-08-05T12:12:44-06:00 fixup! [android] TBA strings Bug 43570: Add tor exit prompt - - - - - 1efdc3dc by clairehurst at 2026-08-05T12:12:44-06:00 fixup! [android] Implement Android-native Connection Assist UI Bug 43570: Add tor exit prompt # Conflicts: # mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tor/ProviderStoppedViewModel.kt - - - - - 5b194faf by clairehurst at 2026-08-05T12:13:48-06:00 fixup! TB 40933: Add tor-launcher functionality Bug 43571: [Android] Add tor exit prompt Specifically, this commit is a patch provided from https://gitlab.torproject.org/tpo/applications/tor-browser/-/merge_requests… - - - - - 21 changed files: - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tor/ConnectAssistUiState.kt - + mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tor/ProviderStoppedViewModel.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt - + mobile/android/fenix/app/src/main/res/drawable/bullet_point.xml - + mobile/android/fenix/app/src/main/res/drawable/loading_wheel.xml - + mobile/android/fenix/app/src/main/res/drawable/onion_broken.xml - mobile/android/fenix/app/src/main/res/layout/fragment_tor_connection_assist.xml - mobile/android/fenix/app/src/main/res/navigation/nav_graph.xml - mobile/android/fenix/app/src/main/res/values/preference_keys.xml - mobile/android/fenix/app/src/main/res/values/torbrowser_strings.xml - mobile/android/fenix/app/src/main/res/xml/secret_settings_preferences.xml - + mobile/android/geckoview/src/main/java/org/mozilla/geckoview/ProviderStatus.java - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorAndroidIntegration.java - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorConnectStage.java - mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorConnectStageName.java - toolkit/components/tor-launcher/TorProcessAndroid.sys.mjs - toolkit/modules/TorAndroidIntegration.sys.mjs - toolkit/modules/TorConnect.sys.mjs Changes: ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt ===================================== @@ -7,6 +7,7 @@ package org.mozilla.fenix import android.annotation.SuppressLint import android.app.assist.AssistContent import android.app.PendingIntent +import android.content.ActivityNotFoundException import android.content.ComponentName import android.content.Context import android.content.Intent @@ -19,6 +20,7 @@ import android.os.Bundle import android.os.StrictMode import android.text.format.DateUtils import android.util.AttributeSet +import android.util.Log import android.view.ActionMode import android.view.KeyEvent import android.view.LayoutInflater @@ -40,7 +42,9 @@ import androidx.core.net.toUri import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.core.text.layoutDirection import androidx.core.view.doOnLayout +import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope +import androidx.lifecycle.repeatOnLifecycle import androidx.navigation.NavController import androidx.navigation.NavDirections import androidx.navigation.fragment.NavHostFragment @@ -203,6 +207,7 @@ import org.mozilla.fenix.compose.snackbar.SnackbarState import org.mozilla.fenix.compose.snackbar.Snackbar import org.mozilla.fenix.tor.CustomSecurityLevelViewModel import org.mozilla.fenix.tor.TorController +import org.mozilla.fenix.tor.ProviderStoppedViewModel import org.mozilla.fenix.tor.UrlQuickLoadViewModel import org.mozilla.geckoview.TorAndroidIntegration.BootstrapStateChangeListener import org.mozilla.geckoview.TorConnectStage @@ -436,6 +441,8 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, Crash private var dialog: RedirectDialogFragment? = null + private val providerStoppedViewModel: ProviderStoppedViewModel by viewModels() + private val urlQuickLoadViewModel: UrlQuickLoadViewModel by viewModels() private val customSecurityLevelViewModel: CustomSecurityLevelViewModel by viewModels() @@ -445,6 +452,18 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, Crash // DO NOT MOVE ANYTHING ABOVE THIS getProfilerTime CALL. val startTimeProfiler = components.core.engine.profiler?.getProfilerTime() + lifecycleScope.launch { + repeatOnLifecycle(Lifecycle.State.STARTED) { + providerStoppedViewModel.providerStoppedStateFlow.collect { isStopped -> + Log.d("providerStoppedViewModel", "isStopped = $isStopped") + if (isStopped) { + navHost.navController.navigate(NavGraphDirections.actionNavigateToConnectionAssistFromAnywhere()) + providerStoppedViewModel.providerStoppedStateFlow.value = false + } + } + } + } + // Setup nimbus-cli tooling. This is a NOOP when launching normally. components.nimbus.sdk.initializeTooling(applicationContext, intent) components.strictMode.attachListenerToDisablePenaltyDeath(supportFragmentManager) @@ -1788,4 +1807,14 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, Crash components.torController.shutdown() exitProcess(0) } + + fun openBatterySaverSettings() { + try { + startActivity( + Intent(android.provider.Settings.ACTION_BATTERY_SAVER_SETTINGS) + ) + } catch (e: ActivityNotFoundException) { + e.printStackTrace() + } + } } ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SecretSettingsFragment.kt ===================================== @@ -265,6 +265,13 @@ class SecretSettingsFragment : PreferenceFragmentCompat(), SystemInsetsPaddedFra } } + requirePreference<Preference>(R.string.pref_key_test_kill_tor).apply { + setOnPreferenceClickListener { + requireContext().components.core.geckoRuntime.torIntegrationController.shutdown() + true + } + } + requirePreference<SwitchPreferenceCompat>(R.string.pref_key_enable_fxsuggest).apply { isVisible = FeatureFlags.FX_SUGGEST isChecked = settings.enableFxSuggest ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tor/ConnectAssistUiState.kt ===================================== @@ -3,8 +3,8 @@ package org.mozilla.fenix.tor import androidx.annotation.ColorRes import androidx.annotation.DrawableRes import androidx.annotation.StringRes -import mozilla.components.lib.crash.R as crashR import org.mozilla.fenix.R +import mozilla.components.lib.crash.R as crashR enum class ConnectAssistUiState( val progressBarVisible: Boolean, @@ -33,6 +33,7 @@ enum class ConnectAssistUiState( val torBootstrapButton2ShouldOpenSettings: Boolean = true, val wordmarkLogoVisible: Boolean = false, val torBootstrapButton2ShouldRestartApp: Boolean = false, + val torBootstrapButton1ShouldRestartTor: Boolean = false, ) { Loading( progressBarVisible = false, @@ -298,5 +299,30 @@ enum class ConnectAssistUiState( torBootstrapButton2TextStringResource = crashR.string.mozac_lib_crash_dialog_button_restart, torBootstrapButton2ShouldOpenSettings = false, torBootstrapButton2ShouldRestartApp = true, - ) + ), + ProviderStopped( + progressBarVisible = false, + backButtonVisible = false, + settingsButtonVisible = true, + torConnectImageVisible = true, + torConnectImageResource = R.drawable.onion_broken, + titleLargeTextViewVisible = true, + titleLargeTextViewTextStringResource = R.string.connection_assist_provider_stopped_title, + titleDescriptionVisible = true, + learnMoreStringResource = R.string.connection_assist_final_error_learn_more_link, + internetErrorDescription = R.string.connection_assist_provider_stopped_description1, + internetErrorDescription1 = R.string.connection_assist_provider_stopped_description2, + internetErrorDescription2 = R.string.connection_assist_provider_stopped_description3, + titleDescriptionTextStringResource = null, + quickstartSwitchVisible = false, + regionDropDownVisible = false, + torBootstrapButton1Visible = true, + torBootstrapButton1TextStringResource = R.string.connection_assist_restart_connection_button, + torBootstrapButton1ShouldOpenSettings = false, + torBootstrapButton1ShouldRestartTor = true, + torBootstrapButton2Visible = false, + torBootstrapButton2TextStringResource = null, + torBootstrapButton2ShouldOpenSettings = false, + torBootstrapButton2ShouldRestartApp = false, + ), } ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tor/ProviderStoppedViewModel.kt ===================================== @@ -0,0 +1,49 @@ +package org.mozilla.fenix.tor + +import android.app.Application +import android.util.Log +import androidx.lifecycle.AndroidViewModel +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import org.mozilla.fenix.ext.components +import org.mozilla.geckoview.TorAndroidIntegration +import org.mozilla.geckoview.TorConnectStage +import org.mozilla.geckoview.TorConnectStageName + +class ProviderStoppedViewModel( + application: Application, +) : AndroidViewModel(application), TorAndroidIntegration.BootstrapStateChangeListener { + + private val TAG = "ProviderStoppedViewModel" + + internal val providerStoppedStateFlow: MutableStateFlow<Boolean> by lazy { MutableStateFlow(false) } + + private val _maybeConfigIssue = MutableStateFlow(false) + internal val maybeConfigIssue: StateFlow<Boolean> = _maybeConfigIssue + + override fun onBootstrapStageChange(stage: TorConnectStage) { + when (stage.name) { + TorConnectStageName.ProviderStopped -> { + Log.d(TAG, "ProviderStopped detected") + providerStoppedStateFlow.value = true + } + + else -> { + providerStoppedStateFlow.value = false + } + } + + _maybeConfigIssue.value = stage.providerStatus.maybeConfigIssue + } + + init { + getApplication<Application>().components.core.geckoRuntime.torIntegrationController.registerBootstrapStateChangeListener(this) + } + + override fun onCleared() { + getApplication<Application>().components.core.geckoRuntime.torIntegrationController.unregisterBootstrapStateChangeListener(this) + } + + override fun onBootstrapProgress(progress: Double, hasWarnings: Boolean) {} + +} ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistFragment.kt ===================================== @@ -8,6 +8,7 @@ import android.graphics.Color import android.graphics.Typeface import android.os.Build import android.os.Bundle +import android.os.PowerManager import android.text.SpannableString import android.text.Spanned import android.text.TextPaint @@ -17,9 +18,11 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.annotation.StringRes import androidx.appcompat.content.res.AppCompatResources import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -43,14 +46,22 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.LinkAnnotation +import androidx.compose.ui.text.TextLinkStyles import androidx.compose.ui.text.TextStyle +import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextDecoration +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import androidx.core.content.getSystemService import androidx.core.view.isEmpty import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels @@ -68,6 +79,7 @@ import org.mozilla.fenix.HomeActivity import org.mozilla.fenix.R import org.mozilla.fenix.databinding.FragmentTorConnectionAssistBinding import org.mozilla.fenix.e2e.SystemInsetsPaddedFragment +import org.mozilla.fenix.ext.components import org.mozilla.fenix.ext.hideToolbar class TorConnectionAssistFragment : Fragment(), UserInteractionHandler, SystemInsetsPaddedFragment { @@ -76,6 +88,7 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler, SystemIn private val progressViewModel: TorBootstrapProgressViewModel by viewModels() private val quickstartViewModel: QuickstartViewModel by activityViewModels() private val torConnectionAssistViewModel : TorConnectionAssistViewModel by viewModels() + private val providerStoppedViewModel : ProviderStoppedViewModel by activityViewModels() private var _binding: FragmentTorConnectionAssistBinding? = null private val binding get() = _binding!! @@ -103,6 +116,7 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler, SystemIn Log.d(TAG, "shouldOpenHome = $it") if (it) { openHome() + torConnectionAssistViewModel.shouldOpenHome.value = false } } @@ -200,13 +214,142 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler, SystemIn binding.torConnectImage.setImageResource(screen.torConnectImageResource) } + @Composable + fun TextWithClickable( + @StringRes mainTextRes: Int, + @StringRes clickableTextRes: Int, + onClick: () -> Unit, + style: TextStyle, + tag: String, + ) { + Text( + text = buildAnnotatedString { + val clickableText = stringResource(clickableTextRes) + val plainText = stringResource(mainTextRes, clickableText) + append(plainText) + addLink( + clickable = LinkAnnotation.Clickable( + tag = tag, + styles = TextLinkStyles( + style = style.toSpanStyle().copy(textDecoration = TextDecoration.Underline), + pressedStyle = style.toSpanStyle(), + ), + linkInteractionListener = { onClick() } + ), + start = plainText.indexOf(clickableText), + end = plainText.indexOf(clickableText) + clickableText.length, + ) + }, + style = style, + ) + } + + @Preview + @Composable + fun DaemonFailedScreen( + isDeviceInPowerSaveMode: Boolean = false, + maybeConfigIssue: Boolean = false, + style: TextStyle = TextStyle( + fontSize = 16.sp, + lineHeight = 24.sp, + fontWeight = FontWeight(400), + color = PhotonColors.LightGrey05, + letterSpacing = 0.5.sp, + ) + ) { + Column( + verticalArrangement = Arrangement.spacedBy(12.dp, Alignment.CenterVertically), + ) { + Text( + text = stringResource(R.string.connection_assist_provider_stopped_description1), + style = style, + ) + Text( + text = stringResource(R.string.connection_assist_provider_stopped_description2), + style = style.copy(fontWeight = FontWeight.Bold), + ) + if (isDeviceInPowerSaveMode && !maybeConfigIssue) { + Row { + Image( + painter = painterResource(R.drawable.bullet_point), + contentDescription = null, + modifier = Modifier.padding(6.dp) + ) + Text( + style = style, + text = stringResource(R.string.connection_assist_provider_stopped_description_battery1), + ) + } + } + Row { + Image( + painter = painterResource(R.drawable.bullet_point), + contentDescription = null, + modifier = Modifier.padding(6.dp) + ) + Text( + style = style, + text = stringResource(R.string.connection_assist_provider_stopped_description3), + ) + } + Text( + text = stringResource(R.string.connection_assist_provider_stopped_description4), + style = style.copy(fontWeight = FontWeight.Bold), + ) + if (isDeviceInPowerSaveMode && !maybeConfigIssue) { + Row { + Image( + painter = painterResource(R.drawable.bullet_point), + contentDescription = null, + modifier = Modifier.padding(6.dp), + ) + TextWithClickable( + mainTextRes = R.string.connection_assist_provider_stopped_description_turn_off_battery_saver2, + clickableTextRes = R.string.connection_assist_provider_stopped_description_turn_off_battery_saver_clickable, + onClick = { (requireActivity() as HomeActivity).openBatterySaverSettings() }, + style = style, + tag = BATTERY_SETTINGS_TAG, + ) + } + } else { + Row { + Image( + painter = painterResource(R.drawable.bullet_point), + contentDescription = null, + modifier = Modifier.padding(6.dp), + ) + Text( + text = stringResource(R.string.connection_assist_provider_stopped_description5), + style = style, + ) + } + } + Text( + text = stringResource(R.string.connection_assist_provider_stopped_description6, + stringResource(R.string.connection_assist_provider_stopped_description7) + ), + style = style, + ) + } + } + private fun setTitle(screen: ConnectAssistUiState) { binding.titleLargeTextView.visibility = if (screen.titleLargeTextViewVisible) View.VISIBLE else View.GONE binding.titleLargeTextView.text = getString(screen.titleLargeTextViewTextStringResource) binding.titleDescription.visibility = if (screen.titleDescriptionVisible) View.VISIBLE else View.GONE - if (screen.learnMoreStringResource != null && screen.internetErrorDescription != null) { + binding.daemonFailedDescription.visibility = View.GONE + if (screen == ConnectAssistUiState.ProviderStopped) { + binding.titleDescription.visibility = View.GONE + binding.daemonFailedDescription.setContent { + DaemonFailedScreen( + isDeviceInPowerSaveMode = requireContext().getSystemService<PowerManager>()?.isPowerSaveMode ?: false, + maybeConfigIssue = providerStoppedViewModel.maybeConfigIssue.collectAsState().value, + ) + } + binding.daemonFailedDescription.visibility = View.VISIBLE + } else if (screen.learnMoreStringResource != null && screen.internetErrorDescription != null) { val learnMore: String = "" // getString(screen.learnMoreStringResource) tor-browser#43198 uncomment and add back once we have the "Learn more" screens for relevant pages val internetErrorDescription: String = if (screen.internetErrorDescription1 == null) { @@ -434,6 +577,13 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler, SystemIn setOnClickListener { if (screen.torBootstrapButton1ShouldOpenSettings) { openTorConnectionSettings() + } else if (screen.torBootstrapButton1ShouldRestartTor) { + requireContext().components.core.geckoRuntime.torIntegrationController.restartProvider() + backgroundTintList = AppCompatResources.getColorStateList( + requireContext(), + R.color.disabled_connect_button_purple, + ) + text = getString(R.string.connection_assist_restarting_connection_button) } else { torConnectionAssistViewModel.handleConnect(screen) } @@ -561,8 +711,11 @@ class TorConnectionAssistFragment : Fragment(), UserInteractionHandler, SystemIn } override fun onBackPressed(): Boolean { - torConnectionAssistViewModel.handleBackButtonPressed(requireActivity() as HomeActivity) - return true + return torConnectionAssistViewModel.handleBackButtonPressed(requireActivity() as HomeActivity) + } + + companion object { + const val BATTERY_SETTINGS_TAG = "BATTERY_SETTINGS_TAG" } } ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/tor/TorConnectionAssistViewModel.kt ===================================== @@ -138,17 +138,18 @@ class TorConnectionAssistViewModel( torConnectStage.collect { Log.d(TAG, "torConnectStageName: ${it?.name}") when (it?.name) { - TorConnectStageName.Disabled -> shouldOpenHome.value = true // TODO use TorConnect.enabled instead to determine this - TorConnectStageName.Loading -> _torConnectScreen.value = ConnectAssistUiState.Loading - TorConnectStageName.Start -> _torConnectScreen.value = ConnectAssistUiState.Start - TorConnectStageName.Bootstrapping -> _torConnectScreen.value = handleBootstrapTrigger(it.bootstrapTrigger) - TorConnectStageName.Offline -> _torConnectScreen.value = ConnectAssistUiState.Offline - TorConnectStageName.ChooseRegion -> _torConnectScreen.value = ConnectAssistUiState.ChooseRegion - TorConnectStageName.RegionNotFound -> _torConnectScreen.value = ConnectAssistUiState.RegionNotFound - TorConnectStageName.ConfirmRegion -> _torConnectScreen.value = ConnectAssistUiState.ConfirmRegion - TorConnectStageName.FinalError -> _torConnectScreen.value = ConnectAssistUiState.FinalError - TorConnectStageName.Bootstrapped -> shouldOpenHome.value = true - null -> {} + TorConnectStageName.Disabled -> shouldOpenHome.value = true // TODO use TorConnect.enabled instead to determine this + TorConnectStageName.Loading -> _torConnectScreen.value = ConnectAssistUiState.Loading + TorConnectStageName.ProviderStopped -> _torConnectScreen.value = ConnectAssistUiState.ProviderStopped + TorConnectStageName.Start -> _torConnectScreen.value = ConnectAssistUiState.Start + TorConnectStageName.Bootstrapping -> _torConnectScreen.value = handleBootstrapTrigger(it.bootstrapTrigger) + TorConnectStageName.Offline -> _torConnectScreen.value = ConnectAssistUiState.Offline + TorConnectStageName.ChooseRegion -> _torConnectScreen.value = ConnectAssistUiState.ChooseRegion + TorConnectStageName.RegionNotFound -> _torConnectScreen.value = ConnectAssistUiState.RegionNotFound + TorConnectStageName.ConfirmRegion -> _torConnectScreen.value = ConnectAssistUiState.ConfirmRegion + TorConnectStageName.FinalError -> _torConnectScreen.value = ConnectAssistUiState.FinalError + TorConnectStageName.Bootstrapped -> shouldOpenHome.value = true + null -> {} } } } @@ -168,11 +169,12 @@ class TorConnectionAssistViewModel( } } - fun handleBackButtonPressed(homeActivity: HomeActivity) { - when (torConnectScreen.value) { - ConnectAssistUiState.Loading -> homeActivity.shutDown() - ConnectAssistUiState.Start -> homeActivity.shutDown() - else -> torAndroidIntegration.startAgain() + fun handleBackButtonPressed(homeActivity: HomeActivity): Boolean { + return when (torConnectScreen.value) { + ConnectAssistUiState.Loading -> homeActivity.shutDown() + ConnectAssistUiState.Start -> homeActivity.shutDown() + ConnectAssistUiState.ProviderStopped -> false + else -> torAndroidIntegration.startAgain().let { true } } } ===================================== mobile/android/fenix/app/src/main/res/drawable/bullet_point.xml ===================================== @@ -0,0 +1,10 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:height="6dp" + android:viewportHeight="6" + android:viewportWidth="6" + android:width="6dp"> + <path + android:fillColor="#FBFBFE" + android:pathData="M3,3m-3,0a3,3 0,1 1,6 0a3,3 0,1 1,-6 0" /> +</vector> ===================================== mobile/android/fenix/app/src/main/res/drawable/loading_wheel.xml ===================================== @@ -0,0 +1,12 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:autoMirrored="true" + android:height="16dp" + android:viewportHeight="16" + android:viewportWidth="16" + android:width="16dp"> + <path + android:fillAlpha="0.4" + android:fillColor="#FBFBFE" + android:fillType="evenOdd" + android:pathData="M8,15C8,14.448 7.549,14.009 7.004,13.918C4.164,13.443 2,10.974 2,8C2,4.686 4.686,2 8,2C10.974,2 13.443,4.164 13.918,7.004C14.009,7.549 14.448,8 15,8C15.552,8 16.007,7.55 15.938,7.002C15.447,3.055 12.08,0 8,0C3.582,0 0,3.582 0,8C0,12.08 3.055,15.447 7.002,15.938C7.55,16.007 8,15.552 8,15Z" /> +</vector> ===================================== mobile/android/fenix/app/src/main/res/drawable/onion_broken.xml ===================================== @@ -0,0 +1,21 @@ +<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="40dp" android:viewportHeight="40" android:viewportWidth="40" android:width="40dp"> + + <path android:fillColor="#FBFBFE" android:pathData="M33.259,33.258C29.865,36.651 25.178,38.75 20,38.75C9.645,38.75 1.25,30.355 1.25,20C1.25,14.823 3.348,10.135 6.741,6.742L8.813,8.814C5.95,11.677 4.18,15.632 4.18,20C4.18,28.737 11.263,35.82 20,35.82C24.369,35.82 28.324,34.049 31.187,31.186L33.259,33.258Z"/> + + <path android:fillColor="#FBFBFE" android:pathData="M35.284,30.863C37.466,27.798 38.75,24.049 38.75,20C38.75,9.645 30.355,1.25 20,1.25C15.951,1.25 12.202,2.533 9.137,4.716L11.243,6.822C13.751,5.153 16.762,4.18 20,4.18C28.737,4.18 35.82,11.263 35.82,20C35.82,23.238 34.847,26.249 33.178,28.757L35.284,30.863Z"/> + + <path android:fillColor="#FBFBFE" android:pathData="M31.226,26.805C32.431,24.82 33.125,22.491 33.125,20C33.125,12.751 27.249,6.875 20,6.875C17.509,6.875 15.18,7.569 13.195,8.774L15.347,10.926C16.742,10.209 18.324,9.805 20,9.805C25.631,9.805 30.195,14.369 30.195,20C30.195,21.676 29.791,23.258 29.074,24.653L31.226,26.805Z"/> + + <path android:fillColor="#FBFBFE" android:pathData="M29.281,29.281L27.209,27.209C25.364,29.054 22.815,30.195 20,30.195C14.369,30.195 9.805,25.631 9.805,20C9.805,17.185 10.946,14.636 12.79,12.791L10.719,10.72C8.344,13.095 6.875,16.376 6.875,20C6.875,27.249 12.751,33.125 20,33.125C23.625,33.125 26.906,31.656 29.281,29.281Z"/> + + <path android:fillColor="#FBFBFE" android:pathData="M14.696,14.697C13.339,16.054 12.5,17.929 12.5,20C12.5,24.142 15.858,27.5 20,27.5C22.071,27.5 23.946,26.66 25.303,25.303L23.232,23.232C22.405,24.059 21.262,24.57 20,24.57C17.476,24.57 15.43,22.524 15.43,20C15.43,18.738 15.941,17.596 16.768,16.769L14.696,14.697Z"/> + + <path android:fillColor="#FBFBFE" android:pathData="M24.568,20.147C24.569,20.098 24.57,20.049 24.57,20C24.57,17.476 22.524,15.43 20,15.43C19.951,15.43 19.902,15.431 19.853,15.432L17.388,12.967C18.202,12.665 19.081,12.5 20,12.5C24.142,12.5 27.5,15.858 27.5,20C27.5,20.919 27.335,21.799 27.033,22.612L24.568,20.147Z"/> + + <path android:fillColor="#FBFBFE" android:pathData="M20,38.75C9.645,38.75 1.25,30.355 1.25,20C1.25,14.823 3.348,10.135 6.741,6.742L20,20V38.75Z"/> + + <path android:fillColor="#FBFBFE" android:pathData="M20,15.579V1.25C15.951,1.25 12.202,2.533 9.137,4.716L20,15.579Z"/> + + <path android:fillColor="#FF9AA2" android:pathData="M35.291,39.061C35.085,39.062 34.882,39.021 34.692,38.943C34.503,38.864 34.33,38.749 34.186,38.604L2.31,6.731C2.037,6.434 1.889,6.043 1.898,5.64C1.906,5.236 2.07,4.851 2.355,4.566C2.64,4.28 3.025,4.116 3.428,4.107C3.832,4.099 4.223,4.246 4.52,4.519L36.396,36.394C36.688,36.688 36.851,37.085 36.851,37.5C36.851,37.915 36.688,38.312 36.396,38.606C36.25,38.751 36.078,38.866 35.888,38.944C35.699,39.022 35.496,39.062 35.291,39.061Z"/> + +</vector> ===================================== mobile/android/fenix/app/src/main/res/layout/fragment_tor_connection_assist.xml ===================================== @@ -99,6 +99,19 @@ android:textSize="14sp" app:layout_constraintTop_toBottomOf="@id/title_large_text_view" /> + <androidx.compose.ui.platform.ComposeView + android:id="@+id/daemon_failed_description" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + android:paddingHorizontal="24dp" + android:paddingVertical="16dp" + app:layout_constraintBottom_toTopOf="@id/tor_bootstrap_button_1" + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintStart_toStartOf="parent" + app:layout_constraintTop_toBottomOf="@id/title_large_text_view" + app:layout_constraintVertical_bias="0" /> + <androidx.appcompat.widget.SwitchCompat android:id="@+id/quickstart_switch" android:layout_width="match_parent" ===================================== mobile/android/fenix/app/src/main/res/navigation/nav_graph.xml ===================================== @@ -27,6 +27,10 @@ app:popUpTo="@id/torConnectionAssistFragment" app:popUpToInclusive="true"/> + <action + android:id="@+id/action_navigate_to_connection_assist_from_anywhere" + app:destination="@id/torConnectionAssistFragment" /> + <action android:id="@+id/action_global_home" app:destination="@id/homeFragment" ===================================== mobile/android/fenix/app/src/main/res/values/preference_keys.xml ===================================== @@ -652,6 +652,7 @@ <string name="pref_key_tor_network_settings_bridge_config" translatable="false">pref_key_tor_network_settings_bridge_config</string> <string name="pref_key_tor_logs" translatable="false">pref_key_tor_logs</string> <string name="pref_key_about_config_shortcut" translatable="false">pref_key_about_config_shortcut</string> + <string name="pref_key_test_kill_tor" translatable="false">pref_key_test_kill_tor</string> <string name="pref_key_tor_network_settings_bridge_config_explanation" translatable="false">pref_key_tor_network_settings_bridge_config_explanation</string> <string name="pref_key_tor_network_settings_bridge_config_toggle" translatable="false">pref_key_tor_network_settings_bridge_config_toggle</string> <string name="pref_key_tor_network_settings_bridge_config_builtin_bridge_obfs4" translatable="false">pref_key_tor_network_settings_bridge_config_builtin_bridge_obfs4</string> ===================================== mobile/android/fenix/app/src/main/res/values/torbrowser_strings.xml ===================================== @@ -135,6 +135,32 @@ <string name="connection_assist_back_button_content_description_start_again">Start again</string> <!-- Connection assist. This message is shown briefly after the connection to the Tor network completes. --> <string name="connection_assist_bootstrap_succeeded_toast_message">Connected to Tor</string> + <!-- Connection assist. Here "process" is a noun, referring to the execution of a computer program. "Tor process" specifically refers to the execution of the tor program, which is the program that handles the connection to the "Tor network". --> + <string name="connection_assist_provider_stopped_title">The Tor process has stopped working</string> + <!-- Connection assist. Here "process" is a noun, referring to the execution of a computer program. --> + <string name="connection_assist_provider_stopped_description1">The underlying process that controls your connection to the Tor network has stopped working.</string> + <!-- Connection assist. --> + <string name="connection_assist_provider_stopped_description2">What could be causing this?</string> + <!-- Connection assist. Here "process" is a noun, referring to the execution of a computer program. --> + <string name="connection_assist_provider_stopped_description_battery1">Your device has quit the process to save battery.</string> + <!-- Connection assist. Here "process" is a noun, referring to the execution of a computer program. "Tor process" specifically refers to the execution of the tor program, which is the program that handles the connection to the "Tor network". --> + <string name="connection_assist_provider_stopped_description3">The Tor process has stopped working due to a technical issue.</string> + <!-- Connection assist. --> + <string name="connection_assist_provider_stopped_description4">What can you do about it?</string> + <!-- Connection assist. Here "process" is a noun, referring to the execution of a computer program. "Tor process" specifically refers to the execution of the tor program, which is the program that handles the connection to the "Tor network". --> + <string name="connection_assist_provider_stopped_description5">Try restarting the Tor process (this won’t close your browser tabs).</string> + <!-- Connection assist.--> + <string name="connection_assist_provider_stopped_description_turn_off_battery_saver_clickable">Turn off Battery Saver on your device</string> + <!-- Connection assist. "%1$s" will be replaced with connection_assist_provider_stopped_description_turn_off_battery_saver_clickable. Here "process" is a noun, referring to the execution of a computer program. "Tor process" specifically refers to the execution of the tor program, which is the program that handles the connection to the "Tor network". --> + <string name="connection_assist_provider_stopped_description_turn_off_battery_saver2">%1$s and try restarting the Tor process (this won’t close your browser tabs).</string> + <!-- Connection assist. "%1$s" will be replaced with connection_assist_provider_stopped_description7. --> + <string name="connection_assist_provider_stopped_description6">If the problem remains, get in contact with us through one of our %1$s.</string> + <!-- Connection assist. --> + <string name="connection_assist_provider_stopped_description7">support channels</string> + <!-- Connection assist. Here "process" is a noun, referring to the execution of a computer program. "Tor process" specifically refers to the execution of the tor program, which is the program that handles the connection to the "Tor network". --> + <string name="connection_assist_restart_connection_button">Restart Tor process</string> + <!-- Connection assist. Here "process" is a noun, referring to the execution of a computer program. "Tor process" specifically refers to the execution of the tor program, which is the program that handles the connection to the "Tor network". --> + <string name="connection_assist_restarting_connection_button">Restarting Tor process…</string> <!-- Notification title for closing browser tabs. "%s" will be replaced with the localised application name, such as "Tor Browser". --> <string name="notification_close_tor_browser_tabs">Close %s’s tabs?</string> ===================================== mobile/android/fenix/app/src/main/res/xml/secret_settings_preferences.xml ===================================== @@ -135,6 +135,10 @@ android:key="@string/pref_key_enable_lna_tracker_blocking_enabled" android:title="@string/preferences_debug_settings_enable_lna_tracker_blocking" app:iconSpaceReserved="false" /> + <Preference + android:key="@string/pref_key_test_kill_tor" + android:title="TEST kill tor daemon" + app:iconSpaceReserved="false" /> </PreferenceCategory> <PreferenceCategory ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/ProviderStatus.java ===================================== @@ -0,0 +1,11 @@ +package org.mozilla.geckoview; + +import org.mozilla.gecko.util.GeckoBundle; + +public class ProviderStatus { + public Boolean maybeConfigIssue; + + public ProviderStatus(GeckoBundle bundle) { + maybeConfigIssue = bundle.getBoolean("maybeConfigIssue"); + } +} ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorAndroidIntegration.java ===================================== @@ -57,6 +57,7 @@ public class TorAndroidIntegration implements BundleEventListener { private static final String EVENT_BOOTSTRAP_BEGIN_AUTO = "GeckoView:Tor:BootstrapBeginAuto"; private static final String EVENT_BOOTSTRAP_CANCEL = "GeckoView:Tor:BootstrapCancel"; private static final String EVENT_START_AGAIN = "GeckoView:Tor:StartAgain"; + private static final String EVENT_RESTART_PROVIDER = "GeckoView:Tor:RestartProvider"; private static final String EVENT_QUICKSTART_GET = "GeckoView:Tor:QuickstartGet"; private static final String EVENT_QUICKSTART_SET = "GeckoView:Tor:QuickstartSet"; private static final String EVENT_REGION_NAMES_GET = "GeckoView:Tor:RegionNamesGet"; @@ -706,6 +707,10 @@ public class TorAndroidIntegration implements BundleEventListener { return EventDispatcher.getInstance().queryVoid(EVENT_START_AGAIN); } + public @NonNull GeckoResult<Void> restartProvider() { + return EventDispatcher.getInstance().queryVoid(EVENT_RESTART_PROVIDER); + } + public interface QuickstartGetter { void onValue(boolean enabled); } ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorConnectStage.java ===================================== @@ -13,6 +13,7 @@ public class TorConnectStage { public Boolean potentiallyBlocked; public Boolean tryAgain; public TorBootstrappingStatus bootstrappingStatus; + public ProviderStatus providerStatus; public TorConnectStage(GeckoBundle bundle) { name = TorConnectStageName.fromString(bundle.getString("name")); @@ -26,6 +27,7 @@ public class TorConnectStage { error = new TorConnectError(bundle.getBundle("error")); } bootstrappingStatus = new TorBootstrappingStatus(bundle.getBundle("bootstrappingStatus")); + providerStatus = new ProviderStatus(bundle.getBundle("providerStatus")); } public Boolean isBootstrapped() { ===================================== mobile/android/geckoview/src/main/java/org/mozilla/geckoview/TorConnectStageName.java ===================================== @@ -3,9 +3,10 @@ package org.mozilla.geckoview; import java.security.InvalidParameterException; public enum TorConnectStageName { - // These names should match entries from TorConnectStage in TorConnect.sys.mjs at ~ln163. + // These names should match entries from TorConnectStage in TorConnect.sys.mjs at ~ln674. Disabled("Disabled"), Loading("Loading"), + ProviderStopped("ProviderStopped"), Start("Start"), Bootstrapping("Bootstrapping"), Offline("Offline"), ===================================== toolkit/components/tor-launcher/TorProcessAndroid.sys.mjs ===================================== @@ -51,6 +51,11 @@ export class TorProcessAndroid { * it failed to start tor. */ #startReject = null; + /** + * Tells whether we ever registered ourself as the listener to the various + * process events. + */ + #registeredListeners = false; onExit = () => {}; @@ -74,6 +79,7 @@ export class TorProcessAndroid { this, Object.values(TorIncomingEvents) ); + this.#registeredListeners = true; let config; try { config = await lazy.EventDispatcher.instance.sendRequestForResult( @@ -103,10 +109,13 @@ export class TorProcessAndroid { }); logger.debug("Sent the stop event."); this.#processHandle = null; - lazy.EventDispatcher.instance.unregisterListener( - this, - Object.values(TorIncomingEvents) - ); + if (this.#registeredListeners) { + lazy.EventDispatcher.instance.unregisterListener( + this, + Object.values(TorIncomingEvents) + ); + this.#registeredListeners = false; + } } onEvent(event, data, _callback) { ===================================== toolkit/modules/TorAndroidIntegration.sys.mjs ===================================== @@ -48,6 +48,7 @@ const ListenedEvents = Object.freeze({ bootstrapBeginAuto: "GeckoView:Tor:BootstrapBeginAuto", bootstrapCancel: "GeckoView:Tor:BootstrapCancel", startAgain: "GeckoView:Tor:StartAgain", + restartProvider: "GeckoView:Tor:RestartProvider", quickstartGet: "GeckoView:Tor:QuickstartGet", quickstartSet: "GeckoView:Tor:QuickstartSet", regionNamesGet: "GeckoView:Tor:RegionNamesGet", @@ -98,11 +99,6 @@ class TorAndroidIntegrationImpl { lazy.TorConnect.init(); lazy.TorDomainIsolator.init(); - - // On Android immediately call firstWindowLoaded. This should be safe to - // call since it will await the initialisation of the TorProvider set up - // by TorProviderBuilder.init. - lazy.TorProviderBuilder.firstWindowLoaded(); } observe(subj, topic) { @@ -203,6 +199,9 @@ class TorAndroidIntegrationImpl { case ListenedEvents.startAgain: lazy.TorConnect.startAgain(); break; + case ListenedEvents.restartProvider: + lazy.TorConnect.restartProvider(); + break; case ListenedEvents.quickstartGet: callback?.onSuccess(lazy.TorConnect.quickstart); return; ===================================== toolkit/modules/TorConnect.sys.mjs ===================================== @@ -1109,12 +1109,9 @@ export const TorConnect = { throw new Error(`Trying to set the stage to ${name} during a bootstrap`); } if (!this._providerRunning && name !== TorConnectStage.ProviderStopped) { - if (!lazy.TorLauncherUtil.isAndroid) { - // TODO: Remove Android exception. - throw new Error( - `Trying to set the stage to ${name} when provider is not running` - ); - } + throw new Error( + `Trying to set the stage to ${name} when provider is not running` + ); } lazy.logger.info(`Entering stage ${name}`); @@ -1596,13 +1593,8 @@ export const TorConnect = { return; } if (!this._providerRunning && stage !== TorConnectStage.ProviderStopped) { - if (!lazy.TorLauncherUtil.isAndroid) { - // TODO: Remove Android exception. - lazy.logger.warn( - `Cannot move to ${stage} when provider is not running` - ); - return; - } + lazy.logger.warn(`Cannot move to ${stage} when provider is not running`); + return; } if (this._stageName === TorConnectStage.Loading) { if (stage === TorConnectStage.ProviderStopped) { @@ -1709,13 +1701,7 @@ export const TorConnect = { // But other methods should take into account that _providerRunning is now // `false` to early return and guarantee that we enter this // ProviderStopped stage. - if (lazy.TorLauncherUtil.isAndroid) { - // TODO: Remove this Android path when android supports the - // `ProviderStopped` stage. - this._makeStageRequest(TorConnectStage.Start, true); - } else { - this._makeStageRequest(TorConnectStage.ProviderStopped, true); - } + this._makeStageRequest(TorConnectStage.ProviderStopped, true); } } View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/14f24e… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/14f24e… You're receiving this email because of your account on gitlab.torproject.org. Manage all notifications: https://gitlab.torproject.org/-/profile/notifications | Help: https://gitlab.torproject.org/help
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-153.0esr-16.0-1] 2 commits: fixup! Firefox preference overrides.
by morgan (@morgan) 05 Aug '26

05 Aug '26
morgan pushed to branch mullvad-browser-153.0esr-16.0-1 at The Tor Project / Applications / Mullvad Browser Commits: 2ded1d0f by Henry Wilkes at 2026-08-05T15:44:59+00:00 fixup! Firefox preference overrides. BB 45187: Disable delete private downloads. - - - - - 2bc2f83b by Henry Wilkes at 2026-08-05T15:45:00+00:00 fixup! BB 42027: Base Browser migration procedures. BB 45187: Clear the private downloads preferences in case we re-enable this again in the future. - - - - - 2 changed files: - browser/app/profile/001-base-profile.js - browser/components/ProfileDataUpgrader.sys.mjs Changes: ===================================== browser/app/profile/001-base-profile.js ===================================== @@ -72,6 +72,10 @@ pref("browser.helperApps.deleteTempFileOnExit", true); // Prevent download stuffing / DOS (tor-browser#41764) pref("browser.download.enable_spam_prevention", true); +// tor-browser#45187: Disable offering to delete downloaded files when closing +// private browsing windows because it does not work as expected in 16.0. +pref("browser.download.enableDeletePrivate", false); + // tor-browser#41131: This is normally gated on // privacy.sanitize.sanitizeOnShutdown, which is false by default. But in case // users enable it, make sure background tasks are not used for this, since we ===================================== browser/components/ProfileDataUpgrader.sys.mjs ===================================== @@ -1041,6 +1041,8 @@ export let ProfileDataUpgrader = { // Version 5: 15.0a3: Disable LaterRun using prefs. tor-browser#42630. // Version 6: 15.0a4: Reset browser colors. tor-browser#43850. // Version 7: 16.0a10: Reset safe browsing preferences. tor-browser#44802. + // Also reset delete downloads preferences. + // tor-browser#45187. const MIGRATION_VERSION = 7; const MIGRATION_PREF = "basebrowser.migration.version"; @@ -1140,16 +1142,20 @@ export let ProfileDataUpgrader = { } } if (currentVersion < 7) { - // Clear these preferences since: - // + They aren't expected to work. - // + We are hiding the UI to change these. tor-browser#44802. for (const prefName of [ + // Clear these preferences since: + // + They aren't expected to work. + // + We are hiding the UI to change these. tor-browser#44802. "browser.safebrowsing.phishing.enabled", "browser.safebrowsing.malware.enabled", "browser.safebrowsing.downloads.enabled", "browser.safebrowsing.downloads.remote.block_uncommon", "browser.safebrowsing.downloads.remote.block_potentially_unwanted", "urlclassifier.malwareTable", + // Clear the downloads preferences for alpha profiles in case we want to + // re-offer this feature again in the future. tor-browser#45187. + "browser.download.deletePrivate", + "browser.download.deletePrivate.chosen", ]) { Services.prefs.clearUserPref(prefName); } View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/cf… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/cf… You're receiving this email because of your account on gitlab.torproject.org. Manage all notifications: https://gitlab.torproject.org/-/profile/notifications | Help: https://gitlab.torproject.org/help
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-153.0esr-16.0-1] 2 commits: fixup! Firefox preference overrides.
by morgan (@morgan) 05 Aug '26

05 Aug '26
morgan pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 75a95c6d by Henry Wilkes at 2026-08-05T15:40:33+00:00 fixup! Firefox preference overrides. BB 45187: Disable delete private downloads. - - - - - 14f24ee0 by Henry Wilkes at 2026-08-05T15:40:33+00:00 fixup! BB 42027: Base Browser migration procedures. BB 45187: Clear the private downloads preferences in case we re-enable this again in the future. - - - - - 2 changed files: - browser/app/profile/001-base-profile.js - browser/components/ProfileDataUpgrader.sys.mjs Changes: ===================================== browser/app/profile/001-base-profile.js ===================================== @@ -72,6 +72,10 @@ pref("browser.helperApps.deleteTempFileOnExit", true); // Prevent download stuffing / DOS (tor-browser#41764) pref("browser.download.enable_spam_prevention", true); +// tor-browser#45187: Disable offering to delete downloaded files when closing +// private browsing windows because it does not work as expected in 16.0. +pref("browser.download.enableDeletePrivate", false); + // tor-browser#41131: This is normally gated on // privacy.sanitize.sanitizeOnShutdown, which is false by default. But in case // users enable it, make sure background tasks are not used for this, since we ===================================== browser/components/ProfileDataUpgrader.sys.mjs ===================================== @@ -1041,6 +1041,8 @@ export let ProfileDataUpgrader = { // Version 5: 15.0a3: Disable LaterRun using prefs. tor-browser#42630. // Version 6: 15.0a4: Reset browser colors. tor-browser#43850. // Version 7: 16.0a10: Reset safe browsing preferences. tor-browser#44802. + // Also reset delete downloads preferences. + // tor-browser#45187. const MIGRATION_VERSION = 7; const MIGRATION_PREF = "basebrowser.migration.version"; @@ -1140,16 +1142,20 @@ export let ProfileDataUpgrader = { } } if (currentVersion < 7) { - // Clear these preferences since: - // + They aren't expected to work. - // + We are hiding the UI to change these. tor-browser#44802. for (const prefName of [ + // Clear these preferences since: + // + They aren't expected to work. + // + We are hiding the UI to change these. tor-browser#44802. "browser.safebrowsing.phishing.enabled", "browser.safebrowsing.malware.enabled", "browser.safebrowsing.downloads.enabled", "browser.safebrowsing.downloads.remote.block_uncommon", "browser.safebrowsing.downloads.remote.block_potentially_unwanted", "urlclassifier.malwareTable", + // Clear the downloads preferences for alpha profiles in case we want to + // re-offer this feature again in the future. tor-browser#45187. + "browser.download.deletePrivate", + "browser.download.deletePrivate.chosen", ]) { Services.prefs.clearUserPref(prefName); } View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/72159c… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/72159c… You're receiving this email because of your account on gitlab.torproject.org. Manage all notifications: https://gitlab.torproject.org/-/profile/notifications | Help: https://gitlab.torproject.org/help
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-153.0esr-16.0-1] 2 commits: fixup! MB 21: Disable the password manager
by morgan (@morgan) 05 Aug '26

05 Aug '26
morgan pushed to branch mullvad-browser-153.0esr-16.0-1 at The Tor Project / Applications / Mullvad Browser Commits: c999d3d0 by Pier Angelo Vendrame at 2026-08-05T15:31:00+00:00 fixup! MB 21: Disable the password manager MB 538: Use settings config for our customization. - - - - - cf1410d6 by Henry Wilkes at 2026-08-05T15:31:00+00:00 amend! MB 34: Hide unsafe and unwanted preferences UI MB 34: Hide unwanted setting controls in Mullvad Browser. - - - - - 4 changed files: - browser/components/preferences/config/passwords-autofill.mjs - browser/components/preferences/config/search.mjs - browser/components/preferences/preferences.js - browser/components/preferences/search.inc.xhtml Changes: ===================================== browser/components/preferences/config/passwords-autofill.mjs ===================================== @@ -675,6 +675,9 @@ SettingGroupManager.registerGroups({ inProgress: false, id: "passwordsGroup", subcategory: "logins", + // Hide all password controls. mullvad-browser#21. + hidden: true, + hiddenFromSearch: true, l10nId: "forms-passwords-header", headingLevel: 2, items: [ ===================================== browser/components/preferences/config/search.mjs ===================================== @@ -286,6 +286,8 @@ Preferences.addSetting({ Preferences.addSetting({ id: "suggestionsInSearchFieldsCheckbox", deps: ["searchSuggestionsEnabledPref", "urlbarSuggestionsEnabledPref"], + // Hide search suggestions. mullvad-browser#34. + visible: () => false, get(_, deps) { let searchBarVisible = !!lazy.CustomizableUI.getPlacementOfWidget("search-container"); ===================================== browser/components/preferences/preferences.js ===================================== @@ -384,7 +384,7 @@ const CONFIG_PANES = Object.freeze({ groupIds: ["passwords", "payments", "addresses"], module: "chrome://browser/content/preferences/config/passwords-autofill.mjs", - visible: () => srdSectionEnabled("passwordsAutofill"), + visible: () => false, }, privacy: { l10nId: "pane-privacy-section", ===================================== browser/components/preferences/search.inc.xhtml ===================================== @@ -17,7 +17,7 @@ <!-- Search Suggestions --> - <html:setting-group groupid="searchSuggestions" data-srd-migrated="" data-category="paneSearch" hidden="true" data-hidden-from-search="true" /> + <html:setting-group groupid="searchSuggestions" data-srd-migrated="" data-category="paneSearch" hidden="true" /> <!-- Firefox Suggest / Address Bar --> <html:setting-group groupid="firefoxSuggest" data-category="paneSearch" hidden="true" data-subcategory="locationBar" data-srd-migrated=""/> View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/a5… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/a5… You're receiving this email because of your account on gitlab.torproject.org. Manage all notifications: https://gitlab.torproject.org/-/profile/notifications | Help: https://gitlab.torproject.org/help
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-153.0esr-16.0-1] fixup! TB 27476: Implement about:torconnect captive portal within Tor Browser
by morgan (@morgan) 05 Aug '26

05 Aug '26
morgan pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 72159ca2 by Pier Angelo Vendrame at 2026-08-05T14:10:10+00:00 fixup! TB 27476: Implement about:torconnect captive portal within Tor Browser TB 45192: Fix about:torconnect redirects for HSTS-preloaded URLs. - - - - - 1 changed file: - toolkit/content/aboutNetError.mjs Changes: ===================================== toolkit/content/aboutNetError.mjs ===================================== @@ -1384,28 +1384,29 @@ async function ensureCertErrorCode() { i++; errorCode = await retryCertErrorCode(); } +} - if (!errorCode) { - errorCode = gErrorCode; +async function maybeRedirectToBootstrap() { + if (gErrorCode !== "proxyConnectFailure") { + return; } - if (errorCode === "proxyConnectFailure") { - let inIframe; - try { - inIframe = window.self !== window.top; - } catch { - // Assume a frame if access to top is blocked. - inIframe = true; - } - if (!inIframe && (await RPMSendQuery("ShouldShowTorConnect"))) { - // pass orginal destination as redirect param - const encodedRedirect = encodeURIComponent(document.location.href); - document.location.replace(`about:torconnect?redirect=${encodedRedirect}`); - } + let inIframe; + try { + inIframe = window.self !== window.top; + } catch { + // Assume a frame if access to top is blocked. + inIframe = true; + } + if (!inIframe && (await RPMSendQuery("ShouldShowTorConnect"))) { + // pass orginal destination as redirect param + const encodedRedirect = encodeURIComponent(document.location.href); + document.location.replace(`about:torconnect?redirect=${encodedRedirect}`); } } async function main() { await ensureCertErrorCode(); + await maybeRedirectToBootstrap(); if (!NetErrorCard.isSupported()) { // Initialize the error registry for legacy path initializeRegistry(); View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/72159ca… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/72159ca… You're receiving this email because of your account on gitlab.torproject.org. Manage all notifications: https://gitlab.torproject.org/-/profile/notifications | Help: https://gitlab.torproject.org/help
1 0
0 0
[Git][tpo/applications/mullvad-browser][mullvad-browser-153.0esr-16.0-1] 2 commits: fixup! BB 41930: Remove the UI to customize accept_languages.
by morgan (@morgan) 05 Aug '26

05 Aug '26
morgan pushed to branch mullvad-browser-153.0esr-16.0-1 at The Tor Project / Applications / Mullvad Browser Commits: 951624bc by Henry Wilkes at 2026-08-05T13:42:16+00:00 fixup! BB 41930: Remove the UI to customize accept_languages. BB 45176: Add "Request English" checkbox to Website langauges. - - - - - a5278b6c by Henry Wilkes at 2026-08-05T13:42:16+00:00 fixup! Base Browser strings BB 45176: Modify the "Website langauge" description for Tor Browser. - - - - - 4 changed files: - browser/components/preferences/config/languages.mjs - browser/components/preferences/main.inc.xhtml - browser/components/preferences/main.js - toolkit/locales/en-US/toolkit/global/base-browser.ftl Changes: ===================================== browser/components/preferences/config/languages.mjs ===================================== @@ -899,7 +899,9 @@ SettingGroupManager.registerGroups({ }, websiteLanguage: { inProgress: true, - l10nId: "website-language-heading", + // Modify the description to remove any mention of choosing the order of + // languages. tor-browser#45176. + l10nId: "website-language-heading-no-preferred-order", headingLevel: 2, iconSrc: "chrome://global/skin/icons/defaultFavicon.svg", items: [ @@ -942,9 +944,14 @@ SettingGroupManager.registerGroups({ }, ], }, + { + id: "websiteSpoofEnglish", + l10nId: "languages-customize-spoof-english", + }, ], }, - websiteSpoofEnglish: { + // TODO: Remove once we switch to the new settings redesign. tor-browser#45177 + websiteSpoofEnglishControl: { items: [ { id: "websiteSpoofEnglish", ===================================== browser/components/preferences/main.inc.xhtml ===================================== @@ -105,7 +105,7 @@ </hbox> <!-- TODO: Integrate into the "Languages" setting-group after bugzilla bug - 1972081. --> - <html:setting-group groupid="websiteSpoofEnglish"></html:setting-group> + <html:setting-group groupid="websiteSpoofEnglishControl"></html:setting-group> <checkbox id="useSystemLocale" hidden="true" data-l10n-id="use-system-locale" ===================================== browser/components/preferences/main.js ===================================== @@ -820,7 +820,7 @@ var gMainPane = { initSettingGroup("fonts"); initSettingGroup("browserLanguage"); initSettingGroup("websiteLanguage"); - initSettingGroup("websiteSpoofEnglish"); + initSettingGroup("websiteSpoofEnglishControl"); initSettingGroup("browsing"); initSettingGroup("keyboardAndScrolling"); initSettingGroup("motionAndLink"); ===================================== toolkit/locales/en-US/toolkit/global/base-browser.ftl ===================================== @@ -122,6 +122,14 @@ preferences-contrast-control-fixed-color2 = .accesskey = F .description = This will be detectable by websites and will make you appear more unique to web trackers. +## Preferences - Language. + +# "{ -brand-short-name }" will be replaced with the localized name of the browser, e.g. "Tor Browser". +# This is modified from the "website-language-heading" string from Firefox. See Firefox's translation on Pontoon using the "LOCALES" tab: https://pontoon.mozilla.org/ar/firefox/browser/browser/preferences/preferen… . +website-language-heading-no-preferred-order = + .label = Website language + .description = Some web pages are displayed in multiple languages. Choose how { -brand-short-name } should request them. + ## Security level toolbar button. ## Uses sentence case in English (US). ## ".label" is the accessible name, and shown in the overflow menu and when customizing the toolbar. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/d0… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/d0… You're receiving this email because of your account on gitlab.torproject.org. Manage all notifications: https://gitlab.torproject.org/-/profile/notifications | Help: https://gitlab.torproject.org/help
1 0
0 0
[Git][tpo/applications/tor-browser][tor-browser-153.0esr-16.0-1] 2 commits: fixup! BB 41930: Remove the UI to customize accept_languages.
by morgan (@morgan) 05 Aug '26

05 Aug '26
morgan pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 472b5456 by Henry Wilkes at 2026-08-05T13:26:44+00:00 fixup! BB 41930: Remove the UI to customize accept_languages. BB 45176: Add "Request English" checkbox to Website langauges. - - - - - c81304d6 by Henry Wilkes at 2026-08-05T13:26:44+00:00 fixup! Base Browser strings BB 45176: Modify the "Website langauge" description for Tor Browser. - - - - - 4 changed files: - browser/components/preferences/config/languages.mjs - browser/components/preferences/main.inc.xhtml - browser/components/preferences/main.js - toolkit/locales/en-US/toolkit/global/base-browser.ftl Changes: ===================================== browser/components/preferences/config/languages.mjs ===================================== @@ -899,7 +899,9 @@ SettingGroupManager.registerGroups({ }, websiteLanguage: { inProgress: true, - l10nId: "website-language-heading", + // Modify the description to remove any mention of choosing the order of + // languages. tor-browser#45176. + l10nId: "website-language-heading-no-preferred-order", headingLevel: 2, iconSrc: "chrome://global/skin/icons/defaultFavicon.svg", items: [ @@ -942,9 +944,14 @@ SettingGroupManager.registerGroups({ }, ], }, + { + id: "websiteSpoofEnglish", + l10nId: "languages-customize-spoof-english", + }, ], }, - websiteSpoofEnglish: { + // TODO: Remove once we switch to the new settings redesign. tor-browser#45177 + websiteSpoofEnglishControl: { items: [ { id: "websiteSpoofEnglish", ===================================== browser/components/preferences/main.inc.xhtml ===================================== @@ -105,7 +105,7 @@ </hbox> <!-- TODO: Integrate into the "Languages" setting-group after bugzilla bug - 1972081. --> - <html:setting-group groupid="websiteSpoofEnglish"></html:setting-group> + <html:setting-group groupid="websiteSpoofEnglishControl"></html:setting-group> <checkbox id="useSystemLocale" hidden="true" data-l10n-id="use-system-locale" ===================================== browser/components/preferences/main.js ===================================== @@ -827,7 +827,7 @@ var gMainPane = { initSettingGroup("fonts"); initSettingGroup("browserLanguage"); initSettingGroup("websiteLanguage"); - initSettingGroup("websiteSpoofEnglish"); + initSettingGroup("websiteSpoofEnglishControl"); initSettingGroup("browsing"); initSettingGroup("keyboardAndScrolling"); initSettingGroup("motionAndLink"); ===================================== toolkit/locales/en-US/toolkit/global/base-browser.ftl ===================================== @@ -122,6 +122,14 @@ preferences-contrast-control-fixed-color2 = .accesskey = F .description = This will be detectable by websites and will make you appear more unique to web trackers. +## Preferences - Language. + +# "{ -brand-short-name }" will be replaced with the localized name of the browser, e.g. "Tor Browser". +# This is modified from the "website-language-heading" string from Firefox. See Firefox's translation on Pontoon using the "LOCALES" tab: https://pontoon.mozilla.org/ar/firefox/browser/browser/preferences/preferen… . +website-language-heading-no-preferred-order = + .label = Website language + .description = Some web pages are displayed in multiple languages. Choose how { -brand-short-name } should request them. + ## Security level toolbar button. ## Uses sentence case in English (US). ## ".label" is the accessible name, and shown in the overflow menu and when customizing the toolbar. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/7d1427… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/7d1427… You're receiving this email because of your account on gitlab.torproject.org. Manage all notifications: https://gitlab.torproject.org/-/profile/notifications | Help: https://gitlab.torproject.org/help
1 0
0 0
  • ← Newer
  • 1
  • ...
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • ...
  • 2087
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.