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 -----
  • 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
  • 20430 discussions
[Git][tpo/applications/tor-browser][tor-browser-149.0a1-16.0-2] fixup! BB 44045: Disable ML features.
by henry (@henry) 24 Mar '26

24 Mar '26
henry pushed to branch tor-browser-149.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: db4c2720 by Henry Wilkes at 2026-03-24T18:12:59+00:00 fixup! BB 44045: Disable ML features. TB 44780: Drop AIFeature dependency for TranslationsFeature. The AIFeature.sys.mjs is not in the build. - - - - - 1 changed file: - toolkit/components/translations/TranslationsFeature.sys.mjs Changes: ===================================== toolkit/components/translations/TranslationsFeature.sys.mjs ===================================== @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { AIFeature } from "chrome://global/content/ml/AIFeature.sys.mjs"; +// AIFeature.sys.mjs is not available. tor-browser#44780. import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; /** @@ -45,7 +45,10 @@ XPCOMUtils.defineLazyPreferenceGetter( /** * AIFeature implementation for translations. */ -export class TranslationsFeature extends AIFeature { +// NOTE: The AIFeature class is not available. +// At the time of implementation, TranslationsFeature overwrites the entire +// AIFeature class so we can drop the `extends AIFeature`. tor-browser#44780. +export class TranslationsFeature { /** * Feature identifier for translations. * View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/db4c272… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/db4c272… 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-149.0a1-16.0-2] BB 43243 [android]: Keep processing pending inits after failure
by brizental (@brizental) 24 Mar '26

24 Mar '26
brizental pushed to branch mullvad-browser-149.0a1-16.0-2 at The Tor Project / Applications / Mullvad Browser Commits: f8742cad by Beatriz Rizental at 2026-03-24T15:04:38-03:00 BB 43243 [android]: Keep processing pending inits after failure This is in the process of being uplifted. Bug 2021618: bugzilla.mozilla.org/show_bug.cgi?id=2021618 Differential Revision: https://phabricator.services.mozilla.com/D286669 - - - - - 3 changed files: - mobile/shared/modules/geckoview/DelayedInit.sys.mjs - + mobile/shared/modules/geckoview/test/xpcshell/test_DelayedInit.js - mobile/shared/modules/geckoview/test/xpcshell/xpcshell.toml Changes: ===================================== mobile/shared/modules/geckoview/DelayedInit.sys.mjs ===================================== @@ -96,7 +96,11 @@ var Impl = { return false; } this.complete = true; - this.fn.call(); + try { + this.fn.call(); + } catch (e) { + console.error("Error running init", e); + } this.fn = null; return true; }, ===================================== mobile/shared/modules/geckoview/test/xpcshell/test_DelayedInit.js ===================================== @@ -0,0 +1,48 @@ +/* Any copyright is dedicated to the Public Domain. +http://creativecommons.org/publicdomain/zero/1.0/ */ +"use strict"; + +const { DelayedInit } = ChromeUtils.importESModule( + "resource://gre/modules/DelayedInit.sys.mjs" +); + +add_task(async function test_delayed_init_continues_queue_on_failure() { + const results = []; + const waitMs = 0; + + DelayedInit.schedule( + () => { + results.push("first"); + }, + null, + null, + waitMs + ); + + DelayedInit.schedule( + () => { + results.push("second"); + throw new Error("Deliberate error for testing"); + }, + null, + null, + waitMs + ); + + DelayedInit.schedule( + () => { + results.push("third"); + }, + null, + null, + waitMs + ); + + await new Promise(resolve => ChromeUtils.idleDispatch(resolve)); + + Assert.deepEqual( + results, + ["first", "second", "third"], + "Queue processes all inits even when one fails" + ); +}); ===================================== mobile/shared/modules/geckoview/test/xpcshell/xpcshell.toml ===================================== @@ -7,6 +7,8 @@ prefs = "browser.crashReports.onDemand=true" ["test_ChildCrashHandler.js"] +["test_DelayedInit.js"] + ["test_GeckoViewAppConstants.js"] ["test_RemoteSettingsCrashPull.js"] View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/f87… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/f87… 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-149.0a1-16.0-2] 2 commits: BB 43243 [android]: Start GeckoEngineSession early when Marionette enabled
by brizental (@brizental) 24 Mar '26

24 Mar '26
brizental pushed to branch mullvad-browser-149.0a1-16.0-2 at The Tor Project / Applications / Mullvad Browser Commits: d6edcc3d by Beatriz Rizental at 2026-03-24T15:02:29-03:00 BB 43243 [android]: Start GeckoEngineSession early when Marionette enabled This is in the process of being uplifted. Bug 2021884: https://bugzilla.mozilla.org/show_bug.cgi?id=2021884 Differential Revision: https://phabricator.services.mozilla.com/D286676 - - - - - 4e336f51 by Beatriz Rizental at 2026-03-24T15:02:30-03:00 BB 43243: Modify mozharness scripts for Base Browser - - - - - 4 changed files: - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt - testing/mozharness/configs/android/android14-x86_64.py - testing/mozharness/configs/android/android_common.py - testing/mozharness/scripts/android_emulator_unittest.py Changes: ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt ===================================== @@ -498,6 +498,12 @@ open class FenixApplication : Application(), Provider, ThemeProvider { logElapsedTime(logger, "Starting Relay feature integration") { components.relayFeatureIntegration.start() } + + // If running Marionette tests a GeckoEngineSession needs to be + // started and that must happen on the main thread. + logElapsedTime(logger, "Maybe setup Marionette") { + maybeSetupMarionette() + } } } @@ -666,6 +672,13 @@ open class FenixApplication : Application(), Provider, ThemeProvider { FxNimbus.initialize { nimbus } } + private fun maybeSetupMarionette() { + // If Marionette is enabled, start a GeckoEngineSession immediatelly. + if (System.getenv("MOZ_MARIONETTE") == "1") { + components.core.engine.speculativeCreateSession(components.appStore.state.mode.isPrivate) + } + } + /** * Initiate Megazord sequence! Megazord Battle Mode! * ===================================== testing/mozharness/configs/android/android14-x86_64.py ===================================== @@ -11,8 +11,9 @@ config = { "emulator_avd_name": "mozemulator-android34-x86_64", "emulator_process_name": "qemu-system-x86_64", "emulator_extra_args": [ - "-gpu", - "on", + "-no-window", + "-no-audio", + "-no-boot-anim", "-skip-adb-auth", "-verbose", "-show-kernel", ===================================== testing/mozharness/configs/android/android_common.py ===================================== @@ -315,6 +315,19 @@ config = { "--deviceSerial=%(device_serial)s", ], }, + "marionette": { + "run_filename": "runtests.py", + "testsdir": "marionette/harness/marionette_harness", + "install": True, + "options": [ + "-vv", + "--address=127.0.0.1:2828", + "--app=fennec", + ], + "tests": [ + "%(abs_marionette_manifest_dir)s/unit-tests.toml", + ], + }, }, # end suite_definitions "structured_suites": [ "mochitest-media", ===================================== testing/mozharness/scripts/android_emulator_unittest.py ===================================== @@ -7,15 +7,18 @@ import copy import datetime import json import os +import socket import subprocess import sys +import tempfile +import time # load modules from parent dir here = os.path.abspath(os.path.dirname(__file__)) sys.path.insert(1, os.path.dirname(here)) from mozharness.base.log import WARNING -from mozharness.base.script import BaseScript, PreScriptAction +from mozharness.base.script import BaseScript, PostScriptAction, PreScriptAction from mozharness.mozilla.automation import TBPL_RETRY from mozharness.mozilla.mozbase import MozbaseMixin from mozharness.mozilla.testing.android import AndroidMixin @@ -26,7 +29,7 @@ from mozharness.mozilla.testing.codecoverage import ( from mozharness.mozilla.testing.testbase import TestingMixin, testing_config_options SUITE_DEFAULT_E10S = ["geckoview-junit", "mochitest", "reftest"] -SUITE_NO_E10S = ["cppunittest", "gtest", "jittest", "xpcshell"] +SUITE_NO_E10S = ["cppunittest", "gtest", "jittest", "xpcshell", "marionette"] SUITE_REPEATABLE = ["mochitest", "reftest", "xpcshell"] @@ -178,6 +181,15 @@ class AndroidEmulatorTest( "times in which case the test must contain at least one of the given tags.", }, ], + [ + ["--package-name"], + { + "action": "store", + "default": None, + "dest": "package_name", + "help": "The Android package name for the app being installed.", + }, + ], ] + copy.deepcopy(testing_config_options) + copy.deepcopy(code_coverage_config_options) @@ -228,6 +240,7 @@ class AndroidEmulatorTest( self.enable_isolated_zygote_process = c.get("enable_isolated_zygote_process") self.extra_prefs = c.get("extra_prefs") self.test_tags = c.get("test_tags") + self.package_name = c.get("package_name") or self.query_package_name() def query_abs_dirs(self): if self.abs_dirs: @@ -329,6 +342,16 @@ class AndroidEmulatorTest( "error_summary_file": error_summary_file, "xpcshell_extra": c.get("xpcshell_extra", ""), "gtest_dir": os.path.join(dirs["abs_test_install_dir"], "gtest"), + "abs_marionette_manifest_dir": os.path.join( + dirs["abs_test_install_dir"], + "marionette", + "tests", + "testing", + "marionette", + "harness", + "marionette_harness", + "tests", + ), } user_paths = self._get_mozharness_test_paths(self.test_suite) @@ -345,7 +368,7 @@ class AndroidEmulatorTest( if "%(app)" in option: # only query package name if requested - cmd.extend([option % {"app": self.query_package_name()}]) + cmd.extend([option % {"app": self.package_name}]) else: option = option % str_format_values if option: @@ -409,6 +432,7 @@ class AndroidEmulatorTest( self.config["suite_definitions"][self.test_suite].get("tests"), None, try_tests, + str_format_values=str_format_values, ) ) @@ -449,6 +473,7 @@ class AndroidEmulatorTest( }, ), ("xpcshell", {"xpcshell": "xpcshell"}), + ("marionette", {"marionette": "marionette"}), ] suites = [] for category, all_suites in all: @@ -473,6 +498,61 @@ class AndroidEmulatorTest( # in the base class, this checks for mozinstall, but we don't use it pass + def _configure_marionette_virtualenv(self, action): + dirs = self.query_abs_dirs() + requirements = os.path.join( + dirs["abs_test_install_dir"], "config", "marionette_requirements.txt" + ) + if not os.path.isfile(requirements): + self.fatal(f"Could not find marionette requirements file: {requirements}") + + self.register_virtualenv_module(requirements=[requirements]) + + def _marionette_setup(self): + adb = self.query_exe("adb") + + self.run_command([adb, "forward", "tcp:2828", "tcp:2828"]) + + with tempfile.NamedTemporaryFile(suffix=".yaml") as tmp_file: + tmp_file.write( + b"""args: +- --marionette +- --remote-allow-system-access +""" + ) + tmp_file.flush() + + remote_path = f"/data/local/tmp/{self.package_name}-geckoview-config.yaml" + self.run_command([adb, "push", tmp_file.name, remote_path]) + + self.run_command([ + adb, + "shell", + "am", + "start", + "-S", + "-W", + "-n", + f"{self.package_name}/org.mozilla.gecko.BrowserApp", + ]) + + # Wait for Marionette to be ready + for attempt in range(5): + try: + self.info( + f"Checking Marionette on 127.0.0.1:2828 (attempt {attempt + 1}/5)" + ) + socket.create_connection(("127.0.0.1", 2828), 10).close() + self.info("Marionette is reachable") + break + except OSError: + if attempt == 4: + self.fatal( + "Timed out waiting for 127.0.0.1:2828 to become reachable" + ) + self.info("Marionette not reachable yet, retrying in 10s") + time.sleep(10) + @PreScriptAction("create-virtualenv") def pre_create_virtualenv(self, action): dirs = self.query_abs_dirs() @@ -488,6 +568,9 @@ class AndroidEmulatorTest( if requirements: self.register_virtualenv_module(requirements=[requirements]) + if ("marionette", "marionette") in suites: + self._configure_marionette_virtualenv(action) + def download_and_extract(self): """ Download and extract product APK, tests.zip, and host utils. @@ -525,6 +608,9 @@ class AndroidEmulatorTest( for per_test_suite, suite in suites: self.test_suite = suite + if self.test_suite == "marionette": + self._marionette_setup() + try: cwd = self._query_tests_dir(self.test_suite) except Exception: @@ -594,6 +680,19 @@ class AndroidEmulatorTest( % (suite_category, suite, tbpl_status), ) + @PostScriptAction("run-tests") + def marionette_teardown(self, *args, **kwargs): + if ("marionette", "marionette") in self._query_suites(): + adb = self.query_exe("adb") + self.run_command([adb, "shell", "am", "force-stop", self.package_name]) + self.run_command([adb, "uninstall", self.package_name]) + self.run_command([ + adb, + "shell", + "rm", + f"/data/local/tmp/{self.package_name}-geckoview-config.yaml", + ]) + if __name__ == "__main__": test = AndroidEmulatorTest() View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/43… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/43… 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-149.0a1-16.0-2] fixup! TB 43817: Add tests for Tor Browser
by brizental (@brizental) 24 Mar '26

24 Mar '26
brizental pushed to branch tor-browser-149.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: 70bab416 by Beatriz Rizental at 2026-03-24T18:49:21+01:00 fixup! TB 43817: Add tests for Tor Browser Bug 43243: Make test bootstrap UI agnostic -- share the code between Android and Desktop. - - - - - 6 changed files: - testing/marionette/harness/marionette_harness/__init__.py - testing/marionette/harness/marionette_harness/runner/__init__.py - testing/marionette/harness/marionette_harness/runner/mixins/__init__.py - + testing/marionette/harness/marionette_harness/runner/mixins/tor_browser.py - testing/tor/test_circuit_isolation.py - testing/tor/test_network_check.py Changes: ===================================== testing/marionette/harness/marionette_harness/__init__.py ===================================== @@ -28,5 +28,6 @@ from .runner import ( TestManifest, TestResult, TestResultCollection, + TorBrowserMixin, WindowManagerMixin, ) ===================================== testing/marionette/harness/marionette_harness/runner/__init__.py ===================================== @@ -13,4 +13,7 @@ from .base import ( TestResult, TestResultCollection, ) -from .mixins import WindowManagerMixin +from .mixins import ( + TorBrowserMixin, + WindowManagerMixin, +) ===================================== testing/marionette/harness/marionette_harness/runner/mixins/__init__.py ===================================== @@ -3,3 +3,4 @@ # file, You can obtain one at http://mozilla.org/MPL/2.0/. from .window_manager import WindowManagerMixin +from .tor_browser import TorBrowserMixin ===================================== testing/marionette/harness/marionette_harness/runner/mixins/tor_browser.py ===================================== @@ -0,0 +1,73 @@ +from marionette_driver.errors import ScriptTimeoutException + +DEFAULT_BOOTSTRAP_TIMEOUT_MS = 60 * 1000 +DEFAULT_BOOTSTRAP_MAX_RETRIES = 3 + +class TorBrowserMixin: + def bootstrap( + self, + max_retries=DEFAULT_BOOTSTRAP_MAX_RETRIES, + ): + """Bootstrap the Tor connection. + + This doesn't fail if already bootstrapped, but will retry a few times if + a script timeout is hit. + + This function is UI-agnostic, meaning it can be used both on Desktop and Android. + """ + + attempt = 0 + while attempt < max_retries: + try: + with self.marionette.using_context("chrome"): + self.marionette.execute_async_script( + """ + const { TorConnect, TorConnectStage, TorConnectTopics } = ChromeUtils.importESModule( + "resource://gre/modules/TorConnect.sys.mjs" + ); + const [resolve] = arguments; + + // Only the first test of a suite will need to bootstrap. + if (TorConnect.stage.name === TorConnectStage.Bootstrapped) { + resolve(); + return; + } + + function waitForBootstrap() { + const topic = TorConnectTopics.BootstrapComplete; + Services.obs.addObserver(function observer() { + Services.obs.removeObserver(observer, topic); + resolve(); + }, topic); + TorConnect.beginBootstrapping(); + } + + const stageTopic = TorConnectTopics.StageChange; + function stageObserver() { + if (TorConnect.canBeginNormalBootstrap) { + Services.obs.removeObserver(stageObserver, stageTopic); + waitForBootstrap(); + } + } + Services.obs.addObserver(stageObserver, stageTopic); + stageObserver(); + """, + script_timeout=DEFAULT_BOOTSTRAP_TIMEOUT_MS, + ) + + return + except ScriptTimeoutException: + attempt += 1 + with self.marionette.using_context("chrome"): + self.marionette.execute_script( + """ + const { TorConnect } = ChromeUtils.importESModule( + "resource://gre/modules/TorConnect.sys.mjs" + ); + + TorConnect._makeStageRequest(TorConnectStage.Start, true); + """ + ) + + + raise RuntimeError("Unable to connect to Tor Network") ===================================== testing/tor/test_circuit_isolation.py ===================================== @@ -2,47 +2,13 @@ from ipaddress import ip_address from marionette_driver import By from marionette_driver.errors import NoSuchElementException -from marionette_harness import MarionetteTestCase +from marionette_harness import MarionetteTestCase, TorBrowserMixin -TOR_BOOTSTRAP_TIMEOUT = 30000 # 30s - -class TestCircuitIsolation(MarionetteTestCase): +class TestCircuitIsolation(MarionetteTestCase, TorBrowserMixin): def tearDown(self): - self.marionette.restart(in_app=False, clean=True) super().tearDown() - def bootstrap(self): - with self.marionette.using_context("chrome"): - self.marionette.execute_async_script( - """ - const { TorConnect, TorConnectTopics } = ChromeUtils.importESModule( - "resource://gre/modules/TorConnect.sys.mjs" - ); - const [resolve] = arguments; - - function waitForBootstrap() { - const topic = TorConnectTopics.BootstrapComplete; - Services.obs.addObserver(function observer() { - Services.obs.removeObserver(observer, topic); - resolve(); - }, topic); - TorConnect.beginBootstrapping(); - } - - const stageTopic = TorConnectTopics.StageChange; - function stageObserver() { - if (TorConnect.canBeginNormalBootstrap) { - Services.obs.removeObserver(stageObserver, stageTopic); - waitForBootstrap(); - } - } - Services.obs.addObserver(stageObserver, stageTopic); - stageObserver(); - """, - script_timeout=TOR_BOOTSTRAP_TIMEOUT, - ) - def extract_from_check_tpo(self): # Fetch the IP from check.torproject.org. # In addition to that, since we are loading this page, we ===================================== testing/tor/test_network_check.py ===================================== @@ -1,69 +1,11 @@ -from marionette_driver import By, Wait, errors -from marionette_driver.localization import L10n -from marionette_harness import MarionetteTestCase +from marionette_harness import MarionetteTestCase, TorBrowserMixin NETWORK_CHECK_URL = "https://check.torproject.org/" -TOR_BOOTSTRAP_TIMEOUT = 30 # 30s -STRINGS_LOCATION = "chrome://torbutton/locale/torConnect.properties" - - -class TestNetworkCheck(MarionetteTestCase): - def setUp(self): - MarionetteTestCase.setUp(self) - - self.l10n = L10n(self.marionette) - - def tearDown(self): - self.marionette.restart(in_app=False, clean=True) - super().tearDown() - - def attemptConnection(self, tries=1): - if tries > 3: - self.assertTrue(False, "Failed to connect to Tor after 3 attempts") - - connectBtn = self.marionette.find_element(By.ID, "connectButton") - Wait(self.marionette, timeout=10).until( - lambda _: connectBtn.is_displayed(), - message="Timed out waiting for tor connect button to show up.", - ) - connectBtn.click() - - try: - - def check(m): - if not m.get_url().startswith("about:torconnect"): - # We have finished connecting and have been redirected. - return True - - try: - heading = self.marionette.find_element(By.ID, "tor-connect-heading") - except errors.NoSuchElementException: - # Page is probably redirecting. - return False - - if heading.text not in [ - self.l10n.localize_property( - [STRINGS_LOCATION], "torConnect.torConnecting" - ), - self.l10n.localize_property( - [STRINGS_LOCATION], "torConnect.torConnected" - ), - ]: - raise ValueError("Tor connect page is not connecting or connected") - - return False - - Wait(self.marionette, timeout=TOR_BOOTSTRAP_TIMEOUT).until(check) - except (errors.TimeoutException, ValueError): - cancelBtn = self.marionette.find_element(By.ID, "cancelButton") - if cancelBtn.is_displayed(): - cancelBtn.click() - - self.attemptConnection(tries + 1) +class TestNetworkCheck(MarionetteTestCase, TorBrowserMixin): def test_network_check(self): - self.attemptConnection() + self.bootstrap() self.marionette.navigate(NETWORK_CHECK_URL) self.assertRegex( self.marionette.title, View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/70bab41… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/70bab41… 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-149.0a1-16.0-2] 4 commits: BB 44772: Disable efficient randomization for canvases.
by Pier Angelo Vendrame (@pierov) 24 Mar '26

24 Mar '26
Pier Angelo Vendrame pushed to branch mullvad-browser-149.0a1-16.0-2 at The Tor Project / Applications / Mullvad Browser Commits: f8c9c503 by Pier Angelo Vendrame at 2026-03-24T18:49:28+01:00 BB 44772: Disable efficient randomization for canvases. Always use the regular randomization algorithm, instead. - - - - - 899e00ed by Pier Angelo Vendrame at 2026-03-24T18:49:35+01:00 fixup! BB 43525: Skip Remote Settings for search engine customization. BB 44757: Fix search engine tests for Firefox 149. - - - - - d09b8270 by Pier Angelo Vendrame at 2026-03-24T18:49:43+01:00 fixup! BB 40925: Implemented the Security Level component BB 44757: Fix search engine tests for Firefox 149. - - - - - 43a1de0d by Pier Angelo Vendrame at 2026-03-24T18:49:49+01:00 fixup! Firefox preference overrides. BB 44763: Disable WebGPU until audited. - - - - - 4 changed files: - browser/app/profile/001-base-profile.js - dom/canvas/CanvasUtils.cpp - toolkit/components/search/tests/xpcshell/test_base_browser.js - toolkit/components/search/tests/xpcshell/test_security_level.js Changes: ===================================== browser/app/profile/001-base-profile.js ===================================== @@ -492,6 +492,8 @@ pref("privacy.resistFingerprinting.skipEarlyBlankFirstPaint", true); pref("webgl.disable-fail-if-major-performance-caveat", true); // tor-browser#16404: disable until we investigate it further (#22333) pref("webgl.enable-webgl2", false); +// tor-browser#44763: disable WebGPU until audited. +pref("dom.webgpu.enabled", false); pref("browser.link.open_newwindow.restriction", 0); // Bug 9881: Open popups in new tabs (to avoid fullscreen popups) // tor-browser#42767: Disable offscreen canvas until verified it is not fingerprintable pref("gfx.offscreencanvas.enabled", false); ===================================== dom/canvas/CanvasUtils.cpp ===================================== @@ -382,14 +382,9 @@ ImageExtraction ImageExtractionResult(dom::HTMLCanvasElement* aCanvasElement, return ImageExtraction::Placeholder; } - if (ownerDoc->ShouldResistFingerprinting( - RFPTarget::EfficientCanvasRandomization) && - GetCanvasExtractDataPermission(aPrincipal) != - nsIPermissionManager::ALLOW_ACTION) { - return ImageExtraction::EfficientRandomize; - } - - if ((ownerDoc->ShouldResistFingerprinting(RFPTarget::CanvasRandomization) || + if ((ownerDoc->ShouldResistFingerprinting( + RFPTarget::EfficientCanvasRandomization) || + ownerDoc->ShouldResistFingerprinting(RFPTarget::CanvasRandomization) || ownerDoc->ShouldResistFingerprinting(RFPTarget::WebGLRandomization)) && GetCanvasExtractDataPermission(aPrincipal) != nsIPermissionManager::ALLOW_ACTION) { ===================================== toolkit/components/search/tests/xpcshell/test_base_browser.js ===================================== @@ -10,6 +10,10 @@ "use strict"; +const { SearchService } = ChromeUtils.importESModule( + "moz-src:///toolkit/components/search/SearchService.sys.mjs" +); + const expectedURLs = { ddg: "https://duckduckgo.com/?q=test", "ddg-html": "https://html.duckduckgo.com/html/?q=test", @@ -21,24 +25,23 @@ const expectedURLs = { const defaultEngine = "ddg"; add_setup(async function setup() { - await Services.search.init(); + await SearchService.init(); }); add_task(async function test_listEngines() { - const { engines } = - await Services.search.wrappedJSObject._fetchEngineSelectorEngines(); + const { engines } = await SearchService._fetchEngineSelectorEngines(); const foundIdentifiers = engines.map(e => e.identifier); Assert.deepEqual(foundIdentifiers, Object.keys(expectedURLs)); }); add_task(async function test_default() { Assert.equal( - (await Services.search.getDefault()).id, + (await SearchService.getDefault()).id, defaultEngine, `${defaultEngine} is our default search engine in normal mode.` ); Assert.equal( - (await Services.search.getDefaultPrivate()).id, + (await SearchService.getDefaultPrivate()).id, defaultEngine, `${defaultEngine} is our default search engine in PBM.` ); @@ -46,7 +49,7 @@ add_task(async function test_default() { add_task(function test_checkSearchURLs() { for (const [id, url] of Object.entries(expectedURLs)) { - const engine = Services.search.getEngineById(id); + const engine = SearchService.getEngineById(id); const foundUrl = engine.getSubmission("test").uri.spec; Assert.equal(foundUrl, url, `The URL of ${engine.name} is not altered.`); } @@ -54,7 +57,7 @@ add_task(function test_checkSearchURLs() { add_task(async function test_iconsDoesNotFail() { for (const id of Object.keys(expectedURLs)) { - const engine = Services.search.getEngineById(id); + const engine = SearchService.getEngineById(id); // No need to assert anything, as in case of error this method should throw. await engine.getIconURL(); } ===================================== toolkit/components/search/tests/xpcshell/test_security_level.js ===================================== @@ -8,14 +8,18 @@ "use strict"; +const { SearchService } = ChromeUtils.importESModule( + "moz-src:///toolkit/components/search/SearchService.sys.mjs" +); + const expectedURLs = { ddg: "https://html.duckduckgo.com/html?q=test", }; add_task(async function test_securityLevel() { - await Services.search.init(); + await SearchService.init(); for (const [id, url] of Object.entries(expectedURLs)) { - const engine = Services.search.getEngineById(id); + const engine = SearchService.getEngineById(id); const foundUrl = engine.getSubmission("test").uri.spec; Assert.equal(foundUrl, url, `${engine.name} is in HTML mode.`); } View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/1d… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/1d… 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-149.0a1-16.0-2] 3 commits: BB 43243 [android]: Keep processing pending inits after failure
by brizental (@brizental) 24 Mar '26

24 Mar '26
brizental pushed to branch tor-browser-149.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: 863fc44a by Beatriz Rizental at 2026-03-24T14:25:12-03:00 BB 43243 [android]: Keep processing pending inits after failure This is in the process of being uplifted. Bug 2021618: bugzilla.mozilla.org/show_bug.cgi?id=2021618 Differential Revision: https://phabricator.services.mozilla.com/D286669 - - - - - 33b1e93e by Beatriz Rizental at 2026-03-24T14:25:12-03:00 BB 43243 [android]: Start GeckoEngineSession early when Marionette enabled This is in the process of being uplifted. Bug 2021884: https://bugzilla.mozilla.org/show_bug.cgi?id=2021884 Differential Revision: https://phabricator.services.mozilla.com/D286676 - - - - - 24ce6582 by Beatriz Rizental at 2026-03-24T14:25:13-03:00 BB 43243: Modify mozharness scripts for Base Browser - - - - - 7 changed files: - mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt - mobile/shared/modules/geckoview/DelayedInit.sys.mjs - + mobile/shared/modules/geckoview/test/xpcshell/test_DelayedInit.js - mobile/shared/modules/geckoview/test/xpcshell/xpcshell.toml - testing/mozharness/configs/android/android14-x86_64.py - testing/mozharness/configs/android/android_common.py - testing/mozharness/scripts/android_emulator_unittest.py Changes: ===================================== mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt ===================================== @@ -507,6 +507,12 @@ open class FenixApplication : Application(), Provider, ThemeProvider { logElapsedTime(logger, "Starting Relay feature integration") { components.relayFeatureIntegration.start() } + + // If running Marionette tests a GeckoEngineSession needs to be + // started and that must happen on the main thread. + logElapsedTime(logger, "Maybe setup Marionette") { + maybeSetupMarionette() + } } } @@ -675,6 +681,13 @@ open class FenixApplication : Application(), Provider, ThemeProvider { FxNimbus.initialize { nimbus } } + private fun maybeSetupMarionette() { + // If Marionette is enabled, start a GeckoEngineSession immediatelly. + if (System.getenv("MOZ_MARIONETTE") == "1") { + components.core.engine.speculativeCreateSession(components.appStore.state.mode.isPrivate) + } + } + /** * Initiate Megazord sequence! Megazord Battle Mode! * ===================================== mobile/shared/modules/geckoview/DelayedInit.sys.mjs ===================================== @@ -96,7 +96,11 @@ var Impl = { return false; } this.complete = true; - this.fn.call(); + try { + this.fn.call(); + } catch (e) { + console.error("Error running init", e); + } this.fn = null; return true; }, ===================================== mobile/shared/modules/geckoview/test/xpcshell/test_DelayedInit.js ===================================== @@ -0,0 +1,48 @@ +/* Any copyright is dedicated to the Public Domain. +http://creativecommons.org/publicdomain/zero/1.0/ */ +"use strict"; + +const { DelayedInit } = ChromeUtils.importESModule( + "resource://gre/modules/DelayedInit.sys.mjs" +); + +add_task(async function test_delayed_init_continues_queue_on_failure() { + const results = []; + const waitMs = 0; + + DelayedInit.schedule( + () => { + results.push("first"); + }, + null, + null, + waitMs + ); + + DelayedInit.schedule( + () => { + results.push("second"); + throw new Error("Deliberate error for testing"); + }, + null, + null, + waitMs + ); + + DelayedInit.schedule( + () => { + results.push("third"); + }, + null, + null, + waitMs + ); + + await new Promise(resolve => ChromeUtils.idleDispatch(resolve)); + + Assert.deepEqual( + results, + ["first", "second", "third"], + "Queue processes all inits even when one fails" + ); +}); ===================================== mobile/shared/modules/geckoview/test/xpcshell/xpcshell.toml ===================================== @@ -7,6 +7,8 @@ prefs = "browser.crashReports.onDemand=true" ["test_ChildCrashHandler.js"] +["test_DelayedInit.js"] + ["test_GeckoViewAppConstants.js"] ["test_RemoteSettingsCrashPull.js"] ===================================== testing/mozharness/configs/android/android14-x86_64.py ===================================== @@ -11,8 +11,9 @@ config = { "emulator_avd_name": "mozemulator-android34-x86_64", "emulator_process_name": "qemu-system-x86_64", "emulator_extra_args": [ - "-gpu", - "on", + "-no-window", + "-no-audio", + "-no-boot-anim", "-skip-adb-auth", "-verbose", "-show-kernel", ===================================== testing/mozharness/configs/android/android_common.py ===================================== @@ -315,6 +315,19 @@ config = { "--deviceSerial=%(device_serial)s", ], }, + "marionette": { + "run_filename": "runtests.py", + "testsdir": "marionette/harness/marionette_harness", + "install": True, + "options": [ + "-vv", + "--address=127.0.0.1:2828", + "--app=fennec", + ], + "tests": [ + "%(abs_marionette_manifest_dir)s/unit-tests.toml", + ], + }, }, # end suite_definitions "structured_suites": [ "mochitest-media", ===================================== testing/mozharness/scripts/android_emulator_unittest.py ===================================== @@ -7,15 +7,18 @@ import copy import datetime import json import os +import socket import subprocess import sys +import tempfile +import time # load modules from parent dir here = os.path.abspath(os.path.dirname(__file__)) sys.path.insert(1, os.path.dirname(here)) from mozharness.base.log import WARNING -from mozharness.base.script import BaseScript, PreScriptAction +from mozharness.base.script import BaseScript, PostScriptAction, PreScriptAction from mozharness.mozilla.automation import TBPL_RETRY from mozharness.mozilla.mozbase import MozbaseMixin from mozharness.mozilla.testing.android import AndroidMixin @@ -26,7 +29,7 @@ from mozharness.mozilla.testing.codecoverage import ( from mozharness.mozilla.testing.testbase import TestingMixin, testing_config_options SUITE_DEFAULT_E10S = ["geckoview-junit", "mochitest", "reftest"] -SUITE_NO_E10S = ["cppunittest", "gtest", "jittest", "xpcshell"] +SUITE_NO_E10S = ["cppunittest", "gtest", "jittest", "xpcshell", "marionette"] SUITE_REPEATABLE = ["mochitest", "reftest", "xpcshell"] @@ -178,6 +181,15 @@ class AndroidEmulatorTest( "times in which case the test must contain at least one of the given tags.", }, ], + [ + ["--package-name"], + { + "action": "store", + "default": None, + "dest": "package_name", + "help": "The Android package name for the app being installed.", + }, + ], ] + copy.deepcopy(testing_config_options) + copy.deepcopy(code_coverage_config_options) @@ -228,6 +240,7 @@ class AndroidEmulatorTest( self.enable_isolated_zygote_process = c.get("enable_isolated_zygote_process") self.extra_prefs = c.get("extra_prefs") self.test_tags = c.get("test_tags") + self.package_name = c.get("package_name") or self.query_package_name() def query_abs_dirs(self): if self.abs_dirs: @@ -329,6 +342,16 @@ class AndroidEmulatorTest( "error_summary_file": error_summary_file, "xpcshell_extra": c.get("xpcshell_extra", ""), "gtest_dir": os.path.join(dirs["abs_test_install_dir"], "gtest"), + "abs_marionette_manifest_dir": os.path.join( + dirs["abs_test_install_dir"], + "marionette", + "tests", + "testing", + "marionette", + "harness", + "marionette_harness", + "tests", + ), } user_paths = self._get_mozharness_test_paths(self.test_suite) @@ -345,7 +368,7 @@ class AndroidEmulatorTest( if "%(app)" in option: # only query package name if requested - cmd.extend([option % {"app": self.query_package_name()}]) + cmd.extend([option % {"app": self.package_name}]) else: option = option % str_format_values if option: @@ -409,6 +432,7 @@ class AndroidEmulatorTest( self.config["suite_definitions"][self.test_suite].get("tests"), None, try_tests, + str_format_values=str_format_values, ) ) @@ -449,6 +473,7 @@ class AndroidEmulatorTest( }, ), ("xpcshell", {"xpcshell": "xpcshell"}), + ("marionette", {"marionette": "marionette"}), ] suites = [] for category, all_suites in all: @@ -473,6 +498,61 @@ class AndroidEmulatorTest( # in the base class, this checks for mozinstall, but we don't use it pass + def _configure_marionette_virtualenv(self, action): + dirs = self.query_abs_dirs() + requirements = os.path.join( + dirs["abs_test_install_dir"], "config", "marionette_requirements.txt" + ) + if not os.path.isfile(requirements): + self.fatal(f"Could not find marionette requirements file: {requirements}") + + self.register_virtualenv_module(requirements=[requirements]) + + def _marionette_setup(self): + adb = self.query_exe("adb") + + self.run_command([adb, "forward", "tcp:2828", "tcp:2828"]) + + with tempfile.NamedTemporaryFile(suffix=".yaml") as tmp_file: + tmp_file.write( + b"""args: +- --marionette +- --remote-allow-system-access +""" + ) + tmp_file.flush() + + remote_path = f"/data/local/tmp/{self.package_name}-geckoview-config.yaml" + self.run_command([adb, "push", tmp_file.name, remote_path]) + + self.run_command([ + adb, + "shell", + "am", + "start", + "-S", + "-W", + "-n", + f"{self.package_name}/org.mozilla.gecko.BrowserApp", + ]) + + # Wait for Marionette to be ready + for attempt in range(5): + try: + self.info( + f"Checking Marionette on 127.0.0.1:2828 (attempt {attempt + 1}/5)" + ) + socket.create_connection(("127.0.0.1", 2828), 10).close() + self.info("Marionette is reachable") + break + except OSError: + if attempt == 4: + self.fatal( + "Timed out waiting for 127.0.0.1:2828 to become reachable" + ) + self.info("Marionette not reachable yet, retrying in 10s") + time.sleep(10) + @PreScriptAction("create-virtualenv") def pre_create_virtualenv(self, action): dirs = self.query_abs_dirs() @@ -488,6 +568,9 @@ class AndroidEmulatorTest( if requirements: self.register_virtualenv_module(requirements=[requirements]) + if ("marionette", "marionette") in suites: + self._configure_marionette_virtualenv(action) + def download_and_extract(self): """ Download and extract product APK, tests.zip, and host utils. @@ -525,6 +608,9 @@ class AndroidEmulatorTest( for per_test_suite, suite in suites: self.test_suite = suite + if self.test_suite == "marionette": + self._marionette_setup() + try: cwd = self._query_tests_dir(self.test_suite) except Exception: @@ -594,6 +680,19 @@ class AndroidEmulatorTest( % (suite_category, suite, tbpl_status), ) + @PostScriptAction("run-tests") + def marionette_teardown(self, *args, **kwargs): + if ("marionette", "marionette") in self._query_suites(): + adb = self.query_exe("adb") + self.run_command([adb, "shell", "am", "force-stop", self.package_name]) + self.run_command([adb, "uninstall", self.package_name]) + self.run_command([ + adb, + "shell", + "rm", + f"/data/local/tmp/{self.package_name}-geckoview-config.yaml", + ]) + if __name__ == "__main__": test = AndroidEmulatorTest() View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/dd7562… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/dd7562… 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] Pushed new tag mullvad-browser-149.0a1-16.0-2-build1
by boklm (@boklm) 24 Mar '26

24 Mar '26
boklm pushed new tag mullvad-browser-149.0a1-16.0-2-build1 at The Tor Project / Applications / Mullvad Browser -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/tree/mullv… 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-149.0a1-16.0-2] 29 commits: Add CI for Mullvad Browser
by boklm (@boklm) 24 Mar '26

24 Mar '26
boklm pushed to branch mullvad-browser-149.0a1-16.0-2 at The Tor Project / Applications / Mullvad Browser Commits: 07fe6c41 by Henry Wilkes at 2026-03-24T12:31:40+01:00 Add CI for Mullvad Browser - - - - - b930557c by Pier Angelo Vendrame at 2026-03-24T12:31:41+01:00 MB 38: Mullvad Browser configuration - - - - - 3a802835 by Pier Angelo Vendrame at 2026-03-24T12:41:52+01:00 MB 1: Mullvad Browser branding See also: mullvad-browser#5: Product name and directory customization mullvad-browser#12: Create new branding directories and integrate Mullvad icons+branding mullvad-browser#14: Remove Default Built-in bookmarks mullvad-browser#35: Add custom PDF icons for Windows builds mullvad-browser#48: Replace Mozilla copyright and legal trademarks in mullvadbrowser.exe metadata mullvad-browser#51: Update trademark string mullvad-browser#104: Update shipped dll metadata copyright/licensing info mullvad-browser#107: Add alpha and nightly icons - - - - - 2e97da18 by Henry Wilkes at 2026-03-24T16:11:01+01:00 fixup! MB 1: Mullvad Browser branding MB 515: Use max-width instead of width for #rightBox - - - - - a3dd8eb8 by Henry Wilkes at 2026-03-24T16:11:02+01:00 Mullvad Browser strings This commit adds strings needed by the following Mullvad Browser patches. - - - - - bb4d0baa by Pier Angelo Vendrame at 2026-03-24T16:11:03+01:00 MB 20: Allow packaged-addons in PBM. We install a few addons from the distribution directory, but they are not automatically enabled for PBM mode. This commit modifies the code that installs them to also add the PBM permission to the known ones. - - - - - 1e144649 by Pier Angelo Vendrame at 2026-03-24T16:11:04+01:00 MB 63: Customize some about pages for Mullvad Browser Also: mullvad-browser#57: Purge unneeded about: pages - - - - - 51bb9a4e by Pier Angelo Vendrame at 2026-03-24T16:11:05+01:00 MB 37: Customization for the about dialog - - - - - 0bd1d419 by Henry Wilkes at 2026-03-24T16:11:06+01:00 MB 39: Add home page about:mullvad-browser - - - - - 75ae5ec7 by Henry Wilkes at 2026-03-24T16:11:07+01:00 fixup! MB 39: Add home page about:mullvad-browser MB 516: Use new CSS tokens. - - - - - 69ce282e by hackademix at 2026-03-24T16:11:08+01:00 MB 97: Remove UI cues to install new extensions. - - - - - 78c8a7d6 by hackademix at 2026-03-24T16:11:09+01:00 MB 47: uBlock Origin customization - - - - - 14a23d38 by Pier Angelo Vendrame at 2026-03-24T16:11:10+01:00 MB 21: Disable the password manager This commit disables the about:login page and removes the "Login and Password" section of about:preferences. We do not do anything to the real password manager of Firefox, that is in toolkit: it contains C++ parts that make it difficult to actually prevent it from being built.. Finally, we modify the the function that opens about:login to report an error in the console so that we can quickly get a backtrace to the code that tries to use it. - - - - - b47ff966 by Pier Angelo Vendrame at 2026-03-24T16:11:11+01:00 MB 112: Updater customization for Mullvad Browser MB 71: Set the updater base URL to Mullvad domain - - - - - b71dc454 by Nicolas Vigier at 2026-03-24T16:11:11+01:00 MB 79: Add Mullvad Browser MAR signing keys MB 256: Add mullvad-browser nightly mar signing key - - - - - fd261adc by Pier Angelo Vendrame at 2026-03-24T16:11:12+01:00 MB 34: Hide unsafe and unwanted preferences UI about:preferences allow to override some of our defaults, that could be fingeprintable or have some other unwanted consequences. - - - - - 98954dc6 by Pier Angelo Vendrame at 2026-03-24T16:11:13+01:00 MB 160: Disable the cookie exceptions button Besides disabling the "Delete on close checkbox", disable also the "Manage Exceptions" button when always using PBM. - - - - - 6690c8de by hackademix at 2026-03-24T16:11:14+01:00 MB 163: Prevent uBlock Origin from being uninstalled/disabled - - - - - fd90fbee by Richard Pospesel at 2026-03-24T16:11:15+01:00 MB 188: Customize Gitlab Issue and Merge templates - - - - - 2519f1d2 by Dan Ballard at 2026-03-24T16:11:16+01:00 fixup! MB 188: Customize Gitlab Issue and Merge templates Add notification final step - - - - - 351b9644 by rui hildt at 2026-03-24T16:11:17+01:00 MB 213: Customize the search engines list. - - - - - b19edae2 by hackademix at 2026-03-24T16:11:18+01:00 MB 214: Enable cross-tab identity leak protection in "quiet" mode - - - - - c099b706 by Pier Angelo Vendrame at 2026-03-24T16:11:19+01:00 MB 320: Temporarily disable WebRTC and WDBA on Windows. WebRTC should be re-enabled when tor-browser#42758 is resolved, and and the default browser agent when in general we make this feature work again. - - - - - 9d8faf6a by Henry Wilkes at 2026-03-24T16:11:20+01:00 MB 329: Customize toolbar for mullvad-browser. - - - - - 6763253e by Pier Angelo Vendrame at 2026-03-24T16:11:21+01:00 fixup! MB 329: Customize toolbar for mullvad-browser. MB 514: Remove new identity from Mullvad Browser. - - - - - dfc7d9b7 by Henry Wilkes at 2026-03-24T16:11:21+01:00 MB 419: Mullvad Browser migration procedures. This commit implements the the Mullvad Browser's version of _migrateUI. - - - - - a53d1009 by Henry Wilkes at 2026-03-24T16:11:22+01:00 MB 488: Adjust search engine removal notification for Mullvad Leta. - - - - - 03b70ede by Pier Angelo Vendrame at 2026-03-24T16:11:23+01:00 MB 80: Enable Mullvad Browser as a default browser - - - - - 1d8625c5 by Beatriz Rizental at 2026-03-24T16:11:24+01:00 MB 43564: Modify ./mach bootstrap for Mullvad Browser - - - - - 259 changed files: - .gitlab/ci/jobs/update-translations.yml - .gitlab/issue_templates/000 Bug Report.md - .gitlab/issue_templates/010 Proposal.md - .gitlab/issue_templates/020 Web Compatibility.md - .gitlab/issue_templates/030 Test.md - .gitlab/issue_templates/040 Feature.md - .gitlab/issue_templates/041 Time-Gated Feature.md - .gitlab/issue_templates/051 Revert.md - + .gitlab/issue_templates/060 Rebase - Alpha.md - + .gitlab/issue_templates/061 Rebase - Stable.md - .gitlab/issue_templates/090 Emergency Security Issue.md - .gitlab/merge_request_templates/Default.md - + .gitlab/merge_request_templates/Rebase.md - browser/app/Makefile.in - browser/app/macbuild/Contents/Info.plist.in - browser/app/module.ver - browser/app/firefox.exe.manifest → browser/app/mullvadbrowser.exe.manifest - + browser/app/profile/000-mullvad-browser.js - browser/app/profile/001-base-profile.js - browser/base/content/aboutDialog.xhtml - browser/base/content/appmenu-viewcache.inc.xhtml - browser/base/content/browser-menubar.inc - browser/base/content/browser-places.js - browser/base/content/browser.js - browser/base/content/default-bookmarks.html - browser/base/content/nsContextMenu.sys.mjs - browser/base/content/overrides/app-license.html - browser/base/content/pageinfo/pageInfo.xhtml - browser/base/content/utilityOverlay.js - browser/branding/branding-common.mozbuild - + browser/branding/mb-alpha/VisualElements_150.png - + browser/branding/mb-alpha/VisualElements_70.png - + browser/branding/mb-alpha/configure.sh - + browser/branding/mb-alpha/content/about-logo.png - + browser/branding/mb-alpha/content/about-logo.svg - + browser/branding/mb-alpha/content/about-logo(a)2x.png - + browser/branding/mb-alpha/content/about-wordmark.svg - + browser/branding/mb-alpha/content/about.png - + browser/branding/mb-alpha/content/aboutDialog.css - + browser/branding/mb-alpha/content/document_pdf.svg - + browser/branding/mb-alpha/content/firefox-wordmark.svg - + browser/branding/mb-alpha/content/icon128.png - + browser/branding/mb-alpha/content/icon16.png - + browser/branding/mb-alpha/content/icon256.png - + browser/branding/mb-alpha/content/icon32.png - + browser/branding/mb-alpha/content/icon48.png - + browser/branding/mb-alpha/content/icon64.png - + browser/branding/mb-alpha/content/jar.mn - + browser/branding/mb-alpha/content/moz.build - + browser/branding/mb-alpha/content/mullvad-branding.css - + browser/branding/mb-alpha/default128.png - + browser/branding/mb-alpha/default16.png - + browser/branding/mb-alpha/default22.png - + browser/branding/mb-alpha/default24.png - + browser/branding/mb-alpha/default256.png - + browser/branding/mb-alpha/default32.png - + browser/branding/mb-alpha/default48.png - + browser/branding/mb-alpha/default64.png - + browser/branding/mb-alpha/document.icns - + browser/branding/mb-alpha/document.ico - + browser/branding/mb-alpha/document_pdf.ico - + browser/branding/mb-alpha/firefox.icns - + browser/branding/mb-alpha/firefox.ico - + browser/branding/mb-alpha/firefox.svg - + browser/branding/mb-alpha/locales/en-US/brand.ftl - + browser/branding/mb-alpha/locales/en-US/brand.properties - + browser/branding/mb-alpha/locales/jar.mn - + browser/branding/mb-alpha/locales/moz.build - + browser/branding/mb-alpha/locales/mullvad-about-wordmark-en.ftl - + browser/branding/mb-alpha/moz.build - + browser/branding/mb-alpha/mullvadbrowser.VisualElementsManifest.xml - + browser/branding/mb-alpha/newtab.ico - + browser/branding/mb-alpha/newwindow.ico - + browser/branding/mb-alpha/pbmode.ico - + browser/branding/mb-alpha/pref/firefox-branding.js - + browser/branding/mb-nightly/VisualElements_150.png - + browser/branding/mb-nightly/VisualElements_70.png - + browser/branding/mb-nightly/configure.sh - + browser/branding/mb-nightly/content/about-logo.png - + browser/branding/mb-nightly/content/about-logo.svg - + browser/branding/mb-nightly/content/about-logo(a)2x.png - + browser/branding/mb-nightly/content/about-wordmark.svg - + browser/branding/mb-nightly/content/about.png - + browser/branding/mb-nightly/content/aboutDialog.css - + browser/branding/mb-nightly/content/document_pdf.svg - + browser/branding/mb-nightly/content/firefox-wordmark.svg - + browser/branding/mb-nightly/content/icon128.png - + browser/branding/mb-nightly/content/icon16.png - + browser/branding/mb-nightly/content/icon256.png - + browser/branding/mb-nightly/content/icon32.png - + browser/branding/mb-nightly/content/icon48.png - + browser/branding/mb-nightly/content/icon64.png - + browser/branding/mb-nightly/content/jar.mn - + browser/branding/mb-nightly/content/moz.build - + browser/branding/mb-nightly/content/mullvad-branding.css - + browser/branding/mb-nightly/default128.png - + browser/branding/mb-nightly/default16.png - + browser/branding/mb-nightly/default22.png - + browser/branding/mb-nightly/default24.png - + browser/branding/mb-nightly/default256.png - + browser/branding/mb-nightly/default32.png - + browser/branding/mb-nightly/default48.png - + browser/branding/mb-nightly/default64.png - + browser/branding/mb-nightly/document.icns - + browser/branding/mb-nightly/document.ico - + browser/branding/mb-nightly/document_pdf.ico - + browser/branding/mb-nightly/firefox.icns - + browser/branding/mb-nightly/firefox.ico - + browser/branding/mb-nightly/firefox.svg - + browser/branding/mb-nightly/locales/en-US/brand.ftl - + browser/branding/mb-nightly/locales/en-US/brand.properties - + browser/branding/mb-nightly/locales/jar.mn - + browser/branding/mb-nightly/locales/moz.build - + browser/branding/mb-nightly/locales/mullvad-about-wordmark-en.ftl - + browser/branding/mb-nightly/moz.build - + browser/branding/mb-nightly/mullvadbrowser.VisualElementsManifest.xml - + browser/branding/mb-nightly/newtab.ico - + browser/branding/mb-nightly/newwindow.ico - + browser/branding/mb-nightly/pbmode.ico - + browser/branding/mb-nightly/pref/firefox-branding.js - + browser/branding/mb-release/VisualElements_150.png - + browser/branding/mb-release/VisualElements_70.png - + browser/branding/mb-release/configure.sh - + browser/branding/mb-release/content/about-logo.png - + browser/branding/mb-release/content/about-logo.svg - + browser/branding/mb-release/content/about-logo(a)2x.png - + browser/branding/mb-release/content/about-wordmark.svg - + browser/branding/mb-release/content/about.png - + browser/branding/mb-release/content/aboutDialog.css - + browser/branding/mb-release/content/document_pdf.svg - + browser/branding/mb-release/content/firefox-wordmark.svg - + browser/branding/mb-release/content/icon128.png - + browser/branding/mb-release/content/icon16.png - + browser/branding/mb-release/content/icon256.png - + browser/branding/mb-release/content/icon32.png - + browser/branding/mb-release/content/icon48.png - + browser/branding/mb-release/content/icon64.png - + browser/branding/mb-release/content/jar.mn - + browser/branding/mb-release/content/moz.build - + browser/branding/mb-release/content/mullvad-branding.css - + browser/branding/mb-release/default128.png - + browser/branding/mb-release/default16.png - + browser/branding/mb-release/default22.png - + browser/branding/mb-release/default24.png - + browser/branding/mb-release/default256.png - + browser/branding/mb-release/default32.png - + browser/branding/mb-release/default48.png - + browser/branding/mb-release/default64.png - + browser/branding/mb-release/document.icns - + browser/branding/mb-release/document.ico - + browser/branding/mb-release/document_pdf.ico - + browser/branding/mb-release/firefox.icns - + browser/branding/mb-release/firefox.ico - + browser/branding/mb-release/firefox.svg - + browser/branding/mb-release/locales/en-US/brand.ftl - + browser/branding/mb-release/locales/en-US/brand.properties - + browser/branding/mb-release/locales/jar.mn - + browser/branding/mb-release/locales/moz.build - + browser/branding/mb-release/locales/mullvad-about-wordmark-en.ftl - + browser/branding/mb-release/moz.build - + browser/branding/mb-release/mullvadbrowser.VisualElementsManifest.xml - + browser/branding/mb-release/newtab.ico - + browser/branding/mb-release/newwindow.ico - + browser/branding/mb-release/pbmode.ico - + browser/branding/mb-release/pref/firefox-branding.js - browser/components/BrowserContentHandler.sys.mjs - browser/components/BrowserGlue.sys.mjs - browser/components/DesktopActorRegistry.sys.mjs - browser/components/ProfileDataUpgrader.sys.mjs - browser/components/about/AboutRedirector.cpp - browser/components/about/components.conf - browser/components/customizableui/CustomizableUI.sys.mjs - browser/components/moz.build - + browser/components/mullvad-browser/AboutMullvadBrowserChild.sys.mjs - + browser/components/mullvad-browser/AboutMullvadBrowserParent.sys.mjs - + browser/components/mullvad-browser/content/2728-sparkles.svg - + browser/components/mullvad-browser/content/aboutMullvadBrowser.css - + browser/components/mullvad-browser/content/aboutMullvadBrowser.html - + browser/components/mullvad-browser/content/aboutMullvadBrowser.js - + browser/components/mullvad-browser/jar.mn - + browser/components/mullvad-browser/moz.build - browser/components/preferences/home.inc.xhtml - browser/components/preferences/preferences.xhtml - browser/components/preferences/privacy.inc.xhtml - browser/components/preferences/privacy.js - browser/components/preferences/search.inc.xhtml - browser/components/search/SearchUIUtils.sys.mjs - browser/components/shell/ShellService.sys.mjs - browser/components/shell/WindowsDefaultBrowser.cpp - browser/components/shell/nsWindowsShellService.cpp - browser/components/tabbrowser/NewTabPagePreloading.sys.mjs - browser/config/mozconfigs/base-browser - + browser/config/mozconfigs/mullvad-browser - browser/installer/package-manifest.in - browser/installer/windows/nsis/updater_append.ini - browser/locales/l10n.toml - browser/modules/HomePage.sys.mjs - browser/moz.build - browser/moz.configure - build/moz.configure/basebrowser-resources.configure - build/moz.configure/bootstrap.configure - config/create_rc.py - devtools/client/aboutdebugging/src/actions/runtimes.js - devtools/client/aboutdebugging/src/components/sidebar/Sidebar.js - devtools/client/jar.mn - devtools/client/themes/images/aboutdebugging-firefox-aurora.svg - devtools/client/themes/images/aboutdebugging-firefox-beta.svg - devtools/client/themes/images/aboutdebugging-firefox-logo.svg - devtools/client/themes/images/aboutdebugging-firefox-nightly.svg - devtools/client/themes/images/aboutdebugging-firefox-release.svg - + devtools/client/themes/images/aboutdebugging-mullvadbrowser-logo.svg - docshell/base/nsAboutRedirector.cpp - docshell/build/components.conf - moz.configure - mozconfig-linux-aarch64 - mozconfig-linux-aarch64-dev - mozconfig-linux-x86_64 - mozconfig-linux-x86_64-asan - mozconfig-linux-x86_64-dev - mozconfig-macos - mozconfig-macos-dev - mozconfig-windows-x86_64 - + other-licenses/nsis/Contrib/ApplicationID/Makefile - other-licenses/nsis/Contrib/ApplicationID/Set.cpp - + other-licenses/nsis/Contrib/CityHash/Makefile - python/mozboot/mozboot/bootstrap.py - python/mozbuild/mozbuild/backend/base.py - python/mozbuild/mozbuild/tbbutils.py - toolkit/components/extensions/child/ext-storage.js - toolkit/components/extensions/parent/ext-storage.js - toolkit/components/passwordmgr/LoginHelper.sys.mjs - toolkit/components/remote/nsDBusRemoteClient.cpp - toolkit/components/remote/nsDBusRemoteServer.cpp - toolkit/components/search/SearchService.sys.mjs - toolkit/components/search/content/base-browser-search-engine-icons.json - toolkit/components/search/content/base-browser-search-engines.json - + toolkit/components/search/content/brave.svg - + toolkit/components/search/content/mojeek.ico - toolkit/components/search/tests/xpcshell/test_base_browser.js - toolkit/components/securitylevel/SecurityLevel.sys.mjs - + toolkit/content/aboutTelemetryMullvad.xhtml - toolkit/content/jar.mn - + toolkit/locales/en-US/toolkit/global/mullvad-browser.ftl - toolkit/mozapps/defaultagent/EventLog.h - toolkit/mozapps/defaultagent/SetDefaultBrowser.cpp - toolkit/mozapps/extensions/AddonManager.sys.mjs - toolkit/mozapps/extensions/content/aboutaddons.css - toolkit/mozapps/extensions/internal/XPIDatabase.sys.mjs - toolkit/mozapps/extensions/internal/XPIProvider.sys.mjs - toolkit/mozapps/update/updater/nightly_aurora_level3_primary.der - toolkit/mozapps/update/updater/nightly_aurora_level3_secondary.der - toolkit/mozapps/update/updater/release_primary.der - toolkit/mozapps/update/updater/release_secondary.der - + toolkit/themes/shared/icons/mullvadbrowser.png - toolkit/themes/shared/minimal-toolkit.jar.inc.mn - toolkit/xre/nsAppRunner.cpp - tools/lint/fluent-lint/exclusions.yml - widget/windows/WinTaskbar.cpp - widget/windows/moz.build The diff was not included because it is too large. View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/d3… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/compare/d3… 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-149.0a1-16.0-2] fixup! Firefox preference overrides.
by Pier Angelo Vendrame (@pierov) 24 Mar '26

24 Mar '26
Pier Angelo Vendrame pushed to branch tor-browser-149.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: dd756207 by Pier Angelo Vendrame at 2026-03-24T16:45:21+01:00 fixup! Firefox preference overrides. BB 44763: Disable WebGPU until audited. - - - - - 1 changed file: - browser/app/profile/001-base-profile.js Changes: ===================================== browser/app/profile/001-base-profile.js ===================================== @@ -492,6 +492,8 @@ pref("privacy.resistFingerprinting.skipEarlyBlankFirstPaint", true); pref("webgl.disable-fail-if-major-performance-caveat", true); // tor-browser#16404: disable until we investigate it further (#22333) pref("webgl.enable-webgl2", false); +// tor-browser#44763: disable WebGPU until audited. +pref("dom.webgpu.enabled", false); pref("browser.link.open_newwindow.restriction", 0); // Bug 9881: Open popups in new tabs (to avoid fullscreen popups) // tor-browser#42767: Disable offscreen canvas until verified it is not fingerprintable pref("gfx.offscreencanvas.enabled", false); View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/dd75620… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/dd75620… 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-149.0a1-16.0-2] 2 commits: fixup! TB 40933: Add tor-launcher functionality
by henry (@henry) 24 Mar '26

24 Mar '26
henry pushed to branch tor-browser-149.0a1-16.0-2 at The Tor Project / Applications / Tor Browser Commits: edf9758a by Henry Wilkes at 2026-03-24T14:48:48+00:00 fixup! TB 40933: Add tor-launcher functionality TB 44753: Drop TorProvider.isBootstrapDone. - - - - - 3dac4f13 by Henry Wilkes at 2026-03-24T14:48:50+00:00 fixup! TB 41668: Tweaks to the Base Browser updater for Tor Browser TB 44753: Use TorConnect rather than TorProvider to determine if we are bootstrapped. This avoids a direct and async call to the provider. We also add a safety check to determine whether the bootstrap has already called before adding the listener. - - - - - 2 changed files: - toolkit/components/tor-launcher/TorProvider.sys.mjs - toolkit/mozapps/update/UpdateService.sys.mjs Changes: ===================================== toolkit/components/tor-launcher/TorProvider.sys.mjs ===================================== @@ -137,7 +137,6 @@ export class TorProvider { */ #socksSettings = null; - #isBootstrapDone = false; /** * Keep the last warning to avoid broadcasting an async warning if it is the * same one as the last broadcast. @@ -510,10 +509,6 @@ export class TorProvider { return TorLauncherUtil.shouldStartAndOwnTor; } - get isBootstrapDone() { - return this.#isBootstrapDone; - } - /** * TODO: Rename to isReady once we remove finish the migration. * @@ -883,7 +878,6 @@ export class TorProvider { "Requested to close an already closed control port connection" ); } - this.#isBootstrapDone = false; this.#lastWarning = {}; } @@ -1005,12 +999,9 @@ export class TorProvider { Services.obs.notifyObservers(statusObj, TorProviderTopics.BootstrapStatus); if (statusObj.PROGRESS === 100) { - this.#isBootstrapDone = true; return; } - this.#isBootstrapDone = false; - // Can TYPE ever be ERR for STATUS_CLIENT? if ( isNotification && ===================================== toolkit/mozapps/update/UpdateService.sys.mjs ===================================== @@ -22,7 +22,9 @@ ChromeUtils.defineESModuleGetters(lazy, { AddonManager: "resource://gre/modules/AddonManager.sys.mjs", AsyncShutdown: "resource://gre/modules/AsyncShutdown.sys.mjs", DeferredTask: "resource://gre/modules/DeferredTask.sys.mjs", - TorProviderBuilder: "resource://gre/modules/TorProviderBuilder.sys.mjs", + TorConnect: "resource://gre/modules/TorConnect.sys.mjs", + TorConnectStage: "resource://gre/modules/TorConnect.sys.mjs", + TorConnectTopics: "resource://gre/modules/TorConnect.sys.mjs", UpdateLog: "resource://gre/modules/UpdateLog.sys.mjs", UpdateUtils: "resource://gre/modules/UpdateUtils.sys.mjs", WindowsRegistry: "resource://gre/modules/WindowsRegistry.sys.mjs", @@ -372,15 +374,6 @@ export function testResetIsBackgroundTaskMode() { resetIsBackgroundTaskMode(); } -async function _shouldRegisterBootstrapObserver() { - try { - const provider = await lazy.TorProviderBuilder.build(); - return !provider.isBootstrapDone && provider.ownsTorDaemon; - } catch { - return false; - } -} - /** * Changes `nsIApplicationUpdateService.currentState` and causes * `nsIApplicationUpdateService.stateTransition` to resolve. @@ -2831,7 +2824,7 @@ export class UpdateService { case "network:offline-status-changed": await this._offlineStatusChanged(data); break; - case "torconnect:bootstrap-complete": + case lazy.TorConnectTopics.BootstrapComplete: this._bootstrapComplete(); break; case "quit-application": @@ -3447,7 +3440,36 @@ export class UpdateService { await this._attemptResume(); } + /** + * Whether we should wait for the Tor bootstrap event to try again because we + * are not yet bootstrapped. + * + * If the browser does not monitor the Tor connection state, this will return + * `false` since the event will never fire. + * + * @returns {boolean} - Whether we should wait for the bootstrap event. + */ + _shouldRegisterBootstrapObserver() { + return ( + lazy.TorConnect.enabled && + lazy.TorConnect.stageName !== lazy.TorConnectStage.Bootstrapped + ); + } + + /** + * Wait for the Tor connection to be bootstrapped before trying again. + */ _registerBootstrapObserver() { + // Double check that we haven't since become bootstrapped between the call + // to _shouldRegisterBootstrapObserver and _registerBootstrapObserver, which + // may be delayed. If so, we do not wait for the BootstrapComplete signal + // since it has already fired. + if (lazy.TorConnect.stageName === lazy.TorConnectStage.Bootstrapped) { + LOG("UpdateService:_registerBootstrapObserver - already bootstrapped"); + this._bootstrapComplete(); + return; + } + if (this._registeredBootstrapObserver) { LOG( "UpdateService:_registerBootstrapObserver - observer already registered" @@ -3460,13 +3482,22 @@ export class UpdateService { "to be complete, then forcing another check" ); - Services.obs.addObserver(this, "torconnect:bootstrap-complete"); + Services.obs.addObserver(this, lazy.TorConnectTopics.BootstrapComplete); this._registeredBootstrapObserver = true; } + /** + * Called when the Tor connection becomes bootstrapped. This will trigger a + * retry. + */ _bootstrapComplete() { - Services.obs.removeObserver(this, "torconnect:bootstrap-complete"); - this._registeredBootstrapObserver = false; + if (this._registeredBootstrapObserver) { + Services.obs.removeObserver( + this, + lazy.TorConnectTopics.BootstrapComplete + ); + this._registeredBootstrapObserver = false; + } LOG( "UpdateService:_bootstrapComplete - bootstrapping complete, forcing " + @@ -3511,7 +3542,7 @@ export class UpdateService { return; } else if ( update.errorCode === PROXY_SERVER_CONNECTION_REFUSED && - (await _shouldRegisterBootstrapObserver()) + this._shouldRegisterBootstrapObserver() ) { // Register boostrap observer to try again, but only when we own the // tor process. @@ -7105,7 +7136,7 @@ class Downloader { deleteActiveUpdate = false; } else if ( status === PROXY_SERVER_CONNECTION_REFUSED && - (await _shouldRegisterBootstrapObserver()) + this.updateService._shouldRegisterBootstrapObserver() ) { // Register a bootstrap observer to try again. // The bootstrap observer will continue the incremental download by View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/abb0be… -- View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/abb0be… 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
  • ...
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • ...
  • 2043
  • Older →

HyperKitty Powered by HyperKitty version 1.3.12.