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
  • 20919 discussions
[Git][tpo/applications/tor-browser][tor-browser-153.0a1-16.0-2] fixup! BB 43864: Modify the urlbar for Base Browser.
by henry (@henry) 15 Jul '26

15 Jul '26
henry pushed to branch tor-browser-153.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: c1b5bd1b by Henry Wilkes at 2026-07-15T10:24:31+00:00 fixup! BB 43864: Modify the urlbar for Base Browser. BB 44439: Remove translate action from urlbar. - - - - - 1 changed file: - browser/components/urlbar/QuickActionsLoaderDefault.sys.mjs Changes: ===================================== browser/components/urlbar/QuickActionsLoaderDefault.sys.mjs ===================================== @@ -318,6 +318,12 @@ const DEFAULT_ACTIONS = { ) ); }, + // Remove the translate action. Bugzilla bug 1989252 means that the actions + // still appears in the full list, despite isVisible being `false`. So we + // explicitly remove it from the list instead. tor-browser#43864. + disabled() { + return !this.isVisible(); + }, onPick: async (_queryContext, controller) => { await lazy.TranslationsParent.openAboutTranslationsPage({ browserWindow: controller.browserWindow, View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/c1b5bd1… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/c1b5bd1… 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.0a1-16.0-2] 4 commits: TB 45086: [android] Repack omni.ja file with LZMA
by brizental (@brizental) 15 Jul '26

15 Jul '26
brizental pushed to branch tor-browser-153.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: 2d0374ba by Beatriz Rizental at 2026-07-14T19:57:54-03:00 TB 45086: [android] Repack omni.ja file with LZMA - - - - - 39016cdb by Pier Angelo Vendrame at 2026-07-14T20:00:23-03:00 BB 45086: Replace omni.ja URI parsing in GetApkURI with a direct JNI call - - - - - 5bf6c21a by Pier Angelo Vendrame at 2026-07-14T21:23:43-03:00 BB 45086: Make nsZipCursor::Copy return mBuf also when copying a stored file. - - - - - a77d9f91 by Pier Angelo Vendrame at 2026-07-14T21:23:54-03:00 fixup! TB 45086: [android] Repack omni.ja file with LZMA TB 45096: Remove uncompressed omni.ja from Geckoview aar. - - - - - 16 changed files: - mobile/android/geckoview/build.gradle - + mobile/android/geckoview/omnijar_repack.sh - mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java - mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java - + mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/XzExtractor.java - + mobile/android/geckoview/src/test/assets/empty-hash.sha256 - + mobile/android/geckoview/src/test/assets/empty-hash.xz - + mobile/android/geckoview/src/test/assets/no-hash.xz - + mobile/android/geckoview/src/test/assets/test.sha256 - + mobile/android/geckoview/src/test/assets/test.xz - + mobile/android/geckoview/src/test/java/org/mozilla/gecko/util/XzExtractorTest.java - mobile/android/gradle/with_gecko_binaries.gradle - modules/libjar/nsZipArchive.cpp - netwerk/protocol/res/nsResProtocolHandler.cpp - python/mozbuild/mozbuild/action/fat_aar.py - python/mozbuild/mozpack/packager/unpack.py Changes: ===================================== mobile/android/geckoview/build.gradle ===================================== @@ -82,10 +82,20 @@ android { buildConfigField 'boolean', 'MOZ_ANDROID_CONTENT_SERVICE_ISOLATED_PROCESS', mozconfig.substs.MOZ_ANDROID_CONTENT_SERVICE_ISOLATED_PROCESS ? 'true' : 'false'; } + aaptOptions { + noCompress 'xz' + } + lint { abortOnError = false } + testOptions { + unitTests { + includeAndroidResources = true + } + } + sourceSets { main { java { @@ -155,6 +165,10 @@ android { singleVariant('debug') } + androidResources { + ignoreAssetsPattern "omni.ja" + } + namespace = 'org.mozilla.geckoview' } @@ -194,6 +208,7 @@ dependencies { implementation libs.androidx.lifecycle.common implementation libs.androidx.lifecycle.process implementation libs.play.services.fido + implementation "org.tukaani:xz:1.12" implementation "org.yaml:snakeyaml:2.2" if (mozconfig.substs.MOZ_ANDROID_HLS_SUPPORT) { ===================================== mobile/android/geckoview/omnijar_repack.sh ===================================== @@ -0,0 +1,12 @@ +#!/bin/sh +# Repack a .ja (ZIP) stored uncompressed, compress with XZ, write SHA-256 sidecar. +# Usage: omnijar_repack.sh <src> <dst-file> <dst-tag> +set -e +src="$1" dst_file="$2" dst_tag="$3" +tmp=$(mktemp -d) +trap 'rm -rf "$tmp"' EXIT +cp "$src" "$tmp/omni.ja" +# Repack all entries as ZIP_STORED (strip per-entry deflate) +( cd "$tmp" && unzip -q omni.ja -d unpacked && cd unpacked && zip -q -0 -r ../repacked.ja . ) +xz -9e -k -c "$tmp/repacked.ja" > "$dst_file" +sha256sum -b "$tmp/repacked.ja" | awk '{print $1}' > "$dst_tag" ===================================== mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java ===================================== @@ -1761,6 +1761,11 @@ public class GeckoAppShell { return id == 0 ? info.nonLocalizedLabel.toString() : context.getString(id); } + @WrapForJNI + public static String getApkPath() { + return getApplicationContext().getPackageResourcePath(); + } + @WrapForJNI(calledFrom = "gecko") private static int getMemoryUsage(final String stateName) { final Debug.MemoryInfo memInfo = new Debug.MemoryInfo(); ===================================== mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoThread.java ===================================== @@ -19,6 +19,8 @@ import android.util.Log; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.UiThread; +import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; @@ -31,6 +33,7 @@ import org.mozilla.gecko.annotation.WrapForJNI; import org.mozilla.gecko.mozglue.GeckoLoader; import org.mozilla.gecko.process.MemoryController; import org.mozilla.gecko.util.GeckoBundle; +import org.mozilla.gecko.util.XzExtractor; import org.mozilla.gecko.util.ThreadUtils; import org.mozilla.geckoview.BuildConfig; import org.mozilla.geckoview.GeckoResult; @@ -329,6 +332,15 @@ public class GeckoThread extends Thread { loadGeckoLibs(context); } + private static File extractOmnijar(final Context context) throws IOException { + return new XzExtractor( + context, + "omni.ja", + context.getNoBackupFilesDir(), + "omni.ja") + .extract(); + } + private String[] getMainProcessArgs() { final Context context = GeckoAppShell.getApplicationContext(); final ArrayList<String> args = new ArrayList<>(); @@ -337,8 +349,13 @@ public class GeckoThread extends Thread { args.add(context.getPackageName()); if (!mInitInfo.xpcshell) { - args.add("-greomni"); - args.add(context.getPackageResourcePath()); + try { + args.add("-greomni"); + String greomni = extractOmnijar(context).getAbsolutePath(); + args.add(greomni); + } catch (final IOException e) { + throw new RuntimeException("Failed to extract omnijar", e); + } } if (mInitInfo.args != null) { ===================================== mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/XzExtractor.java ===================================== @@ -0,0 +1,75 @@ +package org.mozilla.gecko.util; + +import android.content.Context; +import android.content.res.AssetManager; +import android.util.Log; +import java.io.BufferedReader; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.StandardCopyOption; +import org.tukaani.xz.XZInputStream; + +public class XzExtractor { + private static final String TAG = "XzExtractor"; + private final Context mContext; + private final String mSource; + private String mSourceHash; + private final File mTarget; + private final File mTargetHash; + + public XzExtractor(Context context, String source, File targetDir, String destination) { + mContext = context; + mSource = source; + mTarget = new File(targetDir, destination); + mTargetHash = new File(targetDir, destination + ".sha256"); + } + + public File extract() throws IOException { + Log.d(TAG, "Extracting " + mSource + " -> " + mTarget.getAbsolutePath()); + readSourceTag(); + if (checkExisting()) { + Log.d(TAG, mSource + ": up to date, skipping extraction"); + } else { + Log.d(TAG, mSource + ": extracting from assets"); + extractFromAssets(); + Log.d(TAG, mSource + ": extraction complete"); + } + return mTarget; + } + + private void readSourceTag() throws IOException { + // We use sha256 because we need a unique deterministic string + // to verify if current resources are up to date or need to be + // re-extracted. THIS IS NOT AN INTEGRITY CHECK. + final String asset = mSource + ".sha256"; + final Context context = mContext; + try (InputStream in = context.getAssets().open(asset, AssetManager.ACCESS_BUFFER); + BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8))) { + mSourceHash = reader.readLine(); + } + if (mSourceHash == null || mSourceHash.isEmpty()) { + throw new IOException(asset + " is empty"); + } + } + + private boolean checkExisting() throws IOException { + if (!mTarget.exists() || !mTargetHash.exists()) { + return false; + } + String destHash = new String(Files.readAllBytes(mTargetHash.toPath()), StandardCharsets.UTF_8).trim(); + return destHash.equals(mSourceHash); + } + + private void extractFromAssets() throws IOException { + final Context context = mContext; + try (InputStream assetIn = context.getAssets().open(mSource + ".xz"); + XZInputStream xzIn = new XZInputStream(assetIn)) { + Files.copy(xzIn, mTarget.toPath(), StandardCopyOption.REPLACE_EXISTING); + } + Files.write(mTargetHash.toPath(), mSourceHash.getBytes(StandardCharsets.UTF_8)); + } +} ===================================== mobile/android/geckoview/src/test/assets/empty-hash.sha256 ===================================== ===================================== mobile/android/geckoview/src/test/assets/empty-hash.xz ===================================== Binary files /dev/null and b/mobile/android/geckoview/src/test/assets/empty-hash.xz differ ===================================== mobile/android/geckoview/src/test/assets/no-hash.xz ===================================== Binary files /dev/null and b/mobile/android/geckoview/src/test/assets/no-hash.xz differ ===================================== mobile/android/geckoview/src/test/assets/test.sha256 ===================================== @@ -0,0 +1 @@ +d05557c2592a0b2f4d5553ff10a810168755dd98adfabae60fc055273819fd06 ===================================== mobile/android/geckoview/src/test/assets/test.xz ===================================== Binary files /dev/null and b/mobile/android/geckoview/src/test/assets/test.xz differ ===================================== mobile/android/geckoview/src/test/java/org/mozilla/gecko/util/XzExtractorTest.java ===================================== @@ -0,0 +1,112 @@ +package org.mozilla.gecko.util; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThrows; +import static org.junit.Assert.assertTrue; + +import android.content.Context; +import android.test.suitebuilder.annotation.SmallTest; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; +import org.robolectric.RuntimeEnvironment; + +(a)RunWith(RobolectricTestRunner.class) +@SmallTest +public class XzExtractorTest { + private Context mContext; + private File mTargetDir; + + private String mTestFileContents = "#!/bin/sh\necho hello world"; + + @Before + public void setUp() throws IOException { + mContext = RuntimeEnvironment.getApplication(); + mTargetDir = Files.createTempDirectory("xz-extractor-test").toFile(); + } + + @After + public void tearDown() { + deleteRecursively(mTargetDir); + } + + @Test + public void freshExtraction() throws IOException, InterruptedException { + XzExtractor extractor = new XzExtractor(mContext, "test", mTargetDir, "test"); + File extracted = extractor.extract(); + + assertTrue(extracted.exists()); + assertTrue(new File(mTargetDir, "test.sha256").exists()); + } + + @Test + public void upToDateSkipsExtraction() throws IOException { + XzExtractor extractor = new XzExtractor(mContext, "test", mTargetDir, "test"); + File extracted = extractor.extract(); + assertEquals( + mTestFileContents, + new String(Files.readAllBytes(extracted.toPath()), StandardCharsets.UTF_8).trim()); + + Files.write(extracted.toPath(), "tampered".getBytes(StandardCharsets.UTF_8)); + extractor.extract(); + + assertEquals( + "tampered", + new String(Files.readAllBytes(extracted.toPath()), StandardCharsets.UTF_8)); + } + + @Test + public void staleHashTriggersReExtraction() throws IOException, InterruptedException { + XzExtractor extractor = new XzExtractor(mContext, "test", mTargetDir, "test"); + File extracted = extractor.extract(); + File hashFile = new File(mTargetDir, "test.sha256"); + + assertEquals( + mTestFileContents, + new String(Files.readAllBytes(extracted.toPath()), StandardCharsets.UTF_8).trim()); + + Files.write(hashFile.toPath(), "new-hash".getBytes(StandardCharsets.UTF_8)); + Files.write(extracted.toPath(), "tampered".getBytes(StandardCharsets.UTF_8)); + + extractor.extract(); + assertEquals( + mTestFileContents, + new String(Files.readAllBytes(extracted.toPath()), StandardCharsets.UTF_8).trim()); + } + + @Test + public void missingAssetThrows() { + XzExtractor extractor = new XzExtractor(mContext, "nonexistent", mTargetDir, "test"); + assertThrows(IOException.class, extractor::extract); + } + + @Test + public void missingHashFileThrows() { + XzExtractor extractor = new XzExtractor(mContext, "no-hash", mTargetDir, "test"); + assertThrows(IOException.class, extractor::extract); + } + + @Test + public void emptyHashFileThrows() { + XzExtractor extractor = new XzExtractor(mContext, "empty-hash", mTargetDir, "test"); + assertThrows(IOException.class, extractor::extract); + } + + private void deleteRecursively(final File file) { + if (file.isDirectory()) { + final File[] children = file.listFiles(); + if (children != null) { + for (final File child : children) { + deleteRecursively(child); + } + } + } + file.delete(); + } +} ===================================== mobile/android/gradle/with_gecko_binaries.gradle ===================================== @@ -20,12 +20,30 @@ ext.configureVariantWithGeckoBinaries = { variantName -> // the native binaries. To do this, the Gradle build calls out to the // moz.build system, which can be re-entrant. Official builds are driven by // the moz.build system and should never be re-entrant in this way. + def omnijarName = "omni.ja" + def assetsDir = "${topobjdir}/dist/geckoview/assets" + def compressOmnijarTask = tasks.register("compressOmnijar${variantName.capitalize()}", Exec) { + inputs.file("${assetsDir}/${omnijarName}") + outputs.files( + "${assetsDir}/${omnijarName}.xz", + "${assetsDir}/${omnijarName}.sha256" + ) + commandLine "sh", + "${topsrcdir}/mobile/android/geckoview/omnijar_repack.sh", + "${assetsDir}/${omnijarName}", + "${assetsDir}/${omnijarName}.xz", + "${assetsDir}/${omnijarName}.sha256" + } + + // `onVariants` runs before AGP creates these tasks, so defer the wiring with `configureEach`. + tasks.matching { it.name == "generate${variantName.capitalize()}Assets" }.configureEach { + dependsOn compressOmnijarTask + } + if (!mozconfig.substs.MOZILLA_OFFICIAL && !mozconfig.substs.ENABLE_MOZSEARCH_PLUGIN) { - // `onVariants` runs before AGP creates these tasks, so defer the wiring with `configureEach`. - ["generate${variantName.capitalize()}Assets", "merge${variantName.capitalize()}JniLibFolders"].each { taskName -> - tasks.matching { it.name == taskName }.configureEach { - dependsOn rootProject.machStagePackage - } + compressOmnijarTask.configure { dependsOn rootProject.machStagePackage } + tasks.matching { it.name == "merge${variantName.capitalize()}JniLibFolders" }.configureEach { + dependsOn rootProject.machStagePackage } } } ===================================== modules/libjar/nsZipArchive.cpp ===================================== @@ -1198,6 +1198,7 @@ uint8_t* nsZipCursor::ReadOrCopy(uint32_t* aBytesRead, bool aCopy) { } else { *aBytesRead = mZs.avail_in > mBufSize ? mBufSize : mZs.avail_in; memcpy(mBuf, mZs.next_in, *aBytesRead); + buf = mBuf; mZs.avail_in -= *aBytesRead; mZs.next_in += *aBytesRead; } ===================================== netwerk/protocol/res/nsResProtocolHandler.cpp ===================================== @@ -14,6 +14,10 @@ #include "mozilla/Omnijar.h" +#ifdef MOZ_WIDGET_ANDROID +# include "mozilla/java/GeckoAppShellWrappers.h" +#endif + using mozilla::LogLevel; using mozilla::dom::ContentParent; @@ -68,29 +72,12 @@ nsresult nsResProtocolHandler::Init() { #ifdef ANDROID nsresult nsResProtocolHandler::GetApkURI(nsACString& aResult) { - nsCString::const_iterator start, iter; - mGREURI.BeginReading(start); - mGREURI.EndReading(iter); - nsCString::const_iterator start_iter = start; - - // This is like jar:jar:file://path/to/apk/base.apk!/path/to/omni.ja!/ - bool found = FindInReadable("!/"_ns, start_iter, iter); - NS_ENSURE_TRUE(found, NS_ERROR_UNEXPECTED); - - // like jar:jar:file://path/to/apk/base.apk!/ - const nsDependentCSubstring& withoutPath = Substring(start, iter); - NS_ENSURE_TRUE(withoutPath.Length() >= 4, NS_ERROR_UNEXPECTED); - - // Let's make sure we're removing what we expect to remove - NS_ENSURE_TRUE(Substring(withoutPath, 0, 4).EqualsLiteral("jar:"), - NS_ERROR_UNEXPECTED); - - // like jar:file://path/to/apk/base.apk!/ - aResult = ToNewCString(Substring(withoutPath, 4)); - - // Remove the trailing / - NS_ENSURE_TRUE(aResult.Length() >= 1, NS_ERROR_UNEXPECTED); - aResult.Truncate(aResult.Length() - 1); + mozilla::jni::String::LocalRef path = + mozilla::java::GeckoAppShell::GetApkPath(); + if (!path) { + return NS_ERROR_UNEXPECTED; + } + aResult = "jar:file://"_ns + path->ToCString() + "!"_ns; return NS_OK; } #endif ===================================== python/mozbuild/mozbuild/action/fat_aar.py ===================================== @@ -90,7 +90,7 @@ def fat_aar(distdir, zip_paths, no_process=False, no_compatibility_check=False): jar_finder = JarFinder( aar_file.file.filename, JarReader(fileobj=aar_file.open()) ) - for path, fileobj in UnpackFinder(jar_finder): + for path, fileobj in UnpackFinder(jar_finder, omnijar_name="assets/omni.ja.xz"): # Native libraries go straight through. if mozpath.match(path, "jni/**"): copier.add(path, fileobj) @@ -130,6 +130,7 @@ def fat_aar(distdir, zip_paths, no_process=False, no_compatibility_check=False): "**/*.ftl", "**/*.dtd", "**/*.properties", + "assets/omni.ja.sha256", } not_allowed = OrderedDict() ===================================== python/mozbuild/mozpack/packager/unpack.py ===================================== @@ -3,6 +3,7 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. import codecs +import lzma from urllib.parse import urlparse import mozpack.path as mozpath @@ -143,7 +144,11 @@ class UnpackFinder(BaseFinder): Return a JarReader for the given BaseFile instance, keeping a log of the preloaded entries it has. """ - jar = JarReader(fileobj=file.open()) + if path.endswith(".xz"): + f = lzma.open(file.open()) + else: + f = file.open() + jar = JarReader(fileobj=f) self.compressed = max(self.compressed, jar.compression) if jar.last_preloaded: jarlog = list(jar.entries.keys()) @@ -158,8 +163,17 @@ class UnpackFinder(BaseFinder): """ Return whether the given BaseFile looks like a ZIP/Jar. """ + + def check_header(header): + return len(header) == 8 and (header[0:2] == b"PK" or header[4:6] == b"PK") + header = file.open().read(8) - return len(header) == 8 and (header[0:2] == b"PK" or header[4:6] == b"PK") + if check_header(header): + return True + if header[0:6] == b"\xfd7zXZ\x00": + with lzma.open(file.open()) as f: + return check_header(f.read(8)) + return False def _unjarize(self, entry, relpath): """ View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/a56bb2… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/a56bb2… 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.0a1-16.0-2] 2 commits: fixup! Add CI for Tor Browser
by Dan Ballard (@dan) 14 Jul '26

14 Jul '26
Dan Ballard pushed to branch tor-browser-153.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: a291ff15 by Beatriz Rizental at 2026-07-14T18:27:56-03:00 fixup! Add CI for Tor Browser No bug: Undo change that should be in the base-browser commit - - - - - a56bb26c by Beatriz Rizental at 2026-07-14T18:28:18-03:00 fixup! Add CI for Base Browser Bug 557: Update image path - - - - - 0 changed files: Changes: View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/3c6db6… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/3c6db6… 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.0a1-16.0-2] fixup! Add CI for Base Browser
by brizental (@brizental) 14 Jul '26

14 Jul '26
brizental pushed to branch mullvad-browser-153.0a1-16.0-2 at The Tor Project / Applications / Mullvad Browser Commits: 83f2e22a by Beatriz Rizental at 2026-07-14T23:00:31+02:00 fixup! Add CI for Base Browser Bug 557: Update image path - - - - - 1 changed file: - .gitlab-ci.yml Changes: ===================================== .gitlab-ci.yml ===================================== @@ -4,7 +4,7 @@ stages: - update-translations variables: - IMAGE_PATH: containers.torproject.org/tpo/applications/tor-browser/base:latest + IMAGE_PATH: containers.torproject.org/tpo/applications/tor-browser/desktop:latest LOCAL_REPO_PATH: /srv/apps-repos/tor-browser.git include: View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/83f… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/83f… 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.0a1-16.0-2] fixup! BB 40925: Implemented the Security Level component
by Dan Ballard (@dan) 14 Jul '26

14 Jul '26
Dan Ballard pushed to branch tor-browser-153.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: 3c6db68e by clairehurst at 2026-07-14T11:33:28-07:00 fixup! BB 40925: Implemented the Security Level component Bug 45109: No value passed for parameter 'jsEnabled' - - - - - 4 changed files: - mobile/android/android-components/components/feature/intent/src/main/java/mozilla/components/feature/intent/processing/TabIntentProcessor.kt - mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/SearchUseCases.kt - mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/internal/SearchUrlBuilder.kt - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/usecases/FenixBrowserUseCases.kt Changes: ===================================== mobile/android/android-components/components/feature/intent/src/main/java/mozilla/components/feature/intent/processing/TabIntentProcessor.kt ===================================== @@ -48,7 +48,7 @@ class TabIntentProcessor( private val newTabSearchUseCase: SearchUseCases.NewTabSearchUseCase, private val isPrivate: Boolean = false, private val engine: Engine? = null, - private val jsEnabled: Boolean, + private val jsEnabled: Boolean = true, ) : IntentProcessor { private val logger = Logger("TabIntentProcessor") ===================================== mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/SearchUseCases.kt ===================================== @@ -26,7 +26,7 @@ class SearchUseCases( store: BrowserStore, tabsUseCases: TabsUseCases, sessionUseCases: SessionUseCases, - jsEnabled: Boolean, + jsEnabled: Boolean = true, ) { interface SearchUseCase { /** @@ -43,7 +43,7 @@ class SearchUseCases( private val store: BrowserStore, private val tabsUseCases: TabsUseCases, private val sessionUseCases: SessionUseCases, - private val jsEnabled: Boolean, + private val jsEnabled: Boolean = true, ) : SearchUseCase { private val logger = Logger("DefaultSearchUseCase") @@ -134,7 +134,7 @@ class SearchUseCases( private val store: BrowserStore, private val tabsUseCases: TabsUseCases, private val isPrivate: Boolean, - private val jsEnabled: Boolean, + private val jsEnabled: Boolean = true, ) : SearchUseCase { private val logger = Logger("NewTabSearchUseCase") @@ -172,7 +172,7 @@ class SearchUseCases( parentSessionId: String? = null, flags: EngineSession.LoadUrlFlags = EngineSession.LoadUrlFlags.none(), additionalHeaders: Map<String, String>? = null, - jsEnabled: Boolean, + jsEnabled: Boolean = true, ) { val resolvedEngine = searchEngine ?: store.state.search.selectedOrDefaultSearchEngine(isPrivate) val searchUrl = resolvedEngine?.let { ===================================== mobile/android/android-components/components/feature/search/src/main/java/mozilla/components/feature/search/internal/SearchUrlBuilder.kt ===================================== @@ -29,7 +29,7 @@ private const val OS_PARAM_OPTIONAL = "\\{" + "(?:\\w+:)?\\w+?" + "\\}" internal class SearchUrlBuilder( private val searchEngine: SearchEngine, ) { - fun buildSearchUrl(searchTerms: String, jsEnabled: Boolean): String { + fun buildSearchUrl(searchTerms: String, jsEnabled: Boolean = true): String { // The parser should have put the best URL for this device at the beginning of the list. var template = searchEngine.resultUrls[0] if (!jsEnabled && (searchEngine.id == "ddg" || searchEngine.id == "ddg-onion")) { ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/usecases/FenixBrowserUseCases.kt ===================================== @@ -34,7 +34,7 @@ class FenixBrowserUseCases( private val searchUseCases: SearchUseCases, private val homepageTitle: String, private val profiler: Profiler?, - private val jsEnabled: Boolean, + private val jsEnabled: Boolean = true, ) { /** * Loads a URL or performs a search depending on the value of [searchTermOrURL]. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/3c6db68… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/3c6db68… 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-build][maint-15.0] Bug 41838: Update personal_access_tokens gitlab URL in tools/fetch_changelogs.py
by morgan (@morgan) 14 Jul '26

14 Jul '26
morgan pushed to branch maint-15.0 at The Tor Project / Applications / tor-browser-build Commits: bede9cf7 by Nicolas Vigier at 2026-07-14T15:58:18+00:00 Bug 41838: Update personal_access_tokens gitlab URL in tools/fetch_changelogs.py - - - - - 1 changed file: - tools/fetch_changelogs.py Changes: ===================================== tools/fetch_changelogs.py ===================================== @@ -334,7 +334,7 @@ def load_token(test=True, interactive=True): f"Please add your personal GitLab token (with 'read_api' scope) to {token_path}" ) print( - f"Please go to {GITLAB}/-/profile/personal_access_tokens and generate it." + f"Please go to {GITLAB}/-/user_settings/personal_access_tokens and generate it." ) token = input("Please enter the new token: ").strip() if not token: View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/b… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/b… 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-build][main] Bug 41838: Update personal_access_tokens gitlab URL in tools/fetch_changelogs.py
by morgan (@morgan) 14 Jul '26

14 Jul '26
morgan pushed to branch main at The Tor Project / Applications / tor-browser-build Commits: 14411f33 by Nicolas Vigier at 2026-07-14T17:40:45+02:00 Bug 41838: Update personal_access_tokens gitlab URL in tools/fetch_changelogs.py - - - - - 1 changed file: - tools/fetch_changelogs.py Changes: ===================================== tools/fetch_changelogs.py ===================================== @@ -334,7 +334,7 @@ def load_token(test=True, interactive=True): f"Please add your personal GitLab token (with 'read_api' scope) to {token_path}" ) print( - f"Please go to {GITLAB}/-/profile/personal_access_tokens and generate it." + f"Please go to {GITLAB}/-/user_settings/personal_access_tokens and generate it." ) token = input("Please enter the new token: ").strip() if not token: View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/1… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/1… 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.0a1-16.0-2] 3 commits: fixup! TB 31286: Implementation of bridge, proxy, and firewall settings in...
by morgan (@morgan) 14 Jul '26

14 Jul '26
morgan pushed to branch tor-browser-153.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: 36f1d1c6 by Henry Wilkes at 2026-07-14T15:24:00+00:00 fixup! TB 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection TB 45029: Add the connection status pane to the connection settings config. - - - - - 8beb26de by Henry Wilkes at 2026-07-14T15:24:00+00:00 fixup! Tor Browser strings TB 45029: Add connection status strings. - - - - - 31a4963d by Henry Wilkes at 2026-07-14T15:24:00+00:00 fixup! Tor Browser localization migration scripts. TB 45029: Migrate connection status strings. - - - - - 10 changed files: - browser/components/preferences/preferences.js - browser/components/preferences/preferences.xhtml - + browser/components/torpreferences/config/connection.mjs - − browser/components/torpreferences/content/connectionCategory.inc.xhtml - browser/components/torpreferences/content/connectionPane.inc.xhtml - browser/components/torpreferences/jar.mn - + browser/components/torpreferences/widgets/tor-connection-status.css - + browser/components/torpreferences/widgets/tor-connection-status.mjs - toolkit/locales/en-US/toolkit/global/tor-browser.ftl - + tools/torbrowser/l10n/migrations/bug-45029-connection-status.py Changes: ===================================== browser/components/preferences/preferences.js ===================================== @@ -116,6 +116,7 @@ ChromeUtils.defineESModuleGetters(this, { "resource:///modules/SelectionChangedMenulist.sys.mjs", ShortcutUtils: "resource://gre/modules/ShortcutUtils.sys.mjs", SiteDataManager: "resource:///modules/SiteDataManager.sys.mjs", + TorConnect: "resource://gre/modules/TorConnect.sys.mjs", TransientPrefs: "resource:///modules/TransientPrefs.sys.mjs", UIState: "resource://services-sync/UIState.sys.mjs", UpdateUtils: "resource://gre/modules/UpdateUtils.sys.mjs", @@ -267,6 +268,16 @@ const CONFIG_PANES = Object.freeze({ visible: () => Services.prefs.getBoolPref("browser.settings-redesign.enabled", false), }, + connection: { + l10nId: "tor-connection-settings-pane", + iconSrc: "chrome://browser/content/torconnect/tor-connect.svg", + groupIds: ["connectionStatus"], + module: "chrome://browser/content/torpreferences/config/connection.mjs", + visible: () => { + return TorConnect.enabled; + }, + replaces: "connection", + }, connectionSecurity: { parent: "privacy", l10nId: "preferences-connection-header", ===================================== browser/components/preferences/preferences.xhtml ===================================== @@ -108,6 +108,7 @@ <script type="module" src="chrome://browser/content/preferences/widgets/update-information.mjs"></script> <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-connection-status.mjs"></script> <script src="chrome://browser/content/torpreferences/bridgemoji/BridgeEmoji.js"/> </head> @@ -150,6 +151,11 @@ iconsrc="chrome://browser/skin/preferences/category-privacy-security.svg" data-l10n-id="pane-privacy-title3"> </html:moz-page-nav-button> + <html:moz-page-nav-button id="category-connection" + view="paneConnection" + iconsrc="chrome://browser/content/torconnect/tor-connect.svg" + data-l10n-id="tor-connection-settings-nav-button"> + </html:moz-page-nav-button> <html:moz-page-nav-button id="category-passwords-autofill" view="panePasswordsAutofill" iconsrc="chrome://browser/skin/login.svg" @@ -220,8 +226,6 @@ <!-- Hide the translations sub-pane. tor-browser#44710. --> <html:moz-page-nav-button hidden="true" class="hidden-category" view="paneTranslations"/> -#include ../torpreferences/content/connectionCategory.inc.xhtml - <!-- Footer links --> <html:moz-page-nav-button id="addonsButton" slot="secondary-nav" ===================================== browser/components/torpreferences/config/connection.mjs ===================================== @@ -0,0 +1,115 @@ +import { SettingGroupManager } from "chrome://browser/content/preferences/config/SettingGroupManager.mjs"; +import { Preferences } from "chrome://global/content/preferences/Preferences.mjs"; + +const lazy = {}; +ChromeUtils.defineESModuleGetters(lazy, { + InternetStatus: "moz-src:///toolkit/modules/TorConnect.sys.mjs", + TorConnect: "moz-src:///toolkit/modules/TorConnect.sys.mjs", + TorConnectStage: "moz-src:///toolkit/modules/TorConnect.sys.mjs", + TorConnectTopics: "moz-src:///toolkit/modules/TorConnect.sys.mjs", +}); + +SettingGroupManager.registerGroups({ + connectionStatus: { + inProgress: true, + l10nId: "tor-connection-internet-status-group", + supportPage: "tor-manual:about", + headingLevel: 2, + items: [ + { + id: "connectionStatusGroup", + control: "moz-box-group", + items: [ + { + id: "internetStatus", + control: "tor-connection-status", + controlAttrs: { "status-type": "internet" }, + }, + { + id: "torStatus", + control: "tor-connection-status", + controlAttrs: { "status-type": "tor" }, + }, + ], + }, + { + id: "connectAutomatically", + l10nId: "tor-connection-quickstart-checkbox", + control: "moz-toggle", + }, + ], + }, +}); + +Preferences.addSetting({ + id: "connectionStatusGroup", +}); + +Preferences.addSetting({ + id: "internetStatus", + setup(emitChange) { + Services.obs.addObserver( + emitChange, + lazy.TorConnectTopics.InternetStatusChange + ); + return () => { + Services.obs.removeObserver( + emitChange, + lazy.TorConnectTopics.InternetStatusChange + ); + }; + }, + get() { + switch (lazy.TorConnect.internetStatus) { + case lazy.InternetStatus.Online: + return "online"; + case lazy.InternetStatus.Offline: + return "offline"; + } + return "unknown"; + }, +}); + +Preferences.addSetting({ + id: "torStatus", + setup(emitChange) { + Services.obs.addObserver(emitChange, lazy.TorConnectTopics.StageChange); + return () => { + Services.obs.removeObserver( + emitChange, + lazy.TorConnectTopics.StageChange + ); + }; + }, + get() { + if (lazy.TorConnect.stageName === lazy.TorConnectStage.Bootstrapped) { + return "connected"; + } + if (lazy.TorConnect.potentiallyBlocked) { + return "potentially-blocked"; + } + return "not-connected"; + }, +}); + +Preferences.addSetting({ + id: "connectAutomatically", + setup(emitChange) { + Services.obs.addObserver( + emitChange, + lazy.TorConnectTopics.QuickstartChange + ); + return () => { + Services.obs.removeObserver( + emitChange, + lazy.TorConnectTopics.QuickstartChange + ); + }; + }, + get() { + return lazy.TorConnect.quickstart; + }, + set(val) { + lazy.TorConnect.quickstart = val; + }, +}); ===================================== browser/components/torpreferences/content/connectionCategory.inc.xhtml deleted ===================================== @@ -1,6 +0,0 @@ -<html:moz-page-nav-button id="category-connection" - view="paneConnection" - iconsrc="chrome://browser/content/torconnect/tor-connect.svg" - data-l10n-id="tor-connection-settings-heading" - hidden="true"> -</html:moz-page-nav-button> ===================================== browser/components/torpreferences/content/connectionPane.inc.xhtml ===================================== @@ -10,6 +10,7 @@ class="subcategory" data-category="paneConnection" hidden="true" + data-srd-groupid="connectionStatus" > <html:h1 data-l10n-id="tor-connection-settings-heading"></html:h1> <description class="description-deemphasized" flex="1"> @@ -67,7 +68,11 @@ </vbox> <!-- Quickstart --> - <groupbox data-category="paneConnection" hidden="true"> + <groupbox + data-category="paneConnection" + hidden="true" + data-srd-groupid="connectionStatus" + > <label> <html:h2 data-l10n-id="tor-connection-automatic-heading"></html:h2> </label> @@ -85,7 +90,12 @@ </groupbox> <!-- Bridges --> - <hbox class="subcategory" data-category="paneConnection" hidden="true"> + <hbox + class="subcategory" + data-category="paneConnection" + hidden="true" + data-srd-groupid="connectionStatus" + > <html:h1 id="tor-bridges-subcategory-heading-non-search" class="tor-bridges-subcategory-heading tor-focusable-heading" @@ -98,6 +108,7 @@ data-category="paneConnection" hidden="true" aria-labelledby="tor-bridges-subcategory-heading-non-search" + data-srd-groupid="connectionStatus" > <!-- Add a search-header that only appears in search results as a substitute - for the hidden h1 element. See tor-browser#43320. @@ -580,7 +591,12 @@ </groupbox> <!-- Advanced --> - <hbox class="subcategory" data-category="paneConnection" hidden="true"> + <hbox + class="subcategory" + data-category="paneConnection" + hidden="true" + data-srd-groupid="connectionStatus" + > <html:h1 id="tor-advanced-subcategory-heading-non-search" data-l10n-id="tor-advanced-settings-heading" @@ -591,6 +607,7 @@ data-category="paneConnection" hidden="true" aria-labelledby="tor-advanced-subcategory-heading-non-search" + data-srd-groupid="connectionStatus" > <!-- Add a search-header that only appears in search results as a substitute - for the hidden h1 element. See tor-browser#43320. ===================================== browser/components/torpreferences/jar.mn ===================================== @@ -24,9 +24,11 @@ browser.jar: content/browser/torpreferences/provideBridgeDialog.js (content/provideBridgeDialog.js) content/browser/torpreferences/requestBridgeDialog.xhtml (content/requestBridgeDialog.xhtml) content/browser/torpreferences/requestBridgeDialog.js (content/requestBridgeDialog.js) - content/browser/torpreferences/connectionCategory.inc.xhtml (content/connectionCategory.inc.xhtml) content/browser/torpreferences/torLogDialog.js (content/torLogDialog.js) content/browser/torpreferences/torLogDialog.xhtml (content/torLogDialog.xhtml) + content/browser/torpreferences/config/connection.mjs (config/connection.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) content/browser/torpreferences/torPreferences.css (content/torPreferences.css) content/browser/torpreferences/bridgemoji/BridgeEmoji.js (content/bridgemoji/BridgeEmoji.js) ===================================== browser/components/torpreferences/widgets/tor-connection-status.css ===================================== @@ -0,0 +1,23 @@ +.tor-status-container { + padding: var(--box-padding); + + &.tor-status-icon-warning { + --box-icon-stroke: var(--icon-color-critical); + } +} + +.tor-status-label { + display: flex; + align-items: center; + gap: var(--space-medium); + & > * { + flex: 0 0 auto; + } + & > p { + margin: 0; + } +} + +.tor-status-name { + font-weight: var(--font-weight-semibold); +} ===================================== browser/components/torpreferences/widgets/tor-connection-status.mjs ===================================== @@ -0,0 +1,162 @@ +import { MozBoxBase } from "chrome://global/content/lit-utils.mjs"; +import { + classMap, + html, + ifDefined, +} from "chrome://global/content/vendor/lit.all.mjs"; + +const lazy = {}; +ChromeUtils.defineESModuleGetters(lazy, { + TorConnectParent: + "moz-src:///browser/components/torconnect/TorConnectParent.sys.mjs", +}); + +/** + * Widget for displaying the current internet or Tor connection status. + * + * @tagname tor-connection-status + * @property {"internet" | "tor"} statusType - The type of status this widget is + * showing. + * @property {string} value - The current status value. + */ +class TorConnectionStatus extends MozBoxBase { + static properties = { + statusType: { type: String, attribute: "status-type" }, + value: { type: String }, + _nameL10nId: { type: String }, + _valueL10nId: { type: String }, + _iconWarning: { type: Boolean }, + _connectButton: { type: Boolean }, + }; + + /** + * A map from the status type to it's configuration. Each configuration is + * used to set the internal properties depending on the current value. + * + * @type {{[key: string]: object}} + */ + static #config = { + internet: { + nameL10nId: "tor-connection-internet-status-label", + values: { + online: { + iconSrc: "chrome://browser/content/torconnect/network.svg", + valueL10nId: "tor-connection-internet-status-online", + }, + offline: { + iconSrc: "chrome://browser/content/torconnect/network-broken.svg", + valueL10nId: "tor-connection-internet-status-offline", + }, + unknown: { + iconSrc: "chrome://browser/content/torconnect/network.svg", + valueL10nId: "tor-connection-internet-status-unknown", + }, + }, + }, + tor: { + nameL10nId: "tor-connection-network-status-label", + values: { + connected: { + iconSrc: "chrome://browser/content/torconnect/tor-connect.svg", + valueL10nId: "tor-connection-network-status-connected", + }, + "not-connected": { + iconSrc: "chrome://browser/content/torconnect/tor-connect-broken.svg", + valueL10nId: "tor-connection-network-status-not-connected", + connectButton: true, + }, + "potentially-blocked": { + iconSrc: "chrome://browser/content/torconnect/tor-connect-broken.svg", + valueL10nId: "tor-connection-network-status-blocked", + iconWarning: true, + connectButton: true, + }, + }, + }, + }; + + /** + * Whether we had focus prior to an update. + * + * @type {boolean} + */ + #hadFocus = false; + + willUpdate() { + const config = TorConnectionStatus.#config[this.statusType]; + const valueConfig = config?.values[this.value]; + this._nameL10nId = config?.nameL10nId; + this._valueL10nId = valueConfig?.valueL10nId; + this.iconSrc = valueConfig?.iconSrc; + this._iconWarning = valueConfig?.iconWarning ?? false; + this._connectButton = valueConfig?.connectButton ?? false; + this.#hadFocus = !!this.shadowRoot.activeElement; + } + + updated() { + if (this.#hadFocus && !this.shadowRoot.activeElement) { + // Focus is lost. We move focus to the search input. + window.gSearchResultsPane.searchInput.focus(); + } + this.#hadFocus = false; + } + + connectButtonClick() { + lazy.TorConnectParent.open({ beginBootstrapping: "soft" }); + } + + connectButtonTemplate() { + if (!this._connectButton) { + return ""; + } + return html` + <moz-button + data-l10n-id="tor-connection-status-connect-button" + @click=${this.connectButtonClick} + ></moz-button> + `; + } + + // override MozBoxBase.labelTemplate. + labelTemplate() { + if (!this._nameL10nId) { + return ""; + } + // NOTE: We purposefully include whitespace between the inner <span> + // elements so their text is separated. + return html`<div class="label tor-status-label"> + <p> + <span + class="tor-status-name" + data-l10n-id=${this._nameL10nId} + ></span> + <span data-l10n-id=${ifDefined(this._valueL10nId)}></span> + </p> + ${this.connectButtonTemplate()} + </span> `; + } + + render() { + if (!this._nameL10nId) { + return ""; + } + // NOTE: textTemplate comes from MozBoxBase, which will include an icon + // followed by our label. + return html` + ${this.stylesTemplate()} + <link + rel="stylesheet" + href="chrome://browser/content/torpreferences/widgets/tor-connection-status.css" + /> + <div + class=${classMap({ + "tor-status-container": true, + "tor-status-icon-warning": this._iconWarning, + })} + > + ${super.textTemplate()} + </div> + `; + } +} +customElements.define("tor-connection-status", TorConnectionStatus); ===================================== toolkit/locales/en-US/toolkit/global/tor-browser.ftl ===================================== @@ -55,10 +55,12 @@ home-mode-choice-tor = # "Connection" refers to the Tor Browser's connection to the Tor network. tor-connection-settings-heading = Connection -# The tooltip text for the "Connection" settings, shown in the preferences side bar. -# Likely should just be "{ tor-connection-settings-heading }", which will match the displayed text exactly. -tor-connection-settings-category = - .tooltiptext = { tor-connection-settings-heading } +# "Connection" refers to the Tor Browser's connection to the Tor network. +tor-connection-settings-pane = + .heading = Connection +# "Connection" refers to the Tor Browser's connection to the Tor network. +tor-connection-settings-nav-button = Connection + .title = Connection # -brand-short-name refers to 'Tor Browser', localized. tor-connection-overview = { -brand-short-name } routes your traffic over the Tor network, run by thousands of volunteers around the world. tor-connection-browser-learn-more-link = Learn more @@ -67,6 +69,10 @@ tor-connection-automatic-description = Automatically connect to the Tor network tor-connection-quickstart-checkbox = .label = Always connect automatically +# "{ -brand-short-name }" will be replaced with the localized name of the browser, e.g. "Tor Browser". +tor-connection-internet-status-group = + .label = Connection status + .description = { -brand-short-name } routes your traffic over the Tor network, run by thousands of volunteers around the world. # Prefix before the internet connection status. # "Internet" is not a proper noun, but is capitalized because it is the start of a sentence. tor-connection-internet-status-label = Internet: @@ -96,6 +102,10 @@ tor-connection-network-status-blocked = Potentially blocked # It will open a page to start connecting to the Tor network. # Uses sentence case in English (US). tor-connection-network-status-connect-button = Connect +# Here "Connect" refers to connecting to the Tor network. +# Uses sentence case in English (US). +tor-connection-status-connect-button = + .label = Connect ## Tor Bridges Settings. ===================================== tools/torbrowser/l10n/migrations/bug-45029-connection-status.py ===================================== @@ -0,0 +1,19 @@ +from fluent.migrate.helpers import transforms_from + + +def migrate(ctx): + ctx.add_transforms( + "tor-browser.ftl", + "tor-browser.ftl", + transforms_from( + """ +tor-connection-settings-pane = + .heading = { COPY_PATTERN(path, "tor-connection-settings-heading") } +tor-connection-settings-nav-button = { COPY_PATTERN(path, "tor-connection-settings-heading") } + .title = { COPY_PATTERN(path, "tor-connection-settings-heading") } +tor-connection-status-connect-button = + .label = { COPY_PATTERN(path, "tor-connection-network-status-connect-button") } +""", + path="tor-browser.ftl", + ), + ) View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/437411… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/437411… 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-update-responses][main] 6 commits: release: new version, 15.0.18 (linux-i686)
by ma1 (@ma1) 14 Jul '26

14 Jul '26
ma1 pushed to branch main at The Tor Project / Applications / Tor Browser update responses Commits: db109da4 by hackademix at 2026-07-14T16:55:52+02:00 release: new version, 15.0.18 (linux-i686) - - - - - f22cf8d8 by hackademix at 2026-07-14T16:55:54+02:00 release: new version, 15.0.18 (linux-x86_64) - - - - - b32098b9 by hackademix at 2026-07-14T16:55:56+02:00 release: new version, 15.0.18 (macos) - - - - - 44e10a74 by hackademix at 2026-07-14T16:55:57+02:00 release: new version, 15.0.18 (windows-i686) - - - - - 30679837 by hackademix at 2026-07-14T16:55:59+02:00 release: new version, 15.0.18 (windows-x86_64) - - - - - 43bbb505 by hackademix at 2026-07-14T16:56:02+02:00 release: new version, 15.0.18 - - - - - 36 changed files: - update_3/release/download-android-aarch64.json - update_3/release/download-android-armv7.json - update_3/release/download-android-x86.json - update_3/release/download-android-x86_64.json - update_3/release/download-linux-i686.json - update_3/release/download-linux-x86_64.json - update_3/release/download-macos.json - update_3/release/download-windows-i686.json - update_3/release/download-windows-x86_64.json - update_3/release/downloads.json - update_3/release/linux-i686/.htaccess - update_3/release/linux-i686/update-15.0.14-15.0.17-linux-i686.xml → update_3/release/linux-i686/update-15.0.15-15.0.18-linux-i686.xml - update_3/release/linux-i686/update-15.0.15-15.0.17-linux-i686.xml → update_3/release/linux-i686/update-15.0.16-15.0.18-linux-i686.xml - update_3/release/linux-i686/update-15.0.16-15.0.17-linux-i686.xml → update_3/release/linux-i686/update-15.0.17-15.0.18-linux-i686.xml - update_3/release/linux-i686/update-15.0.17-linux-i686.xml → update_3/release/linux-i686/update-15.0.18-linux-i686.xml - update_3/release/linux-x86_64/.htaccess - + update_3/release/linux-x86_64/update-15.0.15-15.0.18-linux-x86_64.xml - − update_3/release/linux-x86_64/update-15.0.16-15.0.17-linux-x86_64.xml - update_3/release/linux-x86_64/update-15.0.14-15.0.17-linux-x86_64.xml → update_3/release/linux-x86_64/update-15.0.16-15.0.18-linux-x86_64.xml - update_3/release/linux-x86_64/update-15.0.15-15.0.17-linux-x86_64.xml → update_3/release/linux-x86_64/update-15.0.17-15.0.18-linux-x86_64.xml - update_3/release/linux-x86_64/update-15.0.17-linux-x86_64.xml → update_3/release/linux-x86_64/update-15.0.18-linux-x86_64.xml - update_3/release/macos/.htaccess - update_3/release/macos/update-15.0.14-15.0.17-macos.xml → update_3/release/macos/update-15.0.15-15.0.18-macos.xml - update_3/release/macos/update-15.0.15-15.0.17-macos.xml → update_3/release/macos/update-15.0.16-15.0.18-macos.xml - update_3/release/macos/update-15.0.16-15.0.17-macos.xml → update_3/release/macos/update-15.0.17-15.0.18-macos.xml - update_3/release/macos/update-15.0.17-macos.xml → update_3/release/macos/update-15.0.18-macos.xml - update_3/release/windows-i686/.htaccess - update_3/release/windows-i686/update-15.0.14-15.0.17-windows-i686.xml → update_3/release/windows-i686/update-15.0.15-15.0.18-windows-i686.xml - update_3/release/windows-i686/update-15.0.15-15.0.17-windows-i686.xml → update_3/release/windows-i686/update-15.0.16-15.0.18-windows-i686.xml - update_3/release/windows-i686/update-15.0.16-15.0.17-windows-i686.xml → update_3/release/windows-i686/update-15.0.17-15.0.18-windows-i686.xml - update_3/release/windows-i686/update-15.0.17-windows-i686.xml → update_3/release/windows-i686/update-15.0.18-windows-i686.xml - update_3/release/windows-x86_64/.htaccess - update_3/release/windows-x86_64/update-15.0.16-15.0.17-windows-x86_64.xml → update_3/release/windows-x86_64/update-15.0.15-15.0.18-windows-x86_64.xml - update_3/release/windows-x86_64/update-15.0.14-15.0.17-windows-x86_64.xml → update_3/release/windows-x86_64/update-15.0.16-15.0.18-windows-x86_64.xml - update_3/release/windows-x86_64/update-15.0.15-15.0.17-windows-x86_64.xml → update_3/release/windows-x86_64/update-15.0.17-15.0.18-windows-x86_64.xml - update_3/release/windows-x86_64/update-15.0.17-windows-x86_64.xml → update_3/release/windows-x86_64/update-15.0.18-windows-x86_64.xml The diff was not included because it is too large. View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-update-responses… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-update-responses… 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.0a1-16.0-2] fixup! BB 43864: Modify the urlbar for Base Browser.
by henry (@henry) 14 Jul '26

14 Jul '26
henry pushed to branch tor-browser-153.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: 437411d2 by Henry Wilkes at 2026-07-14T12:17:51+01:00 fixup! BB 43864: Modify the urlbar for Base Browser. BB 44883: Remove urlbar quick action for labs. - - - - - 1 changed file: - browser/components/urlbar/QuickActionsLoaderDefault.sys.mjs Changes: ===================================== browser/components/urlbar/QuickActionsLoaderDefault.sys.mjs ===================================== @@ -357,6 +357,8 @@ const DEFAULT_ACTIONS = { icon: "chrome://global/skin/icons/experiments.svg", label: "quickactions-labs", onPick: openUrlFun("about:preferences#experimental"), + // Disabled in base browser since labs is disabled. tor-browser#44883. + disabled: () => true, }, }; View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/437411d… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/437411d… 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
  • ...
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • ...
  • 2092
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.