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

July 2026

  • 1 participants
  • 154 discussions
[Git][tpo/applications/tor-browser][tor-browser-153.0esr-16.0-1] 3 commits: BB 45085: [android] Confine GooglePlayIntegrityClient to Components.kt
by brizental (@brizental) 28 Jul '26

28 Jul '26
brizental pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: d4d29dca by Beatriz Rizental at 2026-07-28T15:50:37+02:00 BB 45085: [android] Confine GooglePlayIntegrityClient to Components.kt Uplifting: https://phabricator.services.mozilla.com/D313912 - - - - - 584d0657 by Beatriz Rizental at 2026-07-28T15:50:37+02:00 fixup! [android] Disable features and functionality Bug 45085: Disable GooglePlayIntegrity - - - - - 51b77601 by Beatriz Rizental at 2026-07-28T15:50:37+02:00 fixup! [android] Disable features and functionality Bug 45134: Return deterministic NIL value for ClientUUID - - - - - 6 changed files: - mobile/android/fenix/app/build.gradle - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/ClientUUID.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/llm/Llm.kt - mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/ClientUUIDTest.kt Changes: ===================================== mobile/android/fenix/app/build.gradle ===================================== @@ -564,7 +564,6 @@ dependencies { implementation project(':components:lib-push-firebase') implementation project(':components:lib-state') implementation project(':components:lib-accelerometer-sensormanager') - implementation project(':components:lib-integrity-googleplay') implementation project(':components:lib-llm-mlpa') implementation project(':components:lib-shake') implementation project(':components:lib-ai-controls') ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt ===================================== @@ -592,7 +592,7 @@ open class FenixApplication : Application(), Provider, ThemeProvider { } runOnVisualCompleteness(queue) { GlobalScope.launch(IO) { - components.integrityClient.warmUp() + components.warmUpIntegrityClient() } } } ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/ClientUUID.kt ===================================== @@ -6,8 +6,6 @@ package org.mozilla.fenix.components import android.content.Context import android.content.SharedPreferences -import androidx.core.content.edit -import mozilla.components.lib.integrity.googleplay.RequestHashProvider import mozilla.components.lib.llm.mlpa.UserIdProvider import mozilla.components.lib.llm.mlpa.service.UserId import mozilla.components.support.ktx.kotlin.toHexString @@ -39,9 +37,15 @@ fun interface Hasher { /** * Generates and persists a stable per-install UUID, used to identify this client - * consistently across [UserIdProvider] and [RequestHashProvider] consumers. + * consistently across [UserIdProvider] consumers and other callers that need a + * stable per-request hash derived from that UUID. */ -interface ClientUUID : UserIdProvider, RequestHashProvider { +interface ClientUUID : UserIdProvider { + /** + * Generates a hash derived from the client's stable UUID. + */ + fun generateHash(): String + companion object { /** * Convenience initializer that creates a [SharedPreferences] to be used by [ClientUUID]. @@ -62,12 +66,9 @@ internal class PrefsBackedClientUUID( private val generateUUID: () -> String = { UUID.randomUUID().toString() }, private val hasher: Hasher = Hasher.sha256, ) : ClientUUID { + // tor-browser#45134: never expose a unique, trackable per-install identifier. private val uuid: String by lazy { - getPrefs().let { prefs -> - prefs.getString(KEY, null) ?: generateUUID().also { - prefs.edit { putString(KEY, it) } - } - } + NIL_UUID } override fun getUserId() = UserId(uuid) @@ -76,5 +77,6 @@ internal class PrefsBackedClientUUID( companion object { private const val KEY = "uuid" + private const val NIL_UUID = "00000000-0000-0000-0000-000000000000" } } ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/Components.kt ===================================== @@ -19,6 +19,7 @@ import kotlinx.coroutines.MainScope import kotlinx.coroutines.SupervisorJob import mozilla.components.concept.ai.controls.AIFeatureBlock import mozilla.components.concept.ai.controls.AIFeatureRegistry +import mozilla.components.concept.integrity.IntegrityClient import mozilla.components.feature.addons.AddonManager import mozilla.components.feature.addons.amo.AMOAddonsProvider import mozilla.components.feature.addons.migration.DefaultSupportedAddonsChecker @@ -31,7 +32,6 @@ import mozilla.components.lib.ai.controls.dataStore import mozilla.components.lib.ai.controls.default import mozilla.components.lib.crash.store.CrashAction import mozilla.components.lib.crash.store.CrashMiddleware -import mozilla.components.lib.integrity.googleplay.GooglePlayIntegrityClient import mozilla.components.lib.llm.mlpa.MlpaTokenStorage import mozilla.components.lib.publicsuffixlist.PublicSuffixList import mozilla.components.service.fxrelay.eligibility.RelayEligibilityStore @@ -437,14 +437,18 @@ class Components(private val context: Context) { ) } - val integrityClient by lazyMonitored { - GooglePlayIntegrityClient.create( - context = context, - projectNumberToken = BuildConfig.GPS_INTEGRITY_TOKEN, - requestHashProvider = clientUUID, - ) + // tor-browser#45085: Disable Google Play Integrity + val integrityClient: IntegrityClient by lazyMonitored { + IntegrityClient { Result.failure(IllegalStateException("Google Play Integrity is disabled")) } } + /** + * Eagerly initializes the underlying Play Integrity token provider. This is exposed + * separately from [integrityClient] because warm-up is specific to the Google + * Play-backed implementation and isn't part of the [IntegrityClient] concept. + */ + suspend fun warmUpIntegrityClient(): Boolean = false // tor-browser#45085: no-op + val termsOfUsePromptRepository by lazyMonitored { DefaultTermsOfUsePromptRepository(settings) } ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/llm/Llm.kt ===================================== @@ -5,8 +5,7 @@ package org.mozilla.fenix.components.llm import mozilla.components.concept.fetch.Client -import mozilla.components.lib.integrity.googleplay.GooglePlayIntegrityClient -import mozilla.components.lib.integrity.googleplay.IntegrityConsumer +import mozilla.components.concept.integrity.IntegrityClient import mozilla.components.lib.llm.mlpa.MlpaLlmProvider import mozilla.components.lib.llm.mlpa.MlpaTokenProvider import mozilla.components.lib.llm.mlpa.MlpaTokenStorage @@ -25,7 +24,7 @@ class Llm( private val client: Client, private val storage: MlpaTokenStorage, private val fxaTokenProvider: FxaAccessTokenProvider, - private val integrityClient: GooglePlayIntegrityClient, + private val integrityClient: IntegrityClient, private val userIdProvider: UserIdProvider, ) { @@ -36,7 +35,7 @@ class Llm( MlpaTokenProvider.choose( MlpaTokenProvider.fxaTokenProvider(fxaTokenProvider), MlpaTokenProvider.mlpaIntegrityHandshake( - integrityClient = integrityClient.forConsumer(IntegrityConsumer.Summarize), + integrityClient = integrityClient, authenticationService = fenixMlpaService, userIdProvider = userIdProvider, storage = storage, ===================================== mobile/android/fenix/app/src/test/java/org/mozilla/fenix/components/ClientUUIDTest.kt ===================================== @@ -7,9 +7,25 @@ package org.mozilla.fenix.components import mozilla.components.lib.llm.mlpa.service.UserId import mozilla.components.support.test.fakes.android.FakeSharedPreferences import org.junit.Assert.assertEquals +import org.junit.Ignore import org.junit.Test class ClientUUIDTest { + @Test + fun `that the client uuid is always the nil uuid, regardless of generateUUID`() { + val prefs = FakeSharedPreferences() + val nilUuid = UserId("00000000-0000-0000-0000-000000000000") + + val first = PrefsBackedClientUUID({ prefs }, generateUUID = { "my-generated-uuid" }) + assertEquals(nilUuid, first.getUserId()) + // idempotency check + assertEquals(nilUuid, first.getUserId()) + + val second = PrefsBackedClientUUID({ prefs }, generateUUID = { "another-generated-uuid" }) + assertEquals(nilUuid, second.getUserId()) + } + + @Ignore("tor-browser#45134: PrefsBackedClientUUID always returns the nil uuid, see the test above") @Test fun `that a client uuid will only be generated the first time`() { val prefs = FakeSharedPreferences() @@ -25,6 +41,7 @@ class ClientUUIDTest { assertEquals(UserId("my-generated-uuid"), second.getUserId()) } + @Ignore("tor-browser#45134: PrefsBackedClientUUID always returns the nil uuid, so the hash is no longer derived from generateUUID's output") @Test fun `that generateHash uses the provided hasher`() { val prefs = FakeSharedPreferences() View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/5436a4… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/5436a4… 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] BB 44908: Do not read AutoConfig from /etc/firefox when --disable-system-preferences
by brizental (@brizental) 28 Jul '26

28 Jul '26
brizental pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 5436a4c1 by Beatriz Rizental at 2026-07-28T15:36:42+02:00 BB 44908: Do not read AutoConfig from /etc/firefox when --disable-system-preferences Uplifting: https://phabricator.services.mozilla.com/D314532 - - - - - 1 changed file: - extensions/pref/autoconfig/src/nsReadConfig.cpp Changes: ===================================== extensions/pref/autoconfig/src/nsReadConfig.cpp ===================================== @@ -243,7 +243,7 @@ nsresult nsReadConfig::openAndEvaluateJSFile(const char* aFileName, nsCOMPtr<nsIInputStream> inStr; if (isBinDir) { nsCOMPtr<nsIFile> jsFile; -#if defined(MOZ_WIDGET_GTK) +#if defined(MOZ_WIDGET_GTK) && defined(MOZ_SYSTEM_PREFERENCES) bool exists; rv = @@ -257,15 +257,15 @@ nsresult nsReadConfig::openAndEvaluateJSFile(const char* aFileName, if (NS_FAILED(rv)) return rv; if (!exists) { -#endif // defined(MOZ_WIDGET_GTK) +#endif // defined(MOZ_WIDGET_GTK) && defined(MOZ_SYSTEM_PREFERENCES) rv = NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(jsFile)); if (NS_FAILED(rv)) return rv; rv = jsFile->AppendNative(nsDependentCString(aFileName)); if (NS_FAILED(rv)) return rv; -#if defined(MOZ_WIDGET_GTK) +#if defined(MOZ_WIDGET_GTK) && defined(MOZ_SYSTEM_PREFERENCES) } -#endif // defined(MOZ_WIDGET_GTK) +#endif // defined(MOZ_WIDGET_GTK) && defined(MOZ_SYSTEM_PREFERENCES) rv = NS_NewLocalFileInputStream(getter_AddRefs(inStr), jsFile); if (NS_FAILED(rv)) return rv; View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/5436a4c… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/5436a4c… 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] fixup! BB 9173: Change the default Firefox profile directory to be relative.
by morgan (@morgan) 28 Jul '26

28 Jul '26
morgan pushed to branch mullvad-browser-153.0esr-16.0-1 at The Tor Project / Applications / Mullvad Browser Commits: 88be53ba by Pier Angelo Vendrame at 2026-07-28T13:34:27+00:00 fixup! BB 9173: Change the default Firefox profile directory to be relative. BB 45074: Do not promote Tor Browser as a PDF viewer. This functionality does not work when in portable mode. - - - - - 1 changed file: - toolkit/actors/AboutPDFParent.sys.mjs Changes: ===================================== toolkit/actors/AboutPDFParent.sys.mjs ===================================== @@ -29,7 +29,14 @@ export class AboutPDFParent extends JSWindowActorParent { } #canSetDefaultPDFHandler() { - if (!ShellService || AppConstants.platform != "win") { + const xreDirProvider = Cc[ + "@mozilla.org/xre/directory-provider;1" + ].getService(Ci.nsIXREDirProvider); + if ( + !ShellService || + AppConstants.platform != "win" || + xreDirProvider.isPortableMode + ) { return false; } View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/88b… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/88b… 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! BB 9173: Change the default Firefox profile directory to be relative.
by morgan (@morgan) 28 Jul '26

28 Jul '26
morgan pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 572ec37e by Pier Angelo Vendrame at 2026-07-28T13:33:06+00:00 fixup! BB 9173: Change the default Firefox profile directory to be relative. BB 45074: Do not promote Tor Browser as a PDF viewer. This functionality does not work when in portable mode. - - - - - 1 changed file: - toolkit/actors/AboutPDFParent.sys.mjs Changes: ===================================== toolkit/actors/AboutPDFParent.sys.mjs ===================================== @@ -29,7 +29,14 @@ export class AboutPDFParent extends JSWindowActorParent { } #canSetDefaultPDFHandler() { - if (!ShellService || AppConstants.platform != "win") { + const xreDirProvider = Cc[ + "@mozilla.org/xre/directory-provider;1" + ].getService(Ci.nsIXREDirProvider); + if ( + !ShellService || + AppConstants.platform != "win" || + xreDirProvider.isPortableMode + ) { return false; } View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/572ec37… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/572ec37… 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] 6 commits: fixup! BB 41916: Letterboxing preferences UI
by henry (@henry) 28 Jul '26

28 Jul '26
henry pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 34750d3a by Henry Wilkes at 2026-07-28T13:15:52+00:00 fixup! BB 41916: Letterboxing preferences UI BB 44959: Swap about:manual link. - - - - - 1f471dc9 by Henry Wilkes at 2026-07-28T13:15:52+00:00 fixup! BB 40925: Implemented the Security Level component BB 44959: Swap about:manual link. - - - - - 2064e1c8 by Henry Wilkes at 2026-07-28T13:15:52+00:00 fixup! TB 11698: Incorporate Tor Browser Manual pages into Tor Browser TB 44959: Integrate the new manual. - - - - - 631c2c54 by Henry Wilkes at 2026-07-28T13:15:52+00:00 fixup! TB 30237: Add v3 onion services client authentication prompt TB 44959: Swap about:manual link. - - - - - da12add2 by Henry Wilkes at 2026-07-28T13:15:52+00:00 fixup! TB 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection TB 44959: Swap about:manual link. - - - - - 21d6cfe7 by Henry Wilkes at 2026-07-28T13:15:52+00:00 fixup! Add TorStrings module for localization TB 44959: Swap about:manual link. - - - - - 18 changed files: - browser/components/DesktopActorRegistry.sys.mjs - browser/components/about/AboutRedirector.cpp - + browser/components/aboutmanual/AboutManualChild.sys.mjs - + browser/components/aboutmanual/AboutManualParent.sys.mjs - + browser/components/aboutmanual/content/aboutManual.js - + browser/components/aboutmanual/jar.mn - + browser/components/aboutmanual/moz.build - browser/components/moz.build - browser/components/onionservices/content/authPopup.inc.xhtml - browser/components/preferences/config/passwords-autofill.mjs - browser/components/preferences/letterboxing.inc.xhtml - browser/components/securitylevel/content/securityLevelPanel.inc.xhtml - browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml - browser/components/torpreferences/config/connection.mjs - browser/components/torpreferences/content/connectionPane.inc.xhtml - browser/components/torpreferences/content/provideBridgeDialog.xhtml - toolkit/content/aboutNetError.mjs - toolkit/modules/TorStrings.sys.mjs Changes: ===================================== browser/components/DesktopActorRegistry.sys.mjs ===================================== @@ -126,6 +126,23 @@ let JSWINDOWACTORS = { remoteTypes: ["privilegedabout"], }, + AboutManual: { + parent: { + esModuleURI: + "moz-src:///browser/components/aboutmanual/AboutManualParent.sys.mjs", + }, + child: { + esModuleURI: + "moz-src:///browser/components/aboutmanual/AboutManualChild.sys.mjs", + + events: { + ManualLocaleSelected: { wantUntrusted: true }, + }, + }, + + matches: ["about:manual"], + }, + AboutMessagePreview: { parent: { esModuleURI: "resource:///actors/AboutMessagePreviewParent.sys.mjs", ===================================== browser/components/about/AboutRedirector.cpp ===================================== @@ -212,52 +212,45 @@ static nsAutoCString GetAboutModuleName(nsIURI* aURI) { return path; } -static nsTHashSet<nsCStringHashKey> GetManualLocales() { - nsTHashSet<nsCStringHashKey> locales; - RefPtr<nsZipArchive> zip = Omnijar::GetReader(Omnijar::APP); - if (!zip) { - // Probably a local build started with ./mach run - return locales; - } - UniquePtr<nsZipFind> find; - const nsAutoCString prefix("chrome/browser/content/browser/manual/"); - nsAutoCString needle = prefix; - needle.Append("*.html"); - if (NS_SUCCEEDED(zip->FindInit(needle.get(), getter_Transfers(find)))) { - const char* entryName; - uint16_t entryNameLen; - while (NS_SUCCEEDED(find->FindNext(&entryName, &entryNameLen))) { - // 5 is to remove the final `.html` - const size_t length = entryNameLen - prefix.Length() - 5; - locales.Insert(nsAutoCString(entryName + prefix.Length(), length)); - } - } - return locales; -} - static nsAutoCString GetManualChromeURI() { - static nsTHashSet<nsCStringHashKey> locales = GetManualLocales(); - - nsAutoCString reqLocale; - intl::LocaleService::GetInstance()->GetAppLocaleAsBCP47(reqLocale); - // Check every time the URL is needed in case the locale has changed. - // It might help also if we start allowing to change language, e.g., with a - // get parameter (see tor-browser#42675). - if (!locales.Contains(reqLocale) && reqLocale.Length() > 2 && - reqLocale[2] == '-') { - // At the moment, codes in our manual output are either 2 letters (en) or - // 5 letters (pt-BR) - reqLocale.SetLength(2); + nsTArray<nsCString> availableLocales; + nsCString availableLocalesStr; + if (NS_SUCCEEDED(mozilla::Preferences::GetCString( + "torbrowser.manual.available-locales", availableLocalesStr)) && + availableLocalesStr.Length() > 0) { + for (const nsACString& locale : availableLocalesStr.Split(',')) { + availableLocales.AppendElement(locale); + } } - if (!locales.Contains(reqLocale)) { - reqLocale = "en"; + nsCString tryLocale; + if (!NS_SUCCEEDED(mozilla::Preferences::GetCString("torbrowser.manual.locale", + tryLocale)) || + !availableLocales.Contains(tryLocale)) { + nsTArray<nsCString> appLocales; + intl::LocaleService::GetInstance()->GetAppLocalesAsBCP47(appLocales); + bool found = false; + for (size_t i = 0; i < appLocales.Length(); i++) { + tryLocale = appLocales[i]; + if (availableLocales.Contains(tryLocale)) { + found = true; + break; + } else if (tryLocale.Length() > 3 && tryLocale[2] == '-') { + // Strip the region code and see if the lang matches. + tryLocale.SetLength(2); + if (availableLocales.Contains(tryLocale)) { + found = true; + break; + } + } + } + if (!found) { + tryLocale.AssignLiteral("en"); + } } - - // %s is the language - constexpr char model[] = "chrome://browser/content/manual/%s.html"; - nsAutoCString url; - url.AppendPrintf(model, reqLocale.get()); - return url; + nsAutoCString uri; + uri.AppendPrintf("chrome://browser/content/aboutmanual/aboutManual-%s.html", + tryLocale.get()); + return uri; } NS_IMETHODIMP ===================================== browser/components/aboutmanual/AboutManualChild.sys.mjs ===================================== @@ -0,0 +1,15 @@ +/** + * Actor child class for the about:manual page. + */ +export class AboutManualChild extends JSWindowActorChild { + handleEvent(event) { + switch (event.type) { + case "ManualLocaleSelected": { + const locale = event.detail; + if (typeof locale === "string") { + this.sendAsyncMessage("AboutManual:LocaleSelected", locale); + } + } + } + } +} ===================================== browser/components/aboutmanual/AboutManualParent.sys.mjs ===================================== @@ -0,0 +1,21 @@ +/** + * Actor parent class for the about:manual page. + */ +export class AboutManualParent extends JSWindowActorParent { + receiveMessage(message) { + switch (message.name) { + case "AboutManual:LocaleSelected": { + const locale = message.data; + if ( + Services.prefs + .getStringPref("torbrowser.manual.available-locales", "") + .split(",") + .includes(locale) + ) { + Services.prefs.setStringPref("torbrowser.manual.locale", locale); + this.browsingContext.reload(Ci.nsIWebNavigation.LOAD_FLAGS_NONE); + } + } + } + } +} ===================================== browser/components/aboutmanual/content/aboutManual.js ===================================== @@ -0,0 +1,67 @@ +"use strict"; + +function changePage(initialLoad) { + let page; + const hash = location.hash; + const id = hash.startsWith("#") ? hash.substr(1) : null; + let targetEl = null; + if (id) { + targetEl = document.getElementById(id); + page = targetEl?.closest(".olm-page"); + } + if (!page) { + if (!initialLoad) { + // Make no change. + return; + } + page = document.getElementById("index"); + } + const currPage = document.querySelector(".olm-page:not(.d-none)"); + if (currPage === page) { + // No change in page. + return; + } + + currPage?.classList.add("d-none"); + page.classList.remove("d-none"); + + // If we are targeting an element that is not a page element, we want to + // scroll it into view (the focus position should have already shifted to + // point to it). + // Otherwise, if we have no target or the target is a page, we want to scroll + // to the top of the document so that the header is visible. + const doScroll = () => { + const scrollEl = targetEl && targetEl !== page ? targetEl : document.body; + scrollEl.scrollIntoView({ + behavior: "instant", + block: "start", + inline: "start", + }); + }; + if (initialLoad) { + window.addEventListener("load", doScroll, { once: true }); + } else { + doScroll(); + } +} + +window.addEventListener("DOMContentLoaded", () => { + const langDropdown = document.getElementById("language-menu-dropdown"); + for (const langButton of langDropdown.querySelectorAll("button")) { + langButton.addEventListener("click", () => { + dispatchEvent( + new CustomEvent("ManualLocaleSelected", { + // The button's lang attribute is expected to match the locale's code. + detail: langButton.getAttribute("lang"), + bubbles: true, + }) + ); + }); + } + + changePage(true); +}); + +window.addEventListener("hashchange", () => { + changePage(false); +}); ===================================== browser/components/aboutmanual/jar.mn ===================================== @@ -0,0 +1,2 @@ +browser.jar: + content/browser/aboutmanual/aboutManual.js (content/aboutManual.js) ===================================== browser/components/aboutmanual/moz.build ===================================== @@ -0,0 +1,6 @@ +JAR_MANIFESTS += ["jar.mn"] + +MOZ_SRC_FILES += [ + "AboutManualChild.sys.mjs", + "AboutManualParent.sys.mjs", +] ===================================== browser/components/moz.build ===================================== @@ -26,6 +26,7 @@ with Files("controlcenter/**"): DIRS += [ "about", + "aboutmanual", "aboutlogins", "abouttor", "aboutwelcome", ===================================== browser/components/onionservices/content/authPopup.inc.xhtml ===================================== @@ -6,7 +6,7 @@ <label class="text-link popup-notification-learnmore-link" is="text-link" - href="about:manual#onion-services_onion-service-authentication" + href="about:manual#features__onion-services___onion-service-auth" useoriginprincipal="true" data-l10n-id="onion-site-authentication-prompt-learn-more" /> ===================================== browser/components/preferences/config/passwords-autofill.mjs ===================================== @@ -792,7 +792,7 @@ SettingGroupManager.registerGroups({ onionSiteAuthentication: { l10nId: "onion-site-authentication-group", headingLevel: 2, - supportPage: "tor-manual:onion-services_onion-service-authentication", + supportPage: "tor-manual:features__onion-services___onion-service-auth", items: [ { id: "onionSiteSavedKeys", ===================================== browser/components/preferences/letterboxing.inc.xhtml ===================================== @@ -10,7 +10,7 @@ <html:span data-l10n-id="letterboxing-overview"></html:span> <html:a is="moz-support-link" - support-page="tor-manual:anti-fingerprinting_letterboxing" + support-page="tor-manual:features__fingerprinting-protections___letterboxing" data-l10n-id="letterboxing-learn-more" ></html:a> </description> ===================================== browser/components/securitylevel/content/securityLevelPanel.inc.xhtml ===================================== @@ -18,7 +18,7 @@ <html:a is="moz-support-link" id="securityLevel-learnMore" - support-page="tor-manual:security-settings" + support-page="tor-manual:features__security-levels" data-l10n-id="security-level-panel-learn-more-link" ></html:a> <html:img id="securityLevel-background-image" alt="" /> ===================================== browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml ===================================== @@ -13,7 +13,7 @@ ></html:span> <html:a is="moz-support-link" - support-page="tor-manual:security-settings" + support-page="tor-manual:features__security-levels" data-l10n-id="security-level-preferences-learn-more-link" ></html:a> </description> ===================================== browser/components/torpreferences/config/connection.mjs ===================================== @@ -13,7 +13,7 @@ SettingGroupManager.registerGroups({ connectionStatus: { inProgress: true, l10nId: "tor-connection-internet-status-group", - supportPage: "tor-manual:about", + supportPage: "tor-manual:getting-started__about-tor-browser", headingLevel: 2, items: [ { ===================================== browser/components/torpreferences/content/connectionPane.inc.xhtml ===================================== @@ -18,7 +18,7 @@ <label class="learnMore text-link" is="text-link" - href="about:manual#about" + href="about:manual#getting-started__about-tor-browser" useoriginprincipal="true" data-l10n-id="tor-connection-browser-learn-more-link" /> @@ -129,7 +129,7 @@ <label class="learnMore text-link" is="text-link" - href="about:manual#bridges" + href="about:manual#circumvention__unblocking-tor" useoriginprincipal="true" data-l10n-id="tor-bridges-learn-more-link" /> ===================================== browser/components/torpreferences/content/provideBridgeDialog.xhtml ===================================== @@ -37,7 +37,7 @@ <label is="text-link" class="learnMore text-link" - href="about:manual#bridges" + href="about:manual#circumvention__unblocking-tor" useoriginprincipal="true" data-l10n-id="user-provide-bridge-dialog-learn-more" /> ===================================== toolkit/content/aboutNetError.mjs ===================================== @@ -372,7 +372,7 @@ function initOnionError() { const learnMore = document.getElementById("learnMoreContainer"); learnMore.hidden = false; const learnMoreLink = document.getElementById("learnMoreLink"); - learnMoreLink.href = "about:manual#onion-services"; + learnMoreLink.href = "about:manual#features__onion-services"; setFocus("#netErrorButtonContainer > .try-again"); ===================================== toolkit/modules/TorStrings.sys.mjs ===================================== @@ -243,7 +243,7 @@ const Loader = { ); return { ...tsb.getStrings(strings), - learnMoreURL: "about:manual#onion-services", + learnMoreURL: "about:manual#features__onion-services", // XUL popups cannot open about: URLs, but we are online when showing the notification, so just use the online version learnMoreURLNotification: `https://tb-manual.torproject.org/${getLocale()}/onion-services/`, }; View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/a527ea… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/a527ea… 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! BB 44711: Hide unwanted setting controls in Base Browser.
by henry (@henry) 28 Jul '26

28 Jul '26
henry pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: a527ea6b by Henry Wilkes at 2026-07-28T13:13:39+00:00 fixup! BB 44711: Hide unwanted setting controls in Base Browser. BB 45156: Hide "Customize Firefox Home" in appearance settings. - - - - - 1 changed file: - browser/components/preferences/config/appearance.mjs Changes: ===================================== browser/components/preferences/config/appearance.mjs ===================================== @@ -90,6 +90,8 @@ Preferences.addSetting({ Preferences.addSetting({ id: "related-settings-home-link", + // Hide the "Customize Firefox Home" link. tor-browser#45156. + visible: () => false, onUserClick: e => { e.preventDefault(); window.gotoPref("paneHome"); View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/a527ea6… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/a527ea6… 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] fixup! MB 1: Mullvad Browser branding
by morgan (@morgan) 28 Jul '26

28 Jul '26
morgan pushed to branch mullvad-browser-153.0esr-16.0-1 at The Tor Project / Applications / Mullvad Browser Commits: 94c9c37a by Pier Angelo Vendrame at 2026-07-28T11:58:42+00:00 fixup! MB 1: Mullvad Browser branding MB 563: Hide Firefox's icon in about:pdf promo. - - - - - 1 changed file: - toolkit/components/aboutpdf/content/aboutPDF.html Changes: ===================================== toolkit/components/aboutpdf/content/aboutPDF.html ===================================== @@ -72,8 +72,6 @@ id="promo" hidden data-l10n-id="about-pdf-promo" - imagesrc="chrome://global/skin/illustrations/kit-in-circle.svg" - imagealignment="start" > <moz-button id="set-default" View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/94c… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/94c… 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] fixup! BB 43322: Customize the font visibility lists.
by morgan (@morgan) 28 Jul '26

28 Jul '26
morgan pushed to branch mullvad-browser-153.0esr-16.0-1 at The Tor Project / Applications / Mullvad Browser Commits: d890f6b8 by Pier Angelo Vendrame at 2026-07-28T11:56:22+00:00 fixup! BB 43322: Customize the font visibility lists. BB 44257: Disable locale-based font rules. We already try to enable locale-specific font in all languages instead, as long as they are available, or we provide bundled fonts to replace them. And in any case, this is a defense-in-depth, as locale-specific fonts are exlcuded anyway in RFP. - - - - - 1 changed file: - gfx/thebes/StandardFonts-win10.inc Changes: ===================================== gfx/thebes/StandardFonts-win10.inc ===================================== @@ -278,7 +278,7 @@ static const FontSubstitute kFontSubstitutes[] = { #endif -#ifdef FontInclusionByLocaleRules +#if defined(FontInclusionByLocaleRules) && !defined(BASE_BROWSER_VERSION) FONT_RULE("arabic typesetting", {"ar", MatchSetting::StartsWith}, {"fa", MatchSetting::StartsWith}) View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/d89… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/d89… 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! BB 43322: Customize the font visibility lists.
by morgan (@morgan) 28 Jul '26

28 Jul '26
morgan pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 0513b462 by Pier Angelo Vendrame at 2026-07-28T11:35:49+00:00 fixup! BB 43322: Customize the font visibility lists. BB 44257: Disable locale-based font rules. We already try to enable locale-specific font in all languages instead, as long as they are available, or we provide bundled fonts to replace them. And in any case, this is a defense-in-depth, as locale-specific fonts are exlcuded anyway in RFP. - - - - - 1 changed file: - gfx/thebes/StandardFonts-win10.inc Changes: ===================================== gfx/thebes/StandardFonts-win10.inc ===================================== @@ -278,7 +278,7 @@ static const FontSubstitute kFontSubstitutes[] = { #endif -#ifdef FontInclusionByLocaleRules +#if defined(FontInclusionByLocaleRules) && !defined(BASE_BROWSER_VERSION) FONT_RULE("arabic typesetting", {"ar", MatchSetting::StartsWith}, {"fa", MatchSetting::StartsWith}) View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/0513b46… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/0513b46… 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 31286: Implementation of bridge, proxy, and firewall settings in...
by morgan (@morgan) 28 Jul '26

28 Jul '26
morgan pushed to branch tor-browser-153.0esr-16.0-1 at The Tor Project / Applications / Tor Browser Commits: 7bfb497b by Henry Wilkes at 2026-07-28T11:22:09+00:00 fixup! TB 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection TB 45125: Make sure observers are removed when the page in unloaded. Also remove a race condition between successive locale changes. - - - - - 1 changed file: - browser/components/torpreferences/content/bridgemoji/BridgeEmoji.js Changes: ===================================== browser/components/torpreferences/content/bridgemoji/BridgeEmoji.js ===================================== @@ -5,59 +5,89 @@ * Element to display a single bridge emoji, with a localized name. */ class BridgeEmoji extends HTMLElement { + /** + * The instances that are active (in the DOM). + * + * @type {Set<BridgeEmoji>} + */ static #activeInstances = new Set(); - static #observer(subject, topic) { - if (topic === "intl:app-locales-changed") { - BridgeEmoji.#updateEmojiLangCode(); - } - } - static #addActiveInstance(inst) { - if (this.#activeInstances.size === 0) { - Services.obs.addObserver(this.#observer, "intl:app-locales-changed"); - this.#updateEmojiLangCode(); - } - this.#activeInstances.add(inst); - } - - static #removeActiveInstance(inst) { - this.#activeInstances.delete(inst); - if (this.#activeInstances.size === 0) { - Services.obs.removeObserver(this.#observer, "intl:app-locales-changed"); - } - } + /** + * A promise that resolves with a list of emoji strings, in a specific + * order. Each BridgeEmoji instance has an `#index` in this list, which + * points to its corresponding emoji. + * + * @type {Promise<string[]>} + */ + static #emojiListPromise = fetch( + "chrome://browser/content/torpreferences/bridgemoji/bridge-emojis.json" + ).then(response => response.json()); /** - * The language code for emoji annotations. + * @typedef {{[key: string]: string}} EmojiAnnotations * - * null if unset. + * A map from an emoji's codepoint to a locale's annotation. + */ + /** + * A promise that resolves with a map from locales to their annotations. + * + * @type {Promise<{[key: string]: EmojiAnnotattions}>} + */ + static #annotationsPromise = fetch( + "chrome://browser/content/torpreferences/bridgemoji/annotations.json" + ).then(response => response.json()); + + /** + * @typedef {object} EmojiLocaleDetails * - * @type {string?} + * @property {string[]} [emojiList] - A list of emojis as strings, in a + * specific order. + * @property {EmojiAnnotations} [annotations] - The annotations for the + * locale. + * @property {string} [unknownString] - The string to use for emojis with + * undefined annotations. */ - static #emojiLangCode = null; /** - * A promise that resolves to two JSON structures for bridge-emojis.json and - * annotations.json, respectively. + * The cached locale details. * - * @type {Promise} + * @type {EmojiLocaleDetails} */ - static #emojiPromise = Promise.all([ - fetch( - "chrome://browser/content/torpreferences/bridgemoji/bridge-emojis.json" - ).then(response => response.json()), - fetch( - "chrome://browser/content/torpreferences/bridgemoji/annotations.json" - ).then(response => response.json()), - ]); + static #emojiLocaleDetails = {}; - static #unknownStringPromise = null; + /** + * A promise that resolves when the previous call to appLocalesChanged + * completes. + * + * @type {Promise?} + */ + static #prevAppLocalesChangedCall = null; /** - * Update #emojiLangCode. + * Update the locale used for bridge emoji widget. */ - static async #updateEmojiLangCode() { + static async appLocalesChanged() { + // Introduce a queue to ensure calls apply in the order they are invoked, + // so the last seen locale will eventually be the applied one. + const { promise, resolve } = Promise.withResolvers(); + const prevAppLocalesChangedCall = this.#prevAppLocalesChangedCall; + this.#prevAppLocalesChangedCall = promise; + try { + await prevAppLocalesChangedCall; + await this.#appLocalesChangedInternal(); + } finally { + resolve(); + } + } + + static async #appLocalesChangedInternal() { + let [emojiAnnotations, emojiList, unknownString] = await Promise.all([ + this.#annotationsPromise, + this.#emojiListPromise, + // Grab the string for the new locale. + document.l10n.formatValue("tor-bridges-emoji-unknown"), + ]); + let langCode; - const emojiAnnotations = (await BridgeEmoji.#emojiPromise)[1]; // Find the first desired locale we have annotations for. // Add "en" as a fallback. for (const bcp47 of [...Services.locale.appLocalesAsBCP47, "en"]) { @@ -71,14 +101,14 @@ break; } } - if (langCode !== this.#emojiLangCode) { - this.#emojiLangCode = langCode; - this.#unknownStringPromise = document.l10n.formatValue( - "tor-bridges-emoji-unknown" - ); - for (const inst of this.#activeInstances) { - inst.update(); - } + + this.#emojiLocaleDetails = { + emojiList, + annotations: emojiAnnotations[langCode], + unknownString, + }; + for (const inst of this.#activeInstances) { + inst.update(); } } @@ -86,22 +116,15 @@ * Update the bridge emoji to show their corresponding emoji with an * annotation that matches the current locale. */ - async update() { - if (!this.#active) { - return; - } + update() { + const { emojiList, annotations, unknownString } = + BridgeEmoji.#emojiLocaleDetails; - if (!BridgeEmoji.#emojiLangCode) { - // No lang code yet, wait until it is updated. + if (!this.#active || !emojiList || !annotations || !unknownString) { return; } const doc = this.ownerDocument; - const [unknownString, [emojiList, emojiAnnotations]] = await Promise.all([ - BridgeEmoji.#unknownStringPromise, - BridgeEmoji.#emojiPromise, - ]); - const emoji = emojiList[this.#index]; let emojiName; if (!emoji) { @@ -113,7 +136,7 @@ "src", `chrome://browser/content/torpreferences/bridgemoji/svgs/${cp}.svg` ); - emojiName = emojiAnnotations[BridgeEmoji.#emojiLangCode][cp]; + emojiName = annotations[cp]; } if (!emojiName) { doc.defaultView.console.error(`No emoji for index ${this.#index}`); @@ -157,13 +180,13 @@ } this.#active = true; - BridgeEmoji.#addActiveInstance(this); + BridgeEmoji.#activeInstances.add(this); this.update(); } disconnectedCallback() { this.#active = false; - BridgeEmoji.#removeActiveInstance(this); + BridgeEmoji.#activeInstances.delete(this); } /** @@ -196,4 +219,20 @@ } customElements.define("tor-bridge-emoji", BridgeEmoji); + + { + const appLocalesChanged = BridgeEmoji.appLocalesChanged.bind(BridgeEmoji); + Services.obs.addObserver(appLocalesChanged, "intl:app-locales-changed"); + window.addEventListener( + "unload", + () => { + Services.obs.removeObserver( + appLocalesChanged, + "intl:app-locales-changed" + ); + }, + { once: true } + ); + appLocalesChanged(); + } } View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/7bfb497… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/7bfb497… 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • ...
  • 16
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.