tbb-commits
Threads by month
- ----- 2026 -----
- 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
- 1 participants
- 20570 discussions
[Git][tpo/applications/tor-browser][tor-browser-140.0a1-15.0-1] fixup! BB 43615: Add Gitlab Issue and Merge Request templates
by morgan (@morgan) 18 Jun '25
by morgan (@morgan) 18 Jun '25
18 Jun '25
morgan pushed to branch tor-browser-140.0a1-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
9e951916 by Morgan at 2025-06-18T10:00:26+00:00
fixup! BB 43615: Add Gitlab Issue and Merge Request templates
add fingerprinting issue template
- - - - -
2 changed files:
- + .gitlab/issue_templates/031 Fingerprinting.md
- .gitlab/issue_templates/Default.md
Changes:
=====================================
.gitlab/issue_templates/031 Fingerprinting.md
=====================================
@@ -0,0 +1,149 @@
+# 👣 Fingerprinting
+<!--
+Use this template to track a browser fingerprinting vector. Such vectors
+allow for stateless cross-site tracking (i.e. across somehow collaborating
+but otherwise unrelated 1st party domains like foo.com and bar.com)
+
+For the purposes of developing a fix, this template is meant to define all of the things
+we want to think about and analyze before implementing a fix. It's totally fine to leave
+parts of this template empty on initial report! The the issue description can be updated
+and edited as we learn things.
+
+This template is also meant to serve as documentation/explanation about how we think
+about fingerprinting vectors and minimising their utility.
+-->
+
+## Problem Statement
+<!--
+Please give an overview of the problem you think we should address.
+ e.g. system fonts (`font: caption`) might expose desktop
+ environment/distribution/language/customization because Firefox uses OS
+ settings.
+-->
+
+## Documentation
+<!--
+Please provide a links to the relevant standards or documentation for the affected web
+platform features. Additionally, please provide links to relevant academic research,
+upstream Bugzilla issues, etc (if available).
+-->
+
+## Repro Steps
+<!--
+Please provide any proof of concept which can help us under how this feature
+can be used for fingerprinting and that we can use as a test for our patches.
+-->
+
+## Analysis
+
+### Metric Distribution
+<!--
+- How many different possible buckets of values exist without fingerprinting
+mitigations?
+- How are users distributed between these buckets?
+- Do any group of users stand-out by default?
+- Do users in each of these buckets likely have different risk profiles?
+-->
+
+### Metric Stability
+<!--
+- How does the metric change during and between browsing sessions without mitigations?
+ e.g. Window size may be mostly stable during a browsing session
+ but may change between browsing sessions
+ e.g. User-Agent string is stable during a browsing session, but may change
+ between major browser updates
+-->
+
+## Mitigation Strategy
+<!--
+Outline (at least) one of the possible mitigation strategies for this metric
+(normalisation, randomisation, or disabling)
+-->
+
+### Normalisation
+<!--
+Describe a strategy whereby all users report the same value for the metric, or the pros
+and cons if there are multiple potential normalisation strategies.
+ e.g. Standardising reported WebGL constants such as maximum framebuffer size
+- After normalisation, would this metric be equivalent another normalised metric?
+ e.g. fonts are usually equivalent to the OS, which is already exposed.
+- Sometimes it is impossible to use the same value for all users, but reducing the
+ number of user buckets is still a win.
+
+✅ This is the preferred mitigation strategy.
+-->
+
+### Randomisation
+<!--
+Describe a strategy whereby users return randomised metrics
+ e.g. when enumerating webcams, choose a number of devices from a `[1; 3]` uniform
+ distribution
+- How did you choose this distribution and its parameters?
+- What strategies should we use to hide the randomization?
+ e.g. randomize the value only once per session and per first-party
+- Why is it not possible to use a normalized value, instead? Normalization is often
+ better than randomization because it is often easier to conceal
+
+A randomised metric should ideally be:
+- Different per first party domain
+ e.g. different websites measure a different value for the metric
+- Stable per session per first party domain
+ e.g. a website repeatedly measuring the metric will get back the same value
+ during the same browsing session
+- Different between sessions, regardless of first party domain
+ e.g. a website measuring a metric between browsing sessions will get back a different
+ value
+
+⚠️ We should only resort to randomisation if providing normalised values completely
+and utterly breaks web compatibility, usability, or accessibility.
+-->
+
+### Disabling
+<!--
+Describe a strategy whereby the fingerprintable metric is just outright disabled
+ e.g. Disabling WebAuthN feature entirely
+- Why is it not possible to spoof a (normalized) value instead? Disabling an API might
+ break some sites.
+ e.g. Rejecting the permission prompt request promise would be preferable to removing
+ or disabling the relevant APIs
+- Is this a temporary change?
+ e.g. necessary on the ESR version of Firefox we use for Tor Browser, but fixed in a
+ later version of Firefox.
+-->
+
+## Other Considerations
+
+### Usability and Accessibility
+<!--
+- Would the proposed mitigation make websites unusable for non-technical/human reasons?
+ e.g. Always requesting language as en-US makes websites usable for non English-reading
+ users
+- Would it make the browser unusable for some users?
+ e.g. Forcing overlay scrollbars would make websites unusable for some users with motor
+ issues
+- Do we need to provide a user-accessible 'escape-hatch' to allow users to opt-out of the
+ proposed mitigation?
+ e.g. Providing an option in about:preferences
+-->
+
+### Web Compatibility
+<!--
+Would the proposed mitigation break websites for technical reasons?
+ e.g. Disabling WebAuthN preventing YubiKey authentication
+-->
+
+### Plausibility
+<!--
+Would the proposed mitigation make the browser stand out as a potential bot or scraper or
+some other non-standard browser configuration?
+ e.g. Reporting only 2 CPU-cores is unlikely for modern PCs in the year 2025
+-->
+
+<!-- Do not edit beneath this line <3 -->
+
+---
+
+/confidential
+/label ~"Apps::Product::BaseBrowser"
+/label ~"Project 131"
+/label ~"Fingerprinting"
=====================================
.gitlab/issue_templates/Default.md
=====================================
@@ -11,6 +11,7 @@ Please select the appropriate issue template from the **Description** drop-down.
*NOTE*: the following issue types are intended for internal use
- 💣 **Test** - develop a test or update testing infrastructure
+- 👣 **Fingerprinting** - open a fingerprinting issue
- ✨ **Feature** - implement new features
- ⬅️ **Backport** - cherry-pick change to other release channels
- ⤵️ **Rebase - Alpha** - rebase alpha to latest Firefox ESR version
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/9e95191…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/9e95191…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser] Pushed new branch tor-browser-140.0a1-15.0-2
by Pier Angelo Vendrame (@pierov) 18 Jun '25
by Pier Angelo Vendrame (@pierov) 18 Jun '25
18 Jun '25
Pier Angelo Vendrame pushed new branch tor-browser-140.0a1-15.0-2 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser-build][main] Bug 41494: Update GeckoView build scripts for ESR140.
by Pier Angelo Vendrame (@pierov) 18 Jun '25
by Pier Angelo Vendrame (@pierov) 18 Jun '25
18 Jun '25
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
0e4bfa9d by Pier Angelo Vendrame at 2025-06-18T11:12:42+02:00
Bug 41494: Update GeckoView build scripts for ESR140.
- - - - -
11 changed files:
- projects/geckoview/build
- projects/geckoview/build_ac_fenix
- projects/geckoview/build_common
- projects/geckoview/config
- projects/geckoview/gradle-dependencies-list.txt
- projects/oss-licenses-plugin/build
- projects/oss-licenses-plugin/build-customization.diff
- projects/oss-licenses-plugin/config
- projects/oss-licenses-plugin/gradle-dependencies-list.txt
- + projects/oss-licenses-plugin/sort-dependencies-pr-268.patch
- − projects/oss-licenses-plugin/sort-dependencies.diff
Changes:
=====================================
projects/geckoview/build
=====================================
@@ -43,7 +43,7 @@ echo "Starting ./mach build $(date)"
# Copy the artifacts to the target directory
# Naming convention is the same as Mozilla uses for their artifacts
cp -a obj-*/dist/*.zip $artifactsdir/target.xpt_artifacts.zip
- cp -a obj-*/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/*/geckoview_example-withGeckoBinaries-*.apk $artifactsdir/geckoview_example.apk
+ cp -a obj-*/gradle/build/mobile/android/geckoview_example/outputs/apk/*/geckoview_example-*.apk $artifactsdir/geckoview_example.apk
./mach python -m mozbuild.action.test_archive common $artifactsdir/target.common.tests.tar.gz
[% END %]
=====================================
projects/geckoview/build_ac_fenix
=====================================
@@ -4,6 +4,8 @@
./mach package-multi-locale --locales en-US $supported_locales
[% END -%]
+objdir=$(cd obj-* && pwd)
+
echo "Building Android Components $(date)"
pushd mobile/android/android-components
gradle $GRADLE_FLAGS assembleGecko -x lint
@@ -40,7 +42,7 @@ gradle $GRADLE_FLAGS -PversionName="$version_name" "assemble$variant"
echo "Build finished, copying the APK(s) to the destination directory $(date)"
mkdir $distdir/[% project %]
-cp app/build/outputs/apk/fenix/$variant/*.apk $distdir/[% project %]
+cp $objdir/gradle/build/mobile/android/fenix/app/outputs/apk/fenix/$variant/*.apk $distdir/[% project %]
echo "Building non optimized $variant Fenix APK for testing"
gradle $GRADLE_FLAGS -PversionName="$version_name" -PdisableOptimization "assemble$variant"
@@ -51,8 +53,8 @@ gradle $GRADLE_FLAGS -PversionName="$version_name" -PtestBuildType="$variant" -P
echo "Test build finished, copying the APKs to the destination directory $(date)"
mkdir $distdir/[% project %]/tests
-cp app/build/outputs/apk/fenix/$variant/*.apk $distdir/[% project %]/tests
-cp app/build/outputs/apk/androidTest/fenix/$variant/*.apk $distdir/[% project %]/tests
+cp $objdir/gradle/build/mobile/android/fenix/app/outputs/apk/fenix/$variant/*.apk $distdir/[% project %]/tests
+cp $objdir/gradle/build/mobile/android/fenix/app/outputs/apk/androidTest/fenix/$variant/*.apk $distdir/[% project %]/tests
popd
=====================================
projects/geckoview/build_common
=====================================
@@ -48,4 +48,10 @@ export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system
# Create .mozbuild to avoid interactive prompt in configure
mkdir "$HOME/.mozbuild"
+# mach looks for bundletool and avd only in ~/.mozbuild. Maybe an upstream bug?
+mv $rootdir/[% c("input_files_by_name/bundletool") %] $HOME/.mozbuild/bundletool.jar
+mkdir $HOME/.mozbuild/android-device
+touch $HOME/.mozbuild/android-device/avd
+chmod +x $HOME/.mozbuild/android-device/avd
+
[% INCLUDE 'browser-localization' %]
=====================================
projects/geckoview/config
=====================================
@@ -37,9 +37,12 @@ var:
- openjdk-17-jdk-headless
# this should be updated when the list of gradle dependencies is changed
# see doc/how-to-create-gradle-dependencies-list.txt
- gradle_dependencies_version: 16
- gradle_version: 8.8
+ gradle_dependencies_version: 17
+ gradle_version: 8.13
glean_parser: 14.0.1
+ # python/mozboot/mozboot/android.py
+ bundletool_version: 1.18.1
+ bundletool_hash: 675786493983787ffa11550bdb7c0715679a44e1643f3ff980a529e9c822595c
variant: beta
has_l10n: '[% !c("var/testbuild") && !c("var/locales").empty %]'
l10n-changesets: '[% exec("git --no-pager show " _ c("git_hash") _ ":browser/locales/l10n-changesets.json", { exec_noco => 1 }) %]'
@@ -121,9 +124,12 @@ steps:
- project: oss-licenses-plugin
name: oss-licenses-plugin
pkg_type: build
+ - URL: 'https://github.com/google/bundletool/releases/download/[% c("var/bundletool_version") %]/bundletool-all-[% c("var/bundletool_version") %].jar'
+ name: bundletool
+ sha256sum: '[% c("var/bundletool_hash") %]'
list_toolchain_updates:
- git_hash: tor-browser-128.0b1-14.0-1
+ git_hash: tor-browser-140.0a1-15.0-1
tag_gpg_id: 0
input_files: []
container:
@@ -173,3 +179,6 @@ input_files:
pkg_type: tor-browser
enable: '[% c("var/android_single_arch") && c("var/has_l10n") %]'
- filename: rename-branding-strings.py
+ - URL: 'https://github.com/google/bundletool/releases/download/[% c("var/bundletool_version") %]/bundletool-all-[% c("var/bundletool_version") %].jar'
+ name: bundletool
+ sha256sum: '[% c("var/bundletool_hash") %]'
=====================================
projects/geckoview/gradle-dependencies-list.txt
=====================================
The diff for this file was not included because it is too large.
=====================================
projects/oss-licenses-plugin/build
=====================================
@@ -12,9 +12,10 @@ export PATH=/var/tmp/dist/gradle/bin:$PATH
gradle_repo=/var/tmp/dist/gradle-dependencies
mv $rootdir/[% c('input_files_by_name/gradle-dependencies') %] $gradle_repo
cp -rl $gradle_repo/m2/* $gradle_repo || true
+cp -rl $gradle_repo/dl/android/maven2/* $gradle_repo || true
cd $builddir
-patch -p2 < $rootdir/sort-dependencies.diff
+patch -p2 < $rootdir/sort-dependencies-pr-268.patch
patch -p2 < $rootdir/build-customization.diff
gradle --no-daemon --offline -Dmaven.repo.local=$gradle_repo assemble publish
cd build/repo
=====================================
projects/oss-licenses-plugin/build-customization.diff
=====================================
@@ -1,17 +1,17 @@
diff --git a/oss-licenses-plugin/build.gradle b/oss-licenses-plugin/build.gradle
-index 2a7dd74..f9368e1 100644
+index 863625c..65ad088 100644
--- a/oss-licenses-plugin/build.gradle
+++ b/oss-licenses-plugin/build.gradle
-@@ -15,34 +15,25 @@ dependencies {
+@@ -20,34 +20,25 @@ dependencies {
group = 'com.google.android.gms'
- version = '0.10.4'
+ version = '0.10.6'
-apply plugin: 'maven'
+apply plugin: 'maven-publish'
repositories {
google()
- jcenter()
+ mavenCentral()
+ mavenLocal()
}
=====================================
projects/oss-licenses-plugin/config
=====================================
@@ -1,12 +1,12 @@
-version: 0.10.4
+version: 0.10.6
filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]'
git_url: https://github.com/google/play-services-plugins.git
-git_hash: c9ed0e48abe2c55dd67f2c2224988d1d690cecc9 # oss-licenses-plugin-v0.10.4
+git_hash: 45ec9c690672f0ff6f86e6221ef64e204b10a228 # oss-licenses-plugin-v0.10.6
var:
# This should be updated when the list of gradle dependencies is changed.
- gradle_dependencies_version: 1
- gradle_version: 8.8
+ gradle_dependencies_version: 2
+ gradle_version: 8.13
container:
use_container: 1
@@ -18,5 +18,5 @@ input_files:
- filename: 'gradle-dependencies-[% c("var/gradle_dependencies_version") %]'
name: gradle-dependencies
exec: '[% INCLUDE "fetch-gradle-dependencies" %]'
+ - filename: sort-dependencies-pr-268.patch
- filename: build-customization.diff
- - filename: sort-dependencies.diff
=====================================
projects/oss-licenses-plugin/gradle-dependencies-list.txt
=====================================
@@ -1,207 +1,37 @@
# On how to update dependencies see doc/how-to-create-gradle-dependencies-list.txt
# Don't forget to update var/gradle_dependencies_version when modifying this file
sha256sum | url
-408d8ed48da2b7b2c8f7216906c1b76a1ecdb9c165cdb52c9eeb32af0cc67f0f | https://maven.google.com/androidx/databinding/databinding-common/3.5.1/data…
-008e3641392787bd3f6e5fe3a56457379cbba8be62ae5a91ba982b7e534a2b37 | https://maven.google.com/androidx/databinding/databinding-common/3.5.1/data…
-b6235dd4ff7457f517e30479fe050a2ae27a2b3ef8ae33d44d9a3d2197911779 | https://maven.google.com/androidx/databinding/databinding-compiler-common/3…
-4a3bfe5d22a4df2490f6180ef1e22a2ea189f42676532d6d7d6ece9b57a2c506 | https://maven.google.com/androidx/databinding/databinding-compiler-common/3…
-4b698a77c578215a7f746e93422757a8e4d6ee9c8a29fdd9f994712f723604ed | https://maven.google.com/com/android/databinding/baseLibrary/3.5.1/baseLibr…
-6659dd657846c519b12ad701815f2009f8d9991c798ca3a5a628e163987aecab | https://maven.google.com/com/android/databinding/baseLibrary/3.5.1/baseLibr…
-9e9618ed7f1d24df2a4365e1719d630d8ac9c2dd31bea3343157a4ae5efa7fb9 | https://maven.google.com/com/android/tools/analytics-library/crash/26.5.1/c…
-215d75a04ddcfa897e12f3c4d204f24e94214385f1f11ddcea4ddcd56ddb5243 | https://maven.google.com/com/android/tools/analytics-library/crash/26.5.1/c…
-8dde1130725461fe827f2a343d353f2b51e8870661fc860d7d5ebddb097ead4e | https://maven.google.com/com/android/tools/analytics-library/protos/26.5.1/…
-7b042861662b26a41e8f71a093cffc78dd8eb746e5ab98a645e1dcf49612bd0a | https://maven.google.com/com/android/tools/analytics-library/protos/26.5.1/…
-ccc2f3b00ec17b11401610ba68553544fc8fc517120e84439ac6eb86b875e18d | https://maven.google.com/com/android/tools/analytics-library/shared/26.5.1/…
-727842ddf56dbf158091a4f113005ec0e2d04ae2c066d7ede9b65ce6a9131aa8 | https://maven.google.com/com/android/tools/analytics-library/shared/26.5.1/…
-3a76984c0fe2e847ca7a8b35b4780ef0447a9d1666946cb8e60466318e0ab5ae | https://maven.google.com/com/android/tools/analytics-library/tracker/26.5.1…
-6327d446e6c59adacad78265fc61ac09ddcb751fe4e62b3697dc9d6534c0c451 | https://maven.google.com/com/android/tools/analytics-library/tracker/26.5.1…
-2c43c82f8c59d8f7a61e3239e1a2dc9f69dc342ec09af9b7c9f69b25337c0b6e | https://maven.google.com/com/android/tools/annotations/26.5.1/annotations-2…
-3caa859d7b198f9f429f50874921f5e05f105112400eed666d5e56a0e8417e09 | https://maven.google.com/com/android/tools/annotations/26.5.1/annotations-2…
-fac0435e08898f89eeeb9ca236bea707155ff816c12205ced285ad53604133ca | https://maven.google.com/com/android/tools/build/aapt2-proto/0.4.0/aapt2-pr…
-a24bdd4e8e374fdcd8cef8d77ea723f147ccd0f25dc6de4fbe290039be904339 | https://maven.google.com/com/android/tools/build/aapt2-proto/0.4.0/aapt2-pr…
-1fd33e7f009a2a0da766cfeec4211a09f548034b015c289a66d75dd8a9302f4a | https://maven.google.com/com/android/tools/build/apksig/3.5.1/apksig-3.5.1.…
-4c9f03d9fbc5accffafd56b0ae677d41ea0a395980a2cc052a7bcefccb2483a9 | https://maven.google.com/com/android/tools/build/apksig/3.5.1/apksig-3.5.1.…
-9f330167cbe973b7db407692f74f4f6453b7ffa5f2048934b06280c2ceee60fa | https://maven.google.com/com/android/tools/build/apkzlib/3.5.1/apkzlib-3.5.…
-f299c423220ae47404b9013e54caec84ea64f45f69885e4dc0e2e66b7095e33e | https://maven.google.com/com/android/tools/build/apkzlib/3.5.1/apkzlib-3.5.…
-39ea3c82b76b6e0c9f9fa88d93e0edc1dd4a0f1dfae0ef6fbf2d451da47e5450 | https://maven.google.com/com/android/tools/build/builder-model/3.5.1/builde…
-466e5005cf0a7c7bad8991b14c70b04457b77d28195ec04ec2baf6495e88f4a2 | https://maven.google.com/com/android/tools/build/builder-model/3.5.1/builde…
-a1b59305584cbcaa078fdc9cfb80871012755b822dd32e8da19add6f7bbcb762 | https://maven.google.com/com/android/tools/build/builder-test-api/3.5.1/bui…
-704e2ad557e5659b98bb8955fbab20977cddb09c06e72825cf2516635424b8cb | https://maven.google.com/com/android/tools/build/builder-test-api/3.5.1/bui…
-e3a8d382434c5f60990730c4719fc814e85a898a33a1e96c1df8d627d3c6eea6 | https://maven.google.com/com/android/tools/build/builder/3.5.1/builder-3.5.…
-aa0092dd227856f6a9c42df1f6ae14ba8a5bde16ea77d760e48c25e575d31668 | https://maven.google.com/com/android/tools/build/builder/3.5.1/builder-3.5.…
-50c44557ca75b068e364ac35a648b81eeba7639ab5eb04036e390c727ad2fa3d | https://maven.google.com/com/android/tools/build/bundletool/0.9.0/bundletoo…
-124e124227803689b71da7440f0dbdff71cbb4c661a18e0f4e2e0d3a80d367c2 | https://maven.google.com/com/android/tools/build/bundletool/0.9.0/bundletoo…
-be9b41859bace11998f66b04ed944f87e413f3ad6da3c4665587699da125addc | https://maven.google.com/com/android/tools/build/gradle-api/3.5.1/gradle-ap…
-e977170f2bf4fdf335d924f8bf94eea54c54422f74f8915fc8d592dc9a226eb8 | https://maven.google.com/com/android/tools/build/gradle-api/3.5.1/gradle-ap…
-fe188188002bbb2e51c7db6da1ed03fc82af8f3be1a33991d38381837bc6708a | https://maven.google.com/com/android/tools/build/gradle/3.5.1/gradle-3.5.1.…
-b4a5b3db612b70ad8ba1b22bc469444d946bcd60e399f97ee6e498d195239c84 | https://maven.google.com/com/android/tools/build/gradle/3.5.1/gradle-3.5.1.…
-c9f8b016144cfb31c5aee92d47f34de23289167cac5e8ef68365b2dd05766f11 | https://maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0…
-db025ad1bbc6896edf0f67cda1222ba9b7ec9a0187df7f4fd0a318475c758e4e | https://maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0…
-1dd481e7606ccb30868908d9ae80f27d1c5ba882f792532bd91ed731c54f4efb | https://maven.google.com/com/android/tools/build/jetifier/jetifier-processo…
-4973a6c6d7f89297a1cfea56c623cea72b3db3b4a49992afa00dd77ac052b89f | https://maven.google.com/com/android/tools/build/jetifier/jetifier-processo…
-dcad9ecb967251f4d750f55a4204a2b400e8fbfe5cb930a1d0d5dbe10ae8bdfc | https://maven.google.com/com/android/tools/build/manifest-merger/26.5.1/man…
-0dfcac2f9fa87c1742945875ef1e6f9fbade2149426502323c40eb01c05a7e36 | https://maven.google.com/com/android/tools/build/manifest-merger/26.5.1/man…
-4de4a3d05e1c534c2db9e4588bf34082bb2bd232d8abb9727c430290ce225740 | https://maven.google.com/com/android/tools/build/transform-api/2.0.0-deprec…
-7c62f3856e8abca1d79257925f26c12668693f5d95904056bbac88605cfd8575 | https://maven.google.com/com/android/tools/build/transform-api/2.0.0-deprec…
-eccfa54486ed54c4e3123cc42195d023bd0dd21bcd2f0e4868e8c6fc70f8ef6b | https://maven.google.com/com/android/tools/common/26.5.1/common-26.5.1.jar
-4492eb509dc784ca5e1600a2b0505ad1468bed4d116220fca67f34b49ac18ffb | https://maven.google.com/com/android/tools/common/26.5.1/common-26.5.1.pom
-b081aef2a4ed3f4d47cae4cdb128469735f25a114e026d37123bf9ffdec742a8 | https://maven.google.com/com/android/tools/ddms/ddmlib/26.5.1/ddmlib-26.5.1…
-a6e4693d05779c25cbfbbf4e67f96150c4de3d398ae3ed6a38f786971eb89634 | https://maven.google.com/com/android/tools/ddms/ddmlib/26.5.1/ddmlib-26.5.1…
-46f93ad498b4756e7d867d2fe38c38890a80e7407a4ae459e4a8c8d5c5aeacfe | https://maven.google.com/com/android/tools/dvlib/26.5.1/dvlib-26.5.1.jar
-1d5f88a4eb1c76901bc7b19af2311418a3f259d0f68756b058df850b1e8f913f | https://maven.google.com/com/android/tools/dvlib/26.5.1/dvlib-26.5.1.pom
-88732f11396c427273e515d23042e35633f4fe4295528a99b866aa2adf0efd9c | https://maven.google.com/com/android/tools/layoutlib/layoutlib-api/26.5.1/l…
-63832aa426428edb1a9ad7b1fc06c8ecf8f38b98041c13bfe433ac46688e5ed8 | https://maven.google.com/com/android/tools/layoutlib/layoutlib-api/26.5.1/l…
-82453fd98a8394cc84ed995c04d2cd744abd1d6589403427ba7eef53115406f3 | https://maven.google.com/com/android/tools/lint/lint-gradle-api/26.5.1/lint…
-2ddefa31501b320b366a0d18ba169118be7073d04c9337dd77bdc4ebd4ced959 | https://maven.google.com/com/android/tools/lint/lint-gradle-api/26.5.1/lint…
-2b3ee791aa4c3e8ce60498c161a27ca7228816fc630eed4d9f25f2f36a106dce | https://maven.google.com/com/android/tools/repository/26.5.1/repository-26.…
-8312471ec5165d599404e2225157c5639bdd9ad5c6980f79b1c1c4b517ff93b3 | https://maven.google.com/com/android/tools/repository/26.5.1/repository-26.…
-365f749676c3574676fd465177c8a492f340816db2b520d6ed114d3b6e77bea7 | https://maven.google.com/com/android/tools/sdk-common/26.5.1/sdk-common-26.…
-33b0649ae6e3dd95340123c462f6ef32992ee858e6e132f45bb7dec332627d59 | https://maven.google.com/com/android/tools/sdk-common/26.5.1/sdk-common-26.…
-007da104afb27c8c682a1628023fe9ec438249c8d15ef0fd6624c5bb8e23b696 | https://maven.google.com/com/android/tools/sdklib/26.5.1/sdklib-26.5.1.jar
-3f5ee952ea6a07767688a464c545354fbbce296419973397e65280142914b2a4 | https://maven.google.com/com/android/tools/sdklib/26.5.1/sdklib-26.5.1.pom
-feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a | https://plugins.gradle.org/m2/com/google/code/findbugs/jsr305/1.3.9/jsr305-…
-766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7 | https://plugins.gradle.org/m2/com/google/code/findbugs/jsr305/3.0.2/jsr305-…
-19889dbdf1b254b2601a5ee645b8147a974644882297684c798afe5d63d78dfe | https://plugins.gradle.org/m2/com/google/code/findbugs/jsr305/3.0.2/jsr305-…
-8f1fec72b91a71ea39ec39f5f778c4d1124b6b097c6d55b3a50b554a52237b27 | https://plugins.gradle.org/m2/com/google/code/gson/gson-parent/2.8.5/gson-p…
-233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81 | https://plugins.gradle.org/m2/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar
-b8308557a7fccc92d9fe7c8cd0599258b361285d2ecde7689eda98843255a092 | https://plugins.gradle.org/m2/com/google/code/gson/gson/2.8.5/gson-2.8.5.pom
-6ebd22ca1b9d8ec06d41de8d64e0596981d9607b42035f9ed374f9de271a481a | https://plugins.gradle.org/m2/com/google/errorprone/error_prone_annotations…
-5e0258ea1ba4e51a133742680bc22448f7ab214be4073e8619f645ef1be42dd5 | https://plugins.gradle.org/m2/com/google/errorprone/error_prone_annotations…
-c460902ddf5ece68832c6b271ce52a0928b05cf3a6ac81a8f548c73cbd541138 | https://plugins.gradle.org/m2/com/google/errorprone/error_prone_parent/2.2.…
-cd6db17a11a31ede794ccbd1df0e4d9750f640234731f21cff885a9997277e81 | https://plugins.gradle.org/m2/com/google/google/1/google-1.pom
-a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26 | https://plugins.gradle.org/m2/com/google/guava/failureaccess/1.0.1/failurea…
-e96042ce78fecba0da2be964522947c87b40a291b5fd3cd672a434924103c4b9 | https://plugins.gradle.org/m2/com/google/guava/failureaccess/1.0.1/failurea…
-f8698ab46ca996ce889c1afc8ca4f25eb8ac6b034dc898d4583742360016cc04 | https://plugins.gradle.org/m2/com/google/guava/guava-parent/26.0-android/gu…
-317e88291262e0cf2805e956c18850f1d4565c85c2e1112f5d9d08ab1732e696 | https://plugins.gradle.org/m2/com/google/guava/guava-parent/27.0.1-jre/guav…
-e1c814fd04492a27c38e0317eabeaa1b3e950ec8010239e400fe90ad6c9107b4 | https://plugins.gradle.org/m2/com/google/guava/guava/27.0.1-jre/guava-27.0.…
-6a8dd041f23a6bb14a86e440fccb993537b62271357a0dac0a3cb0ff39158f36 | https://plugins.gradle.org/m2/com/google/guava/guava/27.0.1-jre/guava-27.0.…
-b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99 | https://plugins.gradle.org/m2/com/google/guava/listenablefuture/9999.0-empt…
-18d4b1db26153d4e55079ce1f76bb1fe05cdb862ef9954a88cbcc4ff38b8679b | https://plugins.gradle.org/m2/com/google/guava/listenablefuture/9999.0-empt…
-2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6 | https://plugins.gradle.org/m2/com/google/j2objc/j2objc-annotations/1.1/j2ob…
-f0c98c571e93a7cb4dd18df0fa308f0963e7a0620ac2d4244e61e709d03ad6be | https://plugins.gradle.org/m2/com/google/j2objc/j2objc-annotations/1.1/j2ob…
-c71555751e57e0ef912870e8ac9625ae782502a6a5b9c19ccf83b2a97d8b26bd | https://plugins.gradle.org/m2/com/google/jimfs/jimfs-parent/1.1/jimfs-paren…
-c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd | https://plugins.gradle.org/m2/com/google/jimfs/jimfs/1.1/jimfs-1.1.jar
-efa86e5cd922f17b472fdfcae57234d8d4ac3e148b6250737dfce454af7a7a44 | https://plugins.gradle.org/m2/com/google/jimfs/jimfs/1.1/jimfs-1.1.pom
-4189e0be5ab15cf2330f70b24fbdc75ca37514f188388fce8580ce16a9a68052 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-java-util/3.4.0/…
-89c43073e7eaa0eaba72a4a36ae1b6bfdfe5d81bb9d0e156aee05e4a72de3cb8 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-java-util/3.4.0/…
-dce7e66b32456a1b1198da0caff3a8acb71548658391e798c79369241e6490a4 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-java/3.4.0/proto…
-83f17ba86c5fa1a15a3a3c8030d4ce42ef21c1d39b65db6cc004a8eeb2c59406 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-java/3.4.0/proto…
-24909c552842c0eb7a4c769d631a43cbef5a9a10c1640f2bdbd1ea149c573a47 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-parent/3.4.0/pro…
-2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439 | https://plugins.gradle.org/m2/com/googlecode/json-simple/json-simple/1.1/js…
-47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab | https://plugins.gradle.org/m2/com/googlecode/json-simple/json-simple/1.1/js…
-757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76 | https://plugins.gradle.org/m2/com/googlecode/juniversalchardet/juniversalch…
-7846399b35c7cd642a9b3a000c3e2d62d04eb37a4547b6933cc8b18bcc2f086b | https://plugins.gradle.org/m2/com/googlecode/juniversalchardet/juniversalch…
-8e108c92027bb428196f10fa11cffbe589f7648a6af2016d652279385fdfd789 | https://plugins.gradle.org/m2/com/squareup/javapoet/1.8.0/javapoet-1.8.0.jar
-b3760f40f19e735b2cd418f7656335d926d1d9413e10982a1c9695b64edbb647 | https://plugins.gradle.org/m2/com/squareup/javapoet/1.8.0/javapoet-1.8.0.pom
+33c839e4236eabde3896c154d120d651e72064f393e456297c92041d00cc058e | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/7.1.…
+67a8f20626121a8e4f48fc63a392c0459173a9992eb35cc9c9c3ec82b882862c | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/7.1.…
+8529eca8d75767050751f7674338548f591a234333179d9b5ad66c6feaf00d42 | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/7.1.…
+0e46a02577de7cbad380679e565f73d537205e0c38c2894bfe122ad1ee79e516 | https://dl.google.com/dl/android/maven2/com/android/tools/build/apkzlib/7.1…
+c2d09468c92bd306272ed6f2c7b5ac2507ede7222e4b677a5ba887e06e89c5bb | https://dl.google.com/dl/android/maven2/com/android/tools/build/apkzlib/7.1…
+fa9f433e60e4f330e763f4f1920f8bda5d1f835d17ac1bd9b92d2a139a4a8269 | https://dl.google.com/dl/android/maven2/com/android/tools/build/apkzlib/7.1…
+5e14677ed7c265731a4cb4ec99e1f352daaafb596f21f88e367220b3554b1a25 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
+76ade53f054bb250e93cbd29d82e1c9736ea64663d8faebef0f7deb3f1a08c3c | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
+4f430764d6dd337aeb94b5b6a307398831c0eaf276a3f639ecdb583819483d08 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
+6d43939f77996074552a72422924bc3644da6035a936d2c7d1326abe7ae1443e | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/7.1…
+c90102982348647fc58993b00ed675a1f92b50dc9c38563fd594b8cff3c67254 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/7.1…
+29a092c1ee48d09f36870f7b95688d05eff6784baac752e9b91ea1acfb1c358e | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/7.1…
+9c5ed0e13a6e8b426341cd32dcab2dd5b54c52e701a135b4227ccfe8ef3266bf | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
+d710594e89c561be3e7aba56b8e5a5690ebbdf82ad6d07019c2e271f39669ea8 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
+4545a1e6e1992613ee49df0d1395be89d625333adcf2db206af652586fbde26c | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
+621329051b4261fd390b33607523e123962ad3ad6b91929f37b23187caaa9309 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/7.1.…
+05ee8a6fc8b68e140133c4d9547e4790661737359c0d27b142b6fbc44bbe2a02 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/7.1.…
+91db6b029dc8b00570c77418f7a28839517bc9cb5a14ab562885b4bcf61efbd5 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/7.1.…
+cb36c736ed2ac922e6655ef5c56c34068e63b7d9bd749920b67592859c1e4d81 | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
+5b3b27f624a969fd35d3aa7aef91499862a445c13aece4233b1a103a42bc8be3 | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
+877dddbbb9e3f045bd835e21c59795cdad1332600354b773a886d25f2544d9c9 | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
+f35a8af6babede30bd48bf98d02d2499725f0902d56aeabe778da256b76d0768 | https://dl.google.com/dl/android/maven2/com/android/zipflinger/7.1.0/zipfli…
+88f6f0603aa947fa206e40ea03ea7e019a58eddb3a5a8f19cdab9849b4ad26e0 | https://dl.google.com/dl/android/maven2/com/android/zipflinger/7.1.0/zipfli…
+2c1c70bc240ab779ab4c07d19390c623d05e759c80653fbcdef2eeac299f00ab | https://dl.google.com/dl/android/maven2/com/android/zipflinger/7.1.0/zipfli…
+96623d7afc374800cfdc4eb1e49efdb1b17d762fbe9c7de0e46980de14473170 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-bom/3.19.1/proto…
+24f7d0d91797ed230a6d3da93cd80590a4c3aa9a27249f6025b5c6da078edde7 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-java/3.19.1/prot…
+5de4666f7f6b003d982f48f18c8e22facef6707365a74e20df7cbad98c931dd7 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-java/3.19.1/prot…
+83d413b2a79d6357d2ca78fd623143424e8f6ecc72cfa83bf2ae2ae258a93a44 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-parent/3.19.1/pr…
fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0 | https://plugins.gradle.org/m2/com/squareup/javawriter/2.5.0/javawriter-2.5.…
e1abd7f1116cf5e0c59947693e2189208ec94296b2a3394c959e3511d399a7b0 | https://plugins.gradle.org/m2/com/squareup/javawriter/2.5.0/javawriter-2.5.…
-1d8518e3ac7532a104e4f7be77def37c982e530723c6bdb3d67708cce2b0c2c4 | https://plugins.gradle.org/m2/com/sun/activation/all/1.2.0/all-1.2.0.pom
-993302b16cd7056f21e779cc577d175a810bb4900ef73cd8fbf2b50f928ba9ce | https://plugins.gradle.org/m2/com/sun/activation/javax.activation/1.2.0/jav…
-f879b6e945854c6900b0dbee1c8384d7ab3de7e157fd7ac84937405c416d2a5e | https://plugins.gradle.org/m2/com/sun/activation/javax.activation/1.2.0/jav…
-c33e67a0807095f02a0e2da139412dd7c4f9cc1a4c054b3e434f96831ba950f4 | https://plugins.gradle.org/m2/com/sun/istack/istack-commons-runtime/2.21/is…
-ebe7137b5fbfd050545f9a7f3f339ae55beb0b53755071b4fd62aa024c626d1c | https://plugins.gradle.org/m2/com/sun/istack/istack-commons-runtime/2.21/is…
-c3071277f89b162982606b4e65c92077212efb6cbf1bdc365c51bd0b57ac818c | https://plugins.gradle.org/m2/com/sun/istack/istack-commons/2.21/istack-com…
-b25e0693de21cb92b039a2e4608f396590fb8773108f10d6dc9f1465f03b5be9 | https://plugins.gradle.org/m2/com/sun/xml/bind/jaxb-bom-ext/2.2.11/jaxb-bom…
-b5301b711c01547e571b615f9a0832ee525d34a4ce3372f53907a87cf20b0480 | https://plugins.gradle.org/m2/com/sun/xml/bind/mvn/jaxb-parent/2.2.11/jaxb-…
-21918cb8e4eda67f24251e909a5d81672201d93604c4ffbf33522ad836a58e90 | https://plugins.gradle.org/m2/com/sun/xml/bind/mvn/jaxb-runtime-parent/2.2.…
-9a398c699a5d3f3b56f1056c68890ede25d94a12d98eabc2a473733e6ab2362c | https://plugins.gradle.org/m2/com/sun/xml/bind/mvn/jaxb-txw-parent/2.2.11/j…
-27a77db909f3c2833c0b1a37c55af1db06045118ad2eed96ce567b6632bce038 | https://plugins.gradle.org/m2/com/sun/xml/fastinfoset/FastInfoset/1.2.13/Fa…
-b7505e0ecf7d495b4daa3e6569f71611d1a789dc531cbd92a2025922ff2655d3 | https://plugins.gradle.org/m2/com/sun/xml/fastinfoset/FastInfoset/1.2.13/Fa…
-fd0857899f1067e0287c2ffd91e38f967a26bd405b83a34650c2742cee9fc261 | https://plugins.gradle.org/m2/com/sun/xml/fastinfoset/fastinfoset-project/1…
-4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569 | https://plugins.gradle.org/m2/commons-codec/commons-codec/1.10/commons-code…
-bdb8db7012d112a6e3ea8fdb7c510b300d99eff0819d27dddba9c43397ea4cfb | https://plugins.gradle.org/m2/commons-codec/commons-codec/1.10/commons-code…
-cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581 | https://plugins.gradle.org/m2/commons-io/commons-io/2.4/commons-io-2.4.jar
-b2b5dd46cf998fa626eb6f8a1c114f6167c8d392694164e62533e5898e9b31f2 | https://plugins.gradle.org/m2/commons-io/commons-io/2.4/commons-io-2.4.pom
-daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636 | https://plugins.gradle.org/m2/commons-logging/commons-logging/1.2/commons-l…
-c91ab5aa570d86f6fd07cc158ec6bc2c50080402972ee9179fe24100739fbb20 | https://plugins.gradle.org/m2/commons-logging/commons-logging/1.2/commons-l…
-74fa208043740642f7e6eb09faba15965218ad2f50ce3020efb100136e4b591c | https://plugins.gradle.org/m2/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.jar
-953b116521a73575eee990e3f2c36a892fb088bb2d9a3027c82193cb7a013ef7 | https://plugins.gradle.org/m2/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.pom
-91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff | https://plugins.gradle.org/m2/javax/inject/javax.inject/1/javax.inject-1.jar
-943e12b100627804638fa285805a0ab788a680266531e650921ebfe4621a8bfa | https://plugins.gradle.org/m2/javax/inject/javax.inject/1/javax.inject-1.pom
-b5e60cd8b7b5ff01ce4a74c5dd008f4fbd14ced3495d0b47b85cfedc182211f2 | https://plugins.gradle.org/m2/javax/xml/bind/jaxb-api/2.2.12-b140109.1041/j…
-2092a7d8d9bc5698c59b094bdea46622915c48c83ae66d5b5ad549c7bf16155b | https://plugins.gradle.org/m2/javax/xml/bind/jaxb-api/2.2.12-b140109.1041/j…
-281440811268e65d9e266b3cc898297e214e04f09740d0386ceeb4a8923d63bf | https://plugins.gradle.org/m2/net/java/jvnet-parent/1/jvnet-parent-1.pom
-30f5789efa39ddbf96095aada3fc1260c4561faf2f714686717cb2dc5049475a | https://plugins.gradle.org/m2/net/java/jvnet-parent/3/jvnet-parent-3.pom
-471395735549495297c8ff939b9a32e08b91302020ff773586d27e497abb8fbb | https://plugins.gradle.org/m2/net/java/jvnet-parent/4/jvnet-parent-4.pom
-26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5 | https://plugins.gradle.org/m2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simpl…
-7af7e2d8b24b4798f04c2b7da24c9fbd1b7557b4e017c2054481565916079092 | https://plugins.gradle.org/m2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simpl…
-f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2 | https://plugins.gradle.org/m2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar
-31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685 | https://plugins.gradle.org/m2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.pom
-75bc89695fa66e75374ecda439b802406f0ab1d826dd386eed0a23b1f0a9d264 | https://plugins.gradle.org/m2/net/sf/proguard/proguard-base/6.0.3/proguard-…
-2a823d79f2675582a988d539466d1b175e939782efbe0f6e61f06cb165ed4907 | https://plugins.gradle.org/m2/net/sf/proguard/proguard-base/6.0.3/proguard-…
-cc12b1168e521491dd0e687cfebec11a4af874b22af70e10cf2a05b47ca00c8f | https://plugins.gradle.org/m2/net/sf/proguard/proguard-gradle/6.0.3/proguar…
-5a5c7317d68ce80d1d40c9d8bd4e38814d42d1b16c265146e333634833a35a57 | https://plugins.gradle.org/m2/net/sf/proguard/proguard-gradle/6.0.3/proguar…
-d87266bfd2312c3b036c4ac709310afa35c448ceb18027c3b87a33d03c6de0a0 | https://plugins.gradle.org/m2/net/sf/proguard/proguard-parent/6.0.3/proguar…
-401877d5e70ad599e9b6cff18434ea0332f637b51f8ec68352646c836f9bb2a4 | https://plugins.gradle.org/m2/org/antlr/antlr4-master/4.5.3/antlr4-master-4…
-a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4 | https://plugins.gradle.org/m2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar
-8a4e4b32eedaa72976a757e12cf1dfe742725db0b7311bf176dd937ba4236384 | https://plugins.gradle.org/m2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.pom
-ff513db0361fd41237bef4784968bc15aae478d4ec0a9496f811072ccaf3841d | https://plugins.gradle.org/m2/org/apache/apache/13/apache-13.pom
-36c2f2f979ac67b450c0cb480e4e9baf6b40f3a681f22ba9692287d1139ad494 | https://plugins.gradle.org/m2/org/apache/apache/15/apache-15.pom
-9f85ff2fd7d6cb3097aa47fb419ee7f0ebe869109f98aba9f4eca3f49e74a40e | https://plugins.gradle.org/m2/org/apache/apache/16/apache-16.pom
-7831307285fd475bbc36b20ae38e7882f11c3153b1d5930f852d44eda8f33c17 | https://plugins.gradle.org/m2/org/apache/apache/18/apache-18.pom
-4946e60a547c8eda69f3bc23c5b6f0dadcf8469ea49b1d1da7de34aecfcf18dd | https://plugins.gradle.org/m2/org/apache/apache/9/apache-9.pom
-2c1542faf343185b7cab9c3d55c8ae5471d6d095d3887a4adefdbdf2984dc0b6 | https://plugins.gradle.org/m2/org/apache/commons/commons-compress/1.12/comm…
-b787d574c851505e76212968b9ae1641ea79804aef7f5a2cee2a01cd4055213a | https://plugins.gradle.org/m2/org/apache/commons/commons-compress/1.12/comm…
-467ae650442e876867379094e7518dfdd67d22c5352ebd39808c84259e9790ba | https://plugins.gradle.org/m2/org/apache/commons/commons-parent/25/commons-…
-3a2e69d06d641d1f3b293126dc9e2e4ea6563bf8c36c87e0ab6fa4292d04b79c | https://plugins.gradle.org/m2/org/apache/commons/commons-parent/34/commons-…
-7098a1ab8336ecd4c9dc21cbbcac869f82c66f64b8ac4f7988d41b4fcb44e49a | https://plugins.gradle.org/m2/org/apache/commons/commons-parent/35/commons-…
-87cd27e1a02a5c3eb6d85059ce98696bb1b44c2b8b650f0567c86df60fa61da7 | https://plugins.gradle.org/m2/org/apache/commons/commons-parent/39/commons-…
-c03f813195e7a80e3608d0ddd8da80b21696a4c92a6a2298865bf149071551c7 | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpclient/4.5.6/ht…
-7efc1241e73e7fbb268bfd33242d11ebd3ca07061d7d85f2962dc32a0f0b8855 | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpclient/4.5.6/ht…
-b042b41f2391edb00d35f7f4e509aed2123648c1d246ce58d0f7b905c9fe1f73 | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpcomponents-clie…
-61e9427d4be326c307a7f16ba828d1cb3b14713c9b04fc8ba992a58f376c3136 | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpcomponents-core…
-caaf967d94afb21753f36082c6086206bd1f48825ff596932cceba72b65d39fa | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpcomponents-pare…
-78ba1096561957db1b55200a159b648876430342d15d461277e62360da19f6fd | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpcore/4.4.10/htt…
-c5c12066df2b3b88a89a2c8602b81ea9a61627e976e5129eea1899ebbaea392b | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpcore/4.4.10/htt…
-0b2b1102c18d3c7e05a77214b9b7501a6f6056174ae5604e0e256776eda7553e | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpmime/4.5.6/http…
-dfbfd6ffe2a784ca9817c46365aa7f8a578320b805bde39d6f55a0b09d8aa8ca | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpmime/4.5.6/http…
-7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca | https://plugins.gradle.org/m2/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-j…
-321668fc474a73140eb9cc73c779f1ebb9f60948aade3beddee082ecefcf0259 | https://plugins.gradle.org/m2/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-j…
-963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349 | https://plugins.gradle.org/m2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-j…
-8fdc3336e7b01873193ba9c48b87de7d788dc0954d1eb45c322492627a4b5c6e | https://plugins.gradle.org/m2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-j…
-64b02691c8b9d4e7700f8ee2e742dce7ea2c6e81e662b7522c9ee3bf568c040a | https://plugins.gradle.org/m2/org/checkerframework/checker-qual/2.5.2/check…
-dc4cd438a36462d013c2338c8e206d102a322a00f33729e8955ee219859c9ede | https://plugins.gradle.org/m2/org/checkerframework/checker-qual/2.5.2/check…
-92654f493ecfec52082e76354f0ebf87648dc3d5cec2e3c3cdb947c016747a53 | https://plugins.gradle.org/m2/org/codehaus/mojo/animal-sniffer-annotations/…
-e956ab5d2eb48fabae12300d0cd2d3294d4a2a41abc2068c23cb4d60ad76cbe5 | https://plugins.gradle.org/m2/org/codehaus/mojo/animal-sniffer-annotations/…
-18a03df16e2a184c582db7b125633c15fb7714027a84c1b532d72933dc08b81f | https://plugins.gradle.org/m2/org/codehaus/mojo/animal-sniffer-parent/1.17/…
-fc648dcdc404f8bf66e0583914ecf980176618201227bea114fae85043cb755e | https://plugins.gradle.org/m2/org/codehaus/mojo/mojo-parent/40/mojo-parent-…
-a52e6850f070dc9f7a2a51d0b25dfaafd49b0b9bf8196db6c0b3c5b7c94d8d38 | https://plugins.gradle.org/m2/org/glassfish/jaxb/jaxb-bom/2.2.11/jaxb-bom-2…
-37bcaee8ebb04362c8352a5bf6221b86967ecdab5164c696b10b9a2bb587b2aa | https://plugins.gradle.org/m2/org/glassfish/jaxb/jaxb-core/2.2.11/jaxb-core…
-ec31409f203bcabf99534f59231ec0576d875d4d4b7349b09566a7a8c8179b24 | https://plugins.gradle.org/m2/org/glassfish/jaxb/jaxb-core/2.2.11/jaxb-core…
-a874f2351cfba8e2946be3002d10c18a6da8f21b52ba2acf52f2b85d5520ed70 | https://plugins.gradle.org/m2/org/glassfish/jaxb/jaxb-runtime/2.2.11/jaxb-r…
-e5327b31b595ab8143e97836d5ccdf85feb91e7ff5666f7b26913632facca4aa | https://plugins.gradle.org/m2/org/glassfish/jaxb/jaxb-runtime/2.2.11/jaxb-r…
-272a3ccad45a4511351920cd2a8633c53cab8d5220c7a92954da5526bb5eafea | https://plugins.gradle.org/m2/org/glassfish/jaxb/txw2/2.2.11/txw2-2.2.11.jar
-8514cb724b4fca59a5cf272b632e539bd0a0f3cacf1844082d0a173a86406bd8 | https://plugins.gradle.org/m2/org/glassfish/jaxb/txw2/2.2.11/txw2-2.2.11.pom
-1345f11ba606d15603d6740551a8c21947c0215640770ec67271fe78bea97cf5 | https://plugins.gradle.org/m2/org/jdom/jdom2/2.0.6/jdom2-2.0.6.jar
-47b23a79fe336b741b82434c6e049d68165256e405e75c10921fd72fa8a65d8d | https://plugins.gradle.org/m2/org/jdom/jdom2/2.0.6/jdom2-2.0.6.pom
-ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478 | https://plugins.gradle.org/m2/org/jetbrains/annotations/13.0/annotations-13…
-965aeb2bedff369819bdde1bf7a0b3b89b8247dd69c88b86375d76163bb8c397 | https://plugins.gradle.org/m2/org/jetbrains/annotations/13.0/annotations-13…
-64583199ea5a54aefd1bd1595288925f784226ee562d1dd279011c6075b3d7a4 | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-reflect/1.3.50/ko…
-8745181e5a3e0bafefd46309c6b810df7253f379feb985131eaf8d4d9c302635 | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-reflect/1.3.50/ko…
-8ce678e88e4ba018b66dacecf952471e4d7dfee156a8a819760a5a5ff29d323c | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3…
-b6396fe802d7bc76a381485e266cb975f3b2f2d3dd9bf7213aab6ca27a561fc1 | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3…
-9a026639e76212f8d57b86d55b075394c2e009f1979110751d34c05c5f75d57b | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.5…
-a3aef46388ee96e975110db51df3ab794c87d892bdbc6d5a49bf926e4779438b | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.5…
-1b351fb6e09c14b55525c74c1f4cf48942eae43c348b7bc764a5e6e423d4da0c | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.5…
-8674b002f66a2948981c4f6cb5987ec62ff3d54b6a2799a6d2cd23afb83f2ad3 | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.5…
-e6f05746ee0366d0b52825a090fac474dcf44082c9083bbb205bd16976488d6c | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib/1.3.50/kot…
-704fd78960ae046428f69bcd5b951c122e4c180c9400238a866e12cb18494a61 | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib/1.3.50/kot…
-1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7 | https://plugins.gradle.org/m2/org/jetbrains/trove4j/trove4j/20160824/trove4…
-c94b0b73790c70c709bcd445a01247908888211e38cc59e946ff6fe900785ae9 | https://plugins.gradle.org/m2/org/jetbrains/trove4j/trove4j/20160824/trove4…
-a31ff7d77163c0deb09e7fee59ad35ae44c2cee2cc8552a116ccd1583d813fb4 | https://plugins.gradle.org/m2/org/jvnet/staxex/stax-ex/1.7.7/stax-ex-1.7.7.…
-27cb450b6c367a00bd8362519907f84defac7b12086c64d4d6e97e33ab873ead | https://plugins.gradle.org/m2/org/jvnet/staxex/stax-ex/1.7.7/stax-ex-1.7.7.…
-2f1a6387219c3a6cc4856481f221b03bd9f2408a326d416af09af5d6f608c1f4 | https://plugins.gradle.org/m2/org/ow2/asm/asm-analysis/6.0/asm-analysis-6.0…
-d3aaf42e40e3e24aabda53b5de4de5e17cb78e06549bf37312dca6c77e251054 | https://plugins.gradle.org/m2/org/ow2/asm/asm-analysis/6.0/asm-analysis-6.0…
-f1bce5c648a96a017bdcd01fe5d59af9845297fd7b79b81c015a6fbbd9719abf | https://plugins.gradle.org/m2/org/ow2/asm/asm-commons/6.0/asm-commons-6.0.j…
-90f4f29473afb957229016eb5741954976cc1b67bc049b3981c0d1e653ad5cdd | https://plugins.gradle.org/m2/org/ow2/asm/asm-commons/6.0/asm-commons-6.0.p…
-791d064bb9ecc9a46d43bc9efecd74c91464dfc451f321b802d2261e2ccd7d14 | https://plugins.gradle.org/m2/org/ow2/asm/asm-parent/6.0/asm-parent-6.0.pom
-887998fb69727c8759e4d253f856822801e33f9fd4caa566b3ac58ee92106215 | https://plugins.gradle.org/m2/org/ow2/asm/asm-tree/6.0/asm-tree-6.0.jar
-36887e0d7fdb185a92378a38ea45e596a97f10f385c5d050eb6252454ee701b4 | https://plugins.gradle.org/m2/org/ow2/asm/asm-tree/6.0/asm-tree-6.0.pom
-356afebdb0f870175262e5188f8709a3b17aa2a5a6a4b0340b04d4b449bca5f6 | https://plugins.gradle.org/m2/org/ow2/asm/asm-util/6.0/asm-util-6.0.jar
-3cdfc61f988d167b97503419da82a5808b20f4205aeb46c394e6e7ffd3211f12 | https://plugins.gradle.org/m2/org/ow2/asm/asm-util/6.0/asm-util-6.0.pom
-dd8971c74a4e697899a8e95caae4ea8760ea6c486dc6b97b1795e75760420461 | https://plugins.gradle.org/m2/org/ow2/asm/asm/6.0/asm-6.0.jar
-c2bc497e197112e699085426bbb45b1ab0be8002da68267a3b1f450a0312c32e | https://plugins.gradle.org/m2/org/ow2/asm/asm/6.0/asm-6.0.pom
-51215c67d2c068d8b7d2f6f80f51372a098075deccc448d4bdd7b987ba8328fb | https://plugins.gradle.org/m2/org/ow2/ow2/1.3/ow2-1.3.pom
+cda4de455fab48ff0bcb7c48b4639447d4de859a7afc30a094a986f0936beba2 | https://plugins.gradle.org/m2/org/ow2/asm/asm/9.1/asm-9.1.jar
+c683a90dd68f2b1788cbdfc4647ea9405ef5925b371c199f8fd39d44d3cede8d | https://plugins.gradle.org/m2/org/ow2/asm/asm/9.1/asm-9.1.pom
+0f8a1b116e760b8fe6389c51b84e4b07a70fc11082d4f936e453b583dd50b43b | https://plugins.gradle.org/m2/org/ow2/ow2/1.5/ow2-1.5.pom
b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454 | https://plugins.gradle.org/m2/org/sonatype/oss/oss-parent/7/oss-parent-7.pom
-fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a | https://plugins.gradle.org/m2/org/sonatype/oss/oss-parent/9/oss-parent-9.pom
-
=====================================
projects/oss-licenses-plugin/sort-dependencies-pr-268.patch
=====================================
@@ -0,0 +1,144 @@
+From 1e7b29bc4db8cbcfc468e3df4a649113efa3b876 Mon Sep 17 00:00:00 2001
+From: Da Risk <da_risk(a)geekorum.com>
+Date: Wed, 17 May 2023 16:42:10 -0400
+Subject: [PATCH 1/2] oss-license-plugin: sort ArtifactInfo into list
+
+This should ensure that the output of third_party_licenses and third_party_licenses_metadata is sorted.
+Sorting the output will make it reproducible regardless of the input ordering.
+---
+ .../oss/licenses/plugin/DependencyTask.groovy | 5 +++--
+ .../gms/oss/licenses/plugin/LicensesTask.groovy | 4 ++--
+ .../oss/licenses/plugin/DependencyTaskTest.java | 17 ++++++++++++-----
+ 3 files changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy
+index c7848735..5dbfbb30 100644
+--- a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy
++++ b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy
+@@ -76,7 +76,7 @@ abstract class DependencyTask extends DefaultTask {
+ } as AppDependencies
+ }
+
+- private static Set<ArtifactInfo> convertDependenciesToArtifactInfo(
++ private static List<ArtifactInfo> convertDependenciesToArtifactInfo(
+ AppDependencies appDependencies
+ ) {
+ return appDependencies.libraryList.stream()
+@@ -88,7 +88,8 @@ abstract class DependencyTask extends DefaultTask {
+ library.mavenLibrary.version
+ )
+ }
+- .collect(Collectors.toUnmodifiableSet())
++ .sorted(Comparator.comparing { it.toString() })
++ .collect(Collectors.toUnmodifiableList())
+ }
+
+ private static void initOutput(File outputDir) {
+diff --git a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy
+index 851846b5..43db6652 100644
+--- a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy
++++ b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy
+@@ -107,14 +107,14 @@ abstract class LicensesTask extends DefaultTask {
+ writeMetadata()
+ }
+
+- private static Set<ArtifactInfo> loadDependenciesJson(File jsonFile) {
++ private static List<ArtifactInfo> loadDependenciesJson(File jsonFile) {
+ def allDependencies = new JsonSlurper().parse(jsonFile)
+ def artifactInfoSet = new HashSet<ArtifactInfo>()
+ for (entry in allDependencies) {
+ ArtifactInfo artifactInfo = artifactInfoFromEntry(entry)
+ artifactInfoSet.add(artifactInfo)
+ }
+- artifactInfoSet.asImmutable()
++ artifactInfoSet.toList().asImmutable()
+ }
+
+ private void addDebugLicense() {
+diff --git a/oss-licenses-plugin/src/test/java/com/google/android/gms/oss/licenses/plugin/DependencyTaskTest.java b/oss-licenses-plugin/src/test/java/com/google/android/gms/oss/licenses/plugin/DependencyTaskTest.java
+index e35a5490..50760521 100644
+--- a/oss-licenses-plugin/src/test/java/com/google/android/gms/oss/licenses/plugin/DependencyTaskTest.java
++++ b/oss-licenses-plugin/src/test/java/com/google/android/gms/oss/licenses/plugin/DependencyTaskTest.java
+@@ -29,6 +29,9 @@
+ import java.io.OutputStream;
+ import java.lang.reflect.Type;
+ import java.util.Collection;
++import java.util.Comparator;
++import java.util.List;
++import java.util.stream.Collectors;
+ import org.gradle.api.Project;
+ import org.gradle.testfixtures.ProjectBuilder;
+ import org.junit.Before;
+@@ -84,8 +87,8 @@ public void testAction_valuesConvertedToJson() throws Exception {
+ File outputJson = new File(outputDir, "test.json");
+ dependencyTask.getDependenciesJson().set(outputJson);
+ ImmutableSet<ArtifactInfo> expectedArtifacts = ImmutableSet.of(
+- new ArtifactInfo("org.group.id", "artifactId", "1.0.0"),
+- new ArtifactInfo("org.group.other", "other-artifact", "3.2.1")
++ new ArtifactInfo("org.group.other", "other-artifact", "3.2.1"),
++ new ArtifactInfo("org.group.id", "artifactId", "1.0.0")
+ );
+ AppDependencies appDependencies = createAppDependencies(expectedArtifacts);
+ File protoFile = writeAppDependencies(appDependencies, temporaryFolder.newFile());
+@@ -102,8 +105,8 @@ public void testAction_withNonMavenDeps_nonMavenDepsIgnored() throws Exception {
+ File outputJson = new File(outputDir, "test.json");
+ dependencyTask.getDependenciesJson().set(outputJson);
+ ImmutableSet<ArtifactInfo> expectedArtifacts = ImmutableSet.of(
+- new ArtifactInfo("org.group.id", "artifactId", "1.0.0"),
+- new ArtifactInfo("org.group.other", "other-artifact", "3.2.1")
++ new ArtifactInfo("org.group.other", "other-artifact", "3.2.1"),
++ new ArtifactInfo("org.group.id", "artifactId", "1.0.0")
+ );
+ AppDependencies appDependencies = createAppDependencies(expectedArtifacts).toBuilder()
+ .addLibrary(Library.getDefaultInstance()) // There aren't any other library types supported.
+@@ -131,11 +134,15 @@ public void testAction_depFileAbsent_writesAbsentDep() throws Exception {
+ private void verifyExpectedDependencies(ImmutableSet<ArtifactInfo> expectedArtifacts,
+ File outputJson) throws Exception {
+ Gson gson = new Gson();
++ List<ArtifactInfo> expectedArtifactsSorted = expectedArtifacts
++ .stream()
++ .sorted(Comparator.comparing(ArtifactInfo::toString))
++ .collect(Collectors.toUnmodifiableList());
+ try (FileReader reader = new FileReader(outputJson)) {
+ Type collectionOfArtifactInfo = new TypeToken<Collection<ArtifactInfo>>() {
+ }.getType();
+ Collection<ArtifactInfo> jsonArtifacts = gson.fromJson(reader, collectionOfArtifactInfo);
+- assertThat(jsonArtifacts).containsExactlyElementsIn(expectedArtifacts);
++ assertThat(jsonArtifacts).containsExactlyElementsIn(expectedArtifactsSorted).inOrder();
+ }
+ }
+
+
+From 0ae426b1fe52ef70770d10050402413a22bd8dba Mon Sep 17 00:00:00 2001
+From: Da Risk <da_risk(a)geekorum.com>
+Date: Fri, 19 May 2023 21:22:26 -0400
+Subject: [PATCH 2/2] oss-license-plugin: Sort dependencies loaded for
+ LicensesTask
+
+---
+ .../android/gms/oss/licenses/plugin/LicensesTask.groovy | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy
+index 43db6652..7dac8aae 100644
+--- a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy
++++ b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy
+@@ -25,6 +25,7 @@ import org.gradle.api.tasks.OutputFile
+ import org.gradle.api.tasks.TaskAction
+ import org.slf4j.LoggerFactory
+
++import java.util.stream.Collectors
+ import java.util.zip.ZipEntry
+ import java.util.zip.ZipFile
+
+@@ -114,7 +115,9 @@ abstract class LicensesTask extends DefaultTask {
+ ArtifactInfo artifactInfo = artifactInfoFromEntry(entry)
+ artifactInfoSet.add(artifactInfo)
+ }
+- artifactInfoSet.toList().asImmutable()
++ artifactInfoSet.stream()
++ .sorted(Comparator.comparing { it.toString() })
++ .collect(Collectors.toUnmodifiableList())
+ }
+
+ private void addDebugLicense() {
=====================================
projects/oss-licenses-plugin/sort-dependencies.diff deleted
=====================================
@@ -1,40 +0,0 @@
-diff --git a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/ArtifactInfo.groovy b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/ArtifactInfo.groovy
-index d6d854d..622072d 100644
---- a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/ArtifactInfo.groovy
-+++ b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/ArtifactInfo.groovy
-@@ -16,7 +16,7 @@
-
- package com.google.android.gms.oss.licenses.plugin
-
--class ArtifactInfo {
-+class ArtifactInfo implements Comparable<ArtifactInfo> {
- private String group
- private String name
- private String fileLocation
-@@ -47,4 +47,13 @@ class ArtifactInfo {
- String getVersion() {
- return version
- }
-+
-+ String toString() {
-+ return "$group:$name:$version"
-+ }
-+
-+ @Override
-+ int compareTo(ArtifactInfo other) {
-+ return toString().compareTo(other.toString())
-+ }
- }
-diff --git a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy
-index 75f6527..26a9bf7 100644
---- a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy
-+++ b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy
-@@ -47,7 +47,7 @@ import org.slf4j.LoggerFactory
- */
- class DependencyTask extends DefaultTask {
- protected Set<String> artifactSet = []
-- protected Set<ArtifactInfo> artifactInfos = []
-+ protected TreeSet<ArtifactInfo> artifactInfos = []
- protected static final String LOCAL_LIBRARY_VERSION = "unspecified"
- private static final String TEST_PREFIX = "test"
- private static final String ANDROID_TEST_PREFIX = "androidTest"
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/0…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/0…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser-build][main] 3 commits: Bug 41494: Update GeckoView build scripts for ESR140.
by Pier Angelo Vendrame (@pierov) 18 Jun '25
by Pier Angelo Vendrame (@pierov) 18 Jun '25
18 Jun '25
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
124d0464 by Pier Angelo Vendrame at 2025-06-17T15:07:49+02:00
Bug 41494: Update GeckoView build scripts for ESR140.
- - - - -
86c4fa8a by Pier Angelo Vendrame at 2025-06-17T15:08:21+02:00
fixup! Bug 41494: Update GeckoView build scripts for ESR140.
Remove Mozilla's A-S binaries from Gradle dependencies.
- - - - -
59b05b0c by Pier Angelo Vendrame at 2025-06-17T15:08:56+02:00
NOT FOR MERGE: Use a custom git hash for GeckoView.
- - - - -
11 changed files:
- projects/geckoview/build
- projects/geckoview/build_ac_fenix
- projects/geckoview/build_common
- projects/geckoview/config
- projects/geckoview/gradle-dependencies-list.txt
- projects/oss-licenses-plugin/build
- projects/oss-licenses-plugin/build-customization.diff
- projects/oss-licenses-plugin/config
- projects/oss-licenses-plugin/gradle-dependencies-list.txt
- + projects/oss-licenses-plugin/sort-dependencies-pr-268.patch
- − projects/oss-licenses-plugin/sort-dependencies.diff
Changes:
=====================================
projects/geckoview/build
=====================================
@@ -43,7 +43,7 @@ echo "Starting ./mach build $(date)"
# Copy the artifacts to the target directory
# Naming convention is the same as Mozilla uses for their artifacts
cp -a obj-*/dist/*.zip $artifactsdir/target.xpt_artifacts.zip
- cp -a obj-*/gradle/build/mobile/android/geckoview_example/outputs/apk/withGeckoBinaries/*/geckoview_example-withGeckoBinaries-*.apk $artifactsdir/geckoview_example.apk
+ cp -a obj-*/gradle/build/mobile/android/geckoview_example/outputs/apk/*/geckoview_example-*.apk $artifactsdir/geckoview_example.apk
./mach python -m mozbuild.action.test_archive common $artifactsdir/target.common.tests.tar.gz
[% END %]
=====================================
projects/geckoview/build_ac_fenix
=====================================
@@ -4,6 +4,8 @@
./mach package-multi-locale --locales en-US $supported_locales
[% END -%]
+objdir=$(cd obj-* && pwd)
+
echo "Building Android Components $(date)"
pushd mobile/android/android-components
gradle $GRADLE_FLAGS assembleGecko -x lint
@@ -40,7 +42,7 @@ gradle $GRADLE_FLAGS -PversionName="$version_name" "assemble$variant"
echo "Build finished, copying the APK(s) to the destination directory $(date)"
mkdir $distdir/[% project %]
-cp app/build/outputs/apk/fenix/$variant/*.apk $distdir/[% project %]
+cp $objdir/gradle/build/mobile/android/fenix/app/outputs/apk/fenix/$variant/*.apk $distdir/[% project %]
echo "Building non optimized $variant Fenix APK for testing"
gradle $GRADLE_FLAGS -PversionName="$version_name" -PdisableOptimization "assemble$variant"
@@ -51,8 +53,8 @@ gradle $GRADLE_FLAGS -PversionName="$version_name" -PtestBuildType="$variant" -P
echo "Test build finished, copying the APKs to the destination directory $(date)"
mkdir $distdir/[% project %]/tests
-cp app/build/outputs/apk/fenix/$variant/*.apk $distdir/[% project %]/tests
-cp app/build/outputs/apk/androidTest/fenix/$variant/*.apk $distdir/[% project %]/tests
+cp $objdir/gradle/build/mobile/android/fenix/app/outputs/apk/fenix/$variant/*.apk $distdir/[% project %]/tests
+cp $objdir/gradle/build/mobile/android/fenix/app/outputs/apk/androidTest/fenix/$variant/*.apk $distdir/[% project %]/tests
popd
=====================================
projects/geckoview/build_common
=====================================
@@ -48,4 +48,10 @@ export MACH_BUILD_PYTHON_NATIVE_PACKAGE_SOURCE=system
# Create .mozbuild to avoid interactive prompt in configure
mkdir "$HOME/.mozbuild"
+# mach looks for bundletool and avd only in ~/.mozbuild. Maybe an upstream bug?
+mv $rootdir/[% c("input_files_by_name/bundletool") %] $HOME/.mozbuild/bundletool.jar
+mkdir $HOME/.mozbuild/android-device
+touch $HOME/.mozbuild/android-device/avd
+chmod +x $HOME/.mozbuild/android-device/avd
+
[% INCLUDE 'browser-localization' %]
=====================================
projects/geckoview/config
=====================================
@@ -1,9 +1,11 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: 'geckoview-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]'
-git_hash: 'tor-browser-[% c("var/geckoview_version") %]-[% c("var/browser_branch") %]-build[% c("var/browser_build") %]'
-tag_gpg_id: 1
-git_url: https://gitlab.torproject.org/tpo/applications/tor-browser.git
+# git_hash: 'tor-browser-[% c("var/geckoview_version") %]-[% c("var/browser_branch") %]-build[% c("var/browser_build") %]'
+# tag_gpg_id: 1
+# git_url: https://gitlab.torproject.org/tpo/applications/tor-browser.git
+git_url: https://gitlab.torproject.org/pierov/tor-browser.git
+git_hash: 72fe94d01ff1
gpg_keyring:
- boklm.gpg
- brizental.gpg
@@ -37,9 +39,12 @@ var:
- openjdk-17-jdk-headless
# this should be updated when the list of gradle dependencies is changed
# see doc/how-to-create-gradle-dependencies-list.txt
- gradle_dependencies_version: 16
- gradle_version: 8.8
+ gradle_dependencies_version: 17
+ gradle_version: 8.13
glean_parser: 14.0.1
+ # python/mozboot/mozboot/android.py
+ bundletool_version: 1.18.1
+ bundletool_hash: 675786493983787ffa11550bdb7c0715679a44e1643f3ff980a529e9c822595c
variant: beta
has_l10n: '[% !c("var/testbuild") && !c("var/locales").empty %]'
l10n-changesets: '[% exec("git --no-pager show " _ c("git_hash") _ ":browser/locales/l10n-changesets.json", { exec_noco => 1 }) %]'
@@ -49,7 +54,7 @@ targets:
var:
variant: release
nightly:
- git_hash: 'tor-browser-[% c("var/geckoview_version") %]-[% c("var/browser_branch") %]'
+ # git_hash: 'tor-browser-[% c("var/geckoview_version") %]-[% c("var/browser_branch") %]'
tag_gpg_id: 0
var:
variant: nightly
@@ -121,9 +126,12 @@ steps:
- project: oss-licenses-plugin
name: oss-licenses-plugin
pkg_type: build
+ - URL: 'https://github.com/google/bundletool/releases/download/[% c("var/bundletool_version") %]/bundletool-all-[% c("var/bundletool_version") %].jar'
+ name: bundletool
+ sha256sum: '[% c("var/bundletool_hash") %]'
list_toolchain_updates:
- git_hash: tor-browser-128.0b1-14.0-1
+ git_hash: tor-browser-140.0a1-15.0-1
tag_gpg_id: 0
input_files: []
container:
@@ -173,3 +181,6 @@ input_files:
pkg_type: tor-browser
enable: '[% c("var/android_single_arch") && c("var/has_l10n") %]'
- filename: rename-branding-strings.py
+ - URL: 'https://github.com/google/bundletool/releases/download/[% c("var/bundletool_version") %]/bundletool-all-[% c("var/bundletool_version") %].jar'
+ name: bundletool
+ sha256sum: '[% c("var/bundletool_hash") %]'
=====================================
projects/geckoview/gradle-dependencies-list.txt
=====================================
The diff for this file was not included because it is too large.
=====================================
projects/oss-licenses-plugin/build
=====================================
@@ -12,9 +12,10 @@ export PATH=/var/tmp/dist/gradle/bin:$PATH
gradle_repo=/var/tmp/dist/gradle-dependencies
mv $rootdir/[% c('input_files_by_name/gradle-dependencies') %] $gradle_repo
cp -rl $gradle_repo/m2/* $gradle_repo || true
+cp -rl $gradle_repo/dl/android/maven2/* $gradle_repo || true
cd $builddir
-patch -p2 < $rootdir/sort-dependencies.diff
+patch -p2 < $rootdir/sort-dependencies-pr-268.patch
patch -p2 < $rootdir/build-customization.diff
gradle --no-daemon --offline -Dmaven.repo.local=$gradle_repo assemble publish
cd build/repo
=====================================
projects/oss-licenses-plugin/build-customization.diff
=====================================
@@ -1,17 +1,17 @@
diff --git a/oss-licenses-plugin/build.gradle b/oss-licenses-plugin/build.gradle
-index 2a7dd74..f9368e1 100644
+index 863625c..65ad088 100644
--- a/oss-licenses-plugin/build.gradle
+++ b/oss-licenses-plugin/build.gradle
-@@ -15,34 +15,25 @@ dependencies {
+@@ -20,34 +20,25 @@ dependencies {
group = 'com.google.android.gms'
- version = '0.10.4'
+ version = '0.10.6'
-apply plugin: 'maven'
+apply plugin: 'maven-publish'
repositories {
google()
- jcenter()
+ mavenCentral()
+ mavenLocal()
}
=====================================
projects/oss-licenses-plugin/config
=====================================
@@ -1,12 +1,12 @@
-version: 0.10.4
+version: 0.10.6
filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]'
git_url: https://github.com/google/play-services-plugins.git
-git_hash: c9ed0e48abe2c55dd67f2c2224988d1d690cecc9 # oss-licenses-plugin-v0.10.4
+git_hash: 45ec9c690672f0ff6f86e6221ef64e204b10a228 # oss-licenses-plugin-v0.10.6
var:
# This should be updated when the list of gradle dependencies is changed.
- gradle_dependencies_version: 1
- gradle_version: 8.8
+ gradle_dependencies_version: 2
+ gradle_version: 8.13
container:
use_container: 1
@@ -18,5 +18,5 @@ input_files:
- filename: 'gradle-dependencies-[% c("var/gradle_dependencies_version") %]'
name: gradle-dependencies
exec: '[% INCLUDE "fetch-gradle-dependencies" %]'
+ - filename: sort-dependencies-pr-268.patch
- filename: build-customization.diff
- - filename: sort-dependencies.diff
=====================================
projects/oss-licenses-plugin/gradle-dependencies-list.txt
=====================================
@@ -1,207 +1,37 @@
# On how to update dependencies see doc/how-to-create-gradle-dependencies-list.txt
# Don't forget to update var/gradle_dependencies_version when modifying this file
sha256sum | url
-408d8ed48da2b7b2c8f7216906c1b76a1ecdb9c165cdb52c9eeb32af0cc67f0f | https://maven.google.com/androidx/databinding/databinding-common/3.5.1/data…
-008e3641392787bd3f6e5fe3a56457379cbba8be62ae5a91ba982b7e534a2b37 | https://maven.google.com/androidx/databinding/databinding-common/3.5.1/data…
-b6235dd4ff7457f517e30479fe050a2ae27a2b3ef8ae33d44d9a3d2197911779 | https://maven.google.com/androidx/databinding/databinding-compiler-common/3…
-4a3bfe5d22a4df2490f6180ef1e22a2ea189f42676532d6d7d6ece9b57a2c506 | https://maven.google.com/androidx/databinding/databinding-compiler-common/3…
-4b698a77c578215a7f746e93422757a8e4d6ee9c8a29fdd9f994712f723604ed | https://maven.google.com/com/android/databinding/baseLibrary/3.5.1/baseLibr…
-6659dd657846c519b12ad701815f2009f8d9991c798ca3a5a628e163987aecab | https://maven.google.com/com/android/databinding/baseLibrary/3.5.1/baseLibr…
-9e9618ed7f1d24df2a4365e1719d630d8ac9c2dd31bea3343157a4ae5efa7fb9 | https://maven.google.com/com/android/tools/analytics-library/crash/26.5.1/c…
-215d75a04ddcfa897e12f3c4d204f24e94214385f1f11ddcea4ddcd56ddb5243 | https://maven.google.com/com/android/tools/analytics-library/crash/26.5.1/c…
-8dde1130725461fe827f2a343d353f2b51e8870661fc860d7d5ebddb097ead4e | https://maven.google.com/com/android/tools/analytics-library/protos/26.5.1/…
-7b042861662b26a41e8f71a093cffc78dd8eb746e5ab98a645e1dcf49612bd0a | https://maven.google.com/com/android/tools/analytics-library/protos/26.5.1/…
-ccc2f3b00ec17b11401610ba68553544fc8fc517120e84439ac6eb86b875e18d | https://maven.google.com/com/android/tools/analytics-library/shared/26.5.1/…
-727842ddf56dbf158091a4f113005ec0e2d04ae2c066d7ede9b65ce6a9131aa8 | https://maven.google.com/com/android/tools/analytics-library/shared/26.5.1/…
-3a76984c0fe2e847ca7a8b35b4780ef0447a9d1666946cb8e60466318e0ab5ae | https://maven.google.com/com/android/tools/analytics-library/tracker/26.5.1…
-6327d446e6c59adacad78265fc61ac09ddcb751fe4e62b3697dc9d6534c0c451 | https://maven.google.com/com/android/tools/analytics-library/tracker/26.5.1…
-2c43c82f8c59d8f7a61e3239e1a2dc9f69dc342ec09af9b7c9f69b25337c0b6e | https://maven.google.com/com/android/tools/annotations/26.5.1/annotations-2…
-3caa859d7b198f9f429f50874921f5e05f105112400eed666d5e56a0e8417e09 | https://maven.google.com/com/android/tools/annotations/26.5.1/annotations-2…
-fac0435e08898f89eeeb9ca236bea707155ff816c12205ced285ad53604133ca | https://maven.google.com/com/android/tools/build/aapt2-proto/0.4.0/aapt2-pr…
-a24bdd4e8e374fdcd8cef8d77ea723f147ccd0f25dc6de4fbe290039be904339 | https://maven.google.com/com/android/tools/build/aapt2-proto/0.4.0/aapt2-pr…
-1fd33e7f009a2a0da766cfeec4211a09f548034b015c289a66d75dd8a9302f4a | https://maven.google.com/com/android/tools/build/apksig/3.5.1/apksig-3.5.1.…
-4c9f03d9fbc5accffafd56b0ae677d41ea0a395980a2cc052a7bcefccb2483a9 | https://maven.google.com/com/android/tools/build/apksig/3.5.1/apksig-3.5.1.…
-9f330167cbe973b7db407692f74f4f6453b7ffa5f2048934b06280c2ceee60fa | https://maven.google.com/com/android/tools/build/apkzlib/3.5.1/apkzlib-3.5.…
-f299c423220ae47404b9013e54caec84ea64f45f69885e4dc0e2e66b7095e33e | https://maven.google.com/com/android/tools/build/apkzlib/3.5.1/apkzlib-3.5.…
-39ea3c82b76b6e0c9f9fa88d93e0edc1dd4a0f1dfae0ef6fbf2d451da47e5450 | https://maven.google.com/com/android/tools/build/builder-model/3.5.1/builde…
-466e5005cf0a7c7bad8991b14c70b04457b77d28195ec04ec2baf6495e88f4a2 | https://maven.google.com/com/android/tools/build/builder-model/3.5.1/builde…
-a1b59305584cbcaa078fdc9cfb80871012755b822dd32e8da19add6f7bbcb762 | https://maven.google.com/com/android/tools/build/builder-test-api/3.5.1/bui…
-704e2ad557e5659b98bb8955fbab20977cddb09c06e72825cf2516635424b8cb | https://maven.google.com/com/android/tools/build/builder-test-api/3.5.1/bui…
-e3a8d382434c5f60990730c4719fc814e85a898a33a1e96c1df8d627d3c6eea6 | https://maven.google.com/com/android/tools/build/builder/3.5.1/builder-3.5.…
-aa0092dd227856f6a9c42df1f6ae14ba8a5bde16ea77d760e48c25e575d31668 | https://maven.google.com/com/android/tools/build/builder/3.5.1/builder-3.5.…
-50c44557ca75b068e364ac35a648b81eeba7639ab5eb04036e390c727ad2fa3d | https://maven.google.com/com/android/tools/build/bundletool/0.9.0/bundletoo…
-124e124227803689b71da7440f0dbdff71cbb4c661a18e0f4e2e0d3a80d367c2 | https://maven.google.com/com/android/tools/build/bundletool/0.9.0/bundletoo…
-be9b41859bace11998f66b04ed944f87e413f3ad6da3c4665587699da125addc | https://maven.google.com/com/android/tools/build/gradle-api/3.5.1/gradle-ap…
-e977170f2bf4fdf335d924f8bf94eea54c54422f74f8915fc8d592dc9a226eb8 | https://maven.google.com/com/android/tools/build/gradle-api/3.5.1/gradle-ap…
-fe188188002bbb2e51c7db6da1ed03fc82af8f3be1a33991d38381837bc6708a | https://maven.google.com/com/android/tools/build/gradle/3.5.1/gradle-3.5.1.…
-b4a5b3db612b70ad8ba1b22bc469444d946bcd60e399f97ee6e498d195239c84 | https://maven.google.com/com/android/tools/build/gradle/3.5.1/gradle-3.5.1.…
-c9f8b016144cfb31c5aee92d47f34de23289167cac5e8ef68365b2dd05766f11 | https://maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0…
-db025ad1bbc6896edf0f67cda1222ba9b7ec9a0187df7f4fd0a318475c758e4e | https://maven.google.com/com/android/tools/build/jetifier/jetifier-core/1.0…
-1dd481e7606ccb30868908d9ae80f27d1c5ba882f792532bd91ed731c54f4efb | https://maven.google.com/com/android/tools/build/jetifier/jetifier-processo…
-4973a6c6d7f89297a1cfea56c623cea72b3db3b4a49992afa00dd77ac052b89f | https://maven.google.com/com/android/tools/build/jetifier/jetifier-processo…
-dcad9ecb967251f4d750f55a4204a2b400e8fbfe5cb930a1d0d5dbe10ae8bdfc | https://maven.google.com/com/android/tools/build/manifest-merger/26.5.1/man…
-0dfcac2f9fa87c1742945875ef1e6f9fbade2149426502323c40eb01c05a7e36 | https://maven.google.com/com/android/tools/build/manifest-merger/26.5.1/man…
-4de4a3d05e1c534c2db9e4588bf34082bb2bd232d8abb9727c430290ce225740 | https://maven.google.com/com/android/tools/build/transform-api/2.0.0-deprec…
-7c62f3856e8abca1d79257925f26c12668693f5d95904056bbac88605cfd8575 | https://maven.google.com/com/android/tools/build/transform-api/2.0.0-deprec…
-eccfa54486ed54c4e3123cc42195d023bd0dd21bcd2f0e4868e8c6fc70f8ef6b | https://maven.google.com/com/android/tools/common/26.5.1/common-26.5.1.jar
-4492eb509dc784ca5e1600a2b0505ad1468bed4d116220fca67f34b49ac18ffb | https://maven.google.com/com/android/tools/common/26.5.1/common-26.5.1.pom
-b081aef2a4ed3f4d47cae4cdb128469735f25a114e026d37123bf9ffdec742a8 | https://maven.google.com/com/android/tools/ddms/ddmlib/26.5.1/ddmlib-26.5.1…
-a6e4693d05779c25cbfbbf4e67f96150c4de3d398ae3ed6a38f786971eb89634 | https://maven.google.com/com/android/tools/ddms/ddmlib/26.5.1/ddmlib-26.5.1…
-46f93ad498b4756e7d867d2fe38c38890a80e7407a4ae459e4a8c8d5c5aeacfe | https://maven.google.com/com/android/tools/dvlib/26.5.1/dvlib-26.5.1.jar
-1d5f88a4eb1c76901bc7b19af2311418a3f259d0f68756b058df850b1e8f913f | https://maven.google.com/com/android/tools/dvlib/26.5.1/dvlib-26.5.1.pom
-88732f11396c427273e515d23042e35633f4fe4295528a99b866aa2adf0efd9c | https://maven.google.com/com/android/tools/layoutlib/layoutlib-api/26.5.1/l…
-63832aa426428edb1a9ad7b1fc06c8ecf8f38b98041c13bfe433ac46688e5ed8 | https://maven.google.com/com/android/tools/layoutlib/layoutlib-api/26.5.1/l…
-82453fd98a8394cc84ed995c04d2cd744abd1d6589403427ba7eef53115406f3 | https://maven.google.com/com/android/tools/lint/lint-gradle-api/26.5.1/lint…
-2ddefa31501b320b366a0d18ba169118be7073d04c9337dd77bdc4ebd4ced959 | https://maven.google.com/com/android/tools/lint/lint-gradle-api/26.5.1/lint…
-2b3ee791aa4c3e8ce60498c161a27ca7228816fc630eed4d9f25f2f36a106dce | https://maven.google.com/com/android/tools/repository/26.5.1/repository-26.…
-8312471ec5165d599404e2225157c5639bdd9ad5c6980f79b1c1c4b517ff93b3 | https://maven.google.com/com/android/tools/repository/26.5.1/repository-26.…
-365f749676c3574676fd465177c8a492f340816db2b520d6ed114d3b6e77bea7 | https://maven.google.com/com/android/tools/sdk-common/26.5.1/sdk-common-26.…
-33b0649ae6e3dd95340123c462f6ef32992ee858e6e132f45bb7dec332627d59 | https://maven.google.com/com/android/tools/sdk-common/26.5.1/sdk-common-26.…
-007da104afb27c8c682a1628023fe9ec438249c8d15ef0fd6624c5bb8e23b696 | https://maven.google.com/com/android/tools/sdklib/26.5.1/sdklib-26.5.1.jar
-3f5ee952ea6a07767688a464c545354fbbce296419973397e65280142914b2a4 | https://maven.google.com/com/android/tools/sdklib/26.5.1/sdklib-26.5.1.pom
-feab9191311c3d7aeef2b66d6064afc80d3d1d52d980fb07ae43c78c987ba93a | https://plugins.gradle.org/m2/com/google/code/findbugs/jsr305/1.3.9/jsr305-…
-766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7 | https://plugins.gradle.org/m2/com/google/code/findbugs/jsr305/3.0.2/jsr305-…
-19889dbdf1b254b2601a5ee645b8147a974644882297684c798afe5d63d78dfe | https://plugins.gradle.org/m2/com/google/code/findbugs/jsr305/3.0.2/jsr305-…
-8f1fec72b91a71ea39ec39f5f778c4d1124b6b097c6d55b3a50b554a52237b27 | https://plugins.gradle.org/m2/com/google/code/gson/gson-parent/2.8.5/gson-p…
-233a0149fc365c9f6edbd683cfe266b19bdc773be98eabdaf6b3c924b48e7d81 | https://plugins.gradle.org/m2/com/google/code/gson/gson/2.8.5/gson-2.8.5.jar
-b8308557a7fccc92d9fe7c8cd0599258b361285d2ecde7689eda98843255a092 | https://plugins.gradle.org/m2/com/google/code/gson/gson/2.8.5/gson-2.8.5.pom
-6ebd22ca1b9d8ec06d41de8d64e0596981d9607b42035f9ed374f9de271a481a | https://plugins.gradle.org/m2/com/google/errorprone/error_prone_annotations…
-5e0258ea1ba4e51a133742680bc22448f7ab214be4073e8619f645ef1be42dd5 | https://plugins.gradle.org/m2/com/google/errorprone/error_prone_annotations…
-c460902ddf5ece68832c6b271ce52a0928b05cf3a6ac81a8f548c73cbd541138 | https://plugins.gradle.org/m2/com/google/errorprone/error_prone_parent/2.2.…
-cd6db17a11a31ede794ccbd1df0e4d9750f640234731f21cff885a9997277e81 | https://plugins.gradle.org/m2/com/google/google/1/google-1.pom
-a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26 | https://plugins.gradle.org/m2/com/google/guava/failureaccess/1.0.1/failurea…
-e96042ce78fecba0da2be964522947c87b40a291b5fd3cd672a434924103c4b9 | https://plugins.gradle.org/m2/com/google/guava/failureaccess/1.0.1/failurea…
-f8698ab46ca996ce889c1afc8ca4f25eb8ac6b034dc898d4583742360016cc04 | https://plugins.gradle.org/m2/com/google/guava/guava-parent/26.0-android/gu…
-317e88291262e0cf2805e956c18850f1d4565c85c2e1112f5d9d08ab1732e696 | https://plugins.gradle.org/m2/com/google/guava/guava-parent/27.0.1-jre/guav…
-e1c814fd04492a27c38e0317eabeaa1b3e950ec8010239e400fe90ad6c9107b4 | https://plugins.gradle.org/m2/com/google/guava/guava/27.0.1-jre/guava-27.0.…
-6a8dd041f23a6bb14a86e440fccb993537b62271357a0dac0a3cb0ff39158f36 | https://plugins.gradle.org/m2/com/google/guava/guava/27.0.1-jre/guava-27.0.…
-b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99 | https://plugins.gradle.org/m2/com/google/guava/listenablefuture/9999.0-empt…
-18d4b1db26153d4e55079ce1f76bb1fe05cdb862ef9954a88cbcc4ff38b8679b | https://plugins.gradle.org/m2/com/google/guava/listenablefuture/9999.0-empt…
-2994a7eb78f2710bd3d3bfb639b2c94e219cedac0d4d084d516e78c16dddecf6 | https://plugins.gradle.org/m2/com/google/j2objc/j2objc-annotations/1.1/j2ob…
-f0c98c571e93a7cb4dd18df0fa308f0963e7a0620ac2d4244e61e709d03ad6be | https://plugins.gradle.org/m2/com/google/j2objc/j2objc-annotations/1.1/j2ob…
-c71555751e57e0ef912870e8ac9625ae782502a6a5b9c19ccf83b2a97d8b26bd | https://plugins.gradle.org/m2/com/google/jimfs/jimfs-parent/1.1/jimfs-paren…
-c4828e28d7c0a930af9387510b3bada7daa5c04d7c25a75c7b8b081f1c257ddd | https://plugins.gradle.org/m2/com/google/jimfs/jimfs/1.1/jimfs-1.1.jar
-efa86e5cd922f17b472fdfcae57234d8d4ac3e148b6250737dfce454af7a7a44 | https://plugins.gradle.org/m2/com/google/jimfs/jimfs/1.1/jimfs-1.1.pom
-4189e0be5ab15cf2330f70b24fbdc75ca37514f188388fce8580ce16a9a68052 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-java-util/3.4.0/…
-89c43073e7eaa0eaba72a4a36ae1b6bfdfe5d81bb9d0e156aee05e4a72de3cb8 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-java-util/3.4.0/…
-dce7e66b32456a1b1198da0caff3a8acb71548658391e798c79369241e6490a4 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-java/3.4.0/proto…
-83f17ba86c5fa1a15a3a3c8030d4ce42ef21c1d39b65db6cc004a8eeb2c59406 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-java/3.4.0/proto…
-24909c552842c0eb7a4c769d631a43cbef5a9a10c1640f2bdbd1ea149c573a47 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-parent/3.4.0/pro…
-2d9484f4c649f708f47f9a479465fc729770ee65617dca3011836602264f6439 | https://plugins.gradle.org/m2/com/googlecode/json-simple/json-simple/1.1/js…
-47a89be0fa0fedd476db5fd2c83487654d2a119c391f83a142be876667cf7dab | https://plugins.gradle.org/m2/com/googlecode/json-simple/json-simple/1.1/js…
-757bfe906193b8b651e79dc26cd67d6b55d0770a2cdfb0381591504f779d4a76 | https://plugins.gradle.org/m2/com/googlecode/juniversalchardet/juniversalch…
-7846399b35c7cd642a9b3a000c3e2d62d04eb37a4547b6933cc8b18bcc2f086b | https://plugins.gradle.org/m2/com/googlecode/juniversalchardet/juniversalch…
-8e108c92027bb428196f10fa11cffbe589f7648a6af2016d652279385fdfd789 | https://plugins.gradle.org/m2/com/squareup/javapoet/1.8.0/javapoet-1.8.0.jar
-b3760f40f19e735b2cd418f7656335d926d1d9413e10982a1c9695b64edbb647 | https://plugins.gradle.org/m2/com/squareup/javapoet/1.8.0/javapoet-1.8.0.pom
+33c839e4236eabde3896c154d120d651e72064f393e456297c92041d00cc058e | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/7.1.…
+67a8f20626121a8e4f48fc63a392c0459173a9992eb35cc9c9c3ec82b882862c | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/7.1.…
+8529eca8d75767050751f7674338548f591a234333179d9b5ad66c6feaf00d42 | https://dl.google.com/dl/android/maven2/com/android/tools/build/apksig/7.1.…
+0e46a02577de7cbad380679e565f73d537205e0c38c2894bfe122ad1ee79e516 | https://dl.google.com/dl/android/maven2/com/android/tools/build/apkzlib/7.1…
+c2d09468c92bd306272ed6f2c7b5ac2507ede7222e4b677a5ba887e06e89c5bb | https://dl.google.com/dl/android/maven2/com/android/tools/build/apkzlib/7.1…
+fa9f433e60e4f330e763f4f1920f8bda5d1f835d17ac1bd9b92d2a139a4a8269 | https://dl.google.com/dl/android/maven2/com/android/tools/build/apkzlib/7.1…
+5e14677ed7c265731a4cb4ec99e1f352daaafb596f21f88e367220b3554b1a25 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
+76ade53f054bb250e93cbd29d82e1c9736ea64663d8faebef0f7deb3f1a08c3c | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
+4f430764d6dd337aeb94b5b6a307398831c0eaf276a3f639ecdb583819483d08 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder-mod…
+6d43939f77996074552a72422924bc3644da6035a936d2c7d1326abe7ae1443e | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/7.1…
+c90102982348647fc58993b00ed675a1f92b50dc9c38563fd594b8cff3c67254 | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/7.1…
+29a092c1ee48d09f36870f7b95688d05eff6784baac752e9b91ea1acfb1c358e | https://dl.google.com/dl/android/maven2/com/android/tools/build/builder/7.1…
+9c5ed0e13a6e8b426341cd32dcab2dd5b54c52e701a135b4227ccfe8ef3266bf | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
+d710594e89c561be3e7aba56b8e5a5690ebbdf82ad6d07019c2e271f39669ea8 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
+4545a1e6e1992613ee49df0d1395be89d625333adcf2db206af652586fbde26c | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle-api/…
+621329051b4261fd390b33607523e123962ad3ad6b91929f37b23187caaa9309 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/7.1.…
+05ee8a6fc8b68e140133c4d9547e4790661737359c0d27b142b6fbc44bbe2a02 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/7.1.…
+91db6b029dc8b00570c77418f7a28839517bc9cb5a14ab562885b4bcf61efbd5 | https://dl.google.com/dl/android/maven2/com/android/tools/build/gradle/7.1.…
+cb36c736ed2ac922e6655ef5c56c34068e63b7d9bd749920b67592859c1e4d81 | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
+5b3b27f624a969fd35d3aa7aef91499862a445c13aece4233b1a103a42bc8be3 | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
+877dddbbb9e3f045bd835e21c59795cdad1332600354b773a886d25f2544d9c9 | https://dl.google.com/dl/android/maven2/com/android/tools/build/manifest-me…
+f35a8af6babede30bd48bf98d02d2499725f0902d56aeabe778da256b76d0768 | https://dl.google.com/dl/android/maven2/com/android/zipflinger/7.1.0/zipfli…
+88f6f0603aa947fa206e40ea03ea7e019a58eddb3a5a8f19cdab9849b4ad26e0 | https://dl.google.com/dl/android/maven2/com/android/zipflinger/7.1.0/zipfli…
+2c1c70bc240ab779ab4c07d19390c623d05e759c80653fbcdef2eeac299f00ab | https://dl.google.com/dl/android/maven2/com/android/zipflinger/7.1.0/zipfli…
+96623d7afc374800cfdc4eb1e49efdb1b17d762fbe9c7de0e46980de14473170 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-bom/3.19.1/proto…
+24f7d0d91797ed230a6d3da93cd80590a4c3aa9a27249f6025b5c6da078edde7 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-java/3.19.1/prot…
+5de4666f7f6b003d982f48f18c8e22facef6707365a74e20df7cbad98c931dd7 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-java/3.19.1/prot…
+83d413b2a79d6357d2ca78fd623143424e8f6ecc72cfa83bf2ae2ae258a93a44 | https://plugins.gradle.org/m2/com/google/protobuf/protobuf-parent/3.19.1/pr…
fcfb09fb0ea0aa97d3cfe7ea792398081348e468f126b3603cb3803f240197f0 | https://plugins.gradle.org/m2/com/squareup/javawriter/2.5.0/javawriter-2.5.…
e1abd7f1116cf5e0c59947693e2189208ec94296b2a3394c959e3511d399a7b0 | https://plugins.gradle.org/m2/com/squareup/javawriter/2.5.0/javawriter-2.5.…
-1d8518e3ac7532a104e4f7be77def37c982e530723c6bdb3d67708cce2b0c2c4 | https://plugins.gradle.org/m2/com/sun/activation/all/1.2.0/all-1.2.0.pom
-993302b16cd7056f21e779cc577d175a810bb4900ef73cd8fbf2b50f928ba9ce | https://plugins.gradle.org/m2/com/sun/activation/javax.activation/1.2.0/jav…
-f879b6e945854c6900b0dbee1c8384d7ab3de7e157fd7ac84937405c416d2a5e | https://plugins.gradle.org/m2/com/sun/activation/javax.activation/1.2.0/jav…
-c33e67a0807095f02a0e2da139412dd7c4f9cc1a4c054b3e434f96831ba950f4 | https://plugins.gradle.org/m2/com/sun/istack/istack-commons-runtime/2.21/is…
-ebe7137b5fbfd050545f9a7f3f339ae55beb0b53755071b4fd62aa024c626d1c | https://plugins.gradle.org/m2/com/sun/istack/istack-commons-runtime/2.21/is…
-c3071277f89b162982606b4e65c92077212efb6cbf1bdc365c51bd0b57ac818c | https://plugins.gradle.org/m2/com/sun/istack/istack-commons/2.21/istack-com…
-b25e0693de21cb92b039a2e4608f396590fb8773108f10d6dc9f1465f03b5be9 | https://plugins.gradle.org/m2/com/sun/xml/bind/jaxb-bom-ext/2.2.11/jaxb-bom…
-b5301b711c01547e571b615f9a0832ee525d34a4ce3372f53907a87cf20b0480 | https://plugins.gradle.org/m2/com/sun/xml/bind/mvn/jaxb-parent/2.2.11/jaxb-…
-21918cb8e4eda67f24251e909a5d81672201d93604c4ffbf33522ad836a58e90 | https://plugins.gradle.org/m2/com/sun/xml/bind/mvn/jaxb-runtime-parent/2.2.…
-9a398c699a5d3f3b56f1056c68890ede25d94a12d98eabc2a473733e6ab2362c | https://plugins.gradle.org/m2/com/sun/xml/bind/mvn/jaxb-txw-parent/2.2.11/j…
-27a77db909f3c2833c0b1a37c55af1db06045118ad2eed96ce567b6632bce038 | https://plugins.gradle.org/m2/com/sun/xml/fastinfoset/FastInfoset/1.2.13/Fa…
-b7505e0ecf7d495b4daa3e6569f71611d1a789dc531cbd92a2025922ff2655d3 | https://plugins.gradle.org/m2/com/sun/xml/fastinfoset/FastInfoset/1.2.13/Fa…
-fd0857899f1067e0287c2ffd91e38f967a26bd405b83a34650c2742cee9fc261 | https://plugins.gradle.org/m2/com/sun/xml/fastinfoset/fastinfoset-project/1…
-4241dfa94e711d435f29a4604a3e2de5c4aa3c165e23bd066be6fc1fc4309569 | https://plugins.gradle.org/m2/commons-codec/commons-codec/1.10/commons-code…
-bdb8db7012d112a6e3ea8fdb7c510b300d99eff0819d27dddba9c43397ea4cfb | https://plugins.gradle.org/m2/commons-codec/commons-codec/1.10/commons-code…
-cc6a41dc3eaacc9e440a6bd0d2890b20d36b4ee408fe2d67122f328bb6e01581 | https://plugins.gradle.org/m2/commons-io/commons-io/2.4/commons-io-2.4.jar
-b2b5dd46cf998fa626eb6f8a1c114f6167c8d392694164e62533e5898e9b31f2 | https://plugins.gradle.org/m2/commons-io/commons-io/2.4/commons-io-2.4.pom
-daddea1ea0be0f56978ab3006b8ac92834afeefbd9b7e4e6316fca57df0fa636 | https://plugins.gradle.org/m2/commons-logging/commons-logging/1.2/commons-l…
-c91ab5aa570d86f6fd07cc158ec6bc2c50080402972ee9179fe24100739fbb20 | https://plugins.gradle.org/m2/commons-logging/commons-logging/1.2/commons-l…
-74fa208043740642f7e6eb09faba15965218ad2f50ce3020efb100136e4b591c | https://plugins.gradle.org/m2/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.jar
-953b116521a73575eee990e3f2c36a892fb088bb2d9a3027c82193cb7a013ef7 | https://plugins.gradle.org/m2/it/unimi/dsi/fastutil/7.2.0/fastutil-7.2.0.pom
-91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff | https://plugins.gradle.org/m2/javax/inject/javax.inject/1/javax.inject-1.jar
-943e12b100627804638fa285805a0ab788a680266531e650921ebfe4621a8bfa | https://plugins.gradle.org/m2/javax/inject/javax.inject/1/javax.inject-1.pom
-b5e60cd8b7b5ff01ce4a74c5dd008f4fbd14ced3495d0b47b85cfedc182211f2 | https://plugins.gradle.org/m2/javax/xml/bind/jaxb-api/2.2.12-b140109.1041/j…
-2092a7d8d9bc5698c59b094bdea46622915c48c83ae66d5b5ad549c7bf16155b | https://plugins.gradle.org/m2/javax/xml/bind/jaxb-api/2.2.12-b140109.1041/j…
-281440811268e65d9e266b3cc898297e214e04f09740d0386ceeb4a8923d63bf | https://plugins.gradle.org/m2/net/java/jvnet-parent/1/jvnet-parent-1.pom
-30f5789efa39ddbf96095aada3fc1260c4561faf2f714686717cb2dc5049475a | https://plugins.gradle.org/m2/net/java/jvnet-parent/3/jvnet-parent-3.pom
-471395735549495297c8ff939b9a32e08b91302020ff773586d27e497abb8fbb | https://plugins.gradle.org/m2/net/java/jvnet-parent/4/jvnet-parent-4.pom
-26c5856e954b5f864db76f13b86919b59c6eecf9fd930b96baa8884626baf2f5 | https://plugins.gradle.org/m2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simpl…
-7af7e2d8b24b4798f04c2b7da24c9fbd1b7557b4e017c2054481565916079092 | https://plugins.gradle.org/m2/net/sf/jopt-simple/jopt-simple/4.9/jopt-simpl…
-f264dd9f79a1fde10ce5ecc53221eff24be4c9331c830b7d52f2f08a7b633de2 | https://plugins.gradle.org/m2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.jar
-31ce606f4e9518936299bb0d27c978fa61e185fd1de7c9874fe959a53e34a685 | https://plugins.gradle.org/m2/net/sf/kxml/kxml2/2.3.0/kxml2-2.3.0.pom
-75bc89695fa66e75374ecda439b802406f0ab1d826dd386eed0a23b1f0a9d264 | https://plugins.gradle.org/m2/net/sf/proguard/proguard-base/6.0.3/proguard-…
-2a823d79f2675582a988d539466d1b175e939782efbe0f6e61f06cb165ed4907 | https://plugins.gradle.org/m2/net/sf/proguard/proguard-base/6.0.3/proguard-…
-cc12b1168e521491dd0e687cfebec11a4af874b22af70e10cf2a05b47ca00c8f | https://plugins.gradle.org/m2/net/sf/proguard/proguard-gradle/6.0.3/proguar…
-5a5c7317d68ce80d1d40c9d8bd4e38814d42d1b16c265146e333634833a35a57 | https://plugins.gradle.org/m2/net/sf/proguard/proguard-gradle/6.0.3/proguar…
-d87266bfd2312c3b036c4ac709310afa35c448ceb18027c3b87a33d03c6de0a0 | https://plugins.gradle.org/m2/net/sf/proguard/proguard-parent/6.0.3/proguar…
-401877d5e70ad599e9b6cff18434ea0332f637b51f8ec68352646c836f9bb2a4 | https://plugins.gradle.org/m2/org/antlr/antlr4-master/4.5.3/antlr4-master-4…
-a32de739cfdf515774e696f91aa9697d2e7731e5cb5045ca8a4b657f8b1b4fb4 | https://plugins.gradle.org/m2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.jar
-8a4e4b32eedaa72976a757e12cf1dfe742725db0b7311bf176dd937ba4236384 | https://plugins.gradle.org/m2/org/antlr/antlr4/4.5.3/antlr4-4.5.3.pom
-ff513db0361fd41237bef4784968bc15aae478d4ec0a9496f811072ccaf3841d | https://plugins.gradle.org/m2/org/apache/apache/13/apache-13.pom
-36c2f2f979ac67b450c0cb480e4e9baf6b40f3a681f22ba9692287d1139ad494 | https://plugins.gradle.org/m2/org/apache/apache/15/apache-15.pom
-9f85ff2fd7d6cb3097aa47fb419ee7f0ebe869109f98aba9f4eca3f49e74a40e | https://plugins.gradle.org/m2/org/apache/apache/16/apache-16.pom
-7831307285fd475bbc36b20ae38e7882f11c3153b1d5930f852d44eda8f33c17 | https://plugins.gradle.org/m2/org/apache/apache/18/apache-18.pom
-4946e60a547c8eda69f3bc23c5b6f0dadcf8469ea49b1d1da7de34aecfcf18dd | https://plugins.gradle.org/m2/org/apache/apache/9/apache-9.pom
-2c1542faf343185b7cab9c3d55c8ae5471d6d095d3887a4adefdbdf2984dc0b6 | https://plugins.gradle.org/m2/org/apache/commons/commons-compress/1.12/comm…
-b787d574c851505e76212968b9ae1641ea79804aef7f5a2cee2a01cd4055213a | https://plugins.gradle.org/m2/org/apache/commons/commons-compress/1.12/comm…
-467ae650442e876867379094e7518dfdd67d22c5352ebd39808c84259e9790ba | https://plugins.gradle.org/m2/org/apache/commons/commons-parent/25/commons-…
-3a2e69d06d641d1f3b293126dc9e2e4ea6563bf8c36c87e0ab6fa4292d04b79c | https://plugins.gradle.org/m2/org/apache/commons/commons-parent/34/commons-…
-7098a1ab8336ecd4c9dc21cbbcac869f82c66f64b8ac4f7988d41b4fcb44e49a | https://plugins.gradle.org/m2/org/apache/commons/commons-parent/35/commons-…
-87cd27e1a02a5c3eb6d85059ce98696bb1b44c2b8b650f0567c86df60fa61da7 | https://plugins.gradle.org/m2/org/apache/commons/commons-parent/39/commons-…
-c03f813195e7a80e3608d0ddd8da80b21696a4c92a6a2298865bf149071551c7 | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpclient/4.5.6/ht…
-7efc1241e73e7fbb268bfd33242d11ebd3ca07061d7d85f2962dc32a0f0b8855 | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpclient/4.5.6/ht…
-b042b41f2391edb00d35f7f4e509aed2123648c1d246ce58d0f7b905c9fe1f73 | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpcomponents-clie…
-61e9427d4be326c307a7f16ba828d1cb3b14713c9b04fc8ba992a58f376c3136 | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpcomponents-core…
-caaf967d94afb21753f36082c6086206bd1f48825ff596932cceba72b65d39fa | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpcomponents-pare…
-78ba1096561957db1b55200a159b648876430342d15d461277e62360da19f6fd | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpcore/4.4.10/htt…
-c5c12066df2b3b88a89a2c8602b81ea9a61627e976e5129eea1899ebbaea392b | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpcore/4.4.10/htt…
-0b2b1102c18d3c7e05a77214b9b7501a6f6056174ae5604e0e256776eda7553e | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpmime/4.5.6/http…
-dfbfd6ffe2a784ca9817c46365aa7f8a578320b805bde39d6f55a0b09d8aa8ca | https://plugins.gradle.org/m2/org/apache/httpcomponents/httpmime/4.5.6/http…
-7043dee4e9e7175e93e0b36f45b1ec1ecb893c5f755667e8b916eb8dd201c6ca | https://plugins.gradle.org/m2/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-j…
-321668fc474a73140eb9cc73c779f1ebb9f60948aade3beddee082ecefcf0259 | https://plugins.gradle.org/m2/org/bouncycastle/bcpkix-jdk15on/1.56/bcpkix-j…
-963e1ee14f808ffb99897d848ddcdb28fa91ddda867eb18d303e82728f878349 | https://plugins.gradle.org/m2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-j…
-8fdc3336e7b01873193ba9c48b87de7d788dc0954d1eb45c322492627a4b5c6e | https://plugins.gradle.org/m2/org/bouncycastle/bcprov-jdk15on/1.56/bcprov-j…
-64b02691c8b9d4e7700f8ee2e742dce7ea2c6e81e662b7522c9ee3bf568c040a | https://plugins.gradle.org/m2/org/checkerframework/checker-qual/2.5.2/check…
-dc4cd438a36462d013c2338c8e206d102a322a00f33729e8955ee219859c9ede | https://plugins.gradle.org/m2/org/checkerframework/checker-qual/2.5.2/check…
-92654f493ecfec52082e76354f0ebf87648dc3d5cec2e3c3cdb947c016747a53 | https://plugins.gradle.org/m2/org/codehaus/mojo/animal-sniffer-annotations/…
-e956ab5d2eb48fabae12300d0cd2d3294d4a2a41abc2068c23cb4d60ad76cbe5 | https://plugins.gradle.org/m2/org/codehaus/mojo/animal-sniffer-annotations/…
-18a03df16e2a184c582db7b125633c15fb7714027a84c1b532d72933dc08b81f | https://plugins.gradle.org/m2/org/codehaus/mojo/animal-sniffer-parent/1.17/…
-fc648dcdc404f8bf66e0583914ecf980176618201227bea114fae85043cb755e | https://plugins.gradle.org/m2/org/codehaus/mojo/mojo-parent/40/mojo-parent-…
-a52e6850f070dc9f7a2a51d0b25dfaafd49b0b9bf8196db6c0b3c5b7c94d8d38 | https://plugins.gradle.org/m2/org/glassfish/jaxb/jaxb-bom/2.2.11/jaxb-bom-2…
-37bcaee8ebb04362c8352a5bf6221b86967ecdab5164c696b10b9a2bb587b2aa | https://plugins.gradle.org/m2/org/glassfish/jaxb/jaxb-core/2.2.11/jaxb-core…
-ec31409f203bcabf99534f59231ec0576d875d4d4b7349b09566a7a8c8179b24 | https://plugins.gradle.org/m2/org/glassfish/jaxb/jaxb-core/2.2.11/jaxb-core…
-a874f2351cfba8e2946be3002d10c18a6da8f21b52ba2acf52f2b85d5520ed70 | https://plugins.gradle.org/m2/org/glassfish/jaxb/jaxb-runtime/2.2.11/jaxb-r…
-e5327b31b595ab8143e97836d5ccdf85feb91e7ff5666f7b26913632facca4aa | https://plugins.gradle.org/m2/org/glassfish/jaxb/jaxb-runtime/2.2.11/jaxb-r…
-272a3ccad45a4511351920cd2a8633c53cab8d5220c7a92954da5526bb5eafea | https://plugins.gradle.org/m2/org/glassfish/jaxb/txw2/2.2.11/txw2-2.2.11.jar
-8514cb724b4fca59a5cf272b632e539bd0a0f3cacf1844082d0a173a86406bd8 | https://plugins.gradle.org/m2/org/glassfish/jaxb/txw2/2.2.11/txw2-2.2.11.pom
-1345f11ba606d15603d6740551a8c21947c0215640770ec67271fe78bea97cf5 | https://plugins.gradle.org/m2/org/jdom/jdom2/2.0.6/jdom2-2.0.6.jar
-47b23a79fe336b741b82434c6e049d68165256e405e75c10921fd72fa8a65d8d | https://plugins.gradle.org/m2/org/jdom/jdom2/2.0.6/jdom2-2.0.6.pom
-ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478 | https://plugins.gradle.org/m2/org/jetbrains/annotations/13.0/annotations-13…
-965aeb2bedff369819bdde1bf7a0b3b89b8247dd69c88b86375d76163bb8c397 | https://plugins.gradle.org/m2/org/jetbrains/annotations/13.0/annotations-13…
-64583199ea5a54aefd1bd1595288925f784226ee562d1dd279011c6075b3d7a4 | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-reflect/1.3.50/ko…
-8745181e5a3e0bafefd46309c6b810df7253f379feb985131eaf8d4d9c302635 | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-reflect/1.3.50/ko…
-8ce678e88e4ba018b66dacecf952471e4d7dfee156a8a819760a5a5ff29d323c | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3…
-b6396fe802d7bc76a381485e266cb975f3b2f2d3dd9bf7213aab6ca27a561fc1 | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib-common/1.3…
-9a026639e76212f8d57b86d55b075394c2e009f1979110751d34c05c5f75d57b | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.5…
-a3aef46388ee96e975110db51df3ab794c87d892bdbc6d5a49bf926e4779438b | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.5…
-1b351fb6e09c14b55525c74c1f4cf48942eae43c348b7bc764a5e6e423d4da0c | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.5…
-8674b002f66a2948981c4f6cb5987ec62ff3d54b6a2799a6d2cd23afb83f2ad3 | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.5…
-e6f05746ee0366d0b52825a090fac474dcf44082c9083bbb205bd16976488d6c | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib/1.3.50/kot…
-704fd78960ae046428f69bcd5b951c122e4c180c9400238a866e12cb18494a61 | https://plugins.gradle.org/m2/org/jetbrains/kotlin/kotlin-stdlib/1.3.50/kot…
-1917871c8deb468307a584680c87a44572f5a8b0b98c6d397fc0f5f86596dbe7 | https://plugins.gradle.org/m2/org/jetbrains/trove4j/trove4j/20160824/trove4…
-c94b0b73790c70c709bcd445a01247908888211e38cc59e946ff6fe900785ae9 | https://plugins.gradle.org/m2/org/jetbrains/trove4j/trove4j/20160824/trove4…
-a31ff7d77163c0deb09e7fee59ad35ae44c2cee2cc8552a116ccd1583d813fb4 | https://plugins.gradle.org/m2/org/jvnet/staxex/stax-ex/1.7.7/stax-ex-1.7.7.…
-27cb450b6c367a00bd8362519907f84defac7b12086c64d4d6e97e33ab873ead | https://plugins.gradle.org/m2/org/jvnet/staxex/stax-ex/1.7.7/stax-ex-1.7.7.…
-2f1a6387219c3a6cc4856481f221b03bd9f2408a326d416af09af5d6f608c1f4 | https://plugins.gradle.org/m2/org/ow2/asm/asm-analysis/6.0/asm-analysis-6.0…
-d3aaf42e40e3e24aabda53b5de4de5e17cb78e06549bf37312dca6c77e251054 | https://plugins.gradle.org/m2/org/ow2/asm/asm-analysis/6.0/asm-analysis-6.0…
-f1bce5c648a96a017bdcd01fe5d59af9845297fd7b79b81c015a6fbbd9719abf | https://plugins.gradle.org/m2/org/ow2/asm/asm-commons/6.0/asm-commons-6.0.j…
-90f4f29473afb957229016eb5741954976cc1b67bc049b3981c0d1e653ad5cdd | https://plugins.gradle.org/m2/org/ow2/asm/asm-commons/6.0/asm-commons-6.0.p…
-791d064bb9ecc9a46d43bc9efecd74c91464dfc451f321b802d2261e2ccd7d14 | https://plugins.gradle.org/m2/org/ow2/asm/asm-parent/6.0/asm-parent-6.0.pom
-887998fb69727c8759e4d253f856822801e33f9fd4caa566b3ac58ee92106215 | https://plugins.gradle.org/m2/org/ow2/asm/asm-tree/6.0/asm-tree-6.0.jar
-36887e0d7fdb185a92378a38ea45e596a97f10f385c5d050eb6252454ee701b4 | https://plugins.gradle.org/m2/org/ow2/asm/asm-tree/6.0/asm-tree-6.0.pom
-356afebdb0f870175262e5188f8709a3b17aa2a5a6a4b0340b04d4b449bca5f6 | https://plugins.gradle.org/m2/org/ow2/asm/asm-util/6.0/asm-util-6.0.jar
-3cdfc61f988d167b97503419da82a5808b20f4205aeb46c394e6e7ffd3211f12 | https://plugins.gradle.org/m2/org/ow2/asm/asm-util/6.0/asm-util-6.0.pom
-dd8971c74a4e697899a8e95caae4ea8760ea6c486dc6b97b1795e75760420461 | https://plugins.gradle.org/m2/org/ow2/asm/asm/6.0/asm-6.0.jar
-c2bc497e197112e699085426bbb45b1ab0be8002da68267a3b1f450a0312c32e | https://plugins.gradle.org/m2/org/ow2/asm/asm/6.0/asm-6.0.pom
-51215c67d2c068d8b7d2f6f80f51372a098075deccc448d4bdd7b987ba8328fb | https://plugins.gradle.org/m2/org/ow2/ow2/1.3/ow2-1.3.pom
+cda4de455fab48ff0bcb7c48b4639447d4de859a7afc30a094a986f0936beba2 | https://plugins.gradle.org/m2/org/ow2/asm/asm/9.1/asm-9.1.jar
+c683a90dd68f2b1788cbdfc4647ea9405ef5925b371c199f8fd39d44d3cede8d | https://plugins.gradle.org/m2/org/ow2/asm/asm/9.1/asm-9.1.pom
+0f8a1b116e760b8fe6389c51b84e4b07a70fc11082d4f936e453b583dd50b43b | https://plugins.gradle.org/m2/org/ow2/ow2/1.5/ow2-1.5.pom
b51f8867c92b6a722499557fc3a1fdea77bdf9ef574722fe90ce436a29559454 | https://plugins.gradle.org/m2/org/sonatype/oss/oss-parent/7/oss-parent-7.pom
-fb40265f982548212ff82e362e59732b2187ec6f0d80182885c14ef1f982827a | https://plugins.gradle.org/m2/org/sonatype/oss/oss-parent/9/oss-parent-9.pom
-
=====================================
projects/oss-licenses-plugin/sort-dependencies-pr-268.patch
=====================================
@@ -0,0 +1,144 @@
+From 1e7b29bc4db8cbcfc468e3df4a649113efa3b876 Mon Sep 17 00:00:00 2001
+From: Da Risk <da_risk(a)geekorum.com>
+Date: Wed, 17 May 2023 16:42:10 -0400
+Subject: [PATCH 1/2] oss-license-plugin: sort ArtifactInfo into list
+
+This should ensure that the output of third_party_licenses and third_party_licenses_metadata is sorted.
+Sorting the output will make it reproducible regardless of the input ordering.
+---
+ .../oss/licenses/plugin/DependencyTask.groovy | 5 +++--
+ .../gms/oss/licenses/plugin/LicensesTask.groovy | 4 ++--
+ .../oss/licenses/plugin/DependencyTaskTest.java | 17 ++++++++++++-----
+ 3 files changed, 17 insertions(+), 9 deletions(-)
+
+diff --git a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy
+index c7848735..5dbfbb30 100644
+--- a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy
++++ b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy
+@@ -76,7 +76,7 @@ abstract class DependencyTask extends DefaultTask {
+ } as AppDependencies
+ }
+
+- private static Set<ArtifactInfo> convertDependenciesToArtifactInfo(
++ private static List<ArtifactInfo> convertDependenciesToArtifactInfo(
+ AppDependencies appDependencies
+ ) {
+ return appDependencies.libraryList.stream()
+@@ -88,7 +88,8 @@ abstract class DependencyTask extends DefaultTask {
+ library.mavenLibrary.version
+ )
+ }
+- .collect(Collectors.toUnmodifiableSet())
++ .sorted(Comparator.comparing { it.toString() })
++ .collect(Collectors.toUnmodifiableList())
+ }
+
+ private static void initOutput(File outputDir) {
+diff --git a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy
+index 851846b5..43db6652 100644
+--- a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy
++++ b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy
+@@ -107,14 +107,14 @@ abstract class LicensesTask extends DefaultTask {
+ writeMetadata()
+ }
+
+- private static Set<ArtifactInfo> loadDependenciesJson(File jsonFile) {
++ private static List<ArtifactInfo> loadDependenciesJson(File jsonFile) {
+ def allDependencies = new JsonSlurper().parse(jsonFile)
+ def artifactInfoSet = new HashSet<ArtifactInfo>()
+ for (entry in allDependencies) {
+ ArtifactInfo artifactInfo = artifactInfoFromEntry(entry)
+ artifactInfoSet.add(artifactInfo)
+ }
+- artifactInfoSet.asImmutable()
++ artifactInfoSet.toList().asImmutable()
+ }
+
+ private void addDebugLicense() {
+diff --git a/oss-licenses-plugin/src/test/java/com/google/android/gms/oss/licenses/plugin/DependencyTaskTest.java b/oss-licenses-plugin/src/test/java/com/google/android/gms/oss/licenses/plugin/DependencyTaskTest.java
+index e35a5490..50760521 100644
+--- a/oss-licenses-plugin/src/test/java/com/google/android/gms/oss/licenses/plugin/DependencyTaskTest.java
++++ b/oss-licenses-plugin/src/test/java/com/google/android/gms/oss/licenses/plugin/DependencyTaskTest.java
+@@ -29,6 +29,9 @@
+ import java.io.OutputStream;
+ import java.lang.reflect.Type;
+ import java.util.Collection;
++import java.util.Comparator;
++import java.util.List;
++import java.util.stream.Collectors;
+ import org.gradle.api.Project;
+ import org.gradle.testfixtures.ProjectBuilder;
+ import org.junit.Before;
+@@ -84,8 +87,8 @@ public void testAction_valuesConvertedToJson() throws Exception {
+ File outputJson = new File(outputDir, "test.json");
+ dependencyTask.getDependenciesJson().set(outputJson);
+ ImmutableSet<ArtifactInfo> expectedArtifacts = ImmutableSet.of(
+- new ArtifactInfo("org.group.id", "artifactId", "1.0.0"),
+- new ArtifactInfo("org.group.other", "other-artifact", "3.2.1")
++ new ArtifactInfo("org.group.other", "other-artifact", "3.2.1"),
++ new ArtifactInfo("org.group.id", "artifactId", "1.0.0")
+ );
+ AppDependencies appDependencies = createAppDependencies(expectedArtifacts);
+ File protoFile = writeAppDependencies(appDependencies, temporaryFolder.newFile());
+@@ -102,8 +105,8 @@ public void testAction_withNonMavenDeps_nonMavenDepsIgnored() throws Exception {
+ File outputJson = new File(outputDir, "test.json");
+ dependencyTask.getDependenciesJson().set(outputJson);
+ ImmutableSet<ArtifactInfo> expectedArtifacts = ImmutableSet.of(
+- new ArtifactInfo("org.group.id", "artifactId", "1.0.0"),
+- new ArtifactInfo("org.group.other", "other-artifact", "3.2.1")
++ new ArtifactInfo("org.group.other", "other-artifact", "3.2.1"),
++ new ArtifactInfo("org.group.id", "artifactId", "1.0.0")
+ );
+ AppDependencies appDependencies = createAppDependencies(expectedArtifacts).toBuilder()
+ .addLibrary(Library.getDefaultInstance()) // There aren't any other library types supported.
+@@ -131,11 +134,15 @@ public void testAction_depFileAbsent_writesAbsentDep() throws Exception {
+ private void verifyExpectedDependencies(ImmutableSet<ArtifactInfo> expectedArtifacts,
+ File outputJson) throws Exception {
+ Gson gson = new Gson();
++ List<ArtifactInfo> expectedArtifactsSorted = expectedArtifacts
++ .stream()
++ .sorted(Comparator.comparing(ArtifactInfo::toString))
++ .collect(Collectors.toUnmodifiableList());
+ try (FileReader reader = new FileReader(outputJson)) {
+ Type collectionOfArtifactInfo = new TypeToken<Collection<ArtifactInfo>>() {
+ }.getType();
+ Collection<ArtifactInfo> jsonArtifacts = gson.fromJson(reader, collectionOfArtifactInfo);
+- assertThat(jsonArtifacts).containsExactlyElementsIn(expectedArtifacts);
++ assertThat(jsonArtifacts).containsExactlyElementsIn(expectedArtifactsSorted).inOrder();
+ }
+ }
+
+
+From 0ae426b1fe52ef70770d10050402413a22bd8dba Mon Sep 17 00:00:00 2001
+From: Da Risk <da_risk(a)geekorum.com>
+Date: Fri, 19 May 2023 21:22:26 -0400
+Subject: [PATCH 2/2] oss-license-plugin: Sort dependencies loaded for
+ LicensesTask
+
+---
+ .../android/gms/oss/licenses/plugin/LicensesTask.groovy | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy
+index 43db6652..7dac8aae 100644
+--- a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy
++++ b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/LicensesTask.groovy
+@@ -25,6 +25,7 @@ import org.gradle.api.tasks.OutputFile
+ import org.gradle.api.tasks.TaskAction
+ import org.slf4j.LoggerFactory
+
++import java.util.stream.Collectors
+ import java.util.zip.ZipEntry
+ import java.util.zip.ZipFile
+
+@@ -114,7 +115,9 @@ abstract class LicensesTask extends DefaultTask {
+ ArtifactInfo artifactInfo = artifactInfoFromEntry(entry)
+ artifactInfoSet.add(artifactInfo)
+ }
+- artifactInfoSet.toList().asImmutable()
++ artifactInfoSet.stream()
++ .sorted(Comparator.comparing { it.toString() })
++ .collect(Collectors.toUnmodifiableList())
+ }
+
+ private void addDebugLicense() {
=====================================
projects/oss-licenses-plugin/sort-dependencies.diff deleted
=====================================
@@ -1,40 +0,0 @@
-diff --git a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/ArtifactInfo.groovy b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/ArtifactInfo.groovy
-index d6d854d..622072d 100644
---- a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/ArtifactInfo.groovy
-+++ b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/ArtifactInfo.groovy
-@@ -16,7 +16,7 @@
-
- package com.google.android.gms.oss.licenses.plugin
-
--class ArtifactInfo {
-+class ArtifactInfo implements Comparable<ArtifactInfo> {
- private String group
- private String name
- private String fileLocation
-@@ -47,4 +47,13 @@ class ArtifactInfo {
- String getVersion() {
- return version
- }
-+
-+ String toString() {
-+ return "$group:$name:$version"
-+ }
-+
-+ @Override
-+ int compareTo(ArtifactInfo other) {
-+ return toString().compareTo(other.toString())
-+ }
- }
-diff --git a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy
-index 75f6527..26a9bf7 100644
---- a/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy
-+++ b/oss-licenses-plugin/src/main/groovy/com/google/android/gms/oss/licenses/plugin/DependencyTask.groovy
-@@ -47,7 +47,7 @@ import org.slf4j.LoggerFactory
- */
- class DependencyTask extends DefaultTask {
- protected Set<String> artifactSet = []
-- protected Set<ArtifactInfo> artifactInfos = []
-+ protected TreeSet<ArtifactInfo> artifactInfos = []
- protected static final String LOCAL_LIBRARY_VERSION = "unspecified"
- private static final String TEST_PREFIX = "test"
- private static final String ANDROID_TEST_PREFIX = "androidTest"
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][tor-browser-140.0a1-15.0-1] 4 commits: fixup! TB 42669: [android] Use custom no-op app-services
by Dan Ballard (@dan) 17 Jun '25
by Dan Ballard (@dan) 17 Jun '25
17 Jun '25
Dan Ballard pushed to branch tor-browser-140.0a1-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
4d19dc54 by Beatriz Rizental at 2025-06-17T14:39:17-07:00
fixup! TB 42669: [android] Use custom no-op app-services
- - - - -
7d929101 by Beatriz Rizental at 2025-06-17T14:39:17-07:00
Revert "TB 40185: [android] Use NimbusDisabled"
This reverts commit c98c78c527f11856aab9f7e16ff503f267e665e2.
- - - - -
0235f26b by Beatriz Rizental at 2025-06-17T14:39:17-07:00
[android] Override settings
- - - - -
d5bc2018 by Beatriz Rizental at 2025-06-17T14:39:17-07:00
fixup! [android] Override settings
Disable the tab-strip experiment for all channels. Having this
experiment enabled overrides the toolbar position to always be on the
top, which we don't want.
- - - - -
19 changed files:
- mobile/android/android-components/components/browser/storage-sync/src/main/java/mozilla/components/browser/storage/sync/RemoteTabsStorage.kt
- mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/AccountEvent.kt
- mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/FxaDeviceConstellation.kt
- mobile/android/android-components/components/service/nimbus/src/main/java/mozilla/components/service/nimbus/messaging/NimbusMessagingController.kt
- mobile/android/android-components/components/service/nimbus/src/main/java/mozilla/components/service/nimbus/messaging/NimbusMessagingStorage.kt
- mobile/android/android-components/plugins/dependencies/src/main/java/ApplicationServices.kt
- mobile/android/fenix/app/nimbus.fml.yaml
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/NimbusComponents.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/onboarding/FenixOnboarding.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/onboarding/ReEngagementNotificationWorker.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt
- mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
Changes:
=====================================
mobile/android/android-components/components/browser/storage-sync/src/main/java/mozilla/components/browser/storage/sync/RemoteTabsStorage.kt
=====================================
@@ -161,6 +161,7 @@ class RemoteTabsCommandQueue(
.groupBy {
when (it.command) {
is RemoteCommand.CloseTab -> PendingCommandGroup.Key.CloseTab(it.deviceId)
+ is RemoteCommand.__NOOP -> PendingCommandGroup.Key.Noop(it.deviceId)
// Add `is ... ->` branches for future pending commands here...
}.asAnyKey
}
@@ -184,6 +185,13 @@ class RemoteTabsCommandQueue(
pendingCommands = pendingCommands,
)
}
+ is PendingCommandGroup.Key.Noop -> {
+ PendingCommandGroup(
+ deviceId = key.deviceId,
+ command = DeviceCommandOutgoing.Noop(),
+ pendingCommands = pendingCommands,
+ )
+ }
// Add `is ... ->` branches for future pending command grouping keys here...
}.asAnyGroup
}
@@ -279,6 +287,7 @@ class RemoteTabsCommandQueue(
sealed interface Key {
data class CloseTab(val deviceId: String) : Key
+ data class Noop(val deviceId: String) : Key
// Add data classes for future pending command grouping keys here...
/** Returns this grouping key as a type-erased [Key]. */
=====================================
mobile/android/android-components/components/concept/sync/src/main/java/mozilla/components/concept/sync/AccountEvent.kt
=====================================
@@ -55,6 +55,9 @@ sealed class DeviceCommandIncoming {
* Outgoing device commands (ie, targeted at other devices.)
*/
sealed class DeviceCommandOutgoing {
+ /** A command to do nothing */
+ class Noop() : DeviceCommandOutgoing()
+
/** A command to open a tab on another device */
class SendTab(val title: String, val url: String) : DeviceCommandOutgoing()
=====================================
mobile/android/android-components/components/service/firefox-accounts/src/main/java/mozilla/components/service/fxa/FxaDeviceConstellation.kt
=====================================
@@ -195,8 +195,10 @@ class FxaDeviceConstellation(
is RustCloseTabsResult.Ok -> Result.success(true)
is RustCloseTabsResult.TabsNotClosed ->
Result.failure(SendCommandException.TabsNotClosed(closeTabsResult.urls))
+ is RustCloseTabsResult.__NOOP -> Result.success(false)
}
}
+ is DeviceCommandOutgoing.Noop -> Result.success(false)
}
val errors: List<Throwable> = SyncTelemetry.processFxaTelemetry(account.gatherTelemetry())
for (error in errors) {
=====================================
mobile/android/android-components/components/service/nimbus/src/main/java/mozilla/components/service/nimbus/messaging/NimbusMessagingController.kt
=====================================
@@ -96,32 +96,32 @@ open class NimbusMessagingController(
* creates a URI string for the message action.
*/
@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
- open fun processMessageActionToUri(message: Message): Uri {
+ fun processMessageActionToUri(message: Message): Uri {
val (uuid, action) = messagingStorage.generateUuidAndFormatMessage(message)
sendClickedMessageTelemetry(message.id, uuid)
return convertActionIntoDeepLinkSchemeUri(action)
}
- open fun sendDismissedMessageTelemetry(messageId: String) {
+ private fun sendDismissedMessageTelemetry(messageId: String) {
GleanMessaging.messageDismissed.record(GleanMessaging.MessageDismissedExtra(messageId))
}
- open fun sendShownMessageTelemetry(messageId: String) {
+ private fun sendShownMessageTelemetry(messageId: String) {
GleanMessaging.messageShown.record(GleanMessaging.MessageShownExtra(messageId))
}
- open fun sendExpiredMessageTelemetry(messageId: String) {
+ private fun sendExpiredMessageTelemetry(messageId: String) {
GleanMessaging.messageExpired.record(GleanMessaging.MessageExpiredExtra(messageId))
}
- open fun sendClickedMessageTelemetry(messageId: String, uuid: String?) {
+ private fun sendClickedMessageTelemetry(messageId: String, uuid: String?) {
GleanMessaging.messageClicked.record(
GleanMessaging.MessageClickedExtra(messageKey = messageId, actionUuid = uuid),
)
}
- open fun sendMicrosurveyCompletedTelemetry(messageId: String, answer: String) {
+ private fun sendMicrosurveyCompletedTelemetry(messageId: String, answer: String) {
Microsurvey.submitButtonTapped.record(
Microsurvey.SubmitButtonTappedExtra(
surveyId = messageId,
@@ -130,7 +130,7 @@ open class NimbusMessagingController(
)
}
- open fun convertActionIntoDeepLinkSchemeUri(action: String): Uri =
+ private fun convertActionIntoDeepLinkSchemeUri(action: String): Uri =
if (action.startsWith("://")) {
"$deepLinkScheme$action".toUri()
} else {
=====================================
mobile/android/android-components/components/service/nimbus/src/main/java/mozilla/components/service/nimbus/messaging/NimbusMessagingStorage.kt
=====================================
@@ -33,7 +33,7 @@ const val MESSAGING_FEATURE_ID = "messaging"
/**
* Provides messages from [messagingFeature] and combine with the metadata store on [metadataStorage].
*/
-open class NimbusMessagingStorage(
+class NimbusMessagingStorage(
private val context: Context,
private val metadataStorage: MessageMetadataStorage,
private val onMalformedMessage: (String) -> Unit = {
=====================================
mobile/android/android-components/plugins/dependencies/src/main/java/ApplicationServices.kt
=====================================
@@ -3,8 +3,8 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// These lines are generated by android-components/automation/application-services-nightly-bump.py
-val VERSION = "140.20250523140405"
-val CHANNEL = ApplicationServicesChannel.NIGHTLY
+val VERSION = "140.0-TORBROWSER"
+val CHANNEL = ApplicationServicesChannel.RELEASE
object ApplicationServicesConfig {
val version = VERSION
=====================================
mobile/android/fenix/app/nimbus.fml.yaml
=====================================
@@ -642,13 +642,13 @@ features:
defaults:
- channel: developer
value:
- enabled: true
+ enabled: false
- channel: nightly
value:
- enabled: true
+ enabled: false
- channel: beta
value:
- enabled: true
+ enabled: false
trending-searches:
description: Enables trending searches.
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/FenixApplication.kt
=====================================
@@ -212,7 +212,7 @@ open class FenixApplication : LocaleAwareApplication(), Provider {
//
// We can initialize Nimbus before Glean because Glean will queue messages
// before it's initialized.
- // initializeNimbus()
+ initializeNimbus()
ProfilerMarkerFactProcessor.create { components.core.engine.profiler }.register()
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/HomeActivity.kt
=====================================
@@ -124,6 +124,7 @@ import org.mozilla.fenix.ext.getNavDirections
import org.mozilla.fenix.ext.hasTopDestination
import org.mozilla.fenix.ext.nav
import org.mozilla.fenix.ext.openSetDefaultBrowserOption
+import org.mozilla.fenix.ext.recordEventInNimbus
import org.mozilla.fenix.ext.setNavigationIcon
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.extension.WebExtensionPromptFeature
@@ -458,7 +459,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, TorAn
if (!shouldShowOnboarding) {
lifecycleScope.launch(IO) {
- // showFullscreenMessageIfNeeded(applicationContext)
+ showFullscreenMessageIfNeeded(applicationContext)
}
// Unless the activity is recreated, navigate to home first (without rendering it)
@@ -498,7 +499,7 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, TorAn
),
)
// This will record an event in Nimbus' internal event store. Used for behavioral targeting
- // recordEventInNimbus("app_opened")
+ recordEventInNimbus("app_opened")
if (safeIntent.action.equals(ACTION_OPEN_PRIVATE_TAB) && source == APP_ICON) {
AppIcon.newPrivateTabTapped.record(NoExtras())
@@ -1549,12 +1550,10 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, TorAn
keyDismissButtonText = null,
)
- /*
researchSurfaceDialogFragment.onAccept = {
processIntent(messaging.getIntentForMessage(nextMessage))
components.appStore.dispatch(AppAction.MessagingAction.MessageClicked(nextMessage))
}
- */
researchSurfaceDialogFragment.onDismiss = {
components.appStore.dispatch(AppAction.MessagingAction.MessageDismissed(nextMessage))
@@ -1567,10 +1566,10 @@ open class HomeActivity : LocaleAwareAppCompatActivity(), NavHostActivity, TorAn
)
}
-// // Update message as displayed.
-// val currentBootUniqueIdentifier = BootUtils.getBootIdentifier(context)
-//
-// messaging.onMessageDisplayed(nextMessage, currentBootUniqueIdentifier)
+ // Update message as displayed.
+ val currentBootUniqueIdentifier = BootUtils.getBootIdentifier(context)
+
+ messaging.onMessageDisplayed(nextMessage, currentBootUniqueIdentifier)
}
private fun showCrashReporter() {
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/browser/BrowserFragment.kt
=====================================
@@ -598,7 +598,7 @@ class BrowserFragment : BaseBrowserFragment(), UserInteractionHandler {
override fun navToQuickSettingsSheet(tab: SessionState, sitePermissions: SitePermissions?) {
val useCase = requireComponents.useCases.trackingProtectionUseCases
- // FxNimbus.features.cookieBanners.recordExposure()
+ FxNimbus.features.cookieBanners.recordExposure()
useCase.containsException(tab.id) { hasTrackingProtectionException ->
lifecycleScope.launch {
val cookieBannersStorage = requireComponents.core.cookieBannersStorage
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/BackgroundServices.kt
=====================================
@@ -49,6 +49,7 @@ import org.mozilla.fenix.GleanMetrics.SyncAuth
import org.mozilla.fenix.R
import org.mozilla.fenix.ext.components
import org.mozilla.fenix.ext.maxActiveTime
+import org.mozilla.fenix.ext.recordEventInNimbus
import org.mozilla.fenix.ext.settings
import org.mozilla.fenix.perf.StrictModeManager
import org.mozilla.fenix.perf.lazyMonitored
@@ -266,7 +267,7 @@ internal class TelemetryAccountObserver(
// User signed-in into an existing FxA account.
AuthType.Signin -> {
SyncAuth.signIn.record(NoExtras())
- // context.recordEventInNimbus("sync_auth.sign_in")
+ context.recordEventInNimbus("sync_auth.sign_in")
}
// User created a new FxA account.
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/components/NimbusComponents.kt
=====================================
@@ -5,28 +5,17 @@
package org.mozilla.fenix.components
import android.content.Context
-import android.content.Intent
-import android.net.Uri
import mozilla.components.service.nimbus.NimbusApi
-import mozilla.components.service.nimbus.NimbusDisabled
import mozilla.components.service.nimbus.messaging.FxNimbusMessaging
-import mozilla.components.service.nimbus.messaging.Message
-import mozilla.components.service.nimbus.messaging.Message.Metadata
-import mozilla.components.service.nimbus.messaging.MessageData
-import mozilla.components.service.nimbus.messaging.MessageMetadataStorage
-import mozilla.components.service.nimbus.messaging.MessageSurfaceId
import mozilla.components.service.nimbus.messaging.NimbusMessagingController
import mozilla.components.service.nimbus.messaging.NimbusMessagingControllerInterface
import mozilla.components.service.nimbus.messaging.NimbusMessagingStorage
import mozilla.components.service.nimbus.messaging.OnDiskMessageMetadataStorage
-import mozilla.components.service.nimbus.messaging.StyleData
import org.mozilla.experiments.nimbus.NimbusEventStore
import org.mozilla.experiments.nimbus.NimbusMessagingHelperInterface
-import org.mozilla.experiments.nimbus.NullNimbus
import org.mozilla.fenix.BuildConfig
import org.mozilla.fenix.experiments.createNimbus
import org.mozilla.fenix.messaging.CustomAttributeProvider
-import org.mozilla.fenix.nimbus.FxNimbus
import org.mozilla.fenix.perf.lazyMonitored
/**
@@ -39,14 +28,7 @@ class NimbusComponents(private val context: Context) {
* should be mediated through a FML generated class, e.g. [FxNimbus].
*/
val sdk: NimbusApi by lazyMonitored {
- if (BuildConfig.DATA_COLLECTION_DISABLED) {
- NimbusDisabled(context)
- } else {
- createNimbus(context, BuildConfig.NIMBUS_ENDPOINT).also { api ->
- FxNimbus.api = api
- }
- }
-
+ createNimbus(context, BuildConfig.NIMBUS_ENDPOINT)
}
/**
@@ -62,8 +44,7 @@ class NimbusComponents(private val context: Context) {
* the JEXL helper available from [createJexlHelper].
*/
val events: NimbusEventStore by lazyMonitored {
- NullNimbus(context)
- //sdk.events
+ sdk.events
}
/**
@@ -97,7 +78,7 @@ class NimbusComponents(private val context: Context) {
* from the Nimbus Messaging component.
*/
val messaging: NimbusMessagingControllerInterface by lazyMonitored {
- NullNimbusMessagingController(
+ NimbusMessagingController(
messagingStorage = messagingStorage,
deepLinkScheme = BuildConfig.DEEP_LINK_SCHEME,
)
@@ -111,132 +92,10 @@ class NimbusComponents(private val context: Context) {
private val messagingStorage by lazyMonitored {
NimbusMessagingStorage(
context = context,
- metadataStorage = NullMessageMetadataStorage(), //OnDiskMessageMetadataStorage(context),
+ metadataStorage = OnDiskMessageMetadataStorage(context),
nimbus = sdk,
messagingFeature = FxNimbusMessaging.features.messaging,
attributeProvider = CustomAttributeProvider,
)
}
}
-// Noop impl of MessageMetadataStorage to replace OnDiskMessageMetadataStorage
-class NullMessageMetadataStorage(): MessageMetadataStorage {
- override suspend fun getMetadata(): Map<String, Message.Metadata> {
- var metadataMap: MutableMap<String, Message.Metadata> = hashMapOf()
- return metadataMap
- }
-
- override suspend fun addMetadata(metadata: Message.Metadata): Message.Metadata {
- return metadata
- }
-
- override suspend fun updateMetadata(metadata: Message.Metadata) {
- // noop
- }
-}
-
-class NullNimbusMessagingController(
- messagingStorage: NimbusMessagingStorage,
- deepLinkScheme: String,
-) : NimbusMessagingController(messagingStorage, deepLinkScheme) {
-
- private val nullMessage: Message = Message(
- id = "",
- data = MessageData(),
- action = "",
- style = StyleData(),
- triggerIfAll = listOf(),
- excludeIfAny = listOf(),
- metadata = Metadata(""),
- )
-
- override suspend fun onMessageDisplayed(displayedMessage: Message, bootIdentifier: String?): Message {
- return nullMessage
- }
-
- /**
- * Called when a message has been dismissed by the user.
- *
- * Records a messageDismissed event, and records that the message
- * has been dismissed.
- */
- override suspend fun onMessageDismissed(message: Message) {
- return
- }
-
- /**
- * Called when a microsurvey attached to a message has been completed by the user.
- *
- * @param message The message containing the microsurvey that was completed.
- * @param answer The user's response to the microsurvey question.
- */
- override suspend fun onMicrosurveyCompleted(message: Message, answer: String) {
- return
- }
-
- /**
- * Called once the user has clicked on a message.
- *
- * This records that the message has been clicked on, but does not record a
- * glean event. That should be done via [processMessageActionToUri].
- */
- override suspend fun onMessageClicked(message: Message) {
- return
- }
-
- /**
- * Create and return the relevant [Intent] for the given [Message].
- *
- * @param message the [Message] to create the [Intent] for.
- * @return an [Intent] using the processed [Message].
- */
- override fun getIntentForMessage(message: Message) = Intent()
-
- /**
- * Will attempt to get the [Message] for the given [id].
- *
- * @param id the [Message.id] of the [Message] to try to match.
- * @return the [Message] with a matching [id], or null if no [Message] has a matching [id].
- */
- override suspend fun getMessage(id: String): Message? {
- return nullMessage
- }
-
- /**
- * The [message] action needs to be examined for string substitutions
- * and any `uuid` needs to be recorded in the Glean event.
- *
- * We call this `process` as it has a side effect of logging a Glean event while it
- * creates a URI string for the message action.
- */
- override fun processMessageActionToUri(message: Message): Uri {
- return Uri.EMPTY
- }
-
- override fun sendDismissedMessageTelemetry(messageId: String) {
- return
- }
-
- override fun sendShownMessageTelemetry(messageId: String) {
- return
- }
-
- override fun sendExpiredMessageTelemetry(messageId: String) {
- return
- }
-
- override fun sendClickedMessageTelemetry(messageId: String, uuid: String?) {
- return
- }
-
- override fun sendMicrosurveyCompletedTelemetry(messageId: String, answer: String) {
- return
- }
-
- override fun convertActionIntoDeepLinkSchemeUri(action: String): Uri = Uri.EMPTY
-
- override suspend fun getMessages(): List<Message> = listOf()
-
- override suspend fun getNextMessage(surfaceId: MessageSurfaceId) = nullMessage
-
- override fun getNextMessage(surfaceId: MessageSurfaceId, messages: List<Message>) = nullMessage
-}
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
=====================================
@@ -581,7 +581,7 @@ class HomeFragment : Fragment(), UserInteractionHandler {
disableAppBarDragging()
- // FxNimbus.features.homescreen.recordExposure()
+ FxNimbus.features.homescreen.recordExposure()
// DO NOT MOVE ANYTHING BELOW THIS addMarker CALL!
requireComponents.core.engine.profiler?.addMarker(
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/onboarding/FenixOnboarding.kt
=====================================
@@ -33,7 +33,7 @@ class FenixOnboarding(context: Context) : PreferencesHolder {
// - We would like to evaluate the configuration only once (and thus it's kept in memory
// and not re-evaluated)
val config by lazy {
- // FxNimbus.features.onboarding.recordExposure()
+ FxNimbus.features.onboarding.recordExposure()
FxNimbus.features.onboarding.value()
}
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/onboarding/ReEngagementNotificationWorker.kt
=====================================
@@ -45,7 +45,7 @@ class ReEngagementNotificationWorker(
// Recording the exposure event here to capture all users who met all criteria to receive
// the re-engagement notification
- // FxNimbus.features.reEngagementNotification.recordExposure()
+ FxNimbus.features.reEngagementNotification.recordExposure()
if (!settings.reEngagementNotificationEnabled) {
return Result.success()
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/SettingsFragment.kt
=====================================
@@ -216,14 +216,11 @@ class SettingsFragment : PreferenceFragmentCompat(), UserInteractionHandler {
override fun onResume() {
super.onResume()
- // IN TOR BROWSER: We don't talk about Nimbus!
- // ~Use nimbus to set the title, and a trivial addition~
- // val nimbusValidation = FxNimbus.features.nimbusValidation.value()
+ // Use nimbus to set the title, and a trivial addition
+ val nimbusValidation = FxNimbus.features.nimbusValidation.value()
- // val title = nimbusValidation.settingsTitle
- // val suffix = nimbusValidation.settingsPunctuation
- val title = getString(R.string.settings_title)
- val suffix = ""
+ val title = nimbusValidation.settingsTitle
+ val suffix = nimbusValidation.settingsPunctuation
showToolbar("$title$suffix")
@@ -819,7 +816,7 @@ class SettingsFragment : PreferenceFragmentCompat(), UserInteractionHandler {
@VisibleForTesting
internal fun setupCookieBannerPreference() {
- // FxNimbus.features.cookieBanners.recordExposure()
+ FxNimbus.features.cookieBanners.recordExposure()
if (context?.settings()?.shouldShowCookieBannerUI == false) return
with(requirePreference<SwitchPreference>(R.string.pref_key_cookie_banner_private_mode)) {
isVisible = context.settings().shouldShowCookieBannerUI
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/settings/advanced/DefaultLocaleSettingsController.kt
=====================================
@@ -40,7 +40,7 @@ class DefaultLocaleSettingsController(
LocaleManager.updateBaseConfiguration(activity, locale)
// Invalidate cached values to use the new locale
- // FxNimbus.features.nimbusValidation.withCachedValue(null)
+ FxNimbus.features.nimbusValidation.withCachedValue(null)
activity.recreate()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
activity.overrideActivityTransition(Activity.OVERRIDE_TRANSITION_OPEN, 0, 0)
@@ -60,7 +60,7 @@ class DefaultLocaleSettingsController(
LocaleManager.updateBaseConfiguration(activity, localeSettingsStore.state.localeList[0])
// Invalidate cached values to use the default locale
- // FxNimbus.features.nimbusValidation.withCachedValue(null)
+ FxNimbus.features.nimbusValidation.withCachedValue(null)
activity.recreate()
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
activity.overrideActivityTransition(Activity.OVERRIDE_TRANSITION_OPEN, 0, 0)
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/share/SaveToPDFMiddleware.kt
=====================================
@@ -22,6 +22,7 @@ import org.mozilla.fenix.R
import org.mozilla.fenix.browser.StandardSnackbarError
import org.mozilla.fenix.components.appstate.AppAction
import org.mozilla.fenix.ext.components
+import org.mozilla.fenix.ext.recordEventInNimbus
import org.mozilla.geckoview.GeckoSession
import org.mozilla.geckoview.GeckoSession.GeckoPrintException.ERROR_NO_ACTIVITY_CONTEXT
import org.mozilla.geckoview.GeckoSession.GeckoPrintException.ERROR_NO_ACTIVITY_CONTEXT_DELEGATE
@@ -152,7 +153,7 @@ class SaveToPDFMiddleware(
source = telemetrySource(isPdf),
),
)
- // context.recordEventInNimbus("print_tapped")
+ context.recordEventInNimbus("print_tapped")
} else {
Events.saveToPdfTapped.record(
Events.SaveToPdfTappedExtra(
=====================================
mobile/android/fenix/app/src/main/java/org/mozilla/fenix/utils/Settings.kt
=====================================
@@ -320,7 +320,7 @@ class Settings(private val appContext: Context) : PreferencesHolder {
var showWallpaperOnboarding by lazyFeatureFlagPreference(
key = appContext.getPreferenceKey(R.string.pref_key_wallpapers_onboarding),
featureFlag = true,
- default = { true /* mr2022Sections[Mr2022Section.WALLPAPERS_SELECTION_TOOL] == true */ },
+ default = { true },
)
var openLinksInAPrivateTab by booleanPreference(
@@ -820,25 +820,25 @@ class Settings(private val appContext: Context) : PreferencesHolder {
get() = false // cookieBannersSection[CookieBannersSection.FEATURE_UI] == 1
val shouldEnableCookieBannerDetectOnly: Boolean
- get() = false // cookieBannersSection[CookieBannersSection.FEATURE_SETTING_DETECT_ONLY] == 1
+ get() = false
val shouldEnableCookieBannerGlobalRules: Boolean
- get() = false // cookieBannersSection[CookieBannersSection.FEATURE_SETTING_GLOBAL_RULES] == 1
+ get() = false
val shouldEnableCookieBannerGlobalRulesSubFrame: Boolean
- get() = false // cookieBannersSection[CookieBannersSection.FEATURE_SETTING_GLOBAL_RULES_SUB_FRAMES] == 1
+ get() = false
val shouldEnableQueryParameterStripping: Boolean
- get() = true // queryParameterStrippingSection[QUERY_PARAMETER_STRIPPING] == "1"
+ get() = true
val shouldEnableQueryParameterStrippingPrivateBrowsing: Boolean
- get() = true // queryParameterStrippingSection[QUERY_PARAMETER_STRIPPING_PMB] == "1"
+ get() = true
val queryParameterStrippingAllowList: String
- get() = "" // queryParameterStrippingSection[QUERY_PARAMETER_STRIPPING_ALLOW_LIST].orEmpty()
+ get() = ""
val queryParameterStrippingStripList: String
- get() = "" // queryParameterStrippingSection[QUERY_PARAMETER_STRIPPING_STRIP_LIST].orEmpty()
+ get() = ""
/**
* Declared as a function for performance purposes. This could be declared as a variable using
@@ -896,8 +896,7 @@ class Settings(private val appContext: Context) : PreferencesHolder {
* Indicates if the re-engagement notification feature is enabled
*/
val reEngagementNotificationType: Int
- get() = 0 // Neither Type A or B
- // FxNimbus.features.reEngagementNotification.value().type
+ get() = 0
val shouldUseAutoBatteryTheme by booleanPreference(
appContext.getPreferenceKey(R.string.pref_key_auto_battery_theme),
@@ -1709,24 +1708,22 @@ class Settings(private val appContext: Context) : PreferencesHolder {
return currentlyEnabledLanguages.contains(userLangTag)
}
-// private val mr2022Sections: Map<Mr2022Section, Boolean>
-// get() =
-// FxNimbus.features.mr2022.value().sectionsEnabled
+ private val mr2022Sections: Map<Mr2022Section, Boolean>
+ get() =
+ FxNimbus.features.mr2022.value().sectionsEnabled
-// private val cookieBannersSection: Map<CookieBannersSection, Int>
-// get() =
-// FxNimbus.features.cookieBanners.value().sectionsEnabled
+ private val cookieBannersSection: Map<CookieBannersSection, Int>
+ get() =
+ FxNimbus.features.cookieBanners.value().sectionsEnabled
-// private val queryParameterStrippingSection: Map<QueryParameterStrippingSection, String>
-// get() =
-// FxNimbus.features.queryParameterStripping.value().sectionsEnabled
+ private val queryParameterStrippingSection: Map<QueryParameterStrippingSection, String>
+ get() =
+ FxNimbus.features.queryParameterStripping.value().sectionsEnabled
-// private val homescreenSections: Map<HomeScreenSection, Boolean>
-// get() =
-// FxNimbus.features.homescreen.value().sectionsEnabled
+ private val homescreenSections: Map<HomeScreenSection, Boolean>
+ get() =
+ FxNimbus.features.homescreen.value().sectionsEnabled
- // IN TOR BROWSER: we want to avoid ever calling Nimbus, so we hard-code defaults
- // for everything that would have accessed this property.
var historyMetadataUIFeature by lazyFeatureFlagPreference(
appContext.getPreferenceKey(R.string.pref_key_history_metadata_feature),
default = { true },
@@ -1739,7 +1736,7 @@ class Settings(private val appContext: Context) : PreferencesHolder {
var showSyncCFR by lazyFeatureFlagPreference(
appContext.getPreferenceKey(R.string.pref_key_should_show_sync_cfr),
featureFlag = true,
- default = { false /* mr2022Sections[Mr2022Section.SYNC_CFR] == true */ },
+ default = { false },
)
/**
@@ -1748,7 +1745,7 @@ class Settings(private val appContext: Context) : PreferencesHolder {
var showHomeOnboardingDialog by lazyFeatureFlagPreference(
appContext.getPreferenceKey(R.string.pref_key_should_show_home_onboarding_dialog),
featureFlag = true,
- default = { true /* mr2022Sections[Mr2022Section.HOME_ONBOARDING_DIALOG_EXISTING_USERS] == true */ },
+ default = { true },
)
/**
@@ -1917,7 +1914,6 @@ class Settings(private val appContext: Context) : PreferencesHolder {
isLauncherIntent: Boolean,
): Boolean {
return if (featureEnabled && !hasUserBeenOnboarded && isLauncherIntent) {
- // FxNimbus.features.junoOnboarding.recordExposure()
false
} else {
false
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/37eb9b…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/37eb9b…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser] Pushed new branch tor-browser-128.12.0esr-14.5-1
by ma1 (@ma1) 17 Jun '25
by ma1 (@ma1) 17 Jun '25
17 Jun '25
ma1 pushed new branch tor-browser-128.12.0esr-14.5-1 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/tor-brows…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser] Pushed new tag FIREFOX_128_12_0esr_BUILD1
by ma1 (@ma1) 17 Jun '25
by ma1 (@ma1) 17 Jun '25
17 Jun '25
ma1 pushed new tag FIREFOX_128_12_0esr_BUILD1 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/FIREFOX_1…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser] Pushed new branch base-browser-128.12.0esr-14.5-1
by ma1 (@ma1) 17 Jun '25
by ma1 (@ma1) 17 Jun '25
17 Jun '25
ma1 pushed new branch base-browser-128.12.0esr-14.5-1 at The Tor Project / Applications / Tor Browser
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/tree/base-brow…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][tor-browser-140.0a1-15.0-1] fixup! TB 40597: Implement TorSettings module
by morgan (@morgan) 16 Jun '25
by morgan (@morgan) 16 Jun '25
16 Jun '25
morgan pushed to branch tor-browser-140.0a1-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
37eb9b82 by Henry Wilkes at 2025-06-16T17:45:53+00:00
fixup! TB 40597: Implement TorSettings module
TB 43853: Use setByteStringData instead of setData.
- - - - -
1 changed file:
- toolkit/modules/DomainFrontedRequests.sys.mjs
Changes:
=====================================
toolkit/modules/DomainFrontedRequests.sys.mjs
=====================================
@@ -580,7 +580,7 @@ export class DomainFrontRequestBuilder {
const inStream = Cc[
"@mozilla.org/io/string-input-stream;1"
].createInstance(Ci.nsIStringInputStream);
- inStream.setData(body, body.length);
+ inStream.setByteStringData(body);
const upChannel = ch.QueryInterface(Ci.nsIUploadChannel);
upChannel.setUploadStream(inStream, contentType, body.length);
ch.requestMethod = method;
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/37eb9b8…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/37eb9b8…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][tor-browser-140.0a1-15.0-1] fixup! TB 40562: Added Tor Browser preferences to 000-tor-browser.js
by morgan (@morgan) 16 Jun '25
by morgan (@morgan) 16 Jun '25
16 Jun '25
morgan pushed to branch tor-browser-140.0a1-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
4c65306a by Morgan at 2025-06-16T16:30:06+00:00
fixup! TB 40562: Added Tor Browser preferences to 000-tor-browser.js
use netlify for moat's domain fronting
- - - - -
1 changed file:
- browser/app/profile/000-tor-browser.js
Changes:
=====================================
browser/app/profile/000-tor-browser.js
=====================================
@@ -123,8 +123,8 @@ pref("extensions.torlauncher.torrc_path", "");
pref("extensions.torlauncher.tordatadir_path", "");
// BridgeDB-related preferences (used for Moat).
-pref("extensions.torlauncher.bridgedb_front", "www.phpmyadmin.net");
-pref("extensions.torlauncher.bridgedb_reflector", "https://1723079976.rsc.cdn77.org");
+pref("extensions.torlauncher.bridgedb_front", "vuejs.org");
+pref("extensions.torlauncher.bridgedb_reflector", "https://bespoke-strudel-c243cc.netlify.app");
pref("extensions.torlauncher.moat_service", "https://bridges.torproject.org/moat");
// Log levels
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/4c65306…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/4c65306…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/mullvad-browser][mullvad-browser-140.0a1-15.0-1] fixup! BB 43615: Add Gitlab Issue and Merge Request templates
by morgan (@morgan) 16 Jun '25
by morgan (@morgan) 16 Jun '25
16 Jun '25
morgan pushed to branch mullvad-browser-140.0a1-15.0-1 at The Tor Project / Applications / Mullvad Browser
Commits:
0749a03c by Morgan at 2025-06-16T16:08:38+00:00
fixup! BB 43615: Add Gitlab Issue and Merge Request templates
update target channels with esr140-15.0 and esr128-14.5
- - - - -
1 changed file:
- .gitlab/merge_request_templates/Default.md
Changes:
=====================================
.gitlab/merge_request_templates/Default.md
=====================================
@@ -27,8 +27,8 @@
#### Target Channels
-- [ ] **Alpha**: esr128-14.5
-- [ ] **Stable**: esr128-14.0
+- [ ] **Alpha**: esr140-15.0
+- [ ] **Stable**: esr128-14.5
### Backporting
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/074…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/mullvad-browser/-/commit/074…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][base-browser-140.0a1-15.0-1] fixup! BB 43615: Add Gitlab Issue and Merge Request templates
by morgan (@morgan) 16 Jun '25
by morgan (@morgan) 16 Jun '25
16 Jun '25
morgan pushed to branch base-browser-140.0a1-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
b496bae2 by Morgan at 2025-06-16T15:59:27+00:00
fixup! BB 43615: Add Gitlab Issue and Merge Request templates
update target channels with esr140-15.0 and esr128-14.5
- - - - -
1 changed file:
- .gitlab/merge_request_templates/Default.md
Changes:
=====================================
.gitlab/merge_request_templates/Default.md
=====================================
@@ -27,8 +27,8 @@
#### Target Channels
-- [ ] **Alpha**: esr128-14.5
-- [ ] **Stable**: esr128-14.0
+- [ ] **Alpha**: esr140-15.0
+- [ ] **Stable**: esr128-14.5
- [ ] **Legacy**: esr115-13.5
### Backporting
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/b496bae…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/b496bae…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][tor-browser-140.0a1-15.0-1] fixup! BB 43615: Add Gitlab Issue and Merge Request templates
by morgan (@morgan) 16 Jun '25
by morgan (@morgan) 16 Jun '25
16 Jun '25
morgan pushed to branch tor-browser-140.0a1-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
33e257fa by Morgan at 2025-06-16T15:57:51+00:00
fixup! BB 43615: Add Gitlab Issue and Merge Request templates
update target channels with esr140-15.0 and esr128-14.5
- - - - -
1 changed file:
- .gitlab/merge_request_templates/Default.md
Changes:
=====================================
.gitlab/merge_request_templates/Default.md
=====================================
@@ -27,8 +27,8 @@
#### Target Channels
-- [ ] **Alpha**: esr128-14.5
-- [ ] **Stable**: esr128-14.0
+- [ ] **Alpha**: esr140-15.0
+- [ ] **Stable**: esr128-14.5
- [ ] **Legacy**: esr115-13.5
### Backporting
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/33e257f…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/33e257f…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser-build][main] Bug 41491: Update firefox artifacts extension
by Pier Angelo Vendrame (@pierov) 16 Jun '25
by Pier Angelo Vendrame (@pierov) 16 Jun '25
16 Jun '25
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
9c261825 by Beatriz Rizental at 2025-06-16T16:12:19+02:00
Bug 41491: Update firefox artifacts extension
- - - - -
1 changed file:
- projects/firefox/build
Changes:
=====================================
projects/firefox/build
=====================================
@@ -136,7 +136,7 @@ echo "Starting ./mach build $(date)"
mkdir $artifactsdir
# Copy the artifacts to the target directory
# Naming convention is the same as Mozilla uses for their artifacts
- cp -a obj-*/dist/*.tar.bz2 $artifactsdir/target.tar.bz2
+ cp -a obj-*/dist/*.tar.xz $artifactsdir/target.tar.xz
cp -a obj-*/dist/*.zip $artifactsdir/target.xpt_artifacts.zip
./mach python -m mozbuild.action.test_archive common $artifactsdir/target.common.tests.tar.gz
[% END %]
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/9…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/9…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][tor-browser-140.0a1-15.0-1] fixup! BB 43615: Add Gitlab Issue and Merge Request templates
by morgan (@morgan) 16 Jun '25
by morgan (@morgan) 16 Jun '25
16 Jun '25
morgan pushed to branch tor-browser-140.0a1-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
a8f4f126 by Morgan at 2025-06-12T19:09:19+00:00
fixup! BB 43615: Add Gitlab Issue and Merge Request templates
add ~Emergency label and explicit optional Mullvad communication step
- - - - -
1 changed file:
- .gitlab/issue_templates/090 Emergency Security Issue.md
Changes:
=====================================
.gitlab/issue_templates/090 Emergency Security Issue.md
=====================================
@@ -82,6 +82,8 @@ Sometimes fixes have side-effects: users lose their data, roadmaps need to be ad
- if there are considerations or asks outside the Applications Team
- [ ] **(Optional)** **gazebook**
- if there are consequences to the organisation or partners beyond a browser update, then a communication plan may be needed
+ - [ ] **(Optional)** **ruihildt**
+ - if there are consequences to Mullvad and/or Mullvad Browser
Godspeed! :pray:
@@ -100,3 +102,4 @@ Godspeed! :pray:
/label ~"Apps::Product::MullvadBrowser"
/label ~"Apps::Type::Bug"
/label ~"Apps::Priority::Blocker"
+/label ~"Emergency"
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/a8f4f12…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/a8f4f12…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser-build][main] Bug 41488: Disable sys/random.h for Node.js.
by boklm (@boklm) 13 Jun '25
by boklm (@boklm) 13 Jun '25
13 Jun '25
boklm pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
a1e364d3 by Pier Angelo Vendrame at 2025-06-12T18:18:59+02:00
Bug 41488: Disable sys/random.h for Node.js.
It is not available in the glibc version we use in our Linux
containers.
- - - - -
1 changed file:
- projects/node/build
Changes:
=====================================
projects/node/build
=====================================
@@ -11,6 +11,11 @@ distdir=/var/tmp/dist/[% project %]
tar -xf [% c('input_files_by_name/node') %]
cd node-v[% c('version') %]
+[% IF c("var/linux") -%]
+ # Same workaround as Mozilla. See taskcluster/scripts/misc/build-nodejs.sh.
+ sed -i '/HAVE_SYS_RANDOM_H/d;/HAVE_GETRANDOM/d' deps/cares/config/linux/ares_config.h
+[% END -%]
+
./configure --prefix=$distdir
make -j[% c("num_procs") %]
make install
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/a…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/a…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][tor-browser-140.0a1-15.0-1] fixup! TB 40933: Add tor-launcher functionality
by henry (@henry) 12 Jun '25
by henry (@henry) 12 Jun '25
12 Jun '25
henry pushed to branch tor-browser-140.0a1-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
297b2e99 by Henry Wilkes at 2025-06-12T17:52:26+00:00
fixup! TB 40933: Add tor-launcher functionality
TB 43577: Do not try and flush settings to torrc on android.
- - - - -
1 changed file:
- toolkit/components/tor-launcher/TorProvider.sys.mjs
Changes:
=====================================
toolkit/components/tor-launcher/TorProvider.sys.mjs
=====================================
@@ -356,6 +356,10 @@ export class TorProvider {
}
async flushSettings() {
+ if (TorLauncherUtil.isAndroid) {
+ // Android does not have a torrc to flush to. See tor-browser#43577.
+ return;
+ }
await this.#controller.flushSettings();
}
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/297b2e9…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/297b2e9…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][tor-browser-115.24.0esr-13.5-1] 5 commits: fixup! Bug 40925: Implemented the Security Level component
by ma1 (@ma1) 12 Jun '25
by ma1 (@ma1) 12 Jun '25
12 Jun '25
ma1 pushed to branch tor-browser-115.24.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
88b35704 by Henry Wilkes at 2025-06-09T17:04:40+01:00
fixup! Bug 40925: Implemented the Security Level component
TB 43783: Prompt user for a restart if their security level preferences
are not aligned at startup or mid-session.
Also handle failures to apply NoScript settings.
- - - - -
6c89d75e by Henry Wilkes at 2025-06-09T17:05:13+01:00
fixup! Bug 40069: Add helpers for message passing with extensions
TB 43783: Allow the browser to wait for the NoScript settings to be
applied.
- - - - -
9c10817a by Henry Wilkes at 2025-06-09T17:05:54+01:00
fixup! Base Browser strings
TB 43783: Add security level prompt strings.
- - - - -
cdd62d0c by Henry Wilkes at 2025-06-09T17:05:59+01:00
fixup! Base Browser strings
TB 43782: Add strings for new security level UX flow.
- - - - -
ebb66713 by Henry Wilkes at 2025-06-09T17:06:02+01:00
fixup! Bug 40925: Implemented the Security Level component
TB 43782: Update security level UI for new UX flow.
In addition, we drop the distinction between the security levels in the
UI when the user has a custom security level.
I.e. we always show shield as unfilled but with a yellow dot in the
toolbar, and we just call it "Custom" rather than "Standard Custom",
etc.
- - - - -
17 changed files:
- browser/components/BrowserGlue.sys.mjs
- + browser/components/securitylevel/SecurityLevelUIUtils.sys.mjs
- browser/components/securitylevel/content/securityLevel.js
- browser/components/securitylevel/content/securityLevelButton.css
- + browser/components/securitylevel/content/securityLevelDialog.js
- + browser/components/securitylevel/content/securityLevelDialog.xhtml
- browser/components/securitylevel/content/securityLevelPanel.css
- browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
- browser/components/securitylevel/content/securityLevelPreferences.css
- browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
- browser/components/securitylevel/jar.mn
- browser/components/securitylevel/moz.build
- + browser/modules/SecurityLevelRestartNotification.sys.mjs
- browser/modules/moz.build
- toolkit/components/extensions/ExtensionParent.sys.mjs
- toolkit/components/securitylevel/SecurityLevel.sys.mjs
- toolkit/locales/en-US/toolkit/global/base-browser.ftl
Changes:
=====================================
browser/components/BrowserGlue.sys.mjs
=====================================
@@ -59,6 +59,8 @@ ChromeUtils.defineESModuleGetters(lazy, {
Sanitizer: "resource:///modules/Sanitizer.sys.mjs",
ScreenshotsUtils: "resource:///modules/ScreenshotsUtils.sys.mjs",
SearchSERPTelemetry: "resource:///modules/SearchSERPTelemetry.sys.mjs",
+ SecurityLevelRestartNotification:
+ "resource:///modules/SecurityLevelRestartNotification.sys.mjs",
SessionStartup: "resource:///modules/sessionstore/SessionStartup.sys.mjs",
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
ShellService: "resource:///modules/ShellService.sys.mjs",
@@ -1907,6 +1909,8 @@ BrowserGlue.prototype = {
lazy.DragDropFilter.init();
+ lazy.SecurityLevelRestartNotification.ready();
+
lazy.TorProviderBuilder.firstWindowLoaded();
ClipboardPrivacy.startup();
=====================================
browser/components/securitylevel/SecurityLevelUIUtils.sys.mjs
=====================================
@@ -0,0 +1,73 @@
+/**
+ * Common methods for the desktop security level components.
+ */
+export const SecurityLevelUIUtils = {
+ /**
+ * Create an element that gives a description of the security level. To be
+ * used in the settings.
+ *
+ * @param {string} level - The security level to describe.
+ * @param {Document} doc - The document where the element will be inserted.
+ *
+ * @returns {Element} - The newly created element.
+ */
+ createDescriptionElement(level, doc) {
+ const el = doc.createElement("div");
+ el.classList.add("security-level-description");
+
+ let l10nIdSummary;
+ let bullets;
+ switch (level) {
+ case "standard":
+ l10nIdSummary = "security-level-summary-standard";
+ break;
+ case "safer":
+ l10nIdSummary = "security-level-summary-safer";
+ bullets = [
+ "security-level-preferences-bullet-https-only-javascript",
+ "security-level-preferences-bullet-limit-font-and-symbols",
+ "security-level-preferences-bullet-limit-media",
+ ];
+ break;
+ case "safest":
+ l10nIdSummary = "security-level-summary-safest";
+ bullets = [
+ "security-level-preferences-bullet-disabled-javascript",
+ "security-level-preferences-bullet-limit-font-and-symbols-and-images",
+ "security-level-preferences-bullet-limit-media",
+ ];
+ break;
+ case "custom":
+ l10nIdSummary = "security-level-summary-custom";
+ break;
+ default:
+ throw Error(`Unhandled level: ${level}`);
+ }
+
+ const summaryEl = doc.createElement("div");
+ summaryEl.classList.add("security-level-summary");
+ doc.l10n.setAttributes(summaryEl, l10nIdSummary);
+
+ el.append(summaryEl);
+
+ if (!bullets) {
+ return el;
+ }
+
+ const listEl = doc.createElement("ul");
+ listEl.classList.add("security-level-description-extra");
+ // Add a mozilla styling class as well:
+ listEl.classList.add("privacy-extra-information");
+ for (const l10nId of bullets) {
+ const bulletEl = doc.createElement("li");
+ bulletEl.classList.add("security-level-description-bullet");
+
+ doc.l10n.setAttributes(bulletEl, l10nId);
+
+ listEl.append(bulletEl);
+ }
+
+ el.append(listEl);
+ return el;
+ },
+};
=====================================
browser/components/securitylevel/content/securityLevel.js
=====================================
@@ -1,9 +1,10 @@
"use strict";
-/* global AppConstants, Services, openPreferences, XPCOMUtils */
+/* global AppConstants, Services, openPreferences, XPCOMUtils, gSubDialog */
ChromeUtils.defineESModuleGetters(this, {
SecurityLevelPrefs: "resource://gre/modules/SecurityLevel.sys.mjs",
+ SecurityLevelUIUtils: "resource:///modules/SecurityLevelUIUtils.sys.mjs",
});
/*
@@ -35,12 +36,8 @@ var SecurityLevelButton = {
_anchorButton: null,
_configUIFromPrefs() {
- const level = SecurityLevelPrefs.securityLevel;
- if (!level) {
- return;
- }
- const custom = SecurityLevelPrefs.securityCustom;
- this._button.setAttribute("level", custom ? `${level}_custom` : level);
+ const level = SecurityLevelPrefs.securityLevelSummary;
+ this._button.setAttribute("level", level);
let l10nIdLevel;
switch (level) {
@@ -53,15 +50,12 @@ var SecurityLevelButton = {
case "safest":
l10nIdLevel = "security-level-toolbar-button-safest";
break;
+ case "custom":
+ l10nIdLevel = "security-level-toolbar-button-custom";
+ break;
default:
throw Error(`Unhandled level: ${level}`);
}
- if (custom) {
- // Don't distinguish between the different levels when in the custom
- // state. We just want to emphasise that it is custom rather than any
- // specific level.
- l10nIdLevel = "security-level-toolbar-button-custom";
- }
document.l10n.setAttributes(this._button, l10nIdLevel);
},
@@ -164,12 +158,7 @@ var SecurityLevelPanel = {
panel: document.getElementById("securityLevel-panel"),
background: document.getElementById("securityLevel-background"),
levelName: document.getElementById("securityLevel-level"),
- customName: document.getElementById("securityLevel-custom"),
summary: document.getElementById("securityLevel-summary"),
- restoreDefaultsButton: document.getElementById(
- "securityLevel-restoreDefaults"
- ),
- settingsButton: document.getElementById("securityLevel-settings"),
};
const learnMoreEl = document.getElementById("securityLevel-learnMore");
@@ -177,12 +166,11 @@ var SecurityLevelPanel = {
this.hide();
});
- this._elements.restoreDefaultsButton.addEventListener("command", () => {
- this.restoreDefaults();
- });
- this._elements.settingsButton.addEventListener("command", () => {
- this.openSecuritySettings();
- });
+ document
+ .getElementById("securityLevel-settings")
+ .addEventListener("command", () => {
+ this.openSecuritySettings();
+ });
this._elements.panel.addEventListener("popupshown", () => {
// Bring focus into the panel by focusing the default button.
@@ -200,19 +188,7 @@ var SecurityLevelPanel = {
}
// get security prefs
- const level = SecurityLevelPrefs.securityLevel;
- const custom = SecurityLevelPrefs.securityCustom;
-
- // only visible when user is using custom settings
- this._elements.customName.hidden = !custom;
- this._elements.restoreDefaultsButton.hidden = !custom;
- if (custom) {
- this._elements.settingsButton.removeAttribute("default");
- this._elements.restoreDefaultsButton.setAttribute("default", "true");
- } else {
- this._elements.settingsButton.setAttribute("default", "true");
- this._elements.restoreDefaultsButton.removeAttribute("default");
- }
+ const level = SecurityLevelPrefs.securityLevelSummary;
// Descriptions change based on security level
this._elements.background.setAttribute("level", level);
@@ -231,12 +207,13 @@ var SecurityLevelPanel = {
l10nIdLevel = "security-level-panel-level-safest";
l10nIdSummary = "security-level-summary-safest";
break;
+ case "custom":
+ l10nIdLevel = "security-level-panel-level-custom";
+ l10nIdSummary = "security-level-summary-custom";
+ break;
default:
throw Error(`Unhandled level: ${level}`);
}
- if (custom) {
- l10nIdSummary = "security-level-summary-custom";
- }
document.l10n.setAttributes(this._elements.levelName, l10nIdLevel);
document.l10n.setAttributes(this._elements.summary, l10nIdSummary);
@@ -270,13 +247,6 @@ var SecurityLevelPanel = {
this._elements.panel.hidePopup();
},
- restoreDefaults() {
- SecurityLevelPrefs.securityCustom = false;
- // Move focus to the settings button since restore defaults button will
- // become hidden.
- this._elements.settingsButton.focus();
- },
-
openSecuritySettings() {
openPreferences("privacy-securitylevel");
this.hide();
@@ -302,62 +272,64 @@ var SecurityLevelPanel = {
var SecurityLevelPreferences = {
_securityPrefsBranch: null,
+
/**
- * The notification box shown when the user has a custom security setting.
- *
- * @type {Element}
- */
- _customNotification: null,
- /**
- * The radiogroup for this preference.
- *
- * @type {Element}
- */
- _radiogroup: null,
- /**
- * A list of radio options and their containers.
+ * The element that shows the current security level.
*
- * @type {Array<object>}
+ * @type {?Element}
*/
- _radioOptions: null,
+ _currentEl: null,
_populateXUL() {
- this._customNotification = document.getElementById(
- "securityLevel-customNotification"
+ this._currentEl = document.getElementById("security-level-current");
+ const changeButton = document.getElementById("security-level-change");
+ const badgeEl = this._currentEl.querySelector(
+ ".security-level-current-badge"
);
- document
- .getElementById("securityLevel-restoreDefaults")
- .addEventListener("command", () => {
- SecurityLevelPrefs.securityCustom = false;
- });
- this._radiogroup = document.getElementById("securityLevel-radiogroup");
+ for (const { level, nameId } of [
+ { level: "standard", nameId: "security-level-panel-level-standard" },
+ { level: "safer", nameId: "security-level-panel-level-safer" },
+ { level: "safest", nameId: "security-level-panel-level-safest" },
+ { level: "custom", nameId: "security-level-panel-level-custom" },
+ ]) {
+ // Classes that control visibility:
+ // security-level-current-standard
+ // security-level-current-safer
+ // security-level-current-safest
+ // security-level-current-custom
+ const visibilityClass = `security-level-current-${level}`;
+ const nameEl = document.createElement("div");
+ nameEl.classList.add("security-level-name", visibilityClass);
+ document.l10n.setAttributes(nameEl, nameId);
+
+ const descriptionEl = SecurityLevelUIUtils.createDescriptionElement(
+ level,
+ document
+ );
+ descriptionEl.classList.add(visibilityClass);
- this._radioOptions = Array.from(
- this._radiogroup.querySelectorAll(".securityLevel-radio-option"),
- container => {
- return { container, radio: container.querySelector("radio") };
- }
- );
+ this._currentEl.insertBefore(nameEl, badgeEl);
+ this._currentEl.insertBefore(descriptionEl, changeButton);
+ }
- this._radiogroup.addEventListener("select", () => {
- SecurityLevelPrefs.securityLevel = this._radiogroup.value;
+ changeButton.addEventListener("click", () => {
+ this._openDialog();
});
},
+ _openDialog() {
+ gSubDialog.open(
+ "chrome://browser/content/securitylevel/securityLevelDialog.xhtml",
+ { features: "resizable=yes" }
+ );
+ },
+
_configUIFromPrefs() {
- this._radiogroup.value = SecurityLevelPrefs.securityLevel;
- const isCustom = SecurityLevelPrefs.securityCustom;
- this._radiogroup.disabled = isCustom;
- this._customNotification.hidden = !isCustom;
- // Have the container's selection CSS class match the selection state of the
- // radio elements.
- for (const { container, radio } of this._radioOptions) {
- container.classList.toggle(
- "securityLevel-radio-option-selected",
- radio.selected
- );
- }
+ // Set a data-current-level attribute for showing the current security
+ // level, and hiding the rest.
+ this._currentEl.dataset.currentLevel =
+ SecurityLevelPrefs.securityLevelSummary;
},
init() {
=====================================
browser/components/securitylevel/content/securityLevelButton.css
=====================================
@@ -7,12 +7,6 @@ toolbarbutton#security-level-button[level="safer"] {
toolbarbutton#security-level-button[level="safest"] {
list-style-image: url("chrome://browser/content/securitylevel/securityLevelIcon.svg#safest");
}
-toolbarbutton#security-level-button[level="standard_custom"] {
+toolbarbutton#security-level-button[level="custom"] {
list-style-image: url("chrome://browser/content/securitylevel/securityLevelIcon.svg#standard_custom");
}
-toolbarbutton#security-level-button[level="safer_custom"] {
- list-style-image: url("chrome://browser/content/securitylevel/securityLevelIcon.svg#safer_custom");
-}
-toolbarbutton#security-level-button[level="safest_custom"] {
- list-style-image: url("chrome://browser/content/securitylevel/securityLevelIcon.svg#safest_custom");
-}
\ No newline at end of file
=====================================
browser/components/securitylevel/content/securityLevelDialog.js
=====================================
@@ -0,0 +1,188 @@
+"use strict";
+
+const { SecurityLevelPrefs } = ChromeUtils.importESModule(
+ "resource://gre/modules/SecurityLevel.sys.mjs"
+);
+const { SecurityLevelUIUtils } = ChromeUtils.importESModule(
+ "resource:///modules/SecurityLevelUIUtils.sys.mjs"
+);
+
+const gSecurityLevelDialog = {
+ /**
+ * The security level when this dialog was opened.
+ *
+ * @type {string}
+ */
+ _prevLevel: SecurityLevelPrefs.securityLevelSummary,
+ /**
+ * The security level currently selected.
+ *
+ * @type {string}
+ */
+ _selectedLevel: "",
+ /**
+ * The radiogroup for this preference.
+ *
+ * @type {?Element}
+ */
+ _radiogroup: null,
+ /**
+ * A list of radio options and their containers.
+ *
+ * @type {?Array<{ container: Element, radio: Element }>}
+ */
+ _radioOptions: null,
+
+ /**
+ * Initialise the dialog.
+ */
+ async init() {
+ const dialog = document.getElementById("security-level-dialog");
+ dialog.addEventListener("dialogaccept", event => {
+ if (this._acceptButton.disabled) {
+ event.preventDefault();
+ return;
+ }
+ this._commitChange();
+ });
+
+ this._acceptButton = dialog.getButton("accept");
+
+ document.l10n.setAttributes(
+ this._acceptButton,
+ "security-level-dialog-save-restart"
+ );
+
+ this._radiogroup = document.getElementById("security-level-radiogroup");
+
+ this._radioOptions = Array.from(
+ this._radiogroup.querySelectorAll(".security-level-radio-container"),
+ container => {
+ return {
+ container,
+ radio: container.querySelector(".security-level-radio"),
+ };
+ }
+ );
+
+ for (const { container, radio } of this._radioOptions) {
+ const level = radio.value;
+ radio.id = `security-level-radio-${level}`;
+ const currentEl = container.querySelector(
+ ".security-level-current-badge"
+ );
+ currentEl.id = `security-level-current-badge-${level}`;
+ const descriptionEl = SecurityLevelUIUtils.createDescriptionElement(
+ level,
+ document
+ );
+ descriptionEl.classList.add("indent");
+ descriptionEl.id = `security-level-description-${level}`;
+
+ // Wait for the full translation of the element before adding it to the
+ // DOM. In particular, we want to make sure the elements have text before
+ // we measure the maxHeight below.
+ await document.l10n.translateFragment(descriptionEl);
+ document.l10n.pauseObserving();
+ container.append(descriptionEl);
+ document.l10n.resumeObserving();
+
+ if (level === this._prevLevel) {
+ currentEl.hidden = false;
+ // When the currentEl is visible, include it in the accessible name for
+ // the radio option.
+ // NOTE: The currentEl has an accessible name which includes punctuation
+ // to help separate it's content from the security level name.
+ // E.g. "Standard (Current level)".
+ radio.setAttribute("aria-labelledby", `${radio.id} ${currentEl.id}`);
+ } else {
+ currentEl.hidden = true;
+ }
+ // We point the accessible description to the wrapping
+ // .security-level-description element, rather than its children
+ // that define the actual text content. This means that when the
+ // privacy-extra-information is shown or hidden, its text content is
+ // included or excluded from the accessible description, respectively.
+ radio.setAttribute("aria-describedby", descriptionEl.id);
+ }
+
+ // We want to reserve the maximum height of the radiogroup so that the
+ // dialog has enough height when the user switches options. So we cycle
+ // through the options and measure the height when they are selected to set
+ // a minimum height that fits all of them.
+ // NOTE: At the time of implementation, at this point the dialog may not
+ // yet have the "subdialog" attribute, which means it is missing the
+ // common.css stylesheet from its shadow root, which effects the size of the
+ // .radio-check element and the font. Therefore, we have duplicated the
+ // import of common.css in SecurityLevelDialog.xhtml to ensure it is applied
+ // at this earlier stage.
+ let maxHeight = 0;
+ for (const { container } of this._radioOptions) {
+ container.classList.add("selected");
+ maxHeight = Math.max(
+ maxHeight,
+ this._radiogroup.getBoundingClientRect().height
+ );
+ container.classList.remove("selected");
+ }
+ this._radiogroup.style.minHeight = `${maxHeight}px`;
+
+ if (this._prevLevel !== "custom") {
+ this._selectedLevel = this._prevLevel;
+ this._radiogroup.value = this._prevLevel;
+ } else {
+ this._radiogroup.selectedItem = null;
+ }
+
+ this._radiogroup.addEventListener("select", () => {
+ this._selectedLevel = this._radiogroup.value;
+ this._updateSelected();
+ });
+
+ this._updateSelected();
+ },
+
+ /**
+ * Update the UI in response to a change in selection.
+ */
+ _updateSelected() {
+ this._acceptButton.disabled =
+ !this._selectedLevel || this._selectedLevel === this._prevLevel;
+ // Have the container's `selected` CSS class match the selection state of
+ // the radio elements.
+ for (const { container, radio } of this._radioOptions) {
+ container.classList.toggle("selected", radio.selected);
+ }
+ },
+
+ /**
+ * Commit the change in security level and restart the browser.
+ */
+ _commitChange() {
+ SecurityLevelPrefs.setSecurityLevelBeforeRestart(this._selectedLevel);
+ Services.startup.quit(
+ Services.startup.eAttemptQuit | Services.startup.eRestart
+ );
+ },
+};
+
+// Initial focus is not visible, even if opened with a keyboard. We avoid the
+// default handler and manage the focus ourselves, which will paint the focus
+// ring by default.
+// NOTE: A side effect is that the focus ring will show even if the user opened
+// with a mouse event.
+// TODO: Remove this once bugzilla bug 1708261 is resolved.
+document.subDialogSetDefaultFocus = () => {
+ document.getElementById("security-level-radiogroup").focus();
+};
+
+// Delay showing and sizing the subdialog until it is fully initialised.
+document.mozSubdialogReady = new Promise(resolve => {
+ window.addEventListener(
+ "DOMContentLoaded",
+ () => {
+ gSecurityLevelDialog.init().finally(resolve);
+ },
+ { once: true }
+ );
+});
=====================================
browser/components/securitylevel/content/securityLevelDialog.xhtml
=====================================
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+
+<window
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml"
+ data-l10n-id="security-level-dialog-window"
+>
+ <dialog id="security-level-dialog" buttons="accept,cancel">
+ <linkset>
+ <html:link rel="stylesheet" href="chrome://global/skin/global.css" />
+ <!-- NOTE: We include common.css explicitly, rather than relying on
+ - the dialog's shadowroot importing it, which is late loaded in
+ - response to the dialog's "subdialog" attribute, which is set
+ - in response to DOMFrameContentLoaded.
+ - In particular, we need the .radio-check rule and font rules from
+ - common-shared.css to be in place when gSecurityLevelDialog.init is
+ - called, which will help ensure that the radio element has the correct
+ - size when we measure its bounding box. -->
+ <html:link
+ rel="stylesheet"
+ href="chrome://global/skin/in-content/common.css"
+ />
+ <html:link
+ rel="stylesheet"
+ href="chrome://browser/skin/preferences/preferences.css"
+ />
+ <html:link
+ rel="stylesheet"
+ href="chrome://browser/skin/preferences/privacy.css"
+ />
+ <html:link
+ rel="stylesheet"
+ href="chrome://browser/content/securitylevel/securityLevelPreferences.css"
+ />
+
+ <html:link rel="localization" href="branding/brand.ftl" />
+ <html:link rel="localization" href="toolkit/global/base-browser.ftl" />
+ </linkset>
+
+ <script src="chrome://browser/content/securitylevel/securityLevelDialog.js" />
+
+ <description data-l10n-id="security-level-dialog-restart-description" />
+
+ <radiogroup id="security-level-radiogroup" class="highlighting-group">
+ <html:div
+ class="security-level-radio-container security-level-grid privacy-detailedoption info-box-container"
+ >
+ <radio
+ class="security-level-radio security-level-name"
+ value="standard"
+ data-l10n-id="security-level-preferences-level-standard"
+ />
+ <html:div
+ class="security-level-current-badge"
+ data-l10n-id="security-level-preferences-current-badge"
+ ></html:div>
+ </html:div>
+ <html:div
+ class="security-level-radio-container security-level-grid privacy-detailedoption info-box-container"
+ >
+ <radio
+ class="security-level-radio security-level-name"
+ value="safer"
+ data-l10n-id="security-level-preferences-level-safer"
+ />
+ <html:div
+ class="security-level-current-badge"
+ data-l10n-id="security-level-preferences-current-badge"
+ ></html:div>
+ </html:div>
+ <html:div
+ class="security-level-radio-container security-level-grid privacy-detailedoption info-box-container"
+ >
+ <radio
+ class="security-level-radio security-level-name"
+ value="safest"
+ data-l10n-id="security-level-preferences-level-safest"
+ />
+ <html:div
+ class="security-level-current-badge"
+ data-l10n-id="security-level-preferences-current-badge"
+ ></html:div>
+ </html:div>
+ </radiogroup>
+ </dialog>
+</window>
=====================================
browser/components/securitylevel/content/securityLevelPanel.css
=====================================
@@ -23,7 +23,7 @@
background-position-x: right var(--background-inline-offset);
}
-#securityLevel-background[level="standard"] {
+#securityLevel-background:is([level="standard"], [level="custom"]) {
background-image: url("chrome://browser/content/securitylevel/securityLevelIcon.svg#standard");
}
@@ -49,14 +49,6 @@
font-weight: 600;
}
-#securityLevel-custom {
- border-radius: 4px;
- background-color: var(--warning-color);
- color: black;
- padding: 0.4em 0.5em;
- margin-inline-start: 1em;
-}
-
#securityLevel-summary {
padding-inline-end: 5em;
max-width: 20em;
=====================================
browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
=====================================
@@ -16,10 +16,6 @@
<vbox id="securityLevel-background" class="panel-subview-body">
<html:p id="securityLevel-subheading">
<html:span id="securityLevel-level"></html:span>
- <html:span
- id="securityLevel-custom"
- data-l10n-id="security-level-panel-custom-badge"
- ></html:span>
</html:p>
<html:p id="securityLevel-summary"></html:p>
<html:a
@@ -32,11 +28,8 @@
<hbox class="panel-footer">
<button
id="securityLevel-settings"
+ default="true"
data-l10n-id="security-level-panel-open-settings-button"
/>
- <button
- id="securityLevel-restoreDefaults"
- data-l10n-id="security-level-restore-defaults-button"
- />
</hbox>
</panel>
=====================================
browser/components/securitylevel/content/securityLevelPreferences.css
=====================================
@@ -1,58 +1,185 @@
-#securityLevel-groupbox {
- --section-highlight-background-color: color-mix(in srgb, var(--in-content-accent-color) 20%, transparent);
+/* CSS variables copied from ESR 128 */
+:root {
+ --space-xsmall: 0.267rem;
+ --space-small: calc(2 * var(--space-xsmall));
+ --space-medium: calc(3 * var(--space-xsmall));
+ --space-large: calc(4 * var(--space-xsmall));
+ --space-xlarge: calc(6 * var(--space-xsmall));
+ --font-size-small: 0.867rem;
+ --background-color-information: #e2f7ff; /* acorn oklch --color-blue-0 */
+ --button-text-color-primary: var(--in-content-primary-button-text-color);
+ --border-radius-small: 4px;
}
-#securityLevel-customNotification {
- /* Spacing similar to #fpiIncompatibilityWarning. */
- margin-block: 16px;
+@media (prefers-color-scheme: dark) {
+ :root {
+ --background-color-information: #00317e; /* acorn oklch --color-blue-90 */
+ }
}
-.info-icon.securityLevel-custom-warning-icon {
- list-style-image: url("chrome://global/skin/icons/warning.svg");
+.security-level-grid {
+ display: grid;
+ grid-template:
+ "icon name badge button" min-content
+ "icon summary summary button" auto
+ "icon extra extra ." auto
+ / max-content max-content 1fr max-content;
}
-#securityLevel-customHeading {
- font-weight: bold;
+.security-level-icon {
+ grid-area: icon;
+ align-self: start;
+ width: 24px;
+ height: 24px;
+ -moz-context-properties: fill;
+ fill: var(--in-content-icon-color);
+ margin-block-start: var(--space-xsmall);
+ margin-inline-end: var(--space-large);
+}
+
+.security-level-current-badge {
+ grid-area: badge;
+ align-self: center;
+ justify-self: start;
+ white-space: nowrap;
+ background: var(--background-color-information);
+ color: inherit;
+ font-size: var(--font-size-small);
+ border-radius: var(--border-radius-circle);
+ margin-inline-start: var(--space-small);
+ padding-block: var(--space-xsmall);
+ padding-inline: var(--space-small);
+}
+
+.security-level-current-badge span {
+ /* Still accessible to screen reader, but not visual.
+ * Keep inline, but with no layout width. */
+ display: inline-block;
+ width: 1px;
+ margin-inline-end: -1px;
+ clip-path: inset(50%);
}
-/* Overwrite indent rule from preferences.css */
-#securityLevel-radiogroup description.indent {
- color: var(--in-content-page-color);
+@media (prefers-contrast) and (not (forced-colors)) {
+ .security-level-current-badge {
+ /* Match the checkbox/radio colors. */
+ background: var(--color-accent-primary);
+ color: var(--button-text-color-primary);
+ }
}
-#securityLevel-radiogroup radio {
+@media (forced-colors) {
+ .security-level-current-badge {
+ /* Match the checkbox/radio/selected colors. */
+ background: SelectedItem;
+ color: SelectedItemText;
+ }
+}
+
+.security-level-name {
+ grid-area: name;
font-weight: bold;
+ align-self: center;
+ white-space: nowrap;
+}
+
+.security-level-description {
+ display: grid;
+ grid-column: summary-start / extra-end;
+ grid-row: summary-start / extra-end;
+ grid-template-rows: subgrid;
+ grid-template-columns: subgrid;
+ margin-block-start: var(--space-small);
+}
+
+.security-level-summary {
+ grid-area: summary;
}
-#securityLevel-radiogroup[disabled] {
- opacity: 0.5;
+.security-level-description-extra {
+ grid-area: extra;
+ margin-block: var(--space-medium) 0;
+ margin-inline: var(--space-large) 0;
+ padding: 0;
}
-/* Overwrite the rule in common-shared.css so we don't get 0.25 opacity overall
- * on the radio text. */
-#securityLevel-radiogroup[disabled] radio[disabled] {
- opacity: 1.0;
+.security-level-description-bullet:not(:last-child) {
+ margin-block-end: var(--space-medium);
}
-.securityLevel-radio-option {
+/* Tweak current security level display. */
+
+#security-level-current {
+ margin-block-start: var(--space-large);
+ background: var(--in-content-box-background);
border: 1px solid var(--in-content-box-border-color);
- border-radius: 4px;
- margin: 3px 0;
- padding: 9px;
+ border-radius: var(--border-radius-small);
+ padding: var(--space-medium);
}
-.securityLevel-radio-option.securityLevel-radio-option-selected {
- background-color: var(--section-highlight-background-color);
- border: 1px solid var(--in-content-accent-color);
+#security-level-change {
+ grid-area: button;
+ align-self: center;
+ margin: 0;
+ margin-inline-start: var(--space-large);
+}
+
+/* Adjust which content is visible depending on the current security level. */
+
+#security-level-current:not([data-current-level="standard"]) .security-level-current-standard {
+ display: none;
+}
+#security-level-current:not([data-current-level="safer"]) .security-level-current-safer {
+ display: none;
}
-.securityLevel-radio-option:not(
- .securityLevel-radio-option-selected
-) .securityLevel-descriptionList {
+#security-level-current:not([data-current-level="safest"]) .security-level-current-safest {
display: none;
}
-.securityLevel-descriptionList description {
- display: list-item;
+#security-level-current:not([data-current-level="custom"]) .security-level-current-custom {
+ display: none;
+}
+
+#security-level-current[data-current-level="standard"] .security-level-icon {
+ content: url("chrome://browser/content/securitylevel/securityLevelIcon.svg#standard");
+}
+
+#security-level-current[data-current-level="safer"] .security-level-icon {
+ content: url("chrome://browser/content/securitylevel/securityLevelIcon.svg#safer");
+}
+
+#security-level-current[data-current-level="safest"] .security-level-icon {
+ content: url("chrome://browser/content/securitylevel/securityLevelIcon.svg#safest");
+}
+
+#security-level-current[data-current-level="custom"] .security-level-icon {
+ content: url("chrome://browser/content/securitylevel/securityLevelIcon.svg#standard_custom");
+}
+
+/* Tweak security level dialog. */
+
+#security-level-radiogroup {
+ margin-block: var(--space-large) var(--space-xlarge);
+}
+
+.security-level-radio-container {
+ padding-block: var(--space-large);
+}
+
+#security-level-radiogroup .security-level-radio {
+ margin: 0;
+}
+
+#security-level-radiogroup .radio-label-box {
+ /* .security-level-current-badge already has a margin. */
+ margin: 0;
+}
+
+#security-level-radiogroup .privacy-detailedoption.security-level-radio-container:not(.selected) .security-level-description-extra {
+ /* .privacy-detailedoption uses visibility: hidden, which does not work with
+ * our grid display (the margin is still reserved) so we use display: none
+ * instead. */
+ display: none;
}
=====================================
browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
=====================================
@@ -18,108 +18,19 @@
data-l10n-id="security-level-preferences-learn-more-link"
></html:a>
</description>
- <hbox
- id="securityLevel-customNotification"
- class="info-box-container"
- flex="1"
- >
- <hbox class="info-icon-container">
- <image class="info-icon securityLevel-custom-warning-icon"/>
- </hbox>
- <vbox flex="1">
- <label
- id="securityLevel-customHeading"
- data-l10n-id="security-level-preferences-custom-heading"
- />
- <description
- id="securityLevel-customDescription"
- data-l10n-id="security-level-summary-custom"
- flex="1"
- />
- </vbox>
- <hbox align="center">
- <button
- id="securityLevel-restoreDefaults"
- data-l10n-id="security-level-restore-defaults-button"
- />
- </hbox>
- </hbox>
- <radiogroup id="securityLevel-radiogroup">
- <vbox class="securityLevel-radio-option">
- <radio
- value="standard"
- data-l10n-id="security-level-preferences-level-standard"
- aria-describedby="securityLevelSummary-standard"
- />
- <vbox id="securityLevelSummary-standard">
- <description
- class="summary indent"
- flex="1"
- data-l10n-id="security-level-summary-standard"
- />
- </vbox>
- </vbox>
- <vbox class="securityLevel-radio-option">
- <!-- NOTE: We point the accessible description to the wrapping vbox
- - rather than its first description element. This means that when the
- - securityLevel-descriptionList is shown or hidden, its text content
- - is included or excluded from the accessible description,
- - respectively. -->
- <radio
- value="safer"
- data-l10n-id="security-level-preferences-level-safer"
- aria-describedby="securityLevelSummary-safer"
- />
- <vbox id="securityLevelSummary-safer">
- <description
- class="summary indent"
- flex="1"
- data-l10n-id="security-level-summary-safer"
- />
- <vbox class="securityLevel-descriptionList indent">
- <description
- class="indent"
- data-l10n-id="security-level-preferences-bullet-https-only-javascript"
- />
- <description
- class="indent"
- data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols"
- />
- <description
- class="indent"
- data-l10n-id="security-level-preferences-bullet-limit-media"
- />
- </vbox>
- </vbox>
- </vbox>
- <vbox class="securityLevel-radio-option">
- <radio
- value="safest"
- data-l10n-id="security-level-preferences-level-safest"
- aria-describedby="securityLevelSummary-safest"
- />
- <vbox id="securityLevelSummary-safest">
- <description
- class="summary indent"
- flex="1"
- data-l10n-id="security-level-summary-safest"
- />
- <vbox class="securityLevel-descriptionList indent">
- <description
- class="indent"
- data-l10n-id="security-level-preferences-bullet-disabled-javascript"
- />
- <description
- class="indent"
- data-l10n-id="security-level-preferences-bullet-limit-font-and-symbols-and-images"
- />
- <description
- class="indent"
- data-l10n-id="security-level-preferences-bullet-limit-media"
- />
- </vbox>
- </vbox>
- </vbox>
- </radiogroup>
+ <html:div id="security-level-current" class="security-level-grid">
+ <html:img
+ class="security-level-icon"
+ alt=""
+ />
+ <html:div
+ class="security-level-current-badge"
+ data-l10n-id="security-level-preferences-current-badge"
+ ></html:div>
+ <html:button
+ id="security-level-change"
+ data-l10n-id="security-level-preferences-change-button"
+ ></html:button>
+ </html:div>
</vbox>
</groupbox>
=====================================
browser/components/securitylevel/jar.mn
=====================================
@@ -4,3 +4,5 @@ browser.jar:
content/browser/securitylevel/securityLevelButton.css (content/securityLevelButton.css)
content/browser/securitylevel/securityLevelPreferences.css (content/securityLevelPreferences.css)
content/browser/securitylevel/securityLevelIcon.svg (content/securityLevelIcon.svg)
+ content/browser/securitylevel/securityLevelDialog.xhtml (content/securityLevelDialog.xhtml)
+ content/browser/securitylevel/securityLevelDialog.js (content/securityLevelDialog.js)
=====================================
browser/components/securitylevel/moz.build
=====================================
@@ -1 +1,5 @@
JAR_MANIFESTS += ["jar.mn"]
+
+EXTRA_JS_MODULES += [
+ "SecurityLevelUIUtils.sys.mjs",
+]
=====================================
browser/modules/SecurityLevelRestartNotification.sys.mjs
=====================================
@@ -0,0 +1,77 @@
+import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
+
+const lazy = {};
+
+XPCOMUtils.defineLazyModuleGetters(lazy, {
+ BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.jsm",
+});
+
+ChromeUtils.defineESModuleGetters(lazy, {
+ SecurityLevelPrefs: "resource://gre/modules/SecurityLevel.sys.mjs",
+});
+
+ChromeUtils.defineLazyGetter(lazy, "NotificationStrings", function () {
+ return new Localization([
+ "branding/brand.ftl",
+ "toolkit/global/base-browser.ftl",
+ ]);
+});
+
+/**
+ * Interface for showing the security level restart notification on desktop.
+ */
+export const SecurityLevelRestartNotification = {
+ /**
+ * Whether we have already been initialised.
+ *
+ * @type {boolean}
+ */
+ _initialized: false,
+
+ /**
+ * Called when the UI is ready to show a notification.
+ */
+ ready() {
+ if (this._initialized) {
+ return;
+ }
+ this._initialized = true;
+ lazy.SecurityLevelPrefs.setRestartNotificationHandler(this);
+ },
+
+ /**
+ * Show the restart notification, and perform the restart if the user agrees.
+ */
+ async tryRestartBrowser() {
+ const [titleText, bodyText, primaryButtonText, secondaryButtonText] =
+ await lazy.NotificationStrings.formatValues([
+ { id: "security-level-restart-prompt-title" },
+ { id: "security-level-restart-prompt-body" },
+ { id: "security-level-restart-prompt-button-restart" },
+ { id: "security-level-restart-prompt-button-ignore" },
+ ]);
+ const buttonFlags =
+ Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_0 +
+ Services.prompt.BUTTON_TITLE_IS_STRING * Services.prompt.BUTTON_POS_1;
+
+ const propBag = await Services.prompt.asyncConfirmEx(
+ lazy.BrowserWindowTracker.getTopWindow()?.browsingContext ?? null,
+ Services.prompt.MODAL_TYPE_INTERNAL_WINDOW,
+ titleText,
+ bodyText,
+ buttonFlags,
+ primaryButtonText,
+ secondaryButtonText,
+ null,
+ null,
+ null,
+ {}
+ );
+
+ if (propBag.get("buttonNumClicked") === 0) {
+ Services.startup.quit(
+ Services.startup.eAttemptQuit | Services.startup.eRestart
+ );
+ }
+ },
+};
=====================================
browser/modules/moz.build
=====================================
@@ -142,6 +142,7 @@ EXTRA_JS_MODULES += [
"PingCentre.jsm",
"ProcessHangMonitor.jsm",
"Sanitizer.sys.mjs",
+ "SecurityLevelRestartNotification.sys.mjs",
"SelectionChangedMenulist.jsm",
"SiteDataManager.jsm",
"SitePermissions.sys.mjs",
=====================================
toolkit/components/extensions/ExtensionParent.sys.mjs
=====================================
@@ -2275,6 +2275,7 @@ async function torSendExtensionMessage(extensionId, message) {
const result = await ProxyMessenger.conduit.castRuntimeMessage("messenger", {
extensionId,
holder: new StructuredCloneHolder("torSendExtensionMessage", null, message),
+ query: true,
firstResponse: true,
sender: {
id: extensionId,
=====================================
toolkit/components/securitylevel/SecurityLevel.sys.mjs
=====================================
@@ -18,6 +18,7 @@ const BrowserTopics = Object.freeze({
// The Security Settings prefs in question.
const kSliderPref = "browser.security_level.security_slider";
const kCustomPref = "browser.security_level.security_custom";
+const kNoScriptInitedPref = "browser.security_level.noscript_inited";
// __getPrefValue(prefName)__
// Returns the current value of a preference, regardless of its type.
@@ -34,11 +35,11 @@ var getPrefValue = function (prefName) {
}
};
-// __bindPref(prefName, prefHandler, init)__
+// __bindPref(prefName, prefHandler)__
// Applies prefHandler whenever the value of the pref changes.
// If init is true, applies prefHandler to the current value.
-// Returns a zero-arg function that unbinds the pref.
-var bindPref = function (prefName, prefHandler, init = false) {
+// Returns the observer that was added.
+var bindPref = function (prefName, prefHandler) {
let update = () => {
prefHandler(getPrefValue(prefName));
},
@@ -50,21 +51,9 @@ var bindPref = function (prefName, prefHandler, init = false) {
},
};
Services.prefs.addObserver(prefName, observer);
- if (init) {
- update();
- }
- return () => {
- Services.prefs.removeObserver(prefName, observer);
- };
+ return observer;
};
-// __bindPrefAndInit(prefName, prefHandler)__
-// Applies prefHandler to the current value of pref specified by prefName.
-// Re-applies prefHandler whenever the value of the pref changes.
-// Returns a zero-arg function that unbinds the pref.
-var bindPrefAndInit = (prefName, prefHandler) =>
- bindPref(prefName, prefHandler, true);
-
async function waitForExtensionMessage(extensionId, checker = () => {}) {
const { torWaitForExtensionMessage } = lazy.ExtensionParent;
if (torWaitForExtensionMessage) {
@@ -76,7 +65,7 @@ async function waitForExtensionMessage(extensionId, checker = () => {}) {
async function sendExtensionMessage(extensionId, message) {
const { torSendExtensionMessage } = lazy.ExtensionParent;
if (torSendExtensionMessage) {
- return torSendExtensionMessage(extensionId, message);
+ return await torSendExtensionMessage(extensionId, message);
}
return undefined;
}
@@ -189,14 +178,8 @@ var initializeNoScriptControl = () => {
// `browser.runtime.onMessage.addListener(...)` in NoScript's bg/main.js.
// TODO: Is there a better way?
- let sendNoScriptSettings = settings =>
- sendExtensionMessage(noscriptID, settings);
-
- // __setNoScriptSafetyLevel(safetyLevel)__.
- // Set NoScript settings according to a particular safety level
- // (security slider level): 0 = Standard, 1 = Safer, 2 = Safest
- let setNoScriptSafetyLevel = safetyLevel =>
- sendNoScriptSettings(noscriptSettings(safetyLevel));
+ let sendNoScriptSettings = async settings =>
+ await sendExtensionMessage(noscriptID, settings);
// __securitySliderToSafetyLevel(sliderState)__.
// Converts the "browser.security_level.security_slider" pref value
@@ -206,36 +189,46 @@ var initializeNoScriptControl = () => {
// Wait for the first message from NoScript to arrive, and then
// bind the security_slider pref to the NoScript settings.
- let messageListener = a => {
+ let messageListener = async a => {
try {
logger.debug("Message received from NoScript:", a);
- let noscriptPersist = Services.prefs.getBoolPref(
- "browser.security_level.noscript_persist",
- false
- );
+ const persistPref = "browser.security_level.noscript_persist";
+ let noscriptPersist = Services.prefs.getBoolPref(persistPref, false);
let noscriptInited = Services.prefs.getBoolPref(
- "browser.security_level.noscript_inited",
+ kNoScriptInitedPref,
false
);
- // Set the noscript safety level once if we have never run noscript
- // before, or if we are not allowing noscript per-site settings to be
- // persisted between browser sessions. Otherwise make sure that the
- // security slider position, if changed, will rewrite the noscript
- // settings.
- bindPref(
- kSliderPref,
- sliderState =>
- setNoScriptSafetyLevel(securitySliderToSafetyLevel(sliderState)),
- !noscriptPersist || !noscriptInited
- );
- if (!noscriptInited) {
- Services.prefs.setBoolPref(
- "browser.security_level.noscript_inited",
- true
+ // Set the noscript safety level once at startup.
+ // If a user has set noscriptPersist, then we only send this if the
+ // security level was changed in a previous session.
+ // NOTE: We do not re-send this when the security_slider preference
+ // changes mid-session because this should always require a restart.
+ if (noscriptPersist && noscriptInited) {
+ logger.warn(
+ `Not initialising NoScript since the user has set ${persistPref}`
);
+ return;
}
+ // Read the security level, even if the user has the "custom"
+ // preference.
+ const securityIndex = Services.prefs.getIntPref(kSliderPref, 0);
+ const safetyLevel = securitySliderToSafetyLevel(securityIndex);
+ // May throw if NoScript fails to apply the settings:
+ const noscriptResult = await sendNoScriptSettings(
+ noscriptSettings(safetyLevel)
+ );
+ // Mark the NoScript extension as initialised so we do not reset it
+ // at the next startup for noscript_persist users.
+ Services.prefs.setBoolPref(kNoScriptInitedPref, true);
+ logger.info("NoScript successfully initialised.");
+ // In the future NoScript may tell us more about how it applied our
+ // settings, e.g. if user is overriding per-site permissions.
+ // Up to NoScript 12.6 noscriptResult is undefined.
+ logger.debug("NoScript response:", noscriptResult);
} catch (e) {
- logger.exception(e);
+ logger.error("Could not apply NoScript settings", e);
+ // Treat as a custom security level for the rest of the session.
+ Services.prefs.setBoolPref(kCustomPref, true);
}
};
waitForExtensionMessage(noscriptID, a => a.__meta.name === "started").then(
@@ -244,6 +237,8 @@ var initializeNoScriptControl = () => {
logger.info("Listening for messages from NoScript.");
} catch (e) {
logger.exception(e);
+ // Treat as a custom security level for the rest of the session.
+ Services.prefs.setBoolPref(kCustomPref, true);
}
};
@@ -274,16 +269,60 @@ const kSecuritySettings = {
// ### Prefs
+/**
+ * Amend the security level index to a standard value.
+ *
+ * @param {integer} index - The input index value.
+ * @returns {integer} - A standard index value.
+ */
+function fixupIndex(index) {
+ if (!Number.isInteger(index) || index < 1 || index > 4) {
+ // Unexpected value out of range, go to the "safest" level as a fallback.
+ return 1;
+ }
+ if (index === 3) {
+ // Migrate from old medium-low (3) to new medium (2).
+ return 2;
+ }
+ return index;
+}
+
+/**
+ * A list of preference observers that should be disabled whilst we write our
+ * preference values.
+ *
+ * @type {{ prefName: string, observer: object }[]}
+ */
+const prefObservers = [];
+
// __write_setting_to_prefs(settingIndex)__.
// Take a given setting index and write the appropriate pref values
// to the pref database.
var write_setting_to_prefs = function (settingIndex) {
- Object.keys(kSecuritySettings).forEach(prefName =>
- Services.prefs.setBoolPref(
- prefName,
- kSecuritySettings[prefName][settingIndex]
- )
- );
+ settingIndex = fixupIndex(settingIndex);
+ // Don't want to trigger our internal observers when setting ourselves.
+ for (const { prefName, observer } of prefObservers) {
+ Services.prefs.removeObserver(prefName, observer);
+ }
+ try {
+ // Make sure noscript is re-initialised at the next startup when the
+ // security level changes.
+ Services.prefs.setBoolPref(kNoScriptInitedPref, false);
+ Services.prefs.setIntPref(kSliderPref, settingIndex);
+ // NOTE: We do not clear kCustomPref. Instead, we rely on the preference
+ // being cleared on the next startup.
+ Object.keys(kSecuritySettings).forEach(prefName =>
+ Services.prefs.setBoolPref(
+ prefName,
+ kSecuritySettings[prefName][settingIndex]
+ )
+ );
+ } finally {
+ // Re-add the observers.
+ for (const { prefName, observer } of prefObservers) {
+ Services.prefs.addObserver(prefName, observer);
+ }
+ }
};
// __read_setting_from_prefs()__.
@@ -312,24 +351,6 @@ var read_setting_from_prefs = function (prefNames) {
return null;
};
-// __watch_security_prefs(onSettingChanged)__.
-// Whenever a pref bound to the security slider changes, onSettingChanged
-// is called with the new security setting value (1,2,3,4 or null).
-// Returns a zero-arg function that ends this binding.
-var watch_security_prefs = function (onSettingChanged) {
- let prefNames = Object.keys(kSecuritySettings);
- let unbindFuncs = [];
- for (let prefName of prefNames) {
- unbindFuncs.push(
- bindPrefAndInit(prefName, () =>
- onSettingChanged(read_setting_from_prefs())
- )
- );
- }
- // Call all the unbind functions.
- return () => unbindFuncs.forEach(unbind => unbind());
-};
-
// __initialized__.
// Have we called initialize() yet?
var initializedSecPrefs = false;
@@ -345,36 +366,82 @@ var initializeSecurityPrefs = function () {
}
logger.info("Initializing security-prefs.js");
initializedSecPrefs = true;
- // When security_custom is set to false, apply security_slider setting
- // to the security-sensitive prefs.
- bindPrefAndInit(kCustomPref, function (custom) {
- if (custom === false) {
- write_setting_to_prefs(Services.prefs.getIntPref(kSliderPref));
- }
- });
- // If security_slider is given a new value, then security_custom should
- // be set to false.
- bindPref(kSliderPref, function (prefIndex) {
+
+ const wasCustom = Services.prefs.getBoolPref(kCustomPref, false);
+ // For new profiles with no user preference, the security level should be "4"
+ // and it should not be custom.
+ let desiredIndex = Services.prefs.getIntPref(kSliderPref, 4);
+ desiredIndex = fixupIndex(desiredIndex);
+ // Make sure the user has a set preference user value.
+ Services.prefs.setIntPref(kSliderPref, desiredIndex);
+ Services.prefs.setBoolPref(kCustomPref, wasCustom);
+
+ // Make sure that the preference values at application startup match the
+ // expected values for the desired security level. See tor-browser#43783.
+
+ // NOTE: We assume that the controlled preference values that are read prior
+ // to profile-after-change do not change in value before this method is
+ // called. I.e. we expect the current preference values to match the
+ // preference values that were used during the application initialisation.
+ const effectiveIndex = read_setting_from_prefs();
+
+ if (wasCustom && effectiveIndex !== null) {
+ logger.info(`Custom startup values match index ${effectiveIndex}`);
+ // Do not consider custom any more.
+ // NOTE: This level needs to be set before it is read elsewhere. In
+ // particular, for the NoScript addon.
Services.prefs.setBoolPref(kCustomPref, false);
- write_setting_to_prefs(prefIndex);
+ Services.prefs.setIntPref(kSliderPref, effectiveIndex);
+ } else if (!wasCustom && effectiveIndex !== desiredIndex) {
+ // NOTE: We assume all our controlled preferences require a restart.
+ // In practice, only a subset of these preferences may actually require a
+ // restart, so we could switch their values. But we treat them all the same
+ // for simplicity, consistency and stability in case mozilla changes the
+ // restart requirements.
+ logger.info(`Startup values do not match for index ${desiredIndex}`);
+ SecurityLevelPrefs.requireRestart();
+ }
+
+ // Start listening for external changes to the controlled preferences.
+ prefObservers.push({
+ prefName: kCustomPref,
+ observer: bindPref(kCustomPref, custom => {
+ // Custom flag was removed mid-session. Requires a restart to apply the
+ // security level.
+ if (custom === false) {
+ logger.info("Custom flag was cleared externally");
+ SecurityLevelPrefs.requireRestart();
+ }
+ }),
});
- // If a security-sensitive pref changes, then decide if the set of pref values
- // constitutes a security_slider setting or a custom value.
- watch_security_prefs(settingIndex => {
- if (settingIndex === null) {
- Services.prefs.setBoolPref(kCustomPref, true);
- } else {
- Services.prefs.setIntPref(kSliderPref, settingIndex);
- Services.prefs.setBoolPref(kCustomPref, false);
- }
+ prefObservers.push({
+ prefName: kSliderPref,
+ observer: bindPref(kSliderPref, () => {
+ // Security level was changed mid-session. Requires a restart to apply.
+ logger.info("Security level was changed externally");
+ SecurityLevelPrefs.requireRestart();
+ }),
});
- // Migrate from old medium-low (3) to new medium (2).
- if (
- Services.prefs.getBoolPref(kCustomPref) === false &&
- Services.prefs.getIntPref(kSliderPref) === 3
- ) {
- Services.prefs.setIntPref(kSliderPref, 2);
- write_setting_to_prefs(2);
+
+ for (const prefName of Object.keys(kSecuritySettings)) {
+ prefObservers.push({
+ prefName,
+ observer: bindPref(prefName, () => {
+ logger.warn(
+ `The controlled preference ${prefName} was changed externally.` +
+ " Treating as a custom security level."
+ );
+ // Something outside of this module changed the preference value for a
+ // preference we control.
+ // Always treat as a custom security level for the rest of this session,
+ // even if the new preference values match a pre-set security level. We
+ // do this because some controlled preferences require a restart to be
+ // properly applied. See tor-browser#43783.
+ // In the case where it does match a pre-set security level, the custom
+ // flag will be cleared at the next startup.
+ Services.prefs.setBoolPref(kCustomPref, true);
+ }),
+ });
}
logger.info("security-prefs.js initialization complete");
@@ -426,8 +493,9 @@ export class SecurityLevel {
init() {
migratePreferences();
- initializeNoScriptControl();
+ // Fixup our preferences before we pass on the security level to NoScript.
initializeSecurityPrefs();
+ initializeNoScriptControl();
}
observe(aSubject, aTopic, aData) {
@@ -437,10 +505,19 @@ export class SecurityLevel {
}
}
+/**
+ * @typedef {object} SecurityLevelRestartNotificationHandler
+ *
+ * An object that can serve the user a restart notification.
+ *
+ * @property {Function} tryRestartBrowser - The method that should be called to
+ * ask the user to restart the browser.
+ */
+
/*
Security Level Prefs
- Getters and Setters for relevant torbutton prefs
+ Getters and Setters for relevant security level prefs
*/
export const SecurityLevelPrefs = {
SecurityLevels: Object.freeze({
@@ -451,6 +528,14 @@ export const SecurityLevelPrefs = {
security_slider_pref: "browser.security_level.security_slider",
security_custom_pref: "browser.security_level.security_custom",
+ /**
+ * The current security level preference.
+ *
+ * This ignores any custom settings the user may have changed, and just
+ * gives the underlying security level.
+ *
+ * @type {?string}
+ */
get securityLevel() {
// Set the default return value to 0, which won't match anything in
// SecurityLevels.
@@ -460,18 +545,147 @@ export const SecurityLevelPrefs = {
)?.[0];
},
- set securityLevel(level) {
- const val = this.SecurityLevels[level];
- if (val !== undefined) {
- Services.prefs.setIntPref(this.security_slider_pref, val);
- }
+ /**
+ * Set the desired security level just before a restart.
+ *
+ * The caller must restart the browser after calling this method.
+ *
+ * @param {string} level - The name of the new security level to set.
+ */
+ setSecurityLevelBeforeRestart(level) {
+ write_setting_to_prefs(this.SecurityLevels[level]);
},
+ /**
+ * Whether the user has any custom setting values that do not match a pre-set
+ * security level.
+ *
+ * @type {boolean}
+ */
get securityCustom() {
return Services.prefs.getBoolPref(this.security_custom_pref);
},
- set securityCustom(val) {
- Services.prefs.setBoolPref(this.security_custom_pref, val);
+ /**
+ * A summary of the current security level.
+ *
+ * If the user has some custom settings, this returns "custom". Otherwise
+ * returns the name of the security level.
+ *
+ * @type {string}
+ */
+ get securityLevelSummary() {
+ if (this.securityCustom) {
+ return "custom";
+ }
+ return this.securityLevel ?? "custom";
+ },
+
+ /**
+ * Whether the browser should be restarted to apply the security level.
+ *
+ * @type {boolean}
+ */
+ _needRestart: false,
+
+ /**
+ * The external handler that can show a notification to the user, if any.
+ *
+ * @type {?SecurityLevelRestartNotificationHandler}
+ */
+ _restartNotificationHandler: null,
+
+ /**
+ * Set the external handler for showing notifications to the user.
+ *
+ * This should only be called once per session once the handler is ready to
+ * show a notification, which may occur immediately during this call.
+ *
+ * @param {SecurityLevelRestartNotificationHandler} handler - The new handler
+ * to use.
+ */
+ setRestartNotificationHandler(handler) {
+ logger.info("Restart notification handler is set");
+ this._restartNotificationHandler = handler;
+ if (this._needRestart) {
+ // Show now using the new handler.
+ this._tryShowRestartNotification();
+ }
+ },
+
+ /**
+ * A promise for any ongoing notification prompt task.
+ *
+ * @type {Promise}
+ */
+ _restartNotificationPromise: null,
+
+ /**
+ * Try show a notification to the user.
+ *
+ * If no notification handler has been attached yet, this will do nothing.
+ */
+ async _tryShowRestartNotification() {
+ if (!this._restartNotificationHandler) {
+ logger.info("Missing a restart notification handler");
+ // This may be added later in the session.
+ return;
+ }
+
+ const prevPromise = this._restartNotificationPromise;
+ let resolve;
+ this._restartNotificationPromise = new Promise(r => {
+ resolve = r;
+ });
+ await prevPromise;
+
+ try {
+ await this._restartNotificationHandler?.tryRestartBrowser();
+ } finally {
+ // Allow the notification to be shown again.
+ resolve();
+ }
+ },
+
+ /**
+ * Mark the session as requiring a restart to apply a change in security
+ * level.
+ *
+ * The security level will immediately be switched to "custom", and the user
+ * may be shown a notification to restart the browser.
+ */
+ requireRestart() {
+ logger.warn("The browser needs to be restarted to set the security level");
+ // Treat as a custom security level for the rest of the session.
+ // At the next startup, the custom flag may be cleared if the settings are
+ // as expected.
+ Services.prefs.setBoolPref(kCustomPref, true);
+ this._needRestart = true;
+
+ // NOTE: We need to change the controlled security level preferences in
+ // response to the desired change in security level. We could either:
+ // 1. Only change the controlled preferences after the user confirms a
+ // restart. Or
+ // 2. Change the controlled preferences and then try and ask the user to
+ // restart.
+ //
+ // We choose the latter:
+ // 1. To allow users to manually restart.
+ // 2. If the user ignores or misses the notification, they will at least be
+ // in the correct state when the browser starts again. Although they will
+ // be in a custom/undefined state in the mean time.
+ // 3. Currently Android relies on triggering the change in security level
+ // by setting the browser.security_level.security_slider preference
+ // value. So it currently uses this path. So we need to set the values
+ // now, before it preforms a restart.
+ // TODO: Have android use the `setSecurityLevelBeforeRestart` method
+ // instead of setting the security_slider preference value directly, so that
+ // it knows exactly when it can restart the browser. tor-browser#43820
+ write_setting_to_prefs(Services.prefs.getIntPref(kSliderPref, 0));
+ // NOTE: Even though we have written the preferences, the session should
+ // still be marked as "custom" because:
+ // 1. Some preferences require a browser restart to be applied.
+ // 2. NoScript has not been updated with the new settings.
+ this._tryShowRestartNotification();
},
}; /* Security Level Prefs */
=====================================
toolkit/locales/en-US/toolkit/global/base-browser.ftl
=====================================
@@ -118,10 +118,6 @@ security-level-toolbar-button-custom =
# Uses sentence case in English (US).
security-level-panel-heading = Security level
-
-security-level-panel-level-standard = Standard
-security-level-panel-level-safer = Safer
-security-level-panel-level-safest = Safest
security-level-panel-learn-more-link = Learn more
# Button to open security level settings.
security-level-panel-open-settings-button = Settings…
@@ -131,6 +127,19 @@ security-level-panel-open-settings-button = Settings…
security-level-preferences-heading = Security Level
security-level-preferences-overview = Disable certain web features that can be used to attack your security and anonymity.
security-level-preferences-learn-more-link = Learn more
+# Text for a badge that labels the currently active security level.
+# The text in between '<span>' and '</span>' should contain some kind of bracket, like '(' and ')', or other punctuation used in your language to separate out text from its surrounding context. This will not be visible, but will be use for screen readers to make it clear that the text is not part of the same sentence. For example, in US English this would be read as "(Current level)", and the full line of text would be read as "Safest (Current level)".
+security-level-preferences-current-badge = <span>(</span>Current level<span>)</span>
+security-level-preferences-change-button = Change…
+
+## Security level settings dialog.
+
+security-level-dialog-window =
+ .title = Change security level
+
+# '-brand-short-name' is the localized browser name, like "Tor Browser".
+security-level-dialog-restart-description = You will need to restart { -brand-short-name } to apply any changes. This will close all windows and tabs.
+
security-level-preferences-level-standard =
.label = Standard
security-level-preferences-level-safer =
@@ -138,6 +147,16 @@ security-level-preferences-level-safer =
security-level-preferences-level-safest =
.label = Safest
+security-level-dialog-save-restart =
+ .label = Save and restart
+
+## Security level names shown in the security panel and settings.
+
+security-level-panel-level-standard = Standard
+security-level-panel-level-safer = Safer
+security-level-panel-level-safest = Safest
+security-level-panel-level-custom = Custom
+
## Security level summaries shown in security panel and settings.
security-level-summary-standard = All browser and website features are enabled.
@@ -156,16 +175,16 @@ security-level-preferences-bullet-limit-font-and-symbols-and-images = Some fonts
## Custom security level.
## Some custom preferences configuration has placed the user outside one of the standard three levels.
-# Shown in the security level panel as an orange badge next to the expected level.
-security-level-panel-custom-badge = Custom
-# Shown in the security level settings in a warning box.
-security-level-preferences-custom-heading = Custom security level configured
# Description of custom state and recommended action.
# Shown in the security level panel and settings.
security-level-summary-custom = Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels.
-# Button to undo custom changes to the security level and place the user in one of the standard security levels.
-# Shown in the security level panel and settings.
-security-level-restore-defaults-button = Restore defaults
+
+## Security level restart prompt.
+
+security-level-restart-prompt-title = Your security level settings require a restart
+security-level-restart-prompt-body = You must restart { -brand-short-name } for your security level settings to be applied. This will close all your windows and tabs.
+security-level-restart-prompt-button-restart = Restart
+security-level-restart-prompt-button-ignore = Ignore
## Notification for dropped operating system support.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/d3e4ff…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/d3e4ff…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][tor-browser-140.0a1-15.0-1] 3 commits: fixup! Tweaks to the build system
by brizental (@brizental) 12 Jun '25
by brizental (@brizental) 12 Jun '25
12 Jun '25
brizental pushed to branch tor-browser-140.0a1-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
fadec010 by Beatriz Rizental at 2025-06-12T17:31:27+02:00
fixup! Tweaks to the build system
Make it possible to provide MOZ_PKG_MAC_DSSTORE, MOZ_PKG_MAC_BACKGROUND,
MOZ_PKG_MAC_ICON as environment variables. These files are not where the
build system expects it.
In our build system these files are in
tor-browser-build/projects/browser/Bundle-Data/BaseBrowser.dmg while the
build system expects it to be in browser/branding/tb-*.
For ./mach package to work properly when building for macos we need
these locations. Passing them as env vars is fine for building artifacts
in tbb.
- - - - -
d1bcbcb1 by Beatriz Rizental at 2025-06-12T17:31:27+02:00
fixup! Tweaks to the build system
Disable inclusion of browser/installer/windows into packaged development
artifacts. That file is not included by our builds -- at least not by
the ones done by tor-browser-build.
Attempting to zip the unexisting folder will crash `./mach package` when
building inside tor-browser-build.
- - - - -
315fd439 by Beatriz Rizental at 2025-06-12T17:31:28+02:00
BB 43843: Do not bootstrap MacOS packaging tools if available
Do not bootstrap MacOS packing tools if they are already available in
the environment. This can be uplifted.
- - - - -
3 changed files:
- python/mozbuild/mozbuild/action/make_dmg.py
- toolkit/mozapps/installer/packager.mk
- toolkit/mozapps/installer/upload-files.mk
Changes:
=====================================
python/mozbuild/mozbuild/action/make_dmg.py
=====================================
@@ -7,6 +7,7 @@ import platform
import sys
from pathlib import Path
+import buildconfig
from mozpack import dmg
from mozbuild.bootstrap import bootstrap_toolchain
@@ -46,9 +47,11 @@ def main(args):
)
# Resolve required tools
- dmg_tool = bootstrap_toolchain("dmg/dmg")
- hfs_tool = bootstrap_toolchain("dmg/hfsplus")
- mkfshfs_tool = bootstrap_toolchain("hfsplus/newfs_hfs")
+ dmg_tool = buildconfig.substs.get("DMG_TOOL") or bootstrap_toolchain("dmg/dmg")
+ hfs_tool = buildconfig.substs.get("HFS_TOOL") or bootstrap_toolchain("dmg/hfsplus")
+ mkfshfs_tool = buildconfig.substs.get("MKFSHFS") or bootstrap_toolchain(
+ "hfsplus/newfs_hfs"
+ )
dmg.create_dmg(
source_directory=Path(options.inpath),
=====================================
toolkit/mozapps/installer/packager.mk
=====================================
@@ -135,7 +135,7 @@ make-package: FORCE
$(MAKE) make-package-internal
ifeq (WINNT,$(OS_ARCH))
ifeq ($(MOZ_PKG_FORMAT),ZIP)
- $(MAKE) -C windows ZIP_IN='$(ABS_DIST)/$(PACKAGE)' installer
+# $(MAKE) -C windows ZIP_IN='$(ABS_DIST)/$(PACKAGE)' installer
endif
endif
ifdef MOZ_AUTOMATION
=====================================
toolkit/mozapps/installer/upload-files.mk
=====================================
@@ -205,9 +205,9 @@ ifeq ($(MOZ_PKG_FORMAT),DMG)
_ABS_MOZSRCDIR = $(shell cd $(MOZILLA_DIR) && pwd)
PKG_DMG_SOURCE = $(MOZ_PKG_DIR)
- MOZ_PKG_MAC_DSSTORE=$(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/dsstore
- MOZ_PKG_MAC_BACKGROUND=$(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/background.png
- MOZ_PKG_MAC_ICON=$(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/disk.icns
+ MOZ_PKG_MAC_DSSTORE?=$(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/dsstore
+ MOZ_PKG_MAC_BACKGROUND?=$(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/background.png
+ MOZ_PKG_MAC_ICON?=$(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/disk.icns
INNER_MAKE_PACKAGE = \
$(call py_action,make_dmg, \
$(if $(MOZ_PKG_MAC_DSSTORE),--dsstore '$(MOZ_PKG_MAC_DSSTORE)') \
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/759ac0…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/759ac0…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser-build][main] Bug 41453: Update android toochain for building application-services
by brizental (@brizental) 12 Jun '25
by brizental (@brizental) 12 Jun '25
12 Jun '25
brizental pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
df7c4ade by Beatriz Rizental at 2025-06-12T09:12:15+02:00
Bug 41453: Update android toochain for building application-services
- - - - -
13 changed files:
- projects/android-toolchain/config
- projects/application-services/a-s-noop.diff
- − projects/application-services/bug40485-nimbus-fml-reproducibility.diff
- projects/application-services/build
- projects/application-services/config
- projects/application-services/glean-noop.diff
- projects/application-services/gradle-dependencies-list.txt
- projects/application-services/list_toolchain_updates_checks
- projects/application-services/local-repository.diff
- − projects/application-services/ohttp-no-git.diff
- projects/glean/config
- projects/gradle/config
- projects/uniffi-rs/config
Changes:
=====================================
projects/android-toolchain/config
=====================================
@@ -1,7 +1,7 @@
# vim: filetype=yaml sw=2
# FIXME: Rework this whole mess
filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.[% c("compress_tar") %]'
-version: '34.0.0'
+version: 36.0.0
var:
setup: |
mkdir -p /var/tmp/dist
@@ -29,39 +29,39 @@ var:
export PATH=$PATH:$GRADLE_HOME/bin
[% END -%]
google_repo: https://dl.google.com/android/repository
- android_api_level: 34
- android_release_dir: android-14
- android_platform_revision: '03'
- android_ndk_version: 26
- android_ndk_revision: c
- android_ndk_version_build: 26.2.11394342
+ android_api_level: 36
+ android_release_dir: android-16
+ android_platform_revision: '01'
+ android_ndk_version: 28
+ android_ndk_revision: b
+ android_ndk_version_build: 28.1.13356709
# We need the following two variables for get_build_tools, used by signing
# scripts.
- build_tools_version: 34
- build_tools_filename: 'build-tools_r[% c("var/build_tools_version") %]-linux.zip'
- build_tools_sha512sum: c28dd52f8eca82996726905617f3cb4b0f0aee1334417b450d296991d7112cab1288f5fd42c48a079ba6788218079f81caa3e3e9108e4a6f27163a1eb7f32bd7
- commandlinetools_version: 11076708
- commandlinetools_version_string: 12.0
+ build_tools_version: 36
+ build_tools_filename: 'build-tools_r[% c("var/build_tools_version") %]_linux.zip'
+ build_tools_sha512sum: 277c08c2dcced3c1cc46ce0349e18adc6d6d4b8739868eab5d469f9fb4e9c6b79aa9d2a6592cfc5db0ccb8690fcc75a44db4b18b03dcf349efd0eb54025ef5ca
+ commandlinetools_version: 13114758
+ commandlinetools_version_string: 19.0
input_files:
# Hashes can be compared with https://gitlab.com/fdroid/android-sdk-transparency-log/-/blob/master/checks…
- URL: '[% c("var/google_repo") %]/commandlinetools-linux-[% c("var/commandlinetools_version") %]_latest.zip'
name: android_commandlinetools
- sha256sum: 2d2d50857e4eb553af5a6dc3ad507a17adf43d115264b1afc116f95c92e5e258
+ sha256sum: 7ec965280a073311c339e571cd5de778b9975026cfcbe79f2b1cdcb1e15317ee
- URL: '[% c("var/google_repo") %]/android-ndk-r[% c("var/android_ndk_version") %][% c("var/android_ndk_revision") %]-linux.zip'
name: android_ndk_compiler
- sha256sum: 6d6e659834d28bb24ba7ae66148ad05115ebbad7dabed1af9b3265674774fcf6
+ sha256sum: e9f2759862cecfd48c20bbb7d8cfedbb020f4d91b5f78d9a2fc106f7db3c27ed
- URL: '[% c("var/google_repo") %]/[% c("var/build_tools_filename") %]'
name: build_tools
sha512sum: '[% c("var/build_tools_sha512sum") %]'
- - URL: '[% c("var/google_repo") %]/platform-[% c("var/android_api_level") %]-ext7_r[% c("var/android_platform_revision") %].zip'
+ - URL: '[% c("var/google_repo") %]/platform-[% c("var/android_api_level") %]_r[% c("var/android_platform_revision") %].zip'
name: platform
- sha256sum: 16fdb74c55e59ae3ef52def135aec713508467bd56d7dabcd8c9be31fa8b20f3
+ sha256sum: a5273f7d68de0a6a58032b26c24965634bc14ed3839e70a3a9759369f3f6c02a
# ./mach bootstrap is fetching the latest version, so it does not seem to
# matter which particular version we are using. Pin to the one fitting best to
# SDK version/build-tools version.
- URL: '[% c("var/google_repo") %]/platform-tools_r[% c("version") %]-linux.zip'
name: platform_tools
- sha256sum: 8137c2834dea05cb64c1a8bc041ea00fcd43e3a8a29429ad4f25b8ee51efebf6
+ sha256sum: 0ead642c943ffe79701fccca8f5f1c69c4ce4f43df2eefee553f6ccb27cbfbe8
steps:
# The get_build_tools step is used by tools/signing/android-signing
get_build_tools:
=====================================
projects/application-services/a-s-noop.diff
=====================================
@@ -1,3 +1,48 @@
+diff --git a/build-scripts/component-common.gradle b/build-scripts/component-common.gradle
+index a126341b0..3b3579290 100644
+--- a/build-scripts/component-common.gradle
++++ b/build-scripts/component-common.gradle
+@@ -111,16 +111,30 @@ ext.configureUniFFIBindgen = { crateName ->
+ commandLine "${mozconfig.topobjdir}/dist/host/bin/embedded-uniffi-bindgen", 'generate', '--library', libraryPath, "--crate", crateName, '--language', 'kotlin', '--out-dir', uniffiOutDir.get(), '--no-format'
+ }
+ } else {
+- def libraryPath = megazordNative.asFileTree.matching {
+- include "${nativeRustTarget}/libmegazord.*"
+- }.singleFile
+-
+- if (libraryPath == null) {
+- throw new GradleException("libmegazord dynamic library path not found")
+- }
+- exec {
+- workingDir project.rootDir
+- commandLine '/usr/bin/env', 'cargo', 'uniffi-bindgen', 'generate', '--library', libraryPath, "--crate", crateName, '--language', 'kotlin', '--out-dir', uniffiOutDir.get(), '--no-format'
++ if (crateName.toString().contains("places")) {
++ def libraryPath = megazordNative.asFileTree.matching {
++ include "${nativeRustTarget}/libmegazord.*"
++ }.singleFile
++
++ if (libraryPath == null) {
++ throw new GradleException("libmegazord dynamic library path not found")
++ }
++ exec {
++ workingDir project.rootDir
++ commandLine '/usr/bin/env', 'cargo', 'uniffi-bindgen', 'generate', '--library', libraryPath, "--crate", crateName, '--language', 'kotlin', '--out-dir', uniffiOutDir.get(), '--no-format'
++ }
++ } else {
++ def libraryPath = "${project.rootDir}/megazords/full/target/debug/libmegazord.so"
++ exec {
++ workingDir project.rootDir
++ def command = ["${rootProject.projectDir}/uniffi-rs/uniffi-bindgen", 'generate', '--library', libraryPath, "--crate", crateName, '--language', 'kotlin', '--out-dir', uniffiOutDir.get(), '--no-format']
++ println "Executing command: ${command.join(' ')}"
++ commandLine command
++
++ // Print both stdout and stderr to Gradle's console
++ standardOutput = System.out
++ errorOutput = System.err
++ }
+ }
+ }
+ }
diff --git a/components/fxa-client/android/src/main/java/mozilla/appservices/fxaclient/Config.kt b/components/fxa-client/android/src/main/java/mozilla/appservices/fxaclient/Config.kt
index 78c16dd0a..d2615fa74 100644
--- a/components/fxa-client/android/src/main/java/mozilla/appservices/fxaclient/Config.kt
@@ -9,10 +54,10 @@ index 78c16dd0a..d2615fa74 100644
+ is FxaServer.__NOOP -> ""
}
diff --git a/components/nimbus/android/src/main/java/org/mozilla/experiments/nimbus/Nimbus.kt b/components/nimbus/android/src/main/java/org/mozilla/experiments/nimbus/Nimbus.kt
-index 8c05be9cf..6bf2ec15d 100644
+index 376ef90d9..d80eea50f 100644
--- a/components/nimbus/android/src/main/java/org/mozilla/experiments/nimbus/Nimbus.kt
+++ b/components/nimbus/android/src/main/java/org/mozilla/experiments/nimbus/Nimbus.kt
-@@ -532,6 +532,8 @@ open class Nimbus(
+@@ -535,6 +535,8 @@ open class Nimbus(
),
)
}
@@ -22,10 +67,10 @@ index 8c05be9cf..6bf2ec15d 100644
}
}
diff --git a/megazords/full/Cargo.toml b/megazords/full/Cargo.toml
-index 75f44a812..a51c0643b 100644
+index c5e9eea19..ce899aac1 100644
--- a/megazords/full/Cargo.toml
+++ b/megazords/full/Cargo.toml
-@@ -9,21 +9,21 @@ license = "MPL-2.0"9345a6ea
+@@ -9,24 +9,24 @@ license = "MPL-2.0"
crate-type = ["cdylib"]
[dependencies]
@@ -49,6 +94,8 @@ index 75f44a812..a51c0643b 100644
-crashtest = { path = "../../components/crashtest" }
-error-support = { path = "../../components/support/error" }
-suggest = { path = "../../components/suggest" }
+-search = { path = "../../components/search" }
+-tracing-support = { path = "../../components/support/tracing" }
+# push = { path = "../../components/push" }
+# remote_settings = { path = "../../components/remote_settings" }
+# rust-log-forwarder = { path = "../../components/support/rust-log-forwarder" }
@@ -58,13 +105,16 @@ index 75f44a812..a51c0643b 100644
+# crashtest = { path = "../../components/crashtest" }
+# error-support = { path = "../../components/support/error" }
+# suggest = { path = "../../components/suggest" }
++# search = { path = "../../components/search" }
++# tracing-support = { path = "../../components/support/tracing" }
lazy_static = "1.4"
+ init_rust_components = { path = "../../components/init_rust_components" }
diff --git a/megazords/full/src/lib.rs b/megazords/full/src/lib.rs
-index 01d1be98b..a68eb647f 100644
+index 4b6ba4499..e4fde58ae 100644
--- a/megazords/full/src/lib.rs
+++ b/megazords/full/src/lib.rs
-@@ -8,20 +8,20 @@
+@@ -8,24 +8,24 @@
use std::ffi::CString;
use std::os::raw::c_char;
@@ -72,46 +122,37 @@ index 01d1be98b..a68eb647f 100644
-pub use crashtest;
-pub use error_support;
-pub use fxa_client;
+-pub use init_rust_components;
-pub use logins;
+-pub use merino;
-pub use nimbus;
+// pub use autofill;
+// pub use crashtest;
+// pub use error_support;
+// pub use fxa_client;
++// pub use init_rust_components;
+// pub use logins;
++// pub use merino;
+// pub use nimbus;
pub use places;
-pub use push;
-pub use remote_settings;
-pub use rust_log_forwarder;
+-pub use search;
-pub use suggest;
-pub use sync_manager;
-pub use tabs;
+-pub use tracing_support;
-pub use viaduct;
+// pub use push;
+// pub use remote_settings;
+// pub use rust_log_forwarder;
++// pub use search;
+// pub use suggest;
+// pub use sync_manager;
+// pub use tabs;
++// pub use tracing_support;
+// pub use viaduct;
// TODO: Uncomment this code when webext-storage component is integrated in android
// pub use webext_storage;
-diff --git a/publish.gradle b/publish.gradle
-index 71f5d55b9..659e26489 100644
---- a/publish.gradle
-+++ b/publish.gradle
-@@ -194,7 +194,11 @@ ext.configureUniFFIBindgen = { udlFilePath ->
- def uniffiGeneratedPath = "generated/source/uniffi/${variant.name}/java"
- def t = tasks.register("generate${variant.name.capitalize()}UniFFIBindings", Exec) {
- workingDir project.rootDir
-- commandLine '/usr/bin/env', 'cargo', 'uniffi-bindgen', 'generate', "${project.projectDir}/${udlFilePath}", '--language', 'kotlin', '--out-dir', "${buildDir}/${uniffiGeneratedPath}"
-+ if (udlFilePath.contains("places")) {
-+ commandLine '/usr/bin/env', 'cargo', 'uniffi-bindgen', 'generate', "${project.projectDir}/${udlFilePath}", '--language', 'kotlin', '--out-dir', "${buildDir}/${uniffiGeneratedPath}"
-+ } else {
-+ commandLine '/usr/bin/env', "${rootProject.projectDir}/uniffi-rs/uniffi-bindgen", 'generate', "${project.projectDir}/${udlFilePath}", '--language', 'kotlin', '--out-dir', "${buildDir}/${uniffiGeneratedPath}"
-+ }
- outputs.dir "${buildDir}/${uniffiGeneratedPath}"
- // Re-generate if the interface definition changes.
- inputs.file "${project.projectDir}/${udlFilePath}"
=====================================
projects/application-services/bug40485-nimbus-fml-reproducibility.diff deleted
=====================================
@@ -1,48 +0,0 @@
-diff --git a/components/support/nimbus-fml/src/intermediate_representation.rs b/components/support/nimbus-fml/src/intermediate_representation.rs
-index 97d545672..249406a0c 100644
---- a/components/support/nimbus-fml/src/intermediate_representation.rs
-+++ b/components/support/nimbus-fml/src/intermediate_representation.rs
-@@ -237,10 +237,10 @@ pub struct FeatureManifest {
- pub(crate) about: AboutBlock,
-
- #[serde(default)]
-- pub(crate) imported_features: HashMap<ModuleId, BTreeSet<String>>,
-+ pub(crate) imported_features: BTreeMap<ModuleId, BTreeSet<String>>,
-
- #[serde(default)]
-- pub(crate) all_imports: HashMap<ModuleId, FeatureManifest>,
-+ pub(crate) all_imports: BTreeMap<ModuleId, FeatureManifest>,
- }
-
- impl TypeFinder for FeatureManifest {
-diff --git a/components/support/nimbus-fml/src/parser.rs b/components/support/nimbus-fml/src/parser.rs
-index 49cace525..cdf692b86 100644
---- a/components/support/nimbus-fml/src/parser.rs
-+++ b/components/support/nimbus-fml/src/parser.rs
-@@ -223,7 +223,7 @@ impl Parser {
- &self,
- current: &FilePath,
- channel: Option<&str>,
-- imports: &mut HashMap<ModuleId, FeatureManifest>,
-+ imports: &mut BTreeMap<ModuleId, FeatureManifest>,
- // includes: &mut HashSet<ModuleId>,
- ) -> Result<ModuleId> {
- let id = current.try_into()?;
-@@ -253,7 +253,7 @@ impl Parser {
- // This loop does the work of merging the default blocks back into the imported manifests.
- // We'll then attach all the manifests to the root (i.e. the one we're generating code for today), in `imports`.
- // We associate only the feature ids with the manifest we're loading in this method.
-- let mut imported_feature_id_map = HashMap::new();
-+ let mut imported_feature_id_map = BTreeMap::new();
-
- for block in &frontend.imports {
- // 1. Load the imported manifests in to the hash map.
-@@ -328,7 +328,7 @@ impl Parser {
- &self,
- channel: Option<&str>,
- ) -> Result<FeatureManifest, FMLError> {
-- let mut manifests = HashMap::new();
-+ let mut manifests = BTreeMap::new();
- let id = self.load_imports(&self.source, channel, &mut manifests)?;
- let mut fm = manifests
- .remove(&id)
=====================================
projects/application-services/build
=====================================
@@ -6,8 +6,8 @@
gradle_tarfile => c("input_files_by_name/gradle"),
}) %]
pushd /var/tmp/dist/android-toolchain/android-sdk-linux/build-tools/
-unzip $rootdir/'[% c("input_files_by_name/build_tools_30") %]'
-mv android-11 30.0.3
+unzip $rootdir/'[% c("input_files_by_name/build_tools_35") %]'
+mv android-15 35.0
popd
distdir=/var/tmp/dist/[% project %]
@@ -73,6 +73,19 @@ tar -xf $rootdir/[% c('input_files_by_name/uniffi-rs') %]
# latest versions of dependencies sometimes.
sed -i '$ s/$/-TORBROWSER/' version.txt
+pushd libs
+ln -s $rootdir/[% c("input_files_by_name/nss") %] ./
+ln -s $rootdir/bug_13028.patch
+patch -p2 < $rootdir/apply-bug-13028.diff
+patch -p2 < $rootdir/no-ndk-lookup.diff
+./build-all.sh desktop
+./build-all.sh android
+popd
+
+pushd megazords/full
+NSS_DIR=$(pwd)/../../libs/desktop/linux-x86-64/nss cargo build --target-dir=$(pwd)/target
+popd
+
cp $rootdir/cargo-no-build.sh megazords/full/android/
chmod +x megazords/full/android/cargo-no-build.sh
patch -p1 < $rootdir/a-s-noop.diff
@@ -83,15 +96,6 @@ cp $builddir/uniffi-rs/uniffi-bindgen glean-core/android-native/
patch -p1 < $rootdir/glean-noop.diff
popd
-pushd libs
-ln -s $rootdir/[% c("input_files_by_name/nss") %] ./
-ln -s $rootdir/bug_13028.patch
-patch -p2 < $rootdir/apply-bug-13028.diff
-patch -p2 < $rootdir/no-ndk-lookup.diff
-./build-all.sh desktop
-./build-all.sh android
-popd
-
[% IF c('var/fetch_gradle_dependencies') %]
# XXX: `assemble` is still not enough to see all fetched dependencies via
# Gradle's --debug. See: tor-browser-build#40056.
@@ -104,8 +108,6 @@ popd
export LC_ALL=C.UTF-8
export LANG=C.UTF-8
patch -p1 < $rootdir/local-repository.diff
- patch -p1 < $rootdir/ohttp-no-git.diff
- patch -p1 < $rootdir/bug40485-nimbus-fml-reproducibility.diff
patch -p1 < $rootdir/offline-nimbus-fml.diff
patch -p1 < $rootdir/41422-disable-viaduct.diff
gradle_flags="--offline --no-daemon"
=====================================
projects/application-services/config
=====================================
@@ -1,6 +1,6 @@
# vim: filetype=yaml sw=2
-version: 128.0.1
-git_hash: 0e4777f4133a98f44bca164fcf0406e8f706dbe4
+version: 140.0
+git_hash: 8ee6cb6a23f96ff8e2161926441aea72d6f09249
git_url: https://github.com/mozilla/application-services
git_submodule: 1
container:
@@ -8,11 +8,11 @@ container:
var:
# This should be updated when the list of gradle dependencies is changed.
- gradle_dependencies_version: 11
- gradle_version: 8.8
- glean_parser: 14.0.1
- nss_version: '3.101'
- nspr_version: '4.35'
+ gradle_dependencies_version: 12
+ gradle_version: 8.13
+ glean_parser: 17.1.0
+ nss_version: '3.110'
+ nspr_version: '4.36'
steps:
build:
@@ -21,7 +21,7 @@ steps:
# Due to some issue in application-service causing non matching
# builds when build time differ a lot, we need to do periodic rebuilds:
# https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/merge_re…
- rebuild_date: '2024-09-12'
+ rebuild_date: '2025-06-12'
arch_deps:
# Needed to build NSS
- gyp
@@ -43,16 +43,16 @@ steps:
- project: uniffi-rs
name: uniffi-rs
pkg_type: build
- # Only Application Services currently requires build tools 30.0.3.
+ # Only Application Services currently requires build tools 35.
# So, download them only here, rather than adding them to the shared
# toolchain.
- - URL: 'https://dl.google.com/android/repository/build-tools_r30.0.3-linux.zip'
- name: build_tools_30
- sha256sum: 24593500aa95d2f99fb4f10658aae7e65cb519be6cd33fa164f15f27f3c4a2d6
+ - URL: 'https://dl.google.com/android/repository/build-tools_r35_linux.zip'
+ name: build_tools_35
+ sha256sum: bd3a4966912eb8b30ed0d00b0cda6b6543b949d5ffe00bea54c04c81e1561d88
# NSS version ans sha256 are in libs/build-all.sh.
- URL: 'https://ftp.mozilla.org/pub/security/nss/releases/NSS_[% c("var/nss_version") | replace("\\.", "_") %]_RTM/src/nss-[% c("var/nss_version") %]-with-nspr-[% c("var/nspr_version") %].tar.gz'
name: nss
- sha256sum: 566faa9283ff3d9a7d6c44272df6e4330e3e06ca4e841a68840d31b27c9161c4
+ sha256sum: 96114bef9e9692dda6e7793da26fedef0dc0449c3644ebe1122464e599a39dc0
- filename: 'gradle-dependencies-[% c("var/gradle_dependencies_version") %]'
name: gradle-dependencies
exec: '[% INCLUDE "fetch-gradle-dependencies" %]'
@@ -65,19 +65,14 @@ steps:
project: application-services
pkg_type: cargo_vendor
norec:
- sha256sum: 92ce1131b35bf78d86362670ba7e4930ecdd1117694996d7cce850e4860f90b6
+ sha256sum: 4cf0235b525b5ce1d8bcc40e9763a13fd0e79c773749b900b4d7420551cf5114
- filename: local-repository.diff
enable: '[% !c("var/fetch_gradle_dependencies") %]'
- filename: gen_gradle_deps_file.sh
enable: '[% c("var/fetch_gradle_dependencies") %]'
- filename: bug_13028.patch
- filename: apply-bug-13028.diff
- # Delete when this patch is included upstream
- - filename: bug40485-nimbus-fml-reproducibility.diff
- filename: no-ndk-lookup.diff
- # as-ohttp-client lists both the version for ohttp and a git repo + rev,
- # but this breaks the vendoring for offline builds.
- - filename: ohttp-no-git.diff
- filename: offline-nimbus-fml.diff
- filename: glean-noop.diff
- filename: a-s-noop.diff
=====================================
projects/application-services/glean-noop.diff
=====================================
@@ -1,8 +1,8 @@
diff --git a/glean-core/android-native/build.gradle b/glean-core/android-native/build.gradle
-index 48769651..ade00ec3 100644
+index 53716d523..d38af8320 100644
--- a/glean-core/android-native/build.gradle
+++ b/glean-core/android-native/build.gradle
-@@ -57,6 +57,8 @@ android {
+@@ -48,6 +48,8 @@ android {
}
cargo {
@@ -12,15 +12,15 @@ index 48769651..ade00ec3 100644
module = '../bundle-android'
diff --git a/glean-core/android/build.gradle b/glean-core/android/build.gradle
-index 3568e40b..05f28296 100644
+index 7748378b4..5af06b1c3 100644
--- a/glean-core/android/build.gradle
+++ b/glean-core/android/build.gradle
-@@ -221,7 +221,7 @@ android.libraryVariants.all { variant ->
- def udlFilePath = "../src/glean.udl"
- def t = tasks.register("generate${variant.name.capitalize()}UniFFIBindings", Exec) {
- workingDir project.rootDir
-- commandLine 'cargo', 'uniffi-bindgen', 'generate', '--no-format', "${project.projectDir}/${udlFilePath}", '--language', 'kotlin', '--out-dir', "${buildDir}/${uniffiGeneratedPath}"
-+ commandLine '${rootDir}/glean-core/android-native/uniffi-bindgen', 'generate', '--no-format', "${project.projectDir}/${udlFilePath}", '--language', 'kotlin', '--out-dir', "${buildDir}/${uniffiGeneratedPath}"
- outputs.dir "${buildDir}/${uniffiGeneratedPath}"
- // Re-generate if the interface definition changes.
- inputs.file "${project.projectDir}/../src/glean.udl"
+@@ -197,7 +197,7 @@ def generateUniffiBindings = tasks.register("generateUniffiBindings") {
+ doFirst {
+ exec {
+ workingDir project.rootDir
+- commandLine 'cargo', 'uniffi-bindgen', 'generate', '--no-format', "${project.projectDir}/${udlFilePath}", '--language', 'kotlin', '--out-dir', UNIFFI_OUT_DIR.get()
++ commandLine '${rootDir}/glean-core/android-native/uniffi-bindgen', 'generate', '--no-format', "${project.projectDir}/${udlFilePath}", '--language', 'kotlin', '--out-dir', UNIFFI_OUT_DIR.get()
+ }
+ }
+ outputs.dir UNIFFI_OUT_DIR
=====================================
projects/application-services/gradle-dependencies-list.txt
=====================================
The diff for this file was not included because it is too large.
=====================================
projects/application-services/list_toolchain_updates_checks
=====================================
@@ -8,7 +8,7 @@ if (m/^\\s*compileSdkVersion:\\s([^"]*),/) {
}
EOF
needed=$(cat build.gradle | perl -ne "$p")
-current=34
+current='[% pc("android-toolchain", "version") %]'
check_update_needed compileSdkVersion "$needed" "$current"
@@ -48,12 +48,12 @@ current='[% c("var/nss_version") %]-with-nspr-[% c("var/nspr_version") %]'
check_update_needed nss-nspr "$needed" "$current"
# uniffi
-read -d '' p << 'EOF' || true
-if (m/^\\s*uniffi\\s*=\\s*"([^"]*)"/) {
- print $1;
- exit;
-}
-EOF
-needed=$(cat Cargo.toml | perl -ne "$p")
+p='while (<>) {
+ if (m/^\s*uniffi\s*=\s*\{[^}]*version\s*=\s*"([^"]*)"/) {
+ print $1;
+ exit;
+ }
+}'
+needed=$(cat components/autofill/Cargo.toml | perl -ne "$p")
current='[% pc("uniffi-rs", "version") %]'
check_update_needed uniffi "$needed" "$current"
=====================================
projects/application-services/local-repository.diff
=====================================
@@ -1,10 +1,10 @@
diff --git a/build.gradle b/build.gradle
-index b22a0737..d335aa5b 100644
+index bd516e58c..b30d552c9 100644
--- a/build.gradle
+++ b/build.gradle
-@@ -39,6 +39,13 @@ buildscript {
- ]
-
+@@ -14,6 +14,14 @@ buildscript {
+ }
+
repositories {
+ maven {
+ url "file:///var/tmp/dist/gradle-dependencies"
@@ -13,11 +13,12 @@ index b22a0737..d335aa5b 100644
+ mavenPom()
+ }
+ }
++
mavenCentral()
google()
- jcenter()
-@@ -88,6 +95,13 @@ apply plugin: 'de.undercouch.download'
-
+ maven {
+@@ -59,6 +67,14 @@ plugins {
+
allprojects {
repositories {
+ maven {
@@ -27,11 +28,12 @@ index b22a0737..d335aa5b 100644
+ mavenPom()
+ }
+ }
++
google()
- jcenter()
+ mavenCentral()
maven {
diff --git a/settings.gradle b/settings.gradle
-index f652bd02..8c30a368 100644
+index 4117bc0d3..f1b028dad 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1,6 +1,19 @@
@@ -52,37 +54,39 @@ index f652bd02..8c30a368 100644
+}
+
import org.yaml.snakeyaml.Yaml
-
- includeBuild('tools/nimbus-gradle-plugin') {
-@@ -14,6 +27,13 @@ buildscript {
- classpath 'org.yaml:snakeyaml:2.0'
- }
- repositories {
-+ maven {
-+ url "file:///var/tmp/dist/gradle-dependencies"
-+ metadataSources {
-+ gradleMetadata()
-+ mavenPom()
+
+ // We prefer `appServicesRootDir` over `rootDir` to help us on the path to the monorepo.
+@@ -23,6 +36,14 @@ buildscript {
+ if (!gradle.root.hasProperty("mozconfig")) {
+ // in app-services
+ repositories {
++ maven {
++ url "file:///var/tmp/dist/gradle-dependencies"
++ metadataSources {
++ gradleMetadata()
++ mavenPom()
++ }
+ }
-+ }
- jcenter()
- }
- }
++
+ mavenCentral()
+ }
+ } else {
diff --git a/tools/nimbus-gradle-plugin/settings.gradle b/tools/nimbus-gradle-plugin/settings.gradle
-index 7db19be0..1f36b991 100644
+index 7d907f057..c0d213503 100644
--- a/tools/nimbus-gradle-plugin/settings.gradle
+++ b/tools/nimbus-gradle-plugin/settings.gradle
-@@ -8,6 +8,13 @@ buildscript {
- classpath 'org.yaml:snakeyaml:2.0'
- }
- repositories {
-+ maven {
-+ url "file:///var/tmp/dist/gradle-dependencies"
-+ metadataSources {
-+ gradleMetadata()
-+ mavenPom()
+@@ -14,6 +14,14 @@ buildscript {
+ if (!gradle.root.hasProperty("mozconfig")) {
+ // in app-services
+ repositories {
++ maven {
++ url "file:///var/tmp/dist/gradle-dependencies"
++ metadataSources {
++ gradleMetadata()
++ mavenPom()
++ }
+ }
-+ }
- jcenter()
- }
- }
++
+ mavenCentral()
+ }
+ } else {
=====================================
projects/application-services/ohttp-no-git.diff deleted
=====================================
@@ -1,15 +0,0 @@
-diff --git a/components/as-ohttp-client/Cargo.toml b/components/as-ohttp-client/Cargo.toml
-index fd45a058b..b7070fc15 100644
---- a/components/as-ohttp-client/Cargo.toml
-+++ b/components/as-ohttp-client/Cargo.toml
-@@ -19,8 +19,8 @@ rusqlite = { workspace = true, features = ["bundled"] }
- [dependencies.ohttp]
- version = "0.4"
- default-features = false
--git = "https://github.com/martinthomson/ohttp.git"
--rev = "fc3f4c787d1f6a6a87bf5194f7152cc906b02973"
-+# git = "https://github.com/martinthomson/ohttp.git"
-+# rev = "fc3f4c787d1f6a6a87bf5194f7152cc906b02973"
- features = ["client", "server", "app-svc", "external-sqlite"]
-
- [build-dependencies]
=====================================
projects/glean/config
=====================================
@@ -19,13 +19,15 @@ var:
- torsocks
glean_wheels_sha256sum:
14.0.1: 95f01d0e158ae7968680029b7d9c2908895e1d1ec1ba4e6a044648a05af4ee0c
+ 17.1.0: d96ef1995676fc3b838efb84283294befd5060ca64eea94fb67ae1f41d422664
glean_wheels_url:
14.0.1: https://build-sources.tbb.torproject.org/glean-wheels-14.0.1.tar.xz
+ 17.1.0: https://build-sources.tbb.torproject.org/glean-wheels-17.1.0.tar.xz
steps:
create_glean_deps_tarball:
git_url: ''
- version: 14.0.1
+ version: 17.1.0
filename: 'glean-wheels-[% c("version") %].tar.xz'
build_log: '-'
container:
=====================================
projects/gradle/config
=====================================
@@ -7,6 +7,7 @@ container:
var:
gradle_sha256sum:
8.8: a4b4158601f8636cdeeab09bd76afb640030bb5b144aafe261a5e8af027dc612
+ 8.13: 20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78
input_files:
- project: container-image
=====================================
projects/uniffi-rs/config
=====================================
@@ -1,7 +1,7 @@
# vim: filetype=yaml sw=2
-version: 0.27.1
-git_hash: bfb52effb0292f16d4c030d622887781639cbd1f
-git_url: https://gitlab.torproject.org/tpo/applications/uniffi-rs.git
+version: 0.29.0
+git_hash: c69eba9eb08b16a66aab7b25df6c55d0b60541db
+git_url: https://gitlab.torproject.org/tpo/applications/uniffi-rs
container:
use_container: 1
@@ -17,4 +17,4 @@ steps:
project: uniffi-rs
pkg_type: cargo_vendor
norec:
- sha256sum: 12a61a3dbe65a3946ed58fff3d849d11c9ade5818e2ef5771d2a2a531e25f553
+ sha256sum: 23c79da9169064f42c34b9dadfee9dcf5ed251f9843615ca3e9a0e59a49f581d
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/d…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/d…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser][tor-browser-140.0a1-15.0-1] fixup! TB 2176: Rebrand Firefox to TorBrowser
by Pier Angelo Vendrame (@pierov) 11 Jun '25
by Pier Angelo Vendrame (@pierov) 11 Jun '25
11 Jun '25
Pier Angelo Vendrame pushed to branch tor-browser-140.0a1-15.0-1 at The Tor Project / Applications / Tor Browser
Commits:
759ac06a by Pier Angelo Vendrame at 2025-06-11T16:02:37+02:00
fixup! TB 2176: Rebrand Firefox to TorBrowser
TB 43855: Set Android branding for l10n merging.
- - - - -
1 changed file:
- mobile/android/locales/l10n.toml
Changes:
=====================================
mobile/android/locales/l10n.toml
=====================================
@@ -124,6 +124,18 @@ exclude-multi-locale = [
reference = "mobile/android/locales/en-US/**"
l10n = "{l}mobile/android/**"
+[[paths]]
+ reference = "mobile/android/branding/tb-alpha/locales/en-US/**"
+ l10n = "{l}mobile/android/branding/tb-alpha/**"
+
+[[paths]]
+ reference = "mobile/android/branding/tb-nightly/locales/en-US/**"
+ l10n = "{l}mobile/android/branding/tb-nightly/**"
+
+[[paths]]
+ reference = "mobile/android/branding/tb-release/locales/en-US/**"
+ l10n = "{l}mobile/android/branding/tb-release/**"
+
# hand-picked paths from toolkit, keep in sync with jar.mn
[[paths]]
reference = "dom/locales/en-US/chrome/accessibility/AccessFu.properties"
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/759ac06…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/commit/759ac06…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser-build][main] 7 commits: Bug 41457: Set mar IDs in tor-browser-build.
by Pier Angelo Vendrame (@pierov) 11 Jun '25
by Pier Angelo Vendrame (@pierov) 11 Jun '25
11 Jun '25
Pier Angelo Vendrame pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
b428d050 by Pier Angelo Vendrame at 2025-06-11T18:05:45+02:00
Bug 41457: Set mar IDs in tor-browser-build.
We used to have a logic to set the mar IDs in confvars.sh but, from
Firefox 137, that file can contains only key/value without any logic.
- - - - -
90cccdd8 by Pier Angelo Vendrame at 2025-06-11T19:49:57+02:00
Bug 41448: Update toolchains for ESR140 (common).
Switch to Clang 19.1.7, Rust 1.86.0, nasm 2.16.03.
- - - - -
3e26939c by Pier Angelo Vendrame at 2025-06-11T19:49:57+02:00
Bug 41448: Update toolchains for ESR140 (macOS).
macOS specific updates for Firefox 140.
- - - - -
fad83635 by Pier Angelo Vendrame at 2025-06-11T19:49:58+02:00
Bug 41448: Update toolchains for ESR140 (Windows).
Windows specific updates for Firefox 140.
- - - - -
78708705 by Pier Angelo Vendrame at 2025-06-11T19:49:58+02:00
Bug 41458: Ship geckodriver only on Linux.
Geckodriver is now a host tool for Firefox.
- - - - -
23f1ab0d by Pier Angelo Vendrame at 2025-06-11T19:49:58+02:00
Bug 41478: Include vim in our containers.
Also, clean a little bit some other dependencies.
- - - - -
ba52be71 by Nicolas Vigier at 2025-06-11T19:49:59+02:00
Bug 41448: Check for more toolchain updates
- - - - -
35 changed files:
- projects/cbindgen/config
- projects/cctools/build
- + projects/cctools/cctools.patch
- projects/cctools/config
- projects/clang/build
- projects/clang/config
- + projects/clang/gnullvm-environment.diff
- projects/common/list_toolchain_updates-common-firefox-geckoview
- projects/firefox/build
- projects/firefox/config
- projects/firefox/list_toolchain_updates_checks
- projects/firefox/mozconfig
- projects/firefox/nsis-uninstall.patch
- projects/geckoview/config
- projects/llvm-project/config
- projects/macosx-toolchain/config
- projects/macosx-toolchain/macpkg.py
- projects/mingw-w64-clang/build
- projects/mingw-w64-clang/config
- − projects/mingw-w64-clang/mingw-composition.patch
- projects/mingw-w64-clang/mingw-dwrite_3.patch
- + projects/mingw-w64-clang/mingw-foundation_redef.patch
- − projects/mingw-w64-clang/mingw-unknown.patch
- projects/mingw-w64-clang/mingw-webrtc.patch
- projects/mmdebstrap-image/config
- projects/nasm/config
- projects/node/config
- projects/rust/build
- − projects/rust/chkstk.patch
- projects/rust/config
- projects/wasi-sysroot/config
- projects/wasi-sysroot/wasi-sdk.patch
- − projects/windows-rs/build
- − projects/windows-rs/config
- rbm.conf
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/compare/…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser-build][maint-13.5] Bug 41477: Update keyring/boklm.gpg for new subkeys (2025)
by boklm (@boklm) 11 Jun '25
by boklm (@boklm) 11 Jun '25
11 Jun '25
boklm pushed to branch maint-13.5 at The Tor Project / Applications / tor-browser-build
Commits:
6a8e243d by Nicolas Vigier at 2025-06-11T14:08:54+02:00
Bug 41477: Update keyring/boklm.gpg for new subkeys (2025)
- - - - -
1 changed file:
- keyring/boklm.gpg
Changes:
=====================================
keyring/boklm.gpg
=====================================
Binary files a/keyring/boklm.gpg and b/keyring/boklm.gpg differ
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/6…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/6…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser-build][maint-14.5] Bug 41477: Update keyring/boklm.gpg for new subkeys (2025)
by boklm (@boklm) 11 Jun '25
by boklm (@boklm) 11 Jun '25
11 Jun '25
boklm pushed to branch maint-14.5 at The Tor Project / Applications / tor-browser-build
Commits:
5aaf9bba by Nicolas Vigier at 2025-06-11T14:08:04+02:00
Bug 41477: Update keyring/boklm.gpg for new subkeys (2025)
- - - - -
1 changed file:
- keyring/boklm.gpg
Changes:
=====================================
keyring/boklm.gpg
=====================================
Binary files a/keyring/boklm.gpg and b/keyring/boklm.gpg differ
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/5…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/5…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
[Git][tpo/applications/tor-browser-build][main] Bug 41477: Update keyring/boklm.gpg for new subkeys (2025)
by boklm (@boklm) 11 Jun '25
by boklm (@boklm) 11 Jun '25
11 Jun '25
boklm pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
2010ef74 by Nicolas Vigier at 2025-06-11T12:14:53+02:00
Bug 41477: Update keyring/boklm.gpg for new subkeys (2025)
- - - - -
1 changed file:
- keyring/boklm.gpg
Changes:
=====================================
keyring/boklm.gpg
=====================================
Binary files a/keyring/boklm.gpg and b/keyring/boklm.gpg differ
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/2…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser-build/-/commit/2…
You're receiving this email because of your account on gitlab.torproject.org.
1
0